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

[PATCH v7 0/3] maintenance: add support for systemd timers on Linux

From
Lénaïc Huard <lenaic@lhuard.fr>
Date
Jul 2, 2021, 14:25 UTC
Message-ID
<20210702142556.99864-1-lenaic@lhuard.fr>
In-Reply-To
<20210612165043.165579-1-lenaic@lhuard.fr>
Hello,

Please find hereafter a new reroll of my patchset to add support for systemd timers on Linux for the `git maintenance start` command.

The changes compared to the previous version address the remarks raised during the previous review.

The patches are:
* cache.h: Introduce a generic "xdg_config_home_for(…)" function
  This patch introduces a function to compute configuration files
  paths inside $XDG_CONFIG_HOME.
  It is used in the latest patch of this series to compute systemd
  unit files location.
  This patch is unchanged compared to its previous version.
* maintenance: `git maintenance run` learned `--scheduler=<scheduler>`
  This patch adds a new parameter to the `git maintenance run` to let
  the user choose a scheduler.
  This patch contains the following changes compared to its previous
  version:
  * `is_crontab_available` was not returning directly `is_available`
    under tests condition (when `GIT_TEST_MAINT_SCHEDULER` is set).
    This was indeed a bug as it means `cron` could be invoked by tests
    whereas it should be mocked.
    This is now fixed and `is_crontab_available` now has exactly the
    same behavior as the `is_systemd_timer_available` function that is
    introduced in the last patch.
  * The `get_schedule_cmd` function that centralizes the testing logic
    is now prefixed by a comment block describing its behavior and the
    expected values for the `GIT_TEST_MAINT_SCHEDULER` environment
    variable.
  * The help message for the `--scheduler` option of the `git
    maintenance start` command has been reworded following Eric’s
    suggestion.
    I’ve however kept the “When combined with the `start` subcommand…”
    opening to keep consistency with the other options documented on
    the same page.
  * `resolve_auto_scheduler` function has been renamed
    `resolve_scheduler` and it is now returning a value instead of
    altering its parameter.
* maintenance: add support for systemd timers on Linux
  This patch implements the support of systemd timers on top of
  crontab scheduler on Linux systems.
  The changes in this patch are only followups of changes mentioned in
  the previous patch:
  * `resolve_scheduler` is now returning a value instead of altering
  its parameter.

Best wishes, Lénaïc.

Lénaïc Huard (3):
  cache.h: Introduce a generic "xdg_config_home_for(…)" function
  maintenance: `git maintenance run` learned `--scheduler=<scheduler>`
  maintenance: add support for systemd timers on Linux
 Documentation/git-maintenance.txt |  57 +++
 builtin/gc.c                      | 597 ++++++++++++++++++++++++++----
 cache.h                           |   7 +
 path.c                            |  13 +-
 t/t7900-maintenance.sh            | 110 +++++-
 5 files changed, 706 insertions(+), 78 deletions(-)
Diff-intervalle contre v6 :
-:  ---------- > 1:  899b11ed5b cache.h: Introduce a generic "xdg_config_home_for(…)" function
1:  604627f347 ! 2:  f3e2f0256b maintenance: `git maintenance run` learned `--scheduler=<scheduler>`
    @@ Documentation/git-maintenance.txt: OPTIONS
      
     +--scheduler=auto|crontab|launchctl|schtasks::
     +	When combined with the `start` subcommand, specify the scheduler
    -+	to use to run the hourly, daily and weekly executions of
    ++	for running the hourly, daily and weekly executions of
     +	`git maintenance run`.
    -+	The possible values for `<scheduler>` depend on the system: `crontab`
    -+	is available on POSIX systems, `launchctl` is available on
    -+	MacOS and `schtasks` is available on Windows.
    -+	By default or when `auto` is specified, a suitable scheduler for
    -+	the system is used. On MacOS, `launchctl` is used. On Windows,
    -+	`schtasks` is used. On all other systems, `crontab` is used.
    ++	Possible values for `<scheduler>` are `auto`, `crontab` (POSIX),
    ++	`launchctl` (macOS), and `schtasks` (Windows).
    ++	When `auto` is specified, the appropriate platform-specific
    ++	scheduler is used. Default is `auto`.
     +
      
      TROUBLESHOOTING
    @@ builtin/gc.c: static const char *get_frequency(enum schedule_priority schedule)
      	}
      }
      
    ++/*
    ++ * get_schedule_cmd` reads the GIT_TEST_MAINT_SCHEDULER environment variable
    ++ * to mock the schedulers that `git maintenance start` rely on.
    ++ *
    ++ * For test purpose, GIT_TEST_MAINT_SCHEDULER can be set to a comma-separated
    ++ * list of colon-separated key/value pairs where each pair contains a scheduler
    ++ * and its corresponding mock.
    ++ *
    ++ * * If $GET_TEST_MAINT_SCHEDULER is not set, return false and leave the
    ++ *   arguments unmodified.
    ++ *
    ++ * * If $GET_TEST_MAINT_SCHEDULER is set, return true.
    ++ *   In this case, the *cmd value is read as input.
    ++ *
    ++ *   * if the input value *cmd is the key of one of the comma-separated list
    ++ *     item, then *is_available is set to true and *cmd is modified and becomes
    ++ *     the mock command.
    ++ *
    ++ *   * if the input value *cmd isn’t the key of any of the comma-separated list
    ++ *     item, then *is_available is set to false.
    ++ *
    ++ * Ex.:
    ++ *   GIT_TEST_MAINT_SCHEDULER not set
    ++ *     ┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
    ++ *     ┃ Input ┃                     Output                      ┃
    ++ *     ┃ *cmd  ┃ return code │       *cmd        │ *is_available ┃
    ++ *     ┣━━━━━━━╋━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━┫
    ++ *     ┃ "foo" ┃    false    │ "foo" (unchanged) │  (unchanged)  ┃
    ++ *     ┗━━━━━━━┻━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━┛
    ++ *
    ++ *   GIT_TEST_MAINT_SCHEDULER set to “foo:./mock_foo.sh,bar:./mock_bar.sh”
    ++ *     ┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
    ++ *     ┃ Input ┃                     Output                      ┃
    ++ *     ┃ *cmd  ┃ return code │       *cmd        │ *is_available ┃
    ++ *     ┣━━━━━━━╋━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━┫
    ++ *     ┃ "foo" ┃    true     │  "./mock.foo.sh"  │     true      ┃
    ++ *     ┃ "qux" ┃    true     │ "qux" (unchanged) │     false     ┃
    ++ *     ┗━━━━━━━┻━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━┛
    ++ */
     +static int get_schedule_cmd(const char **cmd, int *is_available)
     +{
     +	char *item;
    @@ builtin/gc.c: static int schtasks_schedule_task(const char *exec_path, enum sche
     +	int is_available;
     +	struct child_process child = CHILD_PROCESS_INIT;
     +
    -+	if (get_schedule_cmd(&cmd, &is_available) && !is_available)
    -+		return 0;
    ++	if (get_schedule_cmd(&cmd, &is_available))
    ++		return is_available;
     +
     +	strvec_split(&child.args, cmd);
     +	strvec_push(&child.args, "-l");
    @@ builtin/gc.c: static int crontab_update_schedule(int run_maintenance, int fd, co
     +	enum scheduler scheduler;
     +};
     +
    -+static void resolve_auto_scheduler(enum scheduler *scheduler)
    ++static enum scheduler resolve_scheduler(enum scheduler scheduler)
     +{
    -+	if (*scheduler != SCHEDULER_AUTO)
    -+		return;
    ++	if (scheduler != SCHEDULER_AUTO)
    ++		return scheduler;
     +
      #if defined(__APPLE__)
     -static const char platform_scheduler[] = "launchctl";
    -+	*scheduler = SCHEDULER_LAUNCHCTL;
    -+	return;
    ++	return SCHEDULER_LAUNCHCTL;
     +
      #elif defined(GIT_WINDOWS_NATIVE)
     -static const char platform_scheduler[] = "schtasks";
    -+	*scheduler = SCHEDULER_SCHTASKS;
    -+	return;
    ++	return SCHEDULER_SCHTASKS;
     +
      #else
     -static const char platform_scheduler[] = "crontab";
    -+	*scheduler = SCHEDULER_CRON;
    -+	return;
    ++	return SCHEDULER_CRON;
      #endif
     +}
      
    @@ builtin/gc.c: static int crontab_update_schedule(int run_maintenance, int fd, co
     +	if (scheduler == SCHEDULER_INVALID)
     +		BUG("invalid scheduler");
     +	if (scheduler == SCHEDULER_AUTO)
    -+		BUG("resolve_auto_scheduler should have been called before");
    ++		BUG("resolve_scheduler should have been called before");
     +
     +	if (!scheduler_fn[scheduler].is_available())
     +		die(_("%s scheduler is not available"),
    @@ builtin/gc.c: static int crontab_update_schedule(int run_maintenance, int fd, co
     +	struct option options[] = {
     +		OPT_CALLBACK_F(
     +			0, "scheduler", &opts.scheduler, N_("scheduler"),
    -+			N_("scheduler to use to trigger git maintenance run"),
    ++			N_("scheduler to trigger git maintenance run"),
     +			PARSE_OPT_NONEG, maintenance_opt_scheduler),
     +		OPT_END()
     +	};
    @@ builtin/gc.c: static int crontab_update_schedule(int run_maintenance, int fd, co
     +	if (argc)
     +		usage_with_options(builtin_maintenance_start_usage, options);
     +
    -+	resolve_auto_scheduler(&opts.scheduler);
    ++	opts.scheduler = resolve_scheduler(opts.scheduler);
     +	validate_scheduler(opts.scheduler);
     +
      	if (maintenance_register())
2:  29628b5a92 ! 3:  0ea5b2fc45 maintenance: add support for systemd timers on Linux
    @@ Documentation/git-maintenance.txt: OPTIONS
     ---scheduler=auto|crontab|launchctl|schtasks::
     +--scheduler=auto|crontab|systemd-timer|launchctl|schtasks::
      	When combined with the `start` subcommand, specify the scheduler
    - 	to use to run the hourly, daily and weekly executions of
    + 	for running the hourly, daily and weekly executions of
      	`git maintenance run`.
    - 	The possible values for `<scheduler>` depend on the system: `crontab`
    --	is available on POSIX systems, `launchctl` is available on
    --	MacOS and `schtasks` is available on Windows.
    -+	is available on POSIX systems, `systemd-timer` is available on Linux
    -+	systems, `launchctl` is available on MacOS and `schtasks` is available
    -+	on Windows.
    - 	By default or when `auto` is specified, a suitable scheduler for
    - 	the system is used. On MacOS, `launchctl` is used. On Windows,
    --	`schtasks` is used. On all other systems, `crontab` is used.
    -+	`schtasks` is used. On Linux, `systemd-timer` is used if user systemd
    -+	timers are available, otherwise, `crontab` is used. On all other systems,
    -+	`crontab` is used.
    +-	Possible values for `<scheduler>` are `auto`, `crontab` (POSIX),
    +-	`launchctl` (macOS), and `schtasks` (Windows).
    +-	When `auto` is specified, the appropriate platform-specific
    +-	scheduler is used. Default is `auto`.
    ++	Possible values for `<scheduler>` are `auto`, `crontab`
    ++	(POSIX), `systemd-timer` (Linux), `launchctl` (macOS), and
    ++	`schtasks` (Windows). When `auto` is specified, the
    ++	appropriate platform-specific scheduler is used; on Linux,
    ++	`systemd-timer` is used if available, otherwise
    ++	`crontab`. Default is `auto`.
      
      
      TROUBLESHOOTING
    @@ builtin/gc.c: static enum scheduler parse_scheduler(const char *value)
      	else if (!strcasecmp(value, "launchctl"))
      		return SCHEDULER_LAUNCHCTL;
      	else if (!strcasecmp(value, "schtasks"))
    -@@ builtin/gc.c: static void resolve_auto_scheduler(enum scheduler *scheduler)
    - 	*scheduler = SCHEDULER_SCHTASKS;
    - 	return;
    +@@ builtin/gc.c: static enum scheduler resolve_scheduler(enum scheduler scheduler)
    + #elif defined(GIT_WINDOWS_NATIVE)
    + 	return SCHEDULER_SCHTASKS;
      
     +#elif defined(__linux__)
     +	if (is_systemd_timer_available())
    -+		*scheduler = SCHEDULER_SYSTEMD;
    ++		return SCHEDULER_SYSTEMD;
     +	else if (is_crontab_available())
    -+		*scheduler = SCHEDULER_CRON;
    ++		return SCHEDULER_CRON;
     +	else
     +		die(_("neither systemd timers nor crontab are available"));
    -+	return;
     +
      #else
    - 	*scheduler = SCHEDULER_CRON;
    - 	return;
    + 	return SCHEDULER_CRON;
    + #endif
     
      ## t/t7900-maintenance.sh ##
     @@ t/t7900-maintenance.sh: test_xmllint () {
-- 
2.32.0
Previous: Lénaïc HuardNext: Lénaïc Huard
Message 94 of 138 in “maintenance: use systemd timers on Linux”
  1. maintenance: use systemd timers on LinuxLénaïc Huard, May 1, 2021
  2. brian m. carlsonMay 1, 2021
  3. Bagas SanjayaMay 2, 2021
  4. Eric SunshineMay 2, 2021
  5. Eric SunshineMay 2, 2021
  6. Phillip WoodMay 2, 2021
  7. Đoàn Trần Công DanhMay 5, 2021
  8. Phillip WoodMay 5, 2021
  9. Ævar Arnfjörð BjarmasonMay 5, 2021
  10. Lénaïc HuardMay 9, 2021
  11. Ævar Arnfjörð BjarmasonMay 10, 2021
  12. Bagas SanjayaMay 2, 2021
  13. Derrick StoleeMay 3, 2021
  14. 0/1 maintenance: use systemd timers on LinuxLénaïc Huard, May 9, 2021
  15. 1/1 maintenance: use systemd timers on LinuxLénaïc Huard, May 9, 2021
  16. Đoàn Trần Công DanhMay 10, 2021
  17. Eric SunshineMay 10, 2021
  18. Junio C HamanoMay 10, 2021
  19. Đoàn Trần Công DanhMay 12, 2021
  20. Felipe ContrerasMay 12, 2021
  21. Phillip WoodMay 12, 2021
  22. Phillip WoodMay 12, 2021
  23. Đoàn Trần Công DanhMay 12, 2021
  24. Phillip WoodMay 10, 2021
  25. Eric SunshineMay 10, 2021
  26. Phillip WoodMay 10, 2021
  27. Eric SunshineMay 10, 2021
  28. Lénaïc HuardJun 8, 2021
  29. Martin ÅgrenMay 10, 2021
  30. Phillip WoodMay 11, 2021
  31. Derrick StoleeMay 11, 2021
  32. 0/4 maintenance: use systemd timers on LinuxLénaïc Huard, May 20, 2021
  33. 2/4 maintenance: introduce ENABLE/DISABLE for code clarityLénaïc Huard, May 20, 2021
  34. 4/4 maintenance: optionally use systemd timers on LinuxLénaïc Huard, May 20, 2021
  35. Bagas SanjayaMay 21, 2021
  36. Derrick StoleeMay 21, 2021
  37. Johannes SchindelinMay 22, 2021
  38. Felipe ContrerasMay 23, 2021
  39. brian m. carlsonMay 23, 2021
  40. Felipe ContrerasMay 24, 2021
  41. Ævar Arnfjörð BjarmasonMay 24, 2021
  42. Junio C HamanoMay 24, 2021
  43. Johannes SchindelinMay 25, 2021
  44. Felipe ContrerasMay 25, 2021
  45. CoC, inclusivity etc. (was "Re: [...] systemd timers on Linux")Ævar Arnfjörð Bjarmason, May 26, 2021
  46. Felipe ContrerasMay 26, 2021
  47. Jeff KingMay 27, 2021
  48. Felipe ContrerasMay 27, 2021
  49. Junio C HamanoMay 27, 2021
  50. Phillip SusiMay 28, 2021
  51. Jeff KingMay 30, 2021
  52. Felipe ContrerasMay 24, 2021
  53. 1/4 cache.h: rename "xdg_config_home" to "xdg_config_home_git"Lénaïc Huard, May 20, 2021
  54. Đoàn Trần Công DanhMay 20, 2021
  55. 3/4 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, May 20, 2021
  56. Bagas SanjayaMay 21, 2021
  57. 0/4 add support for systemd timers on LinuxLénaïc Huard, May 24, 2021
  58. 4/4 maintenance: add support for systemd timers on LinuxLénaïc Huard, May 24, 2021
  59. Ævar Arnfjörð BjarmasonMay 24, 2021
  60. Eric SunshineMay 24, 2021
  61. Felipe ContrerasMay 24, 2021
  62. Phillip WoodMay 26, 2021
  63. 3/4 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, May 24, 2021
  64. Phillip WoodMay 24, 2021
  65. Lénaïc HuardMay 30, 2021
  66. Phillip WoodMay 30, 2021
  67. 2/4 maintenance: introduce ENABLE/DISABLE for code clarityLénaïc Huard, May 24, 2021
  68. Phillip WoodMay 24, 2021
  69. Đoàn Trần Công DanhMay 24, 2021
  70. Lénaïc HuardMay 25, 2021
  71. Junio C HamanoMay 25, 2021
  72. Ævar Arnfjörð BjarmasonMay 24, 2021
  73. 1/4 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, May 24, 2021
  74. Phillip WoodMay 24, 2021
  75. Đoàn Trần Công DanhMay 24, 2021
  76. Junio C HamanoMay 24, 2021
  77. 0/3 add support for systemd timers on LinuxLénaïc Huard, Jun 8, 2021
  78. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Jun 8, 2021
  79. Jeff KingJun 9, 2021
  80. Phillip WoodJun 9, 2021
  81. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Jun 8, 2021
  82. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Jun 8, 2021
  83. Junio C HamanoJun 9, 2021
  84. Phillip WoodJun 9, 2021
  85. 0/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Jun 12, 2021
  86. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Jun 12, 2021
  87. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Jun 12, 2021
  88. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Jun 12, 2021
  89. Eric SunshineJun 14, 2021
  90. Derrick StoleeJun 16, 2021
  91. Eric SunshineJun 17, 2021
  92. Phillip WoodJun 17, 2021
  93. Lénaïc HuardJul 2, 2021
  94. 0/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Jul 2, 2021
  95. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Jul 2, 2021
  96. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Jul 2, 2021
  97. Ævar Arnfjörð BjarmasonJul 6, 2021
  98. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Jul 2, 2021
  99. Ævar Arnfjörð BjarmasonJul 6, 2021
  100. Junio C HamanoJul 6, 2021
  101. Jeff KingJul 13, 2021
  102. Eric SunshineJul 13, 2021
  103. Jeff KingJul 13, 2021
  104. Eric SunshineJul 13, 2021
  105. Bagas SanjayaJul 13, 2021
  106. Felipe ContrerasJul 6, 2021
  107. Lénaïc HuardAug 23, 2021
  108. Junio C HamanoAug 23, 2021
  109. Junio C HamanoJul 2, 2021
  110. Phillip WoodJul 6, 2021
  111. 0/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Aug 23, 2021
  112. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Aug 23, 2021
  113. Derrick StoleeAug 24, 2021
  114. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Aug 23, 2021
  115. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Aug 23, 2021
  116. Derrick StoleeAug 24, 2021
  117. Derrick StoleeAug 24, 2021
  118. 0/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Aug 27, 2021
  119. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Aug 27, 2021
  120. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Aug 27, 2021
  121. Ramsay JonesAug 27, 2021
  122. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Aug 27, 2021
  123. 0/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Sep 4, 2021
  124. 1/3 cache.h: Introduce a generic "xdg_config_home_for(…)" functionLénaïc Huard, Sep 4, 2021
  125. 3/3 maintenance: add support for systemd timers on LinuxLénaïc Huard, Sep 4, 2021
  126. 2/3 maintenance: `git maintenance run` learned `--scheduler=<scheduler>`Lénaïc Huard, Sep 4, 2021
  127. Derrick StoleeSep 7, 2021
  128. Derrick StoleeSep 8, 2021
  129. Lénaïc HuardSep 9, 2021
  130. Derrick StoleeSep 9, 2021
  131. Ævar Arnfjörð BjarmasonSep 27, 2021
  132. Lénaïc HuardSep 27, 2021
  133. Derrick StoleeAug 17, 2021
  134. Phillip WoodAug 17, 2021
  135. Derrick StoleeAug 17, 2021
  136. Lénaïc HuardAug 18, 2021
  137. Derrick StoleeAug 18, 2021
  138. Junio C HamanoAug 18, 2021

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.