Consistent order from ProjectBuilder.apkSorter (#779)

This function used to give a different order depending on the behavior
of Array.prototype.sort(), which led to a test failure on Node.js 12
(see apache/cordova-android#767).

This update gives a consistent sort order, regardless of the
JavaScript engine implementation, now succeeds on Node.js
versions 6, 8, 10, and 12.

Resolves #767

For reference:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
This commit is contained in:
Chris Brody 2019-07-14 16:35:44 -04:00 committed by GitHub
parent 989b4cc913
commit acad24d62a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 15 deletions

View File

@ -301,21 +301,22 @@ class ProjectBuilder {
module.exports = ProjectBuilder;
function apkSorter (fileA, fileB) {
// De-prioritize arch specific builds
var archSpecificRE = /-x86|-arm/;
if (archSpecificRE.exec(fileA)) {
return 1;
} else if (archSpecificRE.exec(fileB)) {
return -1;
}
const archSpecificRE = /-x86|-arm/;
// De-prioritize unsigned builds
var unsignedRE = /-unsigned/;
if (unsignedRE.exec(fileA)) {
return 1;
} else if (unsignedRE.exec(fileB)) {
return -1;
}
const unsignedRE = /-unsigned/;
// De-prioritize arch-specific builds & unsigned builds
const lower = (fileName) => {
return archSpecificRE.exec(fileName)
? -2
: unsignedRE.exec(fileName)
? -1
: 0;
};
const lowerDiff = lower(fileB) - lower(fileA);
if (lowerDiff !== 0) return lowerDiff;
var timeDiff = fs.statSync(fileB).mtime - fs.statSync(fileA).mtime;
return timeDiff === 0 ? fileA.length - fileB.length : timeDiff;

View File

@ -248,7 +248,7 @@ describe('ProjectBuilder', () => {
};
const expectedResult = ['app-release.apk', 'app-debug.apk', 'app-release-unsigned.apk',
'app-release-arm.apk', 'app-debug-arm.apk', 'app-release-x86.apk', 'app-debug-x86.apk'];
'app-release-arm.apk', 'app-release-x86.apk', 'app-debug-x86.apk', 'app-debug-arm.apk'];
const fsSpy = jasmine.createSpyObj('fs', ['statSync']);
fsSpy.statSync.and.callFake(filename => {