Skip to main content

write_pack/
write_pack.rs

1//! Run `cargo run --example write_pack`; exports and verifies an explicit set in private storage.
2use std::fs::{self, File};
3use std::io::{BufWriter, Write};
4
5use girt::{ObjectId, ObjectKind, PackObject, PackWriteLimits, Repository, write_pack};
6
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8    let root = tempfile::tempdir()?;
9    let format = girt::ObjectFormat::Sha256;
10    let payload = b"explicit export\0\xff";
11    let id = ObjectId::for_blob(format, payload);
12
13    let inputs = [PackObject {
14        id,
15        kind: ObjectKind::Blob,
16        data: payload,
17    }];
18
19    let mut pack = BufWriter::new(File::create(root.path().join("export.pack"))?);
20    let mut index = BufWriter::new(File::create(root.path().join("export.idx"))?);
21    let written = write_pack(
22        format,
23        &inputs,
24        &mut pack,
25        &mut index,
26        PackWriteLimits::default(),
27    )?;
28
29    pack.flush()?;
30    index.flush()?;
31    drop((pack, index));
32
33    // Only this example owns the new repository. Prepare both files before opening any readers.
34    // A live repository needs a separate safe publication protocol, not this two-rename sequence.
35    let repo_path = root.path().join("private.git");
36    let repo = Repository::init(format, &repo_path, girt::InitKind::Bare)?;
37
38    let basename = format!("objects/pack/pack-{}", written.checksum);
39    fs::rename(
40        root.path().join("export.pack"),
41        repo_path.join(format!("{basename}.pack")),
42    )?;
43    fs::rename(
44        root.path().join("export.idx"),
45        repo_path.join(format!("{basename}.idx")),
46    )?;
47
48    let objects = repo.objects()?;
49    let restored = objects.read(id)?.ok_or("exported object missing")?;
50    assert_eq!(restored.kind(), ObjectKind::Blob);
51    assert_eq!(restored.data(), payload);
52
53    println!(
54        "Verified {} explicit object in {} pack bytes and {} index bytes",
55        written.objects, written.pack_bytes, written.index_bytes
56    );
57    Ok(())
58}