]> git.proxmox.com Git - cargo.git/commitdiff
Deal with different encodings of Cargo.lock
authorAlex Crichton <alex@alexcrichton.com>
Mon, 4 Aug 2014 01:38:25 +0000 (18:38 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Mon, 4 Aug 2014 01:38:25 +0000 (18:38 -0700)
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
src/cargo/ops/cargo_generate_lockfile.rs
src/cargo/util/graph.rs
tests/test_cargo_generate_lockfile.rs [new file with mode: 0644]
tests/tests.rs

index cb97b83d3b4d8ae3d9e58ab0775d36fd29e376ff..3cf4eaaeda32726aeddf8a514f3cdad0d2e94af7 100644 (file)
@@ -15,6 +15,7 @@ use semver;
 
 use util::{CargoResult, Graph, human, internal};
 
+#[deriving(PartialEq, Eq)]
 pub struct Resolve {
     graph: Graph<PackageId>,
     root: PackageId
index 7661bf60e366caaaaf2b72ca567ef709db1eb337..ec35b61892ffcf54587337428b79b86f30934e79 100644 (file)
@@ -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<Option<Resolve>
 }
 
 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(())
 }
 
index e4aa127385f075207ec5ce90926f9859caf98b5e..e256f847519c5ceabdf640a95e26a5ae7c6cad8b 100644 (file)
@@ -86,3 +86,8 @@ impl<N: fmt::Show + Eq + Hash> fmt::Show for Graph<N> {
         Ok(())
     }
 }
+
+impl<N: Eq + Hash> PartialEq for Graph<N> {
+    fn eq(&self, other: &Graph<N>) -> bool { self.nodes.eq(&other.nodes) }
+}
+impl<N: Eq + Hash> Eq for Graph<N> {}
diff --git a/tests/test_cargo_generate_lockfile.rs b/tests/test_cargo_generate_lockfile.rs
new file mode 100644 (file)
index 0000000..c9eed05
--- /dev/null
@@ -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);
+})
index 67b886339147565d107b524cbde737bf0148a1cb..3672cd33a3c762390831c52e85ed41f444760816 100644 (file)
@@ -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;