blob: bb9b56d57ac44790e42624d436fb014536332847 [file] [log] [blame]
use crate::{bstr::BStr, revision, Id};
use gix_macros::momo;
/// Methods for resolving revisions by spec or working with the commit graph.
impl crate::Repository {
/// Parse a revision specification and turn it into the object(s) it describes, similar to `git rev-parse`.
///
/// # Deviation
///
/// - `@` actually stands for `HEAD`, whereas `git` resolves it to the object pointed to by `HEAD` without making the
/// `HEAD` ref available for lookups.
#[doc(alias = "revparse", alias = "git2")]
#[momo]
pub fn rev_parse<'a>(&self, spec: impl Into<&'a BStr>) -> Result<revision::Spec<'_>, revision::spec::parse::Error> {
revision::Spec::from_bstr(
spec,
self,
revision::spec::parse::Options {
object_kind_hint: self.config.object_kind_hint,
..Default::default()
},
)
}
/// Parse a revision specification and return single object id as represented by this instance.
#[doc(alias = "revparse_single", alias = "git2")]
pub fn rev_parse_single<'repo, 'a>(
&'repo self,
spec: impl Into<&'a BStr>,
) -> Result<Id<'repo>, revision::spec::parse::single::Error> {
let spec = spec.into();
self.rev_parse(spec)?
.single()
.ok_or(revision::spec::parse::single::Error::RangedRev { spec: spec.into() })
}
/// Create the baseline for a revision walk by initializing it with the `tips` to start iterating on.
///
/// It can be configured further before starting the actual walk.
#[doc(alias = "revwalk", alias = "git2")]
pub fn rev_walk(
&self,
tips: impl IntoIterator<Item = impl Into<gix_hash::ObjectId>>,
) -> revision::walk::Platform<'_> {
revision::walk::Platform::new(tips, self)
}
}