Skip to content

Commit

Permalink
clean: improve -n and -f implementation and documentation
Browse files Browse the repository at this point in the history
What -n actually does in addition to its documented behavior is
ignoring of configuration variable clean.requireForce, that makes
sense provided -n prevents files removal anyway.

So, first, document this in the manual, and then modify implementation
to make this more explicit in the code.

Improved implementation also stops to share single internal variable
'force' between command-line -f option and configuration variable
clean.requireForce, resulting in more clear logic.

Two error messages with slightly different text depending on if
clean.requireForce was explicitly set or not, are merged into a single
one.

The resulting error message now does not mention -n as well, as it
neither matches intended clean.requireForce usage nor reflects
clarified implementation.

Documentation of clean.requireForce is changed accordingly.

Signed-off-by: Sergey Organov <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
sorganov authored and gitster committed Mar 3, 2024
1 parent b387623 commit 12a4883
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 16 deletions.
4 changes: 2 additions & 2 deletions Documentation/config/clean.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
clean.requireForce::
A boolean to make git-clean do nothing unless given -f,
-i, or -n. Defaults to true.
A boolean to make git-clean refuse to delete files unless -f
or -i is given. Defaults to true.
2 changes: 2 additions & 0 deletions Documentation/git-clean.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ OPTIONS
-n::
--dry-run::
Don't actually remove anything, just show what would be done.
Configuration variable clean.requireForce is ignored, as
nothing will be deleted anyway.

-q::
--quiet::
Expand Down
23 changes: 9 additions & 14 deletions builtin/clean.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include "help.h"
#include "prompt.h"

static int force = -1; /* unset */
static int require_force = -1; /* unset */
static int interactive;
static struct string_list del_list = STRING_LIST_INIT_DUP;
static unsigned int colopts;
Expand Down Expand Up @@ -128,7 +128,7 @@ static int git_clean_config(const char *var, const char *value,
}

if (!strcmp(var, "clean.requireforce")) {
force = !git_config_bool(var, value);
require_force = git_config_bool(var, value);
return 0;
}

Expand Down Expand Up @@ -920,7 +920,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
{
int i, res;
int dry_run = 0, remove_directories = 0, quiet = 0, ignored = 0;
int ignored_only = 0, config_set = 0, errors = 0, gone = 1;
int ignored_only = 0, force = 0, errors = 0, gone = 1;
int rm_flags = REMOVE_DIR_KEEP_NESTED_GIT;
struct strbuf abs_path = STRBUF_INIT;
struct dir_struct dir = DIR_INIT;
Expand All @@ -946,22 +946,17 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
};

git_config(git_clean_config, NULL);
if (force < 0)
force = 0;
else
config_set = 1;

argc = parse_options(argc, argv, prefix, options, builtin_clean_usage,
0);

if (!interactive && !dry_run && !force) {
if (config_set)
die(_("clean.requireForce set to true and neither -i, -n, nor -f given; "
"refusing to clean"));
else
die(_("clean.requireForce defaults to true and neither -i, -n, nor -f given;"
/* Dry run won't remove anything, so requiring force makes no sense */
if (dry_run)
require_force = 0;

if (require_force != 0 && !force && !interactive)
die(_("clean.requireForce is true and neither -f nor -i given:"
" refusing to clean"));
}

if (force > 1)
rm_flags = 0;
Expand Down

0 comments on commit 12a4883

Please sign in to comment.