Skip to content

Commit fe976bc

Browse files
committed
(maint) Spit up methods throwing exceptions and using async
In general, exceptions shouldn't be thrown when running inside an async method as they get caught inside an aggregateexception most/all of the time. This commit extracts the async code to an async internal method instead of having the main method being async. Not all methods are possible to do this way.
1 parent 1cd902e commit fe976bc

File tree

2 files changed

+68
-54
lines changed

2 files changed

+68
-54
lines changed

Source/GitReleaseManager/GitHubProvider.cs

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ namespace GitReleaseManager.Core
2828

2929
public class GitHubProvider : IVcsProvider
3030
{
31-
private readonly ILogger _logger = Log.ForContext<GitHubProvider>();
32-
3331
private readonly Config _configuration;
32+
private readonly ILogger _logger = Log.ForContext<GitHubProvider>();
3433
private readonly IMapper _mapper;
3534
private GitHubClient _gitHubClient;
3635

@@ -41,34 +40,14 @@ public GitHubProvider(IMapper mapper, Config configuration, string userName, str
4140
CreateClient(userName, password, token);
4241
}
4342

44-
public async Task<int> GetNumberOfCommitsBetween(Milestone previousMilestone, Milestone currentMilestone, string user, string repository)
43+
public Task<int> GetNumberOfCommitsBetween(Milestone previousMilestone, Milestone currentMilestone, string user, string repository)
4544
{
4645
if (currentMilestone is null)
4746
{
4847
throw new ArgumentNullException(nameof(currentMilestone));
4948
}
5049

51-
try
52-
{
53-
if (previousMilestone == null)
54-
{
55-
_logger.Verbose("Getting commit count between base '{Base}' and head '{Head}'", "master", currentMilestone.Title);
56-
var gitHubClientRepositoryCommitsCompare = await _gitHubClient.Repository.Commit.Compare(user, repository, "master", currentMilestone.Title).ConfigureAwait(false);
57-
return gitHubClientRepositoryCommitsCompare.AheadBy;
58-
}
59-
60-
_logger.Verbose("Getting commit count between base '{Base}' and head '{Head}'", previousMilestone.Title, "master");
61-
var compareResult = await _gitHubClient.Repository.Commit.Compare(user, repository, previousMilestone.Title, "master").ConfigureAwait(false);
62-
return compareResult.AheadBy;
63-
}
64-
catch (NotFoundException)
65-
{
66-
_logger.Warning("Unable to find tag for milestone, so commit count will be returned as zero");
67-
68-
// If there is no tag yet the Compare will return a NotFoundException
69-
// we can safely ignore
70-
return 0;
71-
}
50+
return GetNumberOfCommitsBetweenInternal(previousMilestone, currentMilestone, user, repository);
7251
}
7352

7453
public async Task<List<Issue>> GetIssuesAsync(Milestone targetMilestone)
@@ -174,27 +153,14 @@ public async Task<Release> CreateReleaseFromMilestone(string owner, string repos
174153
return _mapper.Map<Octokit.Release, Release>(release);
175154
}
176155

177-
public async Task<Release> CreateReleaseFromInputFile(string owner, string repository, string name, string inputFilePath, string targetCommitish, IList<string> assets, bool prerelease)
156+
public Task<Release> CreateReleaseFromInputFile(string owner, string repository, string name, string inputFilePath, string targetCommitish, IList<string> assets, bool prerelease)
178157
{
179158
if (!File.Exists(inputFilePath))
180159
{
181160
throw new ArgumentException("Unable to locate input file.");
182161
}
183162

184-
_logger.Verbose("Reading release notes from: '{FilePath}'", inputFilePath);
185-
186-
var inputFileContents = File.ReadAllText(inputFilePath);
187-
188-
var releaseUpdate = CreateNewRelease(name, name, inputFileContents, prerelease, targetCommitish);
189-
190-
_logger.Verbose("Creating new release on '{Owner}/{Repository}'", owner, repository);
191-
_logger.Debug("{@ReleaseUpdate}", releaseUpdate);
192-
193-
var release = await _gitHubClient.Repository.Release.Create(owner, repository, releaseUpdate).ConfigureAwait(false);
194-
195-
await AddAssets(owner, repository, name, assets).ConfigureAwait(false);
196-
197-
return _mapper.Map<Octokit.Release, Release>(release);
163+
return CreateReleaseFromInputFileInternal(owner, repository, name, inputFilePath, targetCommitish, assets, prerelease);
198164
}
199165

200166
public async Task DiscardRelease(string owner, string repository, string name)
@@ -472,6 +438,24 @@ private async Task<bool> CommentsIncludeString(string owner, string repository,
472438
return issueComments.Any(c => c.Body.Contains(comment));
473439
}
474440

441+
private async Task<Release> CreateReleaseFromInputFileInternal(string owner, string repository, string name, string inputFilePath, string targetCommitish, IList<string> assets, bool prerelease)
442+
{
443+
_logger.Verbose("Reading release notes from: '{FilePath}'", inputFilePath);
444+
445+
var inputFileContents = File.ReadAllText(inputFilePath);
446+
447+
var releaseUpdate = CreateNewRelease(name, name, inputFileContents, prerelease, targetCommitish);
448+
449+
_logger.Verbose("Creating new release on '{Owner}/{Repository}'", owner, repository);
450+
_logger.Debug("{@ReleaseUpdate}", releaseUpdate);
451+
452+
var release = await _gitHubClient.Repository.Release.Create(owner, repository, releaseUpdate).ConfigureAwait(false);
453+
454+
await AddAssets(owner, repository, name, assets).ConfigureAwait(false);
455+
456+
return _mapper.Map<Octokit.Release, Release>(release);
457+
}
458+
475459
private Task<IReadOnlyList<Octokit.Issue>> GetIssuesFromMilestoneAsync(string owner, string repository, string milestone, ItemStateFilter state = ItemStateFilter.Closed)
476460
{
477461
_logger.Verbose("Finding issues with milestone: '{Milestone}", milestone);
@@ -482,6 +466,31 @@ private async Task<bool> CommentsIncludeString(string owner, string repository,
482466
});
483467
}
484468

469+
private async Task<int> GetNumberOfCommitsBetweenInternal(Milestone previousMilestone, Milestone currentMilestone, string user, string repository)
470+
{
471+
try
472+
{
473+
if (previousMilestone == null)
474+
{
475+
_logger.Verbose("Getting commit count between base '{Base}' and head '{Head}'", "master", currentMilestone.Title);
476+
var gitHubClientRepositoryCommitsCompare = await _gitHubClient.Repository.Commit.Compare(user, repository, "master", currentMilestone.Title).ConfigureAwait(false);
477+
return gitHubClientRepositoryCommitsCompare.AheadBy;
478+
}
479+
480+
_logger.Verbose("Getting commit count between base '{Base}' and head '{Head}'", previousMilestone.Title, "master");
481+
var compareResult = await _gitHubClient.Repository.Commit.Compare(user, repository, previousMilestone.Title, "master").ConfigureAwait(false);
482+
return compareResult.AheadBy;
483+
}
484+
catch (NotFoundException)
485+
{
486+
_logger.Warning("Unable to find tag for milestone, so commit count will be returned as zero");
487+
488+
// If there is no tag yet the Compare will return a NotFoundException
489+
// we can safely ignore
490+
return 0;
491+
}
492+
}
493+
485494
private async Task<Octokit.Release> GetReleaseFromTagNameAsync(string owner, string repository, string tagName)
486495
{
487496
_logger.Verbose("Finding release with tag name: '{TagName}'", tagName);

Source/GitReleaseManager/OctokitExtensions.cs

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public static bool IsPullRequest(this Issue issue)
2828
return !(issue.PullRequest is null);
2929
}
3030

31-
public static async Task<IEnumerable<Issue>> AllIssuesForMilestone(this GitHubClient gitHubClient, Milestone milestone)
31+
public static Task<IEnumerable<Issue>> AllIssuesForMilestone(this GitHubClient gitHubClient, Milestone milestone)
3232
{
3333
if (gitHubClient is null)
3434
{
@@ -40,6 +40,25 @@ public static async Task<IEnumerable<Issue>> AllIssuesForMilestone(this GitHubCl
4040
throw new ArgumentNullException(nameof(milestone));
4141
}
4242

43+
return AllIssuesForMilestoneInternal(gitHubClient, milestone);
44+
}
45+
46+
public static Uri HtmlUrl(this Milestone milestone)
47+
{
48+
if (milestone is null)
49+
{
50+
throw new ArgumentNullException(nameof(milestone));
51+
}
52+
53+
var parts = milestone.Url.Split('/');
54+
var user = parts[2];
55+
var repository = parts[3];
56+
57+
return new Uri(string.Format(CultureInfo.InvariantCulture, "https://github.com/{0}/{1}/issues?milestone={2}&state=closed", user, repository, milestone.Number));
58+
}
59+
60+
private static async Task<IEnumerable<Issue>> AllIssuesForMilestoneInternal(GitHubClient gitHubClient, Milestone milestone)
61+
{
4362
var closedIssueRequest = new RepositoryIssueRequest
4463
{
4564
Milestone = milestone.Number.ToString(CultureInfo.InvariantCulture),
@@ -63,19 +82,5 @@ public static async Task<IEnumerable<Issue>> AllIssuesForMilestone(this GitHubCl
6382

6483
return openIssues.Union(closedIssues);
6584
}
66-
67-
public static Uri HtmlUrl(this Milestone milestone)
68-
{
69-
if (milestone is null)
70-
{
71-
throw new ArgumentNullException(nameof(milestone));
72-
}
73-
74-
var parts = milestone.Url.Split('/');
75-
var user = parts[2];
76-
var repository = parts[3];
77-
78-
return new Uri(string.Format(CultureInfo.InvariantCulture, "https://github.com/{0}/{1}/issues?milestone={2}&state=closed", user, repository, milestone.Number));
79-
}
8085
}
8186
}

0 commit comments

Comments
 (0)