mirror of
https://github.com/gitui-org/gitui
synced 2026-05-24 09:28:21 +00:00
different style for hunk header
This commit is contained in:
parent
dd64532814
commit
c5e7b1b8ae
3 changed files with 86 additions and 66 deletions
|
|
@ -7,6 +7,7 @@ terminal ui (tui) frontend for git written in rust
|
||||||
* [x] show files on index
|
* [x] show files on index
|
||||||
* [x] colorize diff
|
* [x] colorize diff
|
||||||
* [x] only show diff of selected file
|
* [x] only show diff of selected file
|
||||||
|
* [ ] change detection
|
||||||
* [ ] allow selecting/diff index items
|
* [ ] allow selecting/diff index items
|
||||||
* [ ] allow scrolling diff
|
* [ ] allow scrolling diff
|
||||||
* [ ] support staging/unstaging
|
* [ ] support staging/unstaging
|
||||||
|
|
|
||||||
76
src/app.rs
76
src/app.rs
|
|
@ -1,6 +1,9 @@
|
||||||
use crate::git_utils;
|
use crate::git_utils;
|
||||||
|
use crate::git_utils::Diff;
|
||||||
|
use crate::git_utils::DiffLine;
|
||||||
use crossterm::event::{Event, KeyCode};
|
use crossterm::event::{Event, KeyCode};
|
||||||
use git2::{DiffFormat, DiffOptions, Repository, Status};
|
use git2::{Repository, Status};
|
||||||
|
use git_utils::DiffLineType;
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use tui::{
|
use tui::{
|
||||||
|
|
@ -11,29 +14,6 @@ use tui::{
|
||||||
Frame,
|
Frame,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq)]
|
|
||||||
pub enum DiffLineType {
|
|
||||||
None,
|
|
||||||
Header,
|
|
||||||
Add,
|
|
||||||
Delete,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for DiffLineType {
|
|
||||||
fn default() -> Self {
|
|
||||||
DiffLineType::None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default, PartialEq)]
|
|
||||||
pub struct DiffLine {
|
|
||||||
content: String,
|
|
||||||
line_type: DiffLineType,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default, PartialEq)]
|
|
||||||
pub struct Diff(Vec<DiffLine>);
|
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct App {
|
pub struct App {
|
||||||
status_items: Vec<String>,
|
status_items: Vec<String>,
|
||||||
|
|
@ -94,7 +74,7 @@ impl App {
|
||||||
///
|
///
|
||||||
fn update_diff(&mut self) {
|
fn update_diff(&mut self) {
|
||||||
let new_diff = match self.status_select {
|
let new_diff = match self.status_select {
|
||||||
Some(i) => get_diff(Path::new(self.status_items[i].as_str())),
|
Some(i) => git_utils::get_diff(Path::new(self.status_items[i].as_str())),
|
||||||
None => Diff::default(),
|
None => Diff::default(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -147,6 +127,13 @@ impl App {
|
||||||
content.into(),
|
content.into(),
|
||||||
Style::default().fg(Color::White).bg(Color::Green),
|
Style::default().fg(Color::White).bg(Color::Green),
|
||||||
),
|
),
|
||||||
|
DiffLineType::Header => Text::Styled(
|
||||||
|
content.into(),
|
||||||
|
Style::default()
|
||||||
|
.fg(Color::Black)
|
||||||
|
.bg(Color::Gray)
|
||||||
|
.modifier(Modifier::BOLD),
|
||||||
|
),
|
||||||
_ => Text::Raw(content.into()),
|
_ => Text::Raw(content.into()),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -219,42 +206,3 @@ fn draw_list<B: Backend, T: AsRef<str>>(
|
||||||
.highlight_symbol(">")
|
.highlight_symbol(">")
|
||||||
.render(f, r);
|
.render(f, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
|
||||||
fn get_diff(p: &Path) -> Diff {
|
|
||||||
let repo = Repository::init("./").unwrap();
|
|
||||||
|
|
||||||
if repo.is_bare() {
|
|
||||||
panic!("bare repo")
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut opt = DiffOptions::new();
|
|
||||||
opt.pathspec(p);
|
|
||||||
|
|
||||||
let diff = repo
|
|
||||||
.diff_index_to_workdir(None, Some(&mut opt))
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let mut res = Vec::new();
|
|
||||||
|
|
||||||
diff.print(DiffFormat::Patch, |_delta, _hunk, line| {
|
|
||||||
|
|
||||||
let line_type = match line.origin() {
|
|
||||||
'H' => DiffLineType::Header,
|
|
||||||
'<' | '-' => DiffLineType::Delete,
|
|
||||||
'>' | '+' => DiffLineType::Add,
|
|
||||||
_ => DiffLineType::None,
|
|
||||||
};
|
|
||||||
|
|
||||||
let diff_line = DiffLine {
|
|
||||||
content: String::from_utf8_lossy(line.content()).to_string(),
|
|
||||||
line_type,
|
|
||||||
};
|
|
||||||
|
|
||||||
res.push(diff_line);
|
|
||||||
true
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
Diff(res)
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,77 @@
|
||||||
use git2::Status;
|
use git2::{DiffFormat, DiffOptions, Repository, Status};
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, PartialEq)]
|
||||||
|
pub enum DiffLineType {
|
||||||
|
None,
|
||||||
|
Header,
|
||||||
|
Add,
|
||||||
|
Delete,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for DiffLineType {
|
||||||
|
fn default() -> Self {
|
||||||
|
DiffLineType::None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default, PartialEq)]
|
||||||
|
pub struct DiffLine {
|
||||||
|
pub content: String,
|
||||||
|
pub line_type: DiffLineType,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default, PartialEq)]
|
||||||
|
pub struct Diff(pub Vec<DiffLine>);
|
||||||
|
|
||||||
///
|
///
|
||||||
pub fn on_index(s:&Status)->bool{
|
pub fn get_diff(p: &Path) -> Diff {
|
||||||
|
let repo = Repository::init("./").unwrap();
|
||||||
|
|
||||||
|
if repo.is_bare() {
|
||||||
|
panic!("bare repo")
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut opt = DiffOptions::new();
|
||||||
|
opt.pathspec(p);
|
||||||
|
|
||||||
|
let diff = repo.diff_index_to_workdir(None, Some(&mut opt)).unwrap();
|
||||||
|
|
||||||
|
let mut res = Vec::new();
|
||||||
|
|
||||||
|
diff.print(DiffFormat::Patch, |_delta, _hunk, line| {
|
||||||
|
let origin = line.origin();
|
||||||
|
|
||||||
|
if origin != 'F' {
|
||||||
|
let line_type = match origin {
|
||||||
|
'H' => DiffLineType::Header,
|
||||||
|
'<' | '-' => DiffLineType::Delete,
|
||||||
|
'>' | '+' => DiffLineType::Add,
|
||||||
|
_ => DiffLineType::None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let diff_line = DiffLine {
|
||||||
|
content: String::from_utf8_lossy(line.content()).to_string(),
|
||||||
|
line_type,
|
||||||
|
};
|
||||||
|
|
||||||
|
if line_type == DiffLineType::Header && res.len() > 0 {
|
||||||
|
res.push(DiffLine {
|
||||||
|
content: "\n".to_string(),
|
||||||
|
line_type: DiffLineType::None,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
res.push(diff_line);
|
||||||
|
}
|
||||||
|
true
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
Diff(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
pub fn on_index(s: &Status) -> bool {
|
||||||
s.is_index_new() || s.is_index_modified()
|
s.is_index_new() || s.is_index_modified()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue