forked from jfrog/build-info
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVersion.groovy
131 lines (116 loc) · 4.18 KB
/
Version.groovy
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
/*
*
* Copyright (C) 2011 JFrog Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package org.jfrog.build
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import java.text.DateFormat
import java.text.SimpleDateFormat
class Version {
String versionNumber
Date buildTime
Boolean release = null
int indexOfSnapshot
def Version(Project project) {
this(project, null)
}
def Version(Project project, List<String> subProjects) {
def versionPrefix = project.name.contains("gradle") ? "build-info-extractor-gradle" : "build-info"
this.versionNumber = project.getProperty("${versionPrefix}-version")
this.release = true
if (versionNumber.endsWith('SNAPSHOT')) {
this.release = false
this.indexOfSnapshot = this.versionNumber.indexOf('SNAPSHOT')
}
File timestampFile = new File(project.buildDir, 'timestamp.txt')
if (timestampFile.isFile()) {
boolean uptodate = true
def modified = timestampFile.lastModified()
if (subProjects != null) {
// Check timestamp by list of subprojects
subProjects.each { spName ->
project.project(spName).fileTree('src/main').visit {fte ->
if (fte.file.isFile() && fte.lastModified > modified) {
uptodate = false
fte.stopVisiting()
}
}
}
} else {
project.fileTree('src/main').visit {fte ->
if (fte.file.isFile() && fte.lastModified > modified) {
uptodate = false
fte.stopVisiting()
}
}
}
if (!uptodate) {
timestampFile.setLastModified(new Date().time)
}
} else {
timestampFile.parentFile.mkdirs()
timestampFile.createNewFile()
}
buildTime = new Date(timestampFile.lastModified())
if (!release) {
this.versionNumber = this.versionNumber.substring(0, indexOfSnapshot - 1)
this.versionNumber += "-" + "SNAPSHOT"
}
}
String toString() {
versionNumber
}
String getTimestamp() {
// Convert local file timestamp to UTC
def format = new SimpleDateFormat('yyyyMMddHHmmss')
format.setCalendar(Calendar.getInstance(TimeZone.getTimeZone('UTC')));
return format.format(buildTime)
}
String getStatus() {
return release ? "release" : "integration"
}
boolean isRelease() {
if (release == null) {
throw new GradleException("Can't determine whether this is a release build before the task graph is populated")
}
return release
}
}
class WriteVersionProperties extends DefaultTask {
@Input
String getVersion() { return project.version.toString() }
@Input
Date getBuildTime() { return project.version.buildTime }
@OutputFile
File propertiesFile
@TaskAction
def void generate() {
logger.info('Write version properties to: {}', propertiesFile)
Properties versionProperties = new Properties()
versionProperties.putAll([
'version': version,
'buildTime': DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(buildTime)
])
propertiesFile.withOutputStream {
versionProperties.store(it, '')
}
}
}