Re: [PATCH v4] repository: move fetch_if_missing into struct repository

Junio C Hamano <[email protected]>
Newsgroups org.kernel.vger.git
Message-ID <[email protected]>
Tian Yuchen <[email protected]> writes:

> The global variable 'fetch_if_missing' controls whether a missing
> object check should prompt a lazy fetch from a promisor remote.
> In order to continue the libification effort, move it into
> 'struct repository' and initialize it to 1 by default to keep the
> previous behavior.
>
> Note that in builtin/fsck.c and builtin/index-pack.c, when running
> related commands with the '-h' parameter, the 'repo' pointer is not
> passed in. To prevent null pointer dereferences, we defer
> operations on the repo until after parameter parsing is complete.
>
> Additionally, update the partial clone documentation to reflect
> that this is now a per-repository flag.
>
> Mentored-by: Christian Couder <[email protected]>
> Mentored-by: Ayush Chandekar <[email protected]>
> Mentored-by: Olamide Caleb Bello <[email protected]>
> Signed-off-by: Tian Yuchen <[email protected]>
> ---
>
> Changes since v3:
>
>  - Use revs->repo in revision.c instead of the_repository.
>
>  - Coordinate the other topics. Specifically, for common-init.c, use
>  the_repository->fetch_if_missing in setup_environment(), etc. This patch
>  currently does not conflict with seen or next.
>
>  Documentation/technical/partial-clone.adoc |  2 +-
>  builtin/fetch-pack.c                       |  2 +-
>  builtin/fsck.c                             |  6 +++---
>  builtin/index-pack.c                       |  8 ++++----
>  builtin/pack-objects.c                     | 14 +++++++-------
>  builtin/prune.c                            |  2 +-
>  builtin/rev-list.c                         | 10 +++++-----
>  common-init.c                              |  2 +-
>  git.c                                      |  2 +-
>  midx-write.c                               |  2 +-
>  odb.c                                      |  4 +---
>  odb.h                                      |  8 --------
>  repository.c                               |  1 +
>  repository.h                               |  6 ++++++
>  revision.c                                 |  2 +-
>  15 files changed, 34 insertions(+), 37 deletions(-)

There still are references to the_repository->fetch_if_missing
remaining in the codebase with this change.

        $ git grep -l -e 'the_repository->fetch_if_missing'
        builtin/fetch-pack.c
        builtin/pack-objects.c
        builtin/rev-list.c
        common-init.c
        git.c

Some of them I suspect should just use the caller supplied 'repo',
possibly after removing the UNUSED marker.  For example:

        int cmd_fetch_pack(int argc,
                           const char **argv,
                           const char *prefix UNUSED,
                           struct repository *repo UNUSED)
        {
                int i, ret;
        ...
                enum protocol_version version;

                the_repository->fetch_if_missing = 0;

                packet_trace_identity("fetch-pack");

                memset(&args, 0, sizeof(args));
                list_objects_filter_init(&args.filter_options);
                args.uploadpack = "git-upload-pack";

                show_usage_if_asked(argc, argv, fetch_pack_usage);

As { "fetch-pack", cmd_fetch_pack } in the git.c:commands[] array is
marked as RUN_SETUP, repo will not be NULL unless "git fetch-pack -h"
is requested, and when repo is NULL, show_usage_if_asked() will give
the short help text and never return.

So I think it makes sense to set 'fetch_if_missing' *after* the call
to show_usage_if_asked() and set it in 'repo', not in 'the_repository'.

Other hits in the above "git grep" output looked similar.  The code
paths in pack-objects.c may need a preliminary clean-up patch (or
two) before moving fetch_if_missing to the repository instance.
I.e., pass repo through the call graph from cmd_pack_objects() to
read_stdin_packs(), and then update assignments to fetch_if_missing
variable to instead assign to repo->fetch_if_missing in a second
step.  There are other code paths that want similar clean-up.

HTH.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.