Merge pull request #90 from gradle/dd/windows-locks

Allow time for processes to delete file locks on windows
This commit is contained in:
Daz DeBoer 2021-10-05 01:30:13 +02:00 committed by GitHub
commit 29894757f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 31 additions and 7 deletions

2
dist/main/index.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
dist/post/index.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -5,7 +5,7 @@ import * as core from '@actions/core'
import * as glob from '@actions/glob'
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
const CACHE_PATH = ['caches', 'notifications']
@ -141,7 +141,7 @@ export class GradleUserHomeCache extends AbstractCache {
if (commonArtifactFiles.length === 0) {
this.debug(`No files found to cache for ${bundle}`)
if (fs.existsSync(cacheMetaFile)) {
fs.unlinkSync(cacheMetaFile)
tryDelete(cacheMetaFile)
}
return
}
@ -164,7 +164,7 @@ export class GradleUserHomeCache extends AbstractCache {
}
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 crypto from 'crypto'
import * as path from 'path'
import * as fs from 'fs'
export function isCacheDisabled(): boolean {
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 {
key: string
restoreKeys: string[]