ba3c69a9ee
This uses the gpg-interface.[ch] to allow signing the commit, i.e. $ git commit --gpg-sign -m foo You need a passphrase to unlock the secret key for user: "Junio C Hamano <gitster@pobox.com>" 4096-bit RSA key, ID 96AFE6CB, created 2011-10-03 (main key ID 713660A7) [master 8457d13] foo 1 files changed, 1 insertions(+), 0 deletions(-) The lines of GPG detached signature are placed in a new multi-line header field, instead of tucking the signature block at the end of the commit log message text (similar to how signed tag is done), for multiple reasons: - The signature won't clutter output from "git log" and friends if it is in the extra header. If we place it at the end of the log message, we would need to teach "git log" and friends to strip the signature block with an option. - Teaching new versions of "git log" and "gitk" to optionally verify and show signatures is cleaner if we structurally know where the signature block is (instead of scanning in the commit log message). - The signature needs to be stripped upon various commit rewriting operations, e.g. rebase, filter-branch, etc. They all already ignore unknown headers, but if we place signature in the log message, all of these tools (and third-party tools) also need to learn how a signature block would look like. - When we added the optional encoding header, all the tools (both in tree and third-party) that acts on the raw commit object should have been fixed to ignore headers they do not understand, so it is not like that new header would be more likely to break than extra text in the commit. A commit made with the above sample sequence would look like this: $ git cat-file commit HEAD tree 3cd71d90e3db4136e5260ab54599791c4f883b9d parent b87755351a47b09cb27d6913e6e0e17e6254a4d4 author Junio C Hamano <gitster@pobox.com> 1317862251 -0700 committer Junio C Hamano <gitster@pobox.com> 1317862251 -0700 gpgsig -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQIcBAABAgAGBQJOjPtrAAoJELC16IaWr+bL4TMP/RSe2Y/jYnCkds9unO5JEnfG ... =dt98 -----END PGP SIGNATURE----- foo but "git log" (unless you ask for it with --pretty=raw) output is not cluttered with the signature information. Signed-off-by: Junio C Hamano <gitster@pobox.com>
94 lines
2.1 KiB
C
94 lines
2.1 KiB
C
#include "cache.h"
|
|
#include "notes-cache.h"
|
|
#include "commit.h"
|
|
#include "refs.h"
|
|
|
|
static int notes_cache_match_validity(const char *ref, const char *validity)
|
|
{
|
|
unsigned char sha1[20];
|
|
struct commit *commit;
|
|
struct pretty_print_context pretty_ctx;
|
|
struct strbuf msg = STRBUF_INIT;
|
|
int ret;
|
|
|
|
if (read_ref(ref, sha1) < 0)
|
|
return 0;
|
|
|
|
commit = lookup_commit_reference_gently(sha1, 1);
|
|
if (!commit)
|
|
return 0;
|
|
|
|
memset(&pretty_ctx, 0, sizeof(pretty_ctx));
|
|
format_commit_message(commit, "%s", &msg, &pretty_ctx);
|
|
strbuf_trim(&msg);
|
|
|
|
ret = !strcmp(msg.buf, validity);
|
|
strbuf_release(&msg);
|
|
|
|
return ret;
|
|
}
|
|
|
|
void notes_cache_init(struct notes_cache *c, const char *name,
|
|
const char *validity)
|
|
{
|
|
struct strbuf ref = STRBUF_INIT;
|
|
int flags = 0;
|
|
|
|
memset(c, 0, sizeof(*c));
|
|
c->validity = xstrdup(validity);
|
|
|
|
strbuf_addf(&ref, "refs/notes/%s", name);
|
|
if (!notes_cache_match_validity(ref.buf, validity))
|
|
flags = NOTES_INIT_EMPTY;
|
|
init_notes(&c->tree, ref.buf, combine_notes_overwrite, flags);
|
|
strbuf_release(&ref);
|
|
}
|
|
|
|
int notes_cache_write(struct notes_cache *c)
|
|
{
|
|
unsigned char tree_sha1[20];
|
|
unsigned char commit_sha1[20];
|
|
|
|
if (!c || !c->tree.initialized || !c->tree.ref || !*c->tree.ref)
|
|
return -1;
|
|
if (!c->tree.dirty)
|
|
return 0;
|
|
|
|
if (write_notes_tree(&c->tree, tree_sha1))
|
|
return -1;
|
|
if (commit_tree(c->validity, tree_sha1, NULL, commit_sha1, NULL, NULL) < 0)
|
|
return -1;
|
|
if (update_ref("update notes cache", c->tree.ref, commit_sha1, NULL,
|
|
0, QUIET_ON_ERR) < 0)
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
char *notes_cache_get(struct notes_cache *c, unsigned char key_sha1[20],
|
|
size_t *outsize)
|
|
{
|
|
const unsigned char *value_sha1;
|
|
enum object_type type;
|
|
char *value;
|
|
unsigned long size;
|
|
|
|
value_sha1 = get_note(&c->tree, key_sha1);
|
|
if (!value_sha1)
|
|
return NULL;
|
|
value = read_sha1_file(value_sha1, &type, &size);
|
|
|
|
*outsize = size;
|
|
return value;
|
|
}
|
|
|
|
int notes_cache_put(struct notes_cache *c, unsigned char key_sha1[20],
|
|
const char *data, size_t size)
|
|
{
|
|
unsigned char value_sha1[20];
|
|
|
|
if (write_sha1_file(data, size, "blob", value_sha1) < 0)
|
|
return -1;
|
|
return add_note(&c->tree, key_sha1, value_sha1, NULL);
|
|
}
|