Jonathan Tan <jonathanta...@google.com> writes:

> When doing a partial clone or fetch with transfer.fsckobjects=1, use the
> --fsck-objects instead of the --strict flag when invoking index-pack so
> that links are not checked, only objects. This is because incomplete
> links are expected when doing a partial clone or fetch.

It is expected that _some_ links are missing, but this makes me
wonder if we can do better than disabling the connectivity check
altogether.  Does "git fetch" lack sufficient information to attempt
the connectivity check, and when (and only when) it hits a broken
link, see if that is because the connectivity check traversal is
crossing a "partial" fetch boundary, or something along that line?

>
> Signed-off-by: Jonathan Tan <jonathanta...@google.com>
> ---
>  fetch-pack.c             | 13 +++++++++++--
>  t/t5616-partial-clone.sh | 11 +++++++++++
>  2 files changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/fetch-pack.c b/fetch-pack.c
> index d97461296..1d6117565 100644
> --- a/fetch-pack.c
> +++ b/fetch-pack.c
> @@ -886,8 +886,17 @@ static int get_pack(struct fetch_pack_args *args,
>           ? fetch_fsck_objects
>           : transfer_fsck_objects >= 0
>           ? transfer_fsck_objects
> -         : 0)
> -             argv_array_push(&cmd.args, "--strict");
> +         : 0) {
> +             if (args->from_promisor)
> +                     /*
> +                      * We cannot use --strict in index-pack because it
> +                      * checks both broken objects and links, but we only
> +                      * want to check for broken objects.
> +                      */
> +                     argv_array_push(&cmd.args, "--fsck-objects");
> +             else
> +                     argv_array_push(&cmd.args, "--strict");
> +     }
>  
>       cmd.in = demux.out;
>       cmd.git_cmd = 1;
> diff --git a/t/t5616-partial-clone.sh b/t/t5616-partial-clone.sh
> index 29d863118..cee556536 100755
> --- a/t/t5616-partial-clone.sh
> +++ b/t/t5616-partial-clone.sh
> @@ -143,4 +143,15 @@ test_expect_success 'manual prefetch of missing objects' 
> '
>       test_line_count = 0 observed.oids
>  '
>  
> +test_expect_success 'partial clone with transfer.fsckobjects=1 uses 
> index-pack --fsck-objects' '
> +     git init src &&
> +     test_commit -C src x &&
> +     test_config -C src uploadpack.allowfilter 1 &&
> +     test_config -C src uploadpack.allowanysha1inwant 1 &&
> +
> +     GIT_TRACE="$(pwd)/trace" git -c transfer.fsckobjects=1 \
> +             clone --filter="blob:none" "file://$(pwd)/src" dst &&
> +     grep "git index-pack.*--fsck-objects" trace
> +'
> +
>  test_done

Reply via email to