From 381af06b4268a1e0ad7b7c7e5a09f1894977120f Mon Sep 17 00:00:00 2001 From: Konrad Pabjan Date: Thu, 30 Jul 2020 12:01:38 +0200 Subject: [PATCH] Add support for tilde expansion (#50) * Add support for tilde expansion * Print resolved path with debug * Update README * README * Only replace tilde in certain scenarios * Fix --- .github/workflows/test.yml | 18 +++++++++++++----- README.md | 8 ++++++++ dist/index.js | 16 +++++++++++++--- src/download-artifact.ts | 18 +++++++++++++++--- 4 files changed, 49 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 18d9fb9..3eea7de 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -68,16 +68,24 @@ jobs: name: 'Artifact-A' path: some/new/path + # Test downloading an artifact using tilde expansion + - name: Download artifact A + uses: ./ + with: + name: 'Artifact-A' + path: ~/some/path/with/a/tilde + - name: Verify successful download run: | - $file = "some/new/path/file-A.txt" - if(!(Test-Path -path $file)) + $file1 = "some/new/path/file-A.txt" + $file2 = "~/some/path/with/a/tilde/file-A.txt" + if(!(Test-Path -path $file1) -or !(Test-Path -path $file2)) { - Write-Error "Expected file does not exist" + Write-Error "Expected files do not exist" } - if(!((Get-Content $file) -ceq "Lorem ipsum dolor sit amet")) + if(!((Get-Content $file1) -ceq "Lorem ipsum dolor sit amet") -or !((Get-Content $file2) -ceq "Lorem ipsum dolor sit amet")) { - Write-Error "File contents of downloaded artifact are incorrect" + Write-Error "File contents of downloaded artifacts are incorrect" } shell: pwsh diff --git a/README.md b/README.md index 9de1520..12e0545 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,14 @@ steps: working-directory: path/to/artifact ``` +Basic tilde expansion is supported for the `path` input: +```yaml + - uses: actions/download-artifact@v2 + with: + name: my-artifact + path: ~/download/path +``` + ## Compatibility between `v1` and `v2` When using `download-artifact@v1`, a directory denoted by the name of the artifact would be created if the `path` input was not provided. All of the contents would be downloaded to this directory. diff --git a/dist/index.js b/dist/index.js index 15e1e91..429e9ad 100644 --- a/dist/index.js +++ b/dist/index.js @@ -6634,6 +6634,7 @@ var __importStar = (this && this.__importStar) || function (mod) { Object.defineProperty(exports, "__esModule", { value: true }); const core = __importStar(__webpack_require__(470)); const artifact = __importStar(__webpack_require__(214)); +const os = __importStar(__webpack_require__(87)); const path_1 = __webpack_require__(622); const constants_1 = __webpack_require__(694); function run() { @@ -6641,12 +6642,21 @@ function run() { try { const name = core.getInput(constants_1.Inputs.Name, { required: false }); const path = core.getInput(constants_1.Inputs.Path, { required: false }); + let resolvedPath; + // resolve tilde expansions, path.replace only replaces the first occurrence of a pattern + if (path.startsWith(`~`)) { + resolvedPath = path_1.resolve(path.replace('~', os.homedir())); + } + else { + resolvedPath = path_1.resolve(path); + } + core.debug(`Resolved path is ${resolvedPath}`); const artifactClient = artifact.create(); if (!name) { // download all artifacts core.info('No artifact name specified, downloading all artifacts'); core.info('Creating an extra directory for each artifact that is being downloaded'); - const downloadResponse = yield artifactClient.downloadAllArtifacts(path); + const downloadResponse = yield artifactClient.downloadAllArtifacts(resolvedPath); core.info(`There were ${downloadResponse.length} artifacts downloaded`); for (const artifact of downloadResponse) { core.info(`Artifact ${artifact.artifactName} was downloaded to ${artifact.downloadPath}`); @@ -6658,12 +6668,12 @@ function run() { const downloadOptions = { createArtifactFolder: false }; - const downloadResponse = yield artifactClient.downloadArtifact(name, path, downloadOptions); + const downloadResponse = yield artifactClient.downloadArtifact(name, resolvedPath, downloadOptions); core.info(`Artifact ${downloadResponse.artifactName} was downloaded to ${downloadResponse.downloadPath}`); } // output the directory that the artifact(s) was/were downloaded to // if no path is provided, an empty string resolves to the current working directory - core.setOutput(constants_1.Outputs.DownloadPath, path_1.resolve(path)); + core.setOutput(constants_1.Outputs.DownloadPath, resolvedPath); core.info('Artifact download has finished successfully'); } catch (err) { diff --git a/src/download-artifact.ts b/src/download-artifact.ts index f24656a..b32a7be 100644 --- a/src/download-artifact.ts +++ b/src/download-artifact.ts @@ -1,5 +1,6 @@ import * as core from '@actions/core' import * as artifact from '@actions/artifact' +import * as os from 'os' import {resolve} from 'path' import {Inputs, Outputs} from './constants' @@ -8,6 +9,15 @@ async function run(): Promise { const name = core.getInput(Inputs.Name, {required: false}) const path = core.getInput(Inputs.Path, {required: false}) + let resolvedPath + // resolve tilde expansions, path.replace only replaces the first occurrence of a pattern + if (path.startsWith(`~`)) { + resolvedPath = resolve(path.replace('~', os.homedir())) + } else { + resolvedPath = resolve(path) + } + core.debug(`Resolved path is ${resolvedPath}`) + const artifactClient = artifact.create() if (!name) { // download all artifacts @@ -15,7 +25,9 @@ async function run(): Promise { core.info( 'Creating an extra directory for each artifact that is being downloaded' ) - const downloadResponse = await artifactClient.downloadAllArtifacts(path) + const downloadResponse = await artifactClient.downloadAllArtifacts( + resolvedPath + ) core.info(`There were ${downloadResponse.length} artifacts downloaded`) for (const artifact of downloadResponse) { core.info( @@ -30,7 +42,7 @@ async function run(): Promise { } const downloadResponse = await artifactClient.downloadArtifact( name, - path, + resolvedPath, downloadOptions ) core.info( @@ -39,7 +51,7 @@ async function run(): Promise { } // output the directory that the artifact(s) was/were downloaded to // if no path is provided, an empty string resolves to the current working directory - core.setOutput(Outputs.DownloadPath, resolve(path)) + core.setOutput(Outputs.DownloadPath, resolvedPath) core.info('Artifact download has finished successfully') } catch (err) { core.setFailed(err.message)