зеркало из https://github.com/microsoft/git.git
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:
Родитель
b0ab2b71d0
Коммит
0b05ab6f1b
|
@ -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);
|
||||
|
||||
|
|
34
commit.c
34
commit.c
|
@ -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;
|
||||
|
|
2
commit.h
2
commit.h
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче