public PullRequest(WorkItem fromItem, List<Commit> commits) : base() { this.Id = fromItem.Id; this.Url = fromItem.Url; this.Title = fromItem.Title; this.Author = fromItem.Author; this.CreationDate = fromItem.CreationDate; this.RelatedItems = fromItem.RelatedItems; this.Commits = commits; }
private static List<WorkItem> Process(string targetPath) { var pullPath = Path.Combine(targetPath, "pulls.json"); var rawPulls = File.ReadAllText(pullPath); var issuePath = Path.Combine(targetPath, "issues.json"); var rawIssues = File.ReadAllText(issuePath); var pulls = JsonConvert.DeserializeObject(rawPulls) as JArray; var issues = JsonConvert.DeserializeObject(rawIssues) as JArray; var allItems = new List<WorkItem>(issues.Count); MultiValueDictionary<int, int> issueRelations = new MultiValueDictionary<int, int>(); foreach (var issue in issues) { var id = issue.Value<int>("number"); var rawRelatedItems = issue.Value<JArray>("relatedIssues"); var relatedItems = rawRelatedItems.Count == 0 ? new List<int>() : rawRelatedItems.Select(n => n.Value<int>()).ToList(); foreach (var relatedItem in relatedItems) { issueRelations.Add(id, relatedItem); issueRelations.Add(relatedItem, id); } var newItem = new WorkItem() { Id = id, Url = issue.Value<string>("htmlUrl"), Title = issue.Value<string>("title"), Body = issue.Value<string>("body"), Author = issue.Value<string>("submitter"), CreationDate = issue.Value<DateTime>("createdAt"), }; allItems.Add(newItem); } foreach (var item in allItems) { IReadOnlyCollection<int> knownRelations; if (!issueRelations.TryGetValue(item.Id, out knownRelations)) continue; item.RelatedItems = knownRelations; } foreach (var pull in pulls) { var id = pull.Value<int>("number"); var earliestCommit = DateTime.MaxValue; var latestCommit = DateTime.MinValue; var commits = new List<Commit>(); foreach (var commit in pull["commits"] as JArray) { var commitDate = commit.Value<DateTime>("createdAt"); if (commitDate < earliestCommit) earliestCommit = commitDate; if (commitDate > latestCommit) latestCommit = commitDate; var commitItem = new Commit() { Date = commitDate, Sha = commit.Value<string>("sha"), Message = commit.Value<string>("message"), Author = commit.Value<string>("committer"), }; commits.Add(commitItem); } var closedAtString = pull.Value<string>("closedAt"); DateTime closedAt; if (!(DateTime.TryParse(closedAtString, out closedAt))) { closedAt = default(DateTime); } var originalItem = allItems.Single(n => n.Id == id); var pullRequest = new PullRequest(originalItem, commits) { FirstCommit = earliestCommit, LastCommit = latestCommit, CloseDate = closedAt, Sha = pull.Value<string>("sha"), Branch = pull.Value<string>("branch"), }; allItems[allItems.IndexOf(originalItem)] = pullRequest; } return allItems; }