Git fork
at reftables-rust 84 lines 2.2 kB view raw
1/* 2 * Builtin "git commit-commit" 3 * 4 * Copyright (c) 2014 Michael J Gruber <git@drmicha.warpmail.net> 5 * 6 * Based on git-verify-tag 7 */ 8#include "builtin.h" 9#include "config.h" 10#include "environment.h" 11#include "gettext.h" 12#include "object-name.h" 13#include "commit.h" 14#include "parse-options.h" 15#include "gpg-interface.h" 16 17static const char * const verify_commit_usage[] = { 18 N_("git verify-commit [-v | --verbose] [--raw] <commit>..."), 19 NULL 20}; 21 22static int run_gpg_verify(struct commit *commit, unsigned flags) 23{ 24 struct signature_check signature_check; 25 int ret; 26 27 memset(&signature_check, 0, sizeof(signature_check)); 28 29 ret = check_commit_signature(commit, &signature_check); 30 print_signature_buffer(&signature_check, flags); 31 32 signature_check_clear(&signature_check); 33 return ret; 34} 35 36static int verify_commit(struct repository *repo, const char *name, unsigned flags) 37{ 38 struct object_id oid; 39 struct object *obj; 40 41 if (repo_get_oid(repo, name, &oid)) 42 return error("commit '%s' not found.", name); 43 44 obj = parse_object(repo, &oid); 45 if (!obj) 46 return error("%s: unable to read file.", name); 47 if (obj->type != OBJ_COMMIT) 48 return error("%s: cannot verify a non-commit object of type %s.", 49 name, type_name(obj->type)); 50 51 return run_gpg_verify((struct commit *)obj, flags); 52} 53 54int cmd_verify_commit(int argc, 55 const char **argv, 56 const char *prefix, 57 struct repository *repo) 58{ 59 int i = 1, verbose = 0, had_error = 0; 60 unsigned flags = 0; 61 const struct option verify_commit_options[] = { 62 OPT__VERBOSE(&verbose, N_("print commit contents")), 63 OPT_BIT(0, "raw", &flags, N_("print raw gpg status output"), GPG_VERIFY_RAW), 64 OPT_END() 65 }; 66 67 repo_config(repo, git_default_config, NULL); 68 69 argc = parse_options(argc, argv, prefix, verify_commit_options, 70 verify_commit_usage, PARSE_OPT_KEEP_ARGV0); 71 if (argc <= i) 72 usage_with_options(verify_commit_usage, verify_commit_options); 73 74 if (verbose) 75 flags |= GPG_VERIFY_VERBOSE; 76 77 /* sometimes the program was terminated because this signal 78 * was received in the process of writing the gpg input: */ 79 signal(SIGPIPE, SIG_IGN); 80 while (i < argc) 81 if (verify_commit(repo, argv[i++], flags)) 82 had_error = 1; 83 return had_error; 84}