-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathplugin-tasks.gradle
156 lines (134 loc) · 4.92 KB
/
plugin-tasks.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
* Copyright 2020 ThoughtWorks, Inc.
*
* 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.
*/
import groovy.xml.MarkupBuilder
import java.text.DecimalFormat
static String gitRevision() {
def process = "git log -n 1 --format=%H".execute()
process.waitFor()
return process.text.stripIndent().trim()
}
static String distVersion() {
def process = "git rev-list HEAD".execute()
process.waitFor()
return process.text.stripIndent().trim().split("\n").size()
}
static def getLastTag(boolean isExperimental) {
try {
def command = ["git", "describe", "--tags", "--abbrev=0"]
if (!isExperimental) {
command.add(command.size() - 1, '--match=*[^-exp]')
}
def process = command.join(" ").execute()
process.waitFor()
def result = process.text
return result.trim()
} catch (Exception e) {
return null
}
}
String getCommitsSinceLastTag(String from) {
def hashStdOut = new ByteArrayOutputStream()
def hashErrorOutput = new ByteArrayOutputStream()
def commandToExecute = ["git", "log", "--no-merges", "--pretty=\"%h - %s\""]
if (from) {
commandToExecute.add("${from}..HEAD")
}
try {
project.exec {
commandLine commandToExecute
standardOutput = hashStdOut
errorOutput = hashErrorOutput
}
} catch (Exception e) {
throw new GradleScriptException(hashErrorOutput.toString(), e)
}
return hashStdOut.toString().trim()
}
static String readableFileSize(long size) {
if (size <= 0) return "0"
final String[] units = ["B", "KB", "MB", "GB", "TB"]
int digitGroups = (int) (Math.log10(size) / Math.log10(1024))
return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups]
}
project.ext.git = {
gitRevision = this.&gitRevision
distVersion = this.&distVersion
getLastTag = this.&getLastTag
getCommitsSinceLastTag = this.&getCommitsSinceLastTag
readableFileSize = this.&readableFileSize
}
task previewGithubRelease() {
doLast {
def prerelease = !"No".equalsIgnoreCase(System.getenv('PRERELEASE'))
def lastTag = project.git.getLastTag(prerelease)
def targetCommitish = project.git.gitRevision()
def assets = distZip.outputs.files.files + distTar.outputs.files.files
def fullVersion = project.git.distVersion() ? "${project.version}-${project.git.distVersion()}" : project.version
def tagName = "${fullVersion}${prerelease ? '-exp' : ''}"
def releaseName = "${prerelease ? 'Experimental: ' : ''}${fullVersion}"
def changelogHeader = lastTag ? "### Changelog ${lastTag}..${targetCommitish.substring(0, 7)}" : "### Changelog"
def changes = project.git.getCommitsSinceLastTag(lastTag).replaceAll("\"", "").stripIndent().trim()
def previewFile = file("${project.buildDir}/preview.html")
if (!previewFile.exists()) {
previewFile.createNewFile()
}
def html = new MarkupBuilder(new FileWriter(previewFile))
html.html {
body {
div {
h1(project.projectDesc.repo)
h3(releaseName)
div {
b("Tag: ")
span(tagName)
}
div {
b("Commit: ")
span(targetCommitish.substring(0, 7))
}
div {
h4("Assets")
assets.each { div(it.getName() + " - " + project.git.readableFileSize(it.length())) }
}
div {
h4(changelogHeader)
p {
changes.split("\n").each { div(it) }
}
}
}
}
}
}
}
previewGithubRelease.dependsOn assembleDist
githubRelease.dependsOn previewGithubRelease
github {
def lastCommit = project.git.gitRevision()
owner = System.getenv('GITHUB_USER') ?: 'bob'
repo = project.projectDesc.repo
token = System.getenv('GITHUB_TOKEN') ?: 'bad-token'
targetCommitish = lastCommit
assets = distZip.outputs.files.files + distTar.outputs.files.files
prerelease = !"No".equalsIgnoreCase(System.getenv('PRERELEASE'))
def fullVersion = project.git.distVersion() ? "${project.version}-${project.git.distVersion()}" : project.version
tagName = "${fullVersion}${prerelease ? '-exp' : ''}"
name = "${prerelease ? 'Experimental: ' : ''}${fullVersion}"
def lastTag = project.git.getLastTag(prerelease)
def changelogHeader = lastTag ? "### Changelog ${lastTag}..${lastCommit.substring(0, 7)}" : "### Changelog"
def changeLog = project.git.getCommitsSinceLastTag(lastTag).replaceAll("\"", "")
body = """\n$changelogHeader\n\n${changeLog}\n""".stripIndent().trim()
}