public static SemanticReleaseNotes GenerateReleaseNotes(Context context, IRepository gitRepo, IIssueTracker issueTracker, SemanticReleaseNotes previousReleaseNotes, Categories categories, TaggedCommit tagToStartFrom, ReleaseInfo currentReleaseInfo) { var releases = ReleaseFinder.FindReleases(gitRepo, tagToStartFrom, currentReleaseInfo); var findIssuesSince = IssueStartDateBasedOnPreviousReleaseNotes(gitRepo, previousReleaseNotes) ?? tagToStartFrom.Commit.Author.When; var closedIssues = issueTracker.GetClosedIssues(context.IssueTracker, findIssuesSince).ToArray(); var semanticReleases = ( from release in releases let releaseNoteItems = closedIssues .Where(i => (release.When == null || i.DateClosed < release.When) && (release.PreviousReleaseDate == null || i.DateClosed > release.PreviousReleaseDate)) .Select(i => new ReleaseNoteItem(i.Title, i.Id, i.HtmlUrl, i.Labels, i.DateClosed, i.Contributors)) .ToList<IReleaseNoteLine>() let beginningSha = release.FirstCommit == null ? null : release.FirstCommit.Substring(0, 10) let endSha = release.LastCommit == null ? null : release.LastCommit.Substring(0, 10) select new SemanticRelease(release.Name, release.When, releaseNoteItems, new ReleaseDiffInfo { BeginningSha = beginningSha, EndSha = endSha, //DiffUrlFormat = issueTracker.DiffUrlFormat })).ToList(); return new SemanticReleaseNotes(semanticReleases, categories).Merge(previousReleaseNotes); }
public void DoesNotIncludeCommitsOlderThanTag() { var commit1 = CreateCommit(); var startTagCommit = CreateCommit(); var commit3 = CreateCommit(); SubstituteCommitLog(commit1, startTagCommit, commit3); var startTag = new TaggedCommit(startTagCommit, "1.0.0"); var results = ReleaseFinder.FindReleases(repository, startTag, new ReleaseInfo { PreviousReleaseDate = startTagCommit.Author.When }); var firstRelease = results.First(); firstRelease.PreviousReleaseDate.ShouldBe(startTagCommit.Author.When); }
public void GroupsTagsByReleases() { var commit1 = CreateCommit(); var commit2 = CreateCommit(); var commit3 = CreateCommit(); var startTagCommit = CreateCommit(); SubstituteCommitLog(commit1, commit2, commit3, startTagCommit); tags.Add(commit2, "1.1.0"); var startTag = new TaggedCommit(startTagCommit, "1.0.0"); var results = ReleaseFinder.FindReleases(repository, startTag, new ReleaseInfo()); results.Count.ShouldBe(2); results.ElementAt(0).Name.ShouldBe(null); results.ElementAt(0).PreviousReleaseDate.ShouldBe(commit2.Author.When); results.ElementAt(1).Name.ShouldBe("1.1.0"); results.ElementAt(1).PreviousReleaseDate.ShouldBe(null); }
public static List<ReleaseInfo> FindReleases(IRepository gitRepo, TaggedCommit tagToStartFrom, ReleaseInfo current) { var releases = new List<ReleaseInfo> { current }; var tagLookup = TagsByShaMap(gitRepo); foreach (var commit in gitRepo.Commits.TakeWhile(c => tagToStartFrom == null || c != tagToStartFrom.Commit)) { if (tagLookup.ContainsKey(commit.Sha)) { var tag = tagLookup[commit.Sha]; var releaseDate = ((Commit)tag.Target).Author.When; current.PreviousReleaseDate = releaseDate; current = new ReleaseInfo(tag.Name, releaseDate, null) { LastCommit = commit.Sha }; releases.Add(current); } current.FirstCommit = commit.Sha; } return releases; }