Skip to content

Commit ded0ef6

Browse files
authored
Merge pull request #369 from gep13/feature/GH113
(#113) Return all issues that have errors
2 parents 1763077 + d815190 commit ded0ef6

File tree

3 files changed

+91
-31
lines changed

3 files changed

+91
-31
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace GitReleaseManager.Core.Exceptions
5+
{
6+
[Serializable]
7+
public class InvalidIssuesException : Exception
8+
{
9+
public InvalidIssuesException()
10+
{
11+
}
12+
13+
public InvalidIssuesException(List<string> errors)
14+
: base(string.Join(Environment.NewLine, errors))
15+
{
16+
Errors = errors;
17+
}
18+
19+
public InvalidIssuesException(List<string> errors, string message)
20+
: base(message)
21+
{
22+
Errors = errors;
23+
}
24+
25+
public InvalidIssuesException(List<string> errors, string message, Exception inner)
26+
: base(message, inner)
27+
{
28+
Errors = errors;
29+
}
30+
31+
public List<string> Errors { get; set; }
32+
33+
protected InvalidIssuesException(
34+
System.Runtime.Serialization.SerializationInfo info,
35+
System.Runtime.Serialization.StreamingContext context)
36+
: base(info, context) { }
37+
}
38+
}

src/GitReleaseManager.Core/ReleaseNotes/ReleaseNotesBuilder.cs

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Linq;
55
using System.Threading.Tasks;
66
using GitReleaseManager.Core.Configuration;
7+
using GitReleaseManager.Core.Exceptions;
78
using GitReleaseManager.Core.Helpers;
89
using GitReleaseManager.Core.Model;
910
using GitReleaseManager.Core.Provider;
@@ -124,36 +125,43 @@ private string GetValidLabel(string label, int issuesCount)
124125
return newLabel;
125126
}
126127

127-
private bool CheckForValidLabels(Issue issue)
128+
private (List<Issue> IssuesWithValidLabel, List<string> Errors) CheckIssuesForValidLabels(IEnumerable<Issue> issues)
128129
{
129-
var includedIssuesCount = 0;
130-
var excludedIssuesCount = 0;
130+
var validIssues = new List<Issue>();
131+
var errors = new List<string>();
131132

132-
foreach (var issueLabel in issue.Labels)
133+
foreach (var issue in issues)
133134
{
134-
includedIssuesCount += _configuration.IssueLabelsInclude.Count(issueToInclude => issueLabel.Name.ToUpperInvariant() == issueToInclude.ToUpperInvariant());
135+
var includedIssuesCount = 0;
136+
var excludedIssuesCount = 0;
135137

136-
excludedIssuesCount += _configuration.IssueLabelsExclude.Count(issueToExclude => issueLabel.Name.ToUpperInvariant() == issueToExclude.ToUpperInvariant());
137-
}
138+
foreach (var issueLabel in issue.Labels)
139+
{
140+
includedIssuesCount += _configuration.IssueLabelsInclude.Count(issueToInclude => issueLabel.Name.ToUpperInvariant() == issueToInclude.ToUpperInvariant());
138141

139-
if (includedIssuesCount + excludedIssuesCount != 1)
140-
{
141-
var allIssueLabels = _configuration.IssueLabelsInclude.Union(_configuration.IssueLabelsExclude).ToList();
142-
var allIssuesExceptLast = allIssueLabels.Take(allIssueLabels.Count - 1);
143-
var lastLabel = allIssueLabels.Last();
142+
excludedIssuesCount += _configuration.IssueLabelsExclude.Count(issueToExclude => issueLabel.Name.ToUpperInvariant() == issueToExclude.ToUpperInvariant());
143+
}
144144

145-
var allIssuesExceptLastString = string.Join(", ", allIssuesExceptLast);
145+
if (includedIssuesCount + excludedIssuesCount != 1)
146+
{
147+
var allIssueLabels = _configuration.IssueLabelsInclude.Union(_configuration.IssueLabelsExclude).ToList();
148+
var allIssuesExceptLast = allIssueLabels.Take(allIssueLabels.Count - 1);
149+
var lastLabel = allIssueLabels.Last();
146150

147-
var message = string.Format(CultureInfo.InvariantCulture, "Bad Issue {0} expected to find a single label with either {1} or {2}.", issue.HtmlUrl, allIssuesExceptLastString, lastLabel);
148-
throw new InvalidOperationException(message);
149-
}
151+
var allIssuesExceptLastString = string.Join(", ", allIssuesExceptLast);
150152

151-
if (includedIssuesCount > 0)
152-
{
153-
return true;
153+
var message = string.Format(CultureInfo.InvariantCulture, "Bad Issue {0} expected to find a single label with either {1} or {2}.", issue.HtmlUrl, allIssuesExceptLastString, lastLabel);
154+
errors.Add(message);
155+
continue;
156+
}
157+
158+
if (includedIssuesCount > 0)
159+
{
160+
validIssues.Add(issue);
161+
}
154162
}
155163

156-
return false;
164+
return (validIssues, errors);
157165
}
158166

159167
private Milestone GetPreviousMilestone()
@@ -173,28 +181,25 @@ private async Task LoadMilestonesAsync()
173181

174182
private async Task<List<Issue>> GetIssuesAsync(Milestone milestone)
175183
{
176-
var issues = await _vcsProvider.GetIssuesAsync(_user, _repository, milestone.Number, ItemStateFilter.Closed).ConfigureAwait(false);
184+
var allIssues = await _vcsProvider.GetIssuesAsync(_user, _repository, milestone.Number, ItemStateFilter.Closed).ConfigureAwait(false);
177185

178-
var hasIncludedIssues = false;
186+
var result = CheckIssuesForValidLabels(allIssues);
179187

180-
foreach (var issue in issues)
188+
if (result.Errors.Count > 0)
181189
{
182-
if (CheckForValidLabels(issue))
183-
{
184-
hasIncludedIssues = true;
185-
}
190+
throw new InvalidIssuesException(result.Errors);
186191
}
187192

188193
// If there are no issues assigned to the milestone that have a label that is part
189194
// of the labels to include array, then that is essentially the same as having no
190195
// closed issues assigned to the milestone. In this scenario, we want to raise an
191196
// error, so return an emtpy issues list.
192-
if (!hasIncludedIssues)
197+
if (!result.IssuesWithValidLabel.Any())
193198
{
194199
return new List<Issue>();
195200
}
196201

197-
return issues.ToList();
202+
return allIssues.ToList();
198203
}
199204

200205
private void GetTargetMilestone()

src/GitReleaseManager.Tests/ReleaseNotesBuilderTests.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Threading.Tasks;
55
using ApprovalTests;
66
using GitReleaseManager.Core.Configuration;
7+
using GitReleaseManager.Core.Exceptions;
78
using GitReleaseManager.Core.Helpers;
89
using GitReleaseManager.Core.Model;
910
using GitReleaseManager.Core.Provider;
@@ -150,14 +151,30 @@ public void CorrectlyUseFooterWithMilestoneWhenEnabled()
150151
public void NoCommitsWrongIssueLabel()
151152
{
152153
var exception = Assert.Throws<AggregateException>(() => AcceptTest(0, CreateIssue(1, "Test")));
153-
Assert.That(exception.InnerException, Is.Not.Null.And.TypeOf<InvalidOperationException>());
154+
Assert.That(exception.InnerException, Is.Not.Null.And.TypeOf<InvalidIssuesException>());
154155
}
155156

156157
[Test]
157158
public void SomeCommitsWrongIssueLabel()
158159
{
159160
var exception = Assert.Throws<AggregateException>(() => AcceptTest(5, CreateIssue(1, "Test")));
160-
Assert.That(exception.InnerException, Is.Not.Null.And.TypeOf<InvalidOperationException>());
161+
Assert.That(exception.InnerException, Is.Not.Null.And.TypeOf<InvalidIssuesException>());
162+
}
163+
164+
[Test]
165+
public void NoCommitsMultipleWrongIssueLabel()
166+
{
167+
var exception = Assert.Throws<AggregateException>(() => AcceptTest(0, CreateIssue(1, "Test"), CreateIssue(2, "Test")));
168+
Assert.That(exception.InnerException, Is.Not.Null.And.TypeOf<InvalidIssuesException>());
169+
Assert.That((exception.InnerException as InvalidIssuesException).Errors.Count, Is.EqualTo(2));
170+
}
171+
172+
[Test]
173+
public void SomeCommitsMultipleWrongIssueLabel()
174+
{
175+
var exception = Assert.Throws<AggregateException>(() => AcceptTest(5, CreateIssue(1, "Test"), CreateIssue(2, "Test"), CreateIssue(3, "Bob")));
176+
Assert.That(exception.InnerException, Is.Not.Null.And.TypeOf<InvalidIssuesException>());
177+
Assert.That((exception.InnerException as InvalidIssuesException).Errors.Count, Is.EqualTo(3));
161178
}
162179

163180
[Test]

0 commit comments

Comments
 (0)