1use 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 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}