Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(cache): support passing extra tar args #1699

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 12 additions & 5 deletions packages/cache/src/cache.ts
Expand Up @@ -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) {
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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)
}
Expand Down
25 changes: 20 additions & 5 deletions packages/cache/src/internal/tar.ts
Expand Up @@ -11,6 +11,7 @@ import {
TarFilename,
ManifestFilename
} from './constants'
import {ExtraTarOptions} from '../options'

const IS_WINDOWS = process.platform === 'win32'

Expand Down Expand Up @@ -128,7 +129,8 @@ async function getTarArgs(
async function getCommands(
compressionMethod: CompressionMethod,
type: string,
archivePath = ''
archivePath = '',
extraTarOptions: ExtraTarOptions = []
): Promise<string[]> {
let args

Expand All @@ -139,6 +141,7 @@ async function getCommands(
type,
archivePath
)
tarArgs.push(...extraTarOptions)
const compressionArgs =
type !== 'create'
? await getDecompressionProgram(tarPath, compressionMethod, archivePath)
Expand Down Expand Up @@ -272,26 +275,38 @@ 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)
}

// Create a tar
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)
}
6 changes: 6 additions & 0 deletions packages/cache/src/options.ts
Expand Up @@ -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.
*
Expand Down