1
0
Fork 0

feat(cache): support passing extra tar options

pull/1699/head
Danila Danko 2024-04-03 00:00:05 +03:00
parent 59e9d284e9
commit 18129f1d50
3 changed files with 38 additions and 10 deletions

View File

@ -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, ExtraTarOptions, 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,
extraTarOptions: ExtraTarOptions = []
): Promise<string | undefined> {
checkPaths(paths)
@ -129,7 +130,7 @@ export async function restoreCache(
)} MB (${archiveFileSize} B)`
)
await extractTar(archivePath, compressionMethod)
await extractTar(archivePath, compressionMethod, extraTarOptions)
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,
extraTarOptions: ExtraTarOptions = []
): Promise<number> {
checkPaths(paths)
checkKey(key)
@ -193,7 +195,12 @@ export async function saveCache(
core.debug(`Archive Path: ${archivePath}`)
try {
await createTar(archiveFolder, cachePaths, compressionMethod)
await createTar(
archiveFolder,
cachePaths,
compressionMethod,
extraTarOptions
)
if (core.isDebug()) {
await listTar(archivePath, compressionMethod)
}

View File

@ -11,6 +11,7 @@ import {
TarFilename,
ManifestFilename
} from './constants'
import {ExtraTarOptions} from '../options'
const IS_WINDOWS = process.platform === 'win32'
@ -128,7 +129,8 @@ async function getTarArgs(
async function getCommands(
compressionMethod: CompressionMethod,
type: string,
archivePath = ''
archivePath = '',
extraTarOptions: ExtraTarOptions = []
): Promise<string[]> {
let args
@ -139,6 +141,7 @@ async function getCommands(
type,
archivePath
)
tarArgs.push(...extraTarOptions)
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,
extraTarOptions: ExtraTarOptions = []
): Promise<void> {
// 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,
extraTarOptions
)
await execCommands(commands)
}
@ -285,13 +294,19 @@ export async function extractTar(
export async function createTar(
archiveFolder: string,
sourceDirectories: string[],
compressionMethod: CompressionMethod
compressionMethod: CompressionMethod,
extraTarOptions: ExtraTarOptions = []
): Promise<void> {
// 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,
extraTarOptions
)
await execCommands(commands, archiveFolder)
}

View File

@ -70,6 +70,12 @@ export interface DownloadOptions {
lookupOnly?: boolean
}
/**
* Additional options passed to tar
*/
export type ExtraTarOptions = string[]
/**
* Returns a copy of the upload options with defaults filled in.
*