-
Notifications
You must be signed in to change notification settings - Fork 1
/
release.groovy
executable file
·114 lines (98 loc) · 3.36 KB
/
release.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
#!/usr/bin/env groovy
@Grab(group = 'com.github.zafarkhaja', module = 'java-semver', version = '0.9.0')
import com.github.zafarkhaja.semver.Version
def executeOnShell(String command, Closure closure = null) {
executeOnShell(command, new File(System.properties.'user.dir'), closure)
}
def executeOnShell(String command, File workingDir, Closure closure = null) {
println command
def processBuilder = new ProcessBuilder(['sh', '-c', command])
.directory(workingDir)
if (closure) {
processBuilder.redirectErrorStream(true)
} else {
processBuilder.inheritIO()
}
def process = processBuilder.start()
if (closure) {
process.inputStream.eachLine closure
}
process.waitFor()
if (process.exitValue() > 0) {
System.exit(process.exitValue())
}
}
void ask(String prompt, String defaultValue = 'Y', Closure cl) {
def promptValue = System.console().readLine(prompt + ' ').trim()
if (promptValue.empty) {
promptValue = defaultValue
}
if (promptValue.toUpperCase() == 'Y') {
cl.call()
}
}
executeOnShell 'git pull'
ask('Execute Build?: [Y]') {
executeOnShell 'cargo clean'
executeOnShell 'cargo build'
executeOnShell 'cargo doc'
executeOnShell 'cargo test'
}
def projectProps = new File('Cargo.toml').text
def versionMatch = projectProps =~ /(?m)version\s*=\s*"(.*)"/
def version = versionMatch[0][1]
def prevTag = 'git describe --abbrev=0 --tags --match=v*'.execute().text.trim()
def changelog = []
executeOnShell("git log --pretty='* %h - %s (%an, %ad)' ${prevTag}..HEAD .".toString()) {
println it
changelog << it
}
def releaseDesc = System.console().readLine('Describe this release: [Bugfix Release]').trim()
if (releaseDesc.empty) {
releaseDesc = 'Bugfix Release'
}
def releaseVer = System.console().readLine("What is the version for this release?: [$version]").trim()
if (releaseVer.empty) {
releaseVer = version
}
ask('Update Changelog?: [Y]') {
def changeLogFile = new File('CHANGELOG.md')
def changeLogFileLines = changeLogFile.readLines()
changeLogFile.withPrintWriter() { p ->
p.println(changeLogFileLines[0])
p.println()
p.println("# $releaseVer - $releaseDesc")
p.println()
changelog.each {
p.println(it)
}
changeLogFileLines[1..-1].each {
p.println(it)
}
}
executeOnShell("git add CHANGELOG.md")
executeOnShell("git commit -m 'update changelog for release $releaseVer'")
executeOnShell("git status")
executeOnShell("git diff HEAD^..HEAD")
}
ask('Tag and Push commits?: [Y]') {
executeOnShell 'git push'
executeOnShell("git tag v${releaseVer}")
executeOnShell 'git push --tags'
}
ask('Publish library to crates.io?: [Y]') {
executeOnShell 'cargo package'
executeOnShell 'cargo publish'
}
def nextVer = Version.valueOf(releaseVer).incrementPatchVersion()
ask("Bump version to $nextVer?: [Y]") {
executeOnShell "sed -i -e 's/version = \"${releaseVer}\"/version = \"${nextVer}\"/' Cargo.toml"
executeOnShell "sed -i -e 's/documentation = \"https:\\/\\/docs\\.rs\\/webmachine-rust\\/${releaseVer}\\/webmachine-rust\\/\"/documentation = \"https:\\/\\/docs\\.rs\\/webmachine-rust\\/${nextVer}\\/webmachine-rust\\/\"/' Cargo.toml"
executeOnShell("cargo update")
executeOnShell("git add Cargo.toml")
executeOnShell("git diff --cached")
ask("Commit and push this change?: [Y]") {
executeOnShell("git commit -m 'bump version to $nextVer'")
executeOnShell("git push")
}
}