Skip to content

Commit 07d022d

Browse files
committed
Auto merge of #5425 - matklad:rename-fingerprint, r=alexcrichton
Package renames should affect fingerprints
2 parents 0e6edcf + fc72bcb commit 07d022d

File tree

4 files changed

+91
-35
lines changed

4 files changed

+91
-35
lines changed

src/cargo/core/compiler/context/mod.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,32 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
429429
self.unit_dependencies[unit].clone()
430430
}
431431

432+
pub fn extern_crate_name(&self, unit: &Unit<'a>, dep: &Unit<'a>) -> CargoResult<String> {
433+
let deps = {
434+
let a = unit.pkg.package_id();
435+
let b = dep.pkg.package_id();
436+
if a == b {
437+
&[]
438+
} else {
439+
self.resolve.dependencies_listed(a, b)
440+
}
441+
};
442+
443+
let crate_name = dep.target.crate_name();
444+
let mut names = deps.iter()
445+
.map(|d| d.rename().unwrap_or(&crate_name));
446+
let name = names.next().unwrap_or(&crate_name);
447+
for n in names {
448+
if n == name {
449+
continue
450+
}
451+
bail!("multiple dependencies listed for the same crate must \
452+
all have the same name, but the dependency on `{}` \
453+
is listed as having different names", dep.pkg.package_id());
454+
}
455+
Ok(name.to_string())
456+
}
457+
432458
/// Whether a dependency should be compiled for the host or target platform,
433459
/// specified by `Kind`.
434460
fn dep_platform_activated(&self, dep: &Dependency, kind: Kind) -> bool {

src/cargo/core/compiler/fingerprint.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -150,33 +150,34 @@ pub struct Fingerprint {
150150
profile: u64,
151151
path: u64,
152152
#[serde(serialize_with = "serialize_deps", deserialize_with = "deserialize_deps")]
153-
deps: Vec<(String, Arc<Fingerprint>)>,
153+
deps: Vec<(String, String, Arc<Fingerprint>)>,
154154
local: Vec<LocalFingerprint>,
155155
#[serde(skip_serializing, skip_deserializing)]
156156
memoized_hash: Mutex<Option<u64>>,
157157
rustflags: Vec<String>,
158158
edition: Edition,
159159
}
160160

161-
fn serialize_deps<S>(deps: &[(String, Arc<Fingerprint>)], ser: S) -> Result<S::Ok, S::Error>
161+
fn serialize_deps<S>(deps: &[(String, String, Arc<Fingerprint>)], ser: S) -> Result<S::Ok, S::Error>
162162
where
163163
S: ser::Serializer,
164164
{
165165
deps.iter()
166-
.map(|&(ref a, ref b)| (a, b.hash()))
166+
.map(|&(ref a, ref b, ref c)| (a, b, c.hash()))
167167
.collect::<Vec<_>>()
168168
.serialize(ser)
169169
}
170170

171-
fn deserialize_deps<'de, D>(d: D) -> Result<Vec<(String, Arc<Fingerprint>)>, D::Error>
171+
fn deserialize_deps<'de, D>(d: D) -> Result<Vec<(String, String, Arc<Fingerprint>)>, D::Error>
172172
where
173173
D: de::Deserializer<'de>,
174174
{
175-
let decoded = <Vec<(String, u64)>>::deserialize(d)?;
175+
let decoded = <Vec<(String, String, u64)>>::deserialize(d)?;
176176
Ok(decoded
177177
.into_iter()
178-
.map(|(name, hash)| {
178+
.map(|(pkg_id, name, hash)| {
179179
(
180+
pkg_id,
180181
name,
181182
Arc::new(Fingerprint {
182183
rustc: 0,
@@ -330,7 +331,7 @@ impl Fingerprint {
330331
bail!("number of dependencies has changed")
331332
}
332333
for (a, b) in self.deps.iter().zip(old.deps.iter()) {
333-
if a.1.hash() != b.1.hash() {
334+
if a.1 != b.1 || a.2.hash() != b.2.hash() {
334335
bail!("new ({}) != old ({})", a.0, b.0)
335336
}
336337
}
@@ -357,7 +358,8 @@ impl hash::Hash for Fingerprint {
357358
).hash(h);
358359

359360
h.write_usize(deps.len());
360-
for &(ref name, ref fingerprint) in deps {
361+
for &(ref pkg_id, ref name, ref fingerprint) in deps {
362+
pkg_id.hash(h);
361363
name.hash(h);
362364
// use memoized dep hashes to avoid exponential blowup
363365
h.write_u64(Fingerprint::hash(fingerprint));
@@ -426,8 +428,11 @@ fn calculate<'a, 'cfg>(
426428
let deps = cx.dep_targets(unit);
427429
let deps = deps.iter()
428430
.filter(|u| !u.target.is_custom_build() && !u.target.is_bin())
429-
.map(|unit| {
430-
calculate(cx, unit).map(|fingerprint| (unit.pkg.package_id().to_string(), fingerprint))
431+
.map(|dep| {
432+
calculate(cx, dep).and_then(|fingerprint| {
433+
let name = cx.extern_crate_name(unit, dep)?;
434+
Ok((dep.pkg.package_id().to_string(), name, fingerprint))
435+
})
431436
})
432437
.collect::<CargoResult<Vec<_>>>()?;
433438

@@ -441,7 +446,7 @@ fn calculate<'a, 'cfg>(
441446
LocalFingerprint::Precalculated(fingerprint)
442447
};
443448
let mut deps = deps;
444-
deps.sort_by(|&(ref a, _), &(ref b, _)| a.cmp(b));
449+
deps.sort_by(|&(ref a, _, _), &(ref b, _, _)| a.cmp(b));
445450
let extra_flags = if unit.mode.is_doc() {
446451
cx.rustdocflags_args(unit)?
447452
} else {

src/cargo/core/compiler/mod.rs

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,30 +1097,7 @@ fn build_deps_args<'a, 'cfg>(
10971097
continue;
10981098
}
10991099
let mut v = OsString::new();
1100-
1101-
let deps = {
1102-
let a = current.pkg.package_id();
1103-
let b = dep.pkg.package_id();
1104-
if a == b {
1105-
&[]
1106-
} else {
1107-
cx.resolve.dependencies_listed(a, b)
1108-
}
1109-
};
1110-
1111-
let crate_name = dep.target.crate_name();
1112-
let mut names = deps.iter()
1113-
.map(|d| d.rename().unwrap_or(&crate_name));
1114-
let name = names.next().unwrap_or(&crate_name);
1115-
for n in names {
1116-
if n == name {
1117-
continue
1118-
}
1119-
bail!("multiple dependencies listed for the same crate must \
1120-
all have the same name, but the dependency on `{}` \
1121-
is listed as having different names", dep.pkg.package_id());
1122-
}
1123-
1100+
let name = cx.extern_crate_name(current, dep)?;
11241101
v.push(name);
11251102
v.push("=");
11261103
v.push(cx.files().out_dir(dep));

tests/testsuite/rename_deps.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,3 +315,51 @@ name, but the dependency on `foo v0.1.0` is listed as having different names
315315
")
316316
);
317317
}
318+
319+
#[test]
320+
fn rename_affects_fingerprint() {
321+
Package::new("foo", "0.1.0").publish();
322+
323+
let p = project("foo")
324+
.file(
325+
"Cargo.toml",
326+
r#"
327+
cargo-features = ["rename-dependency"]
328+
329+
[package]
330+
name = "test"
331+
version = "0.1.0"
332+
authors = []
333+
334+
[dependencies]
335+
foo = { version = "0.1", package = "foo" }
336+
"#,
337+
)
338+
.file("src/lib.rs", "extern crate foo;")
339+
.build();
340+
341+
assert_that(
342+
p.cargo("build -v").masquerade_as_nightly_cargo(),
343+
execs().with_status(0),
344+
);
345+
346+
p.change_file(
347+
"Cargo.toml",
348+
r#"
349+
cargo-features = ["rename-dependency"]
350+
351+
[package]
352+
name = "test"
353+
version = "0.1.0"
354+
authors = []
355+
356+
[dependencies]
357+
bar = { version = "0.1", package = "foo" }
358+
"#,
359+
);
360+
361+
assert_that(
362+
p.cargo("build -v").masquerade_as_nightly_cargo(),
363+
execs().with_status(101),
364+
);
365+
}

0 commit comments

Comments
 (0)