'use strict'; let Fetcher = require('../_common/fetcher.js'); 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', '', ); } /** * @typedef BuildInfo * @prop {String} version * @prop {String} [_version] * @prop {String} arch * @prop {String} channel * @prop {String} date * @prop {String} download * @prop {String} ext * @prop {String} [_filename] * @prop {String} hash * @prop {Boolean} lts * @prop {String} os */ async function getRawReleases() { let resp; try { let url = 'https://sourceforge.net/projects/gpgosx/rss?path=/'; resp = await Fetcher.fetch(url, { headers: { Accept: 'application/rss+xml' }, }); } catch (e) { /** @type {Error & { code: string, response: { status: number, body: string } }} */ //@ts-expect-error let err = e; if (err.code === 'E_FETCH_RELEASES') { err.message = `failed to fetch 'gpg' release data: ${err.response.status} ${err.response.body}`; } throw e; } let contentType = resp.headers.get('Content-Type'); if (!contentType?.includes('xml')) { throw new Error(`Unexpected content type: ${contentType}`); } let matcher = createRssMatcher(); let links = []; for (;;) { let m = matcher.exec(resp.body); if (!m) { break; } links.push(m[1]); } return links; } /** * @param {Array} links */ function transformReleases(links) { //console.log(JSON.stringify(links, null, 2)); //console.log(links.length); let matcher = createUrlMatcher(); let builds = []; for (let link of links) { let isLts = ltsRe.test(link); let parts = link.match(matcher); if (!parts || !parts[2]) { continue; } let segs = parts[2].split('.'); let version = segs.slice(0, 3).join('.'); if (segs.length > 3) { version += '+' + segs.slice(3); } let fileversion = segs.join('.'); let build = { name: parts[1], version: version, _version: fileversion, 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, }; builds.push(build); } return { _names: ['GnuPG', 'gpgosx'], releases: builds, }; } async function getDistributables() { let releases = await getRawReleases(); let all = transformReleases(releases); return all; } module.exports = getDistributables; if (module === require.main) { getDistributables().then(function (all) { all = require('../_webi/normalize.js')(all); all.releases = all.releases.slice(0, 10000); console.info(JSON.stringify(all, null, 2)); }); }