git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 09/17] ls-files: split main ls-files logic into ls_files() function

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Mar 26, 2014, 13:48 UTC
Message-ID
<1395841697-11742-10-git-send-email-pclouds@gmail.com>
In-Reply-To
<1395841697-11742-1-git-send-email-pclouds@gmail.com>

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@gmail.com>
---
 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
Previous: Eric SunshineNext: Nguyễn Thái Ngọc Duy
Message 43 of 79 in “git-ls”
  1. 0/8 git-lsNguyễn Thái Ngọc Duy, Mar 20, 2014
  2. 1/8 Import $LS_COLORS parsing code from coreutilsNguyễn Thái Ngọc Duy, Mar 20, 2014
  3. David TranMar 20, 2014
  4. Duy NguyenMar 21, 2014
  5. David TranMar 21, 2014
  6. 2/8 ls_colors.c: a bit of document on print_color_indicator inputNguyễn Thái Ngọc Duy, Mar 20, 2014
  7. 3/8 ls_colors.c: enable coloring on u+x filesNguyễn Thái Ngọc Duy, Mar 20, 2014
  8. Matthieu MoyMar 20, 2014
  9. Duy NguyenMar 20, 2014
  10. Junio C HamanoMar 20, 2014
  11. Duy NguyenMar 21, 2014
  12. 4/8 ls_colors.c: new color descriptorsNguyễn Thái Ngọc Duy, Mar 20, 2014
  13. 5/8 ls-files: add --color to highlight based on $LS_COLORSNguyễn Thái Ngọc Duy, Mar 20, 2014
  14. 6/8 ls-files: add --columnNguyễn Thái Ngọc Duy, Mar 20, 2014
  15. Matthieu MoyMar 25, 2014
  16. 7/8 ls-files: support --max-depthNguyễn Thái Ngọc Duy, Mar 20, 2014
  17. Matthieu MoyMar 25, 2014
  18. Duy NguyenMar 25, 2014
  19. Duy NguyenMar 27, 2014
  20. Matthieu MoyMar 28, 2014
  21. Duy NguyenMar 28, 2014
  22. Duy NguyenMar 28, 2014
  23. 8/8 Add git-ls, a user friendly version of ls-files and moreNguyễn Thái Ngọc Duy, Mar 20, 2014
  24. Matthieu MoyMar 20, 2014
  25. 00/17 git-lsNguyễn Thái Ngọc Duy, Mar 26, 2014
  26. 01/17 ls_colors.c: add $LS_COLORS parsing codeNguyễn Thái Ngọc Duy, Mar 26, 2014
  27. 02/17 ls_colors.c: parse color.ls.* from config fileNguyễn Thái Ngọc Duy, Mar 26, 2014
  28. 03/17 ls_colors.c: add function to color a file nameNguyễn Thái Ngọc Duy, Mar 26, 2014
  29. Eric SunshineMar 26, 2014
  30. 04/17 ls_colors.c: highlight submodules like directoriesNguyễn Thái Ngọc Duy, Mar 26, 2014
  31. 05/17 ls-files: buffer full item in strbuf before printingNguyễn Thái Ngọc Duy, Mar 26, 2014
  32. Eric SunshineMar 26, 2014
  33. Duy NguyenMar 26, 2014
  34. Eric SunshineMar 27, 2014
  35. 06/17 ls-files: add --color to highlight file namesNguyễn Thái Ngọc Duy, Mar 26, 2014
  36. Eric SunshineMar 26, 2014
  37. Duy NguyenMar 26, 2014
  38. Eric SunshineMar 28, 2014
  39. 07/17 ls-files: add --columnNguyễn Thái Ngọc Duy, Mar 26, 2014
  40. Eric SunshineMar 26, 2014
  41. 08/17 ls-files: support --max-depthNguyễn Thái Ngọc Duy, Mar 26, 2014
  42. Eric SunshineMar 26, 2014
  43. 09/17 ls-files: split main ls-files logic into ls_files() functionNguyễn Thái Ngọc Duy, Mar 26, 2014
  44. 10/17 Add git-ls, a user friendly version of ls-files and moreNguyễn Thái Ngọc Duy, Mar 26, 2014
  45. Eric SunshineMar 26, 2014
  46. 11/17 ls: -u does not imply showing stagesNguyễn Thái Ngọc Duy, Mar 26, 2014
  47. 12/17 ls: add -R/--recursive short for --max-depth=-1Nguyễn Thái Ngọc Duy, Mar 26, 2014
  48. 13/17 ls: add -1 short for --no-column in the spirit of GNU lsNguyễn Thái Ngọc Duy, Mar 26, 2014
  49. Eric SunshineMar 28, 2014
  50. 14/17 ls: add -t backNguyễn Thái Ngọc Duy, Mar 26, 2014
  51. 15/17 ls: sort output and remove duplicatesNguyễn Thái Ngọc Duy, Mar 26, 2014
  52. 16/17 ls: do not show duplicate cached entriesNguyễn Thái Ngọc Duy, Mar 26, 2014
  53. Eric SunshineMar 28, 2014
  54. ls-files: do not trust stat info if lstat() failsNguyễn Thái Ngọc Duy, Mar 28, 2014
  55. Junio C HamanoApr 2, 2014
  56. Duy NguyenApr 3, 2014
  57. Junio C HamanoApr 3, 2014
  58. Duy NguyenApr 5, 2014
  59. Junio C HamanoApr 7, 2014
  60. 17/17 ls: show directories as well as filesNguyễn Thái Ngọc Duy, Mar 26, 2014
  61. 00/18 git-lsNguyễn Thái Ngọc Duy, Mar 30, 2014
  62. 01/18 ls_colors.c: add $LS_COLORS parsing codeNguyễn Thái Ngọc Duy, Mar 30, 2014
  63. 02/18 ls_colors.c: parse color.ls.* from config fileNguyễn Thái Ngọc Duy, Mar 30, 2014
  64. 03/18 ls_colors.c: add a function to color a file nameNguyễn Thái Ngọc Duy, Mar 30, 2014
  65. 04/18 ls_colors.c: highlight submodules like directoriesNguyễn Thái Ngọc Duy, Mar 30, 2014
  66. 05/18 ls-files: buffer full item in strbuf before printingNguyễn Thái Ngọc Duy, Mar 30, 2014
  67. 06/18 ls-files: add --color to highlight file namesNguyễn Thái Ngọc Duy, Mar 30, 2014
  68. 07/18 ls-files: add --columnNguyễn Thái Ngọc Duy, Mar 30, 2014
  69. 08/18 ls-files: support --max-depthNguyễn Thái Ngọc Duy, Mar 30, 2014
  70. 09/18 Add git-list-files, a user friendly version of ls-files and moreNguyễn Thái Ngọc Duy, Mar 30, 2014
  71. 10/18 list-files: -u does not imply showing stagesNguyễn Thái Ngọc Duy, Mar 30, 2014
  72. 11/18 list-files: add -R/--recursive short for --max-depth=-1Nguyễn Thái Ngọc Duy, Mar 30, 2014
  73. 12/18 list-files: add -1 short for --no-columnNguyễn Thái Ngọc Duy, Mar 30, 2014
  74. 13/18 list-files: add -t backNguyễn Thái Ngọc Duy, Mar 30, 2014
  75. 14/18 list-files: sort output and remove duplicatesNguyễn Thái Ngọc Duy, Mar 30, 2014
  76. 15/18 list-files: do not show duplicate cached entriesNguyễn Thái Ngọc Duy, Mar 30, 2014
  77. 16/18 list-files: show directories as well as filesNguyễn Thái Ngọc Duy, Mar 30, 2014
  78. 17/18 list-files: add -F/--classifyNguyễn Thái Ngọc Duy, Mar 30, 2014
  79. 18/18 list-files -F: show submodules with the new indicator '&'Nguyễn Thái Ngọc Duy, Mar 30, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.