diff --git a/packages/cache/src/cache.ts b/packages/cache/src/cache.ts index f7fadb6f7f..c799609bdf 100644 --- a/packages/cache/src/cache.ts +++ b/packages/cache/src/cache.ts @@ -3,7 +3,7 @@ import * as path from 'path' import * as utils from './internal/cacheUtils' import * as cacheHttpClient from './internal/cacheHttpClient' import {createTar, extractTar, listTar} from './internal/tar' -import {DownloadOptions, UploadOptions} from './options' +import {DownloadOptions, ExtraTarArgs, UploadOptions} from './options' export class ValidationError extends Error { constructor(message: string) { @@ -68,7 +68,8 @@ export async function restoreCache( primaryKey: string, restoreKeys?: string[], options?: DownloadOptions, - enableCrossOsArchive = false + enableCrossOsArchive = false, + extraTarArgs: ExtraTarArgs = [] ): Promise { checkPaths(paths) @@ -129,7 +130,7 @@ export async function restoreCache( )} MB (${archiveFileSize} B)` ) - await extractTar(archivePath, compressionMethod) + await extractTar(archivePath, compressionMethod, extraTarArgs) core.info('Cache restored successfully') return cacheEntry.cacheKey @@ -166,7 +167,8 @@ export async function saveCache( paths: string[], key: string, options?: UploadOptions, - enableCrossOsArchive = false + enableCrossOsArchive = false, + extraTarArgs: ExtraTarArgs = [] ): Promise { checkPaths(paths) checkKey(key) @@ -193,7 +195,7 @@ export async function saveCache( core.debug(`Archive Path: ${archivePath}`) try { - await createTar(archiveFolder, cachePaths, compressionMethod) + await createTar(archiveFolder, cachePaths, compressionMethod, extraTarArgs) if (core.isDebug()) { await listTar(archivePath, compressionMethod) } diff --git a/packages/cache/src/internal/tar.ts b/packages/cache/src/internal/tar.ts index adf610694f..2c2cb65cbc 100644 --- a/packages/cache/src/internal/tar.ts +++ b/packages/cache/src/internal/tar.ts @@ -11,6 +11,7 @@ import { TarFilename, ManifestFilename } from './constants' +import {ExtraTarArgs} from '../options' const IS_WINDOWS = process.platform === 'win32' @@ -128,7 +129,8 @@ async function getTarArgs( async function getCommands( compressionMethod: CompressionMethod, type: string, - archivePath = '' + archivePath = '', + extraTarArgs: ExtraTarArgs = [] ): Promise { let args @@ -139,6 +141,7 @@ async function getCommands( type, archivePath ) + tarArgs.push(...extraTarArgs) const compressionArgs = type !== 'create' ? await getDecompressionProgram(tarPath, compressionMethod, archivePath) @@ -272,12 +275,18 @@ export async function listTar( // Extract a tar export async function extractTar( archivePath: string, - compressionMethod: CompressionMethod + compressionMethod: CompressionMethod, + extraTarArgs: ExtraTarArgs = [] ): Promise { // Create directory to extract tar into const workingDirectory = getWorkingDirectory() await io.mkdirP(workingDirectory) - const commands = await getCommands(compressionMethod, 'extract', archivePath) + const commands = await getCommands( + compressionMethod, + 'extract', + archivePath, + extraTarArgs + ) await execCommands(commands) } @@ -285,13 +294,19 @@ export async function extractTar( export async function createTar( archiveFolder: string, sourceDirectories: string[], - compressionMethod: CompressionMethod + compressionMethod: CompressionMethod, + extraTarArgs: ExtraTarArgs = [] ): Promise { // Write source directories to manifest.txt to avoid command length limits writeFileSync( path.join(archiveFolder, ManifestFilename), sourceDirectories.join('\n') ) - const commands = await getCommands(compressionMethod, 'create') + const commands = await getCommands( + compressionMethod, + 'create', + undefined, + extraTarArgs + ) await execCommands(commands, archiveFolder) } diff --git a/packages/cache/src/options.ts b/packages/cache/src/options.ts index d768ff5464..659af18038 100644 --- a/packages/cache/src/options.ts +++ b/packages/cache/src/options.ts @@ -70,6 +70,12 @@ export interface DownloadOptions { lookupOnly?: boolean } +/** + * Options to control tar commands + */ + +export type ExtraTarArgs = string[] + /** * Returns a copy of the upload options with defaults filled in. *