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