diff --git a/packages/cache/__tests__/cacheUtils.test.ts b/packages/cache/__tests__/cacheUtils.test.ts index 670a8ce5..fb96ab58 100644 --- a/packages/cache/__tests__/cacheUtils.test.ts +++ b/packages/cache/__tests__/cacheUtils.test.ts @@ -48,17 +48,7 @@ test('isGhes returns false for github.com', async () => { expect(cacheUtils.isGhes()).toBe(false) }) -test('isGhes returns false for ghe.com', async () => { - process.env.GITHUB_SERVER_URL = 'https://github.ghe.com' - expect(cacheUtils.isGhes()).toBe(false) -}) - test('isGhes returns true for enterprise URL', async () => { process.env.GITHUB_SERVER_URL = 'https://my-enterprise.github.com' expect(cacheUtils.isGhes()).toBe(true) }) - -test('isGhes returns false for ghe.localhost', () => { - process.env.GITHUB_SERVER_URL = 'https://github.ghe.localhost' - expect(cacheUtils.isGhes()).toBe(false) -}) \ No newline at end of file diff --git a/packages/cache/src/internal/cacheUtils.ts b/packages/cache/src/internal/cacheUtils.ts index c1f4564c..64b7dfcf 100644 --- a/packages/cache/src/internal/cacheUtils.ts +++ b/packages/cache/src/internal/cacheUtils.ts @@ -7,11 +7,7 @@ import * as path from 'path' import * as semver from 'semver' import * as util from 'util' import {v4 as uuidV4} from 'uuid' -import { - CacheFilename, - CompressionMethod, - GnuTarPathOnWindows -} from './constants' +import {CacheFilename, CompressionMethod} from './constants' // From https://github.com/actions/toolkit/blob/main/packages/tool-cache/src/tool-cache.ts#L23 export async function createTempDirectory(): Promise { @@ -56,12 +52,7 @@ export async function resolvePaths(patterns: string[]): Promise { .replace(new RegExp(`\\${path.sep}`, 'g'), '/') core.debug(`Matched: ${relativeFile}`) // Paths are made relative so the tar entries are all relative to the root of the workspace. - if (relativeFile === '') { - // path.relative returns empty string if workspace and file are equal - paths.push('.') - } else { - paths.push(`${relativeFile}`) - } + paths.push(`${relativeFile}`) } return paths @@ -71,15 +62,11 @@ export async function unlinkFile(filePath: fs.PathLike): Promise { return util.promisify(fs.unlink)(filePath) } -async function getVersion( - app: string, - additionalArgs: string[] = [] -): Promise { +async function getVersion(app: string): Promise { + core.debug(`Checking ${app} --version`) let versionOutput = '' - additionalArgs.push('--version') - core.debug(`Checking ${app} ${additionalArgs.join(' ')}`) try { - await exec.exec(`${app}`, additionalArgs, { + await exec.exec(`${app} --version`, [], { ignoreReturnCode: true, silent: true, listeners: { @@ -98,14 +85,23 @@ async function getVersion( // Use zstandard if possible to maximize cache performance export async function getCompressionMethod(): Promise { - const versionOutput = await getVersion('zstd', ['--quiet']) - const version = semver.clean(versionOutput) - core.debug(`zstd version: ${version}`) - - if (versionOutput === '') { + if (process.platform === 'win32' && !(await isGnuTarInstalled())) { + // Disable zstd due to bug https://github.com/actions/cache/issues/301 return CompressionMethod.Gzip - } else { + } + + const versionOutput = await getVersion('zstd') + const version = semver.clean(versionOutput) + + if (!versionOutput.toLowerCase().includes('zstd command line interface')) { + // zstd is not installed + return CompressionMethod.Gzip + } else if (!version || semver.lt(version, 'v1.3.2')) { + // zstd is installed but using a version earlier than v1.3.2 + // v1.3.2 is required to use the `--long` options in zstd return CompressionMethod.ZstdWithoutLong + } else { + return CompressionMethod.Zstd } } @@ -115,12 +111,9 @@ export function getCacheFileName(compressionMethod: CompressionMethod): string { : CacheFilename.Zstd } -export async function getGnuTarPathOnWindows(): Promise { - if (fs.existsSync(GnuTarPathOnWindows)) { - return GnuTarPathOnWindows - } +export async function isGnuTarInstalled(): Promise { const versionOutput = await getVersion('tar') - return versionOutput.toLowerCase().includes('gnu tar') ? io.which('tar') : '' + return versionOutput.toLowerCase().includes('gnu tar') } export function assertDefined(name: string, value?: T): T { @@ -135,14 +128,5 @@ export function isGhes(): boolean { const ghUrl = new URL( process.env['GITHUB_SERVER_URL'] || 'https://github.com' ) - - let githubHosts = [ - 'GITHUB.COM', - 'GITHUB.GHE.COM', - 'GITHUB.GHE.LOCALHOST' -]; - - const hostname = ghUrl.hostname.trimEnd().toUpperCase() - - return !githubHosts.includes(hostname) -} + return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM' +} \ No newline at end of file