Skip to content

Commit

Permalink
feat(changelog): improve release detection (#25050)
Browse files Browse the repository at this point in the history
Co-authored-by: Rhys Arkins <rhys@arkins.net>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
Co-authored-by: Sergei Zharinov <zharinov@users.noreply.github.com>
  • Loading branch information
4 people committed Oct 16, 2023
1 parent d53bc53 commit 97f3f0d
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 6 deletions.
12 changes: 12 additions & 0 deletions lib/workers/repository/update/pr/changelog/releases.spec.ts
Expand Up @@ -122,5 +122,17 @@ describe('workers/repository/update/pr/changelog/releases', () => {
{ version: '1.2.0' },
]);
});

it('should return any previous version if current version is non-existent', async () => {
const config = partial<BranchUpgradeConfig>({
datasource: 'some-datasource',
packageName: 'some-depname',
versioning: npmVersioning.id,
currentVersion: '1.0.2',
newVersion: '1.1.0',
});
const res = await releases.getInRangeReleases(config);
expect(res).toEqual([{ version: '1.0.1' }, { version: '1.1.0' }]);
});
});
});
37 changes: 31 additions & 6 deletions lib/workers/repository/update/pr/changelog/releases.ts
Expand Up @@ -41,22 +41,47 @@ export async function getInRangeReleases(
const pkgReleases = (await getPkgReleases(config))!.releases;
const version = get(versioning);

const releases = pkgReleases
const previousReleases = pkgReleases
.filter((release) =>
version.isCompatible(release.version, currentVersion)
)
.filter(
(release) =>
version.equals(release.version, currentVersion) ||
version.isGreaterThan(release.version, currentVersion)
)
.filter((release) => !version.isGreaterThan(release.version, newVersion))
.filter(
(release) =>
version.isStable(release.version) ||
matchesUnstable(version, currentVersion, release.version) ||
matchesUnstable(version, newVersion, release.version)
);

const releases = previousReleases.filter(
(release) =>
version.equals(release.version, currentVersion) ||
version.isGreaterThan(release.version, currentVersion)
);

/**
* If there is only one release, it can be one of two things:
*
* 1. There really is only one release
*
* 2. Pinned version doesn't actually exist, i.e pinning `^1.2.3` to `1.2.3`
* while only `1.2.2` and `1.2.4` exist.
*/
if (releases.length === 1) {
const newRelease = releases[0];
const closestPreviousRelease = previousReleases
.filter((release) => !version.equals(release.version, newVersion))
.sort((b, a) => version.sortVersions(a.version, b.version))
.shift();

if (
closestPreviousRelease &&
closestPreviousRelease.version !== newRelease.version
) {
releases.unshift(closestPreviousRelease);
}
}

if (version.valueToVersion) {
for (const release of coerceArray(releases)) {
release.version = version.valueToVersion(release.version);
Expand Down

0 comments on commit 97f3f0d

Please sign in to comment.