aboutsummaryrefslogtreecommitdiff
path: root/helix-vcs
diff options
context:
space:
mode:
authorPascal Kuthe2022-12-05 13:46:59 +0000
committerGitHub2022-12-05 13:46:59 +0000
commitb0f20f13e3a606cba35cc70144f045a22b5b38bc (patch)
tree6ecfd7fa7c62bc4f07bdd6027a75f0ccca3ca603 /helix-vcs
parent1e31bc3f77040d4a3663b8b6bf72d8d3a632b88a (diff)
fix git diff when core.autocrlf is enabled (#4995)
Diffstat (limited to 'helix-vcs')
-rw-r--r--helix-vcs/src/git.rs37
1 files changed, 31 insertions, 6 deletions
diff --git a/helix-vcs/src/git.rs b/helix-vcs/src/git.rs
index 82b2b558..432159b6 100644
--- a/helix-vcs/src/git.rs
+++ b/helix-vcs/src/git.rs
@@ -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 {
@@ -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)
}
}