From 05bf82e7206059ec15047038e930e677b574091d Mon Sep 17 00:00:00 2001 From: daz Date: Thu, 29 Aug 2024 12:22:33 -0600 Subject: [PATCH] Handle snapshots when comparing Gradle versions --- .../caching/gradle-home-extry-extractor.ts | 5 +-- sources/src/execution/gradle.ts | 17 ++++++++ sources/test/jest/gradle-version.test.ts | 41 +++++++++++++++++++ 3 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 sources/test/jest/gradle-version.test.ts diff --git a/sources/src/caching/gradle-home-extry-extractor.ts b/sources/src/caching/gradle-home-extry-extractor.ts index 35a1f48..5dc5299 100644 --- a/sources/src/caching/gradle-home-extry-extractor.ts +++ b/sources/src/caching/gradle-home-extry-extractor.ts @@ -2,7 +2,6 @@ import path from 'path' import fs from 'fs' import * as core from '@actions/core' import * as glob from '@actions/glob' -import * as semver from 'semver' import {CacheEntryListener, CacheListener} from './cache-reporting' import {cacheDebug, hashFileNames, isCacheDebuggingEnabled, restoreCache, saveCache, tryDelete} from './cache-utils' @@ -10,6 +9,7 @@ import {cacheDebug, hashFileNames, isCacheDebuggingEnabled, restoreCache, saveCa import {BuildResult, loadBuildResults} from '../build-results' import {CacheConfig, ACTION_METADATA_DIR} from '../configuration' import {getCacheKeyBase} from './cache-key' +import { versionIsAtLeast } from '../execution/gradle' const SKIP_RESTORE_VAR = 'GRADLE_BUILD_ACTION_SKIP_RESTORE' const CACHE_PROTOCOL_VERSION = 'v1' @@ -434,8 +434,7 @@ export class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor { // If any associated build result used Gradle < 8.6, then mark it as not cacheable if ( pathResults.find(result => { - const gradleVersion = semver.coerce(result.gradleVersion) - return gradleVersion && semver.lt(gradleVersion, '8.6.0') + return !versionIsAtLeast(result.gradleVersion, '8.6.0') }) ) { core.info( diff --git a/sources/src/execution/gradle.ts b/sources/src/execution/gradle.ts index 35f09e4..5f6f745 100644 --- a/sources/src/execution/gradle.ts +++ b/sources/src/execution/gradle.ts @@ -1,6 +1,8 @@ import * as core from '@actions/core' import * as exec from '@actions/exec' +import * as semver from 'semver' + import * as provisioner from './provision' import * as gradlew from './gradlew' @@ -31,3 +33,18 @@ async function executeGradleBuild(executable: string | undefined, root: string, core.setFailed(`Gradle build failed: see console output for details`) } } + +export function versionIsAtLeast(actualVersion: string, requiredVersion: string): boolean { + const splitVersion = actualVersion.split('-') + const coreVersion = splitVersion[0] + const prerelease = splitVersion.length > 1 + + const actualSemver = semver.coerce(coreVersion)! + const comparisonSemver = semver.coerce(requiredVersion)! + + if (prerelease) { + return semver.gt(actualSemver, comparisonSemver) + } else { + return semver.gte(actualSemver, comparisonSemver) + } +} diff --git a/sources/test/jest/gradle-version.test.ts b/sources/test/jest/gradle-version.test.ts new file mode 100644 index 0000000..3f3b959 --- /dev/null +++ b/sources/test/jest/gradle-version.test.ts @@ -0,0 +1,41 @@ +import { versionIsAtLeast } from '../../src/execution/gradle' + +describe('gradle-version', () => { + describe('can compare to', () => { + it('same version', async () => { + expect(versionIsAtLeast('6.7.1', '6.7.1')).toBe(true) + expect(versionIsAtLeast('7.0', '7.0')).toBe(true) + expect(versionIsAtLeast('7.0', '7.0.0')).toBe(true) + }) + it('newer version', async () => { + expect(versionIsAtLeast('6.7.1', '6.7.2')).toBe(false) + expect(versionIsAtLeast('7.0', '8.0')).toBe(false) + expect(versionIsAtLeast('7.0', '7.0.1')).toBe(false) + }) + it('older version', async () => { + expect(versionIsAtLeast('6.7.2', '6.7.1')).toBe(true) + expect(versionIsAtLeast('8.0', '7.0')).toBe(true) + expect(versionIsAtLeast('7.0.1', '7.0')).toBe(true) + }) + it('rc version', async () => { + expect(versionIsAtLeast('8.0.2-rc-1', '8.0.1')).toBe(true) + expect(versionIsAtLeast('8.0.2-rc-1', '8.0.2')).toBe(false) + expect(versionIsAtLeast('8.1-rc-1', '8.0')).toBe(true) + expect(versionIsAtLeast('8.0-rc-1', '8.0')).toBe(false) + }) + it('snapshot version', async () => { + expect(versionIsAtLeast('8.11-20240829002031+0000', '8.10')).toBe(true) + expect(versionIsAtLeast('8.11-20240829002031+0000', '8.10.1')).toBe(true) + expect(versionIsAtLeast('8.11-20240829002031+0000', '8.11')).toBe(false) + + expect(versionIsAtLeast('8.10.2-20240828012138+0000', '8.10')).toBe(true) + expect(versionIsAtLeast('8.10.2-20240828012138+0000', '8.10.1')).toBe(true) + expect(versionIsAtLeast('8.10.2-20240828012138+0000', '8.10.2')).toBe(false) + expect(versionIsAtLeast('8.10.2-20240828012138+0000', '8.11')).toBe(false) + + expect(versionIsAtLeast('9.1-branch-provider_api_migration_public_api_changes-20240826121451+0000', '9.0')).toBe(true) + expect(versionIsAtLeast('9.1-branch-provider_api_migration_public_api_changes-20240826121451+0000', '9.0.1')).toBe(true) + expect(versionIsAtLeast('9.1-branch-provider_api_migration_public_api_changes-20240826121451+0000', '9.1')).toBe(false) + }) + }) +})