git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[RFC PATCHv2 07/17] update submodules: introduce submodule_is_interesting

From
Stefan Beller <sbeller@google.com>
Date
Dec 3, 2016, 00:30 UTC
Message-ID
<20161203003022.29797-8-sbeller@google.com>
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
Previous: Stefan BellerNext: Stefan Beller
Message 7 of 30 in “[RFC PATCHv2 00/17] Checkout aware of Submodules!”
  1. Stefan BellerDec 3, 2016
  2. 02/17 submodule: modernize ok_to_remove_submodule to use argv_arrayStefan Beller, Dec 3, 2016
  3. 12/17 unpack-trees: remove submodule contents if interestingStefan Beller, Dec 3, 2016
  4. 09/17 update submodules: add scheduling to update submodulesStefan Beller, Dec 3, 2016
  5. David TurnerDec 5, 2016
  6. Stefan BellerDec 5, 2016
  7. 07/17 update submodules: introduce submodule_is_interestingStefan Beller, Dec 3, 2016
  8. 08/17 update submodules: add depopulate_submoduleStefan Beller, Dec 3, 2016
  9. David TurnerDec 5, 2016
  10. Stefan BellerDec 6, 2016
  11. 04/17 update submodules: add is_submodule_populatedStefan Beller, Dec 3, 2016
  12. 10/17 update submodules: is_submodule_checkout_safeStefan Beller, Dec 3, 2016
  13. 05/17 update submodules: add submodule config parsingStefan Beller, Dec 3, 2016
  14. 15/17 checkout: recurse into submodules if asked toStefan Beller, Dec 3, 2016
  15. Brandon WilliamsDec 5, 2016
  16. Stefan BellerDec 5, 2016
  17. Brandon WilliamsDec 5, 2016
  18. David TurnerDec 5, 2016
  19. 03/17 update submodules: move up prepare_submodule_repo_envStefan Beller, Dec 3, 2016
  20. 16/17 completion: add '--recurse-submodules' to checkoutStefan Beller, Dec 3, 2016
  21. 01/17 submodule.h: add extern keyword to functionsStefan Beller, Dec 3, 2016
  22. 14/17 submodule: teach unpack_trees() to update submodulesStefan Beller, Dec 3, 2016
  23. David TurnerDec 5, 2016
  24. 06/17 update submodules: add a config option to determine if submodules are updatedStefan Beller, Dec 3, 2016
  25. 13/17 entry: write_entry to write populate submodulesStefan Beller, Dec 3, 2016
  26. 11/17 unpack-trees: teach verify_clean_submodule to inspect submodulesStefan Beller, Dec 3, 2016
  27. 17/17 checkout: add config option to recurse into submodules by defaultStefan Beller, Dec 3, 2016
  28. Brandon WilliamsDec 5, 2016
  29. Stefan BellerDec 5, 2016
  30. Brandon WilliamsDec 5, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.