//! 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;
//! 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;