Skip to content

Commit 6dcf835

Browse files
CopilotMalcolmnixon
andcommitted
Add feature to suppress changelog when versions not tagged
Co-authored-by: Malcolmnixon <1863707+Malcolmnixon@users.noreply.github.com>
1 parent e3b6d5c commit 6dcf835

File tree

2 files changed

+73
-7
lines changed

2 files changed

+73
-7
lines changed

src/DemaConsulting.BuildMark/RepoConnectors/GitHubRepoConnector.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public override async Task<BuildInformation> GetBuildInformationAsync(Version? v
104104
: null;
105105

106106
// Generate full changelog link for GitHub
107-
var changelogLink = GenerateGitHubChangelogLink(owner, repo, fromVersion?.Tag, toVersion.Tag);
107+
var changelogLink = GenerateGitHubChangelogLink(owner, repo, fromVersion?.Tag, toVersion.Tag, lookupData.BranchTagNames);
108108

109109
// Create and return build information with all collected data
110110
return new BuildInformation(
@@ -135,7 +135,8 @@ internal sealed record LookupData(
135135
List<Release> BranchReleases,
136136
Dictionary<string, RepositoryTag> TagsByName,
137137
Dictionary<string, Release> TagToRelease,
138-
List<Version> ReleaseVersions);
138+
List<Version> ReleaseVersions,
139+
HashSet<string> BranchTagNames);
139140

140141
/// <summary>
141142
/// Fetches all required data from GitHub API in parallel.
@@ -222,7 +223,8 @@ internal static LookupData BuildLookupData(GitHubData data)
222223
branchReleases,
223224
tagsByName,
224225
tagToRelease,
225-
releaseVersions);
226+
releaseVersions,
227+
branchTagNames);
226228
}
227229

228230
/// <summary>
@@ -731,15 +733,22 @@ internal static (string owner, string repo) ParseOwnerRepo(string path)
731733
/// <param name="repo">Repository name.</param>
732734
/// <param name="oldTag">Old tag name (null if from beginning).</param>
733735
/// <param name="newTag">New tag name.</param>
734-
/// <returns>WebLink to GitHub compare page, or null if no baseline tag.</returns>
735-
internal static WebLink? GenerateGitHubChangelogLink(string owner, string repo, string? oldTag, string newTag)
736+
/// <param name="branchTagNames">Set of tag names on the current branch.</param>
737+
/// <returns>WebLink to GitHub compare page, or null if no baseline tag or if tags not found in branch.</returns>
738+
internal static WebLink? GenerateGitHubChangelogLink(string owner, string repo, string? oldTag, string newTag, HashSet<string> branchTagNames)
736739
{
737740
// Cannot generate comparison link without a baseline tag
738741
if (oldTag == null)
739742
{
740743
return null;
741744
}
742745

746+
// Suppress changelog link if either tag is not in the branch
747+
if (!branchTagNames.Contains(oldTag) || !branchTagNames.Contains(newTag))
748+
{
749+
return null;
750+
}
751+
743752
// Build comparison label and URL
744753
var comparisonLabel = $"{oldTag}...{newTag}";
745754
var comparisonUrl = $"https://github.com/{owner}/{repo}/compare/{comparisonLabel}";

test/DemaConsulting.BuildMark.Tests/GitHubRepoConnectorTests.cs

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,11 @@ public void GitHubRepoConnector_GetCommitsInRange_ToHashNotFound_ReturnsEmptyLis
288288
[TestMethod]
289289
public void GitHubRepoConnector_GenerateGitHubChangelogLink_ValidTags_ReturnsWebLink()
290290
{
291+
// Arrange
292+
var branchTagNames = new HashSet<string> { "v1.0.0", "v2.0.0" };
293+
291294
// Act
292-
var link = GitHubRepoConnector.GenerateGitHubChangelogLink("owner", "repo", "v1.0.0", "v2.0.0");
295+
var link = GitHubRepoConnector.GenerateGitHubChangelogLink("owner", "repo", "v1.0.0", "v2.0.0", branchTagNames);
293296

294297
// Assert
295298
Assert.IsNotNull(link);
@@ -303,8 +306,59 @@ public void GitHubRepoConnector_GenerateGitHubChangelogLink_ValidTags_ReturnsWeb
303306
[TestMethod]
304307
public void GitHubRepoConnector_GenerateGitHubChangelogLink_NullOldTag_ReturnsNull()
305308
{
309+
// Arrange
310+
var branchTagNames = new HashSet<string> { "v2.0.0" };
311+
312+
// Act
313+
var link = GitHubRepoConnector.GenerateGitHubChangelogLink("owner", "repo", null, "v2.0.0", branchTagNames);
314+
315+
// Assert
316+
Assert.IsNull(link);
317+
}
318+
319+
/// <summary>
320+
/// Test that GenerateGitHubChangelogLink returns null when oldTag is not in branch tags.
321+
/// </summary>
322+
[TestMethod]
323+
public void GitHubRepoConnector_GenerateGitHubChangelogLink_OldTagNotInBranch_ReturnsNull()
324+
{
325+
// Arrange
326+
var branchTagNames = new HashSet<string> { "v2.0.0" };
327+
306328
// Act
307-
var link = GitHubRepoConnector.GenerateGitHubChangelogLink("owner", "repo", null, "v2.0.0");
329+
var link = GitHubRepoConnector.GenerateGitHubChangelogLink("owner", "repo", "v1.0.0", "v2.0.0", branchTagNames);
330+
331+
// Assert
332+
Assert.IsNull(link);
333+
}
334+
335+
/// <summary>
336+
/// Test that GenerateGitHubChangelogLink returns null when newTag is not in branch tags.
337+
/// </summary>
338+
[TestMethod]
339+
public void GitHubRepoConnector_GenerateGitHubChangelogLink_NewTagNotInBranch_ReturnsNull()
340+
{
341+
// Arrange
342+
var branchTagNames = new HashSet<string> { "v1.0.0" };
343+
344+
// Act
345+
var link = GitHubRepoConnector.GenerateGitHubChangelogLink("owner", "repo", "v1.0.0", "v2.0.0", branchTagNames);
346+
347+
// Assert
348+
Assert.IsNull(link);
349+
}
350+
351+
/// <summary>
352+
/// Test that GenerateGitHubChangelogLink returns null when neither tag is in branch tags.
353+
/// </summary>
354+
[TestMethod]
355+
public void GitHubRepoConnector_GenerateGitHubChangelogLink_NoTagsInBranch_ReturnsNull()
356+
{
357+
// Arrange
358+
var branchTagNames = new HashSet<string>();
359+
360+
// Act
361+
var link = GitHubRepoConnector.GenerateGitHubChangelogLink("owner", "repo", "v1.0.0", "v2.0.0", branchTagNames);
308362

309363
// Assert
310364
Assert.IsNull(link);
@@ -325,6 +379,7 @@ public void GitHubRepoConnector_DetermineTargetVersion_ProvidedVersion_ReturnsPr
325379
[],
326380
[],
327381
[],
382+
[],
328383
[]);
329384

330385
// Act
@@ -349,6 +404,7 @@ public void GitHubRepoConnector_DetermineTargetVersion_NoVersionNoReleases_Throw
349404
[],
350405
[],
351406
[],
407+
[],
352408
[]);
353409

354410
InvalidOperationException? caughtException = null;
@@ -386,6 +442,7 @@ public void GitHubRepoConnector_DetermineBaselineVersion_NoReleases_ReturnsNull(
386442
[],
387443
[],
388444
[],
445+
[],
389446
[]);
390447

391448
// Act

0 commit comments

Comments
 (0)