Skip to content

Commit

Permalink
Merge branch 'es/maintenance-of-bare-repositories'
Browse files Browse the repository at this point in the history
The "git maintenance register" command had trouble registering bare
repositories, which had been corrected.

* es/maintenance-of-bare-repositories:
  maintenance: fix incorrect `maintenance.repo` path with bare repository
  • Loading branch information
gitster committed Feb 26, 2021
2 parents f277234 + 26c7974 commit d166e8c
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 17 deletions.
50 changes: 33 additions & 17 deletions builtin/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1461,11 +1461,23 @@ static int maintenance_run(int argc, const char **argv, const char *prefix)
return maintenance_run_tasks(&opts);
}

static char *get_maintpath(void)
{
struct strbuf sb = STRBUF_INIT;
const char *p = the_repository->worktree ?
the_repository->worktree : the_repository->gitdir;

strbuf_realpath(&sb, p, 1);
return strbuf_detach(&sb, NULL);
}

static int maintenance_register(void)
{
int rc;
char *config_value;
struct child_process config_set = CHILD_PROCESS_INIT;
struct child_process config_get = CHILD_PROCESS_INIT;
char *maintpath = get_maintpath();

/* Disable foreground maintenance */
git_config_set("maintenance.auto", "false");
Expand All @@ -1478,40 +1490,44 @@ static int maintenance_register(void)

config_get.git_cmd = 1;
strvec_pushl(&config_get.args, "config", "--global", "--get",
"--fixed-value", "maintenance.repo",
the_repository->worktree ? the_repository->worktree
: the_repository->gitdir,
NULL);
"--fixed-value", "maintenance.repo", maintpath, NULL);
config_get.out = -1;

if (start_command(&config_get))
return error(_("failed to run 'git config'"));
if (start_command(&config_get)) {
rc = error(_("failed to run 'git config'"));
goto done;
}

/* We already have this value in our config! */
if (!finish_command(&config_get))
return 0;
if (!finish_command(&config_get)) {
rc = 0;
goto done;
}

config_set.git_cmd = 1;
strvec_pushl(&config_set.args, "config", "--add", "--global", "maintenance.repo",
the_repository->worktree ? the_repository->worktree
: the_repository->gitdir,
NULL);
maintpath, NULL);

rc = run_command(&config_set);

return run_command(&config_set);
done:
free(maintpath);
return rc;
}

static int maintenance_unregister(void)
{
int rc;
struct child_process config_unset = CHILD_PROCESS_INIT;
char *maintpath = get_maintpath();

config_unset.git_cmd = 1;
strvec_pushl(&config_unset.args, "config", "--global", "--unset",
"--fixed-value", "maintenance.repo",
the_repository->worktree ? the_repository->worktree
: the_repository->gitdir,
NULL);
"--fixed-value", "maintenance.repo", maintpath, NULL);

return run_command(&config_unset);
rc = run_command(&config_unset);
free(maintpath);
return rc;
}

static const char *get_frequency(enum schedule_priority schedule)
Expand Down
13 changes: 13 additions & 0 deletions t/t7900-maintenance.sh
Original file line number Diff line number Diff line change
Expand Up @@ -632,4 +632,17 @@ test_expect_success 'fails when running outside of a repository' '
nongit test_must_fail git maintenance unregister
'

test_expect_success 'register and unregister bare repo' '
test_when_finished "git config --global --unset-all maintenance.repo || :" &&
test_might_fail git config --global --unset-all maintenance.repo &&
git init --bare barerepo &&
(
cd barerepo &&
git maintenance register &&
git config --get --global --fixed-value maintenance.repo "$(pwd)" &&
git maintenance unregister &&
test_must_fail git config --global --get-all maintenance.repo
)
'

test_done

0 comments on commit d166e8c

Please sign in to comment.