Skip to content

Commit 4cdc807

Browse files
committed
(#373) Ensure that release is located correctly
There is no method in Octockit to find a release by a name, only by a tag. GRM, previously, had a method to filter a returned list of releases to find the one with the given name, however, this was incorrectly refactored out, and work had to be done to put it back in place. Found during testing on Twitch stream.
1 parent d8473c1 commit 4cdc807

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

src/GitReleaseManager.Core/Provider/GitHubProvider.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,14 @@ public Task<Release> GetReleaseAsync(string owner, string repository, string tag
254254
{
255255
return ExecuteAsync(async () =>
256256
{
257-
var release = await _gitHubClient.Repository.Release.Get(owner, repository, tagName).ConfigureAwait(false);
257+
// This method wants to return a single Release, that has the tagName that is requested.
258+
// The obvious thing to do here would be to use Repository.Release.Get, however, this doesn't
259+
// return a release if it hasn't been published yet. As a result, we have to get all of them,
260+
// and then filter down to the required tagName. This isn't very efficient, and would love to
261+
// have a better approach, but for now, this does the job.
262+
var releases = await _gitHubClient.Repository.Release.GetAll(owner, repository).ConfigureAwait(false);
263+
264+
var release = releases.FirstOrDefault(r => r.TagName == tagName);
258265

259266
return _mapper.Map<Release>(release);
260267
});

src/GitReleaseManager.Core/VcsService.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,19 @@ private async Task<Release> CreateReleaseAsync(string owner, string repository,
6868
{
6969
Release release;
7070

71-
try
71+
release = await _vcsProvider.GetReleaseAsync(owner, repository, tagName).ConfigureAwait(false);
72+
73+
if (release == null)
7274
{
73-
release = await _vcsProvider.GetReleaseAsync(owner, repository, tagName).ConfigureAwait(false);
75+
release = CreateReleaseModel(name, tagName, body, prerelease, targetCommitish);
76+
77+
_logger.Verbose("Creating new release with tag '{TagName}' on '{Owner}/{Repository}'", tagName, owner, repository);
78+
_logger.Debug("{@Release}", release);
7479

80+
release = await _vcsProvider.CreateReleaseAsync(owner, repository, release).ConfigureAwait(false);
81+
}
82+
else
83+
{
7584
if (!release.Draft && !_configuration.Create.AllowUpdateToPublishedRelease)
7685
{
7786
throw new InvalidOperationException($"Release with tag '{tagName}' not in draft state, so not updating");
@@ -85,15 +94,6 @@ private async Task<Release> CreateReleaseAsync(string owner, string repository,
8594

8695
await _vcsProvider.UpdateReleaseAsync(owner, repository, release).ConfigureAwait(false);
8796
}
88-
catch (NotFoundException)
89-
{
90-
release = CreateReleaseModel(name, tagName, body, prerelease, targetCommitish);
91-
92-
_logger.Verbose("Creating new release with tag '{TagName}' on '{Owner}/{Repository}'", tagName, owner, repository);
93-
_logger.Debug("{@Release}", release);
94-
95-
release = await _vcsProvider.CreateReleaseAsync(owner, repository, release).ConfigureAwait(false);
96-
}
9797

9898
await AddAssetsAsync(owner, repository, tagName, assets).ConfigureAwait(false);
9999

0 commit comments

Comments
 (0)