[prev in list] [next in list] [prev in thread] [next in thread]
List: git
Subject: [PATCH 17/19] list-files: add -F/--classify
From: Nguyễn Thái Ngọc Duy <pclouds () gmail ! com>
Date: 2014-11-30 8:56:05
Message-ID: 1417337767-4505-18-git-send-email-pclouds () gmail ! com
[Download RAW message or body]
This appends an indicator after the file name if it's executable, a
directory and so on, like in GNU ls. In fact append_indicator() is a
rewrite from get_type_indicator() in coreutils.git commit
7326d1f1a67edf21947ae98194f98c38b6e9e527.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
Documentation/git-list-files.txt | 6 ++++++
builtin/ls-files.c | 31 +++++++++++++++++++++++++++++++
2 files changed, 37 insertions(+)
diff --git a/Documentation/git-list-files.txt b/Documentation/git-list-files.txt
index 0ef616b..22084eb 100644
--- a/Documentation/git-list-files.txt
+++ b/Documentation/git-list-files.txt
@@ -51,6 +51,12 @@ OPTIONS
multiple file selections. See linkgit::git-ls-files[1] option
`-t` for more information.
+-F::
+--classify::
+ Append indicator (one of `*/=>@|`, which is executable,
+ directory, socket, Solaris door, symlink, or fifo
+ respectively) to entries.
+
-R::
--recursive::
Equivalent of `--max-depth=-1` (infinite recursion).
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 41efdaa..28737cb 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -29,6 +29,7 @@ static int show_killed;
static int show_valid_bit;
static int show_tag;
static int show_dirs;
+static int show_indicator;
static int line_terminator = '\n';
static int debug_mode;
static int use_color;
@@ -77,6 +78,28 @@ static void write_name(struct strbuf *sb, const char *name)
quote_path_relative(name, real_prefix, sb);
}
+static void append_indicator(struct strbuf *sb, mode_t mode)
+{
+ char c = 0;
+ if (S_ISREG(mode)) {
+ if (mode & (S_IXUSR | S_IXGRP | S_IXOTH))
+ c = '*';
+ } else if (S_ISDIR(mode))
+ c = '/';
+ else if (S_ISLNK(mode))
+ c = '@';
+ else if (S_ISFIFO(mode))
+ c = '|';
+ else if (S_ISSOCK(mode))
+ c = '=';
+#ifdef S_ISDOOR
+ else if (S_ISDOOR(mode))
+ c = '>';
+#endif
+ if (c)
+ strbuf_addch(sb, c);
+}
+
static void strbuf_fputs(struct strbuf *sb, const char *full_name, FILE *fp)
{
if (column_active(colopts) || porcelain) {
@@ -99,6 +122,8 @@ static void write_dir_entry(struct strbuf *sb, const struct dir_entry *ent)
color_filename(sb, ent->name, quoted.buf, st.st_mode, 1);
else
strbuf_addbuf(sb, "ed);
+ if (show_indicator && st.st_mode)
+ append_indicator(sb, st.st_mode);
strbuf_addch(sb, line_terminator);
strbuf_release("ed);
}
@@ -189,6 +214,8 @@ static void write_ce_name(struct strbuf *sb, const struct cache_entry *ce)
color_filename(sb, ce->name, quoted.buf, ce->ce_mode, 1);
else
strbuf_addbuf(sb, "ed);
+ if (show_indicator)
+ append_indicator(sb, ce->ce_mode);
strbuf_addch(sb, line_terminator);
strbuf_release("ed);
}
@@ -366,6 +393,8 @@ static void show_directories(const struct cache_entry *ce)
}
if (show_tag)
strbuf_insert(&sb2, 0, tag_cached, strlen(tag_cached));
+ if (show_indicator)
+ append_indicator(&sb2, S_IFDIR);
last_directory = strbuf_detach(&sb, NULL);
strbuf_fputs(&sb2, last_directory, NULL);
strbuf_release(&sb2);
@@ -701,6 +730,8 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
DIR_SHOW_IGNORED),
OPT_BOOL('u', "unmerged", &show_unmerged,
N_("show unmerged files")),
+ OPT_BOOL('F', "classify", &show_indicator,
+ N_("append indicator (one of */=>@|) to entries")),
OPT__COLOR(&use_color, N_("show color")),
OPT_COLUMN(0, "column", &colopts, N_("show files in columns")),
OPT_SET_INT('1', NULL, &colopts,
--
2.2.0.60.gb7b3c64
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic