I use the conventional XDG config path for the global configuration. This path is always used except for `git maintenance register` and `unregister`. § Changes since v1 • Free `config_file` • https://lore.kernel.org/git/ZTZDsIcrB0zwHlFR@tanuki/ • Return `NULL` instead of dying • https://lore.kernel.org/git/ZTZDqToqcsDiS5AP@tanuki/ • Tests • Test unregister • Use subshells • Style § Patches • 1–3: Preparatory • 4: The desired change § CC • Patrick Steinhardt: `config` changes; v1 feedback • Derrick Stolee: `maintenance` changes • Eric Sunshine: v1 feedback • Taylor Blau: v1 feedback Kristoffer Haugsbakk (4): config: format newlines config: rename global config function config: factor out global config file retrieval maintenance: use XDG config if it exists builtin/config.c | 26 +++--------------------- builtin/gc.c | 27 ++++++++++++------------- builtin/var.c | 2 +- config.c | 26 ++++++++++++++++++++---- config.h | 6 +++++- t/t7900-maintenance.sh | 45 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 89 insertions(+), 43 deletions(-) Range-diff against v1: 1: 39934cb7e50 = 1: d5f6c8d62ec config: format newlines 2: 48a5357f97c = 2: cbc5fde0094 config: rename global config function 3: 147c767443c ! 3: 32e5ec7d866 config: factor out global config file retrieval @@ Commit message Signed-off-by: Kristoffer Haugsbakk <code@xxxxxxxxxxxxxxx> + + ## Notes (series) ## + v2: + • Don’t die; return `NULL` + ## builtin/config.c ## @@ builtin/config.c: int cmd_config(int argc, const char **argv, const char *prefix) } @@ builtin/config.c: int cmd_config(int argc, const char **argv, const char *prefix - * location; error out even if XDG_CONFIG_HOME - * is set and points at a sane location. - */ -- die(_("$HOME not set")); -- + given_config_source.file = git_global_config(); ++ if (!given_config_source.file) + die(_("$HOME not set")); +- given_config_source.scope = CONFIG_SCOPE_GLOBAL; - - if (access_or_warn(user_config, R_OK, 0) && @@ config.c: char *git_system_config(void) + char *user_config, *xdg_config; + + git_global_config_paths(&user_config, &xdg_config); -+ if (!user_config) -+ /* -+ * It is unknown if HOME/.gitconfig exists, so -+ * we do not know if we should write to XDG -+ * location; error out even if XDG_CONFIG_HOME -+ * is set and points at a sane location. -+ */ -+ die(_("$HOME not set")); ++ if (!user_config) { ++ free(xdg_config); ++ return NULL; ++ } + + if (access_or_warn(user_config, R_OK, 0) && xdg_config && + !access_or_warn(xdg_config, R_OK, 0)) { @@ config.h: int config_error_nonbool(const char *); #endif char *git_system_config(void); ++/** ++ * Returns `NULL` if is uncertain whether or not `HOME/.gitconfig` exists. ++ */ +char *git_global_config(void); void git_global_config_paths(char **user, char **xdg); 4: 1e2376a4b99 < -: ----------- maintenance: use XDG config if it exists -: ----------- > 4: 8bd67c5bf01 maintenance: use XDG config if it exists -- 2.43.0