Skip to content

Commit 2f8ab44

Browse files
committed
fix(spec): Ensure PackageIdSpec respects version 'build' field
1 parent fb1075b commit 2f8ab44

File tree

3 files changed

+35
-22
lines changed

3 files changed

+35
-22
lines changed

src/cargo/core/package_id_spec.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,7 @@ impl PackageIdSpec {
176176
}
177177

178178
if let Some(ref v) = self.version {
179-
let req = v.exact_req();
180-
if !req.matches(package_id.version()) {
179+
if !v.matches(package_id.version()) {
181180
return false;
182181
}
183182
}
@@ -465,15 +464,15 @@ mod tests {
465464
assert!(PackageIdSpec::parse("meta@1.2.3+hello")
466465
.unwrap()
467466
.matches(meta));
468-
assert!(PackageIdSpec::parse("meta@1.2.3+bye")
467+
assert!(!PackageIdSpec::parse("meta@1.2.3+bye")
469468
.unwrap()
470469
.matches(meta));
471470

472471
let pre = PackageId::new("pre", "1.2.3-alpha.0", sid).unwrap();
473472
assert!(PackageIdSpec::parse("pre").unwrap().matches(pre));
474-
assert!(!PackageIdSpec::parse("pre@1").unwrap().matches(pre));
475-
assert!(!PackageIdSpec::parse("pre@1.2").unwrap().matches(pre));
476-
assert!(!PackageIdSpec::parse("pre@1.2.3").unwrap().matches(pre));
473+
assert!(PackageIdSpec::parse("pre@1").unwrap().matches(pre));
474+
assert!(PackageIdSpec::parse("pre@1.2").unwrap().matches(pre));
475+
assert!(PackageIdSpec::parse("pre@1.2.3").unwrap().matches(pre));
477476
assert!(PackageIdSpec::parse("pre@1.2.3-alpha.0")
478477
.unwrap()
479478
.matches(pre));
@@ -486,7 +485,7 @@ mod tests {
486485
assert!(!PackageIdSpec::parse("pre@1.2.3+hello")
487486
.unwrap()
488487
.matches(pre));
489-
assert!(PackageIdSpec::parse("pre@1.2.3-alpha.0+hello")
488+
assert!(!PackageIdSpec::parse("pre@1.2.3-alpha.0+hello")
490489
.unwrap()
491490
.matches(pre));
492491
}

src/cargo/util/semver_ext.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -186,16 +186,20 @@ impl PartialVersion {
186186
}
187187
}
188188

189-
pub fn exact_req(&self) -> VersionReq {
190-
VersionReq {
191-
comparators: vec![Comparator {
192-
op: semver::Op::Exact,
193-
major: self.major,
194-
minor: self.minor,
195-
patch: self.patch,
196-
pre: self.pre.as_ref().cloned().unwrap_or_default(),
197-
}],
198-
}
189+
/// Check if this matches a version, including build metadata
190+
///
191+
/// Build metadata does not affect version precedence but may be necessary for uniquely
192+
/// identifying a package.
193+
pub fn matches(&self, version: &Version) -> bool {
194+
self.major == version.major
195+
&& self.minor.map(|f| f == version.minor).unwrap_or(true)
196+
&& self.patch.map(|f| f == version.patch).unwrap_or(true)
197+
&& self.pre.as_ref().map(|f| f == &version.pre).unwrap_or(true)
198+
&& self
199+
.build
200+
.as_ref()
201+
.map(|f| f == &version.build)
202+
.unwrap_or(true)
199203
}
200204
}
201205

tests/testsuite/replace.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,7 +1350,7 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
13501350
}
13511351

13521352
#[cargo_test]
1353-
fn override_different_metadata_2() {
1353+
fn override_respects_spec_metadata() {
13541354
Package::new("bar", "0.1.0+a").publish();
13551355

13561356
let bar = git::repo(&paths::root().join("override"))
@@ -1387,12 +1387,22 @@ fn override_different_metadata_2() {
13871387
.with_stderr(
13881388
"\
13891389
[UPDATING] `dummy-registry` index
1390-
[UPDATING] git repository `[..]`
1391-
[CHECKING] bar v0.1.0+a (file://[..])
1392-
[CHECKING] foo v0.0.1 ([CWD])
1393-
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
1390+
[WARNING] package replacement is not used: https://github.com/rust-lang/crates.io-index#bar@0.1.0+notTheBuild
1391+
[DOWNLOADING] crates ...
1392+
[DOWNLOADED] bar v0.1.0+a (registry `dummy-registry`)
1393+
[CHECKING] bar v0.1.0+a
1394+
[CHECKING] foo v0.0.1 ([..]/foo)
1395+
[..]
1396+
[..]
1397+
[..]
1398+
[..]
1399+
[..]
1400+
[..]
1401+
[..]
1402+
error: could not compile `foo` (lib) due to previous error
13941403
",
13951404
)
1405+
.with_status(101)
13961406
.run();
13971407
}
13981408

0 commit comments

Comments
 (0)