git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v8 09/12] git-clean refactor: save some options in clean_flags

From
Jiang Xin <worldhello.net@gmail.com>
Date
May 9, 2013, 17:14 UTC
Message-ID
<004346e031386fb325433117bc7d1b282c1740ff.1368118918.git.worldhello.net@gmail.com>
In-Reply-To
<cover.1368118918.git.worldhello.net@gmail.com>

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@gmail.com>
---
 builtin/clean.c | 46 +++++++++++++++++++++++++++++++---------------
 1 file changed, 31 insertions(+), 15 deletions(-)
diff --git a/builtin/clean.c b/builtin/clean.c
index 85345..26d00 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 unsigned int colopts;
@@ -868,7 +874,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 abs_path = STRBUF_INIT;
 	struct dir_struct dir;
 	static const char **pathspec;
@@ -902,13 +907,6 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
 	argc = parse_options(argc, argv, 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; "
@@ -922,15 +920,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");
@@ -980,7 +992,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)) {
 				rel = path_relative(ent->name, prefix);
 				string_list_append(&del_list, rel);
 			}
@@ -1012,7 +1025,10 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
 			continue;
 
 		if (S_ISDIR(st.st_mode)) {
-			if (remove_dirs(&abs_path, prefix, rm_flags, dry_run, quiet, &gone))
+			if (remove_dirs(&abs_path, 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(item->string, -1, &buf, NULL);
-- 
1.8.3.rc1.341.g24a8a0f
Previous: Jiang XinNext: Jiang Xin
Message 30 of 41 in “interactive git clean”
  1. 00/10 interactive git cleanJiang Xin, May 8, 2013
  2. 01/10 Add support for -i/--interactive to git-cleanJiang Xin, May 8, 2013
  3. 02/10 Show items of interactive git-clean in columnsJiang Xin, May 8, 2013
  4. 03/10 Add colors to interactive git-cleanJiang Xin, May 8, 2013
  5. 04/10 git-clean: use a git-add-interactive compatible UIJiang Xin, May 8, 2013
  6. 05/10 git-clean: interactive cleaning by select numbersJiang Xin, May 8, 2013
  7. 06/10 git-clean: rm -i style interactive cleaningJiang Xin, May 8, 2013
  8. 07/10 git-clean: update document for interactive git-cleanJiang Xin, May 8, 2013
  9. 08/10 git-clean refactor: save some options in clean_flagsJiang Xin, May 8, 2013
  10. 09/10 git-clean refactor: wrap in scan_clean_candidatesJiang Xin, May 8, 2013
  11. 10/10 git-clean: change clean flags in interactive modeJiang Xin, May 8, 2013
  12. Junio C HamanoMay 8, 2013
  13. Matthieu MoyMay 12, 2013
  14. Jiang XinMay 13, 2013
  15. Junio C HamanoMay 13, 2013
  16. Matthieu MoyMay 13, 2013
  17. Junio C HamanoMay 8, 2013
  18. Matthieu MoyMay 12, 2013
  19. Junio C HamanoMay 8, 2013
  20. Jiang XinMay 9, 2013
  21. 00/12 Interactive git cleanJiang Xin, May 9, 2013
  22. 01/12 git-clean refactor: hold cleaning items in del_listJiang Xin, May 9, 2013
  23. 02/12 git-clean: add support for -i/--interactiveJiang Xin, May 9, 2013
  24. 03/12 git-clean: show items of del_list in columnsJiang Xin, May 9, 2013
  25. 04/12 git-clean: add colors to interactive git-cleanJiang Xin, May 9, 2013
  26. 05/12 git-clean: use a git-add-interactive compatible UIJiang Xin, May 9, 2013
  27. 06/12 git-clean: add filter by pattern interactive actionJiang Xin, May 9, 2013
  28. 07/12 git-clean: add select by numbers interactive actionJiang Xin, May 9, 2013
  29. 08/12 git-clean: add ask each interactive actionJiang Xin, May 9, 2013
  30. 09/12 git-clean refactor: save some options in clean_flagsJiang Xin, May 9, 2013
  31. 10/12 git-clean refactor: add wrapper scan_clean_candidatesJiang Xin, May 9, 2013
  32. 11/12 git-clean: add toggle flags interactive actionJiang Xin, May 9, 2013
  33. 12/12 git-clean: update document for interactive git-cleanJiang Xin, May 9, 2013
  34. Matthieu MoyMay 12, 2013
  35. Jiang XinMay 13, 2013
  36. Eric SunshineMay 8, 2013
  37. Eric SunshineMay 8, 2013
  38. Junio C HamanoMay 8, 2013
  39. Matthieu MoyMay 12, 2013
  40. Jiang XinMay 13, 2013
  41. Matthieu MoyMay 13, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.