Exemple #1
0
        public static async Task <Jira.IssueResponse> CreateNewJiraIssue(Jira.IssueRequest issueRequest, Jira.CommentRequest[] comments)
        {
            using (var client = new HttpClient())
            {
                SetCommonHeaders(client);
                HttpResponseMessage response = await client.PostAsJsonAsync <Jira.IssueRequest>("issue", issueRequest);

                if (response.IsSuccessStatusCode)
                {
                    Jira.IssueResponse issueResults = await response.Content.ReadAsAsync <Jira.IssueResponse>();

                    Console.WriteLine(string.Format("New issue created with ID: {0}", issueResults.Id));
                    foreach (var comment in comments)
                    {
                        Task <HttpStatusCode> status = Client.CreateJiraComment(issueResults.Id, comment);
                        var statusResult             = status.Result; // Block to preserve comment order

                        if (statusResult == HttpStatusCode.Created)
                        {
                            Console.WriteLine(string.Format("Comment for {0} created.", issueResults.Id));
                        }
                        else
                        {
                            Console.WriteLine(string.Format("Failed to create comment for {0}. YouTrack ID: {1}. Status: {2}", issueResults.Id, issueRequest.Fields.DefectId, statusResult));
                        }
                        Thread.Sleep(1000);
                    }

                    return(issueResults);
                }
                else
                {
                    Console.WriteLine(string.Format("Failed to create issue {0}.", issueRequest.Fields.DefectId));
                    return(null);
                }
            }
        }
Exemple #2
0
        static void Main(string[] args)
        {
            var xmlDir     = ConfigurationManager.AppSettings["YouTrackXMLDir"];
            var xmlDirInfo = new DirectoryInfo(xmlDir);

            // Check for the XML directory, which is where the exported XML file(s) from YouTrack go.
            if (!xmlDirInfo.Exists)
            {
                xmlDirInfo.Create();
                Console.WriteLine("Missing XML files in " + xmlDir);
                Console.ReadLine();
                return;
            }

            Console.Write("Jira Username: "******"\nJira Password: "******"You must enter a Jira username and password.");
                Console.ReadLine();
                return;
            }

            Jira.Client.SetCredentials(jiraUserName, jiraPassword);

            var youtrackExportFiles = xmlDirInfo.GetFiles("*.xml", SearchOption.TopDirectoryOnly);

            foreach (var youtrackExportFile in youtrackExportFiles)
            {
                var reader    = XmlReader.Create(youtrackExportFile.FullName);
                var projectId = youtrackExportFile.Name.Replace(youtrackExportFile.Extension, string.Empty);

                var xmlSerializer  = new XmlSerializer(typeof(YouTrack.Issues));
                var youtrackIssues = (YouTrack.Issues)xmlSerializer.Deserialize(reader);
                var pending        = new List <Task <Jira.IssueResponse> >();

                foreach (YouTrack.Issue youtrackIssue in youtrackIssues.Issue)
                {
                    var jiraIssue = new Jira.IssueRequest
                    {
                        Fields =
                        {
                            JiraProjectRequest = { Key = "INFORCRM" }, // TODO: Don't hardcode
                            JiraIssueType      = Jira.IssueType.Bug,
                            Description        = "None",
                            Summary            = "None",
                            ProjectId          = projectId
                        }
                    };

                    jiraIssue.Fields.Versions.Add(new Jira.Fields.VersionPicker {
                        Name = "Mobile 3.3"
                    });                                                                                   // TODO: Don't hardcode
                    jiraIssue.Fields.Components.Add(new Jira.Fields.Components {
                        Name = "Mobile"
                    });                                                                              // TODO: Don't hardcode

                    foreach (var youtrackIssueField in youtrackIssue.Fields)
                    {
                        Action <YouTrack.Field, Jira.IssueRequest> propertyAction;
                        if (Mappings.YouTrackToJira.Properties.TryGetValue(youtrackIssueField.Name, out propertyAction))
                        {
                            propertyAction(youtrackIssueField, jiraIssue);
                        }
                    }

                    // Write out the issue payloads
                    var jsonOutDir = Path.Combine(youtrackExportFile.DirectoryName, projectId);
                    Directory.CreateDirectory(jsonOutDir);
                    using (var json = File.CreateText(Path.Combine(jsonOutDir, string.Format("{0}.json", jiraIssue.Fields.DefectId))))
                    {
                        var jsonSerializer = new JsonSerializer {
                            Formatting = Formatting.Indented
                        };
                        jsonSerializer.Serialize(json, jiraIssue);
                    }

                    var comments = youtrackIssue.Comments.Select(c => new Jira.CommentRequest {
                        Body = string.Format("YouTrack Author: {0}\r\n{1}", c.Author, c.Text)
                    }).ToArray();

                    // Write out the comments payloads
                    for (int i = 0; i < comments.Length; i++)
                    {
                        var c = comments[i];
                        using (var commentJson = File.CreateText(Path.Combine(jsonOutDir, string.Format("{0}-comment-{1}.json", jiraIssue.Fields.DefectId, i))))
                        {
                            var jsonSerializer = new JsonSerializer {
                                Formatting = Formatting.Indented
                            };
                            jsonSerializer.Serialize(commentJson, c);
                        }
                    }

                    pending.Add(Jira.Client.CreateNewJiraIssue(jiraIssue, comments));

                    // Prevent slamming the server with thousands of new issues + tens of comments per issue
                    System.Threading.Thread.Sleep(1000);
                }

                try
                {
                    Task.WaitAll(pending.ToArray());
                }
                catch (AggregateException e)
                {
                    Console.WriteLine("Exceptions thrown when creating issues.");
                    foreach (var inner in e.InnerExceptions)
                    {
                        Console.WriteLine(inner.ToString());
                    }
                }
            }

            Console.WriteLine("Finished.");
            Console.ReadLine();
        }