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

[PATCH 07/25] list-files: add tag to each entry, filter duplicate tags

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Apr 6, 2015, 13:52 UTC
Message-ID
<1428328354-14897-8-git-send-email-pclouds@gmail.com>
In-Reply-To
<1428328354-14897-1-git-send-email-pclouds@gmail.com>

All entries have a two-letter tag. If all entries have the same tags, tags are not displayed.

The outcome before and after this patch is the same. But it will be useful in future when there are more than one type of entry.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 builtin/list-files.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 63 insertions(+), 1 deletion(-)
diff --git a/builtin/list-files.c b/builtin/list-files.c
index 51ff19d..ec9ca17 100644
--- a/builtin/list-files.c
+++ b/builtin/list-files.c
@@ -12,17 +12,20 @@ enum item_type {
 struct item {
 	enum item_type type;
 	const char *path;
+	char tag[2];
 	const struct cache_entry *ce;
 };
 
 struct item_list {
 	struct item *items;
 	int nr, alloc;
+	int tag_pos, tag_len;
 };
 
 static struct pathspec pathspec;
 static const char *prefix;
 static int prefix_length;
+static int show_tag = -1;
 
 static const char * const ls_usage[] = {
 	N_("git list-files [options] [<pathspec>...]"),
@@ -30,6 +33,7 @@ static const char * const ls_usage[] = {
 };
 
 struct option ls_options[] = {
+	OPT_BOOL(0, "tag", &show_tag, N_("show tags")),
 	OPT_END()
 };
 
@@ -52,10 +56,61 @@ static void populate_cached_entries(struct item_list *result,
 		item = result->items + result->nr++;
 		item->type = FROM_INDEX;
 		item->path = ce->name;
+		item->tag[0] = ' ';
+		item->tag[1] = ' ';
 		item->ce = ce;
 	}
 }
 
+static void cleanup_tags(struct item_list *result)
+{
+	int i, same_1 = 1, same_2 = 1;
+
+	if (!show_tag) {
+		result->tag_pos = 0;
+		result->tag_len = 0;
+		return;
+	}
+	if (show_tag > 0) {
+		result->tag_pos = 0;
+		result->tag_len = 2;
+		return;
+	}
+
+	for (i = 1; i < result->nr && (same_1 || same_2); i++) {
+		const char *s0 = result->items[i - 1].tag;
+		const char *s1 = result->items[i].tag;
+
+		same_1 = same_1 && s0[0] == s1[0];
+		same_2 = same_2 && s0[1] == s1[1];
+	}
+
+	if (same_1 && same_2) {
+		result->tag_pos = 0;
+		result->tag_len = 0;
+	} else if (same_1) {
+		result->tag_pos = 1;
+		result->tag_len = 1;
+	} else if (same_2) {
+		result->tag_pos = 0;
+		result->tag_len = 1;
+	} else {
+		result->tag_pos = 0;
+		result->tag_len = 2;
+	}
+}
+
+/* this is similar to quote_path_relative() except it does not clear sb */
+static void quote_item(struct strbuf *out, const struct item *item)
+{
+	static struct strbuf sb = STRBUF_INIT;
+	const char *rel;
+
+	strbuf_reset(&sb);
+	rel = relative_path(item->path, prefix, &sb);
+	quote_c_style(rel, out, NULL, 0);
+}
+
 static void display(const struct item_list *result)
 {
 	struct strbuf quoted = STRBUF_INIT;
@@ -67,7 +122,13 @@ static void display(const struct item_list *result)
 	for (i = 0; i < result->nr; i++) {
 		const struct item *item = result->items + i;
 
-		quote_path_relative(item->path, prefix, &quoted);
+		strbuf_reset(&quoted);
+		if (result->tag_len) {
+			strbuf_add(&quoted, item->tag + result->tag_pos,
+				   result->tag_len);
+			strbuf_addch(&quoted, ' ');
+		}
+		quote_item(&quoted, item);
 		printf("%s\n", quoted.buf);
 	}
 	strbuf_release(&quoted);
@@ -108,6 +169,7 @@ int cmd_list_files(int argc, const char **argv, const char *cmd_prefix)
 
 	memset(&result, 0, sizeof(result));
 	populate_cached_entries(&result, &the_index);
+	cleanup_tags(&result);
 	display(&result);
 	/* free-ing result seems unnecessary */
 	return 0;
-- 
2.3.0.rc1.137.g477eb31
Previous: Nguyễn Thái Ngọc DuyNext: Eric Sunshine
Message 8 of 36 in “list-files redesign”
  1. 00/25 list-files redesignNguyễn Thái Ngọc Duy, Apr 6, 2015
  2. 01/25 ls_colors.c: add $LS_COLORS parsing codeNguyễn Thái Ngọc Duy, Apr 6, 2015
  3. 02/25 ls_colors.c: parse color.ls.* from config fileNguyễn Thái Ngọc Duy, Apr 6, 2015
  4. 03/25 ls_colors.c: add a function to color a file nameNguyễn Thái Ngọc Duy, Apr 6, 2015
  5. 04/25 ls_colors.c: highlight submodules like directoriesNguyễn Thái Ngọc Duy, Apr 6, 2015
  6. 05/25 list-files: command skeletonNguyễn Thái Ngọc Duy, Apr 6, 2015
  7. 06/25 list-files: show paths relative to cwdNguyễn Thái Ngọc Duy, Apr 6, 2015
  8. 07/25 list-files: add tag to each entry, filter duplicate tagsNguyễn Thái Ngọc Duy, Apr 6, 2015
  9. Eric SunshineApr 6, 2015
  10. 08/25 list-files: add --[no-]column, -C and -1Nguyễn Thái Ngọc Duy, Apr 6, 2015
  11. 09/25 list-files: add --max-depth, -R and default to --max-depth=0Nguyễn Thái Ngọc Duy, Apr 6, 2015
  12. 10/25 list-files: show directories as well as filesNguyễn Thái Ngọc Duy, Apr 6, 2015
  13. 11/25 list-files: add --colorNguyễn Thái Ngọc Duy, Apr 6, 2015
  14. Eric SunshineApr 6, 2015
  15. 12/25 list-files: add -F/--classifyNguyễn Thái Ngọc Duy, Apr 6, 2015
  16. 13/25 list-files: new indicator '&' for submodules when -F is usedNguyễn Thái Ngọc Duy, Apr 6, 2015
  17. 14/25 list-files: add --cached and --othersNguyễn Thái Ngọc Duy, Apr 6, 2015
  18. 15/25 list-files: add --ignoredNguyễn Thái Ngọc Duy, Apr 6, 2015
  19. Eric SunshineApr 6, 2015
  20. 16/25 list-files: add --unmergedNguyễn Thái Ngọc Duy, Apr 6, 2015
  21. Eric SunshineApr 6, 2015
  22. 17/25 list-files: add file modification options -[admADM]Nguyễn Thái Ngọc Duy, Apr 6, 2015
  23. Eric SunshineApr 6, 2015
  24. 18/25 list-files: delete redundant cached entriesNguyễn Thái Ngọc Duy, Apr 6, 2015
  25. Eric SunshineApr 6, 2015
  26. Junio C HamanoApr 8, 2015
  27. 19/25 list-files: make alias 'ls' default to 'list-files'Nguyễn Thái Ngọc Duy, Apr 6, 2015
  28. 20/25 list-files: preload indexNguyễn Thái Ngọc Duy, Apr 6, 2015
  29. Eric SunshineApr 6, 2015
  30. 21/25 list-files: reduce match_pathspec calls in matched()Nguyễn Thái Ngọc Duy, Apr 6, 2015
  31. 22/25 list-files: only do diff that is actually usefulNguyễn Thái Ngọc Duy, Apr 6, 2015
  32. 23/25 pathspec: move getenv() code out of prefix_pathspec()Nguyễn Thái Ngọc Duy, Apr 6, 2015
  33. 24/25 list-files: make :(glob) pathspec defaultNguyễn Thái Ngọc Duy, Apr 6, 2015
  34. 25/25 list-files: documentationNguyễn Thái Ngọc Duy, Apr 6, 2015
  35. Eric SunshineApr 6, 2015
  36. Duy NguyenApr 6, 2015

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.