From: Nguyễn Thái Ngọc Duy Date: Mon, 06 Apr 2015 13:52:21 GMT Subject: [PATCH 12/25] list-files: add -F/--classify Message-ID: <1428328354-14897-13-git-send-email-pclouds@gmail.com> In-Reply-To: <1428328354-14897-1-git-send-email-pclouds@gmail.com> 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 --- builtin/list-files.c | 27 +++++++++++++++++++++++++++ t/t7013-list-files.sh | 13 +++++++++++++ 2 files changed, 40 insertions(+) diff --git a/builtin/list-files.c b/builtin/list-files.c index 02a088d..31f1f25 100644 --- a/builtin/list-files.c +++ b/builtin/list-files.c @@ -34,6 +34,7 @@ static unsigned int colopts; static int max_depth; static int show_dirs; static int use_color = -1; +static int show_indicator; static const char * const ls_usage[] = { N_("git list-files [options] [...]"), @@ -51,6 +52,8 @@ struct option ls_options[] = { OPT_SET_INT('R', "recursive", &max_depth, N_("shortcut for --max-depth=-1"), -1), OPT__COLOR(&use_color, N_("show color")), + OPT_BOOL('F', "classify", &show_indicator, + N_("append indicator (one of */=>@|) to entries")), OPT_END() }; @@ -204,6 +207,28 @@ static void cleanup_tags(struct item_list *result) } } +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); +} + /* this is similar to quote_path_relative() except it does not clear sb */ static void quote_item(struct strbuf *out, const struct item *item) { @@ -241,6 +266,8 @@ static void display(const struct item_list *result) get_mode(item), 1); strbuf_release(&sb); } + if (show_indicator) + append_indicator("ed, get_mode(item)); if (column_active(colopts)) string_list_append(&s, quoted.buf); else diff --git a/t/t7013-list-files.sh b/t/t7013-list-files.sh index cdbc34a..16d000e 100755 --- a/t/t7013-list-files.sh +++ b/t/t7013-list-files.sh @@ -154,4 +154,17 @@ test_expect_success 'color.ls.*' ' ) ' +test_expect_success '--classify' ' + ( + cd 2 && + git list-files -F >actual && + cat >expected <<-\EOF && + dir/ + file + gitlink + EOF + test_cmp expected actual + ) +' + test_done -- 2.3.0.rc1.137.g477eb31