diff --git a/README.md b/README.md index 2199efc..ddb5195 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,14 @@ with: xmake-version: '2.3.1' ``` +Use specified branch: + +```yml +uses: xmake-io/github-action-setup-xmake@v1 +with: + xmake-version: branch@master +``` + Use semver: ```yml diff --git a/src/index.ts b/src/index.ts index f2511cf..cfc51d6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,14 +8,22 @@ import * as semver from 'semver'; import * as git from './git'; import { selectVersion } from './versions'; -async function winInstall(version: string): Promise { +async function winInstall(version: string, sha: string): Promise { let toolDir = toolCache.find('xmake', version); if (!toolDir) { - const installer = await core.group('download xmake', async () => { - const arch = os.arch() === 'x64' ? 'x64' : 'x86'; - const url = semver.gt(version, '2.2.6') - ? `https://ci.appveyor.com/api/projects/waruqi/xmake/artifacts/xmake-installer.exe?tag=v${version}&pr=false&job=Image%3A+Visual+Studio+2017%3B+Platform%3A+${arch}` - : `https://github.com/xmake-io/xmake/releases/download/v$v/xmake-v${version}.exe`; + const installer = await core.group(`download xmake ${version}`, async () => { + let url = ""; + if (version.startsWith("branch@")) { + // we only use appveyor ci artifacts for branch version + const arch = os.arch() === 'x64' ? 'x64' : 'x86'; + url = `https://ci.appveyor.com/api/projects/waruqi/xmake/artifacts/xmake-installer.exe?branch=${sha}&pr=false&job=Image%3A+Visual+Studio+2017%3B+Platform%3A+${arch}`; + } else { + // we cannot use appveyor ci artifacts, the old version links may be broken. + const arch = os.arch() === 'x64' ? 'win64' : 'win32'; + url = semver.gt(version, '2.2.6') + ? `https://github.com/xmake-io/xmake/releases/download/v${version}/xmake-v${version}.${arch}.exe` + : `https://github.com/xmake-io/xmake/releases/download/v${version}/xmake-v${version}.exe`; + } core.info(`downloading from ${url}`); const file = await toolCache.downloadTool(url); const exe = path.format({ ...path.parse(file), ext: '.exe', base: undefined }); @@ -23,7 +31,7 @@ async function winInstall(version: string): Promise { core.info(`downloaded to ${exe}`); return exe; }); - toolDir = await core.group('install xmake', async () => { + toolDir = await core.group(`install xmake ${version}`, async () => { const binDir = path.join(os.tmpdir(), `xmake-${version}`); core.info(`installing to ${binDir}`); await exec(`"${installer}" /NOADMIN /S /D=${binDir}`); @@ -40,8 +48,8 @@ async function winInstall(version: string): Promise { async function unixInstall(version: string, sha: string): Promise { let toolDir = toolCache.find('xmake', version); if (!toolDir) { - const sourceDir = await core.group('download xmake', () => git.create(sha)); - toolDir = await core.group('install xmake', async () => { + const sourceDir = await core.group(`download xmake ${version}`, () => git.create(sha)); + toolDir = await core.group(`install xmake ${version}`, async () => { await exec('make', ['build'], { cwd: sourceDir }); const binDir = path.join(os.tmpdir(), `xmake-${version}-${sha}`); await exec('make', ['install', `prefix=${binDir}`], { cwd: sourceDir }); @@ -51,13 +59,19 @@ async function unixInstall(version: string, sha: string): Promise { return cacheDir; }); } - core.addPath(path.join(toolDir, 'share', 'xmake')); + + // for versions 2.3.2 and above, xmake will be installed directly into the bin directory, and no script will be used to wrap it. + if (version.startsWith("branch@") || semver.gt(version, '2.3.1')) { + core.addPath(path.join(toolDir, 'bin')); + } else { + core.addPath(path.join(toolDir, 'share', 'xmake')); // only for <= 2.3.1 + } } async function run(): Promise { try { const { version, sha } = await selectVersion(); - if (os.platform() === 'win32' || os.platform() === 'cygwin') await winInstall(version); + if (os.platform() === 'win32' || os.platform() === 'cygwin') await winInstall(version, sha); else await unixInstall(version, sha); await exec('xmake --version'); } catch (error) { diff --git a/src/versions.ts b/src/versions.ts index b563a4f..17a87e1 100644 --- a/src/versions.ts +++ b/src/versions.ts @@ -3,8 +3,19 @@ import * as semver from 'semver'; import { lsRemote } from './git'; export async function selectVersion(version?: string): Promise<{ version: string; sha: string }> { + + // get version string version = (version ?? core.getInput('xmake-version')) || 'latest'; if (version.toLowerCase() === 'latest') version = ''; + + // select branch + if (version.startsWith('branch@')) { + const branch = version.substr(7); + core.info(`Selected xmake branch: ${branch}`); + return { version: version, sha: branch }; + } + + // select version version = semver.validRange(version); if (!version) { throw new Error(`Invalid input xmake-version: ${core.getInput('xmake-version')}`); @@ -17,6 +28,6 @@ export async function selectVersion(version?: string): Promise<{ version: string } const sha = versions[ver]; - core.info(`selected xmake v${ver} (commit: ${sha.substr(0, 8)})`); + core.info(`Selected xmake v${ver} (commit: ${sha.substr(0, 8)})`); return { version: ver, sha }; }