This is a preparation step for the introduction of git-ls. "git ls" has a different set of command line options, but it will eventually call ls_files(). Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin/ls-files.c | 164 +++++++++++++++++++++++++++-------------------------- 1 file changed, 85 insertions(+), 79 deletions(-) diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 8eef423..20ca3f2 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -31,6 +31,8 @@ static int line_terminator = '\n'; static int debug_mode; static int use_color; static unsigned int colopts; +static int max_depth = -1; +static int show_tag; static const char *prefix; static int max_prefix_len; @@ -42,6 +44,8 @@ static const char *with_tree; static int exc_given; static int exclude_args; static struct string_list output = STRING_LIST_INIT_NODUP; +static struct dir_struct dir; +static struct string_list exclude_list = STRING_LIST_INIT_NODUP; static const char *tag_cached = ""; static const char *tag_unmerged = ""; @@ -500,89 +504,12 @@ static int option_parse_exclude_standard(const struct option *opt, return 0; } -int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) +static int ls_files(const char **argv, const char *prefix) { - int require_work_tree = 0, show_tag = 0, i; - int max_depth = -1; + int require_work_tree = 0, i; const char *max_prefix; - struct dir_struct dir; struct exclude_list *el; - struct string_list exclude_list = STRING_LIST_INIT_NODUP; - struct option builtin_ls_files_options[] = { - { OPTION_CALLBACK, 'z', NULL, NULL, NULL, - N_("paths are separated with NUL character"), - PARSE_OPT_NOARG, option_parse_z }, - OPT_BOOL('t', NULL, &show_tag, - N_("identify the file status with tags")), - OPT_BOOL('v', NULL, &show_valid_bit, - N_("use lowercase letters for 'assume unchanged' files")), - 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('s', "stage", &show_stage, - N_("show staged contents' object name in the output")), - OPT_BOOL('k', "killed", &show_killed, - N_("show files on the filesystem that need to be removed")), - OPT_BIT(0, "directory", &dir.flags, - N_("show 'other' directories' name only"), - DIR_SHOW_OTHER_DIRECTORIES), - OPT_NEGBIT(0, "empty-directory", &dir.flags, - N_("don't show empty directories"), - DIR_HIDE_EMPTY_DIRECTORIES), - OPT_BOOL('u', "unmerged", &show_unmerged, - N_("show unmerged files in the output")), - OPT_BOOL(0, "resolve-undo", &show_resolve_undo, - N_("show resolve-undo information")), - { OPTION_CALLBACK, 'x', "exclude", &exclude_list, N_("pattern"), - N_("skip files matching pattern"), - 0, option_parse_exclude }, - { OPTION_CALLBACK, 'X', "exclude-from", &dir, N_("file"), - N_("exclude patterns are read from <file>"), - 0, option_parse_exclude_from }, - OPT_STRING(0, "exclude-per-directory", &dir.exclude_per_dir, N_("file"), - N_("read additional per-directory exclude patterns in <file>")), - { OPTION_CALLBACK, 0, "exclude-standard", &dir, NULL, - N_("add the standard git exclusions"), - PARSE_OPT_NOARG, option_parse_exclude_standard }, - { OPTION_SET_INT, 0, "full-name", &prefix_len, NULL, - N_("make the output relative to the project top directory"), - PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL }, - OPT_BOOL(0, "error-unmatch", &error_unmatch, - N_("if any <file> is not in the index, treat this as an error")), - OPT_STRING(0, "with-tree", &with_tree, N_("tree-ish"), - N_("pretend that paths removed since <tree-ish> are still present")), - 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_BOOL(0, "debug", &debug_mode, N_("show debugging data")), - OPT_END() - }; - - if (argc == 2 && !strcmp(argv[1], "-h")) - usage_with_options(ls_files_usage, builtin_ls_files_options); - memset(&dir, 0, sizeof(dir)); - prefix = cmd_prefix; - if (prefix) - prefix_len = strlen(prefix); - 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); 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); @@ -681,3 +608,82 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) return 0; } + +int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) +{ + struct option builtin_ls_files_options[] = { + { OPTION_CALLBACK, 'z', NULL, NULL, NULL, + N_("paths are separated with NUL character"), + PARSE_OPT_NOARG, option_parse_z }, + OPT_BOOL('t', NULL, &show_tag, + N_("identify the file status with tags")), + OPT_BOOL('v', NULL, &show_valid_bit, + N_("use lowercase letters for 'assume unchanged' files")), + 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('s', "stage", &show_stage, + N_("show staged contents' object name in the output")), + OPT_BOOL('k', "killed", &show_killed, + N_("show files on the filesystem that need to be removed")), + OPT_BIT(0, "directory", &dir.flags, + N_("show 'other' directories' name only"), + DIR_SHOW_OTHER_DIRECTORIES), + OPT_NEGBIT(0, "empty-directory", &dir.flags, + N_("don't show empty directories"), + DIR_HIDE_EMPTY_DIRECTORIES), + OPT_BOOL('u', "unmerged", &show_unmerged, + N_("show unmerged files in the output")), + OPT_BOOL(0, "resolve-undo", &show_resolve_undo, + N_("show resolve-undo information")), + { OPTION_CALLBACK, 'x', "exclude", &exclude_list, N_("pattern"), + N_("skip files matching pattern"), + 0, option_parse_exclude }, + { OPTION_CALLBACK, 'X', "exclude-from", &dir, N_("file"), + N_("exclude patterns are read from <file>"), + 0, option_parse_exclude_from }, + OPT_STRING(0, "exclude-per-directory", &dir.exclude_per_dir, N_("file"), + N_("read additional per-directory exclude patterns in <file>")), + { OPTION_CALLBACK, 0, "exclude-standard", &dir, NULL, + N_("add the standard git exclusions"), + PARSE_OPT_NOARG, option_parse_exclude_standard }, + { OPTION_SET_INT, 0, "full-name", &prefix_len, NULL, + N_("make the output relative to the project top directory"), + PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL }, + OPT_BOOL(0, "error-unmatch", &error_unmatch, + N_("if any <file> is not in the index, treat this as an error")), + OPT_STRING(0, "with-tree", &with_tree, N_("tree-ish"), + N_("pretend that paths removed since <tree-ish> are still present")), + 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_BOOL(0, "debug", &debug_mode, N_("show debugging data")), + OPT_END() + }; + + if (argc == 2 && !strcmp(argv[1], "-h")) + usage_with_options(ls_files_usage, builtin_ls_files_options); + + prefix = cmd_prefix; + if (prefix) + prefix_len = strlen(prefix); + 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); + return ls_files(argv, prefix); +} -- 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