use bstr::BStr;
pub trait Revision {
fn find_ref(&mut self, name: &BStr) -> Option<()>;
fn disambiguate_prefix(&mut self, prefix: git_hash::Prefix, hint: Option<PrefixHint<'_>>) -> Option<()>;
fn reflog(&mut self, query: ReflogLookup) -> Option<()>;
fn nth_checked_out_branch(&mut self, branch_no: usize) -> Option<()>;
fn sibling_branch(&mut self, kind: SiblingBranch) -> Option<()>;
}
pub trait Kind {
fn kind(&mut self, kind: crate::spec::Kind) -> Option<()>;
}
pub trait Navigate {
fn traverse(&mut self, kind: Traversal) -> Option<()>;
fn peel_until(&mut self, kind: PeelTo<'_>) -> Option<()>;
fn find(&mut self, regex: &BStr, negated: bool) -> Option<()>;
fn index_lookup(&mut self, path: &BStr, stage: u8) -> Option<()>;
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
pub enum PrefixHint<'a> {
MustBeCommit,
DescribeAnchor {
ref_name: &'a BStr,
generation: usize,
},
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
pub enum ReflogLookup {
Entry(usize),
Date(git_date::Time),
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
pub enum Traversal {
NthParent(usize),
NthAncestor(usize),
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
pub enum PeelTo<'a> {
ObjectKind(git_object::Kind),
ValidObject,
RecursiveTagObject,
Path(&'a BStr),
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
pub enum SiblingBranch {
Upstream,
Push,
}
impl SiblingBranch {
pub fn parse(input: &BStr) -> Option<Self> {
if input.eq_ignore_ascii_case(b"u") || input.eq_ignore_ascii_case(b"upstream") {
SiblingBranch::Upstream.into()
} else if input.eq_ignore_ascii_case(b"push") {
SiblingBranch::Push.into()
} else {
None
}
}
}