use std::path::PathBuf;
use std::time::SystemTime;
pub const UNTRACKED_READ_CAP: usize = 64 * 1024 * 1024;
pub const EMPTY_TREE_SHA: &str = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FileDiff {
pub path: PathBuf,
pub status: FileStatus,
pub added: usize,
pub deleted: usize,
pub content: DiffContent,
pub mtime: SystemTime,
pub header_prefix: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DiffContent {
Text(Vec<Hunk>),
Binary,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FileStatus {
Modified,
Added,
Deleted,
Untracked,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Hunk {
pub old_start: usize,
pub old_count: usize,
pub new_start: usize,
pub new_count: usize,
pub lines: Vec<DiffLine>,
pub context: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DiffLine {
pub kind: LineKind,
pub content: String,
pub has_trailing_newline: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LineKind {
Context,
Added,
Deleted,
}
#[cfg(test)]
pub(crate) fn line_numbers_for(hunk: &Hunk, line_idx: usize) -> (Option<usize>, Option<usize>) {
let mut old = hunk.old_start;
let mut new = hunk.new_start;
for (i, line) in hunk.lines.iter().enumerate() {
if i == line_idx {
return match line.kind {
LineKind::Context => (Some(old), Some(new)),
LineKind::Added => (None, Some(new)),
LineKind::Deleted => (Some(old), None),
};
}
match line.kind {
LineKind::Context => {
old += 1;
new += 1;
}
LineKind::Added => {
new += 1;
}
LineKind::Deleted => {
old += 1;
}
}
}
(None, None)
}