diff --git a/lib/entry-points.js b/lib/entry-points.js index bacb322a2..8070d8e1a 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -183441,7 +183441,7 @@ function macOSVersion(action) { } var XCODE_SELECT_LINK_PATH = "/private/var/db/xcode_select_link"; var XCODE_APP_FILENAME_PATTERN = new RegExp( - /(?Xcode_(?\d+.\d+).app)/ + /(?Xcode_(?\d+(\.\d+)?)\.app)/ ); function xcodeVersion(logger2) { try { diff --git a/src/platform.test.ts b/src/platform.test.ts index 5de468d82..3fdeec275 100644 --- a/src/platform.test.ts +++ b/src/platform.test.ts @@ -190,3 +190,29 @@ test.serial("xcodeVersion returns version from resolved path", (t) => { t.is(readlinkSync.callCount, 1); t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); }); + +test.serial("xcodeVersion returns major version from resolved path", (t) => { + const logger = new RecordingLogger(); + + const lstatSync = sinon + .stub(fs, "lstatSync") + .returns({ isSymbolicLink: () => true } as fs.Stats); + const readlinkSync = sinon + .stub(fs, "readlinkSync") + .returns("/Applications/Xcode_16.app/Contents/Developer"); + + const result = xcodeVersion(logger); + + if (t.truthy(result)) { + t.is(result.major, 16); + t.is(result.minor, 0); + } + + t.is(lstatSync.callCount, 1); + t.deepEqual(lstatSync.args[0], [ + XCODE_SELECT_LINK_PATH, + { throwIfNoEntry: false }, + ]); + t.is(readlinkSync.callCount, 1); + t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); +}); diff --git a/src/platform.ts b/src/platform.ts index d5c77c9f7..22c8f6a93 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -62,7 +62,7 @@ export const XCODE_SELECT_LINK_PATH = "/private/var/db/xcode_select_link"; /** The pattern we expect to find in the Xcode path. */ export const XCODE_APP_FILENAME_PATTERN = new RegExp( - /(?Xcode_(?\d+.\d+).app)/, + /(?Xcode_(?\d+(\.\d+)?)\.app)/, ); /**