diff --git a/__tests__/snapshot/linux.test.ts b/__tests__/snapshot/linux.test.ts index cd6bc1f..709819b 100644 --- a/__tests__/snapshot/linux.test.ts +++ b/__tests__/snapshot/linux.test.ts @@ -180,6 +180,44 @@ describe('fetch linux tool data based on options', () => { expect(lTool.docker).toBeTruthy() }) + it('fetches ubuntu 22.04 named swift tool', async () => { + setos({os: 'linux', dist: 'Ubuntu', release: '22.04'}) + jest.spyOn(os, 'arch').mockReturnValue('x64') + const name = 'swift-DEVELOPMENT-SNAPSHOT-2023-09-02-a' + const version = ToolchainVersion.create(name, false) + const tool = await Platform.toolchain(version) + expect(tool).toBeTruthy() + const lTool = tool as LinuxToolchainSnapshot + expect(lTool.download).toBe( + 'swift-DEVELOPMENT-SNAPSHOT-2023-09-02-a-ubuntu22.04.tar.gz' + ) + expect(lTool.dir).toBe('swift-DEVELOPMENT-SNAPSHOT-2023-09-02-a') + expect(lTool.platform).toBe('ubuntu2204') + expect(lTool.branch).toBe('development') + expect(lTool.download_signature).toBe( + 'swift-DEVELOPMENT-SNAPSHOT-2023-09-02-a-ubuntu22.04.tar.gz.sig' + ) + }) + + it('fetches ubuntu 22.04 named versioned swift tool', async () => { + setos({os: 'linux', dist: 'Ubuntu', release: '22.04'}) + jest.spyOn(os, 'arch').mockReturnValue('x64') + const name = 'swift-5.9-DEVELOPMENT-SNAPSHOT-2023-09-01-a' + const version = ToolchainVersion.create(name, false) + const tool = await Platform.toolchain(version) + expect(tool).toBeTruthy() + const lTool = tool as LinuxToolchainSnapshot + expect(lTool.download).toBe( + 'swift-5.9-DEVELOPMENT-SNAPSHOT-2023-09-01-a-ubuntu22.04.tar.gz' + ) + expect(lTool.dir).toBe('swift-5.9-DEVELOPMENT-SNAPSHOT-2023-09-01-a') + expect(lTool.platform).toBe('ubuntu2204') + expect(lTool.branch).toBe('swift-5.9-branch') + expect(lTool.download_signature).toBe( + 'swift-5.9-DEVELOPMENT-SNAPSHOT-2023-09-01-a-ubuntu22.04.tar.gz.sig' + ) + }) + it('fetches ubuntu 18.04 latest swift 5.5 tools', async () => { setos({os: 'linux', dist: 'Ubuntu', release: '18.04'}) jest.spyOn(os, 'arch').mockReturnValue('x64') diff --git a/__tests__/snapshot/windows.test.ts b/__tests__/snapshot/windows.test.ts index f374823..9636289 100644 --- a/__tests__/snapshot/windows.test.ts +++ b/__tests__/snapshot/windows.test.ts @@ -106,6 +106,44 @@ describe('fetch windows tool data based on options', () => { expect(wTool.download_signature).toBeTruthy() }) + it('fetches windows 10 named swift tool', async () => { + setos({os: 'win32', dist: 'Windows', release: '10.0.17063'}) + jest.spyOn(os, 'arch').mockReturnValue('x64') + const name = 'swift-DEVELOPMENT-SNAPSHOT-2023-08-10-a' + const version = ToolchainVersion.create(name, false) + const tool = await Platform.toolchain(version) + expect(tool).toBeTruthy() + const lTool = tool as WindowsToolchainSnapshot + expect(lTool.download).toBe( + 'swift-DEVELOPMENT-SNAPSHOT-2023-08-10-a-windows10.exe' + ) + expect(lTool.dir).toBe('swift-DEVELOPMENT-SNAPSHOT-2023-08-10-a') + expect(lTool.platform).toBe('windows10') + expect(lTool.branch).toBe('development') + expect(lTool.download_signature).toBe( + 'swift-DEVELOPMENT-SNAPSHOT-2023-08-10-a-windows10.exe.sig' + ) + }) + + it('fetches windows 10 named versioned swift tool', async () => { + setos({os: 'win32', dist: 'Windows', release: '10.0.17063'}) + jest.spyOn(os, 'arch').mockReturnValue('x64') + const name = 'swift-5.9-DEVELOPMENT-SNAPSHOT-2023-05-11-a' + const version = ToolchainVersion.create(name, false) + const tool = await Platform.toolchain(version) + expect(tool).toBeTruthy() + const lTool = tool as WindowsToolchainSnapshot + expect(lTool.download).toBe( + 'swift-5.9-DEVELOPMENT-SNAPSHOT-2023-05-11-a-windows10.exe' + ) + expect(lTool.dir).toBe('swift-5.9-DEVELOPMENT-SNAPSHOT-2023-05-11-a') + expect(lTool.platform).toBe('windows10') + expect(lTool.branch).toBe('swift-5.9-branch') + expect(lTool.download_signature).toBe( + 'swift-5.9-DEVELOPMENT-SNAPSHOT-2023-05-11-a-windows10.exe.sig' + ) + }) + it('fetches windows 10 latest swift 5.5 tools', async () => { setos({os: 'win32', dist: 'Windows', release: '10.0.17063'}) jest.spyOn(os, 'arch').mockReturnValue('x64') diff --git a/__tests__/snapshot/xcode.test.ts b/__tests__/snapshot/xcode.test.ts index f824f1a..63c1d11 100644 --- a/__tests__/snapshot/xcode.test.ts +++ b/__tests__/snapshot/xcode.test.ts @@ -138,6 +138,38 @@ describe('fetch macos tool data based on options', () => { } }) + it('fetches macOs named swift tool', async () => { + setos({os: 'darwin', dist: 'macOS', release: '21'}) + jest.spyOn(os, 'arch').mockReturnValue('x64') + const name = 'swift-DEVELOPMENT-SNAPSHOT-2023-09-02-a' + const version = ToolchainVersion.create(name, false) + const tool = await Platform.toolchain(version) + expect(tool).toBeTruthy() + const lTool = tool as XcodeToolchainSnapshot + expect(lTool.download).toBe( + 'swift-DEVELOPMENT-SNAPSHOT-2023-09-02-a-osx.pkg' + ) + expect(lTool.dir).toBe('swift-DEVELOPMENT-SNAPSHOT-2023-09-02-a') + expect(lTool.platform).toBe('xcode') + expect(lTool.branch).toBe('development') + }) + + it('fetches macOS named versioned swift tool', async () => { + setos({os: 'darwin', dist: 'macOS', release: '21'}) + jest.spyOn(os, 'arch').mockReturnValue('x64') + const name = 'swift-5.9-DEVELOPMENT-SNAPSHOT-2023-09-01-a' + const version = ToolchainVersion.create(name, false) + const tool = await Platform.toolchain(version) + expect(tool).toBeTruthy() + const lTool = tool as XcodeToolchainSnapshot + expect(lTool.download).toBe( + 'swift-5.9-DEVELOPMENT-SNAPSHOT-2023-09-01-a-osx.pkg' + ) + expect(lTool.dir).toBe('swift-5.9-DEVELOPMENT-SNAPSHOT-2023-09-01-a') + expect(lTool.platform).toBe('xcode') + expect(lTool.branch).toBe('swift-5.9-branch') + }) + it('detects earliest toolchains', async () => { const platform = new XcodePlatform('x64') const version = ToolchainVersion.create('latest', false) diff --git a/__tests__/swiftorg.test.ts b/__tests__/swiftorg.test.ts index de31517..0e06166 100644 --- a/__tests__/swiftorg.test.ts +++ b/__tests__/swiftorg.test.ts @@ -15,7 +15,7 @@ describe('swiftorg sync validation', () => { const swiftorg = new Swiftorg(true) await swiftorg.update() expect(rmdirSpy).not.toHaveBeenCalled() - expect(execSpy).toHaveBeenCalledTimes(3) + expect(execSpy).toHaveBeenCalledTimes(2) const gitArgs = [ 'submodule', 'update', @@ -24,7 +24,7 @@ describe('swiftorg sync validation', () => { '--remote', '--merge' ] - expect(execSpy.mock.calls[2]).toStrictEqual([ + expect(execSpy.mock.calls[1]).toStrictEqual([ 'git', gitArgs, {cwd: MODULE_DIR} @@ -38,9 +38,9 @@ describe('swiftorg sync validation', () => { const swiftorg = new Swiftorg(false) await swiftorg.update() expect(rmdirSpy).not.toHaveBeenCalled() - expect(execSpy).toHaveBeenCalledTimes(3) - const gitArgs = ['submodule', 'update'] - expect(execSpy.mock.calls[2]).toStrictEqual([ + expect(execSpy).toHaveBeenCalledTimes(2) + const gitArgs = ['submodule', 'update', '--init'] + expect(execSpy.mock.calls[1]).toStrictEqual([ 'git', gitArgs, {cwd: MODULE_DIR} @@ -54,7 +54,7 @@ describe('swiftorg sync validation', () => { const swiftorg = new Swiftorg(true) await swiftorg.update() expect(rmdirSpy).toHaveBeenCalled() - expect(execSpy).toHaveBeenCalledTimes(4) + expect(execSpy).toHaveBeenCalledTimes(3) }) it('tests without latest sync failure with empty swiftorg', async () => { @@ -64,7 +64,7 @@ describe('swiftorg sync validation', () => { const swiftorg = new Swiftorg(false) await swiftorg.update() expect(rmdirSpy).toHaveBeenCalled() - expect(execSpy).toHaveBeenCalledTimes(5) + expect(execSpy).toHaveBeenCalledTimes(4) }) it('tests latest sync failure with no swiftorg', async () => { @@ -74,7 +74,7 @@ describe('swiftorg sync validation', () => { const swiftorg = new Swiftorg(true) await swiftorg.update() expect(rmdirSpy).not.toHaveBeenCalled() - expect(execSpy).toHaveBeenCalledTimes(4) + expect(execSpy).toHaveBeenCalledTimes(3) }) it('tests without latest sync failure with no swiftorg', async () => { @@ -84,7 +84,7 @@ describe('swiftorg sync validation', () => { const swiftorg = new Swiftorg(false) await swiftorg.update() expect(rmdirSpy).not.toHaveBeenCalled() - expect(execSpy).toHaveBeenCalledTimes(5) + expect(execSpy).toHaveBeenCalledTimes(4) }) it('tests without latest sync failure with empty swiftorg and no commit in package.json', async () => { @@ -95,7 +95,7 @@ describe('swiftorg sync validation', () => { const swiftorg = new Swiftorg(false) await swiftorg.update() expect(rmdirSpy).toHaveBeenCalled() - expect(execSpy).toHaveBeenCalledTimes(4) + expect(execSpy).toHaveBeenCalledTimes(3) }) it('tests without latest sync failure with no swiftorg and no commit in package.json', async () => { @@ -106,6 +106,6 @@ describe('swiftorg sync validation', () => { const swiftorg = new Swiftorg(false) await swiftorg.update() expect(rmdirSpy).not.toHaveBeenCalled() - expect(execSpy).toHaveBeenCalledTimes(4) + expect(execSpy).toHaveBeenCalledTimes(3) }) }) diff --git a/__tests__/version.test.ts b/__tests__/version.test.ts index f89cfa0..2c5c5e2 100644 --- a/__tests__/version.test.ts +++ b/__tests__/version.test.ts @@ -1,7 +1,8 @@ import { ToolchainVersion, SemanticToolchainVersion, - LatestToolchainVersion + LatestToolchainVersion, + ToolchainSnapshotName } from '../src/version' describe('parse version from provided string', () => { @@ -84,6 +85,27 @@ describe('parse version from provided string', () => { expect(sVersion['dirRegex']).toStrictEqual(/swift-5.5.1/) }) + it('parses toolchain name', async () => { + const name = 'swift-DEVELOPMENT-SNAPSHOT-2023-09-06-a' + const version = ToolchainVersion.create(name, false) + expect(version).toBeInstanceOf(ToolchainSnapshotName) + expect(version.dev).toBe(true) + const lVersion = version as ToolchainSnapshotName + expect(lVersion['dirGlob']).toBe('*') + expect(lVersion['dirRegex']).toStrictEqual(new RegExp(name)) + }) + + it('parses toolchain name without prefix', async () => { + const input = '5.9-DEVELOPMENT-SNAPSHOT-2023-09-05-a' + const name = `swift-${input}` + const version = ToolchainVersion.create(input, false) + expect(version).toBeInstanceOf(ToolchainSnapshotName) + expect(version.dev).toBe(true) + const lVersion = version as ToolchainSnapshotName + expect(lVersion['dirGlob']).toBe('swift-5_9-*') + expect(lVersion['dirRegex']).toStrictEqual(new RegExp(name)) + }) + it('parses invalid input', async () => { const creation = () => ToolchainVersion.create('invalid', false) expect(creation).toThrow() diff --git a/dist/index.js b/dist/index.js index 8ce89fd..499d4a7 100644 --- a/dist/index.js +++ b/dist/index.js @@ -963,6 +963,7 @@ class Platform { return Object.assign(Object.assign({}, data), { platform: snapshots.platform, branch: snapshots.branch }); }); }) + .filter(item => version.satisfiedBy(item.dir)) .sort((item1, item2) => item2.date.getTime() - item1.date.getTime()); }); @@ -1683,13 +1684,12 @@ class Swiftorg { } update() { return __awaiter(this, void 0, void 0, function* () { - const gitArgs = ['submodule', 'update']; + const gitArgs = ['submodule', 'update', '--init']; if (this.checkLatest) { - gitArgs.push('--init', '--recursive', '--remote', '--merge'); + gitArgs.push('--recursive', '--remote', '--merge'); } core.debug(`Initializing submodules in "${const_1.MODULE_DIR}"`); yield (0, exec_1.exec)('git', ['init'], { cwd: const_1.MODULE_DIR }); - yield (0, exec_1.exec)('git', ['submodule', 'init'], { cwd: const_1.MODULE_DIR }); core.debug(`Updating submodules in "${const_1.MODULE_DIR}" with args "${gitArgs}"`); yield (0, exec_1.exec)('git', gitArgs, { cwd: const_1.MODULE_DIR }); const swiftorg = path.join(const_1.MODULE_DIR, 'swiftorg'); @@ -2348,11 +2348,18 @@ const semver_1 = __nccwpck_require__(11383); const base_1 = __nccwpck_require__(2120); const latest_1 = __nccwpck_require__(28363); const semver_2 = __nccwpck_require__(30916); +const name_1 = __nccwpck_require__(43987); base_1.ToolchainVersion.create = (requested, dev = false) => { if (requested === 'latest' || requested === 'current') { core.debug(`Using latest ${dev ? 'development ' : ''}toolchain requirement`); return new latest_1.LatestToolchainVersion(dev); } + if (requested.includes(name_1.DEVELOPMENT_SNAPSHOT) || + requested.startsWith('swift-')) { + const version = new name_1.ToolchainSnapshotName(requested); + core.debug(`Using as toolchain name "${version}"`); + return version; + } let semver; try { semver = new semver_1.SemVer(requested); @@ -2370,6 +2377,7 @@ base_1.ToolchainVersion.create = (requested, dev = false) => { __exportStar(__nccwpck_require__(2120), exports); __exportStar(__nccwpck_require__(28363), exports); __exportStar(__nccwpck_require__(30916), exports); +__exportStar(__nccwpck_require__(43987), exports); /***/ }), @@ -2396,6 +2404,46 @@ class LatestToolchainVersion extends base_1.ToolchainVersion { exports.LatestToolchainVersion = LatestToolchainVersion; +/***/ }), + +/***/ 43987: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ToolchainSnapshotName = exports.DEVELOPMENT_SNAPSHOT = void 0; +const semver_1 = __nccwpck_require__(11383); +const base_1 = __nccwpck_require__(2120); +exports.DEVELOPMENT_SNAPSHOT = 'DEVELOPMENT-SNAPSHOT'; +class ToolchainSnapshotName extends base_1.ToolchainVersion { + constructor(name) { + super(name.includes(exports.DEVELOPMENT_SNAPSHOT)); + this.name = name; + } + get dir() { + if (this.name.startsWith('swift-')) { + return this.name; + } + return `swift-${this.name}`; + } + get dirGlob() { + const match = /swift-([^-]*)-/.exec(this.dir); + if (!match || match.length < 2 || !(0, semver_1.coerce)(match[1])) { + return '*'; + } + return `swift-${match[1].replaceAll('.', '_')}-*`; + } + get dirRegex() { + return new RegExp(this.dir); + } + toString() { + return this.dir; + } +} +exports.ToolchainSnapshotName = ToolchainSnapshotName; + + /***/ }), /***/ 30916: diff --git a/src/platform/base.ts b/src/platform/base.ts index f083001..d80564e 100644 --- a/src/platform/base.ts +++ b/src/platform/base.ts @@ -48,6 +48,7 @@ export abstract class Platform< } as SnapshotForInstaller }) }) + .filter(item => version.satisfiedBy((item as ToolchainSnapshot).dir)) .sort( (item1, item2) => (item2 as ToolchainSnapshot).date.getTime() - diff --git a/src/swiftorg.ts b/src/swiftorg.ts index e536062..093f959 100644 --- a/src/swiftorg.ts +++ b/src/swiftorg.ts @@ -45,13 +45,12 @@ export class Swiftorg { } async update() { - const gitArgs = ['submodule', 'update'] + const gitArgs = ['submodule', 'update', '--init'] if (this.checkLatest) { - gitArgs.push('--init', '--recursive', '--remote', '--merge') + gitArgs.push('--recursive', '--remote', '--merge') } core.debug(`Initializing submodules in "${MODULE_DIR}"`) await exec('git', ['init'], {cwd: MODULE_DIR}) - await exec('git', ['submodule', 'init'], {cwd: MODULE_DIR}) core.debug(`Updating submodules in "${MODULE_DIR}" with args "${gitArgs}"`) await exec('git', gitArgs, {cwd: MODULE_DIR}) const swiftorg = path.join(MODULE_DIR, 'swiftorg') diff --git a/src/version/index.ts b/src/version/index.ts index 0fecc22..c01e8a9 100644 --- a/src/version/index.ts +++ b/src/version/index.ts @@ -3,6 +3,7 @@ import {SemVer, coerce as parseSemVer} from 'semver' import {ToolchainVersion} from './base' import {LatestToolchainVersion} from './latest' import {SemanticToolchainVersion} from './semver' +import {ToolchainSnapshotName, DEVELOPMENT_SNAPSHOT} from './name' declare module './base' { // eslint-disable-next-line no-shadow @@ -17,6 +18,15 @@ ToolchainVersion.create = (requested: string, dev = false) => { return new LatestToolchainVersion(dev) } + if ( + requested.includes(DEVELOPMENT_SNAPSHOT) || + requested.startsWith('swift-') + ) { + const version = new ToolchainSnapshotName(requested) + core.debug(`Using as toolchain name "${version}"`) + return version + } + let semver: SemVer try { semver = new SemVer(requested) @@ -36,3 +46,4 @@ ToolchainVersion.create = (requested: string, dev = false) => { export * from './base' export * from './latest' export * from './semver' +export * from './name' diff --git a/src/version/name.ts b/src/version/name.ts new file mode 100644 index 0000000..6c22236 --- /dev/null +++ b/src/version/name.ts @@ -0,0 +1,33 @@ +import {coerce as parseSemVer} from 'semver' +import {ToolchainVersion} from './base' + +export const DEVELOPMENT_SNAPSHOT = 'DEVELOPMENT-SNAPSHOT' + +export class ToolchainSnapshotName extends ToolchainVersion { + constructor(readonly name: string) { + super(name.includes(DEVELOPMENT_SNAPSHOT)) + } + + private get dir() { + if (this.name.startsWith('swift-')) { + return this.name + } + return `swift-${this.name}` + } + + protected get dirGlob() { + const match = /swift-([^-]*)-/.exec(this.dir) + if (!match || match.length < 2 || !parseSemVer(match[1])) { + return '*' + } + return `swift-${match[1].replaceAll('.', '_')}-*` + } + + protected get dirRegex() { + return new RegExp(this.dir) + } + + toString() { + return this.dir + } +}