Skip to main content

publish_branch/
publish_branch.rs

1//! Run `cargo run --example publish_branch`; creates and removes a disposable repository.
2//! This deliberately publishes without reflogs. Existing tip recovery needs a separate policy.
3use girt::refs::{Expected, RefName, Target};
4use girt::{Commit, InitKind, Repository, Signature};
5
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7    let directory = tempfile::tempdir()?;
8    let repo = Repository::init(
9        girt::ObjectFormat::Sha1,
10        directory.path().join("repo"),
11        InitKind::Bare,
12    )?;
13
14    let objects = repo.loose_objects();
15    let mut editor = girt::tree::TreeEditor::new(&objects);
16    editor.set(b"README.md", objects.write_blob(b"# Project\n")?)?;
17    let tree = editor.write()?;
18
19    let author = Signature::now(b"A. Writer", b"writer@example.com")?;
20    let builder = Commit::builder(tree, author.clone(), b"First snapshot\n");
21    let first = objects.write_commit(&builder.build()?)?;
22
23    let refs = repo.references()?;
24    let head = RefName::HEAD;
25    let branch = refs.update_resolved_without_reflog(&head, first, Expected::Absent)?;
26
27    let second_commit = Commit::builder(tree, author, b"Advance branch\n")
28        .parent(first)
29        .build()?;
30    let second = objects.write_commit(&second_commit)?;
31    refs.update_resolved_without_reflog(&head, second, Expected::Value(Target::Direct(first)))?;
32
33    assert_eq!(refs.resolve_with(&head, 8)?.id, Some(second));
34    assert_eq!(refs.read(&head)?, Some(Target::Symbolic(branch.clone())));
35
36    let branches = refs.list_namespace(&RefName::new(b"refs/heads")?)?;
37    assert_eq!(branches[0].name, branch);
38
39    // Delete the observed terminal branch, keeping HEAD symbolic and now unborn.
40    refs.delete_resolved_without_reflog(&head, Expected::Value(branches[0].target.clone()))?;
41    assert_eq!(refs.read(&head)?, Some(Target::Symbolic(branch)));
42    assert_eq!(refs.resolve_with(&head, 8)?.id, None);
43    assert!(refs.list()?.is_empty());
44
45    println!("Published {first}, advanced to {second}, then deleted main without reflogs");
46    Ok(())
47}