tool-cache: Support for extracting xar compatible archives (#207)

* Test xar extraction

* Support for extracting xar compatible archives

* Only allow extractXar on mac

* Create xar during test instead of using prebuilt

* Update lockfiles

* Add verbose flag if debug

* Add extractXar example to readme

* Revert "Update lockfiles"

This reverts commit a6cbddccf6.

* Use node pkg in example

* Remove and ignore prebuilt xar

* Tests for non-existing dir and without flags

* Better arguments handling

* Make sure that target directory exists

Co-authored-by: Thomas Boop <52323235+thboop@users.noreply.github.com>
This commit is contained in:
Frederik Wallner
2020-07-15 20:49:23 +02:00
committed by GitHub
parent 7e1c59c51e
commit 2710592b73
7 changed files with 159 additions and 0 deletions

View File

@@ -23,6 +23,7 @@ export class HTTPError extends Error {
}
const IS_WINDOWS = process.platform === 'win32'
const IS_MAC = process.platform === 'darwin'
const userAgent = 'actions/tool-cache'
/**
@@ -276,6 +277,43 @@ export async function extractTar(
return dest
}
/**
* Extract a xar compatible archive
*
* @param file path to the archive
* @param dest destination directory. Optional.
* @param flags flags for the xar. Optional.
* @returns path to the destination directory
*/
export async function extractXar(
file: string,
dest?: string,
flags: string | string[] = []
): Promise<string> {
ok(IS_MAC, 'extractXar() not supported on current OS')
ok(file, 'parameter "file" is required')
dest = await _createExtractFolder(dest)
let args: string[]
if (flags instanceof Array) {
args = flags
} else {
args = [flags]
}
args.push('-x', '-C', dest, '-f', file)
if (core.isDebug()) {
args.push('-v')
}
const xarPath: string = await io.which('xar', true)
await exec(`"${xarPath}"`, _unique(args))
return dest
}
/**
* Extract a zip
*
@@ -675,3 +713,11 @@ function _getGlobal<T>(key: string, defaultValue: T): T {
/* eslint-enable @typescript-eslint/no-explicit-any */
return value !== undefined ? value : defaultValue
}
/**
* Returns an array of unique values.
* @param values Values to make unique.
*/
function _unique<T>(values: T[]): T[] {
return Array.from(new Set(values))
}