use super::*;
#[test]
fn rust_adverts_match_git_upload_pack_byte_for_byte() -> anyhow::Result<()> {
let root = tempfile::tempdir()?;
for (cap, format) in [
("sha1", knot_types::ObjectFormat::SHA1),
(
"sha256",
knot_types::ObjectFormat::from_capability("sha256").unwrap(),
),
] {
let repo_dir = root.path().join(cap);
super::init_bare_export(&repo_dir, format)?;
let blob = git(&repo_dir, &["hash-object", "-w", "--stdin"]);
let tree_line = format!("100644 blob {blob}\tf\n");
let mut mktree = git_command(&repo_dir);
mktree
.arg("mktree")
.stdin(super::stdin_bytes(tree_line.as_bytes())?);
let tree = String::from_utf8(run_cmd(mktree, "mktree")?.stdout)?
.trim()
.to_string();
let mut ccmd = git_command(&repo_dir);
ccmd.args(["commit-tree", &tree, "-m", "c1"])
.env("GIT_AUTHOR_NAME", "t")
.env("GIT_AUTHOR_EMAIL", "t@t")
.env("GIT_COMMITTER_NAME", "t")
.env("GIT_COMMITTER_EMAIL", "t@t")
.stdin(super::stdin_bytes(b"")?);
let c1 = String::from_utf8(run_cmd(ccmd, "commit-tree")?.stdout)?
.trim()
.to_string();
git(&repo_dir, &["update-ref", "refs/heads/main", &c1]);
git(&repo_dir, &["update-ref", "refs/heads/feature", &c1]);
git(
&repo_dir,
&[
"-c",
"user.name=t",
"-c",
"user.email=t@t",
"tag",
"-a",
"-m",
"v1",
"v1",
&c1,
],
);
git(&repo_dir, &["tag", "v2-light", &c1]);
let tag_raw = git(&repo_dir, &["rev-parse", "refs/tags/v1"]);
let snap = RepoSnapshot {
repo_did: knot_types::RepoDid::new("did:plc:smarttest").unwrap(),
owner: knot_types::OwnerDid::new("did:plc:owner").unwrap(),
rkey: knot_types::RepoRkey::new("smart").unwrap(),
name: None,
head_capture: crate::snapshot::HeadCapture {
resolved: Some(c1.clone()),
symbolic: Some("refs/heads/main".into()),
unborn: false,
},
public_refs: vec![
crate::snapshot::PublicRef {
name: "refs/heads/feature".into(),
raw: c1.clone(),
peeled: None,
},
crate::snapshot::PublicRef {
name: "refs/heads/main".into(),
raw: c1.clone(),
peeled: None,
},
crate::snapshot::PublicRef {
name: "refs/tags/v1".into(),
raw: tag_raw,
peeled: Some(c1.clone()),
},
crate::snapshot::PublicRef {
name: "refs/tags/v2-light".into(),
raw: c1.clone(),
peeled: None,
},
],
cob_refs: vec![
("refs/cobs/org.tangled.track.ticket/1".into(), c1.clone()),
("refs/tngl/keep/1".into(), c1.clone()),
],
object_format: format,
};
super::update_refs(&repo_dir, &snap)?;
let mut km_ls_refs = super::v2_command(
&snap,
"ls-refs",
"knotmirror/0.0.1",
&[
"symrefs",
"peel",
"unborn",
"ref-prefix refs/heads/",
"ref-prefix refs/tags/",
"ref-prefix refs/cobs/",
"ref-prefix refs/tngl/keep/",
],
);
km_ls_refs.extend_from_slice(b"0000");
let mut git_ls_refs = super::v2_command(
&snap,
"ls-refs",
"git/knot-static",
&[
"peel",
"symrefs",
"unborn",
"ref-prefix HEAD",
"ref-prefix refs/heads/",
"ref-prefix refs/tags/",
],
);
git_ls_refs.extend_from_slice(b"0000");
let mut git_fetch_cobs = super::v2_command(
&snap,
"ls-refs",
"git/knot-static",
&[
"peel",
"symrefs",
"unborn",
"ref-prefix refs/heads/",
"ref-prefix refs/cobs/",
"ref-prefix refs/tngl/keep/",
"ref-prefix refs/tags/",
"ref-prefix HEAD",
],
);
git_fetch_cobs.extend_from_slice(b"0000");
for head_content in [
"ref: refs/heads/main\n".to_string(),
"ref: refs/heads/unborn\n".to_string(),
format!("{c1}\n"),
] {
std::fs::write(repo_dir.join("HEAD"), head_content.as_bytes())?;
let head = super::export_head_state(&repo_dir, &snap)?;
assert_eq!(
super::v0_advertisement(&snap, &head)?,
super::upload_pack(&repo_dir, &["--advertise-refs"], None, false)?,
"{cap} v0 adv ({})",
head_content.trim()
);
assert_eq!(
super::v2_advertisement(&snap)?,
super::upload_pack(&repo_dir, &["--advertise-refs"], None, true)?,
"{cap} v2 adv ({})",
head_content.trim()
);
assert_eq!(
super::v2_ls_refs(&snap, None, true),
super::upload_pack(&repo_dir, &[], Some(&km_ls_refs), true)?,
"{cap} ls-refs ({})",
head_content.trim()
);
assert_eq!(
super::v2_ls_refs(&snap, Some(&head), false),
super::upload_pack(&repo_dir, &[], Some(&git_ls_refs), true)?,
"{cap} ls-refs-head ({})",
head_content.trim()
);
assert_eq!(
super::v2_ls_refs(&snap, Some(&head), true),
super::upload_pack(&repo_dir, &[], Some(&git_fetch_cobs), true)?,
"{cap} ls-refs-head-cobs ({})",
head_content.trim()
);
}
}
Ok(())
}