From b27ea2add10cfb03ecc414e00cb90a1bac3c8efa Mon Sep 17 00:00:00 2001 From: Mihails Strasuns Date: Sun, 15 Sep 2019 18:51:30 +0000 Subject: [PATCH 1/5] Minor style cleanup --- src/main.ts | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/main.ts b/src/main.ts index e161af3..b79087b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,36 +1,33 @@ import * as core from '@actions/core'; import * as tc from '@actions/tool-cache'; import { mkdirP } from '@actions/io'; -import * as path from 'path'; import { compiler } from './compiler'; async function run() { try { if (process.arch != "x64") - throw new Error("Only x64 arch is supported by all platforms"); + throw new Error("Only x64 arch is supported by all platforms"); const input = core.getInput('compiler'); const descr = compiler(input); console.log(`Enabling ${input}`); - let cached = tc.find('dc', input); - - if (cached) { - console.log("Using cache"); - } - else { - console.log(`Downloading ${descr.url}`); - const archive = await tc.downloadTool(descr.url); - core.debug("downloaded"); - const dc_path = await extract(archive); - core.debug("extracted"); - cached = await tc.cacheDir(dc_path, 'dc', input); - } - - core.addPath(cached + descr.binpath); - core.exportVariable("DC", descr.name); + let cached = tc.find('dc', input); + + if (cached) { + console.log("Using cache"); + } + else { + console.log(`Downloading ${descr.url}`); + const archive = await tc.downloadTool(descr.url); + const dc_path = await extract(archive); + cached = await tc.cacheDir(dc_path, 'dc', input); + } + + core.addPath(cached + descr.binpath); + core.exportVariable("DC", descr.name); console.log("Done"); } catch (error) { core.setFailed(error.message); From c0409dbd9234af72324336248c9866bac7f2bfa0 Mon Sep 17 00:00:00 2001 From: Mihails Strasuns <1132234+mihails-strasuns@users.noreply.github.com> Date: Tue, 17 Sep 2019 15:58:49 +0200 Subject: [PATCH 2/5] Enable PR testing --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7a00846..d71163c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,5 +1,5 @@ name: Test the action -on: [push] +on: [push, pull_request] jobs: test: From 67f50cc3b0a2d358cf10aee3e0b3e579ec4db6e4 Mon Sep 17 00:00:00 2001 From: Martin Kinkelin Date: Tue, 17 Sep 2019 18:06:47 +0200 Subject: [PATCH 3/5] Add support for -latest and -beta (#2) * Add support for latest and beta versions * Remove jest unit tests Was suggested by an action template but seems to be not useful enough for the added maintenance effort. * Limit amount of parallel jobs --- .github/workflows/test.yml | 13 +--- __tests__/main.test.ts | 51 ------------- lib/compiler.js | 151 +++++++++++++++++++++++-------------- lib/main.js | 4 +- lib/utils.js | 26 +++++++ package.json | 7 +- src/compiler.ts | 59 +++++++++++---- src/main.ts | 2 +- src/utils.ts | 6 ++ 9 files changed, 178 insertions(+), 141 deletions(-) delete mode 100644 __tests__/main.test.ts create mode 100644 lib/utils.js create mode 100644 src/utils.ts diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d71163c..d3942fc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,26 +2,19 @@ name: Test the action on: [push, pull_request] jobs: - test: - name: Unit tests - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - run: npm install - - run: npm test - verify: name: Verify install strategy: + max-parallel: 4 matrix: os: [ubuntu-latest, windows-latest, macOS-latest] - dc: [dmd-2.088.0, ldc-1.17.0] + dc: [dmd-2.088.0, ldc-1.17.0, ldc-latest, ldc-beta, dmd-latest, dmd-beta] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@master - name: Install action dependencies - if: github.ref == 'master' + if: github.ref == 'master' || github.event_name == 'pull_request' run: npm install --production - name: Install D compiler diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts deleted file mode 100644 index e51c7af..0000000 --- a/__tests__/main.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { compiler } from '../src/compiler'; - -describe('Compiler description', () => { - it('DMD good', async () => { - let descr = compiler("dmd-2.088.0"); - - switch (process.platform) { - case "win32": - expect(descr.url).toBe("http://downloads.dlang.org/releases/2.x/2.088.0/dmd.2.088.0.windows.7z"); - break; - case "linux": - expect(descr.url).toBe("http://downloads.dlang.org/releases/2.x/2.088.0/dmd.2.088.0.linux.tar.xz"); - break; - case "darwin": - expect(descr.url).toBe("http://downloads.dlang.org/releases/2.x/2.088.0/dmd.2.088.0.osx.tar.xz"); - break; - default: - throw new Error("unsupported platform: " + process.platform); - } - }); - - it('DMD bad', async () => { - expect(() => { compiler("dmd-2.22"); }).toThrow(); - }); - - it('LDC good', async () => { - let descr = compiler("ldc-1.17.0"); - - switch (process.platform) { - case "win32": - expect(descr.url).toBe("https://github.com/ldc-developers/ldc/releases/download/v1.17.0/ldc2-1.17.0-windows-multilib.7z"); - break; - case "linux": - expect(descr.url).toBe("https://github.com/ldc-developers/ldc/releases/download/v1.17.0/ldc2-1.17.0-linux-x86_64.tar.xz"); - break; - case "darwin": - expect(descr.url).toBe("https://github.com/ldc-developers/ldc/releases/download/v1.17.0/ldc2-1.17.0-osx-x86_64.tar.xz"); - break; - default: - throw new Error("unsupported platform: " + process.platform); - } - }); - - it('LDC bad', async () => { - expect(() => { compiler("ldc-222"); }).toThrow(); - }); - - it('Unknown compiler', async () => { - expect(() => { compiler("ddd-1.2.3"); }).toThrow(); - }); -}); diff --git a/lib/compiler.js b/lib/compiler.js index 6e04921..fa8dada 100644 --- a/lib/compiler.js +++ b/lib/compiler.js @@ -1,65 +1,104 @@ "use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; Object.defineProperty(exports, "__esModule", { value: true }); +const utils_1 = require("./utils"); function compiler(description) { - const matches = description.match(/(\w+)-(.+)/); - if (!matches) - throw new Error("invalid compiler string: " + description); - switch (matches[1]) { - case "dmd": return dmd(matches[2]); - case "ldc": return ldc(matches[2]); - default: throw new Error("unrecognized compiler: " + matches[1]); - } + return __awaiter(this, void 0, void 0, function* () { + const matches = description.match(/(\w+)-(.+)/); + if (!matches) + throw new Error("invalid compiler string: " + description); + switch (matches[1]) { + case "dmd": return dmd(matches[2]); + case "ldc": return yield ldc(matches[2]); + default: throw new Error("unrecognized compiler: " + matches[1]); + } + }); } exports.compiler = compiler; function dmd(version) { - if (!version.match(/2.(\d+).(\d+)/)) - throw new Error("unrecognized DMD version:" + version); - switch (process.platform) { - case "win32": return { - name: "dmd", - version: version, - url: `http://downloads.dlang.org/releases/2.x/${version}/dmd.${version}.windows.7z`, - binpath: "\\dmd2\\windows\\bin" - }; - case "linux": return { - name: "dmd", - version: version, - url: `http://downloads.dlang.org/releases/2.x/${version}/dmd.${version}.linux.tar.xz`, - binpath: "/dmd2/linux/bin64" - }; - case "darwin": return { - name: "dmd", - version: version, - url: `http://downloads.dlang.org/releases/2.x/${version}/dmd.${version}.osx.tar.xz`, - binpath: "/dmd2/osx/bin/" - }; - default: - throw new Error("unsupported platform: " + process.platform); - } + return __awaiter(this, void 0, void 0, function* () { + let beta = false; + switch (version) { + case "latest": + version = yield utils_1.body_as_text("http://downloads.dlang.org/releases/LATEST"); + break; + case "beta": + version = yield utils_1.body_as_text("http://downloads.dlang.org/pre-releases/LATEST"); + beta = true; + break; + } + const matches = version.match(/(2.\d+.\d+)(-.+)?/); + if (!matches) + throw new Error("unrecognized DMD version: " + version); + const base_url = beta ? + `http://downloads.dlang.org/pre-releases/2.x/${matches[1]}/dmd.${version}` + : `http://downloads.dlang.org/releases/2.x/${version}/dmd.${version}`; + switch (process.platform) { + case "win32": return { + name: "dmd", + version: version, + url: `${base_url}.windows.7z`, + binpath: "\\dmd2\\windows\\bin" + }; + case "linux": return { + name: "dmd", + version: version, + url: `${base_url}.linux.tar.xz`, + binpath: "/dmd2/linux/bin64" + }; + case "darwin": return { + name: "dmd", + version: version, + url: `${base_url}.osx.tar.xz`, + binpath: "/dmd2/osx/bin/" + }; + default: + throw new Error("unsupported platform: " + process.platform); + } + }); } function ldc(version) { - if (!version.match(/(\d+).(\d+).(\d+)/)) - throw new Error("unrecognized DMD version:" + version); - switch (process.platform) { - case "win32": return { - name: "ldc2", - version: version, - url: `https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc2-${version}-windows-multilib.7z`, - binpath: `\\ldc2-${version}-windows-multilib\\bin` - }; - case "linux": return { - name: "ldc2", - version: version, - url: `https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc2-${version}-linux-x86_64.tar.xz`, - binpath: `/ldc2-${version}-linux-x86_64/bin` - }; - case "darwin": return { - name: "ldc2", - version: version, - url: `https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc2-${version}-osx-x86_64.tar.xz`, - binpath: `/ldc2-${version}-osx-x86_64/bin` - }; - default: - throw new Error("unsupported platform: " + process.platform); - } + return __awaiter(this, void 0, void 0, function* () { + switch (version) { + case "latest": + version = yield utils_1.body_as_text("https://ldc-developers.github.io/LATEST"); + break; + case "beta": + version = yield utils_1.body_as_text("https://ldc-developers.github.io/LATEST_BETA"); + break; + } + if (!version.match(/(\d+).(\d+).(\d+)/)) + throw new Error("unrecognized LDC version: " + version); + const base_url = `https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc2-${version}`; + switch (process.platform) { + case "win32": return { + name: "ldc2", + version: version, + url: `${base_url}-windows-multilib.7z`, + binpath: `\\ldc2-${version}-windows-multilib\\bin` + }; + case "linux": return { + name: "ldc2", + version: version, + url: `${base_url}-linux-x86_64.tar.xz`, + binpath: `/ldc2-${version}-linux-x86_64/bin` + }; + case "darwin": return { + name: "ldc2", + version: version, + url: `${base_url}-osx-x86_64.tar.xz`, + binpath: `/ldc2-${version}-osx-x86_64/bin` + }; + default: + throw new Error("unsupported platform: " + process.platform); + } + }); } diff --git a/lib/main.js b/lib/main.js index e3cb6eb..d33bd22 100644 --- a/lib/main.js +++ b/lib/main.js @@ -25,7 +25,7 @@ function run() { if (process.arch != "x64") throw new Error("Only x64 arch is supported by all platforms"); const input = core.getInput('compiler'); - const descr = compiler_1.compiler(input); + const descr = yield compiler_1.compiler(input); console.log(`Enabling ${input}`); let cached = tc.find('dc', input); if (cached) { @@ -34,9 +34,7 @@ function run() { else { console.log(`Downloading ${descr.url}`); const archive = yield tc.downloadTool(descr.url); - core.debug("downloaded"); const dc_path = yield extract(archive); - core.debug("extracted"); cached = yield tc.cacheDir(dc_path, 'dc', input); } core.addPath(cached + descr.binpath); diff --git a/lib/utils.js b/lib/utils.js new file mode 100644 index 0000000..a191816 --- /dev/null +++ b/lib/utils.js @@ -0,0 +1,26 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const httpm = __importStar(require("typed-rest-client/HttpClient")); +function body_as_text(url) { + return __awaiter(this, void 0, void 0, function* () { + let client = new httpm.HttpClient("mihails-strasuns/setup-dlang"); + return (yield (yield client.get(url)).readBody()).trim(); + }); +} +exports.body_as_text = body_as_text; diff --git a/package.json b/package.json index 94338ce..869c447 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,7 @@ "description": "Installation of the requested D compiler", "main": "lib/main.js", "scripts": { - "build": "tsc", - "test": "jest" + "build": "tsc" }, "repository": { "type": "git", @@ -25,11 +24,7 @@ "@actions/io": "^1.0.0" }, "devDependencies": { - "@types/jest": "^24.0.13", "@types/node": "^12.7.4", - "jest": "^24.8.0", - "jest-circus": "^24.7.1", - "ts-jest": "^24.0.2", "typescript": "^3.5.1" } } diff --git a/src/compiler.ts b/src/compiler.ts index bf2f071..6acd3be 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -1,3 +1,6 @@ +import * as tc from '@actions/tool-cache'; +import { body_as_text } from './utils'; + export interface CompilerDescription { name: string; version: string; @@ -5,38 +8,55 @@ export interface CompilerDescription { binpath: string; } -export function compiler(description: string): CompilerDescription { +export async function compiler(description: string): Promise { const matches = description.match(/(\w+)-(.+)/); if (!matches) throw new Error("invalid compiler string: " + description); switch (matches[1]) { case "dmd": return dmd(matches[2]); - case "ldc": return ldc(matches[2]); + case "ldc": return await ldc(matches[2]); default: throw new Error("unrecognized compiler: " + matches[1]); } } -function dmd(version: string): CompilerDescription { - if (!version.match(/2.(\d+).(\d+)/)) - throw new Error("unrecognized DMD version:" + version); +async function dmd(version: string): Promise { + let beta = false; + + switch (version) { + case "latest": + version = await body_as_text("http://downloads.dlang.org/releases/LATEST"); + break; + case "beta": + version = await body_as_text("http://downloads.dlang.org/pre-releases/LATEST"); + beta = true; + break; + } + + const matches = version.match(/(2.\d+.\d+)(-.+)?/); + if (!matches) + throw new Error("unrecognized DMD version: " + version); + + const base_url = beta ? + `http://downloads.dlang.org/pre-releases/2.x/${matches[1]}/dmd.${version}` + : `http://downloads.dlang.org/releases/2.x/${version}/dmd.${version}`; switch (process.platform) { case "win32": return { name: "dmd", version: version, - url: `http://downloads.dlang.org/releases/2.x/${version}/dmd.${version}.windows.7z`, + url: `${base_url}.windows.7z`, binpath: "\\dmd2\\windows\\bin" }; case "linux": return { name: "dmd", version: version, - url: `http://downloads.dlang.org/releases/2.x/${version}/dmd.${version}.linux.tar.xz`, + url: `${base_url}.linux.tar.xz`, binpath: "/dmd2/linux/bin64" }; case "darwin": return { name: "dmd", version: version, - url: `http://downloads.dlang.org/releases/2.x/${version}/dmd.${version}.osx.tar.xz`, + url: `${base_url}.osx.tar.xz`, binpath: "/dmd2/osx/bin/" }; default: @@ -44,30 +64,41 @@ function dmd(version: string): CompilerDescription { } } -function ldc(version: string): CompilerDescription { +async function ldc(version: string): Promise { + switch (version) { + case "latest": + version = await body_as_text("https://ldc-developers.github.io/LATEST"); + break; + case "beta": + version = await body_as_text("https://ldc-developers.github.io/LATEST_BETA"); + break; + } + if (!version.match(/(\d+).(\d+).(\d+)/)) - throw new Error("unrecognized DMD version:" + version); + throw new Error("unrecognized LDC version: " + version); + + const base_url = `https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc2-${version}`; switch (process.platform) { case "win32": return { name: "ldc2", version: version, - url: `https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc2-${version}-windows-multilib.7z`, + url: `${base_url}-windows-multilib.7z`, binpath: `\\ldc2-${version}-windows-multilib\\bin` }; case "linux": return { name: "ldc2", version: version, - url: `https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc2-${version}-linux-x86_64.tar.xz`, + url: `${base_url}-linux-x86_64.tar.xz`, binpath: `/ldc2-${version}-linux-x86_64/bin` }; case "darwin": return { name: "ldc2", version: version, - url: `https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc2-${version}-osx-x86_64.tar.xz`, + url: `${base_url}-osx-x86_64.tar.xz`, binpath: `/ldc2-${version}-osx-x86_64/bin` }; default: throw new Error("unsupported platform: " + process.platform); } -} +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index b79087b..26f6e98 100644 --- a/src/main.ts +++ b/src/main.ts @@ -10,7 +10,7 @@ async function run() { throw new Error("Only x64 arch is supported by all platforms"); const input = core.getInput('compiler'); - const descr = compiler(input); + const descr = await compiler(input); console.log(`Enabling ${input}`); diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..6b49192 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,6 @@ +import * as httpm from 'typed-rest-client/HttpClient'; + +export async function body_as_text (url: string): Promise { + let client = new httpm.HttpClient("mihails-strasuns/setup-dlang"); + return (await (await client.get(url)).readBody()).trim(); +} \ No newline at end of file From 9d1e1014fbb1a3ae6c114ce3a8602a07403e0ea0 Mon Sep 17 00:00:00 2001 From: Mihails Strasuns Date: Tue, 17 Sep 2019 18:15:52 +0200 Subject: [PATCH 4/5] Tweak deps installation condition --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d3942fc..aff622e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@master - name: Install action dependencies - if: github.ref == 'master' || github.event_name == 'pull_request' + if: (! startsWith(github.ref, 'v')) run: npm install --production - name: Install D compiler From 9a5b454c429cdffa622aafc8d8f54db70dda36b1 Mon Sep 17 00:00:00 2001 From: Mihails Strasuns Date: Tue, 17 Sep 2019 18:24:08 +0200 Subject: [PATCH 5/5] Use dmd-latest as the default compiler --- .github/workflows/test.yml | 2 +- lib/main.js | 2 +- src/main.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index aff622e..399d732 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ jobs: max-parallel: 4 matrix: os: [ubuntu-latest, windows-latest, macOS-latest] - dc: [dmd-2.088.0, ldc-1.17.0, ldc-latest, ldc-beta, dmd-latest, dmd-beta] + dc: [dmd-2.088.0, ldc-1.17.0, ldc-latest, ldc-beta, dmd-latest, dmd-beta, ''] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@master diff --git a/lib/main.js b/lib/main.js index d33bd22..ea594bd 100644 --- a/lib/main.js +++ b/lib/main.js @@ -24,7 +24,7 @@ function run() { try { if (process.arch != "x64") throw new Error("Only x64 arch is supported by all platforms"); - const input = core.getInput('compiler'); + const input = core.getInput('compiler') || "dmd-latest"; const descr = yield compiler_1.compiler(input); console.log(`Enabling ${input}`); let cached = tc.find('dc', input); diff --git a/src/main.ts b/src/main.ts index 26f6e98..bfaf416 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,7 +9,7 @@ async function run() { if (process.arch != "x64") throw new Error("Only x64 arch is supported by all platforms"); - const input = core.getInput('compiler'); + const input = core.getInput('compiler') || "dmd-latest"; const descr = await compiler(input); console.log(`Enabling ${input}`);