in src/common/github-service.ts [159:206]
public async getUnreleasedPastLabels(version: string): Promise<string[]> {
const v = semver.parse(version);
if (!v) {
// If the version was not valid or we're generating for a major version we're
// not finding anything. We can't do this for major versions, since we don't
// know what the last minor version of the previous major was and searching for
// e.g. v7.* will result in too many matches.
return [];
}
let priorVersionLabels: string[];
if (v.minor === 1) {
// If we're generating for a x.1.y version, check the x.0 version and the highest
// minor of the previous major.
priorVersionLabels = [
...(await this.getHighestVersionsForMajor(v.major - 1, 1)),
...(await this.getVersionsForMinor(v.major, [v.minor - 1])),
];
} else if (v.minor === 0) {
// If we're generating for a x.0.y version, check the two highest minors of the previous major
priorVersionLabels = await this.getHighestVersionsForMajor(v.major - 1, 2);
} else {
// In other cases just check the previous two minors
priorVersionLabels = await this.getVersionsForMinor(v.major, [v.minor - 1, v.minor - 2]);
}
// Check for each of the previous highest patch labels if there is a corresponding release for them
const releases = await Promise.allSettled(
priorVersionLabels.map((label) => {
return this.octokit.repos.getReleaseByTag({
owner: GITHUB_OWNER,
repo: this.repoName,
tag: label,
});
})
);
return (
releases
// Map the status of the release check back to the release label
.map((release, index) => ({ status: release.status, label: priorVersionLabels[index] }))
// Filter for only releases which had no release (which will return a 404)
.filter((release) => release.status === 'rejected')
// Just extract the label of those
.map(({ label }) => label)
.sort()
);
}