1+ use std, types, http, functional, json, regex
2+
3+ API_URL="https://api.github.com/repos/aNNiMON/Own-Programming-Language-Tutorial/releases"
4+ PATTERN_VERSION = Pattern.compile("v?(\\d+)\\.(\\d+)\\.(\\d+).*?")
5+ CURRENT_VERSION = [OwnLang.VERSION_MAJOR, OwnLang.VERSION_MINOR, OwnLang.VERSION_PATCH]
6+
7+ def populateVersion(r) {
8+ version = r.name ?? "0.0.0"
9+ r.versionParts = getVersionParts(version);
10+ return r
11+ }
12+
13+ def getVersionParts(version) {
14+ m = PATTERN_VERSION.matcher(version)
15+ if (m.matches()) {
16+ return [int(m.group(1)), int(m.group(2)), int(m.group(3))]
17+ } else {
18+ return [0, 0, 0]
19+ }
20+ }
21+
22+ def compareRelease(releaseVersion, currentVersion) {
23+ extract(rmajor, rminor, rpatch) = releaseVersion
24+ extract(cmajor, cminor, cpatch) = currentVersion
25+ if (rmajor > cmajor) return 1
26+ else if (rmajor < cmajor) return -1
27+ else if (rminor > cminor) return 1
28+ else if (rminor < cminor) return -1
29+ else if (rpatch > cminor) return 1
30+ else if (rpatch < cminor) return -1
31+ else return 0
32+ }
33+
34+ extract(status, data) = httpSync(API_URL)
35+ if (!status) {
36+ println "Unable to get releases metadata"
37+ exit(1)
38+ }
39+
40+ newerVersions = stream(jsondecode(data))
41+ .filter(def(r) = !r.draft && !r.prerelease)
42+ .sortBy(def(r) = r.published_at)
43+ .map(::populateVersion)
44+ .dropWhile(def(r) = compareRelease(r.versionParts, CURRENT_VERSION) <= 0)
45+ .toArray()
46+
47+ if (newerVersions.isEmpty()) {
48+ println "You're using the latest version: " + CURRENT_VERSION.joinToString(".")
49+ } else {
50+ newestVersion = newerVersions[newerVersions.length - 1]
51+ println "New version available: " + newestVersion.versionParts.joinToString(".")
52+ println "Current version: " + CURRENT_VERSION.joinToString(".")
53+ println newestVersion.html_url
54+ println "\nWhat's new:"
55+ println newestVersion.body
56+ }
57+ exit(0)
0 commit comments