use std::collections::{HashMap, HashSet};
use std::path::PathBuf;
use crate::diff::{DiffLine, FileDiff};
use crate::limits::DiffMetrics;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct StackPosition {
pub current: usize,
pub total: usize,
pub head_count: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VcsBackend {
Git,
Jj,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum DiffBase {
#[default]
ForkPoint,
TrunkTip,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct UpstreamDivergence {
pub behind_count: usize,
pub upstream_files: HashSet<String>,
}
#[derive(Debug, Clone)]
pub struct ComparisonContext {
pub from_label: String,
pub to_label: String,
pub stack_position: Option<StackPosition>,
pub vcs_backend: VcsBackend,
pub bookmark_name: Option<String>,
pub divergence: Option<UpstreamDivergence>,
}
#[derive(Debug)]
pub struct RefreshResult {
pub files: Vec<FileDiff>,
pub lines: Vec<DiffLine>,
pub base_identifier: String,
pub base_label: Option<String>,
pub current_branch: Option<String>,
pub metrics: DiffMetrics,
pub file_links: HashMap<String, String>,
pub stack_position: Option<StackPosition>,
pub bookmark_name: Option<String>,
pub revision_id: Option<String>,
pub divergence: Option<UpstreamDivergence>,
}
impl RefreshResult {
pub fn empty() -> Self {
Self {
files: Vec::new(),
lines: Vec::new(),
base_identifier: String::new(),
base_label: None,
current_branch: None,
metrics: DiffMetrics::default(),
file_links: HashMap::new(),
stack_position: None,
bookmark_name: None,
revision_id: None,
divergence: None,
}
}
}
pub struct VcsWatchPaths {
pub files: Vec<PathBuf>,
pub recursive_dirs: Vec<PathBuf>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VcsEventType {
Internal,
RevisionChange,
Lock,
Source,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_refresh_result_has_no_data_and_no_metadata() {
let r = RefreshResult::empty();
assert!(r.files.is_empty());
assert!(r.lines.is_empty());
assert!(r.base_identifier.is_empty());
assert!(r.base_label.is_none());
assert!(r.current_branch.is_none());
assert!(r.file_links.is_empty());
assert!(r.stack_position.is_none());
assert!(r.bookmark_name.is_none());
assert!(r.revision_id.is_none());
assert!(r.divergence.is_none());
}
}