44 using System . Linq ;
55 using System . Text . RegularExpressions ;
66 using BaseVersionCalculators ;
7+ using GitTools ;
78 using LibGit2Sharp ;
89
910 public class NextVersionCalculator
@@ -49,12 +50,7 @@ public SemanticVersion FindVersion(GitVersionContext context)
4950 }
5051 else
5152 {
52- var increment = IncrementStrategyFinder . DetermineIncrementedField ( context , baseVersion ) ;
53- if ( increment != null )
54- {
55- semver = semver . IncrementVersion ( increment . Value ) ;
56- }
57- else Logger . WriteInfo ( "Skipping version increment" ) ;
53+ semver = PerformIncrement ( context , baseVersion , semver ) ;
5854 }
5955
6056 if ( ! semver . PreReleaseTag . HasTag ( ) && ! string . IsNullOrEmpty ( context . Configuration . Tag ) )
@@ -73,42 +69,68 @@ public SemanticVersion FindVersion(GitVersionContext context)
7369 return taggedSemanticVersion ?? semver ;
7470 }
7571
72+ private static SemanticVersion PerformIncrement ( GitVersionContext context , BaseVersion baseVersion , SemanticVersion semver )
73+ {
74+ var increment = IncrementStrategyFinder . DetermineIncrementedField ( context , baseVersion ) ;
75+ if ( increment != null )
76+ {
77+ semver = semver . IncrementVersion ( increment . Value ) ;
78+ }
79+ else Logger . WriteInfo ( "Skipping version increment" ) ;
80+ return semver ;
81+ }
82+
7683 private SemanticVersion FindMainlineModeVersion ( BaseVersion baseVersion , GitVersionContext context )
7784 {
7885 if ( baseVersion . SemanticVersion . PreReleaseTag . HasTag ( ) )
7986 {
8087 throw new NotSupportedException ( "Mainline development mode doesn't yet support pre-release tags on master" ) ;
8188 }
82- Logger . WriteInfo ( "Using mainline development mode to calculate current version" ) ;
83- var commitLog = context . Repository . Commits . QueryBy ( new CommitFilter
89+
90+ using ( Logger . IndentLog ( "Using mainline development mode to calculate current version" ) )
8491 {
85- IncludeReachableFrom = context . CurrentBranch ,
86- ExcludeReachableFrom = baseVersion . BaseVersionSource ,
87- SortBy = CommitSortStrategies . Reverse
88- } ) . ToList ( ) ;
89- var mergeCommits = commitLog
90- . Where ( l => l . Parents . Count ( ) > 1 )
91- . ToList ( ) ;
92- return mergeCommits
93- . Select ( mc =>
92+ var commitLog = context . Repository . Commits . QueryBy ( new CommitFilter
9493 {
95- var mergedHead = GetMergedHead ( mc ) ;
96- var findMergeBase = context . Repository . ObjectDatabase . FindMergeBase ( mc . Parents . First ( ) , mergedHead ) ;
97- var filter = new CommitFilter
98- {
99- IncludeReachableFrom = mergedHead ,
100- ExcludeReachableFrom = findMergeBase
101- } ;
102- var mergedCommits = context . Repository . Commits . QueryBy ( filter ) . ToList ( ) ;
103- return new
94+ IncludeReachableFrom = context . CurrentBranch ,
95+ ExcludeReachableFrom = baseVersion . BaseVersionSource ,
96+ SortBy = CommitSortStrategies . Reverse
97+ } ) . ToList ( ) ;
98+ var mergeCommits = commitLog
99+ . Where ( l => l . Parents . Count ( ) > 1 )
100+ . ToList ( ) ;
101+
102+ Logger . WriteInfo ( string . Format ( "Found {0} merge commits to evaluate increments for.." , mergeCommits . Count ) ) ;
103+
104+ var mainlineVersion = mergeCommits
105+ . Select ( mc =>
104106 {
105- MergeCommit = mc ,
106- MergeHead = mergedHead ,
107- MergeBase = findMergeBase ,
108- Increment = IncrementStrategyFinder . GetIncrementForCommits ( context , mergedCommits )
109- } ;
110- } )
111- . Aggregate ( baseVersion . SemanticVersion , ( v , i ) => v . IncrementVersion ( i . Increment ?? VersionField . Patch ) ) ;
107+ var mergedHead = GetMergedHead ( mc ) ;
108+ var findMergeBase = context . Repository . ObjectDatabase . FindMergeBase ( mc . Parents . First ( ) , mergedHead ) ;
109+ return FindMessageIncrement ( context , mergedHead , findMergeBase ) ;
110+ } )
111+ . Aggregate ( baseVersion . SemanticVersion , ( v , i ) => v . IncrementVersion ( i ) ) ;
112+
113+ if ( context . CurrentBranch . FriendlyName != "master" )
114+ {
115+ var mergedHead = context . CurrentCommit ;
116+ var findMergeBase = context . Repository . FindBranch ( "master" ) . Tip ;
117+ var branchIncrement = FindMessageIncrement ( context , mergedHead , findMergeBase ) ;
118+ Logger . WriteInfo ( string . Format ( "Performing {0} increment for current branch " , branchIncrement ) ) ;
119+ mainlineVersion = mainlineVersion . IncrementVersion ( branchIncrement ) ;
120+ }
121+ return mainlineVersion ;
122+ }
123+ }
124+
125+ private static VersionField FindMessageIncrement ( GitVersionContext context , Commit mergedHead , Commit findMergeBase )
126+ {
127+ var filter = new CommitFilter
128+ {
129+ IncludeReachableFrom = mergedHead ,
130+ ExcludeReachableFrom = findMergeBase
131+ } ;
132+ var commits = context . Repository . Commits . QueryBy ( filter ) . ToList ( ) ;
133+ return IncrementStrategyFinder . GetIncrementForCommits ( context , commits ) ?? VersionField . Patch ;
112134 }
113135
114136 private Commit GetMergedHead ( Commit mergeCommit )
0 commit comments