From acad24d62ad8888c01245bc3b002c44cbe84edcf Mon Sep 17 00:00:00 2001 From: Chris Brody Date: Sun, 14 Jul 2019 16:35:44 -0400 Subject: [PATCH] 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 --- .../cordova/lib/builders/ProjectBuilder.js | 29 ++++++++++--------- spec/unit/builders/ProjectBuilder.spec.js | 2 +- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/bin/templates/cordova/lib/builders/ProjectBuilder.js b/bin/templates/cordova/lib/builders/ProjectBuilder.js index 94e26a0e..e7dd8f0b 100644 --- a/bin/templates/cordova/lib/builders/ProjectBuilder.js +++ b/bin/templates/cordova/lib/builders/ProjectBuilder.js @@ -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; diff --git a/spec/unit/builders/ProjectBuilder.spec.js b/spec/unit/builders/ProjectBuilder.spec.js index 7db85517..0f713816 100644 --- a/spec/unit/builders/ProjectBuilder.spec.js +++ b/spec/unit/builders/ProjectBuilder.spec.js @@ -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 => {