Skip to content

Commit 902537b

Browse files
committed
merge commit fixes
1 parent e6de4c5 commit 902537b

11 files changed

+242
-111
lines changed

GitFlowVersion/BranchFinders/DevelopVersionFinder.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ SemanticVersion GetSemanticVersion()
3131
var versionOnMasterFinder = new VersionOnMasterFinder
3232
{
3333
Repository = Repository,
34+
OlderThan = Commit.When()
3435
};
35-
var versionFromMaster = versionOnMasterFinder.Execute(Commit.When());
36+
var versionFromMaster = versionOnMasterFinder.Execute();
3637
var version = versionFromMaster.Version;
3738
var developBranch = Repository.DevelopBranch();
3839
version.PreReleaseNumber = developBranch.Commits

GitFlowVersion/BranchFinders/FeatureVersionFinder.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ public VersionAndBranch FindVersion()
3535

3636
var versionOnMasterFinder = new VersionOnMasterFinder
3737
{
38-
Repository = Repository
38+
Repository = Repository,
39+
OlderThan = Commit.When()
3940
};
40-
var versionFromMaster = versionOnMasterFinder.Execute(Commit.When());
41+
var versionFromMaster = versionOnMasterFinder.Execute();
4142
var version = versionFromMaster.Version;
4243
version.Minor++;
4344
version.Patch = 0;

GitFlowVersion/BranchFinders/MasterVersionFinder.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ class MasterVersionFinder
1010

1111
public VersionAndBranch FindVersion()
1212
{
13-
var versionString = GetVersionString();
14-
15-
var version = SemanticVersion.FromMajorMinorPatch(versionString);
13+
var version = GetVersionString();
1614

1715
return new VersionAndBranch
1816
{
@@ -23,23 +21,23 @@ public VersionAndBranch FindVersion()
2321
};
2422
}
2523

26-
string GetVersionString()
24+
SemanticVersion GetVersionString()
2725
{
2826
//TODO: should we take the newest or the highest? perhaps it doesnt matter?
2927
var versionTag = Repository
3028
.SemVerTags(Commit);
3129

3230
if (versionTag != null)
3331
{
34-
return versionTag.Name;
32+
return versionTag;
3533
}
3634

37-
if (!Commit.Message.StartsWith("merge "))
35+
SemanticVersion version;
36+
if (MergeMessageParser.TryParse(Commit.Message, out version))
3837
{
39-
throw new Exception("The head of master should always be a merge commit if you follow gitflow. Please create one or work around this by tagging the commit with SemVer compatible Id.");
38+
return version;
4039
}
41-
42-
return MergeMessageParser.GetVersionFromMergeCommit(Commit.Message);
40+
throw new Exception("The head of master should always be a merge commit if you follow gitflow. Please create one or work around this by tagging the commit with SemVer compatible Id.");
4341
}
4442
}
4543
}

GitFlowVersion/BranchFinders/PullVersionFinder.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ public VersionAndBranch FindVersion()
1212
{
1313
var versionOnMasterFinder = new VersionOnMasterFinder
1414
{
15-
Repository = Repository
15+
Repository = Repository,
16+
OlderThan = Commit.When(),
1617
};
1718
var versionFromMaster = versionOnMasterFinder
18-
.Execute(Commit.When());
19+
.Execute();
1920

2021
var version = versionFromMaster.Version;
2122
version.Minor++;

GitFlowVersion/BranchFinders/ReleaseVersionFinder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public VersionAndBranch FindVersion()
3333

3434
if (overrideTag != null)
3535
{
36-
var overrideVersion = SemanticVersion.FromMajorMinorPatch(overrideTag.Name);
36+
var overrideVersion = overrideTag;
3737

3838
if (version.Major != overrideVersion.Major ||
3939
version.Minor != overrideVersion.Minor ||
Lines changed: 59 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
namespace GitFlowVersion
22
{
33
using System;
4+
using System.Collections.Generic;
45
using LibGit2Sharp;
56

67
class VersionOnMasterFinder
78
{
89
public IRepository Repository;
9-
10-
public VersionPoint Execute(DateTimeOffset olderThan)
10+
public DateTimeOffset OlderThan;
11+
public VersionPoint ExecuteOld()
1112
{
1213
var masterBranch = Repository
1314
.MasterBranch();
14-
foreach (var commit in masterBranch.CommitsPriorToThan(olderThan))
15+
foreach (var commit in masterBranch.CommitsPriorToThan(OlderThan))
1516
{
16-
var message = GetMergeOrTagMessage(commit);
17-
if (message != null)
17+
var versionFromCommit = GetMergeOrTagMessage(commit);
18+
if (versionFromCommit != null)
1819
{
19-
var versionFromMergeCommit = MergeMessageParser.GetVersionFromMergeCommit(message);
2020
return new VersionPoint
2121
{
22-
Version = SemanticVersion.FromMajorMinorPatch(versionFromMergeCommit),
22+
Version = versionFromCommit,
2323
Timestamp = commit.When()
2424
};
2525
}
@@ -37,50 +37,69 @@ public VersionPoint Execute(DateTimeOffset olderThan)
3737
}
3838

3939

40-
string GetMergeOrTagMessage(Commit commit)
40+
SemanticVersion GetMergeOrTagMessage(Commit commit)
4141
{
4242
var semVerTag = Repository.SemVerTags(commit);
4343
if (semVerTag != null)
4444
{
45-
return semVerTag.Name;
45+
return semVerTag;
4646
}
4747

48-
if (commit.Message.StartsWith("merge"))
48+
SemanticVersion version;
49+
if (MergeMessageParser.TryParse(commit.Message, out version))
4950
{
50-
return commit.Message;
51+
return version;
5152
}
5253

5354
return null;
5455
}
5556

56-
//public static VersionPoint MasterVersionPriorToNew(this IRepository repository, DateTimeOffset olderThan)
57-
//{
58-
// VersionPoint previous = null;
59-
// foreach (var current in repository.VersionsOnMaster(olderThan))
60-
// {
61-
// if (previous != null)
62-
// {
63-
// if (previous.Version.IsMinorLargerThan(previous.Version))
64-
// {
65-
// return previous;
66-
// }
67-
// }
68-
// previous = current;
69-
// }
70-
// if (previous != null)
71-
// {
72-
// return previous;
73-
// }
74-
// return new VersionPoint
75-
// {
76-
// Version = new SemanticVersion
77-
// {
78-
// Major = 0,
79-
// Minor = 1,
80-
// Patch = 0
81-
// },
82-
// Timestamp = DateTimeOffset.MinValue
83-
// };
84-
//}
57+
public VersionPoint Execute()
58+
{
59+
VersionPoint previous = null;
60+
foreach (var current in VersionsOnMaster())
61+
{
62+
if (previous != null)
63+
{
64+
if (previous.Version.IsMinorLargerThan(current.Version))
65+
{
66+
return previous;
67+
}
68+
}
69+
previous = current;
70+
}
71+
if (previous != null)
72+
{
73+
return previous;
74+
}
75+
return new VersionPoint
76+
{
77+
Version = new SemanticVersion
78+
{
79+
Major = 0,
80+
Minor = 1,
81+
Patch = 0
82+
},
83+
Timestamp = DateTimeOffset.MinValue
84+
};
85+
}
86+
87+
public IEnumerable<VersionPoint> VersionsOnMaster()
88+
{
89+
var masterBranch = Repository
90+
.MasterBranch();
91+
foreach (var commit in masterBranch.CommitsPriorToThan(OlderThan))
92+
{
93+
var versionFromMergeCommit = GetMergeOrTagMessage(commit);
94+
if (versionFromMergeCommit != null)
95+
{
96+
yield return new VersionPoint
97+
{
98+
Version = versionFromMergeCommit,
99+
Timestamp = commit.When()
100+
};
101+
}
102+
}
103+
}
85104
}
86105
}

GitFlowVersion/LibGitExtensions.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,20 @@ public static DateTimeOffset When(this Commit commit)
3232
return commit.Committer.When;
3333
}
3434

35-
public static Tag SemVerTags(this IRepository repository, Commit commit)
35+
public static SemanticVersion SemVerTags(this IRepository repository, Commit commit)
3636
{
3737
var semVerTags = repository.Tags.Where(tag => tag.Target == commit)
3838
.Where(tag => SemanticVersion.IsVersion(tag.Name)).ToList();
3939
if (semVerTags.Count > 1)
4040
{
4141
throw new Exception(string.Format("Error processing commit `{0}`. Only one version version tag per commit is allowed", commit.Sha));
4242
}
43-
return semVerTags.FirstOrDefault();
43+
var first = semVerTags.FirstOrDefault();
44+
if (first != null)
45+
{
46+
return SemanticVersion.FromMajorMinorPatch(first.Name);
47+
}
48+
return null;
4449
}
4550

4651
public static Reference ToReference(this Branch branch)
@@ -69,7 +74,7 @@ public static bool IsMinorLargerThan(this SemanticVersion version, SemanticVersi
6974
{
7075
return true;
7176
}
72-
if ((version.Major == o.Major) && (version.Major > o.Major))
77+
if ((version.Major == o.Major) && (version.Minor > o.Minor))
7378
{
7479
return true;
7580
}

GitFlowVersion/MergeMessageParser.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,34 @@ public static string GetVersionFromMergeCommit(string message)
1414
.ToArray();
1515
return new string(array);
1616
}
17+
public static bool TryParse(string message, out SemanticVersion semanticVersion)
18+
{
19+
string trimmed;
20+
if (message.StartsWith("Merge branch 'hotfix-"))
21+
{
22+
trimmed = message.Replace("Merge branch 'hotfix-", "");
23+
}
24+
else if (message.StartsWith("Merge branch 'release-"))
25+
{
26+
trimmed = message.Replace("Merge branch 'hotfix-", "");
27+
}
28+
else if (message.StartsWith("Merge branch '"))
29+
{
30+
trimmed = message.Replace("Merge branch '", "");
31+
}
32+
else
33+
{
34+
semanticVersion = null;
35+
return false;
36+
}
37+
var versionPart = GetVersionFromMergeCommit(trimmed);
38+
if (SemanticVersion.IsVersion(versionPart))
39+
{
40+
semanticVersion = SemanticVersion.FromMajorMinorPatch(versionPart);
41+
return true;
42+
}
43+
semanticVersion = null;
44+
return false;
45+
}
1746
}
1847
}

0 commit comments

Comments
 (0)