'use strict'; let ltsRe = /GnuPG-(2\.2\.[\d\.]+)/; function createRssMatcher() { return new RegExp( '(https://sourceforge\\.net/projects/gpgosx/files/GnuPG-([\\d\\.]+)\\.dmg/download)', 'g' ); } function createUrlMatcher() { return new RegExp( 'https://sourceforge\\.net/projects/gpgosx/files/(GnuPG-([\\d\\.]+)\\.dmg)/download', '' ); } async function getRawReleases(request) { let matcher = createRssMatcher(); let resp = await request({ url: 'https://sourceforge.net/projects/gpgosx/rss?path=/' }); let links = []; for (;;) { let m = matcher.exec(resp.body); if (!m) { break; } links.push(m[1]); } return links; } function transformReleases(links) { //console.log(JSON.stringify(links, null, 2)); //console.log(links.length); let matcher = createUrlMatcher(); let releases = links .map(function (link) { // strip 'go' prefix, standardize version let isLts = ltsRe.test(link); let parts = link.match(matcher); if (!parts || !parts[2]) { return null; } let segs = parts[2].split('.'); let version = segs.slice(0, 3).join('.'); if (segs.length > 3) { version += '+' + segs.slice(3); } return { name: parts[1], version: version, // all go versions >= 1.0.0 are effectively LTS lts: isLts, channel: 'stable', // TODO Sat, 19 Nov 2016 16:17:33 UT date: '1970-01-01', // the world may never know os: 'macos', arch: 'amd64', ext: 'dmg', download: link }; }) .filter(Boolean); return { releases: releases }; } async function getAllReleases(request) { let releases = await getRawReleases(request); let all = transformReleases(releases); return all; } module.exports = getAllReleases; if (module === require.main) { getAllReleases(require('@root/request')).then(function (all) { all = require('../_webi/normalize.js')(all); all.releases = all.releases.slice(0, 10000); console.info(JSON.stringify(all, null, 2)); }); }