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

[PATCH 07/16] update submodules: introduce submodule_is_interesting

From
Stefan Beller <sbeller@google.com>
Date
Nov 15, 2016, 23:06 UTC
Message-ID
<20161115230651.23953-8-sbeller@google.com>
In-Reply-To
<20161115230651.23953-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 | 37 +++++++++++++++++++++++++++++++++++++
 submodule.h |  8 ++++++++
 2 files changed, 45 insertions(+)
diff --git a/submodule.c b/submodule.c
index 38b0573..d34b721 100644
--- a/submodule.c
+++ b/submodule.c
@@ -500,6 +500,43 @@ 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 unsigned char *sha1)
+{
+	/*
+	 * If we cannot load a submodule config, we cannot get the name
+	 * of the submodule, so we'd need to follow the gitlink file
+	 */
+	const struct submodule *sub;
+
+	if (!submodules_interesting_for_update())
+		return 0;
+
+	sub = submodule_from_path(sha1, path);
+	if (!sub)
+		return 0;
+
+	switch (sub->update_strategy.type) {
+	case SM_UPDATE_UNSPECIFIED:
+	case SM_UPDATE_CHECKOUT:
+		return 1;
+	case SM_UPDATE_REBASE:
+	case SM_UPDATE_MERGE:
+	case SM_UPDATE_NONE:
+	case SM_UPDATE_COMMAND:
+		return 0;
+	}
+	return 0;
+}
+
 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 185ad18..3df6881 100644
--- a/submodule.h
+++ b/submodule.h
@@ -57,6 +57,14 @@ 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, do 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, const unsigned char *sha1);
+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.10.1.469.g00a8914
Previous: Stefan BellerNext: Brandon Williams
Message 32 of 50 in “Checkout aware of Submodules!”
  1. 00/16 Checkout aware of Submodules!Stefan Beller, Nov 15, 2016
  2. 01/16 submodule.h: add extern keyword to functions, break line before 80Stefan Beller, Nov 15, 2016
  3. Junio C HamanoNov 16, 2016
  4. Stefan BellerNov 17, 2016
  5. 06/16 update submodules: add a config option to determine if submodules are updatedStefan Beller, Nov 15, 2016
  6. 08/16 update submodules: add depopulate_submoduleStefan Beller, Nov 15, 2016
  7. Brandon WilliamsNov 15, 2016
  8. Stefan BellerNov 17, 2016
  9. Brandon WilliamsNov 17, 2016
  10. Stefan BellerNov 17, 2016
  11. Stefan BellerNov 18, 2016
  12. Brandon WilliamsNov 18, 2016
  13. Stefan BellerNov 18, 2016
  14. 11/16 teach unpack_trees() to remove submodule contentsStefan Beller, Nov 15, 2016
  15. Brandon WilliamsNov 16, 2016
  16. 09/16 update submodules: add scheduling to update submodulesStefan Beller, Nov 15, 2016
  17. Brandon WilliamsNov 16, 2016
  18. David TurnerNov 16, 2016
  19. Stefan BellerNov 18, 2016
  20. 12/16 entry: write_entry to write populate submodulesStefan Beller, Nov 15, 2016
  21. 14/16 checkout: recurse into submodules if asked toStefan Beller, Nov 15, 2016
  22. Brandon WilliamsNov 16, 2016
  23. David TurnerNov 16, 2016
  24. David TurnerNov 16, 2016
  25. 13/16 submodule: teach unpack_trees() to update submodulesStefan Beller, Nov 15, 2016
  26. David TurnerNov 16, 2016
  27. Stefan BellerNov 18, 2016
  28. David TurnerNov 21, 2016
  29. Brandon WilliamsNov 16, 2016
  30. Stefan BellerNov 18, 2016
  31. 16/16 checkout: add config option to recurse into submodules by defaultStefan Beller, Nov 15, 2016
  32. 07/16 update submodules: introduce submodule_is_interestingStefan Beller, Nov 15, 2016
  33. Brandon WilliamsNov 15, 2016
  34. David TurnerNov 16, 2016
  35. Stefan BellerNov 17, 2016
  36. 03/16 submodule: use absolute path for computing relative path connectingStefan Beller, Nov 15, 2016
  37. 04/16 update submodules: add is_submodule_populatedStefan Beller, Nov 15, 2016
  38. Brandon WilliamsNov 15, 2016
  39. 02/16 submodule: modernize ok_to_remove_submodule to use argv_arrayStefan Beller, Nov 15, 2016
  40. David TurnerNov 15, 2016
  41. Junio C HamanoNov 16, 2016
  42. Stefan BellerNov 17, 2016
  43. 10/16 update submodules: is_submodule_checkout_safeStefan Beller, Nov 15, 2016
  44. Brandon WilliamsNov 16, 2016
  45. 05/16 update submodules: add submodule config parsingStefan Beller, Nov 15, 2016
  46. 15/16 completion: add '--recurse-submodules' to checkoutStefan Beller, Nov 15, 2016
  47. Xiaodong QiDec 3, 2016
  48. Stefan BellerNov 17, 2016
  49. Stefan BellerNov 17, 2016
  50. Stefan BellerNov 18, 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.