replace: remove signature when using --graft

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>
This commit is contained in:
Christian Couder 2014-07-19 17:01:12 +02:00 коммит произвёл Junio C Hamano
Родитель b0ab2b71d0
Коммит 0b05ab6f1b
3 изменённых файлов: 41 добавлений и 0 удалений

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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