Skip to content

Commit

Permalink
fix git diff when core.autocrlf is enabled (helix-editor#4995)
Browse files Browse the repository at this point in the history
  • Loading branch information
pascalkuthe authored and Shekhinah Memmel committed Dec 11, 2022
1 parent 2165686 commit 2c55d7e
Showing 1 changed file with 31 additions and 6 deletions.
37 changes: 31 additions & 6 deletions helix-vcs/src/git.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,17 @@ impl Git {
// custom open options
let mut git_open_opts_map = git::sec::trust::Mapping::<git::open::Options>::default();

// don't use the global git configs (not needed)
// On windows various configuration options are bundled as part of the installations
// This path depends on the install location of git and therefore requires some overhead to lookup
// This is basically only used on windows and has some overhead hence it's disabled on other platforms.
// `gitoxide` doesn't use this as default
let config = git::permissions::Config {
system: false,
git: false,
user: false,
system: true,
git: true,
user: true,
env: true,
includes: true,
git_binary: false,
git_binary: cfg!(windows),
};
// change options for config permissions without touching anything else
git_open_opts_map.reduced = git_open_opts_map.reduced.permissions(git::Permissions {
Expand Down Expand Up @@ -61,7 +64,29 @@ impl DiffProvider for Git {
let file_oid = find_file_in_commit(&repo, &head, file)?;

let file_object = repo.find_object(file_oid).ok()?;
Some(file_object.detach().data)
let mut data = file_object.detach().data;
// convert LF to CRLF if configured to avoid showing every line as changed
if repo
.config_snapshot()
.boolean("core.autocrlf")
.unwrap_or(false)
{
let mut normalized_file = Vec::with_capacity(data.len());
let mut at_cr = false;
for &byte in &data {
if byte == b'\n' {
// if this is a LF instead of a CRLF (last byte was not a CR)
// insert a new CR to generate a CRLF
if !at_cr {
normalized_file.push(b'\r');
}
}
at_cr = byte == b'\r';
normalized_file.push(byte)
}
data = normalized_file
}
Some(data)
}
}

Expand Down

0 comments on commit 2c55d7e

Please sign in to comment.