git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jacob Keller <jacob.keller@gmail.com>
To: Stefan Beller <sbeller@google.com>
Cc: Git mailing list <git@vger.kernel.org>,
	"brian m. carlson" <sandals@crustytoothpaste.net>,
	Jonathan Nieder <jrnieder@gmail.com>,
	Brandon Williams <bmwill@google.com>,
	Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH 08/15] submodules: introduce check to see whether to touch a submodule
Date: Fri, 17 Feb 2017 10:36:20 -0800	[thread overview]
Message-ID: <CA+P7+xqpxTt7KibOrVr2ekjLy6Hva4KJ6nCaN22j-Qpspky3aQ@mail.gmail.com> (raw)
In-Reply-To: <20170216003811.18273-9-sbeller@google.com>

On Wed, Feb 15, 2017 at 4:38 PM, Stefan Beller <sbeller@google.com> wrote:
> In later patches we introduce the --recurse-submodule flag for commands
> that modify the working directory, e.g. git-checkout.
>
> It is potentially expensive to check if a submodule needs an update,
> because a common theme to interact with submodules is to spawn a child
> process for each interaction.
>
> So let's introduce a function that checks if a submodule needs
> to be checked for an update before attempting the update.
>
> Signed-off-by: Stefan Beller <sbeller@google.com>
> ---
>  submodule.c | 27 +++++++++++++++++++++++++++
>  submodule.h | 13 +++++++++++++
>  2 files changed, 40 insertions(+)
>
> diff --git a/submodule.c b/submodule.c
> index 591f4a694e..2a37e03420 100644
> --- a/submodule.c
> +++ b/submodule.c
> @@ -548,6 +548,33 @@ void set_config_update_recurse_submodules(int value)
>         config_update_recurse_submodules = value;
>  }
>
> +int touch_submodules_in_worktree(void)
> +{
> +       /*
> +        * Update can't be "none", "merge" or "rebase",
> +        * treat any value as OFF, except an explicit ON.
> +        */
> +       return config_update_recurse_submodules == RECURSE_SUBMODULES_ON;
> +}

Ok, so here, we're just checking whether the value is
RECURSE_SUBMODULES_ON. The comment doesn't make sense to me at all.
What is "update" and why "can't" it be those values? How is this code
treating thise values as OFF exept for an explicit ON?

At first I thought this comment was related to check in the previous
patch. I think I see the patch is "recurse submodules = true" or
"recurse submodules = checkout" as a specific strategy? Ie:
recurse-submodules=checkout" means "recurse into submodules and update
them using checkout strategy?

Ok this starts to make a bit more sense. However, it's still somewhat
confusing to me.

Maybe this should be called something like
recurse_into_submodules_in_worktree() though that is pretty verbose.

I'm not sure I have a good name really. But I wonder why we need this
in the first place. Basically, we set RECURSE_SUBMODULES_* value which
could be OFF, ON, or even future extensions of CHECKOUT, REBASE,
MERGE, etc?

But shouldn't we just return the mode, and let the later code decide
"oh. actually I don't support this mode". For now, obviously we
wouldn't set any of the new modes yet.

> +
> +int is_active_submodule_with_strategy(const struct cache_entry *ce,
> +                                     enum submodule_update_type strategy)
> +{
> +       const struct submodule *sub;
> +
> +       if (!S_ISGITLINK(ce->ce_mode))
> +               return 0;
> +
> +       if (!touch_submodules_in_worktree())
> +               return 0;
> +
> +       sub = submodule_from_path(null_sha1, ce->name);
> +       if (!sub)
> +               return 0;
> +
> +       return sub->update_strategy.type == strategy;
> +}
> +

I liked Junio's suggestion where this just returns the strategy that
it can use, or 0 if it shouldn't be updated. Then, other code just
decides: Yes, I can use this strategy or no I cannot.

Should this be tied in with the strategy used by the
recurse_submodules above? ie: when/if we support recursing using other
strategies, shouldn't we make these match here, so that if the recurse
mode is "checkout" we don't checkout a submodule that was configured
to be rebased? Or do you want to blindly apply checkout to all
submodules even if they don't have strategy?

I assume you do not, since you check here with passing a strategy
value, and then see if it matches.

this could be named something like:

get_active_submodule_strategy() and return the strategy directly. It
would then return 0 in any case where it shouldn't be updated. Later
code can then check the strategy.

>  static int has_remote(const char *refname, const struct object_id *oid,
>                       int flags, void *cb_data)
>  {
> diff --git a/submodule.h b/submodule.h
> index b4e60c08d2..46d9f0f293 100644
> --- a/submodule.h
> +++ b/submodule.h
> @@ -65,6 +65,19 @@ extern void show_submodule_inline_diff(FILE *f, const char *path,
>                 const struct diff_options *opt);
>  extern void set_config_fetch_recurse_submodules(int value);
>  extern void set_config_update_recurse_submodules(int value);
> +
> +/*
> + * Traditionally Git ignored changes made for submodules.
> + * This function checks if we are interested in the given submodule
> + * for any kind of operation.

This comment seems a bit weird.

> + */
> +extern int touch_submodules_in_worktree(void);
> +/*
> + * Check if the given ce entry is a submodule with the given update
> + * strategy configured.

I like Junio's suggestion of this "getting the current configured
strategy for a submodule. When we aren't set to recurse into
submodules we (obviously) return that we have no strategy since we're
not going to update it at all.

> + */
> +extern int is_active_submodule_with_strategy(const struct cache_entry *ce,
> +                                            enum submodule_update_type strategy);
>  extern void check_for_new_submodule_commits(unsigned char new_sha1[20]);
>  extern int fetch_populated_submodules(const struct argv_array *options,
>                                const char *prefix, int command_line_option,
> --
> 2.12.0.rc1.16.ge4278d41a0.dirty
>

  parent reply	other threads:[~2017-02-17 18:36 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-15  0:34 [RFCv3 PATCH 00/14] Checkout aware of Submodules! Stefan Beller
2017-02-15  0:34 ` [PATCH 01/14] lib-submodule-update.sh: reorder create_lib_submodule_repo Stefan Beller
2017-02-15  1:44   ` brian m. carlson
2017-02-15  0:34 ` [PATCH 02/14] lib-submodule-update.sh: define tests for recursing into submodules Stefan Beller
2017-02-15 16:51   ` Brandon Williams
2017-02-15 18:52     ` Stefan Beller
2017-02-15  0:34 ` [PATCH 03/14] make is_submodule_populated gently Stefan Beller
2017-02-15 18:10   ` Junio C Hamano
2017-02-15 22:42     ` Stefan Beller
2017-02-15  0:34 ` [PATCH 04/14] connect_work_tree_and_git_dir: safely create leading directories Stefan Beller
2017-02-15 18:22   ` Junio C Hamano
2017-02-15 22:52     ` Stefan Beller
2017-02-15 23:19       ` Junio C Hamano
2017-02-15  0:34 ` [PATCH 05/14] update submodules: add submodule config parsing Stefan Beller
2017-02-15 18:29   ` Junio C Hamano
2017-02-15  0:34 ` [PATCH 06/14] update submodules: add a config option to determine if submodules are updated Stefan Beller
2017-02-15  0:34 ` [PATCH 07/14] update submodules: introduce is_interesting_submodule Stefan Beller
2017-02-15 17:04   ` Brandon Williams
2017-02-15 18:46     ` Stefan Beller
2017-02-15  0:34 ` [PATCH 08/14] update submodules: move up prepare_submodule_repo_env Stefan Beller
2017-02-15  0:34 ` [PATCH 09/14] update submodules: add submodule_go_from_to Stefan Beller
2017-02-15  2:06   ` brian m. carlson
2017-02-15  0:34 ` [PATCH 10/14] unpack-trees: pass old oid to verify_clean_submodule Stefan Beller
2017-02-15  0:34 ` [PATCH 11/14] unpack-trees: check if we can perform the operation for submodules Stefan Beller
2017-02-15  0:34 ` [PATCH 12/14] read-cache: remove_marked_cache_entries to wipe selected submodules Stefan Beller
2017-02-15  0:34 ` [PATCH 13/14] entry.c: update submodules when interesting Stefan Beller
2017-02-15  0:34 ` [PATCH 14/14] builtin/checkout: add --recurse-submodules switch Stefan Beller
2017-02-15  2:08   ` brian m. carlson
2017-02-16  0:33     ` Stefan Beller
2017-02-15  2:13 ` [RFCv3 PATCH 00/14] Checkout aware of Submodules! brian m. carlson
2017-02-15 18:34 ` Junio C Hamano
2017-02-16  0:37   ` [RFCv4 " Stefan Beller
2017-02-16  0:37     ` [PATCH 01/15] lib-submodule-update.sh: reorder create_lib_submodule_repo Stefan Beller
2017-02-16  0:37     ` [PATCH 02/15] lib-submodule-update.sh: do not use ./. as submodule remote Stefan Beller
2017-02-16  0:37     ` [PATCH 03/15] lib-submodule-update.sh: define tests for recursing into submodules Stefan Beller
2017-02-16 20:39       ` Junio C Hamano
2017-02-22 18:43         ` Stefan Beller
2017-02-16  0:38     ` [PATCH 04/15] make is_submodule_populated gently Stefan Beller
2017-02-16  0:38     ` [PATCH 05/15] connect_work_tree_and_git_dir: safely create leading directories Stefan Beller
2017-02-16 20:54       ` Junio C Hamano
2017-02-16 21:16         ` Stefan Beller
2017-02-16 21:25           ` Junio C Hamano
2017-02-16  0:38     ` [PATCH 06/15] update submodules: add submodule config parsing Stefan Beller
2017-02-17 18:24       ` Jacob Keller
2017-02-21 19:42         ` Stefan Beller
2017-02-21 20:48           ` Jacob Keller
2017-02-16  0:38     ` [PATCH 07/15] update submodules: add a config option to determine if submodules are updated Stefan Beller
2017-02-16  0:38     ` [PATCH 08/15] submodules: introduce check to see whether to touch a submodule Stefan Beller
2017-02-16 21:02       ` Junio C Hamano
2017-02-16 22:34       ` Jacob Keller
2017-02-17 18:36       ` Jacob Keller [this message]
2017-02-21 20:56         ` Stefan Beller
2017-02-16  0:38     ` [PATCH 09/15] update submodules: move up prepare_submodule_repo_env Stefan Beller
2017-02-16  0:38     ` [PATCH 10/15] update submodules: add submodule_go_from_to Stefan Beller
2017-02-16 21:15       ` Junio C Hamano
2017-02-16 21:33         ` Stefan Beller
2017-02-16  0:38     ` [PATCH 11/15] unpack-trees: pass old oid to verify_clean_submodule Stefan Beller
2017-02-16 21:19       ` Junio C Hamano
2017-02-16  0:38     ` [PATCH 12/15] unpack-trees: check if we can perform the operation for submodules Stefan Beller
2017-02-16 18:01       ` Brandon Williams
2017-02-16 21:23       ` Junio C Hamano
2017-02-17 18:42       ` Jacob Keller
2017-02-21 22:16         ` Stefan Beller
2017-02-21 23:35           ` Jacob Keller
2017-02-21 23:44             ` Stefan Beller
2017-02-22  0:31               ` Jacob Keller
2017-02-16  0:38     ` [PATCH 13/15] read-cache: remove_marked_cache_entries to wipe selected submodules Stefan Beller
2017-02-16 21:32       ` Junio C Hamano
2017-02-16  0:38     ` [PATCH 14/15] entry.c: update submodules when interesting Stefan Beller
2017-02-16  0:38     ` [PATCH 15/15] builtin/checkout: add --recurse-submodules switch Stefan Beller
2017-02-16 22:00     ` [RFCv4 PATCH 00/14] Checkout aware of Submodules! Junio C Hamano
2017-02-16 22:54       ` Jacob Keller
2017-02-16 22:56         ` Stefan Beller
2017-02-16 23:27           ` Jacob Keller
2017-02-23 22:57       ` [RFCv5 " Stefan Beller
2017-02-23 22:57         ` [PATCH 01/15] lib-submodule-update.sh: reorder create_lib_submodule_repo Stefan Beller
2017-02-23 22:57         ` [PATCH 02/15] lib-submodule-update.sh: do not use ./. as submodule remote Stefan Beller
2017-02-23 22:57         ` [PATCH 03/15] lib-submodule-update.sh: define tests for recursing into submodules Stefan Beller
2017-02-23 22:57         ` [PATCH 04/15] make is_submodule_populated gently Stefan Beller
2017-02-23 22:57         ` [PATCH 05/15] connect_work_tree_and_git_dir: safely create leading directories Stefan Beller
2017-02-23 22:57         ` [PATCH 06/15] update submodules: add submodule config parsing Stefan Beller
2017-02-23 22:57         ` [PATCH 07/15] update submodules: add a config option to determine if submodules are updated Stefan Beller
2017-02-23 22:57         ` [PATCH 08/15] submodules: introduce check to see whether to touch a submodule Stefan Beller
2017-02-23 22:57         ` [PATCH 09/15] update submodules: move up prepare_submodule_repo_env Stefan Beller
2017-02-23 22:57         ` [PATCH 10/15] update submodules: add submodule_move_head Stefan Beller
2017-02-24  1:21           ` Ramsay Jones
2017-02-24 19:08             ` Stefan Beller
2017-02-23 22:57         ` [PATCH 11/15] unpack-trees: pass old oid to verify_clean_submodule Stefan Beller
2017-02-23 22:57         ` [PATCH 12/15] unpack-trees: check if we can perform the operation for submodules Stefan Beller
2017-02-23 22:57         ` [PATCH 13/15] read-cache, remove_marked_cache_entries: wipe selected submodules Stefan Beller
2017-02-23 22:57         ` [PATCH 14/15] entry.c: update submodules when interesting Stefan Beller
2017-02-23 22:57         ` [PATCH 15/15] builtin/checkout: add --recurse-submodules switch Stefan Beller
2017-02-24  1:25           ` Ramsay Jones
2017-02-24 19:20             ` Stefan Beller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CA+P7+xqpxTt7KibOrVr2ekjLy6Hva4KJ6nCaN22j-Qpspky3aQ@mail.gmail.com \
    --to=jacob.keller@gmail.com \
    --cc=bmwill@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=sandals@crustytoothpaste.net \
    --cc=sbeller@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).