Skip to content

Commit 45e9503

Browse files
committed
Merge branch 'release/1.1.0'
2 parents ecdd55a + cb228ef commit 45e9503

10 files changed

Lines changed: 173 additions & 12 deletions

File tree

README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,42 @@ be removed, if not needed.)
332332
}
333333
```
334334

335+
#### For every feature branch under the "MyRepository" and "MyRepository2" repositories in the "MyProject" project
336+
337+
```json
338+
{
339+
"type": "Require a merge strategy",
340+
341+
"project": "MyProject",
342+
"branch": "feature/*",
343+
"repositories": ["MyRepository", "MyRepository2"],
344+
345+
"isBlocking": true,
346+
347+
"settings": {
348+
"useSquashMerge": false
349+
}
350+
}
351+
```
352+
353+
#### For the master and every feature branch under the "MyRepository" and "MyRepository2" repositories in the "MyProject" project
354+
355+
```json
356+
{
357+
"type": "Require a merge strategy",
358+
359+
"project": "MyProject",
360+
"branches": [ "master", "feature/*" ],
361+
"repositories": ["MyRepository", "MyRepository2"],
362+
363+
"isBlocking": true,
364+
365+
"settings": {
366+
"useSquashMerge": false
367+
}
368+
}
369+
```
370+
335371
#### Subtype definition
336372

337373
```json

nuspec/chocolatey/AzureDevOpsPolicyConfigurator.nuspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ Azure DevOps policy configurator allows to apply policy settings on an Azure Dev
2626
<requireLicenseAcceptance>false</requireLicenseAcceptance>
2727
<copyright>Copyright © BBT Software AG and contributors</copyright>
2828
<tags>bbt bbtsoftware policy devops azure</tags>
29+
<releaseNotes>https://github.com/bbtsoftware/AzureDevOpsPolicyConfigurator/releases/tag/1.1.0</releaseNotes>
2930
</metadata>
3031
<files>
3132
<file src="..\..\BuildArtifacts\temp\_Packages\**" target="tools" />

setup.cake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#load nuget:https://www.myget.org/F/cake-contrib/api/v2?package=Cake.Recipe&prerelease
1+
#load nuget:?package=Cake.Recipe&version=1.0.0
22

33
Environment.SetVariableNames();
44

src/AzureDevOpsPolicyConfigurator.Tests/AzureDevOpsPolicyConfigurator.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212

1313
<ItemGroup>
14-
<PackageReference Include="Moq" Version="4.10.1" />
14+
<PackageReference Include="Moq" Version="4.11.0" />
1515
<PackageReference Include="StyleCop.Analyzers" Version="1.0.2" />
1616
<PackageReference Include="xunit" Version="2.4.1" />
1717
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />

src/AzureDevOpsPolicyConfigurator.Tests/MultiBranchDefinitionTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace AzureDevOpsPolicyConfigurator.Tests
1010
/// </summary>
1111
public class MultiBranchDefinitionTests
1212
{
13-
[Fact(DisplayName = "Check Multi Branch Definition")]
13+
[Fact(DisplayName = "Check multi branch definition")]
1414
private void TestMultiBranchDefinition()
1515
{
1616
var serializer = new JsonSerializer();
@@ -29,9 +29,9 @@ private void TestMultiBranchDefinition()
2929
policies = policies.FlattenBranches(serializer).ToList();
3030

3131
Assert.Equal(2, policies.Count);
32-
Assert.True(policies[0].Branch == "master");
32+
Assert.Equal("master", policies[0].Branch);
3333
Assert.Null(policies[0].Branches);
34-
Assert.True(policies[1].Branch == "release/my/master");
34+
Assert.Equal("release/my/master", policies[1].Branch);
3535
Assert.Null(policies[1].Branches);
3636
}
3737

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using AzureDevOpsPolicyConfigurator.Data;
4+
using Xunit;
5+
6+
namespace AzureDevOpsPolicyConfigurator.Tests
7+
{
8+
/// <summary>
9+
/// Multi branch definition test class.
10+
/// </summary>
11+
public class MultiRepositoryDefinitionTests
12+
{
13+
[Fact(DisplayName = "Check multi repository definition")]
14+
private void TestMultiRepositoryDefinition()
15+
{
16+
var serializer = new JsonSerializer();
17+
18+
var policies = new List<Policy>()
19+
{
20+
new Policy()
21+
{
22+
Repositories = new List<string>()
23+
{
24+
"myrepo1", "myrepo2"
25+
}
26+
}
27+
};
28+
29+
policies = policies.FlattenRepositories(serializer).ToList();
30+
31+
Assert.Equal(2, policies.Count);
32+
Assert.Equal("myrepo1", policies[0].Repository);
33+
Assert.Null(policies[0].Repositories);
34+
Assert.Equal("myrepo2", policies[1].Repository);
35+
Assert.Null(policies[1].Repositories);
36+
}
37+
38+
[Fact(DisplayName = "Check multi repository with overriding", Skip = SkippingInformation.SkippingReason)]
39+
private async void CheckMultiRepositoryWithOverriding()
40+
{
41+
var result = await new PolicyTester().RunTest(new TestData(@"
42+
{
43+
""allowDeletion"": false,
44+
""ignoreTypes"": [],
45+
""applyTo"": {
46+
""projects"": [ ""##Project##"" ],
47+
""repositories"": [""##Repository##""]
48+
},
49+
""policies"": [
50+
{
51+
""type"": ""Minimum number of reviewers"",
52+
53+
""project"": ""##Project##"",
54+
""repository"": ""##Repository##"",
55+
56+
""isBlocking"": true,
57+
58+
""settings"": {
59+
""minimumApproverCount"": 3,
60+
""creatorVoteCounts"": false,
61+
""allowDownvotes"": false,
62+
""resetOnSourcePush"": false
63+
}
64+
},
65+
{
66+
""type"": ""Minimum number of reviewers"",
67+
68+
""project"": """",
69+
""repositories"": [ ""##Repository##"" ],
70+
71+
""isBlocking"": true,
72+
73+
""settings"": {
74+
""minimumApproverCount"": 6,
75+
""creatorVoteCounts"": false,
76+
""allowDownvotes"": false,
77+
""resetOnSourcePush"": false
78+
}
79+
}
80+
]
81+
}")).ConfigureAwait(false);
82+
83+
Assert.DoesNotContain(result[LogLevel.Debug], x => x.Contains("\"minimumApproverCount\": 3"));
84+
Assert.Contains(result[LogLevel.Debug], x => x.Contains("\"minimumApproverCount\": 6"));
85+
}
86+
}
87+
}

src/AzureDevOpsPolicyConfigurator/AzureDevOpsPolicyConfigurator.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@
1818
<ItemGroup>
1919
<PackageReference Include="log4net" Version="2.0.8" />
2020
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.7" />
21-
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.6.3" />
21+
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.3" />
2222
<PackageReference Include="Microsoft.TeamFoundationServer.Client" Version="16.148.0-preview" />
2323
<PackageReference Include="Microsoft.VisualStudio.Services.InteractiveClient" Version="16.148.0-preview" />
24-
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
24+
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
2525
<PackageReference Include="Spectre.Cli" Version="0.20.0" />
2626
<PackageReference Include="StyleCop.Analyzers" Version="1.0.2" />
2727

2828
<PackageReference Include="System.Net.NameResolution" Version="4.3.0" />
29-
<PackageReference Include="System.Net.Primitives" Version="4.3.0" />
29+
<PackageReference Include="System.Net.Primitives" Version="4.3.1" />
3030
</ItemGroup>
3131

3232
<ItemGroup>

src/AzureDevOpsPolicyConfigurator/Data/Policy.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,15 @@ public MatchKind MatchKind
8787
public List<string> Branches { get; set; }
8888

8989
/// <summary>
90-
/// Gets or sets the policy repository name or repository id.
90+
/// Gets or sets the repository name or repository id.
9191
/// </summary>
9292
public string Repository { get; set; }
9393

94+
/// <summary>
95+
/// Gets or sets a list of repository names or repository ids.
96+
/// </summary>
97+
public List<string> Repositories { get; set; }
98+
9499
/// <summary>
95100
/// Gets or sets a value indicating whether a blocking is needed.
96101
/// </summary>

src/AzureDevOpsPolicyConfigurator/Helpers/PolicyExtension.cs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,11 @@ public static bool DoesSubTypeMatch(this PolicyConfiguration configuration, Poli
8888
/// <returns>Flattened policies</returns>
8989
public static IEnumerable<Policy> FlattenBranches(this IEnumerable<Policy> policies, IJsonSerializer serializer)
9090
{
91-
var policiesToFlatten = policies.Where(x => x.Branches != null && x.Branches.Count > 0).ToList();
9291
var newPolicies = new List<Policy>();
9392

9493
foreach (var policy in policies)
9594
{
96-
if (policy.Branches != null && policy.Branches.Count > 0)
95+
if (policy.Branches != null)
9796
{
9897
foreach (var branch in policy.Branches)
9998
{
@@ -112,6 +111,37 @@ public static IEnumerable<Policy> FlattenBranches(this IEnumerable<Policy> polic
112111
return newPolicies;
113112
}
114113

114+
/// <summary>
115+
/// Flattens the policies by repositories.
116+
/// </summary>
117+
/// <param name="policies">Policies</param>
118+
/// <param name="serializer">Json serializer</param>
119+
/// <returns>Flattened policies</returns>
120+
public static IEnumerable<Policy> FlattenRepositories(this IEnumerable<Policy> policies, IJsonSerializer serializer)
121+
{
122+
var newPolicies = new List<Policy>();
123+
124+
foreach (var policy in policies)
125+
{
126+
if (policy.Repositories != null)
127+
{
128+
foreach (var repository in policy.Repositories)
129+
{
130+
var newPolicy = serializer.Clone(policy);
131+
newPolicy.Repository = repository;
132+
newPolicy.Repositories = null;
133+
newPolicies.Add(newPolicy);
134+
}
135+
136+
continue;
137+
}
138+
139+
newPolicies.Add(policy);
140+
}
141+
142+
return newPolicies;
143+
}
144+
115145
/// <summary>
116146
/// Returns the branch from the settings.
117147
/// </summary>

src/AzureDevOpsPolicyConfigurator/Logic/PolicyExecuterBase.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,9 @@ private IEnumerable<BranchPolicies> GetPoliciesForRepository(
257257
TeamProjectReference project,
258258
GitRepository repository)
259259
{
260-
return policies.FlattenBranches(this.Serializer)
260+
return policies
261+
.FlattenRepositories(this.Serializer)
262+
.FlattenBranches(this.Serializer)
261263
.Where(x =>
262264
(string.IsNullOrEmpty(x.Project) || // global or branch specific
263265
(x.Project.ToLower() == project.Name.ToLower() || x.Project.ToLower() == project.Id.ToString().ToLower())) && // project or project branch specific

0 commit comments

Comments
 (0)