This is more user friendly version of ls-files: * it's automatically colored and columnized * it refreshes the index like all porcelain commands * it defaults to non-recursive behavior like ls * :(glob) is on by default so '*.c' means a.c but not a/b.c, use '**/*.c' for that. * auto pager The name 'ls' is not taken. It is left for the user to make an alias with better default options. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- .gitignore | 1 + Documentation/config.txt | 10 +++++ Documentation/git-list-files.txt (new) | 80 ++++++++++++++++++++++++++++++++++ Makefile | 1 + builtin/ls-files.c | 69 +++++++++++++++++++++++++++-- command-list.txt | 1 + git.c | 1 + 7 files changed, 159 insertions(+), 4 deletions(-) create mode 100644 Documentation/git-list-files.txt diff --git a/.gitignore b/.gitignore index a052419..9727ecc 100644 --- a/.gitignore +++ b/.gitignore @@ -76,6 +76,7 @@ /git-init-db /git-interpret-trailers /git-instaweb +/git-list-files /git-log /git-ls-files /git-ls-remote diff --git a/Documentation/config.txt b/Documentation/config.txt index 2290c47..74da715 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -940,6 +940,12 @@ color.status.<slot>:: to red). The values of these variables may be specified as in color.branch.<slot>. +color.list-files:: + A boolean to enable/disable color in the output of + linkgit:git-list-files[1]. May be set to `always`, `false` (or + `never`) or `auto` (or `true`), in which case colors are used + only when the output is to a terminal. Defaults to false. + color.ls.<slot>:: Use customized color for file name colorization. If not set and the environment variable LS_COLORS is set, color settings @@ -1012,6 +1018,10 @@ column.clean:: Specify the layout when list items in `git clean -i`, which always shows files and directories in columns. See `column.ui` for details. +column.list-files:: + Specify whether to output tag listing in `git list-files` in columns. + See `column.ui` for details. + column.status:: Specify whether to output untracked files in `git status` in columns. See `column.ui` for details. diff --git a/Documentation/git-list-files.txt b/Documentation/git-list-files.txt new file mode 100644 index 0000000..3039e1e --- /dev/null +++ b/Documentation/git-list-files.txt @@ -0,0 +1,80 @@ +git-list-files(1) +=============== + +NAME +---- +git-list-files - List files + +SYNOPSIS +-------- +[verse] +'git list-files [options] [<pathspec>...] + +DESCRIPTION +----------- +List files (by default in current working directory) that are in the +index. Depending on the chosen options, maybe only modified files in +working tree are shown, or untracked files... + +OPTIONS +------- +-c:: +--cached:: + Show cached files (default) + +-d:: +--deleted:: + Show cached files that are deleted on working directory + +-m:: +--modified:: + Show cached files that have modification on working directory + +-o:: +--others:: + Show untracked files (and only unignored ones unless -i is + specified) + +-i:: +--ignored:: + Show only ignored files. When showing files in the index, + print only those matched by an exclude pattern. When showing + "other" files, show only those matched by an exclude pattern. + +-u:: +--unmerged:: + Show unmerged files + +--color[=<when>]:: +--no-color:: + Color file names. The value must be `always`, `never`, or + `auto`. `--no-color` is equivalent to + `--color=never`. `--color` is equivalent to + `--color=auto`. See configuration variable `color.list-files` + for the default settings. + +--column[=<options>]:: +--no-column:: + Display files in columns. See configuration variable column.ui + for option syntax. `--column` and `--no-column` without options + are equivalent to 'always' and 'never' respectively. + +--max-depth=<depth>:: + For each <pathspec> given on command line, descend at most <depth> + levels of directories. A negative value means no limit. + This option is ignored if <pathspec> contains active wildcards. + In other words if "a*" matches a directory named "a*", + "*" is matched literally so --max-depth is still effective. + The default is `--max-depth=0`. + +<pathspec>:: + Files to show. :(glob) magic is enabled and recursion disabled + by default. + +SEE ALSO +-------- +linkgit:git-ls-files[1] + +GIT +--- +Part of the linkgit:git[1] suite diff --git a/Makefile b/Makefile index 459121d..23a0751 100644 --- a/Makefile +++ b/Makefile @@ -587,6 +587,7 @@ BUILT_INS += git-cherry-pick$X BUILT_INS += git-format-patch$X BUILT_INS += git-fsck-objects$X BUILT_INS += git-init$X +BUILT_INS += git-list-files$X BUILT_INS += git-merge-subtree$X BUILT_INS += git-show$X BUILT_INS += git-stage$X diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 40fe0f2..f3873a8 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -31,6 +31,7 @@ static int line_terminator = '\n'; static int debug_mode; static int use_color; static unsigned int colopts; +static int porcelain; static const char *prefix; static int max_prefix_len; @@ -459,6 +460,11 @@ static const char * const ls_files_usage[] = { NULL }; +static const char * const ls_usage[] = { + N_("git list-files [options] [<file>...]"), + NULL +}; + static int option_parse_z(const struct option *opt, const char *arg, int unset) { @@ -500,6 +506,17 @@ static int option_parse_exclude_standard(const struct option *opt, return 0; } +static int git_ls_config(const char *var, const char *value, void *cb) +{ + if (starts_with(var, "column.")) + return git_column_config(var, value, "list-files", &colopts); + if (!strcmp(var, "color.list-files")) { + use_color = git_config_colorbool(var, value); + return 0; + } + return git_color_default_config(var, value, cb); +} + int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) { int require_work_tree = 0, show_tag = 0, i; @@ -568,21 +585,61 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) OPT_BOOL(0, "debug", &debug_mode, N_("show debugging data")), OPT_END() }; + struct option builtin_ls_options[] = { + OPT_BOOL('c', "cached", &show_cached, + N_("show cached files (default)")), + OPT_BOOL('d', "deleted", &show_deleted, + N_("show cached files that are deleted on working directory")), + OPT_BOOL('m', "modified", &show_modified, + N_("show cached files that have modification on working directory")), + OPT_BOOL('o', "others", &show_others, + N_("show untracked files")), + OPT_BIT('i', "ignored", &dir.flags, + N_("show ignored files"), + DIR_SHOW_IGNORED), + OPT_BOOL('u', "unmerged", &show_unmerged, + N_("show unmerged files")), + OPT__COLOR(&use_color, N_("show color")), + OPT_COLUMN(0, "column", &colopts, N_("show files in columns")), + { OPTION_INTEGER, 0, "max-depth", &max_depth, N_("depth"), + N_("descend at most <depth> levels"), PARSE_OPT_NONEG, + NULL, 1 }, + OPT__ABBREV(&abbrev), + OPT_END() + }; + struct option *options; + const char * const *help_usage; + if (!strcmp(argv[0], "list-files")) { + help_usage = ls_usage; + options = builtin_ls_options; + porcelain = 1; + } else { + help_usage = ls_files_usage; + options = builtin_ls_files_options; + } if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(ls_files_usage, builtin_ls_files_options); + usage_with_options(help_usage, options); memset(&dir, 0, sizeof(dir)); prefix = cmd_prefix; if (prefix) prefix_len = strlen(prefix); - git_config(git_default_config, NULL); + + if (porcelain) { + setenv(GIT_GLOB_PATHSPECS_ENVIRONMENT, "1", 1); + exc_given = 1; + setup_standard_excludes(&dir); + use_color = -1; + max_depth = 0; + git_config(git_ls_config, NULL); + } else + git_config(git_default_config, NULL); if (read_cache() < 0) die("index file corrupt"); - argc = parse_options(argc, argv, prefix, builtin_ls_files_options, - ls_files_usage, 0); + argc = parse_options(argc, argv, prefix, options, help_usage, 0); el = add_exclude_list(&dir, EXC_CMDL, "--exclude option"); for (i = 0; i < exclude_list.nr; i++) { add_exclude(exclude_list.items[i].string, "", 0, el, --exclude_args); @@ -661,6 +718,10 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) die("ls-files --with-tree is incompatible with -s or -u"); overlay_tree_on_cache(with_tree, max_prefix); } + if (porcelain) { + refresh_index(&the_index, REFRESH_QUIET, &pathspec, NULL, NULL); + setup_pager(); + } show_files(&dir); if (show_resolve_undo) show_ru_info(); diff --git a/command-list.txt b/command-list.txt index f1eae08..32101de 100644 --- a/command-list.txt +++ b/command-list.txt @@ -64,6 +64,7 @@ git-init mainporcelain common git-instaweb ancillaryinterrogators git-interpret-trailers purehelpers gitk mainporcelain +git-list-files mainporcelain git-log mainporcelain common git-ls-files plumbinginterrogators git-ls-remote plumbinginterrogators diff --git a/git.c b/git.c index 18fbf79..617c083 100644 --- a/git.c +++ b/git.c @@ -418,6 +418,7 @@ static struct cmd_struct commands[] = { { "init", cmd_init_db, NO_SETUP }, { "init-db", cmd_init_db, NO_SETUP }, { "interpret-trailers", cmd_interpret_trailers, RUN_SETUP }, + { "list-files", cmd_ls_files, RUN_SETUP }, { "log", cmd_log, RUN_SETUP }, { "ls-files", cmd_ls_files, RUN_SETUP }, { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY }, -- 2.2.0.60.gb7b3c64 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html