git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jiang Xin <worldhello.net@gmail.com>
To: Junio C Hamano <gitster@pobox.com>,
	Eric Sunshine <sunshine@sunshineco.com>,
	Matthieu Moy <Matthieu.Moy@imag.fr>,
	Thomas Rast <trast@inf.ethz.ch>, Git List <git@vger.kernel.org>
Cc: Jiang Xin <worldhello.net@gmail.com>
Subject: [PATCH v7 10/10] git-clean: change clean flags in interactive mode
Date: Wed,  8 May 2013 19:38:55 +0800	[thread overview]
Message-ID: <24a8a0f11acdf881b4ab9057e91273b9de306016.1368011946.git.worldhello.net@gmail.com> (raw)
In-Reply-To: <ebfb3ccf679c26734af655878cf84fff170c96c5.1368011946.git.worldhello.net@gmail.com>
In-Reply-To: <cover.1368011946.git.worldhello.net@gmail.com>

Add new action in the interactive mode, so that the user can change
git-clean flags, such as -x/-X/-d/-ff, and refresh the cleaning
candidates list.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
---
 Documentation/git-clean.txt |  11 +++--
 builtin/clean.c             | 117 +++++++++++++++++++++++++++++++++++++-------
 2 files changed, 108 insertions(+), 20 deletions(-)

diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt
index 47e8e..c7885 100644
--- a/Documentation/git-clean.txt
+++ b/Documentation/git-clean.txt
@@ -82,14 +82,14 @@ and type return, like this:
 
 ------------
     *** Commands ***
-      1: clean             2: edit by patterns   3: edit by numbers
-      4. rm -i             5. quit               6. help
+      1: clean               2: edit by patterns    3: edit by numbers     4: rm -i
+      5: flags: none         6: quit                7: help
     What now> 2
 ------------
 
 You also could say `c` or `clean` above as long as the choice is unique.
 
-The main command loop has 6 subcommands.
+The main command loop has 7 subcommands.
 
 clean::
 
@@ -122,6 +122,11 @@ rm -i::
   by one in order to delete items. This action is not as efficient
   as the above two actions.
 
+flags::
+
+  This lets you change the flags for git-clean, such as -x/-X/-d/-ff,
+  and refresh the cleaning candidates list automatically.
+
 quit::
 
   This lets you quit without do cleaning.
diff --git a/builtin/clean.c b/builtin/clean.c
index 0d8561..b2941 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -850,6 +850,66 @@ static int rm_i_cmd()
 	return MENU_RETURN_NO_LOOP;
 }
 
+static int flags_cmd()
+{
+	struct menu_opts menu_opts;
+	struct menu_stuff menu_stuff;
+	struct menu_item menus[] = {
+		{'d', "(-d) remove directories",
+			clean_flags & CLEAN_OPTS_REMOVE_DIRECTORIES,	NULL},
+		{'x', "(-x) show ignored",
+			clean_flags & CLEAN_OPTS_SHOW_IGNORED,		NULL},
+		{'X', "(-X) ignored only",
+			clean_flags & CLEAN_OPTS_IGNORED_ONLY,		NULL},
+		{'f', "(-ff) remove nested.git",
+			clean_flags & CLEAN_OPTS_REMOVE_NESTED_GIT,	NULL},
+	};
+	int new_flags = 0;
+	int *chosen;
+	int i;
+
+	menu_opts.header = NULL;
+	menu_opts.prompt = "Change flags";
+	menu_opts.flag = 0;
+
+	menu_stuff.type = MENU_STUFF_TYPE_MENU_ITEM;
+	menu_stuff.stuff = menus;
+	menu_stuff.nr = sizeof(menus) / sizeof(struct menu_item);
+
+	chosen = list_and_choose(&menu_opts, &menu_stuff);
+
+	for (i = 0; chosen[i] != EOF; i++) {
+		switch (chosen[i]) {
+		case 0:
+			new_flags |= CLEAN_OPTS_REMOVE_DIRECTORIES;
+			break;
+		case 1:
+			new_flags |= CLEAN_OPTS_SHOW_IGNORED;
+			break;
+		case 2:
+			new_flags |= CLEAN_OPTS_IGNORED_ONLY;
+			break;
+		case 3:
+			new_flags |= CLEAN_OPTS_REMOVE_NESTED_GIT;
+			break;
+		default:
+			break;
+		}
+	}
+
+	if (new_flags & CLEAN_OPTS_IGNORED_ONLY &&
+	    new_flags & CLEAN_OPTS_SHOW_IGNORED) {
+		clean_print_color(CLEAN_COLOR_ERROR);
+		printf_ln(_("-x and -X cannot be used together"));
+		clean_print_color(CLEAN_COLOR_RESET);
+	} else {
+		clean_flags = new_flags;
+	}
+
+	free(chosen);
+	return 0;
+}
+
 static int quit_cmd()
 {
 	string_list_clear(&del_list, 0);
@@ -865,6 +925,7 @@ static int help_cmd(int x)
 		    "edit by patterns - exclude items from deletion\n"
 		    "edit by numbers  - select items to be deleted by numbers\n"
 		    "rm -i            - delete items one by one, like \"rm -i\"\n"
+		    "flags            - change git-clean flags and update the cleaning candidates\n"
 		    "quit             - stop cleaning\n"
 		    "help             - this screen\n"
 		    "?                - help for prompt selection"
@@ -873,10 +934,13 @@ static int help_cmd(int x)
 	return 0;
 }
 
-static void interactive_main_loop()
+static void interactive_main_loop(const char **pathspec, struct string_list exclude_list)
 {
+	int cached_clean_flags = clean_flags;
+	char flags_title[20];
+
 	/* dels list may become empty after return back from edit mode */
-	while (del_list.nr) {
+	while (1) {
 		struct menu_opts menu_opts;
 		struct menu_stuff menu_stuff;
 		struct menu_item menus[] = {
@@ -884,11 +948,24 @@ static void interactive_main_loop()
 			{'p', "edit by patterns",	0, edit_by_patterns_cmd},
 			{'n', "edit by numbers",	0, edit_by_numbers_cmd},
 			{'i', "rm -i",			0, rm_i_cmd},
+			{'f', flags_title,		0, flags_cmd},
 			{'q', "quit",			0, quit_cmd},
 			{'h', "help",			0, help_cmd},
 		};
 		int *chosen;
 
+		if (!clean_flags) {
+			strncpy(flags_title, "flags: none", sizeof(flags_title)/sizeof(char));
+		} else {
+			snprintf(flags_title, sizeof(flags_title)/sizeof(char),
+				 "flags: -%s%s%s%s",
+				 clean_flags & CLEAN_OPTS_REMOVE_DIRECTORIES ? "d" : "",
+				 clean_flags & CLEAN_OPTS_SHOW_IGNORED ? "x" : "",
+				 clean_flags & CLEAN_OPTS_IGNORED_ONLY ? "X" : "",
+				 clean_flags & CLEAN_OPTS_REMOVE_NESTED_GIT ? "ff" : ""
+				);
+		}
+
 		menu_opts.header = _("*** Commands ***");
 		menu_opts.prompt = "What now";
 		menu_opts.flag = MENU_OPTS_SINGLETON;
@@ -897,14 +974,26 @@ static void interactive_main_loop()
 		menu_stuff.stuff = menus;
 		menu_stuff.nr = sizeof(menus) / sizeof(struct menu_item);
 
-		clean_print_color(CLEAN_COLOR_HEADER);
-		printf_ln(Q_("Would remove the following item:",
-			     "Would remove the following items:",
-			     del_list.nr));
-		clean_print_color(CLEAN_COLOR_RESET);
+		if (cached_clean_flags != clean_flags) {
+			scan_clean_candidates(pathspec, exclude_list);
+			cached_clean_flags = clean_flags;
+		}
 
-		/* display dels in columns */
-		pretty_print_dels();
+		if (del_list.nr) {
+			clean_print_color(CLEAN_COLOR_HEADER);
+			printf_ln(Q_("Would remove the following item:",
+				     "Would remove the following items:",
+				     del_list.nr));
+			clean_print_color(CLEAN_COLOR_RESET);
+
+			/* display dels in columns */
+			pretty_print_dels();
+		} else {
+			clean_print_color(CLEAN_COLOR_HEADER);
+			printf_ln(_("NOTE: No more files to clean. Press \"f\" can change the flags."));
+			putchar('\n');
+			clean_print_color(CLEAN_COLOR_RESET);
+		}
 
 		/* main menu */
 		chosen = list_and_choose(&menu_opts, &menu_stuff);
@@ -915,12 +1004,6 @@ static void interactive_main_loop()
 			if (ret != MENU_RETURN_NO_LOOP) {
 				free(chosen);
 				chosen = NULL;
-				if (!del_list.nr) {
-					clean_print_color(CLEAN_COLOR_ERROR);
-					printf_ln(_("No more files to clean, exiting."));
-					clean_print_color(CLEAN_COLOR_RESET);
-					break;
-				}
 				continue;
 			}
 		} else {
@@ -999,8 +1082,8 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
 
 	scan_clean_candidates(pathspec, exclude_list);
 
-	if (interactive && !dry_run && del_list.nr > 0)
-		interactive_main_loop();
+	if (interactive && !dry_run)
+		interactive_main_loop(pathspec, exclude_list);
 
 	for_each_string_list_item(item, &del_list) {
 		struct stat st;
-- 
1.8.3.rc1.341.g1c24ab7

  reply	other threads:[~2013-05-08 11:39 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-08 11:38 [PATCH v7 00/10] interactive git clean Jiang Xin
2013-05-08 11:38 ` [PATCH v7 01/10] Add support for -i/--interactive to git-clean Jiang Xin
2013-05-08 11:38   ` [PATCH v7 02/10] Show items of interactive git-clean in columns Jiang Xin
2013-05-08 11:38     ` [PATCH v7 03/10] Add colors to interactive git-clean Jiang Xin
2013-05-08 11:38       ` [PATCH v7 04/10] git-clean: use a git-add-interactive compatible UI Jiang Xin
2013-05-08 11:38         ` [PATCH v7 05/10] git-clean: interactive cleaning by select numbers Jiang Xin
2013-05-08 11:38           ` [PATCH v7 06/10] git-clean: rm -i style interactive cleaning Jiang Xin
2013-05-08 11:38             ` [PATCH v7 07/10] git-clean: update document for interactive git-clean Jiang Xin
2013-05-08 11:38               ` [PATCH v7 08/10] git-clean refactor: save some options in clean_flags Jiang Xin
2013-05-08 11:38                 ` [PATCH v7 09/10] git-clean refactor: wrap in scan_clean_candidates Jiang Xin
2013-05-08 11:38                   ` Jiang Xin [this message]
2013-05-08 17:02         ` [PATCH v7 04/10] git-clean: use a git-add-interactive compatible UI Junio C Hamano
2013-05-12 17:15       ` [PATCH v7 03/10] Add colors to interactive git-clean Matthieu Moy
2013-05-13  2:47         ` Jiang Xin
2013-05-13  5:28           ` Junio C Hamano
2013-05-13  6:57           ` Matthieu Moy
2013-05-08 17:02     ` [PATCH v7 02/10] Show items of interactive git-clean in columns Junio C Hamano
2013-05-12 17:09     ` Matthieu Moy
2013-05-08 16:57   ` [PATCH v7 01/10] Add support for -i/--interactive to git-clean Junio C Hamano
2013-05-09 16:35     ` Jiang Xin
2013-05-09 17:14       ` [PATCH v8 00/12] Interactive git clean Jiang Xin
2013-05-09 17:14       ` [PATCH v8 01/12] git-clean refactor: hold cleaning items in del_list Jiang Xin
2013-05-09 17:14       ` [PATCH v8 02/12] git-clean: add support for -i/--interactive Jiang Xin
2013-05-09 17:14       ` [PATCH v8 03/12] git-clean: show items of del_list in columns Jiang Xin
2013-05-09 17:14       ` [PATCH v8 04/12] git-clean: add colors to interactive git-clean Jiang Xin
2013-05-09 17:14       ` [PATCH v8 05/12] git-clean: use a git-add-interactive compatible UI Jiang Xin
2013-05-09 17:14       ` [PATCH v8 06/12] git-clean: add filter by pattern interactive action Jiang Xin
2013-05-09 17:14       ` [PATCH v8 07/12] git-clean: add select by numbers " Jiang Xin
2013-05-09 17:14       ` [PATCH v8 08/12] git-clean: add ask each " Jiang Xin
2013-05-09 17:14       ` [PATCH v8 09/12] git-clean refactor: save some options in clean_flags Jiang Xin
2013-05-09 17:14       ` [PATCH v8 10/12] git-clean refactor: add wrapper scan_clean_candidates Jiang Xin
2013-05-09 17:14       ` [PATCH v8 11/12] git-clean: add toggle flags interactive action Jiang Xin
2013-05-09 17:14       ` [PATCH v8 12/12] git-clean: update document for interactive git-clean Jiang Xin
2013-05-12 16:54   ` [PATCH v7 01/10] Add support for -i/--interactive to git-clean Matthieu Moy
2013-05-13 14:46     ` Jiang Xin
2013-05-08 15:15 ` [PATCH v7 00/10] interactive git clean Eric Sunshine
2013-05-08 15:18   ` Eric Sunshine
2013-05-08 16:08   ` Junio C Hamano
2013-05-12 17:28     ` Matthieu Moy
2013-05-13  2:34       ` Jiang Xin
2013-05-13  6:55         ` Matthieu Moy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=24a8a0f11acdf881b4ab9057e91273b9de306016.1368011946.git.worldhello.net@gmail.com \
    --to=worldhello.net@gmail.com \
    --cc=Matthieu.Moy@imag.fr \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=sunshine@sunshineco.com \
    --cc=trast@inf.ethz.ch \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).