1
1
namespace GitVersion
2
2
{
3
+ using System . Collections . Generic ;
3
4
using System . Linq ;
4
5
using LibGit2Sharp ;
5
6
@@ -11,26 +12,73 @@ public SemanticVersion FindVersion(GitVersionContext context)
11
12
var shortVersion = ShortVersionParser . Parse ( versionString ) ;
12
13
13
14
EnsureVersionIsValid ( shortVersion , context . CurrentBranch ) ;
14
- var semanticVersionPreReleaseTag = "beta.1" ;
15
-
16
- var nbHotfixCommits = BranchCommitDifferenceFinder . NumberOfCommitsInBranchNotKnownFromBaseBranch ( context . Repository , context . CurrentBranch , BranchType . Release , "develop" ) ;
15
+ SemanticVersionPreReleaseTag semanticVersionPreReleaseTag = "beta.1" ;
17
16
18
- var tagVersion = RecentTagVersionExtractor . RetrieveMostRecentOptionalTagVersion ( context . Repository , shortVersion , context . CurrentBranch . Commits . Take ( nbHotfixCommits + 1 ) ) ;
17
+ var tagsApplicableToBranchVersion = context . Repository . SemVerTagsRelatedToVersion ( shortVersion ) . OrderByDescending ( tag => SemanticVersion . Parse ( tag . Name ) ) . ToList ( ) ;
18
+ var latestTaggedCommit = tagsApplicableToBranchVersion . Select ( tag => tag . Target ) . FirstOrDefault ( ) ;
19
+
20
+ var numberOfCommitsSinceLastTagOrBranchPoint = NumberOfCommitsSinceLastTagOrBranchPoint ( context , tagsApplicableToBranchVersion , "develop" ) ;
21
+
22
+ var tagVersion = RetrieveMostRecentOptionalTagVersion ( tagsApplicableToBranchVersion ) ;
23
+
19
24
if ( tagVersion != null )
20
25
{
21
- semanticVersionPreReleaseTag = tagVersion ;
26
+ semanticVersionPreReleaseTag = tagVersion . PreReleaseTag ;
27
+ if ( latestTaggedCommit != context . CurrentCommit )
28
+ {
29
+ semanticVersionPreReleaseTag . Number ++ ;
30
+ }
22
31
}
32
+
23
33
return new SemanticVersion
24
34
{
25
35
Major = shortVersion . Major ,
26
36
Minor = shortVersion . Minor ,
27
37
Patch = shortVersion . Patch ,
28
38
PreReleaseTag = semanticVersionPreReleaseTag ,
29
- BuildMetaData = new SemanticVersionBuildMetaData ( nbHotfixCommits , context . CurrentBranch . Name , context . CurrentCommit . Sha , context . CurrentCommit . When ( ) )
39
+ BuildMetaData = new SemanticVersionBuildMetaData ( numberOfCommitsSinceLastTagOrBranchPoint , context . CurrentBranch . Name , context . CurrentCommit . Sha , context . CurrentCommit . When ( ) )
30
40
} ;
31
41
}
32
42
33
- void EnsureVersionIsValid ( ShortVersion version , Branch branch )
43
+ static SemanticVersion RetrieveMostRecentOptionalTagVersion ( List < Tag > tagsInDescendingOrder )
44
+ {
45
+ return tagsInDescendingOrder . Select ( tag => SemanticVersion . Parse ( tag . Name ) ) . FirstOrDefault ( ) ;
46
+ }
47
+
48
+ static int NumberOfCommitsSinceLastTagOrBranchPoint ( GitVersionContext context , List < Tag > tagsInDescendingOrder , string baseBranchName )
49
+ {
50
+ if ( ! tagsInDescendingOrder . Any ( ) )
51
+ {
52
+ return BranchCommitDifferenceFinder . NumberOfCommitsInBranchNotKnownFromBaseBranch ( context . Repository , context . CurrentBranch , BranchType . Release , baseBranchName ) ;
53
+ }
54
+
55
+ var mostRecentTag = tagsInDescendingOrder . First ( ) ;
56
+ var ancestor = mostRecentTag ;
57
+ if ( mostRecentTag . Target == context . CurrentCommit )
58
+ {
59
+ var previousTag = tagsInDescendingOrder . Skip ( 1 ) . FirstOrDefault ( ) ;
60
+ if ( previousTag != null )
61
+ {
62
+ ancestor = previousTag ;
63
+ }
64
+ else
65
+ {
66
+ return BranchCommitDifferenceFinder . NumberOfCommitsInBranchNotKnownFromBaseBranch ( context . Repository , context . CurrentBranch , BranchType . Release , baseBranchName ) ;
67
+ }
68
+
69
+ }
70
+
71
+ var filter = new CommitFilter
72
+ {
73
+ Since = context . CurrentCommit ,
74
+ Until = ancestor . Target ,
75
+ SortBy = CommitSortStrategies . Topological | CommitSortStrategies . Time
76
+ } ;
77
+
78
+ return context . Repository . Commits . QueryBy ( filter ) . Count ( ) - 1 ;
79
+ }
80
+
81
+ static void EnsureVersionIsValid ( ShortVersion version , Branch branch )
34
82
{
35
83
if ( version . Patch != 0 )
36
84
{
0 commit comments