publish_branch/
publish_branch.rs1use 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 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}