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