At 2024-06-12 04:05:35, "Junio C Hamano" <gitster@xxxxxxxxx> wrote: >"Xing Xin via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > >> From: Xing Xin <xingxin.xx@xxxxxxxxxxxxx> >> >> This commit extends object verification support for fetches in >> `bundle.c:unbundle` by adding the `VERIFY_BUNDLE_FSCK_FOLLOW_FETCH` >> option to `verify_bundle_flags`. When this option is enabled, >> `bundle.c:unbundle` invokes `fetch-pack.c:fetch_pack_fsck_objects` to >> determine whether to append the "--fsck-objects" flag to >> "git-index-pack". > >Please start your proposed log message by stating what the perceived >problem without this patch in the current world is. Without it, you >cannot easily answer the most basic question: "why are we doing this?" Got it. >The name VERIFY_BUNDLE_FSCK_FOLLOW_FETCH does not read very well. >VERIFY_BUNDLE part is common across various flags, so what is >specific to the feature is "FSCK_FOLLOW_FETCH", and it is good that >we convey the fact that we do a bit more than the normal >VERIFY_BUNDLE (which is, to read the prerequisite headers and make >sure we have them in the sense that they are reachable from our >refs) with the word FSCK. > >But is it necessary (or even a good idea) to limit its usability >with "FOLLOW_FETCH" (which does not look even grammatical)? Aren't >we closing the door to other folks who may want to do a more >thorough fsck-like checks in other codepaths by saying "if you are >not doing this immediately after you fetch, you are unwelcome to use >this flag"? I initially considered adding another option VERIFY_BUNDLE_FSCK_ALWAYS for other scenarios, which would take a higher priority than VERIFY_BUNDLE_FSCK_FOLLOW_FETCH. However, that approach is also confusing, as we would have two flags both controlling the fsck behavior. How about extending VERIFY_BUNDLE_FSCK and letting the callers decide whether to add the flag for fscking? In bundle.c, we can make a small change like: @@ -625,6 +626,9 @@ int unbundle(struct repository *r, struct bundle_header *header, if (header->filter.choice) strvec_push(&ip.args, "--promisor=from-bundle"); + if (flags & VERIFY_BUNDLE_FSCK) + strvec_push(&ip.args, "--fsck-objects"); + if (extra_index_pack_args) { strvec_pushv(&ip.args, extra_index_pack_args->v); strvec_clear(extra_index_pack_args); For example, in `bundle-uri.c:unbundle_from_file`, which is one of the callers of unbundle, we can use `fetch_pack_fsck_objects` to decide whether to add that option: @@ -373,7 +373,7 @@ static int unbundle_from_file(struct repository *r, const char *file) * the prerequisite commits. */ if ((result = unbundle(r, &header, bundle_fd, NULL, - VERIFY_BUNDLE_QUIET))) + VERIFY_BUNDLE_QUIET | (fetch_pack_fsck_objects() ? VERIFY_BUNDLE_FSCK : 0)))) return 1; This approach should streamline the code while maintaining flexibility. The follow-up patch you mentioned below should just work then, it is not for now because we are touching the unwanted `fetch_pack_fsck_objects` within `unbundle`. Xing Xin >I wonder if something like this is a potential follow-up topic >somebody may be interested in after the dust settles. That is >exactly why the name of this bit matters. > > > > builtin/bundle.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > >diff --git c/builtin/bundle.c w/builtin/bundle.c >index d5d41a8f67..eeb5963dcb 100644 >--- c/builtin/bundle.c >+++ w/builtin/bundle.c >@@ -194,10 +194,13 @@ static int cmd_bundle_unbundle(int argc, const char **argv, const char *prefix) > int bundle_fd = -1; > int ret; > int progress = isatty(2); >+ int fsck_objects = 0; > > struct option options[] = { > OPT_BOOL(0, "progress", &progress, > N_("show progress meter")), >+ OPT_BOOL(0, "fsck-objects", &fsck_objects, >+ N_("check the objects in the bundle")), > OPT_END() > }; > char *bundle_file; >@@ -217,7 +220,8 @@ static int cmd_bundle_unbundle(int argc, const char **argv, const char *prefix) > strvec_pushl(&extra_index_pack_args, "-v", "--progress-title", > _("Unbundling objects"), NULL); > ret = !!unbundle(the_repository, &header, bundle_fd, >- &extra_index_pack_args, 0) || >+ &extra_index_pack_args, >+ fsck_objects ? VERIFY_BUNDLE_FSCK_FOLLOW_FETCH : 0) || > list_bundle_refs(&header, argc, argv); > bundle_header_release(&header); > cleanup: