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