Skip to content

Commit e2a22ca

Browse files
CopilotMalcolmnixon
andcommitted
Return ReleaseNode directly from GetReleasesAsync to eliminate extra conversions
Co-authored-by: Malcolmnixon <1863707+Malcolmnixon@users.noreply.github.com>
1 parent a1820c1 commit e2a22ca

File tree

3 files changed

+52
-62
lines changed

3 files changed

+52
-62
lines changed

src/DemaConsulting.BuildMark/RepoConnectors/GitHub/GitHubGraphQLClient.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,14 @@ ... on Commit {
177177
/// </summary>
178178
/// <param name="owner">Repository owner.</param>
179179
/// <param name="repo">Repository name.</param>
180-
/// <returns>List of release tag names.</returns>
181-
public async Task<List<string>> GetReleasesAsync(
180+
/// <returns>List of release nodes.</returns>
181+
public async Task<List<ReleaseNode>> GetReleasesAsync(
182182
string owner,
183183
string repo)
184184
{
185185
try
186186
{
187-
var allReleaseTagNames = new List<string>();
187+
var allReleaseNodes = new List<ReleaseNode>();
188188
string? afterCursor = null;
189189
bool hasNextPage;
190190

@@ -219,13 +219,12 @@ public async Task<List<string>> GetReleasesAsync(
219219
// Execute GraphQL query
220220
var response = await _graphqlClient.SendQueryAsync<GetReleasesResponse>(request);
221221

222-
// Extract release tag names from the GraphQL response, filtering out null or invalid values
223-
var pageReleaseTagNames = response.Data?.Repository?.Releases?.Nodes?
222+
// Extract release nodes from the GraphQL response, filtering out null or invalid values
223+
var pageReleaseNodes = response.Data?.Repository?.Releases?.Nodes?
224224
.Where(n => !string.IsNullOrEmpty(n.TagName))
225-
.Select(n => n.TagName!)
226225
.ToList() ?? [];
227226

228-
allReleaseTagNames.AddRange(pageReleaseTagNames);
227+
allReleaseNodes.AddRange(pageReleaseNodes);
229228

230229
// Check if there are more pages
231230
var pageInfo = response.Data?.Repository?.Releases?.PageInfo;
@@ -234,8 +233,8 @@ public async Task<List<string>> GetReleasesAsync(
234233
}
235234
while (hasNextPage);
236235

237-
// Return list of all release tag names
238-
return allReleaseTagNames;
236+
// Return list of all release nodes
237+
return allReleaseNodes;
239238
}
240239
catch
241240
{

src/DemaConsulting.BuildMark/RepoConnectors/GitHubRepoConnector.cs

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -126,18 +126,12 @@ public override async Task<BuildInformation> GetBuildInformationAsync(Version? v
126126
internal sealed record Commit(
127127
string Sha);
128128

129-
/// <summary>
130-
/// Simple release representation containing only the tag name.
131-
/// </summary>
132-
internal sealed record Release(
133-
string TagName);
134-
135129
/// <summary>
136130
/// Container for GitHub data fetched from the API.
137131
/// </summary>
138132
internal sealed record GitHubData(
139133
IReadOnlyList<Commit> Commits,
140-
IReadOnlyList<Release> Releases,
134+
IReadOnlyList<ReleaseNode> Releases,
141135
IReadOnlyList<RepositoryTag> Tags,
142136
IReadOnlyList<PullRequest> PullRequests,
143137
IReadOnlyList<Issue> Issues);
@@ -148,9 +142,9 @@ internal sealed record GitHubData(
148142
internal sealed record LookupData(
149143
Dictionary<int, Issue> IssueById,
150144
Dictionary<string, PullRequest> CommitHashToPr,
151-
List<Release> BranchReleases,
145+
List<ReleaseNode> BranchReleases,
152146
Dictionary<string, RepositoryTag> TagsByName,
153-
Dictionary<string, Release> TagToRelease,
147+
Dictionary<string, ReleaseNode> TagToRelease,
154148
List<Version> ReleaseVersions,
155149
HashSet<string> BranchTagNames);
156150

@@ -220,7 +214,7 @@ internal static LookupData BuildLookupData(GitHubData data)
220214
// Build an ordered list of releases on the current branch.
221215
// This is used to select the prior release version for identifying changes in the build.
222216
var branchReleases = data.Releases
223-
.Where(r => branchTagNames.Contains(r.TagName))
217+
.Where(r => r.TagName != null && branchTagNames.Contains(r.TagName))
224218
.ToList();
225219

226220
// Build a mapping from tag name to tag object for quick lookup.
@@ -229,12 +223,12 @@ internal static LookupData BuildLookupData(GitHubData data)
229223

230224
// Build a mapping from tag name to release for version lookup.
231225
// This is used to match version objects back to their releases.
232-
var tagToRelease = branchReleases.ToDictionary(r => r.TagName, r => r);
226+
var tagToRelease = branchReleases.ToDictionary(r => r.TagName!, r => r);
233227

234228
// Parse release tags into Version objects, maintaining release order (newest to oldest).
235229
// This is used to determine version history and find previous releases.
236230
var releaseVersions = branchReleases
237-
.Select(r => Version.TryCreate(r.TagName))
231+
.Select(r => Version.TryCreate(r.TagName!))
238232
.Where(v => v != null)
239233
.Cast<Version>()
240234
.ToList();
@@ -283,7 +277,7 @@ internal static (Version toVersion, string toHash) DetermineTargetVersion(
283277
// Use the most recent release (first in list since releases are newest to oldest)
284278
var latestRelease = lookupData.BranchReleases[0];
285279
var latestReleaseVersion = lookupData.ReleaseVersions[0];
286-
var latestTagCommit = lookupData.TagsByName[latestRelease.TagName];
280+
var latestTagCommit = lookupData.TagsByName[latestRelease.TagName!];
287281

288282
// Check if current commit matches latest release tag
289283
if (latestTagCommit.Commit.Sha == toHash)
@@ -325,7 +319,7 @@ internal static (Version? fromVersion, string? fromHash) DetermineBaselineVersio
325319
// Get commit hash for baseline version if one was found
326320
if (fromVersion != null &&
327321
lookupData.TagToRelease.TryGetValue(fromVersion.Tag, out var fromRelease) &&
328-
lookupData.TagsByName.TryGetValue(fromRelease.TagName, out var fromTagCommit))
322+
lookupData.TagsByName.TryGetValue(fromRelease.TagName!, out var fromTagCommit))
329323
{
330324
return (fromVersion, fromTagCommit.Commit.Sha);
331325
}
@@ -585,16 +579,13 @@ private static async Task<IReadOnlyList<Commit>> GetAllCommitsAsync(
585579
/// <param name="owner">Repository owner.</param>
586580
/// <param name="repo">Repository name.</param>
587581
/// <returns>List of all releases.</returns>
588-
private static async Task<IReadOnlyList<Release>> GetAllReleasesAsync(
582+
private static async Task<IReadOnlyList<ReleaseNode>> GetAllReleasesAsync(
589583
GitHubGraphQLClient graphqlClient,
590584
string owner,
591585
string repo)
592586
{
593-
// Fetch all release tag names for the repository using GraphQL
594-
var releaseTagNames = await graphqlClient.GetReleasesAsync(owner, repo);
595-
596-
// Convert tag names to Release objects
597-
return releaseTagNames.Select(tagName => new Release(tagName)).ToList();
587+
// Fetch all releases for the repository using GraphQL
588+
return await graphqlClient.GetReleasesAsync(owner, repo);
598589
}
599590

600591
/// <summary>

test/DemaConsulting.BuildMark.Tests/RepoConnectors/GitHub/GitHubGraphQLClientTests.cs

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -820,14 +820,14 @@ public async Task GitHubGraphQLClient_GetReleasesAsync_ValidResponse_ReturnsRele
820820
using var client = new GitHubGraphQLClient(httpClient);
821821

822822
// Act
823-
var releaseTagNames = await client.GetReleasesAsync("owner", "repo");
823+
var releaseNodes = await client.GetReleasesAsync("owner", "repo");
824824

825825
// Assert
826-
Assert.IsNotNull(releaseTagNames);
827-
Assert.HasCount(3, releaseTagNames);
828-
Assert.AreEqual("v1.0.0", releaseTagNames[0]);
829-
Assert.AreEqual("v0.9.0", releaseTagNames[1]);
830-
Assert.AreEqual("v0.8.5", releaseTagNames[2]);
826+
Assert.IsNotNull(releaseNodes);
827+
Assert.HasCount(3, releaseNodes);
828+
Assert.AreEqual("v1.0.0", releaseNodes[0].TagName);
829+
Assert.AreEqual("v0.9.0", releaseNodes[1].TagName);
830+
Assert.AreEqual("v0.8.5", releaseNodes[2].TagName);
831831
}
832832

833833
/// <summary>
@@ -855,11 +855,11 @@ public async Task GitHubGraphQLClient_GetReleasesAsync_NoReleases_ReturnsEmptyLi
855855
using var client = new GitHubGraphQLClient(httpClient);
856856

857857
// Act
858-
var releaseTagNames = await client.GetReleasesAsync("owner", "repo");
858+
var releaseNodes = await client.GetReleasesAsync("owner", "repo");
859859

860860
// Assert
861-
Assert.IsNotNull(releaseTagNames);
862-
Assert.IsEmpty(releaseTagNames);
861+
Assert.IsNotNull(releaseNodes);
862+
Assert.IsEmpty(releaseNodes);
863863
}
864864

865865
/// <summary>
@@ -879,11 +879,11 @@ public async Task GitHubGraphQLClient_GetReleasesAsync_MissingData_ReturnsEmptyL
879879
using var client = new GitHubGraphQLClient(httpClient);
880880

881881
// Act
882-
var releaseTagNames = await client.GetReleasesAsync("owner", "repo");
882+
var releaseNodes = await client.GetReleasesAsync("owner", "repo");
883883

884884
// Assert
885-
Assert.IsNotNull(releaseTagNames);
886-
Assert.IsEmpty(releaseTagNames);
885+
Assert.IsNotNull(releaseNodes);
886+
Assert.IsEmpty(releaseNodes);
887887
}
888888

889889
/// <summary>
@@ -899,11 +899,11 @@ public async Task GitHubGraphQLClient_GetReleasesAsync_HttpError_ReturnsEmptyLis
899899
using var client = new GitHubGraphQLClient(httpClient);
900900

901901
// Act
902-
var releaseTagNames = await client.GetReleasesAsync("owner", "repo");
902+
var releaseNodes = await client.GetReleasesAsync("owner", "repo");
903903

904904
// Assert
905-
Assert.IsNotNull(releaseTagNames);
906-
Assert.IsEmpty(releaseTagNames);
905+
Assert.IsNotNull(releaseNodes);
906+
Assert.IsEmpty(releaseNodes);
907907
}
908908

909909
/// <summary>
@@ -919,11 +919,11 @@ public async Task GitHubGraphQLClient_GetReleasesAsync_InvalidJson_ReturnsEmptyL
919919
using var client = new GitHubGraphQLClient(httpClient);
920920

921921
// Act
922-
var releaseTagNames = await client.GetReleasesAsync("owner", "repo");
922+
var releaseNodes = await client.GetReleasesAsync("owner", "repo");
923923

924924
// Assert
925-
Assert.IsNotNull(releaseTagNames);
926-
Assert.IsEmpty(releaseTagNames);
925+
Assert.IsNotNull(releaseNodes);
926+
Assert.IsEmpty(releaseNodes);
927927
}
928928

929929
/// <summary>
@@ -953,12 +953,12 @@ public async Task GitHubGraphQLClient_GetReleasesAsync_SingleRelease_ReturnsOneT
953953
using var client = new GitHubGraphQLClient(httpClient);
954954

955955
// Act
956-
var releaseTagNames = await client.GetReleasesAsync("owner", "repo");
956+
var releaseNodes = await client.GetReleasesAsync("owner", "repo");
957957

958958
// Assert
959-
Assert.IsNotNull(releaseTagNames);
960-
Assert.HasCount(1, releaseTagNames);
961-
Assert.AreEqual("v2.0.0-beta1", releaseTagNames[0]);
959+
Assert.IsNotNull(releaseNodes);
960+
Assert.HasCount(1, releaseNodes);
961+
Assert.AreEqual("v2.0.0-beta1", releaseNodes[0].TagName);
962962
}
963963

964964
/// <summary>
@@ -990,13 +990,13 @@ public async Task GitHubGraphQLClient_GetReleasesAsync_MissingTagNameProperty_Sk
990990
using var client = new GitHubGraphQLClient(httpClient);
991991

992992
// Act
993-
var releaseTagNames = await client.GetReleasesAsync("owner", "repo");
993+
var releaseNodes = await client.GetReleasesAsync("owner", "repo");
994994

995995
// Assert
996-
Assert.IsNotNull(releaseTagNames);
997-
Assert.HasCount(2, releaseTagNames);
998-
Assert.AreEqual("v1.0.0", releaseTagNames[0]);
999-
Assert.AreEqual("v0.9.0", releaseTagNames[1]);
996+
Assert.IsNotNull(releaseNodes);
997+
Assert.HasCount(2, releaseNodes);
998+
Assert.AreEqual("v1.0.0", releaseNodes[0].TagName);
999+
Assert.AreEqual("v0.9.0", releaseNodes[1].TagName);
10001000
}
10011001

10021002
/// <summary>
@@ -1011,14 +1011,14 @@ public async Task GitHubGraphQLClient_GetReleasesAsync_WithPagination_ReturnsAll
10111011
using var client = new GitHubGraphQLClient(httpClient);
10121012

10131013
// Act
1014-
var releaseTagNames = await client.GetReleasesAsync("owner", "repo");
1014+
var releaseNodes = await client.GetReleasesAsync("owner", "repo");
10151015

10161016
// Assert
1017-
Assert.IsNotNull(releaseTagNames);
1018-
Assert.HasCount(3, releaseTagNames);
1019-
Assert.AreEqual("v3.0.0", releaseTagNames[0]);
1020-
Assert.AreEqual("v2.0.0", releaseTagNames[1]);
1021-
Assert.AreEqual("v1.0.0", releaseTagNames[2]);
1017+
Assert.IsNotNull(releaseNodes);
1018+
Assert.HasCount(3, releaseNodes);
1019+
Assert.AreEqual("v3.0.0", releaseNodes[0].TagName);
1020+
Assert.AreEqual("v2.0.0", releaseNodes[1].TagName);
1021+
Assert.AreEqual("v1.0.0", releaseNodes[2].TagName);
10221022
}
10231023

10241024
/// <summary>

0 commit comments

Comments
 (0)