diff --git a/CHANGELOG.md b/CHANGELOG.md index 27afb35cc3..7604ef8a04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - switch deprecated transitive dependency `net2`->`socket2` [in `crossterm`->`mio`] ([#66](https://github.com/extrawurst/gitui/issues/66)) - crash diffing stash created on command line ([#178](https://github.com/extrawurst/gitui/issues/178)) +- delta file size diff on untracked binary files ([#171](https://github.com/extrawurst/gitui/issues/171)) ## [0.8.0] - 2020-07-06 diff --git a/asyncgit/src/sync/diff.rs b/asyncgit/src/sync/diff.rs index 8965b750d3..75c75af23d 100644 --- a/asyncgit/src/sync/diff.rs +++ b/asyncgit/src/sync/diff.rs @@ -239,7 +239,7 @@ fn raw_diff_to_file_diff<'a>( let mut patch = Patch::from_buffers( &[], None, - newfile_content.as_bytes(), + newfile_content.as_slice(), Some(&newfile_path), None, )?; @@ -283,14 +283,16 @@ fn raw_diff_to_file_diff<'a>( Ok(res.into_inner()) } -fn new_file_content(path: &Path) -> Option { +fn new_file_content(path: &Path) -> Option> { if let Ok(meta) = fs::symlink_metadata(path) { if meta.file_type().is_symlink() { if let Ok(path) = fs::read_link(path) { - return Some(path.to_str()?.to_string()); + return Some( + path.to_str()?.to_string().as_bytes().into(), + ); } } else if meta.file_type().is_file() { - if let Ok(content) = fs::read_to_string(path) { + if let Ok(content) = fs::read(path) { return Some(content); } } @@ -460,14 +462,20 @@ mod tests { } #[test] - fn test_diff_new_binary_file_using_invalid_utf8() -> Result<()> { + fn test_diff_delta_size() -> Result<()> { let file_path = Path::new("bar"); let (_td, repo) = repo_init_empty().unwrap(); let root = repo.path().parent().unwrap(); let repo_path = root.as_os_str().to_str().unwrap(); + File::create(&root.join(file_path))?.write_all(b"\x00")?; + + stage_add_file(repo_path, file_path).unwrap(); + + commit(repo_path, "commit").unwrap(); + File::create(&root.join(file_path))? - .write_all(b"\xc3\x28")?; + .write_all(b"\x00\x02")?; let diff = get_diff( repo_path, @@ -476,26 +484,22 @@ mod tests { ) .unwrap(); - assert_eq!(diff.hunks.len(), 0); + dbg!(&diff); + assert_eq!(diff.sizes, (1, 2)); + assert_eq!(diff.size_delta, 1); Ok(()) } #[test] - fn test_diff_delta_size() -> Result<()> { + fn test_binary_diff_delta_size_untracked() -> Result<()> { let file_path = Path::new("bar"); let (_td, repo) = repo_init_empty().unwrap(); let root = repo.path().parent().unwrap(); let repo_path = root.as_os_str().to_str().unwrap(); - File::create(&root.join(file_path))?.write_all(b"\x00")?; - - stage_add_file(repo_path, file_path).unwrap(); - - commit(repo_path, "commit").unwrap(); - File::create(&root.join(file_path))? - .write_all(b"\x00\x02")?; + .write_all(b"\x00\xc7")?; let diff = get_diff( repo_path, @@ -505,8 +509,8 @@ mod tests { .unwrap(); dbg!(&diff); - assert_eq!(diff.sizes, (1, 2)); - assert_eq!(diff.size_delta, 1); + assert_eq!(diff.sizes, (0, 2)); + assert_eq!(diff.size_delta, 2); Ok(()) }