Christian Couder <chriscool@xxxxxxxxxxxxx> writes: > It could be misleading to keep a signature in a > replacement commit, so let's remove it. > > Note that there should probably be a way to sign > the replacement commit created when using --graft, > but this can be dealt with in another commit or > patch series. Both paragraphs read very sensibly. > > Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> > --- > builtin/replace.c | 5 +++++ > commit.c | 34 ++++++++++++++++++++++++++++++++++ > commit.h | 2 ++ > 3 files changed, 41 insertions(+) > > diff --git a/builtin/replace.c b/builtin/replace.c > index ad47237..000db65 100644 > --- a/builtin/replace.c > +++ b/builtin/replace.c > @@ -344,6 +344,11 @@ static int create_graft(int argc, const char **argv, int force) > > replace_parents(&buf, argc, argv); > > + if (remove_signature(&buf)) > + warning(_("the original commit '%s' has a gpg signature.\n" > + "It will be removed in the replacement commit!"), Hmmm... does the second line of this message start with the usual "warning:" prefix? > diff --git a/commit.c b/commit.c > index fb7897c..54e157d 100644 > --- a/commit.c > +++ b/commit.c > @@ -1177,6 +1177,40 @@ int parse_signed_commit(const struct commit *commit, > return saw_signature; > } > > +int remove_signature(struct strbuf *buf) > +{ > + const char *line = buf->buf; > + const char *tail = buf->buf + buf->len; > + int in_signature = 0; > + const char *sig_start = NULL; > + const char *sig_end = NULL; > + > + while (line < tail) { > + const char *next = memchr(line, '\n', tail - line); > + next = next ? next + 1 : tail; This almost makes me wonder if we want something similar to strchrnul() we use for NUL-terminated strings, and I suspect that you would find more instances by running "git grep -A2 memchr". I don't know what such a helper function should be named, though. Certainly not "memchrnul()". > + > + if (in_signature && line[0] == ' ') > + sig_end = next; > + else if (starts_with(line, gpg_sig_header) && > + line[gpg_sig_header_len] == ' ') { > + sig_start = line; > + sig_end = next; > + in_signature = 1; > + } else { > + if (*line == '\n') > + /* dump the whole remainder of the buffer */ > + next = tail; > + in_signature = 0; > + } > + line = next; > + } > + > + if (sig_start) > + strbuf_remove(buf, sig_start - buf->buf, sig_end - sig_start); If there are two instances of gpg_sig, this will remove only the last one, but there is no chance both signatures of such a commit can validate OK, and we won't be losing something in between anyway, so it should be fine. > + return sig_start != NULL; > +} > + > static void handle_signed_tag(struct commit *parent, struct commit_extra_header ***tail) > { > struct merge_remote_desc *desc; > diff --git a/commit.h b/commit.h > index 2e1492a..4234dae 100644 > --- a/commit.h > +++ b/commit.h > @@ -327,6 +327,8 @@ struct commit *get_merge_parent(const char *name); > > extern int parse_signed_commit(const struct commit *commit, > struct strbuf *message, struct strbuf *signature); > +extern int remove_signature(struct strbuf *buf); > + > extern void print_commit_list(struct commit_list *list, > const char *format_cur, > const char *format_last); -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html