Subject: [PATCH v2 14/17] ls: add -t back

From: Nguyễn Thái Ngọc Duy <[email-masked]>
Date: Wed, 26 Mar 2014 20:48:14 +0700

Tag "H" (cached) is not shown though because it's usually the majority
and becomes noise. Not showing it makes the other tags stand out. -t
is on by default if more than one file category is selected.

Signed-off-by: Nguyễn Thái Ngọc Duy <[email-masked]>
---
 Documentation/git-ls.txt |  6 ++++++
 builtin/ls-files.c       | 27 +++++++++++++++++----------
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/Documentation/git-ls.txt b/Documentation/git-ls.txt
index 0480c42..126d9db 100644
--- a/Documentation/git-ls.txt
+++ b/Documentation/git-ls.txt
@@ -47,6 +47,12 @@ OPTIONS
 --unmerged::
 	Show unmerged files in the output (forces --stage)
 
+-t::
+--tag::
+	Show a tag to indicate file type, helpful when multiple file
+	selections are used. See linkgit::git-ls-files[1] option `-t`
+	for more information.
+
 -R::
 --recursive::
 	Equivalent of --max-depth=-1 (infinite recursion).
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 014de05..392d273 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -515,16 +515,6 @@ static int ls_files(const char **argv, const char *prefix)
 	for (i = 0; i < exclude_list.nr; i++) {
 		add_exclude(exclude_list.items[i].string, "", 0, el, --exclude_args);
 	}
-	if (show_tag || show_valid_bit) {
-		tag_cached = "H ";
-		tag_unmerged = "M ";
-		tag_removed = "R ";
-		tag_modified = "C ";
-		tag_other = "? ";
-		tag_killed = "K ";
-		tag_skip_worktree = "S ";
-		tag_resolve_undo = "U ";
-	}
 	if (show_modified || show_others || show_deleted || (dir.flags & DIR_SHOW_IGNORED) || show_killed)
 		require_work_tree = 1;
 	if (show_unmerged && !porcelain)
@@ -578,6 +568,20 @@ static int ls_files(const char **argv, const char *prefix)
 	      show_killed || show_modified || show_resolve_undo))
 		show_cached = 1;
 
+	if (show_tag == -1)
+		show_tag = (show_cached + show_deleted + show_others +
+			    show_unmerged + show_killed + show_modified) > 1;
+	if (show_tag || show_valid_bit) {
+		tag_cached = porcelain ? "  " : "H ";
+		tag_unmerged = "M ";
+		tag_removed = "R ";
+		tag_modified = "C ";
+		tag_other = "? ";
+		tag_killed = "K ";
+		tag_skip_worktree = "S ";
+		tag_resolve_undo = "U ";
+	}
+
 	if (max_prefix)
 		prune_cache(max_prefix);
 	if (with_tree) {
@@ -727,6 +731,8 @@ int cmd_ls(int argc, const char **argv, const char *cmd_prefix)
 			N_("show unmerged files in the output")),
 		OPT_SET_INT('R', "recursive", &max_depth,
 			    N_("shortcut for --max-depth=-1"), -1),
+		OPT_BOOL('t', "tag", &show_tag,
+			N_("identify the file status with tags")),
 		OPT__COLOR(&use_color, N_("show color")),
 		OPT_COLUMN(0, "column", &colopts, N_("show files in columns")),
 		OPT_SET_INT('1', NULL, &colopts,
@@ -756,6 +762,7 @@ int cmd_ls(int argc, const char **argv, const char *cmd_prefix)
 	setup_standard_excludes(&dir);
 	use_color = -1;
 	max_depth = 0;
+	show_tag = -1;
 
 	argc = parse_options(argc, argv, prefix, builtin_ls_options,
 			     ls_usage, 0);
-- 
1.9.1.345.ga1a145c