refactor: finish moving ssh-* scripts to own installers
[webi-installers/.git] / _webi / releases.js
1 'use strict';
2
3 var fs = require('fs');
4 var path = require('path');
5 var request = require('@root/request');
6 var _normalize = require('../_webi/normalize.js');
7
8 var reInstallTpl = /\s*#?\s*{{ installer }}/;
9
10 var Releases = module.exports;
11 Releases.get = async function (pkgdir) {
12   var get;
13   try {
14     get = require(path.join(pkgdir, 'releases.js'));
15   } catch (e) {
16     throw new Error('no releases.js for', pkgdir.split(/[\/\\]+/).pop());
17   }
18   return get(request).then(function (all) {
19     return _normalize(all);
20   });
21 };
22
23 function padScript(txt) {
24   return txt.replace(/^/g, '        ');
25 }
26
27 Releases.renderBash = function (
28   pkgdir,
29   rel,
30   { baseurl, pkg, tag, ver, os, arch, formats }
31 ) {
32   if (!Array.isArray(formats)) {
33     formats = [];
34   }
35   if (!tag) {
36     tag = '';
37   }
38   return fs.promises
39     .readFile(path.join(pkgdir, 'install.sh'), 'utf8')
40     .then(function (installTxt) {
41       installTxt = padScript(installTxt);
42       var vers = rel.version.split('.');
43       var v = {
44         major: vers.shift() || '',
45         minor: vers.shift() || '',
46         patch: vers.join('.').replace(/[+\-].*/, ''),
47         build: vers
48           .join('.')
49           .replace(/[^+\-]*/, '')
50           .replace(/^-/, '')
51       };
52       var pkgFile = rel.filename || rel.name;
53       return fs.promises
54         .readFile(path.join(__dirname, 'template.sh'), 'utf8')
55         .then(function (tplTxt) {
56           return (
57             tplTxt
58               .replace(
59                 /^\s*#?WEBI_PKG=.*/m,
60                 "WEBI_PKG='" + pkg + '@' + ver + "'"
61               )
62               .replace(/^\s*#?WEBI_HOST=.*/m, "WEBI_HOST='" + baseurl + "'")
63               .replace(/^\s*#?WEBI_OS=.*/m, "WEBI_OS='" + (os || '') + "'")
64               .replace(
65                 /^\s*#?WEBI_ARCH=.*/m,
66                 "WEBI_ARCH='" + (arch || '') + "'"
67               )
68               .replace(/^\s*#?WEBI_TAG=.*/m, "WEBI_TAG='" + tag + "'")
69               .replace(
70                 /^\s*#?WEBI_RELEASES=.*/m,
71                 "WEBI_RELEASES='" +
72                   baseurl +
73                   '/api/releases/' +
74                   pkg +
75                   '@' +
76                   tag +
77                   '.tab?os=' +
78                   rel.os +
79                   '&arch=' +
80                   rel.arch +
81                   '&formats=' +
82                   formats.join(',') +
83                   '&pretty=true' +
84                   "'"
85               )
86               .replace(
87                 /^\s*#?WEBI_CSV=.*/m,
88                 "WEBI_CSV='" +
89                   [
90                     rel.version,
91                     rel.lts,
92                     rel.channel,
93                     rel.date,
94                     rel.os,
95                     rel.arch,
96                     rel.ext,
97                     '-',
98                     rel.download,
99                     rel.name,
100                     rel.comment || ''
101                   ]
102                     .join(',')
103                     .replace(/'/g, '') +
104                   "'"
105               )
106               .replace(
107                 /^\s*#?WEBI_VERSION=.*/m,
108                 'WEBI_VERSION=' + JSON.stringify(rel.version)
109               )
110               .replace(/^\s*#?WEBI_MAJOR=.*/m, 'WEBI_MAJOR=' + v.major)
111               .replace(/^\s*#?WEBI_MINOR=.*/m, 'WEBI_MINOR=' + v.minor)
112               .replace(/^\s*#?WEBI_PATCH=.*/m, 'WEBI_PATCH=' + v.patch)
113               .replace(/^\s*#?WEBI_BUILD=.*/m, 'WEBI_BUILD=' + v.build)
114               .replace(/^\s*#?WEBI_LTS=.*/m, 'WEBI_LTS=' + rel.lts)
115               .replace(/^\s*#?WEBI_CHANNEL=.*/m, 'WEBI_CHANNEL=' + rel.channel)
116               .replace(
117                 /^\s*#?WEBI_EXT=.*/m,
118                 'WEBI_EXT=' + rel.ext.replace(/tar.*/, 'tar')
119               )
120               .replace(
121                 /^\s*#?WEBI_FORMATS=.*/m,
122                 "WEBI_FORMATS='" + formats.join(',') + "'"
123               )
124               .replace(
125                 /^\s*#?WEBI_PKG_URL=.*/m,
126                 "WEBI_PKG_URL='" + rel.download + "'"
127               )
128               .replace(
129                 /^\s*#?WEBI_PKG_FILE=.*/m,
130                 "WEBI_PKG_FILE='" + pkgFile + "'"
131               )
132               // PKG details
133               .replace(/^\s*#?PKG_NAME=.*/m, "PKG_NAME='" + pkg + "'")
134               .replace(
135                 /^\s*#?PKG_OSES=.*/m,
136                 "PKG_OSES='" + ((rel && rel.oses) || []).join(',') + "'"
137               )
138               .replace(
139                 /^\s*#?PKG_ARCHES=.*/m,
140                 "PKG_ARCHES='" + ((rel && rel.arches) || []).join(',') + "'"
141               )
142               .replace(
143                 /^\s*#?PKG_FORMATS=.*/m,
144                 "PKG_FORMATS='" + ((rel && rel.formats) || []).join(',') + "'"
145               )
146               .replace(reInstallTpl, '\n' + installTxt)
147           );
148         });
149     });
150 };
151
152 Releases.renderBatch = function (
153   pkgdir,
154   rel,
155   { baseurl, pkg, tag, ver, os, arch, formats }
156 ) {
157   if (!Array.isArray(formats)) {
158     formats = [];
159   }
160   if (!tag) {
161     tag = '';
162   }
163   return fs.promises
164     .readFile(path.join(pkgdir, 'install.bat'), 'utf8')
165     .then(function (installTxt) {
166       installTxt = padScript(installTxt);
167       /*
168       var vers = rel.version.split('.');
169       var v = {
170         major: vers.shift() || '',
171         minor: vers.shift() || '',
172         patch: vers.join('.').replace(/[+\-].*$/, ''),
173         build: vers
174           .join('.')
175           .replace(/[^+\-]*()/, '')
176           .replace(/^-/, '')
177       };
178       */
179       return fs.promises
180         .readFile(path.join(__dirname, 'template.bat'), 'utf8')
181         .then(function (tplTxt) {
182           return tplTxt
183             .replace(
184               /^(REM )?WEBI_PKG=.*/im,
185               "WEBI_PKG='" + pkg + '@' + ver + "'"
186             )
187             .replace(reInstallTpl, '\n' + installTxt);
188         });
189     });
190 };
191
192 Releases.renderPowerShell = function (
193   pkgdir,
194   rel,
195   { baseurl, pkg, tag, ver, os, arch, formats }
196 ) {
197   if (!Array.isArray(formats)) {
198     formats = [];
199   }
200   if (!tag) {
201     tag = '';
202   }
203   return fs.promises
204     .readFile(path.join(pkgdir, 'install.ps1'), 'utf8')
205     .then(function (installTxt) {
206       installTxt = padScript(installTxt);
207       /*
208       var vers = rel.version.split('.');
209       var v = {
210         major: vers.shift() || '',
211         minor: vers.shift() || '',
212         patch: vers.join('.').replace(/[+\-].*$/, ''),
213         build: vers
214           .join('.')
215           .replace(/[^+\-]*()/, '')
216           .replace(/^-/, '')
217       };
218       */
219       return fs.promises
220         .readFile(path.join(__dirname, 'template.ps1'), 'utf8')
221         .then(function (tplTxt) {
222           var pkgver = pkg + '@' + ver;
223           return tplTxt
224             .replace(
225               /^(#)?\$Env:WEBI_HOST\s*=.*/im,
226               "$Env:WEBI_HOST = '" + baseurl + "'"
227             )
228             .replace(
229               /^(#)?\$Env:WEBI_PKG\s*=.*/im,
230               "$Env:WEBI_PKG = '" + pkgver + "'"
231             )
232             .replace(
233               /^(#)?\$Env:PKG_NAME\s*=.*/im,
234               "$Env:PKG_NAME = '" + pkg + "'"
235             )
236             .replace(
237               /^(#)?\$Env:WEBI_VERSION\s*=.*/im,
238               "$Env:WEBI_VERSION = '" + rel.version + "'"
239             )
240             .replace(
241               /^(#)?\$Env:WEBI_PKG_URL\s*=.*/im,
242               "$Env:WEBI_PKG_URL = '" + rel.download + "'"
243             )
244             .replace(
245               /^(#)?\$Env:WEBI_PKG_FILE\s*=.*/im,
246               "$Env:WEBI_PKG_FILE = '" + rel.name + "'"
247             )
248             .replace(reInstallTpl, '\n' + installTxt);
249         });
250     });
251 };