refactor: finish moving ssh-* scripts to own installers
[webi-installers/.git] / gpg / releases.js
1 'use strict';
2
3 let ltsRe = /GnuPG-(2\.2\.[\d\.]+)/;
4
5 function createRssMatcher() {
6   return new RegExp(
7     '<link>(https://sourceforge\\.net/projects/gpgosx/files/GnuPG-([\\d\\.]+)\\.dmg/download)</link>',
8     'g'
9   );
10 }
11
12 function createUrlMatcher() {
13   return new RegExp(
14     'https://sourceforge\\.net/projects/gpgosx/files/(GnuPG-([\\d\\.]+)\\.dmg)/download',
15     ''
16   );
17 }
18
19 async function getRawReleases(request) {
20   let matcher = createRssMatcher();
21
22   let resp = await request({
23     url: 'https://sourceforge.net/projects/gpgosx/rss?path=/'
24   });
25   let links = [];
26   for (;;) {
27     let m = matcher.exec(resp.body);
28     if (!m) {
29       break;
30     }
31     links.push(m[1]);
32   }
33   return links;
34 }
35
36 function transformReleases(links) {
37   //console.log(JSON.stringify(links, null, 2));
38   //console.log(links.length);
39
40   let matcher = createUrlMatcher();
41
42   let releases = links
43     .map(function (link) {
44       // strip 'go' prefix, standardize version
45       let isLts = ltsRe.test(link);
46       let parts = link.match(matcher);
47       if (!parts || !parts[2]) {
48         return null;
49       }
50       let segs = parts[2].split('.');
51       let version = segs.slice(0, 3).join('.');
52       if (segs.length > 3) {
53         version += '+' + segs.slice(3);
54       }
55
56       return {
57         name: parts[1],
58         version: version,
59         // all go versions >= 1.0.0 are effectively LTS
60         lts: isLts,
61         channel: 'stable',
62         // TODO <pubDate>Sat, 19 Nov 2016 16:17:33 UT</pubDate>
63         date: '1970-01-01', // the world may never know
64         os: 'macos',
65         arch: 'amd64',
66         ext: 'dmg',
67         download: link
68       };
69     })
70     .filter(Boolean);
71
72   return {
73     releases: releases
74   };
75 }
76
77 async function getAllReleases(request) {
78   let releases = await getRawReleases(request);
79   let all = transformReleases(releases);
80   return all;
81 }
82
83 module.exports = getAllReleases;
84
85 if (module === require.main) {
86   getAllReleases(require('@root/request')).then(function (all) {
87     all = require('../_webi/normalize.js')(all);
88     all.releases = all.releases.slice(0, 10000);
89     console.info(JSON.stringify(all, null, 2));
90   });
91 }