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