From 9568c6ef6f280cea107fb1c8e779864b491e3879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 26 Jun 2025 19:29:08 +0200 Subject: [PATCH 1/2] Add --asset_dir to blame-copy-royal --- tests/it/src/args.rs | 4 +++ tests/it/src/commands/blame_copy_royal.rs | 34 +++++++++++++---------- tests/it/src/main.rs | 2 ++ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/tests/it/src/args.rs b/tests/it/src/args.rs index d3b1bf75131..145bbd9563b 100644 --- a/tests/it/src/args.rs +++ b/tests/it/src/args.rs @@ -4,6 +4,7 @@ use clap::{ builder::{OsStringValueParser, TypedValueParser}, Arg, Command, Error, }; +use gix::bstr::BString; #[derive(Debug, clap::Parser)] #[clap(name = "it", about = "internal tools to help create test cases")] @@ -51,6 +52,9 @@ pub enum Subcommands { worktree_dir: PathBuf, /// The directory into which to copy the files. destination_dir: PathBuf, + /// The directory to place assets in. + #[clap(long)] + asset_dir: Option, /// The file to extract the history for. file: std::ffi::OsString, /// Do not use `copy-royal` to obfuscate the content of blobs, but copy it verbatim. diff --git a/tests/it/src/commands/blame_copy_royal.rs b/tests/it/src/commands/blame_copy_royal.rs index cef93929a9b..75a31bd90e2 100644 --- a/tests/it/src/commands/blame_copy_royal.rs +++ b/tests/it/src/commands/blame_copy_royal.rs @@ -23,6 +23,7 @@ pub(super) mod function { dry_run: bool, worktree_dir: &Path, destination_dir: PathBuf, + asset_dir: Option, file: &OsStr, Options { verbatim }: Options, ) -> anyhow::Result<()> { @@ -76,7 +77,8 @@ pub(super) mod function { .blame_path .expect("blame path to be present as `debug_track_path == true`"); - let assets = destination_dir.join("assets"); + let asset_dir = asset_dir.unwrap_or("assets".into()); + let assets = destination_dir.join(asset_dir.to_os_str()?); eprintln!("{prefix} create directory '{assets}'", assets = assets.display()); if !dry_run { @@ -107,7 +109,7 @@ pub(super) mod function { } } - let mut blame_script = BlameScript::new(blame_infos, Options { verbatim }); + let mut blame_script = BlameScript::new(blame_infos, asset_dir, Options { verbatim }); blame_script.generate()?; let script_file = destination_dir.join("create-history.sh"); @@ -130,9 +132,9 @@ pub(super) mod function { } enum BlameScriptOperation { - InitRepository, + InitRepository(BString), RemoveFile(String), - CommitFile(BString, ObjectId), + CommitFile(BString, BString, ObjectId), CheckoutTag(ObjectId), PrepareMerge(Vec), CreateTag(ObjectId), @@ -141,7 +143,7 @@ pub(super) mod function { impl Display for BlameScriptOperation { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - BlameScriptOperation::InitRepository => write!( + BlameScriptOperation::InitRepository(asset_dir) => write!( f, r"#!/bin/sh @@ -149,7 +151,7 @@ set -e git init echo .gitignore >> .gitignore -echo assets/ >> .gitignore +echo {asset_dir}/ >> .gitignore echo create-history.sh >> .gitignore " @@ -160,7 +162,7 @@ echo create-history.sh >> .gitignore git rm {src} " ), - BlameScriptOperation::CommitFile(src, commit_id) => { + BlameScriptOperation::CommitFile(asset_dir, src, commit_id) => { writeln!(f, r"# make file {src} contain content at commit {commit_id}")?; if let Some(pos) = src.rfind_byte(b'/') { let dirname = src[..pos].as_bstr(); @@ -168,8 +170,7 @@ git rm {src} } write!( f, - r"# -cp ./assets/{commit_id}.commit ./{src} + r"cp ./{asset_dir}/{commit_id}.commit ./{src} git add {src} git commit -m {commit_id} " @@ -194,17 +195,19 @@ git commit -m {commit_id} blame_infos: Vec, seen: BTreeSet, script: Vec, + asset_dir: BString, options: Options, } impl BlameScript { - fn new(blame_infos: Vec, options: Options) -> Self { - let script = vec![BlameScriptOperation::InitRepository]; + fn new(blame_infos: Vec, asset_dir: BString, options: Options) -> Self { + let script = vec![BlameScriptOperation::InitRepository(asset_dir.clone())]; Self { blame_infos, seen: BTreeSet::default(), script, + asset_dir, options, } } @@ -265,7 +268,8 @@ git commit -m {commit_id} if let Some(delete_previous_file_operation) = delete_previous_file_operation { self.script.push(delete_previous_file_operation); } - self.script.push(BlameScriptOperation::CommitFile(src, commit_id)); + self.script + .push(BlameScriptOperation::CommitFile(self.asset_dir.clone(), src, commit_id)); } else { let ([first], rest) = parents.split_at(1) else { unreachable!(); @@ -277,7 +281,8 @@ git commit -m {commit_id} if let Some(delete_previous_file_operation) = delete_previous_file_operation { self.script.push(delete_previous_file_operation); } - self.script.push(BlameScriptOperation::CommitFile(src, commit_id)); + self.script + .push(BlameScriptOperation::CommitFile(self.asset_dir.clone(), src, commit_id)); } else { self.script.push(BlameScriptOperation::PrepareMerge( rest.iter().map(|blame_path_entry| blame_path_entry.commit_id).collect(), @@ -286,7 +291,8 @@ git commit -m {commit_id} if let Some(delete_previous_file_operation) = delete_previous_file_operation { self.script.push(delete_previous_file_operation); } - self.script.push(BlameScriptOperation::CommitFile(src, commit_id)); + self.script + .push(BlameScriptOperation::CommitFile(self.asset_dir.clone(), src, commit_id)); } } diff --git a/tests/it/src/main.rs b/tests/it/src/main.rs index 9ce46e98a87..df22a7e8c6f 100644 --- a/tests/it/src/main.rs +++ b/tests/it/src/main.rs @@ -29,12 +29,14 @@ fn main() -> anyhow::Result<()> { dry_run, worktree_dir: worktree_root, destination_dir, + asset_dir, file, verbatim, } => commands::blame_copy_royal( dry_run, &worktree_root, destination_dir, + asset_dir, &file, commands::blame_copy_royal::Options { verbatim }, ), From 73a30f8a91fcf5db1244a9a5388e05f4349b0c2e Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 27 Jun 2025 05:01:06 +0200 Subject: [PATCH 2/2] Fix CI by not using `-t bad` --- .github/workflows/ci.yml | 1 + .../make_rev_spec_parse_repos.tar | Bin 1125888 -> 1125888 bytes .../fixtures/make_rev_spec_parse_repos.sh | 35 ++++++++++++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 46bdb84b19c..ab698934c86 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -298,6 +298,7 @@ jobs: libssl-dev libstdc++6:${{ matrix.runner-arch }} # To support external 64-bit Node.js for actions. pkgconf + python3-minimal ) dpkg --add-architecture ${{ matrix.runner-arch }} apt-get update diff --git a/gix/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar b/gix/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar index 580318e487613f19e9e0ac89cdf74d8b06ecf542..bfd170c64aa2817476be80defa78259d41d82f1b 100644 GIT binary patch delta 2740 zcmb7`eNa?Y7{>QpfxUNk@7_gLKwudh5SZlS?k?_vAu6tbh80vZMTJ>vOJnq*k~m80 zxGp-A2y1(ZA>9-hKQI{4dl)1_#t(83Ej2L_W*k#17H1-Ch61|h+-o0B1DC(vzn=HJ z=Xaj-oU^spwzb#RsL=%5^Ji&@s<)aSSD;V?_{P{?bwz1%^uELEVa@l)?;R;^i{afv zy!n3FPjH)u`Uq462Xmp1n5C{!gOam%`>;)wTJI6UVrp_W#}Jy#g7xohELgQVd*z$! zxV~QISt=!kO)@20tgK6Q`e6kh&Mj!AXO~CJstEUS+3yMRRxiNvHktA^+OH|9VBzQUvbtAX=zOv}SNoAs|P;iK;49 zRe8=t)@Np(ymhfrzB~Ryn1IzD#nP6ugu`_Sl&O9GJ&lj|VYDk3mjZZ^0+;5x$)lMST z4-&CTRS{ld#)_&Mv;?Z+5*dCX>~H^UT3PYym1FB})CPyf7Z>)QF5WJ}cGoK{$eam+ zw>bL=B?~J(O79n#OgbqOzdMUu#IYS95;s|>Hp0&`$N_+xWKE%ol?ywpi^omcfC0<1 zWy|Z8CN8K^XZmL&&y(KQ3CmpQ{F2O`^t3Lz-O6|ve}e4y$1t_dv1sv^uKZ-_8| zA3Jr)6;jf(X;s!$SNnsvOY*N4OEA00Ct;o^C75iZ8qv7ntT+N}^dfg)aX? z^F!J4F7ip5MU+JI8YPEj7b(!}p(L8q6$|$wny5-Nn=s7)+wiB>uH#3S=N4td2Se>M zsdxK0<3_C+dhUQFz&%JMBYVaPrwZ)@ltB!JJu0~{cdODwnBxXt&YngJ)~rxTF!xQN zOA4~)oc~y}Qnq}MNL`)~IvzHb+lt&5O%+ z1f0?DZFu3_zBN}Cu8>kUPp$b5IbR)mZ|mseDyq|y@C(A&iJaYed{*bhO zAT6bSGcEUUPta*xghv;R&CyC5#3!I_3i^56e3pq3Z`$L?>5#4Oq*J)mBqmnW2ht{3 zb)NpEmawwWxmNq!q?vQU9Z0i~eP7!vW{$Gf>5sUfDsr>6h}=TII`F}ofZe->p1FCc z)U$uXoZQlU3H@GeDoov>T`Jy;Xhtr)I3^QiwgHSDP~a2?6@g3nU4r&;j9)& zPP%3MT)Q`GlVNfav%HS5nxXRtCU;WZSwUll=04`;3~W;Kf^&C}Nl_J1E#|qX-VzK UHxw3ZggJMa1|S4SU9>;>7aeD|x&QzG delta 2514 zcma);drVVT9LIYukKWt%_O{B)N=b~?LKyKufVl^bp>773>7eW(noTCV=ibX6#;*MJ`{(z) z=XXBmd%ovZk2jAYG-`X3jl{v$;qK}>l z*6Hg9wUwAL4Z4E>_3Ju!mT0H5%+1V;=G&`A1SdFztcy7yfSJ>8-o=q$+ zSah;;$zj+BVf|IG0Mr#@b;Tid#i739FmM_Gh-t!SLQsthpCJHnVM*Z-OOndApe4#Q zjT`69R$+g4s>6IELUmQ0J(jJ&p#vkU8NlhSanM>=tk z2a$sZq08jq%UQYyEaJu4@-(<_1wIaVao!xn8EouPm7W)O0WB{p2r6rl8rW#B%J9#? zkK+?1Sh^XyKEw+G`Oc1g&M;Cv)VJYR)I2Sf{>~mm3ssTUDuLGX`KR`6Z&dCZncmsf zIi@}It7FwHt$zGoT79@k%Si;I0qnaDx%s}i%*NZXLB>y{ z!qgS=OT6>erte(Y!J*`<7zOWhQ6Mjj&?ghWztZ|@s;a*w{;A)F|5)A8(Jf|Pv0QP1 zPfSTxSrn%(MO9GSLeYCNKRelyp11P&6W;3!rox8W*1fpna(m6#Ho)X5bWpccF@BBr zy&R0X(Ltgr9%P7ckYxPGGiyGI3p+UcX|rj=2js#huT+VvN0DOUo+N{vT^pIn>O87M z{>(c`tq{LmbI>hg?KHJmxE-^3&=XX5hP1La6O|-2{Uu~yixgB;6NB) zqDUIjFDOTaKnP=WLkJA20vNkj0Hc-v?5{d;>gHFu9RsItd}i5l?!7wE;k%VKXxpXC z7o43)1*4Nf<)XyY@+OM|sgPYl`Gv$xnS42>0IrUHer5CKG>B7)Hez(xY0BVP-D14+Uz6>L%4B#=YX4AQs)| z3XINxuA_nbkEtd@(W~!O)t2&*l> baseline.git } +function loose-obj() { + # Read content from stdin, compute header and hash, write compressed object + script=$(cat <<'EOF' +import sys +import hashlib +import zlib +import os + +type = sys.argv[1] +objects_dir = sys.argv[2] +content = sys.stdin.buffer.read() +header = f"{type} {len(content)}\0".encode() +full = header + content +sha1 = hashlib.sha1(full).hexdigest() +compressed = zlib.compress(full) + +bucket = f"{objects_dir}/" + sha1[:2] +filename = sha1[2:] + +os.makedirs(bucket, exist_ok=True) +with open(f"{bucket}/{filename}", "wb") as f: + f.write(compressed) + +print(sha1) +EOF +) + python3 -c "$script" "$@" +} + # The contents of this file is based on https://github.com/git/git/blob/8168d5e9c23ed44ae3d604f392320d66556453c9/t/t1512-rev-parse-disambiguation.sh#L38 git init --bare blob.prefix ( @@ -31,11 +60,11 @@ git init --bare blob.bad cd blob.bad # Both have the prefix "bad0" # Maybe one day we have a test to see how disambiguation reporting deals with this. - echo xyzfaowcoh | git hash-object -t bad -w --stdin --literally - echo xyzhjpyvwl | git hash-object -t bad -w --stdin --literally + echo xyzfaowcoh | loose-obj bad objects + echo xyzhjpyvwl | loose-obj bad objects baseline "bad0" - echo 1bbfctrkc | git hash-object -t bad -w --stdin --literally + echo 1bbfctrkc | loose-obj bad objects baseline "e328" baseline "e328^{object}" )