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

[PATCH 1/3] ls-files: support --max-depth

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Jan 7, 2010, 17:07 UTC
Message-ID
<1262884076-12293-2-git-send-email-pclouds@gmail.com>
In-Reply-To
<1262884076-12293-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 builtin-ls-files.c |   30 ++++++++++++++++++++++++++++++
 1 files changed, 30 insertions(+), 0 deletions(-)
diff --git a/builtin-ls-files.c b/builtin-ls-files.c
index 7382157..2bb851a 100644
--- a/builtin-ls-files.c
+++ b/builtin-ls-files.c
@@ -30,6 +30,7 @@ static int error_unmatch;
 static char *ps_matched;
 static const char *with_tree;
 static int exc_given;
+static int max_depth = 0;
 
 static const char *tag_cached = "";
 static const char *tag_unmerged = "";
@@ -232,6 +233,30 @@ static void prune_cache(const char *prefix)
 	active_nr = last;
 }
 
+/*
+ * It is assumed that prune_cache() as been called before this
+ */
+static void prune_cache_by_depth(const char *prefix, int max_depth)
+{
+	int i = active_nr-1;
+
+	while (i >= 0) {
+		int slashes = 0;
+		const char *entry = active_cache[i]->name + prefix_len;
+		while ((entry = strchr(entry, '/')) != NULL) {
+			slashes++;
+			if (slashes >= max_depth) {
+				memmove(active_cache + i, active_cache + i + 1,
+					(active_nr - i - 1) * sizeof(struct cache_entry *));
+				active_nr--;
+				break;
+			}
+			entry++;
+		}
+		i--;
+	}
+}
+
 static const char *verify_pathspec(const char *prefix)
 {
 	const char **p, *n, *prev;
@@ -476,6 +501,7 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix)
 			"if any <file> is not in the index, treat this as an error"),
 		OPT_STRING(0, "with-tree", &with_tree, "tree-ish",
 			"pretend that paths removed since <tree-ish> are still present"),
+		OPT_INTEGER(0, "max-depth", &max_depth, "max recursive depth"),
 		OPT__ABBREV(&abbrev),
 		OPT_END()
 	};
@@ -541,6 +567,10 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix)
 
 	if (prefix)
 		prune_cache(prefix);
+
+	if (max_depth)
+		prune_cache_by_depth(prefix, max_depth);
+
 	if (with_tree) {
 		/*
 		 * Basic sanity check; show-stages and show-unmerged
-- 
1.6.6.315.g1a406
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 2 of 13 in “Bringing git-ls-files to porcelain level”
  1. 0/3 Bringing git-ls-files to porcelain levelNguyễn Thái Ngọc Duy, Jan 7, 2010
  2. 1/3 ls-files: support --max-depthNguyễn Thái Ngọc Duy, Jan 7, 2010
  3. 2/3 ls-files: support -o --max-depth (more of a hack as fill_directory should support this)Nguyễn Thái Ngọc Duy, Jan 7, 2010
  4. Junio C HamanoJan 7, 2010
  5. 3/3 Add "ls", which is basically ls-files with user-friendly settingsNguyễn Thái Ngọc Duy, Jan 7, 2010
  6. Junio C HamanoJan 7, 2010
  7. Nguyen Thai Ngoc DuyJan 7, 2010
  8. Nguyen Thai Ngoc DuyJan 8, 2010
  9. Matthieu MoyJan 7, 2010
  10. Matthieu MoyJan 7, 2010
  11. Nguyen Thai Ngoc DuyJan 7, 2010
  12. Kan-Ru ChenNov 1, 2010
  13. Nguyen Thai Ngoc DuyNov 1, 2010

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.