Place current release at the top of version dropdown in Manage Packages dialog. (#12884)

* Also improved sorting for version numbers with non-numeric components.
This commit is contained in:
Cory Rivera
2020-10-12 12:20:33 -07:00
committed by GitHub
parent f61ffae15c
commit 108891ba2e
3 changed files with 37 additions and 9 deletions

View File

@@ -144,22 +144,31 @@ export function getOSPlatformId(): string {
* @returns 1 if the first version is greater, -1 if it's less, and 0 otherwise.
*/
export function comparePackageVersions(first: string, second: string): number {
let firstVersion = first.split('.').map(numStr => Number.parseInt(numStr));
let secondVersion = second.split('.').map(numStr => Number.parseInt(numStr));
let firstVersion = first.split('.');
let secondVersion = second.split('.');
// If versions have different lengths, then append zeroes to the shorter one
if (firstVersion.length > secondVersion.length) {
let diff = firstVersion.length - secondVersion.length;
secondVersion = secondVersion.concat(new Array(diff).fill(0));
secondVersion = secondVersion.concat(new Array(diff).fill('0'));
} else if (secondVersion.length > firstVersion.length) {
let diff = secondVersion.length - firstVersion.length;
firstVersion = firstVersion.concat(new Array(diff).fill(0));
firstVersion = firstVersion.concat(new Array(diff).fill('0'));
}
for (let i = 0; i < firstVersion.length; ++i) {
if (firstVersion[i] > secondVersion[i]) {
let firstVersionNum: string | number = Number(firstVersion[i]);
let secondVersionNum: string | number = Number(secondVersion[i]);
// Fallback to string comparison if either value isn't a number
if (isNaN(firstVersionNum) || isNaN(secondVersionNum)) {
firstVersionNum = firstVersion[i];
secondVersionNum = secondVersion[i];
}
if (firstVersionNum > secondVersionNum) {
return 1;
} else if (firstVersion[i] < secondVersion[i]) {
} else if (firstVersionNum < secondVersionNum) {
return -1;
}
}

View File

@@ -94,6 +94,14 @@ export class LocalPipPackageManageProvider implements IPackageManageProvider {
let versionNums: string[] = [];
let packageSummary = '';
if (packagesJson) {
let currentRelease: string;
if (packagesJson.info) {
if (packagesJson.info.summary) {
packageSummary = packagesJson.info.summary;
}
currentRelease = packagesJson.info.version?.toString();
}
if (packagesJson.releases) {
let versionKeys = Object.keys(packagesJson.releases);
versionKeys = versionKeys.filter(versionKey => {
@@ -101,10 +109,15 @@ export class LocalPipPackageManageProvider implements IPackageManageProvider {
return Array.isArray(releaseInfo) && releaseInfo.length > 0;
});
versionNums = utils.sortPackageVersions(versionKeys, false);
}
if (packagesJson.info && packagesJson.info.summary) {
packageSummary = packagesJson.info.summary;
// Place current stable release at the front of the list
if (currentRelease) {
let releaseIndex = versionNums.findIndex(value => value === currentRelease);
if (releaseIndex > 0) {
versionNums.splice(releaseIndex, 1);
versionNums.unshift(currentRelease);
}
}
}
}

View File

@@ -131,6 +131,12 @@ describe('Utils Tests', function () {
const randomSorted = ['0.1', '1.0.0', '1.0.1', '42', '100.0'];
should(utils.sortPackageVersions(random)).deepEqual(randomSorted);
});
it('versions with non-numeric components', () => {
const random = ['1.0.1h', '1.0.0', '42', '1.0.1b', '100.0', '0.1', '1.0.1'];
const randomSorted = ['0.1', '1.0.0', '1.0.1', '1.0.1b', '1.0.1h', '42', '100.0'];
should(utils.sortPackageVersions(random)).deepEqual(randomSorted);
});
});
describe('executeBufferedCommand', () => {