@@ -12,7 +12,6 @@ protected SemanticVersion FindVersion(
12
12
BranchType branchType ,
13
13
string baseBranchName )
14
14
{
15
- var nbHotfixCommits = NumberOfCommitsInBranchNotKnownFromBaseBranch ( context . Repository , context . CurrentBranch , branchType , baseBranchName ) ;
16
15
17
16
var versionString = context . CurrentBranch . GetSuffix ( branchType ) ;
18
17
if ( ! versionString . Contains ( "." ) )
@@ -28,7 +27,12 @@ protected SemanticVersion FindVersion(
28
27
if ( branchType == BranchType . Unknown )
29
28
version . PreReleaseTag = context . CurrentBranch . Name . Replace ( "-" + versionString , string . Empty ) + ".1" ;
30
29
31
- var tagVersion = RetrieveMostRecentOptionalTagVersion ( context . Repository , version , context . CurrentBranch . Commits . Take ( nbHotfixCommits + 1 ) ) ;
30
+ var tagsApplicableToBranchVersion = context . Repository . SemVerTagsRelatedToVersion ( version ) . OrderByDescending ( tag => SemanticVersion . Parse ( tag . Name ) ) . ToList ( ) ;
31
+ var latestTaggedCommit = tagsApplicableToBranchVersion . Select ( tag => tag . Target ) . FirstOrDefault ( ) ;
32
+
33
+ var numberOfCommitsSinceLastTagOrBranchPoint = NumberOfCommitsSinceLastTagOrBranchPoint ( context , tagsApplicableToBranchVersion , branchType , baseBranchName ) ;
34
+
35
+ var tagVersion = RetrieveMostRecentOptionalTagVersion ( tagsApplicableToBranchVersion ) ;
32
36
33
37
var sha = context . CurrentCommit . Sha ;
34
38
var releaseDate = ReleaseDateFinder . Execute ( context . Repository , sha , version . Patch ) ;
@@ -39,63 +43,57 @@ protected SemanticVersion FindVersion(
39
43
Patch = version . Patch ,
40
44
PreReleaseTag = version . PreReleaseTag ,
41
45
BuildMetaData = new SemanticVersionBuildMetaData (
42
- nbHotfixCommits , context . CurrentBranch . Name , releaseDate )
46
+ numberOfCommitsSinceLastTagOrBranchPoint , context . CurrentBranch . Name , releaseDate )
43
47
} ;
44
48
45
49
if ( tagVersion != null )
46
50
{
47
- tagVersion . PreReleaseTag . Number ++ ;
51
+ if ( latestTaggedCommit != context . CurrentCommit )
52
+ {
53
+ tagVersion . PreReleaseTag . Number ++ ;
54
+ }
48
55
semanticVersion . PreReleaseTag = tagVersion . PreReleaseTag ;
49
56
}
50
57
51
58
return semanticVersion ;
59
+
52
60
}
53
61
54
- bool IsMostRecentCommitTagged ( GitVersionContext context , out SemanticVersion version )
62
+ SemanticVersion RetrieveMostRecentOptionalTagVersion ( IEnumerable < Tag > tagsApplicableToBranchVersion )
55
63
{
56
- var currentCommit = context . CurrentBranch . Commits . First ( ) ;
64
+ return tagsApplicableToBranchVersion . Select ( tag => SemanticVersion . Parse ( tag . Name ) ) . OrderByDescending ( version => version ) . FirstOrDefault ( ) ;
65
+ }
57
66
58
- var tags = context . Repository . Tags
59
- . Where ( tag => tag . PeeledTarget ( ) == currentCommit )
60
- . ToList ( ) ;
61
67
62
- foreach ( var tag in tags )
68
+ int NumberOfCommitsSinceLastTagOrBranchPoint ( GitVersionContext context , ICollection < Tag > tagsInDescVersionOrder , BranchType branchType , string baseBranchName )
69
+ {
70
+ if ( ! tagsInDescVersionOrder . Any ( ) )
63
71
{
64
- if ( SemanticVersion . TryParse ( tag . Name , out version ) )
65
- {
66
- return true ;
67
- }
72
+ return NumberOfCommitsInBranchNotKnownFromBaseBranch ( context . Repository , context . CurrentBranch , branchType , baseBranchName ) ;
68
73
}
69
-
70
- version = null ;
71
- return false ;
72
- }
73
-
74
- SemanticVersion RetrieveMostRecentOptionalTagVersion (
75
- IRepository repository , SemanticVersion branchVersion , IEnumerable < Commit > take )
76
- {
77
- foreach ( var commit in take )
74
+
75
+ var mostRecentTag = tagsInDescVersionOrder . First ( ) ;
76
+ var ancestor = mostRecentTag ;
77
+ if ( mostRecentTag . Target == context . CurrentCommit )
78
78
{
79
- foreach ( var tag in repository . TagsByDate ( commit ) )
79
+ var previousTag = tagsInDescVersionOrder . Skip ( 1 ) . FirstOrDefault ( ) ;
80
+ if ( previousTag != null )
80
81
{
81
- SemanticVersion version ;
82
- if ( ! SemanticVersion . TryParse ( tag . Name , out version ) )
83
- {
84
- continue ;
85
- }
86
-
87
- if ( branchVersion . Major != version . Major ||
88
- branchVersion . Minor != version . Minor ||
89
- branchVersion . Patch != version . Patch )
90
- {
91
- continue ;
92
- }
93
-
94
- return version ;
82
+ ancestor = previousTag ;
83
+ }
84
+ else
85
+ {
86
+ return NumberOfCommitsInBranchNotKnownFromBaseBranch ( context . Repository , context . CurrentBranch , branchType , baseBranchName ) ;
95
87
}
96
88
}
89
+ var filter = new CommitFilter
90
+ {
91
+ Since = context . CurrentCommit ,
92
+ Until = ancestor . Target ,
93
+ SortBy = CommitSortStrategies . Topological | CommitSortStrategies . Time
94
+ } ;
97
95
98
- return null ;
96
+ return context . Repository . Commits . QueryBy ( filter ) . Count ( ) - 1 ;
99
97
}
100
98
101
99
void EnsureVersionIsValid ( SemanticVersion version , Branch branch , BranchType branchType )
0 commit comments