use std::path::{Path, PathBuf}; use git_worktree::fs::Stack; #[derive(Debug, Default, Eq, PartialEq)]struct Record { push_dir: usize, dirs: Vec<PathBuf>, push: usize,} impl git_worktree::fs::stack::Delegate for Record { fn push_directory(&mut self, stack: &Stack) -> std::io::Result<()> { self.push_dir += 1; self.dirs.push(stack.current().into()); Ok(()) } fn push(&mut self, _is_last_component: bool, _stack: &Stack) -> std::io::Result<()> { self.push += 1; Ok(()) } fn pop_directory(&mut self) { self.dirs.pop(); }} #[test]fn delegate_calls_are_consistent() -> crate::Result { let root = PathBuf::from("."); let mut s = Stack::new(&root); assert_eq!(s.current(), root); assert_eq!(s.current_relative(), Path::new("")); let mut r = Record::default(); s.make_relative_path_current("a/b", &mut r)?; let mut dirs = vec![root.clone(), root.join("a")]; assert_eq!( r, Record { push_dir: 2, dirs: dirs.clone(), push: 2, } ); s.make_relative_path_current("a/b2", &mut r)?; assert_eq!( r, Record { push_dir: 2, dirs: dirs.clone(), push: 3, } ); s.make_relative_path_current("c/d/e", &mut r)?; dirs.pop(); dirs.extend([root.join("c"), root.join("c").join("d")]); assert_eq!( r, Record { push_dir: 4, dirs: dirs.clone(), push: 6, } ); dirs.push(root.join("c").join("d").join("x")); s.make_relative_path_current("c/d/x/z", &mut r)?; assert_eq!( r, Record { push_dir: 5, dirs: dirs.clone(), push: 8, } ); dirs.drain(dirs.len() - 3..).count(); s.make_relative_path_current("f", &mut r)?; assert_eq!(s.current_relative(), Path::new("f")); assert_eq!( r, Record { push_dir: 5, dirs: dirs.clone(), push: 9, } ); dirs.push(root.join("x")); s.make_relative_path_current("x/z", &mut r)?; assert_eq!( r, Record { push_dir: 6, dirs: dirs.clone(), push: 11, } ); dirs.push(root.join("x").join("z")); s.make_relative_path_current("x/z/a", &mut r)?; assert_eq!( r, Record { push_dir: 7, dirs: dirs.clone(), push: 12, } ); dirs.push(root.join("x").join("z").join("a")); dirs.push(root.join("x").join("z").join("a").join("b")); s.make_relative_path_current("x/z/a/b/c", &mut r)?; assert_eq!( r, Record { push_dir: 9, dirs: dirs.clone(), push: 14, } ); dirs.drain(dirs.len() - 2..).count(); s.make_relative_path_current("x/z", &mut r)?; assert_eq!( r, Record { push_dir: 9, dirs: dirs.clone(), push: 14, } ); assert_eq!( dirs.last(), Some(&PathBuf::from("./x/z")), "the stack is state so keeps thinking it's a directory which is consistent. Git does it differently though." ); Ok(())}
use std::path::{Path, PathBuf};
use git_worktree::fs::Stack;
#[derive(Debug, Default, Eq, PartialEq)]
struct Record {
push_dir: usize,
dirs: Vec<PathBuf>,
push: usize,
}
impl git_worktree::fs::stack::Delegate for Record {
fn push_directory(&mut self, stack: &Stack) -> std::io::Result<()> {
self.push_dir += 1;
self.dirs.push(stack.current().into());
Ok(())
}
fn push(&mut self, _is_last_component: bool, _stack: &Stack) -> std::io::Result<()> {
self.push += 1;
Ok(())
}
fn pop_directory(&mut self) {
self.dirs.pop();
}
}
#[test]
fn delegate_calls_are_consistent() -> crate::Result {
let root = PathBuf::from(".");
let mut s = Stack::new(&root);
assert_eq!(s.current(), root);
assert_eq!(s.current_relative(), Path::new(""));
let mut r = Record::default();
s.make_relative_path_current("a/b", &mut r)?;
let mut dirs = vec![root.clone(), root.join("a")];
assert_eq!(
r,
Record {
push_dir: 2,
dirs: dirs.clone(),
push: 2,
}
);
s.make_relative_path_current("a/b2", &mut r)?;
assert_eq!(
r,
Record {
push_dir: 2,
dirs: dirs.clone(),
push: 3,
}
);
s.make_relative_path_current("c/d/e", &mut r)?;
dirs.pop();
dirs.extend([root.join("c"), root.join("c").join("d")]);
assert_eq!(
r,
Record {
push_dir: 4,
dirs: dirs.clone(),
push: 6,
}
);
dirs.push(root.join("c").join("d").join("x"));
s.make_relative_path_current("c/d/x/z", &mut r)?;
assert_eq!(
r,
Record {
push_dir: 5,
dirs: dirs.clone(),
push: 8,
}
);
dirs.drain(dirs.len() - 3..).count();
s.make_relative_path_current("f", &mut r)?;
assert_eq!(s.current_relative(), Path::new("f"));
assert_eq!(
r,
Record {
push_dir: 5,
dirs: dirs.clone(),
push: 9,
}
);
dirs.push(root.join("x"));
s.make_relative_path_current("x/z", &mut r)?;
assert_eq!(
r,
Record {
push_dir: 6,
dirs: dirs.clone(),
push: 11,
}
);
dirs.push(root.join("x").join("z"));
s.make_relative_path_current("x/z/a", &mut r)?;
assert_eq!(
r,
Record {
push_dir: 7,
dirs: dirs.clone(),
push: 12,
}
);
dirs.push(root.join("x").join("z").join("a"));
dirs.push(root.join("x").join("z").join("a").join("b"));
s.make_relative_path_current("x/z/a/b/c", &mut r)?;
assert_eq!(
r,
Record {
push_dir: 9,
dirs: dirs.clone(),
push: 14,
}
);
dirs.drain(dirs.len() - 2..).count();
s.make_relative_path_current("x/z", &mut r)?;
assert_eq!(
r,
Record {
push_dir: 9,
dirs: dirs.clone(),
push: 14,
}
);
assert_eq!(
dirs.last(),
Some(&PathBuf::from("./x/z")),
"the stack is state so keeps thinking it's a directory which is consistent. Git does it differently though."
);
Ok(())
}