Introduce additional changelog section filtering developing/refactoring noise for the users (#2766)

This commit is contained in:
Artur Bosch
2020-06-05 09:16:03 +02:00
committed by GitHub
parent 92acdbcfc9
commit b54570dfd1

112
scripts/github-milestone-report.groovy Normal file → Executable file
View File

@@ -1,43 +1,95 @@
@groovy.lang.Grab('org.kohsuke:github-api:1.111')
#!/usr/bin/env groovy
import groovy.cli.commons.CliBuilder
@groovy.lang.Grab('org.kohsuke:github-api:1.112')
import org.kohsuke.github.*
final class Report {
// arguments parsing
static def entry(content, issueId, issueUrl) {
"- $content - [#$issueId]($issueUrl)"
}
static def footer(footer, url) {
"See all issues at: [$footer]($url)"
}
def cli = new CliBuilder().tap {
user(type: String, "Github user or organization. Default: detekt")
project(type: String, "Github project. Default: detekt")
milestone(type: int, "Milestone number. Default: latest milestone.")
h(longOpt: 'help', "Prints this usage.")
}
if (args.size() > 3) throw new IllegalArgumentException("Usage: [userId] [repositoryId] [milestoneId]")
def options = cli.parse(args)
def user = args.size() > 0 ? args[0] : "detekt"
def repo = args.size() > 1 ? args[1] : "detekt"
if (options.h) {
cli.usage()
System.exit(0)
}
// formatting helpers
static def entry(issue) {
entry(issue.title.trim(), issue.number, issue.getHtmlUrl())
}
static def entry(content, issueId, issueUrl) {
"- $content - [#$issueId]($issueUrl)"
}
static def formatIssues(issues) {
issues.collect { entry(it) }.join("\n") + "\n"
}
static def footer(footer, url) {
"See all issues at: [$footer]($url)"
}
static def header(name) {
"#### $name\n"
}
static def section(name) {
"##### $name\n"
}
// connect to GitHub
def user = options.user ?: "detekt"
def project = options.project ?: "detekt"
def github = GitHub.connectAnonymously()
def repository = github.getUser(user).getRepository(repo)
def repository = github.getUser(user).getRepository(project)
def milestones = repository
.listMilestones(GHIssueState.OPEN)
.sort { it.number }
def milestoneId = options.milestone ?: milestones.last().number
def milestones = repository.listMilestones(GHIssueState.OPEN)
def sortedMilestones = milestones.sort { it.number }
def mId = args.size() > 2 ? args[2].toInteger() : sortedMilestones.last().number
def milestone = repository.getMilestone(mId)
// get milestone and issue data
def milestone = repository.getMilestone(milestoneId)
def issues = repository.getIssues(GHIssueState.ALL, milestone)
def header = milestone.title.trim()
def issuesString = issues.collect { (Report.entry(it.title.trim(), it.number, it.getHtmlUrl())) }.join("\n") + "\n"
def footer = Report.footer(header, milestone.getHtmlUrl())
def milestoneTitle = milestone.title.trim()
def groups = issues.groupBy { it.labels.find { it.name == "housekeeping" } == null }
def (issuesForUsers, issuesForDevs) = [true, false].collect { groups[it] }
println("#### $header\n")
println("##### Notable Changes\n\n")
println("##### Migration\n\n")
println("##### Changelog\n")
println(issuesString)
println(footer)
// print report
println()
def tempFile = File.createTempFile(repo, "_$milestone.title")
tempFile.write("${("#### ${header}" + "\n")}\n$issuesString\n$footer")
println("Content saved to $tempFile.path")
def content = new StringBuilder().tap {
append(header(milestoneTitle))
append("\n")
append(section("Notable Changes"))
append("\n")
append(section("Migration"))
append("\n")
append(section("Changelog"))
append("\n")
append(formatIssues(issuesForUsers))
append("\n")
append(section("Housekeeping & Refactorings"))
append("\n")
append(formatIssues(issuesForDevs))
append("\n")
append(footer(milestoneTitle, milestone.getHtmlUrl()))
}.toString()
println(content)
// write report to disk
def tempFile = File.createTempFile(project, "_$milestone.title")
tempFile.write(content)
println("\nContent saved to $tempFile.path")