Skip to content

Commit e3e555f

Browse files
committed
Fix #3294 - handle invalid semver strings in crates/:crate_id/versions
* Add a tooltip message and a new icon to components/version-list/row * Handle null returned from `semverParse` in models/version * Add `loose` option to `semverParse` (https://github.com/npm/node-semver#functions)
1 parent e77c078 commit e3e555f

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

app/components/version-list/row.hbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
<div local-class="release-track">
1313
{{#if @version.yanked}}
1414
{{svg-jar "trash"}}
15+
{{else if @version.invalidSemver}}
16+
?
1517
{{else if @version.isFirst}}
1618
{{svg-jar "star"}}
1719
{{else}}

app/components/version-list/row.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ export default class VersionRow extends Component {
1313
if (version.yanked) {
1414
return 'This version was yanked';
1515
}
16+
if (version.invalidSemver) {
17+
return `Failed to parse version ${version.num}`;
18+
}
1619
if (version.isFirst) {
1720
return 'This is the first version that was released';
1821
}

app/models/version.js

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,29 +44,41 @@ export default class Version extends Model {
4444
return oldestVersion === this;
4545
}
4646

47-
@cached get semver() {
48-
return semverParse(this.num);
47+
get semver() {
48+
return semverParse(this.num, { loose: true });
49+
}
50+
51+
get invalidSemver() {
52+
return this.semver === null;
4953
}
5054

5155
get isPrerelease() {
56+
if (this.invalidSemver) {
57+
return false;
58+
}
59+
5260
return this.semver.prerelease.length !== 0;
5361
}
5462

5563
get releaseTrack() {
64+
if (this.invalidSemver) {
65+
return null;
66+
}
67+
5668
let { semver } = this;
5769
return `${semver.major}.${semver.major === 0 ? semver.minor : 'x'}`;
5870
}
5971

6072
@cached get isHighestOfReleaseTrack() {
61-
if (this.isPrerelease) {
73+
if (this.isPrerelease || this.invalidSemver) {
6274
return false;
6375
}
6476

6577
let { crate, semver, releaseTrack } = this;
6678
let { versions } = crate;
6779
// find all other non-prerelease versions on the same release track
6880
let sameTrackVersions = versions.filter(
69-
it => it !== this && !it.yanked && !it.isPrerelease && it.releaseTrack === releaseTrack,
81+
it => it !== this && !it.yanked && !it.isPrerelease && !it.invalidSemver && it.releaseTrack === releaseTrack,
7082
);
7183
// check if we're the "highest"
7284
return sameTrackVersions.every(it => it.semver.compare(semver) === -1);

0 commit comments

Comments
 (0)