private static async Task <CodePlexTopic> GetDiscussion(int id) { var url = string.Format("http://{0}.codeplex.com/discussions/{1}", codePlexProject, id); var html = await httpClient.GetStringAsync(url); var title = GetMatch(html, "<h1 class=\"page_title WordWrapBreakWord\">(.*?)</h1>").Trim(); var topic = new CodePlexTopic { Id = id, Title = DecodeHtml(title) }; foreach (var postHtml in GetMatches(html, "<tr id=\"PostPanel\"(.*?)</tr>")) { var user = GetMatch(postHtml, "UserProfileLink.*?>(.*?)<"); var content = GetMatch(postHtml, "<td id=\"PostContent.*?>(.*?)</td").Trim(); var timeString = GetMatch(postHtml, "class=\"smartDate\" title=\"(.*?)\""); DateTime time; DateTime.TryParse( timeString, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal, out time); topic.Comments.Add(new CodeplexComment { Author = user, Content = content, Time = time }); } return(topic); }
static async Task MigrateDiscussions() { var discussions = GetDiscussions().Reverse().ToArray(); for (int i = 0; i < discussions.Length; i++) { var discussionId = discussions[i]; CodePlexTopic discussion = null; for (int retry = 1; retry <= 5; retry++) { try { discussion = await GetDiscussion(discussionId); break; } catch (Exception e) { Console.WriteLine(e.Message); } } if (discussion == null) { Console.WriteLine("Could not get discussion from CodePlex, aborting migration."); break; } Console.WriteLine("{0}/{1} #{2} '{3}'", i + 1, discussions.Length, discussion.Id, discussion.Title); var codePlexIssueUrl = string.Format("http://{0}.codeplex.com/discussions/{1}", codePlexProject, discussion.Id); var description = new StringBuilder(); description.AppendFormat("<div><strong>This discussion was imported from <a href=\"{0}\" target=\"_blank\">{1}</a></strong></div>", codePlexIssueUrl, "CodePlex"); foreach (var comment in discussion.Comments) { description.AppendLine("<hr/>"); description.AppendLine("<div>"); description.AppendFormat(CultureInfo.InvariantCulture, "<p><strong><a href=\"http://www.codeplex.com/site/users/view/{0}\" target=\"_blank\">{0}</a></strong> wrote at {1:yyyy-MM-dd HH:mm}:</p>", comment.Author, comment.Time); description.Append(comment.Content); description.AppendLine("</div>"); } for (int retry = 1; retry <= 5; retry++) { try { var topic = CreateIssue(discussion.Title, description.ToString(), new List <string>()); // {"CodePlex Discussion"}); if (topic == null) { Console.WriteLine(" Could not create topic at GitHub."); continue; } break; } catch (Exception e) { Console.WriteLine(" " + e.Message); } Console.WriteLine("Retry {0}", retry + 1); } } }