From 5a5a5b4387d1a91a0860a9b82dcd88a3fa06399e Mon Sep 17 00:00:00 2001 From: Daz DeBoer Date: Mon, 27 Sep 2021 21:05:17 -0600 Subject: [PATCH] Normalize paths to Gradle User Home when calculating cache keys Fixes #77 --- __tests__/cache-utils.test.ts | 6 ++++++ src/cache-gradle-user-home.ts | 14 ++++++++------ src/cache-utils.ts | 7 +++++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/__tests__/cache-utils.test.ts b/__tests__/cache-utils.test.ts index ded9021..df921c5 100644 --- a/__tests__/cache-utils.test.ts +++ b/__tests__/cache-utils.test.ts @@ -11,5 +11,11 @@ describe('cacheUtils-utils', () => { const hash = cacheUtils.hashStrings(['foo', 'bar', 'baz']) expect(hash).toBe('6df23dc03f9b54cc38a0fc1483df6e21') }) + it('normalized filenames', async () => { + const fileNames = ['/foo/bar/baz.zip', '../boo.html'] + const posixHash = cacheUtils.hashFileNames(fileNames) + const windowsHash = cacheUtils.hashFileNames(fileNames) + expect(posixHash).toBe(windowsHash) + }) }) }) diff --git a/src/cache-gradle-user-home.ts b/src/cache-gradle-user-home.ts index 2f55bb2..b4ac360 100644 --- a/src/cache-gradle-user-home.ts +++ b/src/cache-gradle-user-home.ts @@ -5,7 +5,7 @@ import * as core from '@actions/core' import * as glob from '@actions/glob' import * as exec from '@actions/exec' -import {AbstractCache, hashStrings} from './cache-utils' +import {AbstractCache, hashFileNames} from './cache-utils' // Which paths under Gradle User Home should be cached const CACHE_PATH = ['caches', 'notifications'] @@ -149,10 +149,7 @@ export class GradleUserHomeCache extends AbstractCache { const previouslyRestoredKey = fs.existsSync(cacheMetaFile) ? fs.readFileSync(cacheMetaFile, 'utf-8').trim() : '' - const cacheKey = this.createCacheKey( - bundle, - hashStrings(commonArtifactFiles) - ) + const cacheKey = this.createCacheKey(bundle, commonArtifactFiles) if (previouslyRestoredKey === cacheKey) { this.debug( @@ -171,8 +168,13 @@ export class GradleUserHomeCache extends AbstractCache { } } - protected createCacheKey(bundle: string, key: string): string { + protected createCacheKey(bundle: string, files: string[]): string { const cacheKeyPrefix = process.env['CACHE_KEY_PREFIX'] || '' + const relativeFiles = files.map(x => + path.relative(this.gradleUserHome, x) + ) + const key = hashFileNames(relativeFiles) + return `${cacheKeyPrefix}${bundle}-${key}` } diff --git a/src/cache-utils.ts b/src/cache-utils.ts index 0587694..0c9c57e 100644 --- a/src/cache-utils.ts +++ b/src/cache-utils.ts @@ -2,6 +2,7 @@ import * as core from '@actions/core' import * as cache from '@actions/cache' import * as github from '@actions/github' import * as crypto from 'crypto' +import * as path from 'path' export function isCacheDisabled(): boolean { return core.getBooleanInput('cache-disabled') @@ -53,6 +54,12 @@ export function hashStrings(values: string[]): string { return hash.digest('hex') } +export function hashFileNames(fileNames: string[]): string { + return hashStrings( + fileNames.map(x => x.replace(new RegExp(`\\${path.sep}`, 'g'), '/')) + ) +} + class CacheKey { key: string restoreKeys: string[]