gpg-interface: lazily initialize and read the configuration
Instead of forcing the porcelain commands to always read the configuration variables related to the signing and verifying signatures, lazily initialize the necessary subsystem on demand upon the first use. This hopefully would make it more future-proof as we do not have to think and decide whether we should call git_gpg_config() in the git_config() callback for each command. A few git_config() callback functions that used to be custom callbacks are now just a thin wrapper around git_default_config(). We could further remove, git_FOO_config and replace calls to git_config(git_FOO_config) with git_config(git_default_config), but to make it clear which ones are affected and the effect is only the removal of git_gpg_config(), it is vastly preferred not to do such a change in this step (they can be done on top once the dust settled). Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
7876265d61
commit
fd2d4c135e
@ -2314,12 +2314,6 @@ static int parse_opt_show_current_patch(const struct option *opt, const char *ar
|
|||||||
|
|
||||||
static int git_am_config(const char *k, const char *v, void *cb UNUSED)
|
static int git_am_config(const char *k, const char *v, void *cb UNUSED)
|
||||||
{
|
{
|
||||||
int status;
|
|
||||||
|
|
||||||
status = git_gpg_config(k, v, NULL);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
return git_default_config(k, v, NULL);
|
return git_default_config(k, v, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,9 +39,6 @@ static void new_parent(struct commit *parent, struct commit_list **parents_p)
|
|||||||
|
|
||||||
static int commit_tree_config(const char *var, const char *value, void *cb)
|
static int commit_tree_config(const char *var, const char *value, void *cb)
|
||||||
{
|
{
|
||||||
int status = git_gpg_config(var, value, NULL);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
return git_default_config(var, value, cb);
|
return git_default_config(var, value, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1600,7 +1600,6 @@ int cmd_status(int argc, const char **argv, const char *prefix)
|
|||||||
static int git_commit_config(const char *k, const char *v, void *cb)
|
static int git_commit_config(const char *k, const char *v, void *cb)
|
||||||
{
|
{
|
||||||
struct wt_status *s = cb;
|
struct wt_status *s = cb;
|
||||||
int status;
|
|
||||||
|
|
||||||
if (!strcmp(k, "commit.template"))
|
if (!strcmp(k, "commit.template"))
|
||||||
return git_config_pathname(&template_file, k, v);
|
return git_config_pathname(&template_file, k, v);
|
||||||
@ -1620,9 +1619,6 @@ static int git_commit_config(const char *k, const char *v, void *cb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = git_gpg_config(k, v, NULL);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
return git_status_config(k, v, s);
|
return git_status_config(k, v, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -601,8 +601,6 @@ static int git_log_config(const char *var, const char *value, void *cb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (git_gpg_config(var, value, cb) < 0)
|
|
||||||
return -1;
|
|
||||||
return git_diff_ui_config(var, value, cb);
|
return git_diff_ui_config(var, value, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -659,9 +659,6 @@ static int git_merge_config(const char *k, const char *v, void *cb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
status = fmt_merge_msg_config(k, v, cb);
|
status = fmt_merge_msg_config(k, v, cb);
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
status = git_gpg_config(k, v, NULL);
|
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
return git_diff_ui_config(k, v, cb);
|
return git_diff_ui_config(k, v, cb);
|
||||||
|
@ -359,8 +359,6 @@ static enum rebase_type config_get_rebase(int *rebase_unspecified)
|
|||||||
*/
|
*/
|
||||||
static int git_pull_config(const char *var, const char *value, void *cb)
|
static int git_pull_config(const char *var, const char *value, void *cb)
|
||||||
{
|
{
|
||||||
int status;
|
|
||||||
|
|
||||||
if (!strcmp(var, "rebase.autostash")) {
|
if (!strcmp(var, "rebase.autostash")) {
|
||||||
config_autostash = git_config_bool(var, value);
|
config_autostash = git_config_bool(var, value);
|
||||||
return 0;
|
return 0;
|
||||||
@ -372,10 +370,6 @@ static int git_pull_config(const char *var, const char *value, void *cb)
|
|||||||
check_trust_level = 0;
|
check_trust_level = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = git_gpg_config(var, value, cb);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
return git_default_config(var, value, cb);
|
return git_default_config(var, value, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -502,11 +502,6 @@ static int git_push_config(const char *k, const char *v, void *cb)
|
|||||||
{
|
{
|
||||||
const char *slot_name;
|
const char *slot_name;
|
||||||
int *flags = cb;
|
int *flags = cb;
|
||||||
int status;
|
|
||||||
|
|
||||||
status = git_gpg_config(k, v, NULL);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
if (!strcmp(k, "push.followtags")) {
|
if (!strcmp(k, "push.followtags")) {
|
||||||
if (git_config_bool(k, v))
|
if (git_config_bool(k, v))
|
||||||
|
@ -133,10 +133,6 @@ static int receive_pack_config(const char *var, const char *value, void *cb)
|
|||||||
{
|
{
|
||||||
int status = parse_hide_refs_config(var, value, "receive", &hidden_refs);
|
int status = parse_hide_refs_config(var, value, "receive", &hidden_refs);
|
||||||
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
status = git_gpg_config(var, value, NULL);
|
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
@ -130,8 +130,6 @@ static void print_helper_status(struct ref *ref)
|
|||||||
|
|
||||||
static int send_pack_config(const char *k, const char *v, void *cb)
|
static int send_pack_config(const char *k, const char *v, void *cb)
|
||||||
{
|
{
|
||||||
git_gpg_config(k, v, NULL);
|
|
||||||
|
|
||||||
if (!strcmp(k, "push.gpgsign")) {
|
if (!strcmp(k, "push.gpgsign")) {
|
||||||
const char *value;
|
const char *value;
|
||||||
if (!git_config_get_value("push.gpgsign", &value)) {
|
if (!git_config_get_value("push.gpgsign", &value)) {
|
||||||
|
@ -180,8 +180,6 @@ static const char tag_template_nocleanup[] =
|
|||||||
|
|
||||||
static int git_tag_config(const char *var, const char *value, void *cb)
|
static int git_tag_config(const char *var, const char *value, void *cb)
|
||||||
{
|
{
|
||||||
int status;
|
|
||||||
|
|
||||||
if (!strcmp(var, "tag.gpgsign")) {
|
if (!strcmp(var, "tag.gpgsign")) {
|
||||||
config_sign_tag = git_config_bool(var, value);
|
config_sign_tag = git_config_bool(var, value);
|
||||||
return 0;
|
return 0;
|
||||||
@ -194,9 +192,6 @@ static int git_tag_config(const char *var, const char *value, void *cb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = git_gpg_config(var, value, cb);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
if (!strcmp(var, "tag.forcesignannotated")) {
|
if (!strcmp(var, "tag.forcesignannotated")) {
|
||||||
force_sign_annotate = git_config_bool(var, value);
|
force_sign_annotate = git_config_bool(var, value);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -54,9 +54,6 @@ static int verify_commit(const char *name, unsigned flags)
|
|||||||
|
|
||||||
static int git_verify_commit_config(const char *var, const char *value, void *cb)
|
static int git_verify_commit_config(const char *var, const char *value, void *cb)
|
||||||
{
|
{
|
||||||
int status = git_gpg_config(var, value, cb);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
return git_default_config(var, value, cb);
|
return git_default_config(var, value, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,9 +21,6 @@ static const char * const verify_tag_usage[] = {
|
|||||||
|
|
||||||
static int git_verify_tag_config(const char *var, const char *value, void *cb)
|
static int git_verify_tag_config(const char *var, const char *value, void *cb)
|
||||||
{
|
{
|
||||||
int status = git_gpg_config(var, value, cb);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
return git_default_config(var, value, cb);
|
return git_default_config(var, value, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,8 +17,6 @@ static struct string_list suppress_dest_patterns = STRING_LIST_INIT_DUP;
|
|||||||
|
|
||||||
int fmt_merge_msg_config(const char *key, const char *value, void *cb)
|
int fmt_merge_msg_config(const char *key, const char *value, void *cb)
|
||||||
{
|
{
|
||||||
int status = 0;
|
|
||||||
|
|
||||||
if (!strcmp(key, "merge.log") || !strcmp(key, "merge.summary")) {
|
if (!strcmp(key, "merge.log") || !strcmp(key, "merge.summary")) {
|
||||||
int is_bool;
|
int is_bool;
|
||||||
merge_log_config = git_config_bool_or_int(key, value, &is_bool);
|
merge_log_config = git_config_bool_or_int(key, value, &is_bool);
|
||||||
@ -37,9 +35,6 @@ int fmt_merge_msg_config(const char *key, const char *value, void *cb)
|
|||||||
string_list_append(&suppress_dest_patterns, value);
|
string_list_append(&suppress_dest_patterns, value);
|
||||||
suppress_dest_pattern_seen = 1;
|
suppress_dest_pattern_seen = 1;
|
||||||
} else {
|
} else {
|
||||||
status = git_gpg_config(key, value, NULL);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
return git_default_config(key, value, cb);
|
return git_default_config(key, value, cb);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -9,6 +9,18 @@
|
|||||||
#include "tempfile.h"
|
#include "tempfile.h"
|
||||||
#include "alias.h"
|
#include "alias.h"
|
||||||
|
|
||||||
|
static int git_gpg_config(const char *, const char *, void *);
|
||||||
|
|
||||||
|
static void gpg_interface_lazy_init(void)
|
||||||
|
{
|
||||||
|
static int done;
|
||||||
|
|
||||||
|
if (done)
|
||||||
|
return;
|
||||||
|
done = 1;
|
||||||
|
git_config(git_gpg_config, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static char *configured_signing_key;
|
static char *configured_signing_key;
|
||||||
static const char *ssh_default_key_command, *ssh_allowed_signers, *ssh_revocation_file;
|
static const char *ssh_default_key_command, *ssh_allowed_signers, *ssh_revocation_file;
|
||||||
static enum signature_trust_level configured_min_trust_level = TRUST_UNDEFINED;
|
static enum signature_trust_level configured_min_trust_level = TRUST_UNDEFINED;
|
||||||
@ -632,6 +644,8 @@ int check_signature(struct signature_check *sigc,
|
|||||||
struct gpg_format *fmt;
|
struct gpg_format *fmt;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
gpg_interface_lazy_init();
|
||||||
|
|
||||||
sigc->result = 'N';
|
sigc->result = 'N';
|
||||||
sigc->trust_level = -1;
|
sigc->trust_level = -1;
|
||||||
|
|
||||||
@ -695,11 +709,13 @@ int parse_signature(const char *buf, size_t size, struct strbuf *payload, struct
|
|||||||
|
|
||||||
void set_signing_key(const char *key)
|
void set_signing_key(const char *key)
|
||||||
{
|
{
|
||||||
|
gpg_interface_lazy_init();
|
||||||
|
|
||||||
free(configured_signing_key);
|
free(configured_signing_key);
|
||||||
configured_signing_key = xstrdup(key);
|
configured_signing_key = xstrdup(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_gpg_config(const char *var, const char *value, void *cb UNUSED)
|
static int git_gpg_config(const char *var, const char *value, void *cb UNUSED)
|
||||||
{
|
{
|
||||||
struct gpg_format *fmt = NULL;
|
struct gpg_format *fmt = NULL;
|
||||||
char *fmtname = NULL;
|
char *fmtname = NULL;
|
||||||
@ -888,6 +904,8 @@ static const char *get_ssh_key_id(void) {
|
|||||||
/* Returns a textual but unique representation of the signing key */
|
/* Returns a textual but unique representation of the signing key */
|
||||||
const char *get_signing_key_id(void)
|
const char *get_signing_key_id(void)
|
||||||
{
|
{
|
||||||
|
gpg_interface_lazy_init();
|
||||||
|
|
||||||
if (use_format->get_key_id) {
|
if (use_format->get_key_id) {
|
||||||
return use_format->get_key_id();
|
return use_format->get_key_id();
|
||||||
}
|
}
|
||||||
@ -898,6 +916,8 @@ const char *get_signing_key_id(void)
|
|||||||
|
|
||||||
const char *get_signing_key(void)
|
const char *get_signing_key(void)
|
||||||
{
|
{
|
||||||
|
gpg_interface_lazy_init();
|
||||||
|
|
||||||
if (configured_signing_key)
|
if (configured_signing_key)
|
||||||
return configured_signing_key;
|
return configured_signing_key;
|
||||||
if (use_format->get_default_key) {
|
if (use_format->get_default_key) {
|
||||||
@ -923,6 +943,8 @@ const char *gpg_trust_level_to_str(enum signature_trust_level level)
|
|||||||
|
|
||||||
int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)
|
int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)
|
||||||
{
|
{
|
||||||
|
gpg_interface_lazy_init();
|
||||||
|
|
||||||
return use_format->sign_buffer(buffer, signature, signing_key);
|
return use_format->sign_buffer(buffer, signature, signing_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,6 @@ int sign_buffer(struct strbuf *buffer, struct strbuf *signature,
|
|||||||
*/
|
*/
|
||||||
const char *gpg_trust_level_to_str(enum signature_trust_level level);
|
const char *gpg_trust_level_to_str(enum signature_trust_level level);
|
||||||
|
|
||||||
int git_gpg_config(const char *, const char *, void *);
|
|
||||||
void set_signing_key(const char *);
|
void set_signing_key(const char *);
|
||||||
const char *get_signing_key(void);
|
const char *get_signing_key(void);
|
||||||
|
|
||||||
|
@ -263,10 +263,6 @@ static int git_sequencer_config(const char *k, const char *v, void *cb)
|
|||||||
if (opts->action == REPLAY_REVERT && !strcmp(k, "revert.reference"))
|
if (opts->action == REPLAY_REVERT && !strcmp(k, "revert.reference"))
|
||||||
opts->commit_use_reference = git_config_bool(k, v);
|
opts->commit_use_reference = git_config_bool(k, v);
|
||||||
|
|
||||||
status = git_gpg_config(k, v, NULL);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
return git_diff_basic_config(k, v, NULL);
|
return git_diff_basic_config(k, v, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,4 +200,14 @@ test_expect_success GPGSSH 'verifying a forged tag with --format should fail sil
|
|||||||
test_must_be_empty actual-forged
|
test_must_be_empty actual-forged
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success GPGSSH 'rev-list --format=%G' '
|
||||||
|
test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" &&
|
||||||
|
git rev-list -1 --format="%G? %H" sixth-signed >actual &&
|
||||||
|
cat >expect <<-EOF &&
|
||||||
|
commit $(git rev-parse sixth-signed^0)
|
||||||
|
G $(git rev-parse sixth-signed^0)
|
||||||
|
EOF
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user