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;
            }
        }
Пример #2
0
        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);
        }