angular-docs-cn/aio/tools/transforms/angular-base-package/services/getPreviousMajorVersions.js

55 lines
1.8 KiB
JavaScript

'use strict';
const child = require('child_process');
const semver = require('semver');
const versionMatcher = /refs\/tags\/(\d+.+)$/mg;
/**
* Get a collection of all the previous "last major" versions sorted by semantic version.
*
* @param packageInfo injected from dgeni-packages/git
* @param versionInfo injected from dgeni-packages/git
* @returns an array of SemVer objects
*/
module.exports = function getPreviousMajorVersions(packageInfo, versionInfo) {
return () => {
// always use the remote tags as the local clone might not contain all commits when cloned with
// `git clone --depth=...`
const repoUrl = packageInfo.repository.url;
const tagResults = child.spawnSync('git', ['ls-remote', '--tags', repoUrl], {encoding: 'utf8'});
if (tagResults.status !== 0) {
return [];
}
const majorVersions = {};
tagResults.stdout.replace(versionMatcher, (_, tag) => {
const version = semver.parse(tag);
// Not interested in tags that do not match semver format.
if (version === null) {
return;
}
// Not interested in pre-release versions.
if (version.prerelease !== null && version.prerelease.length > 0) {
return;
}
// Only interested in versions that are earlier than the current major.
if (version.major >= versionInfo.currentVersion.major) {
return;
}
const currentMajor = majorVersions[version.major];
if (currentMajor === undefined || semver.compare(version, currentMajor) === 1) {
// This version is newer than the currently captured version for this major.
majorVersions[version.major] = version;
}
});
// Sort them in descending order
return semver.sort(Object.values(majorVersions)).reverse();
};
};