scalar: 'unregister' stops background maintenance

Just like `scalar register` starts the scheduled background maintenance,
`scalar unregister` stops it. Note that we use `git maintenance start`
in `scalar register`, but we do not use `git maintenance stop` in
`scalar unregister`: this would stop maintenance for _all_ repositories,
not just for the one we want to unregister.

The `unregister` command also removes the corresponding entry from the
`[scalar]` section in the global Git config.

Co-authored-by: Victoria Dye <vdye@github.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Derrick Stolee
2021-12-03 13:34:20 +00:00
committed by Junio C Hamano
parent d0feac4e8c
commit c76a53eb71
2 changed files with 50 additions and 8 deletions

View File

@ -198,12 +198,12 @@ static int set_recommended_config(void)
return 0; return 0;
} }
static int start_maintenance(void) static int toggle_maintenance(int enable)
{ {
return run_git("maintenance", "start", NULL); return run_git("maintenance", enable ? "start" : "unregister", NULL);
} }
static int add_enlistment(void) static int add_or_remove_enlistment(int add)
{ {
int res; int res;
@ -214,24 +214,39 @@ static int add_enlistment(void)
"scalar.repo", the_repository->worktree, NULL); "scalar.repo", the_repository->worktree, NULL);
/* /*
* If the setting is already there, then do nothing. * If we want to add and the setting is already there, then do nothing.
* If we want to remove and the setting is not there, then do nothing.
*/ */
if (!res) if ((add && !res) || (!add && res))
return 0; return 0;
return run_git("config", "--global", "--add", return run_git("config", "--global", add ? "--add" : "--unset",
add ? "--no-fixed-value" : "--fixed-value",
"scalar.repo", the_repository->worktree, NULL); "scalar.repo", the_repository->worktree, NULL);
} }
static int register_dir(void) static int register_dir(void)
{ {
int res = add_enlistment(); int res = add_or_remove_enlistment(1);
if (!res) if (!res)
res = set_recommended_config(); res = set_recommended_config();
if (!res) if (!res)
res = start_maintenance(); res = toggle_maintenance(1);
return res;
}
static int unregister_dir(void)
{
int res = 0;
if (toggle_maintenance(0) < 0)
res = -1;
if (add_or_remove_enlistment(0) < 0)
res = -1;
return res; return res;
} }
@ -254,11 +269,30 @@ static int cmd_register(int argc, const char **argv)
return register_dir(); return register_dir();
} }
static int cmd_unregister(int argc, const char **argv)
{
struct option options[] = {
OPT_END(),
};
const char * const usage[] = {
N_("scalar unregister [<enlistment>]"),
NULL
};
argc = parse_options(argc, argv, NULL, options,
usage, 0);
setup_enlistment_directory(argc, argv, usage, options, NULL);
return unregister_dir();
}
static struct { static struct {
const char *name; const char *name;
int (*fn)(int, const char **); int (*fn)(int, const char **);
} builtins[] = { } builtins[] = {
{ "register", cmd_register }, { "register", cmd_register },
{ "unregister", cmd_unregister },
{ NULL, NULL}, { NULL, NULL},
}; };

View File

@ -9,6 +9,7 @@ SYNOPSIS
-------- --------
[verse] [verse]
scalar register [<enlistment>] scalar register [<enlistment>]
scalar unregister [<enlistment>]
DESCRIPTION DESCRIPTION
----------- -----------
@ -45,6 +46,13 @@ Note: when this subcommand is called in a worktree that is called `src/`, its
parent directory is considered to be the Scalar enlistment. If the worktree is parent directory is considered to be the Scalar enlistment. If the worktree is
_not_ called `src/`, it itself will be considered to be the Scalar enlistment. _not_ called `src/`, it itself will be considered to be the Scalar enlistment.
Unregister
~~~~~~~~~~
unregister [<enlistment>]::
Remove the specified repository from the list of repositories
registered with Scalar and stop the scheduled background maintenance.
SEE ALSO SEE ALSO
-------- --------
linkgit:git-maintenance[1]. linkgit:git-maintenance[1].