-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgit.version.gradle
135 lines (113 loc) · 6.1 KB
/
git.version.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
// 基于 git 当前分支提交信息与当前分支 tag 信息分析得到 version code 与 version name
// @version 1.1
//
// versionCode = [ext.]createGitVersionCode()
// versionName = [ext.]createGitVersionName()
//
// @see https://raw.githubusercontent.com/idonans/Example/master/git.version.gradle
//////////////////////////////////////////////////////////////
def createGitVersionCode() {
// 基于当前分支 commit 总数生成 version code
def cmd = 'git rev-list HEAD --count'
def cmdResult = cmd.execute().text.trim().toInteger()
// 允许设置一个版本号偏移量用来修正最终的版本号.
def versionCodeOffset = 0
def gitVersionCode = versionCodeOffset
if (cmdResult) {
gitVersionCode += cmdResult
}
println("gitVersionCode: " + gitVersionCode)
return gitVersionCode
}
def createGitVersionName() {
// 根据当前分支最近的 tag 计算 version name
// 结果形如 latestTagName-offsetCommitCount-gLatestCommitId 例如: parent-0.1-83-gbb12abc, 0.1-83-gbb12abc
// 如果当前的 tag 就标记在最近一次的提交上, 则结果直接是 latestTagName 例如: parent-0.1, 0.1
def cmdTagCommit = 'git describe --tags'
def cmdTagCommitResult = cmdTagCommit.execute().text.trim()
if (!cmdTagCommitResult) {
println("gitVersionName: invalid cmdTagCommitResult, default to 0.0.0")
return '0.0.0'
}
def cmdLatestTag = 'git describe --tags --abbrev=0'
def cmdLatestTagResult = cmdLatestTag.execute().text.trim()
if (!cmdLatestTagResult) {
println("gitVersionName: invalid cmdLatestTagResult, default to 0.0.0")
return '0.0.0'
}
def tagCommitDesc = cmdTagCommitResult
def latestTagName = cmdLatestTagResult
def offsetCommitCount = 0
def pattern = /-(\d+)-g(?!.*-g)/
def matcher = tagCommitDesc =~ pattern
if (latestTagName == tagCommitDesc) {
println("latestTagName equals to tagCommitDesc, latest tag is add to latest commit, use latest tag direct.")
} else if (matcher) {
latestTagName = tagCommitDesc.substring(0, matcher.start())
offsetCommitCount = matcher[0][1]
}
if (latestTagName != cmdLatestTagResult) {
println("latestTagName not equals to cmdLatestTagResult, default to 0.0.0")
return '0.0.0'
}
// 分析 latestTagName 语义
def versionNamePrefix
def versionNameSuffix
def versionName
println("latestTagName: " + latestTagName + ", offsetCommitCount: " + offsetCommitCount)
// TagName prefix suffix
// 0.1 0.1 .offsetCommitCount (1)
// parent-0.1 0.1 .offsetCommitCount (2)
// parent(dev)-0.1 0.1 .offsetCommitCount (2.1)
// parent-0.1-alpha 0.1-alpha offsetCommitCount (3)
// parent(dev2)-0.1-alpha 0.1-alpha offsetCommitCount (3.1)
// parent-0.1-beta 0.1-beta offsetCommitCount (4)
// parent(d3)-0.1-beta 0.1-beta offsetCommitCount (4.1)
// parent-0.1-release 0.1 .offsetCommitCount (5)
// parent(xxx)-0.1-release 0.1 .offsetCommitCount (5.1)
// parent-0.1-SNAPSHOT 0.1-SNAPSHOT (6)
// parent(xx)-0.1-SNAPSHOT 0.1-SNAPSHOT (6.1)
// other other .offsetCommitCount (7)
// 匹配 (1) (2) (2.1) (5) (5.1)
def parentReleasePattern = /^(?:parent(?:\([^\(\)]+\))?-)?((?:\d+\.)*\d+)(?:-release)?$/
def parentReleasePatternMatcher = latestTagName =~ parentReleasePattern
if (parentReleasePatternMatcher) {
versionNamePrefix = parentReleasePatternMatcher[0][1]
versionNameSuffix = "." + offsetCommitCount
versionName = versionNamePrefix + versionNameSuffix
println("gitVersionName: parentReleasePatternMatcher is true, prefix: " + versionNamePrefix + ", suffix: " + versionNameSuffix + " -> " + versionName)
return versionName
}
// 匹配 (3) (3.1) (4) (4.1)
def parentAlphaBetaPattern = /^(?:parent(?:\([^\(\)]+\))?-)?((?:\d+\.)*\d+(?:-alpha)?(?:-beta)?)$/
def parentAlphaBetaPatternMatcher = latestTagName =~ parentAlphaBetaPattern
if (parentAlphaBetaPatternMatcher) {
versionNamePrefix = parentAlphaBetaPatternMatcher[0][1]
versionNameSuffix = offsetCommitCount
versionName = versionNamePrefix + versionNameSuffix
println("gitVersionName: parentAlphaBetaPatternMatcher is true, prefix: " + versionNamePrefix + ", suffix: " + versionNameSuffix + " -> " + versionName)
return versionName
}
// 匹配 (6) (6.1)
def parentSnapshotPattern = /^(?:parent(?:\([^\(\)]+\))?-)?((?:\d+\.)*\d+(?:-SNAPSHOT)?)$/
def parentSnapshotPatternMatcher = latestTagName =~ parentSnapshotPattern
if (parentSnapshotPatternMatcher) {
versionNamePrefix = parentSnapshotPatternMatcher[0][1]
versionNameSuffix = ""
versionName = versionNamePrefix + versionNameSuffix
println("gitVersionName: parentSnapshotPatternMatcher is true, prefix: " + versionNamePrefix + ", suffix: " + versionNameSuffix + " -> " + versionName)
return versionName
}
// 其它情况 (7)
versionNamePrefix = latestTagName
versionNameSuffix = "." + offsetCommitCount
versionName = versionNamePrefix + versionNameSuffix
println("gitVersionName: default, prefix: " + versionNamePrefix + ", suffix: " + versionNameSuffix + " -> " + versionName)
return versionName
}
ext.createGitVersionCode = this.&createGitVersionCode
ext.createGitVersionName = this.&createGitVersionName