mirror of
https://github.com/rust-lang/cargo.git
synced 2025-10-01 11:30:39 +00:00
Auto merge of #8523 - Gankra:crlf, r=alexcrichton
Mask out system core.autocrlf settings before resetting git repos This fixes an issue the gecko developers noticed when vendoring on windows. \[0\] If a user has `core.autocrlf=true` set (a reasonable default on windows), vendoring from a git source would cause all the newlines to be rewritten to include carriage returns, creating churn and platform-specific results. To fix this, we simply set the global cargo checkout's "local" core.autocrlf value before performing a `reset`. This masks out the system configuration without interfering with the user's own system/project settings. \[0\]: https://bugzilla.mozilla.org/show_bug.cgi?id=1647582
This commit is contained in:
commit
04c0875ed6
@ -328,6 +328,12 @@ impl<'a> GitCheckout<'a> {
|
|||||||
let ok_file = self.location.join(".cargo-ok");
|
let ok_file = self.location.join(".cargo-ok");
|
||||||
let _ = paths::remove_file(&ok_file);
|
let _ = paths::remove_file(&ok_file);
|
||||||
info!("reset {} to {}", self.repo.path().display(), self.revision);
|
info!("reset {} to {}", self.repo.path().display(), self.revision);
|
||||||
|
|
||||||
|
// Ensure libgit2 won't mess with newlines when we vendor.
|
||||||
|
if let Ok(mut git_config) = self.repo.config() {
|
||||||
|
git_config.set_bool("core.autocrlf", false)?;
|
||||||
|
}
|
||||||
|
|
||||||
let object = self.repo.find_object(self.revision, None)?;
|
let object = self.repo.find_object(self.revision, None)?;
|
||||||
reset(&self.repo, &object, config)?;
|
reset(&self.repo, &object, config)?;
|
||||||
paths::create(ok_file)?;
|
paths::create(ok_file)?;
|
||||||
|
@ -4,9 +4,11 @@
|
|||||||
//! "fake" crates.io is used. Otherwise `vendor` would download the crates.io
|
//! "fake" crates.io is used. Otherwise `vendor` would download the crates.io
|
||||||
//! index from the network.
|
//! index from the network.
|
||||||
|
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
use cargo_test_support::git;
|
use cargo_test_support::git;
|
||||||
use cargo_test_support::registry::Package;
|
use cargo_test_support::registry::Package;
|
||||||
use cargo_test_support::{basic_lib_manifest, project, Project};
|
use cargo_test_support::{basic_lib_manifest, paths, project, Project};
|
||||||
|
|
||||||
#[cargo_test]
|
#[cargo_test]
|
||||||
fn vendor_simple() {
|
fn vendor_simple() {
|
||||||
@ -631,3 +633,45 @@ fn config_instructions_works() {
|
|||||||
.with_stderr_contains("[..]foo/vendor/gitdep/src/lib.rs[..]")
|
.with_stderr_contains("[..]foo/vendor/gitdep/src/lib.rs[..]")
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cargo_test]
|
||||||
|
fn git_crlf_preservation() {
|
||||||
|
// Check that newlines don't get changed when you vendor
|
||||||
|
// (will only fail if your system is setup with core.autocrlf=true on windows)
|
||||||
|
let input = "hello \nthere\nmy newline\nfriends";
|
||||||
|
let git_project = git::new("git", |p| {
|
||||||
|
p.file("Cargo.toml", &basic_lib_manifest("a"))
|
||||||
|
.file("src/lib.rs", input)
|
||||||
|
});
|
||||||
|
|
||||||
|
let p = project()
|
||||||
|
.file(
|
||||||
|
"Cargo.toml",
|
||||||
|
&format!(
|
||||||
|
r#"
|
||||||
|
[package]
|
||||||
|
name = "foo"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
a = {{ git = '{}' }}
|
||||||
|
"#,
|
||||||
|
git_project.url()
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.file("src/lib.rs", "")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
fs::write(
|
||||||
|
paths::home().join(".gitconfig"),
|
||||||
|
r#"
|
||||||
|
[core]
|
||||||
|
autocrlf = true
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
p.cargo("vendor --respect-source-config").run();
|
||||||
|
let output = p.read_file("vendor/a/src/lib.rs");
|
||||||
|
assert_eq!(input, output);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user