-
Notifications
You must be signed in to change notification settings - Fork 65
/
Copy pathinstall.js
93 lines (83 loc) · 2.34 KB
/
install.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
#!/usr/bin/env node
const fs = require("fs");
const tar = require("tar");
const zlib = require("zlib");
const http = require("http");
const https = require("https");
const packageJSON = require("./package.json");
// Determine the URL of the file.
const platformName = {
darwin: "darwin",
linux: "linux",
win32: "windows",
}[process.platform];
let archName = {
x64: "amd64",
x86: "amd64",
ia32: "amd64",
amd64: "amd64",
arm64: "arm64",
}[process.arch];
if (!platformName || !archName) {
console.error(
`Cannot install src for platform ${process.platform}, architecture ${process.arch}`
);
process.exit(1);
}
const version = packageJSON.version;
const assetURL = `https://github.com/sourcegraph/src-cli/releases/download/${version}/src-cli_${version}_${platformName}_${archName}.tar.gz`;
// Remove previously-downloaded files.
const executableName = process.platform === "win32" ? "src.exe" : "src";
if (fs.existsSync(executableName)) {
fs.unlinkSync(executableName);
}
// Download the compressed file.
console.log(`Downloading ${assetURL}`);
get(assetURL, (response) => {
if (response.statusCode > 299) {
console.error(
[
"Download failed",
"",
`url: ${assetURL}`,
`status: ${response.statusCode}`,
`headers: ${JSON.stringify(response.headers, null, 2)}`,
"",
].join("\n")
);
process.exit(1);
}
response
.pipe(zlib.createGunzip())
.pipe(tar.x({ filter: (x) => x === executableName }))
.addListener("close", () => {
if (process.platform !== 'win32') {
fs.chmodSync(executableName, "755");
}
});});
// Follow redirects.
function get(url, callback) {
const requestUrl = new URL(url);
let request = https;
let requestConfig = requestUrl;
const proxyEnv = process.env["HTTPS_PROXY"] || process.env["https_proxy"];
if (proxyEnv) {
const proxyUrl = new URL(proxyEnv);
request = proxyUrl.protocol === "https:" ? https : http;
requestConfig = {
hostname: proxyUrl.hostname,
port: proxyUrl.port,
path: requestUrl.toString(),
headers: {
Host: requestUrl.hostname,
},
};
}
request.get(requestConfig, (response) => {
if (response.statusCode === 301 || response.statusCode === 302) {
get(response.headers.location, callback);
} else {
callback(response);
}
});
}