Skip to content

Commit d5f980f

Browse files
committed
Insert option to considered the remote name when generating a semantic version on a remote branch.
1 parent 8cb2665 commit d5f980f

13 files changed

+62
-21
lines changed

docs/input/docs/reference/configuration.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ created. Modify this to suit your needs.
4040
The global configuration looks like this:
4141

4242
```yaml
43+
remote-name-in-git: origin
4344
assembly-versioning-scheme: MajorMinorPatch
4445
assembly-file-versioning-scheme: MajorMinorPatch
4546
label-prefix: '[vV]?'
@@ -160,7 +161,7 @@ ignore:
160161
sha: []
161162
mode: ContinuousDelivery
162163
label: '{BranchName}'
163-
increment: Inherit
164+
increment: Patch
164165
prevent-increment-of-merged-branch-version: false
165166
track-merge-target: false
166167
track-merge-message: true
@@ -173,6 +174,12 @@ is-mainline: false
173174
174175
The details of the available options are as follows:
175176
177+
### remote-name-in-git
178+
179+
The user can define the name of the remote (in moste cases it's `origin`) which
180+
will be considered when generating a semantic version on a remote branch. If the
181+
actual remote name doesn't match this pattern an error will be thrown.
182+
176183
### next-version
177184

178185
Allows you to bump the next version explicitly. Useful for bumping `main` or a

src/GitVersion.Core.Tests/Configuration/ConfigurationProviderTests.CanWriteOutEffectiveConfiguration.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
remote-name-in-git: origin
12
assembly-versioning-scheme: MajorMinorPatch
23
assembly-file-versioning-scheme: MajorMinorPatch
34
label-prefix: '[vV]?'

src/GitVersion.Core.Tests/Helpers/TestEffectiveConfiguration.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ namespace GitVersion.Core.Tests.Helpers;
77
public class TestEffectiveConfiguration : EffectiveConfiguration
88
{
99
public TestEffectiveConfiguration(
10+
string remoteNameInGit = GitVersionConfiguration.DefaultRemoteNameInGit,
1011
AssemblyVersioningScheme assemblyVersioningScheme = AssemblyVersioningScheme.MajorMinorPatch,
1112
AssemblyFileVersioningScheme assemblyFileVersioningScheme = AssemblyFileVersioningScheme.MajorMinorPatch,
1213
string? assemblyVersioningFormat = null,
@@ -31,7 +32,8 @@ public TestEffectiveConfiguration(
3132
bool isMainline = false,
3233
string commitDateFormat = "yyyy-MM-dd",
3334
bool updateBuildNumber = false) :
34-
base(assemblyVersioningScheme,
35+
base(remoteNameInGit,
36+
assemblyVersioningScheme,
3537
assemblyFileVersioningScheme,
3638
assemblyInformationalFormat,
3739
assemblyVersioningFormat,

src/GitVersion.Core.Tests/IntegrationTests/VersionInCurrentBranchNameScenarios.cs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,26 @@ public void TakesVersionFromNameOfBranchThatIsReleaseByConfig()
3838
fixture.AssertFullSemver("2.0.0+1", configuration);
3939
}
4040

41-
[Test]
42-
public void TakesVersionFromNameOfRemoteReleaseBranchInOrigin()
41+
[TestCase("origin")]
42+
[TestCase("upstream")]
43+
public void TakesVersionFromNameOfRemoteReleaseBranchInOrigin(string remoteNameInGit)
4344
{
45+
var configuration = GitFlowConfigurationBuilder.New
46+
.WithRemoteNameInGit(remoteNameInGit)
47+
.Build();
48+
4449
using var fixture = new RemoteRepositoryFixture();
50+
if (remoteNameInGit != "origin")
51+
{
52+
fixture.LocalRepositoryFixture.Repository.Network.Remotes.Rename("origin", remoteNameInGit);
53+
}
4554
fixture.BranchTo("release/2.0.0");
4655
fixture.MakeACommit();
4756
Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty<string>(), new FetchOptions(), null);
4857

49-
fixture.LocalRepositoryFixture.Checkout("origin/release/2.0.0");
58+
fixture.LocalRepositoryFixture.Checkout($"{remoteNameInGit}/release/2.0.0");
5059

51-
fixture.LocalRepositoryFixture.AssertFullSemver("2.0.0-beta.1+1");
60+
fixture.LocalRepositoryFixture.AssertFullSemver("2.0.0-beta.1+1", configuration);
5261
}
5362

5463
[Test]
@@ -61,7 +70,8 @@ public void DoesNotTakeVersionFromNameOfRemoteReleaseBranchInCustomRemote()
6170
Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, Array.Empty<string>(), new FetchOptions(), null);
6271

6372
fixture.LocalRepositoryFixture.Checkout("upstream/release/2.0.0");
73+
Action action = () => fixture.LocalRepositoryFixture.GetVersion();
6474

65-
fixture.LocalRepositoryFixture.AssertFullSemver("0.0.0-beta.1+6"); // This test fails with 2.0.0-beta.1+1
75+
action.ShouldThrow<InvalidOperationException>();
6676
}
6777
}

src/GitVersion.Core/Configuration/ConfigurationBuilderBase.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace GitVersion.Configuration;
66
internal abstract class ConfigurationBuilderBase<TConfigurationBuilder>
77
where TConfigurationBuilder : ConfigurationBuilderBase<TConfigurationBuilder>
88
{
9+
private string? remoteNameInGit;
910
private AssemblyVersioningScheme? assemblyVersioningScheme;
1011
private AssemblyFileVersioningScheme? assemblyFileVersioningScheme;
1112
private string? assemblyInformationalFormat;
@@ -97,6 +98,13 @@ protected ConfigurationBuilderBase()
9798
}
9899
}
99100

101+
public virtual TConfigurationBuilder WithRemoteNameInGit(string? value)
102+
{
103+
this.remoteNameInGit = value;
104+
return (TConfigurationBuilder)this;
105+
}
106+
107+
100108
public virtual TConfigurationBuilder WithAssemblyVersioningScheme(AssemblyVersioningScheme? value)
101109
{
102110
this.assemblyVersioningScheme = value;
@@ -324,6 +332,7 @@ public virtual TConfigurationBuilder WithPreReleaseWeight(int? value)
324332

325333
public virtual TConfigurationBuilder WithConfiguration(GitVersionConfiguration value)
326334
{
335+
WithRemoteNameInGit(value.RemoteNameInGit);
327336
WithAssemblyVersioningScheme(value.AssemblyVersioningScheme);
328337
WithAssemblyFileVersioningScheme(value.AssemblyFileVersioningScheme);
329338
WithAssemblyInformationalFormat(value.AssemblyInformationalFormat);
@@ -376,6 +385,7 @@ public virtual GitVersionConfiguration Build()
376385
{
377386
GitVersionConfiguration configuration = new()
378387
{
388+
RemoteNameInGit = this.remoteNameInGit,
379389
AssemblyVersioningScheme = this.assemblyVersioningScheme,
380390
AssemblyFileVersioningScheme = this.assemblyFileVersioningScheme,
381391
AssemblyInformationalFormat = this.assemblyInformationalFormat,

src/GitVersion.Core/Configuration/EffectiveConfiguration.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public EffectiveConfiguration(GitVersionConfiguration configuration, BranchConfi
3737
if (!configuration.LabelPreReleaseWeight.HasValue)
3838
throw new Exception("Configuration value for 'LabelPreReleaseWeight' has no value. (this should not happen, please report an issue)");
3939

40+
RemoteNameInGit = configuration.RemoteNameInGit;
4041
AssemblyVersioningScheme = configuration.AssemblyVersioningScheme.Value;
4142
AssemblyFileVersioningScheme = configuration.AssemblyFileVersioningScheme.Value;
4243
AssemblyInformationalFormat = configuration.AssemblyInformationalFormat;
@@ -68,7 +69,8 @@ public EffectiveConfiguration(GitVersionConfiguration configuration, BranchConfi
6869
LabelPreReleaseWeight = configuration.LabelPreReleaseWeight.Value;
6970
}
7071

71-
protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningScheme,
72+
protected EffectiveConfiguration(string remoteNameInGit,
73+
AssemblyVersioningScheme assemblyVersioningScheme,
7274
AssemblyFileVersioningScheme assemblyFileVersioningScheme,
7375
string? assemblyInformationalFormat,
7476
string? assemblyVersioningFormat,
@@ -97,6 +99,7 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche
9799
int preReleaseWeight,
98100
int labelPreReleaseWeight)
99101
{
102+
RemoteNameInGit = remoteNameInGit;
100103
AssemblyVersioningScheme = assemblyVersioningScheme;
101104
AssemblyFileVersioningScheme = assemblyFileVersioningScheme;
102105
AssemblyInformationalFormat = assemblyInformationalFormat;
@@ -127,6 +130,7 @@ protected EffectiveConfiguration(AssemblyVersioningScheme assemblyVersioningSche
127130
LabelPreReleaseWeight = labelPreReleaseWeight;
128131
}
129132

133+
public string? RemoteNameInGit { get; }
130134
public bool TracksReleaseBranches { get; }
131135
public bool IsReleaseBranch { get; }
132136
public bool IsMainline { get; }

src/GitVersion.Core/Configuration/GitFlowConfigurationBuilder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ private GitFlowConfigurationBuilder()
1111
{
1212
WithConfiguration(new()
1313
{
14+
RemoteNameInGit = GitVersionConfiguration.DefaultRemoteNameInGit,
1415
AssemblyFileVersioningScheme = AssemblyFileVersioningScheme.MajorMinorPatch,
1516
AssemblyVersioningScheme = AssemblyVersioningScheme.MajorMinorPatch,
1617
CommitDateFormat = "yyyy-MM-dd",

src/GitVersion.Core/Configuration/GitHubFlowConfigurationBuilder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ private GitHubFlowConfigurationBuilder()
1111
{
1212
WithConfiguration(new()
1313
{
14+
RemoteNameInGit = GitVersionConfiguration.DefaultRemoteNameInGit,
1415
AssemblyFileVersioningScheme = AssemblyFileVersioningScheme.MajorMinorPatch,
1516
AssemblyVersioningScheme = AssemblyVersioningScheme.MajorMinorPatch,
1617
CommitDateFormat = "yyyy-MM-dd",

src/GitVersion.Core/Configuration/GitVersionConfiguration.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
using System.Globalization;
2-
using GitVersion.Attributes;
3-
using GitVersion.Extensions;
4-
51
namespace GitVersion.Configuration;
62

73
public class GitVersionConfiguration : BranchConfiguration

src/GitVersion.Core/Core/GitVersionContextFactory.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
using GitVersion.Common;
2-
using GitVersion.Configuration;
3-
using GitVersion.Extensions;
4-
using Microsoft.Extensions.Options;
5-
61
namespace GitVersion;
72

83
public class GitVersionContextFactory : IGitVersionContextFactory
@@ -31,6 +26,17 @@ public GitVersionContext Create(GitVersionOptions gitVersionOptions)
3126
currentBranch = branchForCommit ?? currentBranch;
3227
}
3328

29+
if (currentBranch.IsRemote)
30+
{
31+
var remoteNameInGit = configuration.RemoteNameInGit;
32+
if (string.IsNullOrEmpty(remoteNameInGit) || !currentBranch.Name.Friendly.StartsWith(remoteNameInGit))
33+
{
34+
throw new InvalidOperationException(
35+
$"The remote branch name '{currentBranch.Name.Friendly}' is not valid. Please use another branch or change the configuration."
36+
);
37+
}
38+
}
39+
3440
var currentCommitTaggedVersion = this.repositoryStore.GetCurrentCommitTaggedVersion(currentCommit, configuration.LabelPrefix, configuration.SemanticVersionFormat, handleDetachedBranch: currentBranch.IsDetachedHead);
3541
var numberOfUncommittedChanges = this.repositoryStore.GetNumberOfUncommittedChanges();
3642

0 commit comments

Comments
 (0)