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); } } }
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(); }