Allow time for processes to release file locks on windows

This commit is contained in:
Daz DeBoer 2021-10-04 23:59:08 +02:00
parent c000a0b58f
commit 4968d2280b
No known key found for this signature in database
GPG Key ID: DD6B9F0B06683D5D
2 changed files with 27 additions and 3 deletions

View File

@ -5,7 +5,7 @@ import * as core from '@actions/core'
import * as glob from '@actions/glob' import * as glob from '@actions/glob'
import * as exec from '@actions/exec' import * as exec from '@actions/exec'
import {AbstractCache, hashFileNames} from './cache-utils' import {AbstractCache, hashFileNames, tryDelete} from './cache-utils'
// Which paths under Gradle User Home should be cached // Which paths under Gradle User Home should be cached
const CACHE_PATH = ['caches', 'notifications'] const CACHE_PATH = ['caches', 'notifications']
@ -141,7 +141,7 @@ export class GradleUserHomeCache extends AbstractCache {
if (commonArtifactFiles.length === 0) { if (commonArtifactFiles.length === 0) {
this.debug(`No files found to cache for ${bundle}`) this.debug(`No files found to cache for ${bundle}`)
if (fs.existsSync(cacheMetaFile)) { if (fs.existsSync(cacheMetaFile)) {
fs.unlinkSync(cacheMetaFile) tryDelete(cacheMetaFile)
} }
return return
} }
@ -164,7 +164,7 @@ export class GradleUserHomeCache extends AbstractCache {
} }
for (const file of commonArtifactFiles) { for (const file of commonArtifactFiles) {
fs.unlinkSync(file) tryDelete(file)
} }
} }

View File

@ -3,6 +3,7 @@ import * as cache from '@actions/cache'
import * as github from '@actions/github' import * as github from '@actions/github'
import * as crypto from 'crypto' import * as crypto from 'crypto'
import * as path from 'path' import * as path from 'path'
import * as fs from 'fs'
export function isCacheDisabled(): boolean { export function isCacheDisabled(): boolean {
return core.getBooleanInput('cache-disabled') return core.getBooleanInput('cache-disabled')
@ -60,6 +61,29 @@ export function hashFileNames(fileNames: string[]): string {
) )
} }
/**
* Attempt to delete a file, waiting to allow locks to be released
*/
export async function tryDelete(file: string): Promise<void> {
for (let count = 0; count < 3; count++) {
try {
fs.unlinkSync(file)
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))
}
class CacheKey { class CacheKey {
key: string key: string
restoreKeys: string[] restoreKeys: string[]