Skip to content

Commit

Permalink
fix(versioning/hashicorp): allow != in ranges, constraints (#23492)
Browse files Browse the repository at this point in the history
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
  • Loading branch information
RahulGautamSingh and viceice committed Jul 25, 2023
1 parent d255f81 commit ce1be2c
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 12 deletions.
17 changes: 17 additions & 0 deletions lib/modules/versioning/common.ts
@@ -1,7 +1,24 @@
import { regEx } from '../../util/regex';
import type { VersioningApi, VersioningApiConstructor } from './types';

export function isVersioningApiConstructor(
obj: VersioningApi | VersioningApiConstructor
): obj is VersioningApiConstructor {
return typeof obj === 'function';
}

export function getExcludedVersions(range: string): string[] {
return range
.split(',')
.map((v) => v.trim())
.filter((version) => regEx(/^!=/).test(version))
.map((version) => version.replace('!=', '').trim());
}

export function getFilteredRange(range: string): string {
return range
.split(',')
.map((v) => v.trim())
.filter((version) => !regEx(/^!=/).test(version))
.join(',');
}
23 changes: 14 additions & 9 deletions lib/modules/versioning/hashicorp/index.spec.ts
Expand Up @@ -2,9 +2,11 @@ import { api as semver } from '.';

describe('modules/versioning/hashicorp/index', () => {
it.each`
version | range | expected
${'4.2.0'} | ${'~> 4.0'} | ${true}
${'4.2.0'} | ${'~> 4.0.0'} | ${false}
version | range | expected
${'4.2.0'} | ${'~> 4.0'} | ${true}
${'4.2.0'} | ${'~> 4.0.0'} | ${false}
${'4.2.0'} | ${'~> 4.0, != 4.2.0'} | ${false}
${'4.2.6'} | ${'~> 4.0, != 4.2.0'} | ${true}
`(
'matches("$version", "$range") === $expected',
({ version, range, expected }) => {
Expand All @@ -13,9 +15,10 @@ describe('modules/versioning/hashicorp/index', () => {
);

it.each`
versions | range | expected
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~> 4.0'} | ${'4.2.0'}
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~> 4.0.0'} | ${'4.0.0'}
versions | range | expected
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~> 4.0'} | ${'4.2.0'}
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~> 4.0.0'} | ${'4.0.0'}
${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'!=4.2.0, > 4.0.0'} | ${'5.0.0'}
`(
'getSatisfyingVersion($versions, "$range") === $expected',
({ versions, range, expected }) => {
Expand Down Expand Up @@ -54,9 +57,11 @@ describe('modules/versioning/hashicorp/index', () => {
);

it.each`
versions | range | expected
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0'} | ${'4.2.0'}
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0.0'} | ${null}
versions | range | expected
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0'} | ${'4.2.0'}
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0.0'} | ${null}
${['0.4.0', '0.5.0', '4.2.0', '5.0.0']} | ${'~> 4.0, != 4.2.0'} | ${null}
${['0.4.0', '0.5.0', '4.2.0', '4.1.0']} | ${'~> 4.0, != 4.2.0'} | ${'4.1.0'}
`(
'minSatisfyingVersion($versions, "$range") === $expected',
({ versions, range, expected }) => {
Expand Down
32 changes: 29 additions & 3 deletions lib/modules/versioning/hashicorp/index.ts
@@ -1,5 +1,6 @@
import { logger } from '../../../logger';
import type { RangeStrategy } from '../../../types/versioning';
import { getExcludedVersions, getFilteredRange } from '../common';
import { api as npm } from '../npm';
import type { NewValueConfig, VersioningApi } from '../types';
import { hashicorp2npm, npm2hashicorp } from './convertor';
Expand Down Expand Up @@ -34,21 +35,46 @@ export function isValid(input: string): boolean {
}

function matches(version: string, range: string): boolean {
return isValid(range) && npm.matches(version, hashicorp2npm(range));
const excludedVersions = getExcludedVersions(range);
if (excludedVersions.includes(version)) {
return false;
}

const filteredRange = getFilteredRange(range);
return (
isValid(filteredRange) && npm.matches(version, hashicorp2npm(filteredRange))
);
}

function getSatisfyingVersion(
versions: string[],
range: string
): string | null {
return npm.getSatisfyingVersion(versions, hashicorp2npm(range));
const excludedVersions = getExcludedVersions(range);
const filteredRange = getFilteredRange(range);
const filteredVersions = versions.filter(
(version) => !excludedVersions.includes(version)
);

return npm.getSatisfyingVersion(
filteredVersions,
hashicorp2npm(filteredRange)
);
}

function minSatisfyingVersion(
versions: string[],
range: string
): string | null {
return npm.minSatisfyingVersion(versions, hashicorp2npm(range));
const excludedVersions = getExcludedVersions(range);
const filteredRange = getFilteredRange(range);
const filteredVersions = versions.filter(
(version) => !excludedVersions.includes(version)
);
return npm.minSatisfyingVersion(
filteredVersions,
hashicorp2npm(filteredRange)
);
}

function getNewValue({
Expand Down

0 comments on commit ce1be2c

Please sign in to comment.