Skip to content

Commit 0ec3274

Browse files
committed
fix(spec): Ensure PackageIdSpec respects version 'build' field
1 parent ae068fb commit 0ec3274

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
@@ -182,16 +182,20 @@ impl PartialVersion {
182182
}
183183
}
184184

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

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)