From 1b957d41fb2289ca256c1716e8fac2c330f46f1a Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Sun, 3 Aug 2014 18:38:25 -0700 Subject: [PATCH] Deal with different encodings of Cargo.lock On windows, git will check out files with different line endings causing the same serialized resolve to be resolved slightly differently. Instead of comparing contents, this commit alters by testing whether the decoded resolve is equivalent to the to-be-written resolve and only aborts writing if the two are equal. --- src/cargo/core/resolver.rs | 1 + src/cargo/ops/cargo_generate_lockfile.rs | 17 ++++++------ src/cargo/util/graph.rs | 5 ++++ tests/test_cargo_generate_lockfile.rs | 35 ++++++++++++++++++++++++ tests/tests.rs | 1 + 5 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 tests/test_cargo_generate_lockfile.rs diff --git a/src/cargo/core/resolver.rs b/src/cargo/core/resolver.rs index cb97b83d3..3cf4eaaed 100644 --- a/src/cargo/core/resolver.rs +++ b/src/cargo/core/resolver.rs @@ -15,6 +15,7 @@ use semver; use util::{CargoResult, Graph, human, internal}; +#[deriving(PartialEq, Eq)] pub struct Resolve { graph: Graph, root: PackageId diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index 7661bf60e..ec35b6189 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -1,6 +1,6 @@ #![warn(warnings)] use std::collections::HashSet; -use std::io::{mod, File}; +use std::io::File; use serialize::{Encodable, Decodable}; use toml::Encoder; @@ -116,6 +116,13 @@ pub fn load_lockfile(path: &Path, sid: &SourceId) -> CargoResult } pub fn write_resolve(pkg: &Package, resolve: &Resolve) -> CargoResult<()> { + let loc = pkg.get_root().join("Cargo.lock"); + match load_lockfile(&loc, pkg.get_package_id().get_source_id()) { + Ok(Some(ref prev_resolve)) if prev_resolve == resolve => return Ok(()), + _ => {} + } + + let mut e = Encoder::new(); resolve.encode(&mut e).unwrap(); @@ -137,13 +144,7 @@ pub fn write_resolve(pkg: &Package, resolve: &Resolve) -> CargoResult<()> { emit_package(dep, &mut out); } - let loc = pkg.get_root().join("Cargo.lock"); - let mut f = try!(File::open_mode(&loc, io::Open, io::ReadWrite)); - let prev = try!(f.read_to_string()); - if prev != out { - try!(f.seek(0, io::SeekSet)); - try!(f.write_str(out.as_slice())); - } + try!(File::create(&loc).write_str(out.as_slice())); Ok(()) } diff --git a/src/cargo/util/graph.rs b/src/cargo/util/graph.rs index e4aa12738..e256f8475 100644 --- a/src/cargo/util/graph.rs +++ b/src/cargo/util/graph.rs @@ -86,3 +86,8 @@ impl fmt::Show for Graph { Ok(()) } } + +impl PartialEq for Graph { + fn eq(&self, other: &Graph) -> bool { self.nodes.eq(&other.nodes) } +} +impl Eq for Graph {} diff --git a/tests/test_cargo_generate_lockfile.rs b/tests/test_cargo_generate_lockfile.rs new file mode 100644 index 000000000..c9eed05a4 --- /dev/null +++ b/tests/test_cargo_generate_lockfile.rs @@ -0,0 +1,35 @@ +use std::io::File; + +use support::{project, execs, cargo_dir, ResultTest}; +use support::paths::PathExt; +use hamcrest::assert_that; + +fn setup() {} + +test!(ignores_carriage_return { + let p = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + authors = [] + version = "0.0.1" + "#) + .file("src/main.rs", r#" + mod a; fn main() {} + "#) + .file("src/a.rs", ""); + + assert_that(p.cargo_process("cargo-build"), + execs().with_status(0)); + + let lockfile = p.root().join("Cargo.lock"); + let lock = File::open(&lockfile).read_to_string(); + let lock = lock.assert(); + let lock = lock.as_slice().replace("\n", "\r\n"); + File::create(&lockfile).write_str(lock.as_slice()).assert(); + lockfile.move_into_the_past().assert(); + let mtime = lockfile.stat().assert().modified; + assert_that(p.process(cargo_dir().join("cargo-build")), + execs().with_status(0)); + assert_eq!(lockfile.stat().assert().modified, mtime); +}) diff --git a/tests/tests.rs b/tests/tests.rs index 67b886339..3672cd33a 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -33,3 +33,4 @@ mod test_cargo_new; mod test_cargo_compile_plugins; mod test_cargo_doc; mod test_cargo_freshness; +mod test_cargo_generate_lockfile; -- 2.39.5