private async void Sync_Click(object sender, RoutedEventArgs e) { var milestoneItem = GithubMilestones.SelectedItem as MilestoneItem; var projectItem = TodoistProjects.SelectedItem as TodoistItem; var repoItem = Repository.SelectedItem as RepositoryItem; if (projectItem == null || repoItem == null) { return; } var issueRequest = new Octokit.RepositoryIssueRequest() { Assignee = m_currentUser.Login, State = Octokit.ItemStateFilter.Open }; if (milestoneItem != null && milestoneItem.number != 0) { issueRequest.Milestone = milestoneItem.number.ToString(); } var issues = await m_client.Issue.GetAllForRepository(repoItem.id, issueRequest); if (issues == null) { return; } // Get current todoist items and capture URLs var items = await m_todoistClient.Items.GetAsync(); var itemUrlLookup = new HashSet <string>(items.Select(x => Regex.Replace(x.Content, @"^.*\((http.*)\)$", "$1"))); // Filter issues for those which do not currently have their URL in Todoist var filteredIssues = issues.Where(x => !itemUrlLookup.Contains(x.HtmlUrl.ToString())); var selectIssuesForm = new IssueSelect(filteredIssues); if (!(selectIssuesForm.ShowDialog() ?? false)) { return; } var selectedIssues = selectIssuesForm.SelectedIssues; SyncProgress.Maximum = selectedIssues.Count; SyncProgress.Value = 0; foreach (var issue in selectedIssues) { var title = String.Format("**{0}** [{1}]({2})", issue.Number, issue.Title, issue.HtmlUrl.ToString()); var todoistItem = new Todoist.Net.Models.Item(title, projectItem.id); await m_todoistClient.Items.AddAsync(todoistItem); ++SyncProgress.Value; } }
public async Task<IEnumerable<Models.Issue>> GetRecentIssues(string organization, string repository, DateTimeOffset since) { if (string.IsNullOrWhiteSpace(organization)) throw new ArgumentNullException(nameof(organization), "must be specified"); if (string.IsNullOrWhiteSpace(repository)) throw new ArgumentNullException(nameof(repository), "must be specified"); var client = GetClient(); var request = new Octokit.RepositoryIssueRequest(); request.Since = since; try { var queryResult = await client.Issue.GetAllForRepository(organization, repository, request); var issues = new List<Octokit.Issue>(); foreach (var issue in queryResult) { if (issue.PullRequest != null) continue; issues.Add(issue); } var issuesToProcess = new List<Models.Issue>(); foreach (var issue in issues) { var issueToProcess = AutoMapper.Mapper.Map<Models.Issue>(issue); issueToProcess.Organization = organization; issueToProcess.Repository = repository; issuesToProcess.Add(issueToProcess); } return issuesToProcess; } catch (Exception exc) { this.Logger.AddMessage("GetRecentIssues", $"exception {exc.Message} while reading recent Issues", organization + " " + repository, MessageType.Error); return new List<Models.Issue>(); } }
private Octokit.RepositoryIssueRequest PrepareFilter(IssueTrackerFilter filter) { var repositoryIssueRequest = new Octokit.RepositoryIssueRequest { Filter = Octokit.IssueFilter.All, Since = filter.Since, }; if (filter.IncludeOpen && filter.IncludeClosed) { repositoryIssueRequest.State = Octokit.ItemState.All; } else if (filter.IncludeOpen) { repositoryIssueRequest.State = Octokit.ItemState.Open; } else if (filter.IncludeClosed) { repositoryIssueRequest.State = Octokit.ItemState.Closed; } return(repositoryIssueRequest); }