Save some options in variable clean_flags, such as -ff (force > 1), -x (ignored), -X (ignored_only), and -d (remove_directories). We may change clean_flags later in the interactive git-clean. Signed-off-by: Jiang Xin <worldhello.net@xxxxxxxxx> --- builtin/clean.c | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/builtin/clean.c b/builtin/clean.c index 5bb36..d46f3 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -16,7 +16,13 @@ #include "column.h" #include "color.h" +#define CLEAN_OPTS_SHOW_IGNORED 01 +#define CLEAN_OPTS_IGNORED_ONLY 02 +#define CLEAN_OPTS_REMOVE_DIRECTORIES 04 +#define CLEAN_OPTS_REMOVE_NESTED_GIT 010 + static int force = -1; /* unset */ +static int clean_flags = 0; static int interactive; static struct string_list del_list = STRING_LIST_INIT_DUP; static const char **the_prefix; @@ -843,7 +849,6 @@ 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 rm_flags = REMOVE_DIR_KEEP_NESTED_GIT; struct strbuf directory = STRBUF_INIT; struct dir_struct dir; static const char **pathspec; @@ -879,13 +884,6 @@ int cmd_clean(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, *the_prefix, options, builtin_clean_usage, 0); - memset(&dir, 0, sizeof(dir)); - if (ignored_only) - dir.flags |= DIR_SHOW_IGNORED; - - if (ignored && ignored_only) - die(_("-x and -X cannot be used together")); - if (interactive) { if (!isatty(0) || !isatty(1)) die(_("interactive clean can not run without a valid tty; " @@ -899,15 +897,29 @@ int cmd_clean(int argc, const char **argv, const char *prefix) "refusing to clean")); } + if (read_cache() < 0) + die(_("index file corrupt")); + if (force > 1) - rm_flags = 0; + clean_flags |= CLEAN_OPTS_REMOVE_NESTED_GIT; + if (ignored) + clean_flags |= CLEAN_OPTS_SHOW_IGNORED; + if (ignored_only) + clean_flags |= CLEAN_OPTS_IGNORED_ONLY; + if (remove_directories) + clean_flags |= CLEAN_OPTS_REMOVE_DIRECTORIES; - dir.flags |= DIR_SHOW_OTHER_DIRECTORIES; + memset(&dir, 0, sizeof(dir)); + if (clean_flags & CLEAN_OPTS_IGNORED_ONLY) + dir.flags |= DIR_SHOW_IGNORED; - if (read_cache() < 0) - die(_("index file corrupt")); + if (clean_flags & CLEAN_OPTS_IGNORED_ONLY && + clean_flags & CLEAN_OPTS_SHOW_IGNORED) + die(_("-x and -X cannot be used together")); + + dir.flags |= DIR_SHOW_OTHER_DIRECTORIES; - if (!ignored) + if (!(clean_flags & CLEAN_OPTS_SHOW_IGNORED)) setup_standard_excludes(&dir); el = add_exclude_list(&dir, EXC_CMDL, "--exclude option"); @@ -961,7 +973,8 @@ int cmd_clean(int argc, const char **argv, const char *prefix) } if (S_ISDIR(st.st_mode)) { - if (remove_directories || (matches == MATCHED_EXACTLY)) + if ((clean_flags & CLEAN_OPTS_REMOVE_DIRECTORIES) || + (matches == MATCHED_EXACTLY)) string_list_append(&del_list, ent->name); } else { if (pathspec && !matches) @@ -981,7 +994,10 @@ int cmd_clean(int argc, const char **argv, const char *prefix) if (S_ISDIR(st.st_mode)) { strbuf_addstr(&directory, item->string); - if (remove_dirs(&directory, *the_prefix, rm_flags, dry_run, quiet, &gone)) + if (remove_dirs(&directory, *the_prefix, + clean_flags & CLEAN_OPTS_REMOVE_NESTED_GIT ? + 0 : REMOVE_DIR_KEEP_NESTED_GIT, + dry_run, quiet, &gone)) errors++; if (gone && !quiet) { qname = quote_path_relative(directory.buf, directory.len, &buf, *the_prefix); -- 1.8.3.rc1.341.g1c24ab7 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html