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 Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- .gitignore | 1 + Documentation/config.txt | 10 ++++++ Documentation/git-ls.txt (new) | 82 ++++++++++++++++++++++++++++++++++++++++++ Makefile | 1 + builtin.h | 1 + builtin/ls-files.c | 70 ++++++++++++++++++++++++++++++++++++ command-list.txt | 1 + git.c | 1 + 8 files changed, 167 insertions(+) create mode 100644 Documentation/git-ls.txt diff --git a/.gitignore b/.gitignore index dc600f9..f91af81 100644 --- a/.gitignore +++ b/.gitignore @@ -76,6 +76,7 @@ /git-init-db /git-instaweb /git-log +/git-ls /git-ls-files /git-ls-remote /git-ls-tree diff --git a/Documentation/config.txt b/Documentation/config.txt index 6bca55e..87a6dcf 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -909,6 +909,12 @@ color.status.<slot>:: to red). The values of these variables may be specified as in color.branch.<slot>. +color.ls:: + A boolean to enable/disable color in the output of + linkgit:git-ls[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 @@ -981,6 +987,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.ls:: + Specify whether to output tag listing in `git ls` 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-ls.txt b/Documentation/git-ls.txt new file mode 100644 index 0000000..67ca522 --- /dev/null +++ b/Documentation/git-ls.txt @@ -0,0 +1,82 @@ +git-ls(1) +=============== + +NAME +---- +git-ls - List files + +SYNOPSIS +-------- +[verse] +'git ls' (--[cached|deleted|others|ignored|unmerged|modified])* + (-[c|d|o|i|s|u|m])* + [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 in the output (default) + +-d:: +--deleted:: + Show deleted files in the output + +-m:: +--modified:: + Show modified files in the output + +-o:: +--others:: + Show other (i.e. untracked) files in the output + +-i:: +--ignored:: + Show only ignored files in the output. 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 in the output (forces --stage) + +--color[=<when>]:: + Color file names. The value must be always (default), never, + or auto. + +--no-color:: + Turn off coloring, even when the configuration file gives the + default to color output, same as `--color=never`. This is the + default. + +--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. + +<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 f6a6e14..b0bc40a 100644 --- a/Makefile +++ b/Makefile @@ -584,6 +584,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-ls$X BUILT_INS += git-merge-subtree$X BUILT_INS += git-show$X BUILT_INS += git-stage$X diff --git a/builtin.h b/builtin.h index c47c110..177aa7d 100644 --- a/builtin.h +++ b/builtin.h @@ -75,6 +75,7 @@ extern int cmd_index_pack(int argc, const char **argv, const char *prefix); extern int cmd_init_db(int argc, const char **argv, const char *prefix); extern int cmd_log(int argc, const char **argv, const char *prefix); extern int cmd_log_reflog(int argc, const char **argv, const char *prefix); +extern int cmd_ls(int argc, const char **argv, const char *prefix); extern int cmd_ls_files(int argc, const char **argv, const char *prefix); extern int cmd_ls_tree(int argc, const char **argv, const char *prefix); extern int cmd_ls_remote(int argc, const char **argv, const char *prefix); diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 20ca3f2..74eb3c2 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -33,6 +33,7 @@ static int use_color; static unsigned int colopts; static int max_depth = -1; static int show_tag; +static int porcelain; static const char *prefix; static int max_prefix_len; @@ -588,6 +589,10 @@ static int ls_files(const char **argv, const char *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(); @@ -687,3 +692,68 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) ls_files_usage, 0); return ls_files(argv, prefix); } + +static const char * const ls_usage[] = { + N_("git ls [options] [<file>...]"), + NULL +}; + +static int git_ls_config(const char *var, const char *value, void *cb) +{ + if (starts_with(var, "column.")) + return git_column_config(var, value, "ls", &colopts); + if (!strcmp(var, "color.ls")) { + use_color = git_config_colorbool(var, value); + return 0; + } + return git_color_default_config(var, value, cb); +} + +int cmd_ls(int argc, const char **argv, const char *cmd_prefix) +{ + struct option builtin_ls_options[] = { + OPT_BOOL('c', "cached", &show_cached, + N_("show cached files in the output (default)")), + OPT_BOOL('d', "deleted", &show_deleted, + N_("show deleted files in the output")), + OPT_BOOL('m', "modified", &show_modified, + N_("show modified files in the output")), + OPT_BOOL('o', "others", &show_others, + N_("show other files in the output")), + OPT_BIT('i', "ignored", &dir.flags, + N_("show ignored files in the output"), + DIR_SHOW_IGNORED), + OPT_BOOL('u', "unmerged", &show_unmerged, + N_("show unmerged files in the output")), + 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() + }; + + if (argc == 2 && !strcmp(argv[1], "-h")) + usage_with_options(ls_usage, builtin_ls_options); + + prefix = cmd_prefix; + if (prefix) + prefix_len = strlen(prefix); + git_config(git_ls_config, NULL); + + if (read_cache() < 0) + die("index file corrupt"); + + /* default setup */ + porcelain = 1; + setenv(GIT_GLOB_PATHSPECS_ENVIRONMENT, "1", 1); + exc_given = 1; + setup_standard_excludes(&dir); + use_color = -1; + max_depth = 0; + + argc = parse_options(argc, argv, prefix, builtin_ls_options, + ls_usage, 0); + return ls_files(argv, prefix); +} diff --git a/command-list.txt b/command-list.txt index cf36c3d..89e5cef 100644 --- a/command-list.txt +++ b/command-list.txt @@ -64,6 +64,7 @@ git-init mainporcelain common git-instaweb ancillaryinterrogators gitk mainporcelain git-log mainporcelain common +git-ls mainporcelain git-ls-files plumbinginterrogators git-ls-remote plumbinginterrogators git-ls-tree plumbinginterrogators diff --git a/git.c b/git.c index 9efd1a3..682a81e 100644 --- a/git.c +++ b/git.c @@ -381,6 +381,7 @@ static struct cmd_struct commands[] = { { "init", cmd_init_db }, { "init-db", cmd_init_db }, { "log", cmd_log, RUN_SETUP }, + { "ls", cmd_ls, RUN_SETUP }, { "ls-files", cmd_ls_files, RUN_SETUP }, { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY }, { "ls-tree", cmd_ls_tree, RUN_SETUP }, -- 1.9.1.345.ga1a145c -- 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