Skip to content

Commit

Permalink
git-clean: add filter by pattern interactive action
Browse files Browse the repository at this point in the history
Add a new action for interactive git-clean: filter by pattern. When the
user chooses this action, user can input space-separated patterns (the
same syntax as gitignore), and each clean candidate that matches with
one of the patterns will be excluded from cleaning. When the user feels
it's OK, presses ENTER and backs to the confirmation dialog.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jiang Xin authored and Junio C Hamano committed Jun 26, 2013
1 parent 9f93e46 commit d123926
Showing 1 changed file with 68 additions and 0 deletions.
68 changes: 68 additions & 0 deletions builtin/clean.c
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,72 @@ static int clean_cmd(void)
return MENU_RETURN_NO_LOOP;
}

static int filter_by_patterns_cmd(void)
{
struct dir_struct dir;
struct strbuf confirm = STRBUF_INIT;
struct strbuf **ignore_list;
struct string_list_item *item;
struct exclude_list *el;
int changed = -1, i;

for (;;) {
if (!del_list.nr)
break;

if (changed)
pretty_print_dels();

clean_print_color(CLEAN_COLOR_PROMPT);
printf(_("Input ignore patterns>> "));
clean_print_color(CLEAN_COLOR_RESET);
if (strbuf_getline(&confirm, stdin, '\n') != EOF)
strbuf_trim(&confirm);
else
putchar('\n');

/* quit filter_by_pattern mode if press ENTER or Ctrl-D */
if (!confirm.len)
break;

memset(&dir, 0, sizeof(dir));
el = add_exclude_list(&dir, EXC_CMDL, "manual exclude");
ignore_list = strbuf_split_max(&confirm, ' ', 0);

for (i = 0; ignore_list[i]; i++) {
strbuf_trim(ignore_list[i]);
if (!ignore_list[i]->len)
continue;

add_exclude(ignore_list[i]->buf, "", 0, el, -(i+1));
}

changed = 0;
for_each_string_list_item(item, &del_list) {
int dtype = DT_UNKNOWN;

if (is_excluded(&dir, item->string, &dtype)) {
*item->string = '\0';
changed++;
}
}

if (changed) {
string_list_remove_empty_items(&del_list, 0);
} else {
clean_print_color(CLEAN_COLOR_ERROR);
printf_ln(_("WARNING: Cannot find items matched by: %s"), confirm.buf);
clean_print_color(CLEAN_COLOR_RESET);
}

strbuf_list_free(ignore_list);
clear_directory(&dir);
}

strbuf_release(&confirm);
return 0;
}

static int quit_cmd(void)
{
string_list_clear(&del_list, 0);
Expand All @@ -626,6 +692,7 @@ static int help_cmd(void)
clean_print_color(CLEAN_COLOR_HELP);
printf_ln(_(
"clean - start cleaning\n"
"filter by pattern - exclude items from deletion\n"
"quit - stop cleaning\n"
"help - this screen\n"
"? - help for prompt selection"
Expand All @@ -641,6 +708,7 @@ static void interactive_main_loop(void)
struct menu_stuff menu_stuff;
struct menu_item menus[] = {
{'c', "clean", 0, clean_cmd},
{'f', "filter by pattern", 0, filter_by_patterns_cmd},
{'q', "quit", 0, quit_cmd},
{'h', "help", 0, help_cmd},
};
Expand Down

0 comments on commit d123926

Please sign in to comment.