mirror of
https://github.com/gitui-org/gitui
synced 2026-05-23 17:08:21 +00:00
show diff of new untracked files
This commit is contained in:
parent
c410b8e4b1
commit
4730a8f498
2 changed files with 51 additions and 7 deletions
|
|
@ -38,7 +38,6 @@ gitui
|
|||
* [x] commit
|
||||
* [x] [input polling in thread](assets/perf_compare.jpg)
|
||||
* [x] async git API for fluid control
|
||||
* [ ] show content of new unstaged files
|
||||
* [ ] discard untracked files (remove)
|
||||
* [ ] (un)staging selected hunks
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
use super::utils;
|
||||
use git2::{DiffFormat, DiffOptions};
|
||||
use git2::{
|
||||
Delta, DiffDelta, DiffFormat, DiffHunk, DiffOptions, Patch,
|
||||
};
|
||||
use scopetime::scope_time;
|
||||
use std::fs;
|
||||
|
||||
///
|
||||
#[derive(Copy, Clone, PartialEq)]
|
||||
|
|
@ -38,7 +41,7 @@ pub fn get_diff(p: String, stage: bool) -> Diff {
|
|||
opt.pathspec(p);
|
||||
|
||||
let diff = if !stage {
|
||||
// diff against stage
|
||||
opt.include_untracked(true);
|
||||
repo.diff_index_to_workdir(None, Some(&mut opt)).unwrap()
|
||||
} else {
|
||||
// diff against head
|
||||
|
|
@ -56,7 +59,7 @@ pub fn get_diff(p: String, stage: bool) -> Diff {
|
|||
|
||||
let mut res = Vec::new();
|
||||
|
||||
diff.print(DiffFormat::Patch, |_delta, _hunk, line| {
|
||||
let mut put = |line: git2::DiffLine| {
|
||||
let origin = line.origin();
|
||||
|
||||
if origin != 'F' {
|
||||
|
|
@ -82,9 +85,51 @@ pub fn get_diff(p: String, stage: bool) -> Diff {
|
|||
|
||||
res.push(diff_line);
|
||||
}
|
||||
true
|
||||
})
|
||||
.unwrap();
|
||||
};
|
||||
|
||||
let new_file_diff = if diff.deltas().len() == 1 {
|
||||
let delta: DiffDelta = diff.deltas().next().unwrap();
|
||||
|
||||
if delta.status() == Delta::Untracked {
|
||||
let newfile_path = delta.new_file().path().unwrap();
|
||||
|
||||
let newfile_content =
|
||||
fs::read_to_string(newfile_path).unwrap();
|
||||
|
||||
let mut patch = Patch::from_buffers(
|
||||
&[],
|
||||
None,
|
||||
newfile_content.as_bytes(),
|
||||
Some(newfile_path),
|
||||
Some(&mut opt),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
patch
|
||||
.print(&mut |_delta, _hunk, line: git2::DiffLine| {
|
||||
put(line);
|
||||
true
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
if !new_file_diff {
|
||||
diff.print(
|
||||
DiffFormat::Patch,
|
||||
|_, _, line: git2::DiffLine| {
|
||||
put(line);
|
||||
true
|
||||
},
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
Diff(res)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue