1
1
namespace GitVersion . VersionCalculation . BaseVersionCalculators
2
2
{
3
+ using System ;
3
4
using System . Linq ;
5
+ using LibGit2Sharp ;
4
6
5
7
public class MergeMessageBaseVersionStrategy : BaseVersionStrategy
6
8
{
@@ -12,8 +14,7 @@ public override BaseVersion GetVersion(GitVersionContext context)
12
14
. SelectMany ( c =>
13
15
{
14
16
SemanticVersion semanticVersion ;
15
- // TODO when this approach works, inline the other class into here
16
- if ( MergeMessageParser . TryParse ( c , context . Configuration , out semanticVersion ) )
17
+ if ( TryParse ( c , context . Configuration , out semanticVersion ) )
17
18
{
18
19
var shouldIncrement = ! context . Configuration . PreventIncrementForMergedBranchVersion ;
19
20
return new [ ]
@@ -27,5 +28,115 @@ public override BaseVersion GetVersion(GitVersionContext context)
27
28
28
29
return baseVersions . Length > 1 ? baseVersions . Aggregate ( ( x , y ) => x . SemanticVersion > y . SemanticVersion ? x : y ) : baseVersions . SingleOrDefault ( ) ;
29
30
}
31
+ public static bool TryParse ( Commit mergeCommit , EffectiveConfiguration configuration , out SemanticVersion semanticVersion )
32
+ {
33
+ string versionPart ;
34
+ if ( Inner ( mergeCommit , out versionPart ) )
35
+ {
36
+ return SemanticVersion . TryParse ( versionPart , configuration . GitTagPrefix , out semanticVersion ) ;
37
+ }
38
+ semanticVersion = null ;
39
+ return false ;
40
+ }
41
+
42
+ static bool Inner ( Commit mergeCommit , out string versionPart )
43
+ {
44
+ if ( mergeCommit . Parents . Count ( ) < 2 )
45
+ {
46
+ versionPart = null ;
47
+ return false ;
48
+ }
49
+
50
+ var message = mergeCommit . Message . TrimToFirstLine ( ) ;
51
+
52
+
53
+ if ( message . StartsWith ( "Merge branch 'hotfix-" ) )
54
+ {
55
+ var suffix = message . Replace ( "Merge branch 'hotfix-" , "" ) ;
56
+ return TryGetPrefix ( suffix , out versionPart , "'" ) ;
57
+ }
58
+
59
+ if ( message . StartsWith ( "Merge branch 'hotfix/" ) )
60
+ {
61
+ var suffix = message . Replace ( "Merge branch 'hotfix/" , "" ) ;
62
+ return TryGetPrefix ( suffix , out versionPart , "'" ) ;
63
+ }
64
+
65
+ if ( message . StartsWith ( "Merge branch 'release-" ) )
66
+ {
67
+ var suffix = message . Replace ( "Merge branch 'release-" , "" ) ;
68
+ return TryGetPrefix ( suffix , out versionPart , "'" ) ;
69
+ }
70
+
71
+ if ( message . StartsWith ( "Merge branch 'release/" ) )
72
+ {
73
+ var suffix = message . Replace ( "Merge branch 'release/" , "" ) ;
74
+ return TryGetPrefix ( suffix , out versionPart , "'" ) ;
75
+ }
76
+
77
+ if ( message . StartsWith ( "Merge branch '" ) )
78
+ {
79
+ var suffix = message . Replace ( "Merge branch '" , "" ) ;
80
+
81
+ if ( suffix . Contains ( "-" ) )
82
+ {
83
+ suffix = suffix . Split ( '-' ) [ 1 ] ;
84
+ }
85
+ return TryGetPrefix ( suffix , out versionPart , "'" ) ;
86
+ }
87
+
88
+ if ( message . StartsWith ( "Merge pull request #" ) )
89
+ {
90
+ var split = message . Split ( new [ ]
91
+ {
92
+ "/"
93
+ } , StringSplitOptions . RemoveEmptyEntries ) ;
94
+ if ( split . Length != 2 )
95
+ {
96
+ versionPart = null ;
97
+ return false ;
98
+ }
99
+ return TryGetSuffix ( split [ 1 ] , out versionPart , "-" ) ;
100
+ }
101
+
102
+ if ( message . StartsWith ( "Finish Release-" ) ) //Match Syntevo SmartGit client's GitFlow 'release' merge commit message formatting
103
+ {
104
+ versionPart = message . Replace ( "Finish Release-" , "" ) ;
105
+ return true ;
106
+ }
107
+
108
+ if ( message . StartsWith ( "Finish " ) ) //Match Syntevo SmartGit client's GitFlow 'hotfix' merge commit message formatting
109
+ {
110
+ versionPart = message . Replace ( "Finish " , "" ) ;
111
+ return true ;
112
+ }
113
+
114
+ versionPart = null ;
115
+ return false ;
116
+ }
117
+
118
+ static bool TryGetPrefix ( string target , out string result , string splitter )
119
+ {
120
+ var indexOf = target . IndexOf ( splitter ) ;
121
+ if ( indexOf == - 1 )
122
+ {
123
+ result = null ;
124
+ return false ;
125
+ }
126
+ result = target . Substring ( 0 , indexOf ) ;
127
+ return true ;
128
+ }
129
+
130
+ static bool TryGetSuffix ( string target , out string result , string splitter )
131
+ {
132
+ var indexOf = target . IndexOf ( splitter ) ;
133
+ if ( indexOf == - 1 )
134
+ {
135
+ result = null ;
136
+ return false ;
137
+ }
138
+ result = target . Substring ( indexOf + 1 , target . Length - indexOf - 1 ) ;
139
+ return true ;
140
+ }
30
141
}
31
142
}
0 commit comments