use std::convert::TryInto; use gix_hash::ObjectId; use crate::{ bstr::{BString, ByteSlice}, Head, }; impl<'repo> Head<'repo> { /// Return a platform for obtaining iterators on the reference log associated with the `HEAD` reference. pub fn log_iter(&self) -> gix_ref::file::log::iter::Platform<'static, 'repo> { gix_ref::file::log::iter::Platform { store: &self.repo.refs, name: "HEAD".try_into().expect("HEAD is always valid"), buf: Vec::new(), } } /// Return a list of all branch names that were previously checked out with the first-ever checked out branch /// being the first entry of the list, and the most recent is the last, along with the commit they were pointing to /// at the time. pub fn prior_checked_out_branches(&self) -> std::io::Result>> { Ok(self.log_iter().all()?.map(|log| { log.filter_map(Result::ok) .filter_map(|line| { line.message .strip_prefix(b"checkout: moving from ") .and_then(|from_to| from_to.find(" to ").map(|pos| &from_to[..pos])) .map(|from_branch| (from_branch.as_bstr().to_owned(), line.previous_oid())) }) .collect() })) } }