git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Thomas Rast <trast@student.ethz.ch>
To: <git@vger.kernel.org>
Cc: Junio C Hamano <gitster@pobox.com>, Johannes Sixt <j6t@kdbg.org>,
	Johan Herland <johan@herland.net>
Subject: [WIP/RFC PATCH] Support showing notes from more than one notes tree
Date: Sat, 20 Feb 2010 15:58:47 +0100	[thread overview]
Message-ID: <8c3f1d66d306747d777f04621f1d43d7e07ddc6a.1266677264.git.trast@student.ethz.ch> (raw)
In-Reply-To: <7v7hqcww7z.fsf@alter.siamese.dyndns.org>

With this patch, you can set notes.displayRef to a glob that points at
your favourite notes refs, e.g.,

[notes]
	displayRef = refs/notes/*

Then git-log and friends will show notes from all trees.
---

I'm running out of git time today, so I'm floating this weatherbaloon
to demonstrate how I would like to get around the limitations
discussed by Junio:

> I was envisioning that most of the time people would want to read from
> (and probably concatenate, or output with the origin information tagged in)
> multiple notes but want to create into a single one.  But updating for
> rewritten commits fundamentally need to happen in all of these multiple
> notes trees they would want to read from.

This patch is the display-several-trees bit.  I'm assuming that it's
ok to load all notes trees at once.  (Obviously it lacks docs, and it
also breaks test because of the new formatting that shows 'Notes from
notes/someref'.  Please ignore those for now.)

My actual intent was to allow more than one notes.displayref config
setting, and loading all of them.  But this doesn't seem to work; a
debugging print confirms that notes_display_config sees the entry, but
another debugging print shows that it only ever loads one of them.
What am I doing wrong?

I plan on having another set of configs called notes.rewriteRef that
gives the list of refs that should have their notes rewritten
automatically along with their commits.  [The rewriteMode setting
could become '<mode> for <ref>' if we want to let the user configure
it on a per-ref/glob basis.]

Finally, git-notes should probably grow a --ref option that serves as
a more convenient way of setting GIT_NOTES_REF.


 notes.c  |   82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 notes.h  |    1 +
 pretty.c |    6 ++--
 3 files changed, 80 insertions(+), 9 deletions(-)

diff --git a/notes.c b/notes.c
index a5ff723..47eaa21 100644
--- a/notes.c
+++ b/notes.c
@@ -5,6 +5,8 @@
 #include "utf8.h"
 #include "strbuf.h"
 #include "tree-walk.h"
+#include "string-list.h"
+#include "refs.h"
 
 /*
  * Use a non-balancing simple 16-tree structure with struct int_node as
@@ -68,6 +70,9 @@ struct non_note {
 
 struct notes_tree default_notes_tree;
 
+struct string_list display_notes_refs;
+struct notes_tree **display_notes_trees;
+
 static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
 		struct int_node *node, unsigned int n);
 
@@ -828,6 +833,36 @@ int combine_notes_ignore(unsigned char *cur_sha1,
 	return 0;
 }
 
+static int read_one_display_ref(const char *path, const unsigned char *sha1,
+				int flag, void *cb)
+{
+	string_list_insert(path, &display_notes_refs);
+	return 0;
+}
+
+
+static int notes_display_config(const char *k, const char *v, void *cb)
+{
+	if (!strcmp(k, "notes.displayref")) {
+		for_each_glob_ref(read_one_display_ref, v, NULL);
+		return 0;
+	}
+
+	return 0;
+}
+
+static const char *default_notes_ref()
+{
+	const char *notes_ref = NULL;
+	if (!notes_ref)
+		notes_ref = getenv(GIT_NOTES_REF_ENVIRONMENT);
+	if (!notes_ref)
+		notes_ref = notes_ref_name; /* value of core.notesRef config */
+	if (!notes_ref)
+		notes_ref = GIT_NOTES_DEFAULT_REF;
+	return notes_ref;
+}
+
 void init_notes(struct notes_tree *t, const char *notes_ref,
 		combine_notes_fn combine_notes, int flags)
 {
@@ -840,11 +875,7 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
 	assert(!t->initialized);
 
 	if (!notes_ref)
-		notes_ref = getenv(GIT_NOTES_REF_ENVIRONMENT);
-	if (!notes_ref)
-		notes_ref = notes_ref_name; /* value of core.notesRef config */
-	if (!notes_ref)
-		notes_ref = GIT_NOTES_DEFAULT_REF;
+		notes_ref = default_notes_ref();
 
 	if (!combine_notes)
 		combine_notes = combine_notes_concatenate;
@@ -868,6 +899,29 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
 	load_subtree(t, &root_tree, t->root, 0);
 }
 
+static int load_one_display_note_ref(struct string_list_item *item,
+				     void *cb_data)
+{
+	int *counter = cb_data;
+	struct notes_tree *t = xcalloc(1, sizeof(struct notes_tree));
+	init_notes(t, item->string, combine_notes_ignore, 0);
+	display_notes_trees[(*counter)++] = t;
+	return 0;
+}
+
+void init_display_notes()
+{
+	int cb_counter = 0;
+	string_list_insert(default_notes_ref(), &display_notes_refs);
+	display_notes_refs.strdup_strings = 1;
+	git_config(notes_display_config, NULL);
+	display_notes_trees = xmalloc((display_notes_refs.nr+1)
+				      * sizeof(struct notes_tree *));
+	for_each_string_list(load_one_display_note_ref,
+			     &display_notes_refs, &cb_counter);
+	display_notes_trees[cb_counter] = NULL;
+}
+
 void add_note(struct notes_tree *t, const unsigned char *object_sha1,
 		const unsigned char *note_sha1, combine_notes_fn combine_notes)
 {
@@ -1016,7 +1070,12 @@ void format_note(struct notes_tree *t, const unsigned char *object_sha1,
 	if (msglen && msg[msglen - 1] == '\n')
 		msglen--;
 
-	if (flags & NOTES_SHOW_HEADER)
+	if (flags & NOTES_SHOW_HEADER_WITH_REF && t->ref) {
+		const char *ref = t->ref;
+		if (!prefixcmp(ref, "refs/"))
+			ref += 5;
+		strbuf_addf(sb, "\nNotes from %s:\n", ref);
+	} else if (flags & (NOTES_SHOW_HEADER|NOTES_SHOW_HEADER_WITH_REF))
 		strbuf_addstr(sb, "\nNotes:\n");
 
 	for (msg_p = msg; msg_p < msg + msglen; msg_p += linelen + 1) {
@@ -1031,6 +1090,17 @@ void format_note(struct notes_tree *t, const unsigned char *object_sha1,
 	free(msg);
 }
 
+void format_display_notes(const unsigned char *object_sha1,
+			  struct strbuf *sb, const char *output_encoding, int flags)
+{
+	int i;
+	if (!display_notes_trees)
+		init_display_notes();
+	for (i = 0; display_notes_trees[i]; i++)
+		format_note(display_notes_trees[i], object_sha1, sb,
+			    output_encoding, flags);
+}
+
 int copy_note(struct notes_tree *t,
 	      const unsigned char *from_obj, const unsigned char *to_obj,
 	      int force, combine_notes_fn combine_fn)
diff --git a/notes.h b/notes.h
index b7547bf..f6a5229 100644
--- a/notes.h
+++ b/notes.h
@@ -193,6 +193,7 @@ int for_each_note(struct notes_tree *t, int flags, each_note_fn fn,
 /* Flags controlling how notes are formatted */
 #define NOTES_SHOW_HEADER 1
 #define NOTES_INDENT 2
+#define NOTES_SHOW_HEADER_WITH_REF 4
 
 /*
  * Fill the given strbuf with the notes associated with the given object.
diff --git a/pretty.c b/pretty.c
index f999485..c185fd2 100644
--- a/pretty.c
+++ b/pretty.c
@@ -775,7 +775,7 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
 		}
 		return 0;	/* unknown %g placeholder */
 	case 'N':
-		format_note(NULL, commit->object.sha1, sb,
+		format_display_notes(commit->object.sha1, sb,
 			    git_log_output_encoding ? git_log_output_encoding
 						    : git_commit_encoding, 0);
 		return 1;
@@ -1096,8 +1096,8 @@ void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
 		strbuf_addch(sb, '\n');
 
 	if (context->show_notes)
-		format_note(NULL, commit->object.sha1, sb, encoding,
-			    NOTES_SHOW_HEADER | NOTES_INDENT);
+		format_display_notes(commit->object.sha1, sb, encoding,
+				     NOTES_SHOW_HEADER_WITH_REF | NOTES_INDENT);
 
 	free(reencoded);
 }
-- 
1.7.0.143.gbf2a7.dirty

  reply	other threads:[~2010-02-20 14:59 UTC|newest]

Thread overview: 135+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-14 16:17 [RFC PATCH 0/6] post-rewrite hook and copying notes Thomas Rast
2010-02-14 16:17 ` [RFC PATCH 1/6] Documentation: document post-rewrite hook Thomas Rast
2010-02-14 16:17 ` [RFC PATCH 2/6] commit --amend: invoke " Thomas Rast
2010-02-14 16:17 ` [RFC PATCH 3/6] filter-branch: " Thomas Rast
2010-02-15 20:36   ` Johannes Sixt
2010-02-14 16:17 ` [RFC PATCH 4/6] rebase: " Thomas Rast
2010-02-14 16:17 ` [RFC PATCH 5/6] rebase -i: " Thomas Rast
2010-02-14 16:17 ` [RFC PATCH 6/6] contrib: add a hook that copies notes over rewrites Thomas Rast
2010-02-14 16:21   ` Thomas Rast
2010-02-14 21:46 ` [PATCH] WIP: git notes copy --stdin Thomas Rast
2010-02-15  1:25   ` Johan Herland
2010-02-16 23:25 ` [RFC PATCH v2 00/11] post-rewrite / automatic notes copying Thomas Rast
2010-02-16 23:25   ` [RFC PATCH v2 01/11] Documentation: document post-rewrite hook Thomas Rast
2010-02-16 23:59     ` Junio C Hamano
2010-02-17  0:18       ` Thomas Rast
2010-02-17  0:29         ` Junio C Hamano
2010-02-16 23:25   ` [RFC PATCH v2 02/11] commit --amend: invoke " Thomas Rast
2010-02-16 23:25   ` [RFC PATCH v2 03/11] rebase: " Thomas Rast
2010-02-16 23:26   ` [RFC PATCH v2 04/11] rebase -i: " Thomas Rast
2010-02-16 23:26   ` [RFC PATCH v2 05/11] notes: clean up t3301 Thomas Rast
2010-02-16 23:52     ` Junio C Hamano
2010-02-16 23:26   ` [RFC PATCH v2 06/11] notes: implement 'git notes copy --stdin' Thomas Rast
2010-02-16 23:26   ` [RFC PATCH v2 07/11] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-02-16 23:58     ` Junio C Hamano
2010-02-17  0:09       ` Thomas Rast
2010-02-17  0:18         ` Junio C Hamano
2010-02-20 14:58           ` Thomas Rast [this message]
2010-02-20 15:23             ` [WIP/RFC PATCH] Support showing notes from more than one notes tree Thomas Rast
2010-02-16 23:26   ` [RFC PATCH v2 08/11] rebase: support automatic notes copying Thomas Rast
2010-02-16 23:26   ` [RFC PATCH v2 09/11] commit --amend: copy notes to the new commit Thomas Rast
2010-02-16 23:26   ` [RFC PATCH v2 10/11] filter-branch: invoke post-rewrite hook Thomas Rast
2010-02-16 23:26   ` [RFC PATCH v2 11/11] filter-branch: learn how to filter notes Thomas Rast
2010-02-17 19:59     ` Johannes Sixt
2010-02-17 23:06       ` Thomas Rast
2010-02-20 22:16   ` [RFC PATCH v3 00/12] several notes refs, post-rewrite, notes rewriting Thomas Rast
2010-02-20 22:16     ` [RFC PATCH v3 01/12] Support showing notes from more than one notes tree Thomas Rast
2010-02-21  3:06       ` Junio C Hamano
2010-02-20 22:16     ` [RFC PATCH v3 02/12] Documentation: document post-rewrite hook Thomas Rast
2010-02-20 22:16     ` [RFC PATCH v3 03/12] commit --amend: invoke " Thomas Rast
2010-02-21  3:12       ` Junio C Hamano
2010-02-20 22:16     ` [RFC PATCH v3 04/12] rebase: " Thomas Rast
2010-02-20 22:16     ` [RFC PATCH v3 05/12] rebase -i: " Thomas Rast
2010-02-20 22:16     ` [RFC PATCH v3 06/12] notes: implement 'git notes copy --stdin' Thomas Rast
2010-02-21  3:31       ` Junio C Hamano
2010-02-20 22:16     ` [RFC PATCH v3 07/12] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-02-21  3:34       ` Junio C Hamano
2010-02-20 22:16     ` [RFC PATCH v3 08/12] rebase: support automatic notes copying Thomas Rast
2010-02-20 22:16     ` [RFC PATCH v3 09/12] commit --amend: copy notes to the new commit Thomas Rast
2010-02-20 22:16     ` [RFC PATCH v3 10/12] filter-branch: invoke post-rewrite hook Thomas Rast
2010-02-20 22:16     ` [RFC PATCH v3 11/12] filter-branch: learn how to filter notes Thomas Rast
2010-02-20 22:16     ` [RFC PATCH v3 12/12] notes: add shorthand --ref to override GIT_NOTES_REF Thomas Rast
2010-02-21  3:47     ` [RFC PATCH v3 00/12] several notes refs, post-rewrite, notes rewriting Junio C Hamano
2010-02-21  6:14       ` Thomas Rast
2010-02-22  0:18         ` Junio C Hamano
2010-02-22  0:10     ` [PATCH v4 00/11] " Thomas Rast
2010-02-22  0:10       ` [PATCH v4 01/11] test-lib: unset GIT_NOTES_REF to stop it from influencing tests Thomas Rast
2010-02-22  0:10       ` [PATCH v4 02/11] Support showing notes from more than one notes tree Thomas Rast
2010-02-22 23:20         ` Junio C Hamano
2010-02-22 23:25           ` Thomas Rast
2010-02-23  0:21             ` Junio C Hamano
2010-02-22  0:10       ` [PATCH v4 03/11] Documentation: document post-rewrite hook Thomas Rast
2010-02-22  0:10       ` [PATCH v4 04/11] commit --amend: invoke " Thomas Rast
2010-02-22  0:10       ` [PATCH v4 05/11] rebase: " Thomas Rast
2010-02-22  0:10       ` [PATCH v4 06/11] rebase -i: " Thomas Rast
2010-02-22  0:10       ` [PATCH v4 07/11] notes: implement 'git notes copy --stdin' Thomas Rast
2010-02-22  0:10       ` [PATCH v4 08/11] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-02-22  0:10       ` [PATCH v4 09/11] rebase: support automatic notes copying Thomas Rast
2010-02-22  0:10       ` [PATCH v4 10/11] commit --amend: copy notes to the new commit Thomas Rast
2010-02-22  0:10       ` [PATCH v4 11/11] notes: add shorthand --ref to override GIT_NOTES_REF Thomas Rast
2010-02-22  0:25       ` [PATCH v4 00/11] several notes refs, post-rewrite, notes rewriting Junio C Hamano
2010-02-22  0:32         ` Thomas Rast
2010-02-23  0:42     ` [PATCH v5 " Thomas Rast
2010-02-23  0:42       ` [PATCH v5 01/11] test-lib: unset GIT_NOTES_REF to stop it from influencing tests Thomas Rast
2010-02-23  0:42       ` [PATCH v5 02/11] Support showing notes from more than one notes tree Thomas Rast
2010-02-23  1:47         ` Junio C Hamano
2010-02-23 17:10           ` Thomas Rast
2010-02-23 17:34             ` [PATCH] format-patch: learn to fill comment section of email from notes Thomas Rast
2010-02-23 17:34               ` [PATCH] BROKEN -- " Thomas Rast
2010-02-23 17:37                 ` Thomas Rast
2010-02-24  7:45                   ` Stephen Boyd
2010-02-23 21:56               ` [PATCH] " Junio C Hamano
2010-03-10 14:08               ` Thomas Rast
2010-02-23  0:42       ` [PATCH v5 03/11] Documentation: document post-rewrite hook Thomas Rast
2010-02-23  0:42       ` [PATCH v5 04/11] commit --amend: invoke " Thomas Rast
2010-02-23  0:42       ` [PATCH v5 05/11] rebase: " Thomas Rast
2010-02-23  0:42       ` [PATCH v5 06/11] rebase -i: " Thomas Rast
2010-02-24  6:15         ` Junio C Hamano
2010-02-23  0:42       ` [PATCH v5 07/11] notes: implement 'git notes copy --stdin' Thomas Rast
2010-02-23  0:42       ` [PATCH v5 08/11] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-02-23  0:42       ` [PATCH v5 09/11] rebase: support automatic notes copying Thomas Rast
2010-02-25  3:58         ` Junio C Hamano
2010-03-10 14:03           ` [PATCH v6 00/13] several notes refs, post-rewrite, notes rewriting Thomas Rast
2010-03-10 14:03             ` [PATCH v6 01/13] test-lib: unset GIT_NOTES_REF to stop it from influencing tests Thomas Rast
2010-03-11  8:55               ` Johan Herland
2010-03-10 14:03             ` [PATCH v6 02/13] Support showing notes from more than one notes tree Thomas Rast
2010-03-11 10:03               ` Johan Herland
2010-03-12 17:04                 ` [PATCH v7 00/13] tr/display-notes Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 01/13] test-lib: unset GIT_NOTES_REF to stop it from influencing tests Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 02/13] Support showing notes from more than one notes tree Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 03/13] Documentation: document post-rewrite hook Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 04/13] commit --amend: invoke " Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 05/13] rebase: " Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 06/13] rebase -i: " Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 07/13] notes: implement 'git notes copy --stdin' Thomas Rast
2010-06-14 23:40                     ` [PATCH] notes: Initialize variable to appease Sun Studio Ævar Arnfjörð Bjarmason
2010-06-19  4:52                       ` Junio C Hamano
2010-06-19 11:58                         ` Ævar Arnfjörð Bjarmason
2010-06-21 20:53                           ` Ramsay Jones
2010-03-12 17:04                   ` [PATCH v7 08/13] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 09/13] rebase: support automatic notes copying Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 10/13] commit --amend: copy notes to the new commit Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 11/13] notes: add shorthand --ref to override GIT_NOTES_REF Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 12/13] notes: track whether notes_trees were changed at all Thomas Rast
2010-03-12 17:04                   ` [PATCH v7 13/13] git-notes(1): add a section about the meaning of history Thomas Rast
2010-03-10 14:03             ` [PATCH v6 03/13] Documentation: document post-rewrite hook Thomas Rast
2010-03-10 14:05             ` [PATCH v6 04/13] commit --amend: invoke " Thomas Rast
2010-03-10 14:05             ` [PATCH v6 05/13] rebase: " Thomas Rast
2010-03-10 14:05             ` [PATCH v6 06/13] rebase -i: " Thomas Rast
2010-03-10 14:05             ` [PATCH v6 07/13] notes: implement 'git notes copy --stdin' Thomas Rast
2010-03-11 10:30               ` Johan Herland
2010-03-10 14:05             ` [PATCH v6 08/13] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-03-11 10:50               ` Johan Herland
2010-03-10 14:05             ` [PATCH v6 09/13] rebase: support automatic notes copying Thomas Rast
2010-03-10 14:05             ` [PATCH v6 10/13] commit --amend: copy notes to the new commit Thomas Rast
2010-03-10 14:05             ` [PATCH v6 11/13] notes: add shorthand --ref to override GIT_NOTES_REF Thomas Rast
2010-03-11 10:56               ` Johan Herland
2010-03-10 14:05             ` [PATCH v6 12/13] notes: track whether notes_trees were changed at all Thomas Rast
2010-03-11 10:58               ` Johan Herland
2010-03-10 14:06             ` [PATCH v6 13/13] git-notes(1): add a section about the meaning of history Thomas Rast
2010-03-11 10:59               ` Johan Herland
2010-03-10 21:23             ` [PATCH v6 00/13] several notes refs, post-rewrite, notes rewriting Junio C Hamano
2010-02-23  0:42       ` [PATCH v5 10/11] commit --amend: copy notes to the new commit Thomas Rast
2010-02-23  0:42       ` [PATCH v5 11/11] notes: add shorthand --ref to override GIT_NOTES_REF Thomas Rast
2010-02-23  0:49       ` [PATCH v5 00/11] several notes refs, post-rewrite, notes rewriting Junio C Hamano
2010-02-23  0:49       ` Thomas Rast

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8c3f1d66d306747d777f04621f1d43d7e07ddc6a.1266677264.git.trast@student.ethz.ch \
    --to=trast@student.ethz.ch \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=j6t@kdbg.org \
    --cc=johan@herland.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).