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

[PATCH 2/2] maintenance: running maintenance should not stop on errors

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Apr 17, 2024, 08:28 UTC
Message-ID
<a86bcf2e1a0aadaaaeb5bfe5b0a4a0fa12594921.1713342535.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1719.git.1713342535.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

In https://github.com/microsoft/git/issues/623, it was reported that maintenance stops on a missing repository, omitting the remaining repositories that were scheduled for maintenance.

This is undesirable, as it should be a best effort type of operation.

It should still fail due to the missing repository, of course, but not leave the non-missing repositories in unmaintained shapes.

Let's use `for-each-repo`'s shiny new `--keep-going` option that we just introduced for that very purpose.

This change will be picked up when running `git maintenance start`, which is run implicitly by `scalar reconfigure`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin/gc.c           | 7 ++++---
 t/t7900-maintenance.sh | 6 +++---
 2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/builtin/gc.c b/builtin/gc.c
index cb80ced6cb5..b069aa49c50 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -1858,6 +1858,7 @@ static int launchctl_schedule_plist(const char *exec_path, enum schedule_priorit
 		   "<string>%s/git</string>\n"
 		   "<string>--exec-path=%s</string>\n"
 		   "<string>for-each-repo</string>\n"
+		   "<string>--keep-going</string>\n"
 		   "<string>--config=maintenance.repo</string>\n"
 		   "<string>maintenance</string>\n"
 		   "<string>run</string>\n"
@@ -2100,7 +2101,7 @@ static int schtasks_schedule_task(const char *exec_path, enum schedule_priority
 	      "<Actions Context=\"Author\">\n"
 	      "<Exec>\n"
 	      "<Command>\"%s\\headless-git.exe\"</Command>\n"
-	      "<Arguments>--exec-path=\"%s\" for-each-repo --config=maintenance.repo maintenance run --schedule=%s</Arguments>\n"
+	      "<Arguments>--exec-path=\"%s\" for-each-repo --keep-going --config=maintenance.repo maintenance run --schedule=%s</Arguments>\n"
 	      "</Exec>\n"
 	      "</Actions>\n"
 	      "</Task>\n";
@@ -2245,7 +2246,7 @@ static int crontab_update_schedule(int run_maintenance, int fd)
 			"# replaced in the future by a Git command.\n\n");
 
 		strbuf_addf(&line_format,
-			    "%%d %%s * * %%s \"%s/git\" --exec-path=\"%s\" for-each-repo --config=maintenance.repo maintenance run --schedule=%%s\n",
+			    "%%d %%s * * %%s \"%s/git\" --exec-path=\"%s\" for-each-repo --keep-going --config=maintenance.repo maintenance run --schedule=%%s\n",
 			    exec_path, exec_path);
 		fprintf(cron_in, line_format.buf, minute, "1-23", "*", "hourly");
 		fprintf(cron_in, line_format.buf, minute, "0", "1-6", "daily");
@@ -2446,7 +2447,7 @@ static int systemd_timer_write_service_template(const char *exec_path)
 	       "\n"
 	       "[Service]\n"
 	       "Type=oneshot\n"
-	       "ExecStart=\"%s/git\" --exec-path=\"%s\" for-each-repo --config=maintenance.repo maintenance run --schedule=%%i\n"
+	       "ExecStart=\"%s/git\" --exec-path=\"%s\" for-each-repo --keep-going --config=maintenance.repo maintenance run --schedule=%%i\n"
 	       "LockPersonality=yes\n"
 	       "MemoryDenyWriteExecute=yes\n"
 	       "NoNewPrivileges=yes\n"
diff --git a/t/t7900-maintenance.sh b/t/t7900-maintenance.sh
index 0943dfa18a3..8595489cebe 100755
--- a/t/t7900-maintenance.sh
+++ b/t/t7900-maintenance.sh
@@ -639,9 +639,9 @@ test_expect_success 'start from empty cron table' '
 	# start registers the repo
 	git config --get --global --fixed-value maintenance.repo "$(pwd)" &&
 
-	grep "for-each-repo --config=maintenance.repo maintenance run --schedule=daily" cron.txt &&
-	grep "for-each-repo --config=maintenance.repo maintenance run --schedule=hourly" cron.txt &&
-	grep "for-each-repo --config=maintenance.repo maintenance run --schedule=weekly" cron.txt
+	grep "for-each-repo --keep-going --config=maintenance.repo maintenance run --schedule=daily" cron.txt &&
+	grep "for-each-repo --keep-going --config=maintenance.repo maintenance run --schedule=hourly" cron.txt &&
+	grep "for-each-repo --keep-going --config=maintenance.repo maintenance run --schedule=weekly" cron.txt
 '
 
 test_expect_success 'stop from existing schedule' '
-- 
gitgitgadget
Previous: Junio C HamanoNext: Junio C Hamano
Message 5 of 19 in “Use a "best effort" strategy in scheduled maintenance”
  1. 0/2 Use a "best effort" strategy in scheduled maintenanceJohannes Schindelin via GitGitGadget, Apr 17, 2024
  2. 1/2 for-each-repo: optionally keep going on an errorJohannes Schindelin via GitGitGadget, Apr 17, 2024
  3. Eric SunshineApr 17, 2024
  4. Junio C HamanoApr 17, 2024
  5. 2/2 maintenance: running maintenance should not stop on errorsJohannes Schindelin via GitGitGadget, Apr 17, 2024
  6. Junio C HamanoApr 17, 2024
  7. Junio C HamanoApr 17, 2024
  8. 0/2 Use a "best effort" strategy in scheduled maintenanceJohannes Schindelin via GitGitGadget, Apr 18, 2024
  9. 1/2 for-each-repo: optionally keep going on an errorJohannes Schindelin via GitGitGadget, Apr 18, 2024
  10. Patrick SteinhardtApr 19, 2024
  11. Junio C HamanoApr 19, 2024
  12. Jeff KingApr 19, 2024
  13. Junio C HamanoApr 22, 2024
  14. 2/2 maintenance: running maintenance should not stop on errorsJohannes Schindelin via GitGitGadget, Apr 18, 2024
  15. 0/2 Use a "best effort" strategy in scheduled maintenanceJohannes Schindelin via GitGitGadget, Apr 24, 2024
  16. 1/2 for-each-repo: optionally keep going on an errorJohannes Schindelin via GitGitGadget, Apr 24, 2024
  17. Junio C HamanoApr 24, 2024
  18. 2/2 maintenance: running maintenance should not stop on errorsJohannes Schindelin via GitGitGadget, Apr 24, 2024
  19. Patrick SteinhardtApr 25, 2024

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.