55 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			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(); | ||
|  |   }; | ||
|  | }; |