This repository has been archived by the owner on Jul 10, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreleases.js
84 lines (66 loc) · 2.31 KB
/
releases.js
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
// Code adapted from my Search Deflector project's updating code.
// https://github.com/spikespaz/search-deflector/blob/master/source/updater.d
const RELEASES_URL = "https://api.github.com/repos/{{author}}/{{repository}}/releases";
function downloadLatestRelease(author, repository, filename) {
getLatestRelease(author, repository).then((release) => {
for (asset of release["assets"])
if (asset["name"] == filename) {
window.open(asset["browser_download_url"], "_self");
return;
}
}).catch(window.alert);
}
function getLatestRelease(author, repository) {
return new Promise((resolve, reject) => {
getSortedReleases(author, repository).then((releases) => {
resolve(releases[0]);
}).catch(reject);
});
}
function getSortedReleases(author, repository) {
return new Promise((resolve, reject) => {
const response = getJson(
RELEASES_URL.replace("{{author}}", author).replace("{{repository}}", repository));
response.then((apiJson) => {
apiJson.sort((first, second) => !compareVersions(first["tag_name"], second["tag_name"]));
resolve(apiJson);
});
response.catch(reject);
});
}
// Get and parse JSON for the specified URL, and return a promise.
function getJson(url) {
return new Promise((resolve, reject) => {
let request = new XMLHttpRequest();
request.open("GET", url, true);
request.responseType = "json";
request.onload = () => {
if (request.status == 200)
resolve(request.response);
else
reject(request.status, request.response);
};
request.send();
});
}
function compareVersions(firstVer, secondVer) {
let first = firstVer.split(".");
let second = secondVer.split(".");
while (first.length > second.length) {
if (first[0] != 0)
return true;
first.shift();
}
while (second.length > first.length) {
if (second[0] != 0)
return false;
second.shift();
}
for (parts of first.map((item, index) => [item, second[index]])) {
if (parts[0] > parts[1])
return true;
else if (parts[1] > parts[0])
return false;
}
return false;
}