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 <pclo...@gmail.com>
---
 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

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to