Eric Sunshine <sunshine@xxxxxxxxxxxxxx> writes: > Taking a step back, perhaps think of this in terms of "separator". The > default behavior is to insert "\n" as a separator between notes. If > you add a --separator option, then users could supply their own > separator, such as "----\n" or, in your case, "" to suppress the blank > line. There is another question for me, if the separator we passed contains "\n" string , the argument the cmd receives will need to tranfer to '\n' character instead to make sure it's a linebreak but not a "\n" instead. So maybe like: diff --git a/builtin/notes.c b/builtin/notes.c index f38e6e8b04..64ee64eff7 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -559,15 +559,52 @@ static int copy(int argc, const char **argv, const char *prefix) return retval; } +static void insert_separator(struct strbuf *message, const char *separator) +{ + struct strbuf transfered = STRBUF_INIT; + + if (!separator) + strbuf_insertstr(message, 0, "\n"); + else if (!strcmp("", separator)) + return; + else { + while (*separator) { + if (*separator == '\\'){ + switch (separator[1]) { + case 'n': + strbuf_addstr(&transfered, "\n"); + separator++; + break; + case 'r': + strbuf_addstr(&transfered, "\r"); + separator++; + break; + case 't': + strbuf_addstr(&transfered, "\t"); + separator++; + break; + default: + strbuf_addch(&transfered, *separator); + } + } else { + strbuf_addch(&transfered, *separator); + } + separator++; + } + strbuf_insertstr(message, 0, transfered.buf); + strbuf_release(&transfered); + } +} + static int append_edit(int argc, const char **argv, const char *prefix) { int allow_empty = 0; - int blankline = 1; const char *object_ref; struct notes_tree *t; struct object_id object, new_note; const struct object_id *note; char *logmsg = NULL; + const char *separator = NULL; const char * const *usage; struct note_data d = { .buf = STRBUF_INIT }; struct option options[] = { @@ -585,8 +622,8 @@ static int append_edit(int argc, const char **argv, const char *prefix) parse_reuse_arg), OPT_BOOL(0, "allow-empty", &allow_empty, N_("allow storing empty note")), - OPT_BOOL(0, "blank-line", &blankline, - N_("insert paragraph break before appending to an existing note")), + OPT_STRING(0, "separator", &separator, N_("text"), + N_("insert <text> as separator before appending to an existing note")), OPT_END() }; int edit = !strcmp(argv[0], "edit"); @@ -621,8 +658,8 @@ static int append_edit(int argc, const char **argv, const char *prefix) enum object_type type; char *prev_buf = read_object_file(note, &type, &size); - if (blankline && d.buf.len && prev_buf && size) - strbuf_insertstr(&d.buf, 0, "\n"); + if (d.buf.len && prev_buf && size) + insert_separator(&d.buf, separator); if (prev_buf && size) strbuf_insert(&d.buf, 0, prev_buf, size); free(prev_buf); -- If the above is understood correctly, is there an api that handles escape characters already in the existing code (I haven't found one so far, so I need to confirm and replace it if there is one). In addition, the insert_separator function above handles three special characters \t\n\r. Do we need more? Thanks