#include "string-list.h"
 #include "notes-merge.h"
 
+static void commit_notes(struct notes_tree *t, const char *msg);
+static combine_notes_fn parse_combine_notes_fn(const char *v);
+
 static const char * const git_notes_usage[] = {
        N_("git notes [--ref <notes_ref>] [list [<object>]]"),
        N_("git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]"),
 };
 
 static const char note_template[] =
-       "\n"
-       "#\n"
-       "# Write/edit the notes for the following object:\n"
-       "#\n";
+       "\nWrite/edit the notes for the following object:\n";
 
 struct msg_arg {
        int given;
                {"show", "--stat", "--no-notes", sha1_to_hex(object), NULL};
        struct child_process show;
        struct strbuf buf = STRBUF_INIT;
-       FILE *show_out;
+       struct strbuf cbuf = STRBUF_INIT;
 
        /* Invoke "git show --stat --no-notes $object" */
        memset(&show, 0, sizeof(show));
                die(_("unable to start 'show' for object '%s'"),
                    sha1_to_hex(object));
 
-       /* Open the output as FILE* so strbuf_getline() can be used. */
-       show_out = xfdopen(show.out, "r");
-       if (show_out == NULL)
-               die_errno(_("can't fdopen 'show' output fd"));
+       if (strbuf_read(&buf, show.out, 0) < 0)
+               die_errno(_("could not read 'show' output"));
+       strbuf_add_commented_lines(&cbuf, buf.buf, buf.len);
+       write_or_die(fd, cbuf.buf, cbuf.len);
 
-       /* Prepend "# " to each output line and write result to 'fd' */
-       while (strbuf_getline(&buf, show_out, '\n') != EOF) {
-               write_or_die(fd, "# ", 2);
-               write_or_die(fd, buf.buf, buf.len);
-               write_or_die(fd, "\n", 1);
-       }
+       strbuf_release(&cbuf);
        strbuf_release(&buf);
-       if (fclose(show_out))
-               die_errno(_("failed to close pipe to 'show' for object '%s'"),
-                         sha1_to_hex(object));
+
        if (finish_command(&show))
                die(_("failed to finish 'show' for object '%s'"),
                    sha1_to_hex(object));
 
        if (msg->use_editor || !msg->given) {
                int fd;
+               struct strbuf buf = STRBUF_INIT;
 
                /* write the template message before editing: */
                path = git_pathdup("NOTES_EDITMSG");
                        write_or_die(fd, msg->buf.buf, msg->buf.len);
                else if (prev && !append_only)
                        write_note_data(fd, prev);
-               write_or_die(fd, note_template, strlen(note_template));
+
+               strbuf_addch(&buf, '\n');
+               strbuf_add_commented_lines(&buf, note_template, strlen(note_template));
+               strbuf_addch(&buf, '\n');
+               write_or_die(fd, buf.buf, buf.len);
 
                write_commented_object(fd, object);
 
                close(fd);
+               strbuf_release(&buf);
                strbuf_reset(&(msg->buf));
 
                if (launch_editor(path, &(msg->buf), NULL)) {
        return parse_reuse_arg(opt, arg, unset);
 }
 
-void commit_notes(struct notes_tree *t, const char *msg)
+static void commit_notes(struct notes_tree *t, const char *msg)
 {
        struct strbuf buf = STRBUF_INIT;
        unsigned char commit_sha1[20];
        strbuf_release(&buf);
 }
 
-combine_notes_fn parse_combine_notes_fn(const char *v)
+static combine_notes_fn parse_combine_notes_fn(const char *v)
 {
        if (!strcasecmp(v, "overwrite"))
                return combine_notes_overwrite;