Sebastian Thielj fmtc3c65041 year agoHistory
76 lines · 2.4 KB · Rust
RawDownload
use std::collections::VecDeque; use bstr::BStr;use gix_hash::ObjectId;use gix_object::bstr::BString; use crate::tree::visit::Relation; /// The error returned by [`tree()`](super::tree()).#[derive(Debug, thiserror::Error)]#[allow(missing_docs)]pub enum Error {    #[error(transparent)]    Find(#[from] gix_object::find::existing_iter::Error),    #[error("The delegate cancelled the operation")]    Cancelled,    #[error(transparent)]    EntriesDecode(#[from] gix_object::decode::Error),} /// A trait to allow responding to a traversal designed to figure out the [changes](visit::Change)/// to turn tree A into tree B.pub trait Visit {    /// Sets the full path in front of the queue so future calls to push and pop components affect it instead.    fn pop_front_tracked_path_and_set_current(&mut self);    /// Append a `component` to the end of a path, which may be empty.    fn push_back_tracked_path_component(&mut self, component: &BStr);    /// Append a `component` to the end of a path, which may be empty.    fn push_path_component(&mut self, component: &BStr);    /// Removes the last component from the path, which may leave it empty.    fn pop_path_component(&mut self);    /// Record a `change` and return an instruction whether to continue or not.    ///    /// The implementation may use the current path to lean where in the tree the change is located.    fn visit(&mut self, change: visit::Change) -> visit::Action;} /// The state required to run [tree-diffs](super::tree()).#[derive(Default, Clone)]pub struct State {    /// A buffer for object data.    pub buf1: Vec<u8>,    /// Another buffer for object data.    pub buf2: Vec<u8>,    trees: VecDeque<TreeInfoTuple>,    change_id: visit::ChangeId,} type TreeInfoTuple = (Option<ObjectId>, Option<ObjectId>, Option<Relation>); impl State {    fn clear(&mut self) {        self.trees.clear();        self.buf1.clear();        self.buf2.clear();        self.change_id = 0;    }} pub(super) mod function; ///pub mod visit; /// A [Visit] implementation to record every observed change and keep track of the changed paths.#[derive(Clone, Debug)]pub struct Recorder {    path_deque: VecDeque<BString>,    path: BString,    location: Option<recorder::Location>,    /// The observed changes.    pub records: Vec<recorder::Change>,} /// Useful for use as delegate implementing [`Visit`] to keep track of all seen changes. Useful for debugging or printing primarily.pub mod recorder;