Re: [PATCH 11/11] bundle: unbundle promisor packs
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Mar 4, 2022, 23:43 UTC
- Message-ID
- <xmqqzgm5wafu.fsf@gitster.g>
- In-Reply-To
- <ec51d0a50e6e64ae37795d77f7d33204b9b71ecd.1645638911.git.gitgitgadget@gmail.com>
"Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 7 quoted lines
> From: Derrick Stolee <derrickstolee@github.com> > > In order to have a valid pack-file after unbundling a bundle that has > the 'filter' capability, we need to generate a .promisor file. The > bundle does not promise _where_ the objects can be found, but we can > expect that these bundles will be unbundled in repositories with > appropriate promisor remotes that can find those missing objects.
That sounds like a lot of wishful thinking, but I do not think of a better way to phrase the idea. Taking a bundle out of a repository and unbundling it elsewhere is "git fetch" that could be done to send objects from the former to the latter repository, so I am OK with the assumption that the original repository will stay available for such users who took its contents over sneaker-net instead of over the wire.
Show 41 quoted lines
> Use the 'git index-pack --promisor=<message>' option to create this
> .promisor file. Add "from-bundle" as the message to help anyone diagnose
> issues with these promisor packs.
>
> Signed-off-by: Derrick Stolee <derrickstolee@github.com>
> ---
> bundle.c | 4 ++++
> t/t6020-bundle-misc.sh | 8 +++++++-
> 2 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/bundle.c b/bundle.c
> index e284ef63062..3d97de40ef0 100644
> --- a/bundle.c
> +++ b/bundle.c
> @@ -631,6 +631,10 @@ int unbundle(struct repository *r, struct bundle_header *header,
> struct child_process ip = CHILD_PROCESS_INIT;
> strvec_pushl(&ip.args, "index-pack", "--fix-thin", "--stdin", NULL);
>
> + /* If there is a filter, then we need to create the promisor pack. */
> + if (header->filter)
> + strvec_push(&ip.args, "--promisor=from-bundle");
> +
> if (extra_index_pack_args) {
> strvec_pushv(&ip.args, extra_index_pack_args->v);
> strvec_clear(extra_index_pack_args);
> diff --git a/t/t6020-bundle-misc.sh b/t/t6020-bundle-misc.sh
> index 39cfefafb65..344af34db1e 100755
> --- a/t/t6020-bundle-misc.sh
> +++ b/t/t6020-bundle-misc.sh
> @@ -513,7 +513,13 @@ do
> The bundle uses this filter: $filter
> The bundle records a complete history.
> EOF
> - test_cmp expect actual
> + test_cmp expect actual &&
> +
> + # This creates the first pack-file in the
> + # .git/objects/pack directory. Look for a .promisor.
> + git bundle unbundle partial.bdl &&
> + ls .git/objects/pack/pack-*.promisor >promisor &&
> + test_line_count = 1 promisorOK. Do we also want to inspect the contents of the resulting repository to make sure that the bundle had the right contents?
One idea to do so would probably be
- prepare a test repository (you already have it) - prepare a partial.bdl (you already do this)
- clone the test repository into a new repository, with the same filter - create an empty repository, unbundle the partial.bdl
- take "for-each-ref" and list of objects available in these two "partial copies" from the test repository, and compare