Skip to content

Commit

Permalink
replace: remove signature when using --graft
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Christian Couder authored and Junio C Hamano committed Jul 21, 2014
1 parent b0ab2b7 commit 0b05ab6
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
5 changes: 5 additions & 0 deletions builtin/replace.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,11 @@ static int create_graft(int argc, const char **argv, int force)

replace_parents(&buf, argc - 1, &argv[1]);

if (remove_signature(&buf)) {
warning(_("the original commit '%s' has a gpg signature."), old_ref);
warning(_("the signature will be removed in the replacement commit!"));
}

if (write_sha1_file(buf.buf, buf.len, commit_type, new))
die(_("could not write replacement commit for: '%s'"), old_ref);

Expand Down
34 changes: 34 additions & 0 deletions commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -1178,6 +1178,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;

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);

return sig_start != NULL;
}

static void handle_signed_tag(struct commit *parent, struct commit_extra_header ***tail)
{
struct merge_remote_desc *desc;
Expand Down
2 changes: 2 additions & 0 deletions commit.h
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,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);
Expand Down

0 comments on commit 0b05ab6

Please sign in to comment.