71 lines · 2.4 KB · Rust
RawDownload
//! Topological commit traversal, similar to `git log --topo-order`, which keeps track of graph state. use bitflags::bitflags; /// The errors that can occur during creation and iteration.#[derive(thiserror::Error, Debug)]#[expect(missing_docs)]pub enum Error {    #[error("Indegree information is missing")]    MissingIndegreeUnexpected,    #[error("Internal state (bitflags) not found")]    MissingStateUnexpected,    #[error(transparent)]    ObjectDecode(#[from] gix_object::decode::Error),    #[error(transparent)]    Find(#[from] gix_object::find::existing_iter::Error),} bitflags! {    /// Set of flags to describe the state of a particular commit while iterating.    // NOTE: The names correspond to the names of the flags in revision.h    #[repr(transparent)]    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]    pub(super) struct WalkFlags: u8 {        /// Commit has been seen        const Seen = 0b000001;        /// Commit has been processed by the Explore walk        const Explored = 0b000010;        /// Commit has been processed by the Indegree walk        const InDegree = 0b000100;        /// Commit is deemed uninteresting for whatever reason        const Uninteresting = 0b001000;        /// Commit marks the end of a walk, like `foo` in `git rev-list foo..bar`        const Bottom = 0b010000;        /// Parents have been processed        const Added = 0b100000;    }} /// Sorting to use for the topological walk.////// ### Sample History////// The following history will be referred to for explaining how the sort order works, with the number denoting the commit timestamp/// (*their X-alignment doesn't matter*).////// ```text/// ---1----2----4----7 <- second parent of 8///     \              \///      3----5----6----8---/// ```#[derive(Clone, Copy, Debug, Default)]pub enum Sorting {    /// Show no parents before all of its children are shown, but otherwise show    /// commits in the commit timestamp order.    ///    /// This is equivalent to `git rev-list --date-order`.    #[default]    DateOrder,    /// Show no parents before all of its children are shown, and avoid    /// showing commits on multiple lines of history intermixed.    ///    /// In the *sample history* the order would be `8, 6, 5, 3, 7, 4, 2, 1`.    /// This is equivalent to `git rev-list --topo-order`.    TopoOrder,} mod init;pub use init::Builder; pub(super) mod iter;