From: Stefan Beller <sbeller@google.com>
To: bmwill@google.com, David.Turner@twosigma.com
Cc: git@vger.kernel.org, sandals@crustytoothpaste.net,
hvoigt@hvoigt.net, gitster@pobox.com,
Stefan Beller <sbeller@google.com>
Subject: [RFC PATCHv2 07/17] update submodules: introduce submodule_is_interesting
Date: Fri, 2 Dec 2016 16:30:12 -0800 [thread overview]
Message-ID: <20161203003022.29797-8-sbeller@google.com> (raw)
In-Reply-To: <20161203003022.29797-1-sbeller@google.com>
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 pre checks if a submodule needs
to be checked for an update.
I am not particular happy with the name `submodule_is_interesting`,
in internal iterations I had `submodule_requires_check_for_update`
and `submodule_needs_update`, but I was even less happy with those
names. Maybe `submodule_interesting_for_update`?
Generally this is to answer "Am I allowed to touch the submodule
at all?" or: "Does the user expect me to touch it?"
which includes all of creation/deletion/update.
This patch is based off a prior attempt by Jens Lehmann to add
submodules to checkout.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
submodule.c | 23 +++++++++++++++++++++++
submodule.h | 9 +++++++++
2 files changed, 32 insertions(+)
diff --git a/submodule.c b/submodule.c
index 1ba398ba3b..62e9ef3872 100644
--- a/submodule.c
+++ b/submodule.c
@@ -516,6 +516,29 @@ void set_config_update_recurse_submodules(int value)
config_update_recurse_submodules = value;
}
+int submodules_interesting_for_update(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;
+}
+
+int submodule_is_interesting(const char *path)
+{
+ const struct submodule *sub;
+
+ if (!submodules_interesting_for_update())
+ return 0;
+
+ sub = submodule_from_path(null_sha1, path);
+ if (!sub)
+ return 0;
+
+ return sub->update_strategy.type != SM_UPDATE_NONE;
+}
+
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 21236b095c..7d890e0464 100644
--- a/submodule.h
+++ b/submodule.h
@@ -54,6 +54,15 @@ 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);
+
+/**
+ * When updating the working tree, we need to check if the submodule needs
+ * updating. We do not require a check if we are already sure that the
+ * submodule doesn't need updating, e.g. when we are not interested in submodules
+ * or the submodule is marked uninteresting by being not initialized.
+ */
+extern int submodule_is_interesting(const char *path);
+extern int submodules_interesting_for_update(void);
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.11.0.rc2.28.g2673dad
next prev parent reply other threads:[~2016-12-03 0:31 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-03 0:30 [RFC PATCHv2 00/17] Checkout aware of Submodules! Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 01/17] submodule.h: add extern keyword to functions Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 02/17] submodule: modernize ok_to_remove_submodule to use argv_array Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 03/17] update submodules: move up prepare_submodule_repo_env Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 04/17] update submodules: add is_submodule_populated Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 05/17] update submodules: add submodule config parsing Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 06/17] update submodules: add a config option to determine if submodules are updated Stefan Beller
2016-12-03 0:30 ` Stefan Beller [this message]
2016-12-03 0:30 ` [RFC PATCHv2 08/17] update submodules: add depopulate_submodule Stefan Beller
2016-12-05 23:37 ` David Turner
2016-12-06 0:18 ` Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 09/17] update submodules: add scheduling to update submodules Stefan Beller
2016-12-05 23:37 ` David Turner
2016-12-05 23:54 ` Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 10/17] update submodules: is_submodule_checkout_safe Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 11/17] unpack-trees: teach verify_clean_submodule to inspect submodules Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 12/17] unpack-trees: remove submodule contents if interesting Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 13/17] entry: write_entry to write populate submodules Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 14/17] submodule: teach unpack_trees() to update submodules Stefan Beller
2016-12-05 23:37 ` David Turner
2016-12-03 0:30 ` [RFC PATCHv2 15/17] checkout: recurse into submodules if asked to Stefan Beller
2016-12-05 19:25 ` Brandon Williams
2016-12-05 19:30 ` Stefan Beller
2016-12-05 19:31 ` Brandon Williams
2016-12-05 23:36 ` David Turner
2016-12-03 0:30 ` [RFC PATCHv2 16/17] completion: add '--recurse-submodules' to checkout Stefan Beller
2016-12-03 0:30 ` [RFC PATCHv2 17/17] checkout: add config option to recurse into submodules by default Stefan Beller
2016-12-05 19:29 ` Brandon Williams
2016-12-05 22:23 ` Stefan Beller
2016-12-05 22:26 ` Brandon Williams
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161203003022.29797-8-sbeller@google.com \
--to=sbeller@google.com \
--cc=David.Turner@twosigma.com \
--cc=bmwill@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=hvoigt@hvoigt.net \
--cc=sandals@crustytoothpaste.net \
/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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.