diff --git a/__test__/git-version.test.ts b/__test__/git-version.test.ts index 740d46e7..daf9f416 100644 --- a/__test__/git-version.test.ts +++ b/__test__/git-version.test.ts @@ -45,6 +45,31 @@ describe('git-version tests', () => { expect(version.checkMinimum(new GitVersion('5.1.2'))).toBeFalsy() }) + it('compares an explicit patch of zero', async () => { + // A patch component of zero must be compared, not treated as unspecified + // (0 is falsy). A patch left unspecified by a two-part version such as + // "2.28" is treated as satisfying any patch of that minor version. + expect( + new GitVersion('4.5.0').checkMinimum(new GitVersion('4.5.1')) + ).toBeFalsy() + expect( + new GitVersion('2.28.0').checkMinimum(new GitVersion('2.28.1')) + ).toBeFalsy() + expect( + new GitVersion('4.5.0').checkMinimum(new GitVersion('4.5.0')) + ).toBeTruthy() + expect( + new GitVersion('4.5.0').checkMinimum(new GitVersion('4.5')) + ).toBeTruthy() + expect( + new GitVersion('4.5.1').checkMinimum(new GitVersion('4.5.0')) + ).toBeTruthy() + // Unspecified patch satisfies any patch of the same minor version + expect( + new GitVersion('4.5').checkMinimum(new GitVersion('4.5.0')) + ).toBeTruthy() + }) + it('sparse checkout', async () => { const minSparseVer = MinimumGitSparseCheckoutVersion expect(new GitVersion('1.0').checkMinimum(minSparseVer)).toBeFalsy() diff --git a/dist/index.js b/dist/index.js index 06ae5d22..0d56dda7 100644 --- a/dist/index.js +++ b/dist/index.js @@ -35553,8 +35553,12 @@ class GitVersion { } // Minor is equal if (this.minor === minimum.minor) { - // Patch is insufficient - if (this.patch && this.patch < (minimum.patch || 0)) { + // Patch is insufficient. The patch component is only compared when it + // was explicitly specified: an instance built from a two-part version + // (e.g. "2.28") leaves patch as NaN, which is treated as satisfying any + // patch of that minor version. An explicit zero must not be mistaken for + // an unspecified value, because 0 is falsy. + if (!Number.isNaN(this.patch) && this.patch < (minimum.patch || 0)) { return false; } } diff --git a/src/git-version.ts b/src/git-version.ts index 44bee1ae..ef02243c 100644 --- a/src/git-version.ts +++ b/src/git-version.ts @@ -43,8 +43,12 @@ export class GitVersion { // Minor is equal if (this.minor === minimum.minor) { - // Patch is insufficient - if (this.patch && this.patch < (minimum.patch || 0)) { + // Patch is insufficient. The patch component is only compared when it + // was explicitly specified: an instance built from a two-part version + // (e.g. "2.28") leaves patch as NaN, which is treated as satisfying any + // patch of that minor version. An explicit zero must not be mistaken for + // an unspecified value, because 0 is falsy. + if (!Number.isNaN(this.patch) && this.patch < (minimum.patch || 0)) { return false } }