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

[PATCHv17 10/11] submodule update: expose parallelism to the user

From
Stefan Beller <sbeller@google.com>
Date
Feb 25, 2016, 03:06 UTC
Message-ID
<1456369618-18127-11-git-send-email-sbeller@google.com>
In-Reply-To
<1456369618-18127-1-git-send-email-sbeller@google.com>

Expose possible parallelism either via the "--jobs" CLI parameter or the "submodule.fetchJobs" setting.

By having the variable initialized to -1, we make sure 0 can be passed into the parallel processing machine, which will then pick as many parallel workers as there are CPUs.

Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
---
 Documentation/git-submodule.txt |  7 ++++++-
 builtin/submodule--helper.c     |  8 +++++++-
 git-submodule.sh                |  9 +++++++++
 t/t7406-submodule-update.sh     | 12 ++++++++++++
 4 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index 1572f05..13adebf 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -16,7 +16,7 @@ SYNOPSIS
 'git submodule' [--quiet] deinit [-f|--force] [--] <path>...
 'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch]
 	      [-f|--force] [--rebase|--merge] [--reference <repository>]
-	      [--depth <depth>] [--recursive] [--] [<path>...]
+	      [--depth <depth>] [--recursive] [--jobs <n>] [--] [<path>...]
 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
 	      [commit] [--] [<path>...]
 'git submodule' [--quiet] foreach [--recursive] <command>
@@ -377,6 +377,11 @@ for linkgit:git-clone[1]'s `--reference` and `--shared` options carefully.
 	clone with a history truncated to the specified number of revisions.
 	See linkgit:git-clone[1]
 
+-j <n>::
+--jobs <n>::
+	This option is only valid for the update command.
+	Clone new submodules in parallel with as many jobs.
+	Defaults to the `submodule.fetchJobs` option.
 
 <path>...::
 	Paths to submodule(s). When specified this will restrict the command
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 408ac94..9d94406 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -433,6 +433,7 @@ static int update_clone_task_finished(int result,
 static int update_clone(int argc, const char **argv, const char *prefix)
 {
 	const char *update = NULL;
+	int max_jobs = -1;
 	struct string_list_item *item;
 	struct pathspec pathspec;
 	struct submodule_update_clone suc = SUBMODULE_UPDATE_CLONE_INIT;
@@ -453,6 +454,8 @@ static int update_clone(int argc, const char **argv, const char *prefix)
 		OPT_STRING(0, "depth", &suc.depth, "<depth>",
 			   N_("Create a shallow clone truncated to the "
 			      "specified number of revisions")),
+		OPT_INTEGER('j', "jobs", &max_jobs,
+			    N_("parallel jobs")),
 		OPT__QUIET(&suc.quiet, N_("don't print cloning progress")),
 		OPT_END()
 	};
@@ -479,7 +482,10 @@ static int update_clone(int argc, const char **argv, const char *prefix)
 	gitmodules_config();
 	git_config(submodule_config, NULL);
 
-	run_processes_parallel(1,
+	if (max_jobs < 0)
+		max_jobs = parallel_submodules();
+
+	run_processes_parallel(max_jobs,
 			       update_clone_get_next_task,
 			       update_clone_start_failure,
 			       update_clone_task_finished,
diff --git a/git-submodule.sh b/git-submodule.sh
index a6a82d2..86018ee 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -645,6 +645,14 @@ cmd_update()
 		--depth=*)
 			depth=$1
 			;;
+		-j|--jobs)
+			case "$2" in '') usage ;; esac
+			jobs="--jobs=$2"
+			shift
+			;;
+		--jobs=*)
+			jobs=$1
+			;;
 		--)
 			shift
 			break
@@ -671,6 +679,7 @@ cmd_update()
 		${update:+--update "$update"} \
 		${reference:+--reference "$reference"} \
 		${depth:+--depth "$depth"} \
+		${jobs:+$jobs} \
 		"$@" || echo "#unmatched"
 	} | {
 	err=
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index dda3929..7fd5142 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -774,4 +774,16 @@ test_expect_success 'submodule update --recursive drops module name before recur
 	 test_i18ngrep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual
 	)
 '
+
+test_expect_success 'submodule update can be run in parallel' '
+	(cd super2 &&
+	 GIT_TRACE=$(pwd)/trace.out git submodule update --jobs 7 &&
+	 grep "7 tasks" trace.out &&
+	 git config submodule.fetchJobs 8 &&
+	 GIT_TRACE=$(pwd)/trace.out git submodule update &&
+	 grep "8 tasks" trace.out &&
+	 GIT_TRACE=$(pwd)/trace.out git submodule update --jobs 9 &&
+	 grep "9 tasks" trace.out
+	)
+'
 test_done
-- 
2.7.2.373.g1655498.dirty
Previous: Stefan BellerNext: Stefan Beller
Message 15 of 59 in “[PATCHv17 00/11] Expose submodule parallelism to the user”
  1. Stefan BellerFeb 25, 2016
  2. 01/11 submodule-config: keep update strategy aroundStefan Beller, Feb 25, 2016
  3. Junio C HamanoFeb 25, 2016
  4. Stefan BellerFeb 25, 2016
  5. 02/11 submodule-config: drop check against NULLStefan Beller, Feb 25, 2016
  6. 03/11 fetching submodules: respect `submodule.fetchJobs` config optionStefan Beller, Feb 25, 2016
  7. 04/11 submodule update: direct error message to stderrStefan Beller, Feb 25, 2016
  8. 05/11 run_processes_parallel: treat output of children as byte arrayStefan Beller, Feb 25, 2016
  9. Junio C HamanoFeb 25, 2016
  10. Stefan BellerFeb 25, 2016
  11. 06/11 run-command: expose default_{start_failure, task_finished}Stefan Beller, Feb 25, 2016
  12. 07/11 run_processes_parallel: rename parameters for the callbacksStefan Beller, Feb 25, 2016
  13. 08/11 run_processes_parallel: correctly terminate callbacks with an LFStefan Beller, Feb 25, 2016
  14. 09/11 git submodule update: have a dedicated helper for cloningStefan Beller, Feb 25, 2016
  15. 10/11 submodule update: expose parallelism to the userStefan Beller, Feb 25, 2016
  16. 11/11 clone: allow an explicit argument for parallel submodule clonesStefan Beller, Feb 25, 2016
  17. Junio C HamanoFeb 25, 2016
  18. 00/11 ExposeStefan Beller, Feb 25, 2016
  19. 01/11 submodule-config: keep update strategy aroundStefan Beller, Feb 25, 2016
  20. 02/11 submodule-config: drop check against NULLStefan Beller, Feb 25, 2016
  21. 03/11 fetching submodules: respect `submodule.fetchJobs` config optionStefan Beller, Feb 25, 2016
  22. 04/11 submodule update: direct error message to stderrStefan Beller, Feb 25, 2016
  23. 05/11 run_processes_parallel: treat output of children as byte arrayStefan Beller, Feb 25, 2016
  24. 06/11 run-command: expose default_{start_failure, task_finished}Stefan Beller, Feb 25, 2016
  25. 07/11 run_processes_parallel: rename parameters for the callbacksStefan Beller, Feb 25, 2016
  26. 08/11 run_processes_parallel: correctly terminate callbacks with an LFStefan Beller, Feb 25, 2016
  27. 09/11 git submodule update: have a dedicated helper for cloningStefan Beller, Feb 25, 2016
  28. 10/11 submodule update: expose parallelism to the userStefan Beller, Feb 25, 2016
  29. 11/11 clone: allow an explicit argument for parallel submodule clonesStefan Beller, Feb 25, 2016
  30. Stefan BellerFeb 25, 2016
  31. Jonathan NiederFeb 25, 2016
  32. Stefan BellerFeb 25, 2016
  33. Jonathan NiederFeb 25, 2016
  34. Junio C HamanoFeb 25, 2016
  35. 00/11 Expose submodule parallelism to the userStefan Beller, Feb 25, 2016
  36. 01/11 submodule-config: keep update strategy aroundStefan Beller, Feb 25, 2016
  37. 02/11 submodule-config: drop check against NULLStefan Beller, Feb 25, 2016
  38. 03/11 fetching submodules: respect `submodule.fetchJobs` config optionStefan Beller, Feb 25, 2016
  39. 04/11 submodule update: direct error message to stderrStefan Beller, Feb 25, 2016
  40. 05/11 run_processes_parallel: treat output of children as byte arrayStefan Beller, Feb 25, 2016
  41. 06/11 run-command: expose default_{start_failure, task_finished}Stefan Beller, Feb 25, 2016
  42. 07/11 run_processes_parallel: rename parameters for the callbacksStefan Beller, Feb 25, 2016
  43. 08/11 run_processes_parallel: correctly terminate callbacks with an LFStefan Beller, Feb 25, 2016
  44. 09/11 git submodule update: have a dedicated helper for cloningStefan Beller, Feb 25, 2016
  45. Duy NguyenFeb 27, 2016
  46. Stefan BellerFeb 29, 2016
  47. 10/11 submodule update: expose parallelism to the userStefan Beller, Feb 25, 2016
  48. 11/11 clone: allow an explicit argument for parallel submodule clonesStefan Beller, Feb 25, 2016
  49. Jonathan NiederFeb 25, 2016
  50. Johannes SixtFeb 29, 2016
  51. Stefan BellerFeb 29, 2016
  52. Junio C HamanoFeb 29, 2016
  53. Stefan BellerFeb 29, 2016
  54. Junio C HamanoFeb 29, 2016
  55. Stefan BellerFeb 29, 2016
  56. Johannes SixtFeb 29, 2016
  57. Junio C HamanoFeb 29, 2016
  58. Stefan BellerFeb 29, 2016
  59. Jonathan NiederFeb 25, 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.