2021-08-24 12:57:17 -06:00
|
|
|
import * as core from '@actions/core'
|
2021-11-05 06:54:31 -06:00
|
|
|
import * as cache from '@actions/cache'
|
2021-09-05 21:35:17 -06:00
|
|
|
import * as crypto from 'crypto'
|
2021-09-27 21:05:17 -06:00
|
|
|
import * as path from 'path'
|
2021-10-04 23:59:08 +02:00
|
|
|
import * as fs from 'fs'
|
2021-08-24 12:57:17 -06:00
|
|
|
|
2021-10-27 16:05:07 -06:00
|
|
|
const CACHE_DISABLED_PARAMETER = 'cache-disabled'
|
|
|
|
const CACHE_READONLY_PARAMETER = 'cache-read-only'
|
|
|
|
const CACHE_DEBUG_VAR = 'GRADLE_BUILD_ACTION_CACHE_DEBUG_ENABLED'
|
|
|
|
const CACHE_PREFIX_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_PREFIX'
|
|
|
|
|
2021-09-12 14:26:38 -06:00
|
|
|
export function isCacheDisabled(): boolean {
|
2021-10-27 16:05:07 -06:00
|
|
|
return core.getBooleanInput(CACHE_DISABLED_PARAMETER)
|
2021-08-24 12:57:17 -06:00
|
|
|
}
|
|
|
|
|
2021-09-12 14:26:38 -06:00
|
|
|
export function isCacheReadOnly(): boolean {
|
2021-10-27 16:05:07 -06:00
|
|
|
return core.getBooleanInput(CACHE_READONLY_PARAMETER)
|
2021-08-24 12:57:17 -06:00
|
|
|
}
|
2021-09-05 17:10:47 -06:00
|
|
|
|
2021-09-12 14:08:22 -06:00
|
|
|
export function isCacheDebuggingEnabled(): boolean {
|
2021-10-27 16:05:07 -06:00
|
|
|
return process.env[CACHE_DEBUG_VAR] ? true : false
|
2021-09-12 14:08:22 -06:00
|
|
|
}
|
|
|
|
|
2021-10-16 09:44:35 -06:00
|
|
|
export function getCacheKeyPrefix(): string {
|
2021-10-16 08:33:42 -06:00
|
|
|
// Prefix can be used to force change all cache keys (defaults to cache protocol version)
|
2021-11-28 10:19:56 -07:00
|
|
|
return process.env[CACHE_PREFIX_VAR] || ''
|
2021-10-16 09:44:35 -06:00
|
|
|
}
|
|
|
|
|
2021-09-05 21:35:17 -06:00
|
|
|
export function hashStrings(values: string[]): string {
|
|
|
|
const hash = crypto.createHash('md5')
|
|
|
|
for (const value of values) {
|
|
|
|
hash.update(value)
|
|
|
|
}
|
|
|
|
return hash.digest('hex')
|
2021-09-05 17:10:47 -06:00
|
|
|
}
|
|
|
|
|
2021-09-27 21:05:17 -06:00
|
|
|
export function hashFileNames(fileNames: string[]): string {
|
2021-10-29 07:34:44 -06:00
|
|
|
return hashStrings(fileNames.map(x => x.replace(new RegExp(`\\${path.sep}`, 'g'), '/')))
|
2021-09-27 21:05:17 -06:00
|
|
|
}
|
|
|
|
|
2021-11-05 06:54:31 -06:00
|
|
|
export function handleCacheFailure(error: unknown, message: string): void {
|
|
|
|
if (error instanceof cache.ValidationError) {
|
|
|
|
// Fail on cache validation errors
|
|
|
|
throw error
|
|
|
|
}
|
|
|
|
if (error instanceof cache.ReserveCacheError) {
|
|
|
|
// Reserve cache errors are expected if the artifact has been previously cached
|
|
|
|
if (isCacheDebuggingEnabled()) {
|
2021-12-08 14:44:57 -07:00
|
|
|
core.info(`${message}: ${error}`)
|
2021-11-05 06:54:31 -06:00
|
|
|
} else {
|
2021-12-08 14:44:57 -07:00
|
|
|
core.debug(`${message}: ${error}`)
|
2021-11-05 06:54:31 -06:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Warn on all other errors
|
|
|
|
core.warning(`${message}: ${error}`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-04 23:59:08 +02:00
|
|
|
/**
|
2021-10-15 14:54:29 -06:00
|
|
|
* Attempt to delete a file or directory, waiting to allow locks to be released
|
2021-10-04 23:59:08 +02:00
|
|
|
*/
|
|
|
|
export async function tryDelete(file: string): Promise<void> {
|
2021-10-15 14:54:29 -06:00
|
|
|
const stat = fs.lstatSync(file)
|
2021-10-04 23:59:08 +02:00
|
|
|
for (let count = 0; count < 3; count++) {
|
|
|
|
try {
|
2021-10-15 14:54:29 -06:00
|
|
|
if (stat.isDirectory()) {
|
|
|
|
fs.rmdirSync(file, {recursive: true})
|
|
|
|
} else {
|
|
|
|
fs.unlinkSync(file)
|
|
|
|
}
|
2021-10-04 23:59:08 +02:00
|
|
|
return
|
|
|
|
} catch (error) {
|
|
|
|
if (count === 2) {
|
|
|
|
throw error
|
|
|
|
} else {
|
|
|
|
core.warning(String(error))
|
|
|
|
await delay(1000)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async function delay(ms: number): Promise<void> {
|
|
|
|
return new Promise(resolve => setTimeout(resolve, ms))
|
|
|
|
}
|