Skip to content

Commit d88f6a4

Browse files
authoredJul 5, 2024··
refactor: Lookup filtering of unstable releases (#30054)
1 parent 3e3bb63 commit d88f6a4

File tree

2 files changed

+70
-38
lines changed

2 files changed

+70
-38
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,38 @@
11
import { partial } from '../../../../../test/util';
2+
import type { Release } from '../../../../modules/datasource/types';
23
import * as allVersioning from '../../../../modules/versioning';
34
import { filterVersions } from './filter';
45
import type { FilterConfig } from './types';
56

67
const versioning = allVersioning.get('semver');
78

8-
const releases = [
9-
{
10-
version: '1.0.1',
11-
releaseTimestamp: '2021-01-01T00:00:01.000Z',
12-
},
13-
{
14-
version: '1.2.0',
15-
releaseTimestamp: '2021-01-03T00:00:00.000Z',
16-
},
17-
{
18-
version: '2.0.0',
19-
releaseTimestamp: '2021-01-05T00:00:00.000Z',
20-
},
21-
{
22-
version: '2.1.0',
23-
releaseTimestamp: '2021-01-07T00:00:00.000Z',
24-
},
25-
// for coverage
26-
{
27-
version: 'invalid.version',
28-
releaseTimestamp: '2021-01-07T00:00:00.000Z',
29-
},
30-
];
31-
329
describe('workers/repository/process/lookup/filter', () => {
3310
describe('.filterVersions()', () => {
3411
it('should filter versions allowed by semver syntax when allowedVersions is not valid version, range or pypi syntax', () => {
12+
const releases = [
13+
{
14+
version: '1.0.1',
15+
releaseTimestamp: '2021-01-01T00:00:01.000Z',
16+
},
17+
{
18+
version: '1.2.0',
19+
releaseTimestamp: '2021-01-03T00:00:00.000Z',
20+
},
21+
{
22+
version: '2.0.0',
23+
releaseTimestamp: '2021-01-05T00:00:00.000Z',
24+
},
25+
{
26+
version: '2.1.0',
27+
releaseTimestamp: '2021-01-07T00:00:00.000Z',
28+
},
29+
// for coverage
30+
{
31+
version: 'invalid.version',
32+
releaseTimestamp: '2021-01-07T00:00:00.000Z',
33+
},
34+
] satisfies Release[];
35+
3536
const config = partial<FilterConfig>({
3637
ignoreUnstable: false,
3738
ignoreDeprecated: false,
@@ -41,9 +42,6 @@ describe('workers/repository/process/lookup/filter', () => {
4142
const currentVersion = '1.0.0';
4243
const latestVersion = '2.0.0';
4344

44-
jest.spyOn(versioning, 'isVersion').mockReturnValue(true);
45-
jest.spyOn(versioning, 'isGreaterThan').mockReturnValue(true);
46-
4745
const filteredVersions = filterVersions(
4846
config,
4947
currentVersion,
@@ -57,5 +55,31 @@ describe('workers/repository/process/lookup/filter', () => {
5755
{ version: '2.1.0', releaseTimestamp: '2021-01-07T00:00:00.000Z' },
5856
]);
5957
});
58+
59+
it('allows unstable major upgrades', () => {
60+
const nodeVersioning = allVersioning.get('node');
61+
62+
const releases = [
63+
{ version: '1.0.0-alpha' },
64+
{ version: '1.2.3-beta' },
65+
] satisfies Release[];
66+
67+
const config = partial<FilterConfig>({
68+
ignoreUnstable: true,
69+
ignoreDeprecated: true,
70+
});
71+
const currentVersion = '1.0.0-alpha';
72+
const latestVersion = '1.2.3-beta';
73+
74+
const filteredVersions = filterVersions(
75+
config,
76+
currentVersion,
77+
latestVersion,
78+
releases,
79+
nodeVersioning,
80+
);
81+
82+
expect(filteredVersions).toEqual([{ version: '1.2.3-beta' }]);
83+
});
6084
});
6185
});

‎lib/workers/repository/process/lookup/filter.ts

+19-11
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,11 @@ export function filterVersions(
7878
);
7979
filteredReleases = filteredReleases.filter((r) =>
8080
semver.satisfies(
81-
semver.valid(r.version) ? r.version : semver.coerce(r.version)!,
81+
semver.valid(r.version)
82+
? r.version
83+
: /* istanbul ignore next: not reachable, but it's safer to preserve it */ semver.coerce(
84+
r.version,
85+
)!,
8286
allowedVersions,
8387
),
8488
);
@@ -126,24 +130,28 @@ export function filterVersions(
126130
return filteredReleases.filter((r) => isReleaseStable(r, versioning));
127131
}
128132

129-
// if current is unstable then allow unstable in the current major only
130-
// Allow unstable only in current major
133+
const currentMajor = versioning.getMajor(currentVersion);
134+
const currentMinor = versioning.getMinor(currentVersion);
135+
const currentPatch = versioning.getPatch(currentVersion);
136+
131137
return filteredReleases.filter((r) => {
132138
if (isReleaseStable(r, versioning)) {
133139
return true;
134140
}
135-
if (
136-
versioning.getMajor(r.version) !== versioning.getMajor(currentVersion)
137-
) {
141+
142+
const major = versioning.getMajor(r.version);
143+
144+
if (major !== currentMajor) {
138145
return false;
139146
}
140-
// istanbul ignore if: test passes without touching this
147+
141148
if (versioning.allowUnstableMajorUpgrades) {
142149
return true;
143150
}
144-
return (
145-
versioning.getMinor(r.version) === versioning.getMinor(currentVersion) &&
146-
versioning.getPatch(r.version) === versioning.getPatch(currentVersion)
147-
);
151+
152+
const minor = versioning.getMinor(r.version);
153+
const patch = versioning.getPatch(r.version);
154+
155+
return minor === currentMinor && patch === currentPatch;
148156
});
149157
}

0 commit comments

Comments
 (0)
Please sign in to comment.