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

[PATCH v3 08/15] revision.c: use commit-slab for show_source

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
May 19, 2018, 05:28 UTC
Message-ID
<20180519052831.12603-9-pclouds@gmail.com>
In-Reply-To
<20180519052831.12603-1-pclouds@gmail.com>

Instead of relying on commit->util to store the source string, let the user provide a commit-slab to store the source strings in.

It's done so that commit->util can be removed. See more explanation in
the commit that removes commit->util.
---
 builtin/fast-export.c | 14 +++++++++-----
 builtin/log.c         |  7 +++++--
 log-tree.c            |  8 ++++++--
 revision.c            | 19 +++++++++++++++----
 revision.h            |  5 ++++-
 5 files changed, 39 insertions(+), 14 deletions(-)
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index 530df12f05..5aaf5c8e59 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -21,6 +21,7 @@
 #include "quote.h"
 #include "remote.h"
 #include "blob.h"
+#include "commit-slab.h"
 
 static const char *fast_export_usage[] = {
 	N_("git fast-export [rev-list-opts]"),
@@ -38,6 +39,7 @@ static struct string_list extra_refs = STRING_LIST_INIT_NODUP;
 static struct refspec *refspecs;
 static int refspecs_nr;
 static int anonymize;
+static struct revision_sources revision_sources;
 
 static int parse_opt_signed_tag_mode(const struct option *opt,
 				     const char *arg, int unset)
@@ -590,7 +592,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev,
 		if (!S_ISGITLINK(diff_queued_diff.queue[i]->two->mode))
 			export_blob(&diff_queued_diff.queue[i]->two->oid);
 
-	refname = commit->util;
+	refname = *revision_sources_at(&revision_sources, commit);
 	if (anonymize) {
 		refname = anonymize_refname(refname);
 		anonymize_ident_line(&committer, &committer_end);
@@ -862,10 +864,11 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info)
 		 * This ref will not be updated through a commit, lets make
 		 * sure it gets properly updated eventually.
 		 */
-		if (commit->util || commit->object.flags & SHOWN)
+		if (*revision_sources_at(&revision_sources, commit) ||
+		    commit->object.flags & SHOWN)
 			string_list_append(&extra_refs, full_name)->util = commit;
-		if (!commit->util)
-			commit->util = full_name;
+		if (!*revision_sources_at(&revision_sources, commit))
+			*revision_sources_at(&revision_sources, commit) = full_name;
 	}
 }
 
@@ -1029,8 +1032,9 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
 	git_config(git_default_config, NULL);
 
 	init_revisions(&revs, prefix);
+	init_revision_sources(&revision_sources);
 	revs.topo_order = 1;
-	revs.show_source = 1;
+	revs.sources = &revision_sources;
 	revs.rewrite_parents = 1;
 	argc = parse_options(argc, argv, prefix, options, fast_export_usage,
 			PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN);
diff --git a/builtin/log.c b/builtin/log.c
index 71f68a3e4f..d017e57475 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -148,6 +148,7 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 	static struct string_list decorate_refs_include = STRING_LIST_INIT_NODUP;
 	struct decoration_filter decoration_filter = {&decorate_refs_include,
 						      &decorate_refs_exclude};
+	static struct revision_sources revision_sources;
 
 	const struct option builtin_log_options[] = {
 		OPT__QUIET(&quiet, N_("suppress diff output")),
@@ -194,8 +195,10 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 	    rev->diffopt.filter || rev->diffopt.flags.follow_renames)
 		rev->always_show_header = 0;
 
-	if (source)
-		rev->show_source = 1;
+	if (source) {
+		init_revision_sources(&revision_sources);
+		rev->sources = &revision_sources;
+	}
 
 	if (mailmap) {
 		rev->mailmap = xcalloc(1, sizeof(struct string_list));
diff --git a/log-tree.c b/log-tree.c
index d1c0bedf24..0b41ee3235 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -295,8 +295,12 @@ void show_decorations(struct rev_info *opt, struct commit *commit)
 {
 	struct strbuf sb = STRBUF_INIT;
 
-	if (opt->show_source && commit->util)
-		fprintf(opt->diffopt.file, "\t%s", (char *) commit->util);
+	if (opt->sources) {
+		char **slot = revision_sources_peek(opt->sources, commit);
+
+		if (slot && *slot)
+			fprintf(opt->diffopt.file, "\t%s", *slot);
+	}
 	if (!opt->show_decorations)
 		return;
 	format_decorations(&sb, commit, opt->diffopt.use_color);
diff --git a/revision.c b/revision.c
index 1cff11833e..be8fe7d67b 100644
--- a/revision.c
+++ b/revision.c
@@ -29,6 +29,8 @@ volatile show_early_output_fn_t show_early_output;
 static const char *term_bad;
 static const char *term_good;
 
+implement_shared_commit_slab(revision_sources, char *);
+
 void show_object_with_name(FILE *out, struct object *obj, const char *name)
 {
 	const char *p;
@@ -255,14 +257,19 @@ static struct commit *handle_commit(struct rev_info *revs,
 	 */
 	if (object->type == OBJ_COMMIT) {
 		struct commit *commit = (struct commit *)object;
+
 		if (parse_commit(commit) < 0)
 			die("unable to parse commit %s", name);
 		if (flags & UNINTERESTING) {
 			mark_parents_uninteresting(commit);
 			revs->limited = 1;
 		}
-		if (revs->show_source && !commit->util)
-			commit->util = xstrdup(name);
+		if (revs->sources) {
+			char **slot = revision_sources_at(revs->sources, commit);
+
+			if (!*slot)
+				*slot = xstrdup(name);
+		}
 		return commit;
 	}
 
@@ -814,8 +821,12 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit,
 			}
 			return -1;
 		}
-		if (revs->show_source && !p->util)
-			p->util = commit->util;
+		if (revs->sources) {
+			char **slot = revision_sources_at(revs->sources, p);
+
+			if (!*slot)
+				*slot = *revision_sources_at(revs->sources, commit);
+		}
 		p->object.flags |= left_flag;
 		if (!(p->object.flags & SEEN)) {
 			p->object.flags |= SEEN;
diff --git a/revision.h b/revision.h
index b8c47b98e2..bf2239f876 100644
--- a/revision.h
+++ b/revision.h
@@ -6,6 +6,7 @@
 #include "notes.h"
 #include "pretty.h"
 #include "diff.h"
+#include "commit-slab-decl.h"
 
 /* Remember to update object flag allocation in object.h */
 #define SEEN		(1u<<0)
@@ -29,6 +30,7 @@ struct rev_info;
 struct log_info;
 struct string_list;
 struct saved_parents;
+define_shared_commit_slab(revision_sources, char *);
 
 struct rev_cmdline_info {
 	unsigned int nr;
@@ -111,7 +113,6 @@ struct rev_info {
 			right_only:1,
 			rewrite_parents:1,
 			print_parents:1,
-			show_source:1,
 			show_decorations:1,
 			reverse:1,
 			reverse_output_stage:1,
@@ -224,6 +225,8 @@ struct rev_info {
 
 	struct commit_list *previous_parents;
 	const char *break_bar;
+
+	struct revision_sources *sources;
 };
 
 extern int ref_excluded(struct string_list *, const char *path);
-- 
2.17.0.705.g3525833791
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 70 of 82 in “Die commit->util, die!”
  1. 00/12 Die commit->util, die!Nguyễn Thái Ngọc Duy, May 12, 2018
  2. 02/12 describe: use commit-slab for commit names instead of commit->utilNguyễn Thái Ngọc Duy, May 12, 2018
  3. 05/12 sequencer.c: use commit-slab to associate todo items to commitsNguyễn Thái Ngọc Duy, May 12, 2018
  4. Jeff KingMay 12, 2018
  5. 04/12 sequencer.c: use commit-slab to mark seen commitsNguyễn Thái Ngọc Duy, May 12, 2018
  6. Jeff KingMay 12, 2018
  7. Junio C HamanoMay 12, 2018
  8. Duy NguyenMay 12, 2018
  9. 06/12 revision.c: use commit-slab for show_sourceNguyễn Thái Ngọc Duy, May 12, 2018
  10. Jeff KingMay 12, 2018
  11. Junio C HamanoMay 12, 2018
  12. Duy NguyenMay 12, 2018
  13. Jeff KingMay 12, 2018
  14. 10/12 log: use commit-slab in prepare_bases() instead of commit->utilNguyễn Thái Ngọc Duy, May 12, 2018
  15. 12/12 commit.h: delete 'util' field in struct commitNguyễn Thái Ngọc Duy, May 12, 2018
  16. 11/12 merge: use commit-slab in merge remote desc instead of commit->utilNguyễn Thái Ngọc Duy, May 12, 2018
  17. 09/12 show-branch: use commit-slab for commit-name instead of commit->utilNguyễn Thái Ngọc Duy, May 12, 2018
  18. 01/12 blame: use commit-slab for blame suspects instead of commit->utilNguyễn Thái Ngọc Duy, May 12, 2018
  19. Jeff KingMay 12, 2018
  20. Duy NguyenMay 12, 2018
  21. 07/12 bisect.c: use commit-slab for commit weight instead of commit->utilNguyễn Thái Ngọc Duy, May 12, 2018
  22. Junio C HamanoMay 12, 2018
  23. 08/12 name-rev: use commit-slab for rev-name instead of commit->utilNguyễn Thái Ngọc Duy, May 12, 2018
  24. 03/12 shallow.c: use commit-slab for commit depth instead of commit->utilNguyễn Thái Ngọc Duy, May 12, 2018
  25. Jeff KingMay 12, 2018
  26. Jeff KingMay 12, 2018
  27. Duy NguyenMay 12, 2018
  28. Jeff KingMay 12, 2018
  29. Duy NguyenMay 12, 2018
  30. Jeff KingMay 12, 2018
  31. Jakub NarebskiMay 12, 2018
  32. Duy NguyenMay 13, 2018
  33. 00/14 Die commit->util, die!Nguyễn Thái Ngọc Duy, May 13, 2018
  34. 01/14 commit-slab.h: code splitNguyễn Thái Ngọc Duy, May 13, 2018
  35. Junio C HamanoMay 13, 2018
  36. 02/14 commit-slab: support shared commit-slabNguyễn Thái Ngọc Duy, May 13, 2018
  37. Junio C HamanoMay 13, 2018
  38. 03/14 blame: use commit-slab for blame suspects instead of commit->utilNguyễn Thái Ngọc Duy, May 13, 2018
  39. Junio C HamanoMay 13, 2018
  40. 06/14 sequencer.c: use commit-slab to mark seen commitsNguyễn Thái Ngọc Duy, May 13, 2018
  41. Junio C HamanoMay 14, 2018
  42. 12/14 log: use commit-slab in prepare_bases() instead of commit->utilNguyễn Thái Ngọc Duy, May 13, 2018
  43. 07/14 sequencer.c: use commit-slab to associate todo items to commitsNguyễn Thái Ngọc Duy, May 13, 2018
  44. 14/14 commit.h: delete 'util' field in struct commitNguyễn Thái Ngọc Duy, May 13, 2018
  45. Junio C HamanoMay 14, 2018
  46. Duy NguyenMay 14, 2018
  47. Duy NguyenMay 14, 2018
  48. Derrick StoleeMay 14, 2018
  49. Duy NguyenMay 19, 2018
  50. 08/14 revision.c: use commit-slab for show_sourceNguyễn Thái Ngọc Duy, May 13, 2018
  51. Junio C HamanoMay 14, 2018
  52. Junio C HamanoMay 14, 2018
  53. 13/14 merge: use commit-slab in merge remote desc instead of commit->utilNguyễn Thái Ngọc Duy, May 13, 2018
  54. Junio C HamanoMay 18, 2018
  55. Ramsay JonesMay 18, 2018
  56. 11/14 show-branch: use commit-slab for commit-name instead of commit->utilNguyễn Thái Ngọc Duy, May 13, 2018
  57. Junio C HamanoMay 14, 2018
  58. Duy NguyenMay 19, 2018
  59. 09/14 bisect.c: use commit-slab for commit weight instead of commit->utilNguyễn Thái Ngọc Duy, May 13, 2018
  60. Junio C HamanoMay 14, 2018
  61. 05/14 shallow.c: use commit-slab for commit depth instead of commit->utilNguyễn Thái Ngọc Duy, May 13, 2018
  62. 10/14 name-rev: use commit-slab for rev-name instead of commit->utilNguyễn Thái Ngọc Duy, May 13, 2018
  63. 04/14 describe: use commit-slab for commit names instead of commit->utilNguyễn Thái Ngọc Duy, May 13, 2018
  64. Junio C HamanoMay 13, 2018
  65. 00/15 Die commit->util, die!Nguyễn Thái Ngọc Duy, May 19, 2018
  66. 01/15 commit-slab.h: code splitNguyễn Thái Ngọc Duy, May 19, 2018
  67. Junio C HamanoMay 21, 2018
  68. 02/15 commit-slab: support shared commit-slabNguyễn Thái Ngọc Duy, May 19, 2018
  69. 04/15 describe: use commit-slab for commit names instead of commit->utilNguyễn Thái Ngọc Duy, May 19, 2018
  70. 08/15 revision.c: use commit-slab for show_sourceNguyễn Thái Ngọc Duy, May 19, 2018
  71. 09/15 bisect.c: use commit-slab for commit weight instead of commit->utilNguyễn Thái Ngọc Duy, May 19, 2018
  72. 07/15 sequencer.c: use commit-slab to associate todo items to commitsNguyễn Thái Ngọc Duy, May 19, 2018
  73. 13/15 log: use commit-slab in prepare_bases() instead of commit->utilNguyễn Thái Ngọc Duy, May 19, 2018
  74. 15/15 commit.h: delete 'util' field in struct commitNguyễn Thái Ngọc Duy, May 19, 2018
  75. 14/15 merge: use commit-slab in merge remote desc instead of commit->utilNguyễn Thái Ngọc Duy, May 19, 2018
  76. 06/15 sequencer.c: use commit-slab to mark seen commitsNguyễn Thái Ngọc Duy, May 19, 2018
  77. 12/15 show-branch: note about its object flags usageNguyễn Thái Ngọc Duy, May 19, 2018
  78. 11/15 show-branch: use commit-slab for commit-name instead of commit->utilNguyễn Thái Ngọc Duy, May 19, 2018
  79. 10/15 name-rev: use commit-slab for rev-name instead of commit->utilNguyễn Thái Ngọc Duy, May 19, 2018
  80. 03/15 blame: use commit-slab for blame suspects instead of commit->utilNguyễn Thái Ngọc Duy, May 19, 2018
  81. 05/15 shallow.c: use commit-slab for commit depth instead of commit->utilNguyễn Thái Ngọc Duy, May 19, 2018
  82. Stefan BellerMay 22, 2018

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.