]> git.ipfire.org Git - thirdparty/git.git/commitdiff
commit: allow parsing arbitrary buffers with headers
authorbrian m. carlson <sandals@crustytoothpaste.net>
Thu, 11 Feb 2021 02:08:04 +0000 (02:08 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 11 Feb 2021 07:35:42 +0000 (23:35 -0800)
Currently only commits are signed with headers.  However, in the future,
we'll also sign tags with headers as well.  Let's refactor out a
function called parse_buffer_signed_by_header which does exactly that.
In addition, since we'll want to sign things other than commits this
way, let's call the function sign_with_header instead of do_sign_commit.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
commit.c
commit.h

index d9ccbae51963f88edab5cb933341b62239893877..d42ab9702fc001f4b2e75e5c1d29667dd442772a 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -995,7 +995,7 @@ static const char *gpg_sig_headers[] = {
        "gpgsig-sha256",
 };
 
-static int do_sign_commit(struct strbuf *buf, const char *keyid)
+int sign_with_header(struct strbuf *buf, const char *keyid)
 {
        struct strbuf sig = STRBUF_INIT;
        int inspos, copypos;
@@ -1035,13 +1035,26 @@ static int do_sign_commit(struct strbuf *buf, const char *keyid)
        return 0;
 }
 
+
+
 int parse_signed_commit(const struct commit *commit,
                        struct strbuf *payload, struct strbuf *signature,
                        const struct git_hash_algo *algop)
 {
-
        unsigned long size;
        const char *buffer = get_commit_buffer(commit, &size);
+       int ret = parse_buffer_signed_by_header(buffer, size, payload, signature, algop);
+
+       unuse_commit_buffer(commit, buffer);
+       return ret;
+}
+
+int parse_buffer_signed_by_header(const char *buffer,
+                                 unsigned long size,
+                                 struct strbuf *payload,
+                                 struct strbuf *signature,
+                                 const struct git_hash_algo *algop)
+{
        int in_signature = 0, saw_signature = 0, other_signature = 0;
        const char *line, *tail, *p;
        const char *gpg_sig_header = gpg_sig_headers[hash_algo_by_ptr(algop)];
@@ -1078,7 +1091,6 @@ int parse_signed_commit(const struct commit *commit,
                }
                line = next;
        }
-       unuse_commit_buffer(commit, buffer);
        return saw_signature;
 }
 
@@ -1532,7 +1544,7 @@ int commit_tree_extended(const char *msg, size_t msg_len,
        if (encoding_is_utf8 && !verify_utf8(&buffer))
                fprintf(stderr, _(commit_utf8_warn));
 
-       if (sign_commit && do_sign_commit(&buffer, sign_commit)) {
+       if (sign_commit && sign_with_header(&buffer, sign_commit)) {
                result = -1;
                goto out;
        }
index 030aa65ab8731d6760fbe8308152f7017f1c2e5a..e2856ce8efb53d5f2cbdd23bea912ca0b78ff8be 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -360,4 +360,13 @@ int compare_commits_by_gen_then_commit_date(const void *a_, const void *b_, void
 LAST_ARG_MUST_BE_NULL
 int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...);
 
+/* Sign a commit or tag buffer, storing the result in a header. */
+int sign_with_header(struct strbuf *buf, const char *keyid);
+/* Parse the signature out of a header. */
+int parse_buffer_signed_by_header(const char *buffer,
+                                 unsigned long size,
+                                 struct strbuf *payload,
+                                 struct strbuf *signature,
+                                 const struct git_hash_algo *algop);
+
 #endif /* COMMIT_H */