-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
123 lines (105 loc) · 3.58 KB
/
index.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
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
import axios from 'axios';
import fs from 'fs';
import crypto from 'crypto';
import mustache from 'mustache';
import { execSync } from 'child_process';
async function main() {
const response = await axios.get(
'https://api.github.com/repos/mycelial/cli/releases/latest',
);
const version = response.data.tag_name.replace('v', '');
if (is_same_version(version)) {
console.log(`Version ${version} is already released`);
return;
}
const macos_arm = response.data.assets.find(
(asset) => asset.name === `mycelial-aarch64-apple-darwin.tgz`,
);
const macos_arm_url = macos_arm.browser_download_url;
const macos_arm_sha256 = await get_sha_256(macos_arm_url);
const macos_intel = response.data.assets.find(
(asset) => asset.name === `mycelial-x86_64-apple-darwin.tgz`,
);
const macos_intel_url = macos_intel.browser_download_url;
const macos_intel_sha256 = await get_sha_256(macos_intel_url);
const linux_arm64 = response.data.assets.find(
(asset) => asset.name === `mycelial-aarch64-unknown-linux-gnu.tgz`,
);
const linux_arm64_url = linux_arm64.browser_download_url;
const linux_arm64_sha256 = await get_sha_256(linux_arm64_url);
const linux_arm32 = response.data.assets.find(
(asset) => asset.name === `mycelial-arm-unknown-linux-gnueabihf.tgz`,
);
const linux_arm32_url = linux_arm32.browser_download_url;
const linux_arm32_sha256 = await get_sha_256(linux_arm32_url);
const linux_intel = response.data.assets.find(
(asset) => asset.name === `mycelial-x86_64-unknown-linux-gnu.tgz`,
);
const linux_intel_url = linux_intel.browser_download_url;
const linux_intel_sha256 = await get_sha_256(linux_intel_url);
const template = fs.readFileSync('./mycelial.rb.mustache', 'utf8');
const view = {
version,
macos_arm_url,
macos_arm_sha256,
macos_intel_url,
macos_intel_sha256,
linux_arm64_url,
linux_arm64_sha256,
linux_arm32_url,
linux_arm32_sha256,
linux_intel_url,
linux_intel_sha256,
};
const output = mustache.render(template, view);
fs.writeFileSync('./mycelial.rb', output);
execSync(
'git config user.email "github-actions[bot]@users.noreply.github.com"',
);
execSync('git config user.name "github-actions[bot]"');
execSync('git add ./mycelial.rb');
execSync(`git commit -m "Update to ${version}"`);
execSync('git push');
}
function is_same_version(version) {
const contents = fs.readFileSync('./mycelial.rb', 'utf8');
const version_regex = /version\s*\s*['"]([^'"]+)['"]/;
const match = contents.match(version_regex);
return match[1] === version;
}
async function get_sha_256(file_url) {
await download(file_url, `./mycelial.tgz`);
const sha256 = await calculate_sha_256(`./mycelial.tgz`);
fs.unlinkSync(`./mycelial.tgz`);
return sha256;
}
async function download(file_url, output_location_path) {
const writer = fs.createWriteStream(output_location_path);
const response = await axios({
url: file_url,
method: 'GET',
responseType: 'stream',
});
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
});
}
function calculate_sha_256(filePath) {
return new Promise((resolve, reject) => {
const hash = crypto.createHash('sha256');
const stream = fs.createReadStream(filePath);
stream.on('data', function (chunk) {
hash.update(chunk);
});
stream.on('end', function () {
const fileHash = hash.digest('hex');
resolve(fileHash);
});
stream.on('error', function (err) {
reject(err);
});
});
}
main().catch(console.error);