protected override void Synchronize(BoardMapping project)
        {
            Log.Debug("Polling GitHub for Pull Requests");

            var queryAsOfDate = QueryDate.AddMilliseconds(Configuration.PollingFrequency * -1.5);

            //https://api.github.com/repos/{0}/{1}/pulls?state=Open
            var request = new RestRequest(string.Format("repos/{0}/{1}/pulls", Configuration.Target.Host, project.Identity.Target), Method.GET);

            request.AddParameter("state", project.QueryStates[0]);

            var resp = _restClient.Execute(request);

            if (resp.StatusCode != HttpStatusCode.OK)
            {
                var serializer   = new JsonSerializer <ErrorMessage>();
                var errorMessage = serializer.DeserializeFromString(resp.Content);
                Log.Error(string.Format("Unable to get Pull Requests from GitHub, Error: {0}. Check your board/repo mapping configuration.", errorMessage.Message));
                return;
            }

            var pulls = new JsonSerializer <List <Pull> >().DeserializeFromString(resp.Content);

            Log.Info("\nQueried [{0}] at {1} for changes after {2}", project.Identity.Target, QueryDate, queryAsOfDate.ToString("o"));

            if (pulls != null && pulls.Any() && pulls[0].Id > 0)
            {
                foreach (var pull in pulls)
                {
                    if (pull.Id > 0)
                    {
                        Log.Info("Pull Requests [{0}]: {1}, {2}, {3}", pull.Number, pull.Title, pull.User.Login, pull.State);

                        // does this workitem have a corresponding card?
                        var card = LeanKit.GetCardByExternalId(project.Identity.LeanKit, pull.Id + "|" + pull.Number.ToString());

                        if (card == null || !card.ExternalSystemName.Equals(ServiceName, StringComparison.OrdinalIgnoreCase))
                        {
                            Log.Debug("Create new card for Pull Request [{0}]", pull.Number);
                            CreateCardFromItem(project, pull);
                        }
                        else
                        {
                            Log.Debug("Previously created a card for Pull Request [{0}]", pull.Number);
                            if (project.UpdateCards)
                            {
                                PullUpdated(pull, card, project);
                            }
                            else
                            {
                                Log.Info("Skipped card update because 'UpdateCards' is disabled.");
                            }
                        }
                    }
                }
                Log.Info("{0} item(s) queried.\n", pulls.Count);
            }
        }
Exemplo n.º 2
0
        protected override void Synchronize(BoardMapping project)
        {
            Log.Debug("Polling Jira for Issues");

            var queryAsOfDate = QueryDate.AddMilliseconds(Configuration.PollingFrequency * -1.5);

            string jqlQuery;
            var    formattedQueryDate = queryAsOfDate.ToString(QueryDateFormat, CultureInfo.InvariantCulture);

            if (!string.IsNullOrEmpty(project.Query))
            {
                jqlQuery = string.Format(project.Query, formattedQueryDate);
            }
            else
            {
                var queryFilter = string.Format(" and ({0})", string.Join(" or ", project.QueryStates.Select(x => "status = '" + x.Trim() + "'").ToList()));
                if (!string.IsNullOrEmpty(project.ExcludedTypeQuery))
                {
                    queryFilter += project.ExcludedTypeQuery;
                }
                jqlQuery = string.Format("project=\"{0}\" {1} and updated > \"{2}\" order by created asc", project.Identity.Target, queryFilter, formattedQueryDate);
            }

            //https://yoursite.atlassian.net/rest/api/latest/search?jql=project=%22More+Tests%22+and+status=%22open%22+and+created+%3E+%222008/12/31+12:00%22+order+by+created+asc&fields=id,status,priority,summary,description
            var request = new RestRequest("/rest/api/latest/search", Method.GET);

            request.AddParameter("jql", jqlQuery);
            request.AddParameter("fields", "id,status,priority,summary,description,issuetype,type,assignee,duedate,labels");
            request.AddParameter("maxResults", "9999");

            var jiraResp = _restClient.Execute(request);

            if (jiraResp.StatusCode != HttpStatusCode.OK)
            {
                var serializer   = new JsonSerializer <ErrorMessage>();
                var errorMessage = serializer.DeserializeFromString(jiraResp.Content);
                Log.Error(string.Format("Unable to get issues from Jira, Error: {0}. Check your board/project mapping configuration.", errorMessage.Message));
                return;
            }

            var resp = new JsonSerializer <IssuesResponse>().DeserializeFromString(jiraResp.Content);

            Log.Info("\nQueried [{0}] at {1} for changes after {2}", project.Identity.Target, QueryDate, queryAsOfDate.ToString("o"));

            if (resp != null && resp.Issues != null && resp.Issues.Any())
            {
                var issues = resp.Issues;
                foreach (var issue in issues)
                {
                    Log.Info("Issue [{0}]: {1}, {2}, {3}", issue.Key, issue.Fields.Summary, issue.Fields.Status.Name, issue.Fields.Priority.Name);

                    // does this workitem have a corresponding card?
                    var card = LeanKit.GetCardByExternalId(project.Identity.LeanKit, issue.Key);

                    if (card == null || !card.ExternalSystemName.Equals(ServiceName, StringComparison.OrdinalIgnoreCase))
                    {
                        Log.Debug("Create new card for Issue [{0}]", issue.Key);
                        CreateCardFromItem(project, issue);
                    }
                    else
                    {
                        Log.Debug("Previously created a card for Issue [{0}]", issue.Key);
                        if (project.UpdateCards)
                        {
                            IssueUpdated(issue, card, project);
                        }
                        else
                        {
                            Log.Info("Skipped card update because 'UpdateCards' is disabled.");
                        }
                    }
                }
                Log.Info("{0} item(s) queried.\n", issues.Count);
            }
        }
Exemplo n.º 3
0
        protected override void Synchronize(BoardMapping project)
        {
            Log.Debug("Polling Unfuddle for Tickets");

            var queryAsOfDate = QueryDate.AddMilliseconds(Configuration.PollingFrequency * -1.5);

            var unfuddleQuery = !string.IsNullOrEmpty(project.Query)
                                ? string.Format(project.Query, queryAsOfDate.ToString("yyyy/MM/dd hh:mm"))
                                : string.Format("status-eq-{0},created_at-gt-{1}", project.QueryStates[0], queryAsOfDate.ToString("yyyy/MM/dd hh:mm"));

            //http://mysubdomain.unfuddle.com/api/v1/projects/{id}/ticket_reports/dynamic?sort_by=created_at&sort_direction=ASC&conditions_string=status-eq-new,created_at-gt-yyyy/MM/dd hh:mm
            var request = new RestRequest(string.Format("/api/v1/projects/{0}/ticket_reports/dynamic", project.Identity.Target), Method.GET);

            request.AddParameter("sort_by", "created_at");
            request.AddParameter("sort_direction", "ASC");
            request.AddParameter("conditions_string", unfuddleQuery);
            //, "id,status,priority,summary,description,type");
            request.AddParameter("limit", "500");

            var unfuddleResp = _restClient.Execute(request);

            if (unfuddleResp.StatusCode != HttpStatusCode.OK)
            {
                var serializer   = new JsonSerializer <ErrorMessage>();
                var errorMessage = serializer.DeserializeFromString(unfuddleResp.Content);
                Log.Error(string.Format("Unable to get tickets from Unfuddle, Error: {0}. Check your board/project mapping configuration.", errorMessage.Message));
                return;
            }

            var resp = new JsonSerializer <TicketsResponse>().DeserializeFromString(unfuddleResp.Content);

            Log.Info("\nQueried [{0}] at {1} for changes after {2}", project.Identity.Target, QueryDate, queryAsOfDate.ToString("o"));

            if (resp != null && resp.Groups != null && resp.Groups.Any())
            {
                foreach (var group in resp.Groups)
                {
                    if (group != null && group.Tickets != null && group.Tickets.Any())
                    {
                        var tickets = group.Tickets;
                        foreach (var ticket in tickets)
                        {
                            Log.Info("Ticket [{0}]: {1}, {2}, {3}", ticket.Id, ticket.Summary, ticket.Status, ticket.Priority);

                            // does this workitem have a corresponding card?
                            var card = LeanKit.GetCardByExternalId(project.Identity.LeanKit, ticket.Id.ToString());

                            if (card == null || !card.ExternalSystemName.Equals(ServiceName, StringComparison.OrdinalIgnoreCase))
                            {
                                Log.Debug("Create new card for Ticket [{0}]", ticket.Id);
                                CreateCardFromItem(project, ticket);
                            }
                            else
                            {
                                Log.Debug("Previously created a card for Ticket [{0}]", ticket.Id);
                                if (project.UpdateCards)
                                {
                                    TicketUpdated(ticket, card, project);
                                }
                                else
                                {
                                    Log.Info("Skipped card update because 'UpdateCards' is disabled.");
                                }
                            }
                        }
                    }
                }
                Log.Info("{0} item(s) queried.\n", resp.Count);
            }
        }
Exemplo n.º 4
0
        protected override void Synchronize(BoardMapping project)
        {
            Log.Debug("Polling TFS [{0}] for Work Items", project.Identity.TargetName);

            //query a project for new items
            var stateQuery     = string.Format(" AND ({0})", String.Join(" or ", project.QueryStates.Select(x => "[System.State] = '" + x.Trim() + "'").ToList()));
            var iterationQuery = "";

            if (!string.IsNullOrEmpty(project.IterationPath))
            {
                iterationQuery = string.Format(" AND [System.IterationPath] UNDER '{0}' ", project.IterationPath);
            }

            var queryAsOfDate = QueryDate.AddMilliseconds(Configuration.PollingFrequency * -1.5).ToString("o");

            string tfsQuery;

            if (!string.IsNullOrEmpty(project.Query))
            {
                tfsQuery = string.Format(project.Query, queryAsOfDate);
            }
            else
            {
                tfsQuery = String.Format(
                    "[System.TeamProject] = '{0}' {1} {2} {3} and [System.ChangedDate] > '{4}'",
                    project.Identity.TargetName, iterationQuery, stateQuery, project.ExcludedTypeQuery, queryAsOfDate);
            }

            var queryStr = string.Format("SELECT [System.Id], [System.WorkItemType]," +
                                         " [System.State], [System.AssignedTo], [System.Title], [System.Description]" +
                                         " FROM WorkItems " +
                                         " WHERE {0}" +
                                         " ORDER BY [System.TeamProject]", tfsQuery);

            if (_projectCollectionWorkItemStore == null)
            {
                "Reconnecting to TFS...".Info();
                Init();
            }
            Query query;

            try
            {
                query = new Query(_projectCollectionWorkItemStore, queryStr, null, false);
            }
            catch (Exception ex)
            {
                Log.Error("Error creating TFS query. {0} ", ex.Message);
                if (_projectCollectionWorkItemStore == null)
                {
                    Log.Error("Project Collection Work Item Store is null");
                }
                throw;
            }
            var cancelableAsyncResult = query.BeginQuery();

            var changedItems = query.EndQuery(cancelableAsyncResult);

            Log.Info("\nQuery [{0}] for changes after {1}", project.Identity.Target, queryAsOfDate);
            Log.Debug(queryStr);

            foreach (WorkItem item in changedItems)
            {
                Log.Info("Work Item [{0}]: {1}, {2}, {3}",
                         item.Id, item.Title, item.Fields["System.AssignedTo"].Value, item.State);

                // does this workitem have a corresponding card?
                var card = LeanKit.GetCardByExternalId(project.Identity.LeanKit, item.Id.ToString(CultureInfo.InvariantCulture));

                if (card == null || !card.ExternalSystemName.Equals(ServiceName, StringComparison.OrdinalIgnoreCase))
                {
                    Log.Debug("Creating new card for work item [{0}]", item.Id);
                    CreateCardFromWorkItem(project, item);
                }
                // TODO: else if Lane = defined end lane then update it in TFS (i.e. we missed the event)
                // call UpdateStateOfExternalWorkItem()
                else
                {
                    Log.Info("Previously created a card for work item[{0}]", item.Id);
                    if (project.UpdateCards)
                    {
                        WorkItemUpdated(item, card, project);
                    }
                    else
                    {
                        Log.Info("Skipped card update because 'UpdateCards' is disabled.");
                    }
                }
            }
            Log.Info("{0} item(s) queried.\n", changedItems.Count);
        }