From: Maarten Bosmans <mkbosmans@xxxxxxxxx> From: Maarten Bosmans <maarten.bosmans@xxxxxxxxxx> Avoid the need to launch a subprocess by calling stream_blob_to_fd directly. This does not only get rid of the overhead of a separate child process, but also avoids the initalization of the whole log machinery that `git show` does. That is needed for example to show decorated commits and applying the mailmap. For simply displaying a blob however, the only useful thing show does is enabling the pager. This locks in the expectation that a note oid refers to a blob, and not a tree or something else. To still keep the option open that the blob might not be a text blob and in the future we might handle such notes differently, the show_blob_object() function is called in order to have the same behaviour as though `git show <note-oid>` was called. Signed-off-by: Maarten Bosmans <maarten.bosmans@xxxxxxxxxx> --- builtin/notes.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/builtin/notes.c b/builtin/notes.c index caf20fd5bd..2a31da6c97 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -20,7 +20,8 @@ #include "repository.h" #include "pretty.h" #include "refs.h" -#include "exec-cmd.h" +#include "pager.h" +#include "log.h" #include "run-command.h" #include "parse-options.h" #include "string-list.h" @@ -753,7 +754,7 @@ static int show(int argc, const char **argv, const char *prefix) struct notes_tree *t; struct object_id object; const struct object_id *note; - int retval; + int retval = 0; struct option options[] = { OPT_END() }; @@ -778,8 +779,9 @@ static int show(int argc, const char **argv, const char *prefix) retval = error(_("no note found for object %s."), oid_to_hex(&object)); else { - const char *show_args[3] = {"show", oid_to_hex(note), NULL}; - retval = execv_git_cmd(show_args); + setup_pager(); + if (show_blob_object(note, NULL, false)) + die(_("object %s is not a blob"), oid_to_hex(note)); } free_notes(t); return retval; -- 2.35.3