use eyre::Context;
use tracing::instrument;
use crate::git::{NonZeroOid, Reference, Repo};
use super::eventlog::{is_gc_ref, CommitActivityStatus, EventCursor, EventReplayer};
pub fn find_dangling_references<'repo>(
repo: &'repo Repo,
event_replayer: &EventReplayer,
event_cursor: EventCursor,
) -> eyre::Result<Vec<Reference<'repo>>> {
let mut result = Vec::new();
for reference in repo.get_all_references()? {
let reference_name = reference.get_name()?;
if !is_gc_ref(&reference_name) {
continue;
}
let commit = match reference.peel_to_commit()? {
Some(commit) => commit,
None => continue,
};
match event_replayer.get_cursor_commit_activity_status(event_cursor, commit.get_oid()) {
CommitActivityStatus::Active => {
}
CommitActivityStatus::Inactive => {
}
CommitActivityStatus::Obsolete => {
result.push(reference)
}
}
}
Ok(result)
}
#[instrument]
pub fn mark_commit_reachable(repo: &Repo, commit_oid: NonZeroOid) -> eyre::Result<()> {
let ref_name = format!("refs/branchless/{}", commit_oid);
eyre::ensure!(
Reference::is_valid_name(&ref_name),
format!("Invalid ref name to mark commit as reachable: {}", ref_name)
);
if repo.find_commit(commit_oid)?.is_some() {
repo.create_reference(
&ref_name.into(),
commit_oid,
true,
"branchless: marking commit as reachable",
)
.wrap_err("Creating reference")?;
}
Ok(())
}