From patchwork Fri Apr 21 19:13:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220605 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D4B9BC77B76 for ; Fri, 21 Apr 2023 19:13:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233431AbjDUTN0 (ORCPT ); Fri, 21 Apr 2023 15:13:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37944 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231639AbjDUTNX (ORCPT ); Fri, 21 Apr 2023 15:13:23 -0400 Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9B8DE10DA for ; Fri, 21 Apr 2023 12:13:22 -0700 (PDT) Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-3f1728c2a57so21817835e9.0 for ; Fri, 21 Apr 2023 12:13:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104401; x=1684696401; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=sZjpw2+PooEFjE8q5ZJgDTuQ/OQCgx3h9r6kEL09ybI=; b=B0o4y7iJnkPsjcCdt0BFpQd9XpFftJ8MDtwewe3l0c+nwGo6H2Dw9SSz2LrmJOsF1/ 5iljxRqjjW5t5L9TbG5RWnVmNhRvhoLI0VqVcq4NwYI3RKutBgGHC796+FSJuGj8pXrt YJYUCalQwKnBNoONmsal/wEft6CInU93x/NvavMbQADbgTaTJuvuOrrkHtCDzp2X3+vU 9vDfwEJ+QMpkNm8+IHkRIPWlKtfhKa3UpAvSIu8b1cYXG3C8jlxV83dx7uxUv7j7FUen gXXSMeFBeLG/OKsHFUpvFOG3nx468ERCQXG6XMcmFmgpLs8OgAZq+CWEu5dfV1+wk7YE YCPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104401; x=1684696401; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sZjpw2+PooEFjE8q5ZJgDTuQ/OQCgx3h9r6kEL09ybI=; b=BvRPVYzPW3eCOeq93ubwZdQm4r1a6fDmQIhizCbSOreyg5/RTs9GzJR/Oeqmn/i1oZ hV+zjiC05FdlMwMcEM5p85lqnukIjXtqFFoYC9yV3m6RuMrEdWMFeM/8bKqd4Z49lC3s Zks0h5NJBF7UxzPAZGa0T7BDk/rDOV9RxANVXHe4QhmseT1iXd1JZFTnD4ARTKlvo5+T Na8XISaoNzLnjRn5SNfktSjrd6SEWw6RLZvQ15JvZ0t36kZXwWQx4N2nb4mnHexyBDOh 13MlGG4B1VGk6APynzkm14gPGTvy/DMDilAJpw1lNc9hD/JtXKCHVmdIKMa3icRpLkha Nrqw== X-Gm-Message-State: AAQBX9fwvtqMp+EH96UpZoA87iBiGNnV5Xq/Q7VdKXdwhcjmowXBzdiR 91cNkeYOweaz+zCXnUl2zZDPuoXhfx8= X-Google-Smtp-Source: AKy350YIYPEgBR/Q67eem3OQAOApXuoZAJ+YckaWRzWcHaN3ZxzcfPP0B1UTlp2CjXKYsOrDdpgFyw== X-Received: by 2002:a05:600c:b5a:b0:3f1:979f:a734 with SMTP id k26-20020a05600c0b5a00b003f1979fa734mr275156wmr.11.1682104400917; Fri, 21 Apr 2023 12:13:20 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id u15-20020a05600c210f00b003f17848673fsm5527988wml.27.2023.04.21.12.13.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:20 -0700 (PDT) Message-Id: <49bc2f6eedc923be631379c9b65956855ec25f35.1682104398.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:05 +0000 Subject: [PATCH 01/14] config.c: introduce kvi_fn(), use it for configsets Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo In order to pass "struct key_value_info" to config callbacks in a future commit, we want to make sure that a "struct key_value_info" is available in all code paths that invoke a config callback. Enforce this by introducing a helper function, "kvi_fn()", that sets "the_reader.config_kvi" before invoking the config callback, and trivially use it in "configset_iter()". This closely simulates passing an extra "struct key_value_info" such that making the switch will be trivial. This breaks our rule that no underlying machinery uses "the_reader", but "struct config_reader" will be gone by the end of the series so there's no point plumbing it as an arg. Signed-off-by: Glen Choo --- config.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/config.c b/config.c index 493f47df8ae..daad892e4fd 100644 --- a/config.c +++ b/config.c @@ -660,6 +660,17 @@ out_free_ret_1: return -CONFIG_INVALID_KEY; } +static int kvi_fn(config_fn_t fn, const char *key, const char *value, + struct key_value_info *kvi, + void *data) +{ + int ret; + config_reader_set_kvi(&the_reader, kvi); + ret = fn(key, value, data); + config_reader_set_kvi(&the_reader, NULL); + return ret; +} + static int config_parse_pair(const char *key, const char *value, config_fn_t fn, void *data) { @@ -2288,27 +2299,24 @@ int config_with_options(config_fn_t fn, void *data, return ret; } -static void configset_iter(struct config_reader *reader, struct config_set *set, - config_fn_t fn, void *data) +static void configset_iter(struct config_set *set, config_fn_t fn, void *data) { int i, value_index; struct string_list *values; struct config_set_element *entry; struct configset_list *list = &set->list; + struct key_value_info *kvi; for (i = 0; i < list->nr; i++) { entry = list->items[i].e; value_index = list->items[i].value_index; values = &entry->value_list; + kvi = values->items[value_index].util; - config_reader_set_kvi(reader, values->items[value_index].util); - - if (fn(entry->key, values->items[value_index].string, data) < 0) - git_die_config_linenr(entry->key, - reader->config_kvi->filename, - reader->config_kvi->linenr); - - config_reader_set_kvi(reader, NULL); + if (kvi_fn(fn, entry->key, values->items[value_index].string, + kvi, data) < 0) + git_die_config_linenr(entry->key, kvi->filename, + kvi->linenr); } } @@ -2696,7 +2704,7 @@ static void repo_config_clear(struct repository *repo) void repo_config(struct repository *repo, config_fn_t fn, void *data) { git_config_check_init(repo); - configset_iter(&the_reader, repo->config, fn, data); + configset_iter(repo->config, fn, data); } int repo_config_get(struct repository *repo, const char *key) @@ -2815,7 +2823,7 @@ void git_protected_config(config_fn_t fn, void *data) { if (!protected_config.hash_initialized) read_protected_config(); - configset_iter(&the_reader, &protected_config, fn, data); + configset_iter(&protected_config, fn, data); } /* Functions used historically to read configuration from 'the_repository' */ From patchwork Fri Apr 21 19:13:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220606 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 32FA4C77B78 for ; Fri, 21 Apr 2023 19:13:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229871AbjDUTN2 (ORCPT ); Fri, 21 Apr 2023 15:13:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37946 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233403AbjDUTNY (ORCPT ); Fri, 21 Apr 2023 15:13:24 -0400 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 420A810E9 for ; Fri, 21 Apr 2023 12:13:23 -0700 (PDT) Received: by mail-wr1-x42b.google.com with SMTP id ffacd0b85a97d-2f86ee42669so2020563f8f.2 for ; Fri, 21 Apr 2023 12:13:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104401; x=1684696401; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=zrB7DkhcGDIQa2I5QGxbVfIiBVj5aGBTnaOP9rGwy/4=; b=dRCgNBaiTkq1Qy0L29g92xzTSJfiKdVZU0TGqJZOAOUCeIw5mQ87rvzSBmpaZfsHmT 1LckU0H7M+OAaxX0j2JeVtaRGXBviPpW3PEQTyuTOG6ZPM5M8SdiKS1mE9JrxxoVq7w1 kmvo2cTqmg4+UHvElJ4CfxOufTilfkbc2evTHtCNNuINTASLqL1Cz7z3g97v0m/5eBZN /UOUZqGSEYht22EXbcJ6E+li1b5ccFTA4Lw+G5cO1SPEE3J/NTwT+bnAkK8Dir7yBAh6 eRP89lt50Eoq664ioZwaK4no6Fo1I+iOe/RjgDRtzkqaQZTtntD005GiZwfO2AUlBRFt RA7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104401; x=1684696401; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zrB7DkhcGDIQa2I5QGxbVfIiBVj5aGBTnaOP9rGwy/4=; b=Y4N6cia2A8LoKUSgsu4FfheX7tLjaNhU1HSpsas8fYZPBf5ddym37nDyfuTGRnLqhK u19+tJraobWP0XAzPw5qYgEFYYZ1X0W85NmC53rbFhqw4A0sWBGvZ1aCJ/p/UdwsKAQe NLurt5Z3dU9IlZturcs6uEeUWeEpZjhl09/9t3E+iFt0XqTzHLFy2hdYefbEUitY/iDM TOimvXtdS2E2O/YF/7EVDXZXTHANLGsvi01fawPsexOtZ/7NgPXnICEXO+prRDE+yqmB AHeg7YFCsSfMcfi90d8DIzuLHafJFQkN3d0wU7D/qk4VeNwP3iuVqY++m8/VRnH1l3ZI mpAg== X-Gm-Message-State: AAQBX9cLN2/EYk4nAArVNH9BMHlOsO/wOROGHI0cW72xeMZ2IqmmgtjO ZFHds6pjIdWpkydU1nXF5OSG7w65CEM= X-Google-Smtp-Source: AKy350YwvBuM3FR6Pfsfp9dpRe+Nw+OQ0VPW37gbqVakjtHsvvj4U/OE1CwDmJKyJYBGhqXlvy2FCA== X-Received: by 2002:a05:6000:cd:b0:2f4:e580:a72f with SMTP id q13-20020a05600000cd00b002f4e580a72fmr4953411wrx.45.1682104401632; Fri, 21 Apr 2023 12:13:21 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id b5-20020a056000054500b002e5ff05765esm5013440wrf.73.2023.04.21.12.13.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:21 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:06 +0000 Subject: [PATCH 02/14] config.c: use kvi for CLI config Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo Plumb "struct key_value_info" and use "kvi_fn()" when parsing CLI config. Do this by refactoring out and reusing the logic that sets the "struct key_value_info" members when caching CLI config in a configset. This lets us get rid of the fake "struct config_source" in "git_config_from_parameters()", so we now only have to maintain one implementation. Additionally, this plumbing also reveals that "git_config_parse_parameter()" hasn't been setting either "the_reader.source" or "the_reader.config_kvi", so any calls to "current_*" would either BUG() or return *_UNKNOWN values. Also, get rid of the BUG() checks that forbid setting ".config_kvi" and ".source" at the same time, since we will run afoul of that check. They will soon be unnecessary when we remove ".source". Signed-off-by: Glen Choo --- config.c | 58 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/config.c b/config.c index daad892e4fd..4e9e8e7abb9 100644 --- a/config.c +++ b/config.c @@ -99,8 +99,6 @@ static struct config_reader the_reader; static inline void config_reader_push_source(struct config_reader *reader, struct config_source *top) { - if (reader->config_kvi) - BUG("source should not be set while iterating a config set"); top->prev = reader->source; reader->source = top; } @@ -118,16 +116,12 @@ static inline struct config_source *config_reader_pop_source(struct config_reade static inline void config_reader_set_kvi(struct config_reader *reader, struct key_value_info *kvi) { - if (kvi && (reader->source || reader->parsing_scope)) - BUG("kvi should not be set while parsing a config source"); reader->config_kvi = kvi; } static inline void config_reader_set_scope(struct config_reader *reader, enum config_scope scope) { - if (scope && reader->config_kvi) - BUG("scope should only be set when iterating through a config source"); reader->parsing_scope = scope; } @@ -672,7 +666,8 @@ static int kvi_fn(config_fn_t fn, const char *key, const char *value, } static int config_parse_pair(const char *key, const char *value, - config_fn_t fn, void *data) + struct key_value_info *kvi, + config_fn_t fn, void *data) { char *canonical_name; int ret; @@ -682,17 +677,30 @@ static int config_parse_pair(const char *key, const char *value, if (git_config_parse_key(key, &canonical_name, NULL)) return -1; - ret = (fn(canonical_name, value, data) < 0) ? -1 : 0; + ret = (kvi_fn(fn, canonical_name, value, kvi, data) < 0) ? -1 : 0; free(canonical_name); return ret; } + +/* for values read from `git_config_from_parameters()` */ +static void kvi_from_param(struct key_value_info *out) +{ + out->filename = NULL; + out->linenr = -1; + out->origin_type = CONFIG_ORIGIN_CMDLINE; + out->scope = CONFIG_SCOPE_COMMAND; +} + int git_config_parse_parameter(const char *text, config_fn_t fn, void *data) { const char *value; struct strbuf **pair; int ret; + struct key_value_info kvi = { 0 }; + + kvi_from_param(&kvi); pair = strbuf_split_str(text, '=', 2); if (!pair[0]) @@ -711,12 +719,13 @@ int git_config_parse_parameter(const char *text, return error(_("bogus config parameter: %s"), text); } - ret = config_parse_pair(pair[0]->buf, value, fn, data); + ret = config_parse_pair(pair[0]->buf, value, &kvi, fn, data); strbuf_list_free(pair); return ret; } -static int parse_config_env_list(char *env, config_fn_t fn, void *data) +static int parse_config_env_list(char *env, struct key_value_info *kvi, + config_fn_t fn, void *data) { char *cur = env; while (cur && *cur) { @@ -750,7 +759,7 @@ static int parse_config_env_list(char *env, config_fn_t fn, void *data) CONFIG_DATA_ENVIRONMENT); } - if (config_parse_pair(key, value, fn, data) < 0) + if (config_parse_pair(key, value, kvi, fn, data) < 0) return -1; } else { @@ -774,11 +783,9 @@ int git_config_from_parameters(config_fn_t fn, void *data) struct strvec to_free = STRVEC_INIT; int ret = 0; char *envw = NULL; - struct config_source source = CONFIG_SOURCE_INIT; - - source.origin_type = CONFIG_ORIGIN_CMDLINE; - config_reader_push_source(&the_reader, &source); + struct key_value_info kvi = { 0 }; + kvi_from_param(&kvi); env = getenv(CONFIG_COUNT_ENVIRONMENT); if (env) { unsigned long count; @@ -814,7 +821,7 @@ int git_config_from_parameters(config_fn_t fn, void *data) } strbuf_reset(&envvar); - if (config_parse_pair(key, value, fn, data) < 0) { + if (config_parse_pair(key, value, &kvi, fn, data) < 0) { ret = -1; goto out; } @@ -825,7 +832,7 @@ int git_config_from_parameters(config_fn_t fn, void *data) if (env) { /* sq_dequote will write over it */ envw = xstrdup(env); - if (parse_config_env_list(envw, fn, data) < 0) { + if (parse_config_env_list(envw, &kvi, fn, data) < 0) { ret = -1; goto out; } @@ -835,7 +842,6 @@ out: strbuf_release(&envvar); strvec_clear(&to_free); free(envw); - config_reader_pop_source(&the_reader); return ret; } @@ -2241,7 +2247,7 @@ static int do_git_config_sequence(struct config_reader *reader, free(path); } - config_reader_set_scope(reader, CONFIG_SCOPE_COMMAND); + config_reader_set_scope(reader, 0); if (!opts->ignore_cmdline && git_config_from_parameters(fn, data) < 0) die(_("unable to parse command-line config")); @@ -2423,19 +2429,13 @@ static int configset_add_value(struct config_reader *reader, l_item->e = e; l_item->value_index = e->value_list.nr - 1; - if (!reader->source) - BUG("configset_add_value has no source"); - if (reader->source->name) { + if (reader->source && reader->source->name) { kv_info->filename = strintern(reader->source->name); kv_info->linenr = reader->source->linenr; kv_info->origin_type = reader->source->origin_type; - } else { - /* for values read from `git_config_from_parameters()` */ - kv_info->filename = NULL; - kv_info->linenr = -1; - kv_info->origin_type = CONFIG_ORIGIN_CMDLINE; - } - kv_info->scope = reader->parsing_scope; + kv_info->scope = reader->parsing_scope; + } else + kvi_from_param(kv_info); si->util = kv_info; return 0; From patchwork Fri Apr 21 19:13:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220608 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A2414C77B76 for ; Fri, 21 Apr 2023 19:13:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233483AbjDUTNh (ORCPT ); Fri, 21 Apr 2023 15:13:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233453AbjDUTN1 (ORCPT ); Fri, 21 Apr 2023 15:13:27 -0400 Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2EBF310D0 for ; Fri, 21 Apr 2023 12:13:24 -0700 (PDT) Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-3f09b4a1584so15051125e9.2 for ; Fri, 21 Apr 2023 12:13:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104402; x=1684696402; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=YkLMYgx8CNl2w9YglzQVVjd8WrV0LyL3eQXRdtTXw5w=; b=KF9DCellQ6QSz5wcClcaFC+n37foLsLCPQ22gfNfQWaxWp9cOfohvVZ4z/DY97x0z/ G7pLyAC7I0DRz1mMBz1M9yUW/NpN8EXXGXITkL7Ob9EooaC9xge7XAZIp6ZEoyyPWG8w oSGEQZp/4+ge9pzkbp+OdvR1efy0qFQYYTo6ahGJPWISKsK7na0t1aYRDqsOOlU4zecS 8H/jhbrANkJiwovV9BvQ1sqmW18Bc5bemLnkFYlFU6sZy3y7NgMNj5RWFXa0xsydvSu4 kVy1lCxK7WTlIkQoHnMMZV1B1n/YFoRWtsWOo92rkpGUUXYG6HEQhymZLq2Y5fpXoUoK vFRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104402; x=1684696402; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YkLMYgx8CNl2w9YglzQVVjd8WrV0LyL3eQXRdtTXw5w=; b=ThLhuh1Kow+X/beVJmj1+o3GQMoMzEjJhDIsSzHBPot68SF2lwSai2iqKlWw5WA6LM DvP2jd38PcESQxtyTC2bUyyWJcbs5YFFt7lA9AKFtronz+nKBWiDnwrJkERXJZpvXxWO bdzwwmJXCyK3+LW9EUisFdQN/nYpTOzCyPnymXFdVuGSaDeaki8ylNOFVTntBbd7i9ob cgpsfDSEUE/aKzAHgEM+qUQBSuGr6yMZCnxSLu3b2E9Obcxh+9f00UEyYX2lR1n93jdL qprhyRnutcdct/AnfRXd4hcfxHV+Z0xJELiaUtSx1vLmRSMFUQNOv9j4UITl+OC7q3bu SrEg== X-Gm-Message-State: AAQBX9fei6AK5hqy1isvdyIubYWqDM93k3n3tjzTDyMfzOTx5pACyrGR qGodKSJLha7+ifH3L+WMkw0k9cqZv04= X-Google-Smtp-Source: AKy350ZertsHql4vxhWWQrq1H/74t7RfqxBkLgMmMOaRbW3Tj6ROFy5VneOAfVy2OlOgiDyNwI77mA== X-Received: by 2002:a7b:cb96:0:b0:3eb:39e2:915b with SMTP id m22-20020a7bcb96000000b003eb39e2915bmr2596632wmi.31.1682104402321; Fri, 21 Apr 2023 12:13:22 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id m6-20020a05600c4f4600b003ee5fa61f45sm9022306wmq.3.2023.04.21.12.13.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:22 -0700 (PDT) Message-Id: <8c7a84137c8b1c9acccd573c3c7bdc0ee027e0b0.1682104398.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:07 +0000 Subject: [PATCH 03/14] config: use kvi for config files Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo Plumb "struct key_value_info" and use "kvi_fn()" when parsing config files. As a result, "config_reader.kvi" is now always set correctly, so we can remove "config_reader.scope" (but not the ".source" member since that's still needed by some non-parsing machinery). This requires plumbing an additional "enum config_scope" arg through "git_config_from_file_with_options()" and the underlying machinery to make up for the fact that "struct key_value_info" has a ".scope" member, but "struct config_source" does not. To handle "include" directives correctly, use push/pop semantics for "config_reader.config_kvi" (instead of "set" semantics) like we do for "config_reader.source". Otherwise, "config_reader.config_kvi" won't be set correctly when we finish parsing an included config file and we want to "pop" it to resume parsing the original file. This distinction only matters while there is a global "kvi", i.e. it will be obsolete at the end of the series. Signed-off-by: Glen Choo --- bundle-uri.c | 1 + config.c | 171 ++++++++++++++++++++++++--------------------- config.h | 9 ++- fsck.c | 3 +- submodule-config.c | 5 +- 5 files changed, 104 insertions(+), 85 deletions(-) diff --git a/bundle-uri.c b/bundle-uri.c index e2b267cc02b..8c4e2b70b89 100644 --- a/bundle-uri.c +++ b/bundle-uri.c @@ -252,6 +252,7 @@ int bundle_uri_parse_config_format(const char *uri, } result = git_config_from_file_with_options(config_to_bundle_list, filename, list, + CONFIG_SCOPE_UNKNOWN, &opts); if (!result && list->mode == BUNDLE_MODE_NONE) { diff --git a/config.c b/config.c index 4e9e8e7abb9..3369b32d065 100644 --- a/config.c +++ b/config.c @@ -78,16 +78,6 @@ struct config_reader { */ struct config_source *source; struct key_value_info *config_kvi; - /* - * The "scope" of the current config source being parsed (repo, global, - * etc). Like "source", this is only set when parsing a config source. - * It's not part of "source" because it transcends a single file (i.e., - * a file included from .git/config is still in "repo" scope). - * - * When iterating through a configset, the equivalent value is - * "config_kvi.scope" (see above). - */ - enum config_scope parsing_scope; }; /* * Where possible, prefer to accept "struct config_reader" as an arg than to use @@ -113,16 +103,21 @@ static inline struct config_source *config_reader_pop_source(struct config_reade return ret; } -static inline void config_reader_set_kvi(struct config_reader *reader, - struct key_value_info *kvi) +static inline void config_reader_push_kvi(struct config_reader *reader, + struct key_value_info *kvi) { + kvi->prev = reader->config_kvi; reader->config_kvi = kvi; } -static inline void config_reader_set_scope(struct config_reader *reader, - enum config_scope scope) +static inline struct key_value_info *config_reader_pop_kvi(struct config_reader *reader) { - reader->parsing_scope = scope; + struct key_value_info *ret; + if (!reader->config_kvi) + BUG("tried to pop config_kvi, but we weren't reading config"); + ret = reader->config_kvi; + reader->config_kvi = reader->config_kvi->prev; + return ret; } static int pack_compression_seen; @@ -244,7 +239,9 @@ static int handle_path_include(struct config_source *cs, const char *path, !cs ? "" : cs->name ? cs->name : "the command line"); - ret = git_config_from_file(git_config_include, path, inc); + ret = git_config_from_file_with_options(git_config_include, path, inc, + current_config_scope(), + NULL); inc->depth--; } cleanup: @@ -393,18 +390,12 @@ static void populate_remote_urls(struct config_include_data *inc) { struct config_options opts; - enum config_scope store_scope = inc->config_reader->parsing_scope; - opts = *inc->opts; opts.unconditional_remote_url = 1; - config_reader_set_scope(inc->config_reader, 0); - inc->remote_urls = xmalloc(sizeof(*inc->remote_urls)); string_list_init_dup(inc->remote_urls); config_with_options(add_remote_url, inc->remote_urls, inc->config_source, &opts); - - config_reader_set_scope(inc->config_reader, store_scope); } static int forbid_remote_url(const char *var, const char *value UNUSED, @@ -471,10 +462,13 @@ static int include_condition_is_true(struct config_source *cs, return 0; } +static int kvi_fn(config_fn_t fn, const char *key, const char *value, + struct key_value_info *kvi, void *data); static int git_config_include(const char *var, const char *value, void *data) { struct config_include_data *inc = data; struct config_source *cs = inc->config_reader->source; + struct key_value_info *kvi = inc->config_reader->config_kvi; const char *cond, *key; size_t cond_len; int ret; @@ -483,7 +477,7 @@ static int git_config_include(const char *var, const char *value, void *data) * Pass along all values, including "include" directives; this makes it * possible to query information on the includes themselves. */ - ret = inc->fn(var, value, inc->data); + ret = kvi_fn(inc->fn, var, value, kvi, inc->data); if (ret < 0) return ret; @@ -655,13 +649,12 @@ out_free_ret_1: } static int kvi_fn(config_fn_t fn, const char *key, const char *value, - struct key_value_info *kvi, - void *data) + struct key_value_info *kvi, void *data) { int ret; - config_reader_set_kvi(&the_reader, kvi); + config_reader_push_kvi(&the_reader, kvi); ret = fn(key, value, data); - config_reader_set_kvi(&the_reader, NULL); + config_reader_pop_kvi(&the_reader); return ret; } @@ -942,8 +935,8 @@ static char *parse_value(struct config_source *cs) } } -static int get_value(struct config_source *cs, config_fn_t fn, void *data, - struct strbuf *name) +static int get_value(struct config_source *cs, struct key_value_info *kvi, + config_fn_t fn, void *data, struct strbuf *name) { int c; char *value; @@ -976,7 +969,8 @@ static int get_value(struct config_source *cs, config_fn_t fn, void *data, * accurate line number in error messages. */ cs->linenr--; - ret = fn(name->buf, value, data); + kvi->linenr = cs->linenr; + ret = kvi_fn(fn, name->buf, value, kvi, data); if (ret >= 0) cs->linenr++; return ret; @@ -1075,8 +1069,19 @@ static int do_event(struct config_source *cs, enum config_event_t type, return 0; } +static void kvi_from_source(struct config_source *cs, + enum config_scope scope, + struct key_value_info *out) +{ + out->filename = strintern(cs->name); + out->origin_type = cs->origin_type; + out->linenr = cs->linenr; + out->scope = scope; +} + static int git_parse_source(struct config_source *cs, config_fn_t fn, - void *data, const struct config_options *opts) + struct key_value_info *kvi, void *data, + const struct config_options *opts) { int comment = 0; size_t baselen = 0; @@ -1160,7 +1165,7 @@ static int git_parse_source(struct config_source *cs, config_fn_t fn, */ strbuf_setlen(var, baselen); strbuf_addch(var, tolower(c)); - if (get_value(cs, fn, data, var) < 0) + if (get_value(cs, kvi, fn, data, var) < 0) break; } @@ -2016,9 +2021,11 @@ int git_default_config(const char *var, const char *value, void *cb) * this function. */ static int do_config_from(struct config_reader *reader, - struct config_source *top, config_fn_t fn, void *data, + struct config_source *top, config_fn_t fn, + void *data, enum config_scope scope, const struct config_options *opts) { + struct key_value_info kvi = { 0 }; int ret; /* push config-file parsing state stack */ @@ -2028,8 +2035,9 @@ static int do_config_from(struct config_reader *reader, strbuf_init(&top->value, 1024); strbuf_init(&top->var, 1024); config_reader_push_source(reader, top); + kvi_from_source(top, scope, &kvi); - ret = git_parse_source(top, fn, data, opts); + ret = git_parse_source(top, fn, &kvi, data, opts); /* pop config-file parsing state stack */ strbuf_release(&top->value); @@ -2043,7 +2051,8 @@ static int do_config_from_file(struct config_reader *reader, config_fn_t fn, const enum config_origin_type origin_type, const char *name, const char *path, FILE *f, - void *data, const struct config_options *opts) + void *data, enum config_scope scope, + const struct config_options *opts) { struct config_source top = CONFIG_SOURCE_INIT; int ret; @@ -2058,19 +2067,21 @@ static int do_config_from_file(struct config_reader *reader, top.do_ftell = config_file_ftell; flockfile(f); - ret = do_config_from(reader, &top, fn, data, opts); + ret = do_config_from(reader, &top, fn, data, scope, opts); funlockfile(f); + return ret; } -static int git_config_from_stdin(config_fn_t fn, void *data) +static int git_config_from_stdin(config_fn_t fn, void *data, + enum config_scope scope) { return do_config_from_file(&the_reader, fn, CONFIG_ORIGIN_STDIN, "", - NULL, stdin, data, NULL); + NULL, stdin, data, scope, NULL); } int git_config_from_file_with_options(config_fn_t fn, const char *filename, - void *data, + void *data, enum config_scope scope, const struct config_options *opts) { int ret = -1; @@ -2081,7 +2092,8 @@ int git_config_from_file_with_options(config_fn_t fn, const char *filename, f = fopen_or_warn(filename, "r"); if (f) { ret = do_config_from_file(&the_reader, fn, CONFIG_ORIGIN_FILE, - filename, filename, f, data, opts); + filename, filename, f, data, scope, + opts); fclose(f); } return ret; @@ -2089,13 +2101,15 @@ int git_config_from_file_with_options(config_fn_t fn, const char *filename, int git_config_from_file(config_fn_t fn, const char *filename, void *data) { - return git_config_from_file_with_options(fn, filename, data, NULL); + return git_config_from_file_with_options(fn, filename, data, + CONFIG_SCOPE_UNKNOWN, NULL); } int git_config_from_mem(config_fn_t fn, const enum config_origin_type origin_type, const char *name, const char *buf, size_t len, - void *data, const struct config_options *opts) + void *data, enum config_scope scope, + const struct config_options *opts) { struct config_source top = CONFIG_SOURCE_INIT; @@ -2110,14 +2124,15 @@ int git_config_from_mem(config_fn_t fn, top.do_ungetc = config_buf_ungetc; top.do_ftell = config_buf_ftell; - return do_config_from(&the_reader, &top, fn, data, opts); + return do_config_from(&the_reader, &top, fn, data, scope, opts); } int git_config_from_blob_oid(config_fn_t fn, const char *name, struct repository *repo, const struct object_id *oid, - void *data) + void *data, + enum config_scope scope) { enum object_type type; char *buf; @@ -2133,7 +2148,7 @@ int git_config_from_blob_oid(config_fn_t fn, } ret = git_config_from_mem(fn, CONFIG_ORIGIN_BLOB, name, buf, size, - data, NULL); + data, scope, NULL); free(buf); return ret; @@ -2142,13 +2157,14 @@ int git_config_from_blob_oid(config_fn_t fn, static int git_config_from_blob_ref(config_fn_t fn, struct repository *repo, const char *name, - void *data) + void *data, + enum config_scope scope) { struct object_id oid; if (repo_get_oid(repo, name, &oid) < 0) return error(_("unable to resolve config blob '%s'"), name); - return git_config_from_blob_oid(fn, name, repo, &oid, data); + return git_config_from_blob_oid(fn, name, repo, &oid, data, scope); } char *git_system_config(void) @@ -2201,8 +2217,7 @@ int git_config_system(void) return !git_env_bool("GIT_CONFIG_NOSYSTEM", 0); } -static int do_git_config_sequence(struct config_reader *reader, - const struct config_options *opts, +static int do_git_config_sequence(const struct config_options *opts, config_fn_t fn, void *data) { int ret = 0; @@ -2210,7 +2225,6 @@ static int do_git_config_sequence(struct config_reader *reader, char *xdg_config = NULL; char *user_config = NULL; char *repo_config; - enum config_scope prev_parsing_scope = reader->parsing_scope; if (opts->commondir) repo_config = mkpathdup("%s/config", opts->commondir); @@ -2219,39 +2233,40 @@ static int do_git_config_sequence(struct config_reader *reader, else repo_config = NULL; - config_reader_set_scope(reader, CONFIG_SCOPE_SYSTEM); if (git_config_system() && system_config && !access_or_die(system_config, R_OK, opts->system_gently ? ACCESS_EACCES_OK : 0)) - ret += git_config_from_file(fn, system_config, data); + ret += git_config_from_file_with_options(fn, system_config, + data, CONFIG_SCOPE_SYSTEM, + NULL); - config_reader_set_scope(reader, CONFIG_SCOPE_GLOBAL); git_global_config(&user_config, &xdg_config); if (xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK)) - ret += git_config_from_file(fn, xdg_config, data); + ret += git_config_from_file_with_options(fn, xdg_config, data, + CONFIG_SCOPE_GLOBAL, NULL); if (user_config && !access_or_die(user_config, R_OK, ACCESS_EACCES_OK)) - ret += git_config_from_file(fn, user_config, data); + ret += git_config_from_file_with_options(fn, user_config, data, + CONFIG_SCOPE_GLOBAL, NULL); - config_reader_set_scope(reader, CONFIG_SCOPE_LOCAL); if (!opts->ignore_repo && repo_config && !access_or_die(repo_config, R_OK, 0)) - ret += git_config_from_file(fn, repo_config, data); + ret += git_config_from_file_with_options(fn, repo_config, data, + CONFIG_SCOPE_LOCAL, NULL); - config_reader_set_scope(reader, CONFIG_SCOPE_WORKTREE); if (!opts->ignore_worktree && repository_format_worktree_config) { char *path = git_pathdup("config.worktree"); if (!access_or_die(path, R_OK, 0)) - ret += git_config_from_file(fn, path, data); + ret += git_config_from_file_with_options(fn, path, data, + CONFIG_SCOPE_WORKTREE, + NULL); free(path); } - config_reader_set_scope(reader, 0); if (!opts->ignore_cmdline && git_config_from_parameters(fn, data) < 0) die(_("unable to parse command-line config")); - config_reader_set_scope(reader, prev_parsing_scope); free(system_config); free(xdg_config); free(user_config); @@ -2264,7 +2279,6 @@ int config_with_options(config_fn_t fn, void *data, const struct config_options *opts) { struct config_include_data inc = CONFIG_INCLUDE_INIT; - enum config_scope prev_scope = the_reader.parsing_scope; int ret; if (opts->respect_includes) { @@ -2277,31 +2291,29 @@ int config_with_options(config_fn_t fn, void *data, data = &inc; } - if (config_source) - config_reader_set_scope(&the_reader, config_source->scope); - /* * If we have a specific filename, use it. Otherwise, follow the * regular lookup sequence. */ if (config_source && config_source->use_stdin) { - ret = git_config_from_stdin(fn, data); + ret = git_config_from_stdin(fn, data, config_source->scope); } else if (config_source && config_source->file) { - ret = git_config_from_file(fn, config_source->file, data); + ret = git_config_from_file_with_options(fn, config_source->file, + data, config_source->scope, + NULL); } else if (config_source && config_source->blob) { struct repository *repo = config_source->repo ? config_source->repo : the_repository; ret = git_config_from_blob_ref(fn, repo, config_source->blob, - data); + data, config_source->scope); } else { - ret = do_git_config_sequence(&the_reader, opts, fn, data); + ret = do_git_config_sequence(opts, fn, data); } if (inc.remote_urls) { string_list_clear(inc.remote_urls, 0); FREE_AND_NULL(inc.remote_urls); } - config_reader_set_scope(&the_reader, prev_scope); return ret; } @@ -2429,13 +2441,7 @@ static int configset_add_value(struct config_reader *reader, l_item->e = e; l_item->value_index = e->value_list.nr - 1; - if (reader->source && reader->source->name) { - kv_info->filename = strintern(reader->source->name); - kv_info->linenr = reader->source->linenr; - kv_info->origin_type = reader->source->origin_type; - kv_info->scope = reader->parsing_scope; - } else - kvi_from_param(kv_info); + memcpy(kv_info, reader->config_kvi, sizeof(struct key_value_info)); si->util = kv_info; return 0; @@ -3473,7 +3479,8 @@ int git_config_set_multivar_in_file_gently(const char *config_filename, */ if (git_config_from_file_with_options(store_aux, config_filename, - &store, &opts)) { + &store, CONFIG_SCOPE_UNKNOWN, + &opts)) { error(_("invalid config file %s"), config_filename); ret = CONFIG_INVALID_FILE; goto out_free; @@ -4018,7 +4025,13 @@ enum config_scope current_config_scope(void) if (the_reader.config_kvi) return the_reader.config_kvi->scope; else - return the_reader.parsing_scope; + /* + * FIXME This should be a BUG, but tr2_list_env_vars_fl is + * calling this outside of a config callback. This will be + * easier to fix when we plumb kvi through the config callbacks, + * so leave this untouched for now. + */ + return CONFIG_SCOPE_UNKNOWN; } int current_config_line(void) diff --git a/config.h b/config.h index 247b572b37b..27d1718ac7b 100644 --- a/config.h +++ b/config.h @@ -142,16 +142,18 @@ int git_default_config(const char *, const char *, void *); int git_config_from_file(config_fn_t fn, const char *, void *); int git_config_from_file_with_options(config_fn_t fn, const char *, - void *, + void *, enum config_scope, const struct config_options *); int git_config_from_mem(config_fn_t fn, const enum config_origin_type, const char *name, const char *buf, size_t len, - void *data, const struct config_options *opts); + void *data, enum config_scope scope, + const struct config_options *opts); int git_config_from_blob_oid(config_fn_t fn, const char *name, struct repository *repo, - const struct object_id *oid, void *data); + const struct object_id *oid, void *data, + enum config_scope scope); void git_config_push_parameter(const char *text); void git_config_push_env(const char *spec); int git_config_from_parameters(config_fn_t fn, void *data); @@ -672,6 +674,7 @@ struct key_value_info { int linenr; enum config_origin_type origin_type; enum config_scope scope; + struct key_value_info *prev; }; /** diff --git a/fsck.c b/fsck.c index 8ef1b022346..4238344ed82 100644 --- a/fsck.c +++ b/fsck.c @@ -1235,7 +1235,8 @@ static int fsck_blob(const struct object_id *oid, const char *buf, data.ret = 0; config_opts.error_action = CONFIG_ERROR_SILENT; if (git_config_from_mem(fsck_gitmodules_fn, CONFIG_ORIGIN_BLOB, - ".gitmodules", buf, size, &data, &config_opts)) + ".gitmodules", buf, size, &data, + CONFIG_SCOPE_UNKNOWN, &config_opts)) data.ret |= report(options, oid, OBJ_BLOB, FSCK_MSG_GITMODULES_PARSE, "could not parse gitmodules blob"); diff --git a/submodule-config.c b/submodule-config.c index ecf0fcf0074..c2f71f0b2e3 100644 --- a/submodule-config.c +++ b/submodule-config.c @@ -603,7 +603,7 @@ static const struct submodule *config_from(struct submodule_cache *cache, parameter.gitmodules_oid = &oid; parameter.overwrite = 0; git_config_from_mem(parse_config, CONFIG_ORIGIN_SUBMODULE_BLOB, rev.buf, - config, config_size, ¶meter, NULL); + config, config_size, ¶meter, CONFIG_SCOPE_UNKNOWN, NULL); strbuf_release(&rev); free(config); @@ -711,7 +711,8 @@ void gitmodules_config_oid(const struct object_id *commit_oid) if (gitmodule_oid_from_commit(commit_oid, &oid, &rev)) { git_config_from_blob_oid(gitmodules_cb, rev.buf, - the_repository, &oid, the_repository); + the_repository, &oid, the_repository, + CONFIG_SCOPE_UNKNOWN); } strbuf_release(&rev); From patchwork Fri Apr 21 19:13:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220609 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 58052C7618E for ; Fri, 21 Apr 2023 19:13:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233489AbjDUTNj (ORCPT ); Fri, 21 Apr 2023 15:13:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38012 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233456AbjDUTN1 (ORCPT ); Fri, 21 Apr 2023 15:13:27 -0400 Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AB84510F6 for ; Fri, 21 Apr 2023 12:13:24 -0700 (PDT) Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-3f1950f569eso5920795e9.2 for ; Fri, 21 Apr 2023 12:13:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104403; x=1684696403; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=KPQP1phttm/F7weW3TLGo1HrwI3jSy7Egsz6Ae3JUas=; b=K+nC7pA9MNcV3VUN3fyGEKU61Tk5c28NtbcH5rhy57BSvI/zVqpK0ic1bhFZgeFYdZ 2wW1R1TTOLhFt2JYzXOYNzRAyX3coc/HTG9NHNC/V49d72P8p6VI/CAIIB50GG9f41D+ oBMw3e5IxPCeGH4Mmf3zSk3jPOtLgC8lYQGcjOmhcVKaWng573DJU9be5W7EJKihiEPT gHXpwFuZYIu6Vs8ZnTEn8g6TvviCJCWgsH6i0wXNVeELD4PjZvsScG34shMGYnCqWDYA B/4xYYkAtwRrvqp/Zm2fvSDcVN1S3IqWLPYdHge45KWJOTKzLiA9xrs7h8F7w9Edwsip cCTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104403; x=1684696403; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KPQP1phttm/F7weW3TLGo1HrwI3jSy7Egsz6Ae3JUas=; b=lq1RjskOb8mw6q4a2rof/g33LWdRRQOI4kYiHSvM74VU7YgsFEovWaiZEvXyayWK9f +HJYHL9BzlTt7YdJfKQ3ERp0xBNS6dH66sPKVYzMUQu2DOE05tPPUQg+/dB8r//NobRZ RczW+7XrLVNcN1z0LYDR48xuG3Pq0LSNWIkBRdpzeU3WoKg4cb/jwmywWhWNYGOyU8Zz BaNUM4qN2PEG18QtthC5wQwDu5KDlk5xgSs9HyTUhyT5CTDJETxbmh0RLub2LE5Sw5Co az2xvRJx05PEvif/LeaOEHzSJ3y2ESgjopdCJqgS+xX+AsEKG+pyhxU932UkkN7X7dAQ PrUA== X-Gm-Message-State: AAQBX9dZiFOJTQ4IeLmaUbWwNlaR3GmbEUrbWBCinVS59vEqtMk+DqyE xAID78WBtK5PcJSYcXbygWCcuWIbzdM= X-Google-Smtp-Source: AKy350bvV7dFSSi3y3OLgZHVcYBOj8Mpjty3Kli0KlwYrW0zmoyx4r2X04bySEszlTEs1S0aBtXV4A== X-Received: by 2002:a1c:7404:0:b0:3f1:7123:5f82 with SMTP id p4-20020a1c7404000000b003f171235f82mr2803420wmc.12.1682104402826; Fri, 21 Apr 2023 12:13:22 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id p14-20020a05600c358e00b003f188f608b9sm6035946wmq.8.2023.04.21.12.13.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:22 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:08 +0000 Subject: [PATCH 04/14] config: add kvi.path, use it to evaluate includes Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo Include directives are evaluated using the path of the config file. To reduce the dependence on "config_reader.source", add a new "key_value_info.path" member and use that instead of "config_source.path". Signed-off-by: Glen Choo --- config.c | 40 ++++++++++++++++++++-------------------- config.h | 1 + 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/config.c b/config.c index 3369b32d065..b952a4b118d 100644 --- a/config.c +++ b/config.c @@ -199,7 +199,7 @@ static const char include_depth_advice[] = N_( "from\n" " %s\n" "This might be due to circular includes."); -static int handle_path_include(struct config_source *cs, const char *path, +static int handle_path_include(struct key_value_info *kvi, const char *path, struct config_include_data *inc) { int ret = 0; @@ -221,14 +221,14 @@ static int handle_path_include(struct config_source *cs, const char *path, if (!is_absolute_path(path)) { char *slash; - if (!cs || !cs->path) { + if (!kvi || !kvi->path) { ret = error(_("relative config includes must come from files")); goto cleanup; } - slash = find_last_dir_sep(cs->path); + slash = find_last_dir_sep(kvi->path); if (slash) - strbuf_add(&buf, cs->path, slash - cs->path + 1); + strbuf_add(&buf, kvi->path, slash - kvi->path + 1); strbuf_addstr(&buf, path); path = buf.buf; } @@ -236,12 +236,11 @@ static int handle_path_include(struct config_source *cs, const char *path, if (!access_or_die(path, R_OK, 0)) { if (++inc->depth > MAX_INCLUDE_DEPTH) die(_(include_depth_advice), MAX_INCLUDE_DEPTH, path, - !cs ? "" : - cs->name ? cs->name : + !kvi ? "" : + kvi->filename ? kvi->filename : "the command line"); ret = git_config_from_file_with_options(git_config_include, path, inc, - current_config_scope(), - NULL); + kvi->scope, NULL); inc->depth--; } cleanup: @@ -256,7 +255,7 @@ static void add_trailing_starstar_for_dir(struct strbuf *pat) strbuf_addstr(pat, "**"); } -static int prepare_include_condition_pattern(struct config_source *cs, +static int prepare_include_condition_pattern(struct key_value_info *kvi, struct strbuf *pat) { struct strbuf path = STRBUF_INIT; @@ -273,11 +272,11 @@ static int prepare_include_condition_pattern(struct config_source *cs, if (pat->buf[0] == '.' && is_dir_sep(pat->buf[1])) { const char *slash; - if (!cs || !cs->path) + if (!kvi || !kvi->path) return error(_("relative config include " "conditionals must come from files")); - strbuf_realpath(&path, cs->path, 1); + strbuf_realpath(&path, kvi->path, 1); slash = find_last_dir_sep(path.buf); if (!slash) BUG("how is this possible?"); @@ -292,7 +291,7 @@ static int prepare_include_condition_pattern(struct config_source *cs, return prefix; } -static int include_by_gitdir(struct config_source *cs, +static int include_by_gitdir(struct key_value_info *kvi, const struct config_options *opts, const char *cond, size_t cond_len, int icase) { @@ -309,7 +308,7 @@ static int include_by_gitdir(struct config_source *cs, strbuf_realpath(&text, git_dir, 1); strbuf_add(&pattern, cond, cond_len); - prefix = prepare_include_condition_pattern(cs, &pattern); + prefix = prepare_include_condition_pattern(kvi, &pattern); again: if (prefix < 0) @@ -442,16 +441,16 @@ static int include_by_remote_url(struct config_include_data *inc, inc->remote_urls); } -static int include_condition_is_true(struct config_source *cs, +static int include_condition_is_true(struct key_value_info *kvi, struct config_include_data *inc, const char *cond, size_t cond_len) { const struct config_options *opts = inc->opts; if (skip_prefix_mem(cond, cond_len, "gitdir:", &cond, &cond_len)) - return include_by_gitdir(cs, opts, cond, cond_len, 0); + return include_by_gitdir(kvi, opts, cond, cond_len, 0); else if (skip_prefix_mem(cond, cond_len, "gitdir/i:", &cond, &cond_len)) - return include_by_gitdir(cs, opts, cond, cond_len, 1); + return include_by_gitdir(kvi, opts, cond, cond_len, 1); else if (skip_prefix_mem(cond, cond_len, "onbranch:", &cond, &cond_len)) return include_by_branch(cond, cond_len); else if (skip_prefix_mem(cond, cond_len, "hasconfig:remote.*.url:", &cond, @@ -467,7 +466,6 @@ static int kvi_fn(config_fn_t fn, const char *key, const char *value, static int git_config_include(const char *var, const char *value, void *data) { struct config_include_data *inc = data; - struct config_source *cs = inc->config_reader->source; struct key_value_info *kvi = inc->config_reader->config_kvi; const char *cond, *key; size_t cond_len; @@ -482,16 +480,16 @@ static int git_config_include(const char *var, const char *value, void *data) return ret; if (!strcmp(var, "include.path")) - ret = handle_path_include(cs, value, inc); + ret = handle_path_include(kvi, value, inc); if (!parse_config_key(var, "includeif", &cond, &cond_len, &key) && - cond && include_condition_is_true(cs, inc, cond, cond_len) && + cond && include_condition_is_true(kvi, inc, cond, cond_len) && !strcmp(key, "path")) { config_fn_t old_fn = inc->fn; if (inc->opts->unconditional_remote_url) inc->fn = forbid_remote_url; - ret = handle_path_include(cs, value, inc); + ret = handle_path_include(kvi, value, inc); inc->fn = old_fn; } @@ -683,6 +681,7 @@ static void kvi_from_param(struct key_value_info *out) out->linenr = -1; out->origin_type = CONFIG_ORIGIN_CMDLINE; out->scope = CONFIG_SCOPE_COMMAND; + out->path = NULL; } int git_config_parse_parameter(const char *text, @@ -1077,6 +1076,7 @@ static void kvi_from_source(struct config_source *cs, out->origin_type = cs->origin_type; out->linenr = cs->linenr; out->scope = scope; + out->path = cs->path; } static int git_parse_source(struct config_source *cs, config_fn_t fn, diff --git a/config.h b/config.h index 27d1718ac7b..f8bab9fdef4 100644 --- a/config.h +++ b/config.h @@ -674,6 +674,7 @@ struct key_value_info { int linenr; enum config_origin_type origin_type; enum config_scope scope; + const char *path; struct key_value_info *prev; }; From patchwork Fri Apr 21 19:13:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220610 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4CE21C7618E for ; Fri, 21 Apr 2023 19:13:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233492AbjDUTNm (ORCPT ); Fri, 21 Apr 2023 15:13:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38022 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233462AbjDUTN1 (ORCPT ); Fri, 21 Apr 2023 15:13:27 -0400 Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1B92B170C for ; Fri, 21 Apr 2023 12:13:25 -0700 (PDT) Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-3f178da21afso14740195e9.1 for ; Fri, 21 Apr 2023 12:13:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104403; x=1684696403; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=N3O2tWXYodpew9KhXFpPWf1Ko83c8a1VUAOnD03VJqY=; b=b+ofghSFVy67gxsDPPZIxQwSlZWLUY/nUk/O58jAkfhXrrI5XXvz4ylQW4PQ/Jx6uX JBbaz6pFoi1ln2MTn8/S1dDIgOcQPIIowJ84r5cJkp+7v4M4SgZLIn4oqqBqYMSVfy/Z W/MKyHQS/7RLp3XCSmWRJlnw9F4ossq4Hx6DHOTOOu0qI6uKmsJE8Nibo7pRYTZ//cJB AgZSrOjoaGNBokXFqkTICgza6S+xvrDGOCs2c1+/9z+zcIQ5ro+c3I349zlDrXAmcEs4 LfVKeURGz7dO9m0aLratVkgzn6IthI4kuqQb4hApbqf7MEH+Atotuv4wez9iUMW/jowd qH/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104403; x=1684696403; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=N3O2tWXYodpew9KhXFpPWf1Ko83c8a1VUAOnD03VJqY=; b=V6pVadVd+s8XSbaHX0zMYPr8pAVTy45Y2pXzRomYx9SX6Eeo7yrj3XVY7vJNlOpPDt COQ2w9CMLdNRd4iD+rbqX7R8Cl65eACbMRR61OEpWQhhm+OC8D3WAxQNa45g4MF/sQSq Ul81yrKR3D89Ihs26mgSx1v+TZKOX/CsEszLCsDZ6e2XxiTPatwtqgvaZegmoz4Drc03 y+ShJV4eiqvRY03nT9YKVinvs07XmusWWS3GMmh3QvMEel9gTNOwmEgVBaNNFlbP3SHJ oAWEiernzyKJ3AuFbZ9y5hVEPNjz2hUxwGWYlnWZNkHOvcwwKSwghS/S1ZXcyzn8XyWN CiGA== X-Gm-Message-State: AAQBX9fqI1M+RkiNehQOGNROek2XWUAzyODjqpSdGuc7TufQ97VWVS+6 EESjPw6obDZOR4ni0g8vFN9YBZj7dJs= X-Google-Smtp-Source: AKy350bPxYg0jR0lK0/BD8guaz/HNp/BW7Zctcd3vEK51ND+/2fbDXTBKNodUWFrkYl+mV7/MT0+nQ== X-Received: by 2002:a05:600c:21a:b0:3f1:75b6:8c7 with SMTP id 26-20020a05600c021a00b003f175b608c7mr2625334wmi.37.1682104403312; Fri, 21 Apr 2023 12:13:23 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id g11-20020a05600c310b00b003f0aefcc457sm8994864wmo.45.2023.04.21.12.13.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:23 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:09 +0000 Subject: [PATCH 05/14] config: pass source to config_parser_event_fn_t Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo ..so that the callback can use a "struct config_source" parameter instead of "config_reader.source". "struct config_source" is internal to config.c, but this refactor is okay because this function has only ever been (and probably ever will be) used internally by config.c. This removes the last user of "config_reader.source", so remove it too. Signed-off-by: Glen Choo --- config.c | 72 ++++++++++---------------------------------------------- config.h | 6 +++++ 2 files changed, 18 insertions(+), 60 deletions(-) diff --git a/config.c b/config.c index b952a4b118d..147e422a27b 100644 --- a/config.c +++ b/config.c @@ -60,23 +60,6 @@ struct config_source { #define CONFIG_SOURCE_INIT { 0 } struct config_reader { - /* - * These members record the "current" config source, which can be - * accessed by parsing callbacks. - * - * The "source" variable will be non-NULL only when we are actually - * parsing a real config source (file, blob, cmdline, etc). - * - * The "config_kvi" variable will be non-NULL only when we are feeding - * cached config from a configset into a callback. - * - * They cannot be non-NULL at the same time. If they are both NULL, then - * we aren't parsing anything (and depending on the function looking at - * the variables, it's either a bug for it to be called in the first - * place, or it's a function which can be reused for non-config - * purposes, and should fall back to some sane behavior). - */ - struct config_source *source; struct key_value_info *config_kvi; }; /* @@ -86,23 +69,6 @@ struct config_reader { */ static struct config_reader the_reader; -static inline void config_reader_push_source(struct config_reader *reader, - struct config_source *top) -{ - top->prev = reader->source; - reader->source = top; -} - -static inline struct config_source *config_reader_pop_source(struct config_reader *reader) -{ - struct config_source *ret; - if (!reader->source) - BUG("tried to pop config source, but we weren't reading config"); - ret = reader->source; - reader->source = reader->source->prev; - return ret; -} - static inline void config_reader_push_kvi(struct config_reader *reader, struct key_value_info *kvi) { @@ -1059,7 +1025,7 @@ static int do_event(struct config_source *cs, enum config_event_t type, if (data->previous_type != CONFIG_EVENT_EOF && data->opts->event_fn(data->previous_type, data->previous_offset, - offset, data->opts->event_fn_data) < 0) + offset, cs, data->opts->event_fn_data) < 0) return -1; data->previous_type = type; @@ -2020,8 +1986,7 @@ int git_default_config(const char *var, const char *value, void *cb) * fgetc, ungetc, ftell of top need to be initialized before calling * this function. */ -static int do_config_from(struct config_reader *reader, - struct config_source *top, config_fn_t fn, +static int do_config_from(struct config_source *top, config_fn_t fn, void *data, enum config_scope scope, const struct config_options *opts) { @@ -2034,21 +1999,17 @@ static int do_config_from(struct config_reader *reader, top->total_len = 0; strbuf_init(&top->value, 1024); strbuf_init(&top->var, 1024); - config_reader_push_source(reader, top); kvi_from_source(top, scope, &kvi); ret = git_parse_source(top, fn, &kvi, data, opts); - /* pop config-file parsing state stack */ strbuf_release(&top->value); strbuf_release(&top->var); - config_reader_pop_source(reader); return ret; } -static int do_config_from_file(struct config_reader *reader, - config_fn_t fn, +static int do_config_from_file(config_fn_t fn, const enum config_origin_type origin_type, const char *name, const char *path, FILE *f, void *data, enum config_scope scope, @@ -2067,7 +2028,7 @@ static int do_config_from_file(struct config_reader *reader, top.do_ftell = config_file_ftell; flockfile(f); - ret = do_config_from(reader, &top, fn, data, scope, opts); + ret = do_config_from(&top, fn, data, scope, opts); funlockfile(f); return ret; @@ -2076,8 +2037,8 @@ static int do_config_from_file(struct config_reader *reader, static int git_config_from_stdin(config_fn_t fn, void *data, enum config_scope scope) { - return do_config_from_file(&the_reader, fn, CONFIG_ORIGIN_STDIN, "", - NULL, stdin, data, scope, NULL); + return do_config_from_file(fn, CONFIG_ORIGIN_STDIN, "", NULL, stdin, + data, scope, NULL); } int git_config_from_file_with_options(config_fn_t fn, const char *filename, @@ -2091,9 +2052,8 @@ int git_config_from_file_with_options(config_fn_t fn, const char *filename, BUG("filename cannot be NULL"); f = fopen_or_warn(filename, "r"); if (f) { - ret = do_config_from_file(&the_reader, fn, CONFIG_ORIGIN_FILE, - filename, filename, f, data, scope, - opts); + ret = do_config_from_file(fn, CONFIG_ORIGIN_FILE, filename, + filename, f, data, scope, opts); fclose(f); } return ret; @@ -2124,7 +2084,7 @@ int git_config_from_mem(config_fn_t fn, top.do_ungetc = config_buf_ungetc; top.do_ftell = config_buf_ftell; - return do_config_from(&the_reader, &top, fn, data, scope, opts); + return do_config_from(&top, fn, data, scope, opts); } int git_config_from_blob_oid(config_fn_t fn, @@ -3019,7 +2979,6 @@ void git_die_config(const char *key, const char *err, ...) */ struct config_store_data { - struct config_reader *config_reader; size_t baselen; char *key; int do_not_match; @@ -3065,11 +3024,10 @@ static int matches(const char *key, const char *value, (value && !regexec(store->value_pattern, value, 0, NULL, 0)); } -static int store_aux_event(enum config_event_t type, - size_t begin, size_t end, void *data) +static int store_aux_event(enum config_event_t type, size_t begin, size_t end, + struct config_source *cs, void *data) { struct config_store_data *store = data; - struct config_source *cs = store->config_reader->source; ALLOC_GROW(store->parsed, store->parsed_nr + 1, store->parsed_alloc); store->parsed[store->parsed_nr].begin = begin; @@ -3389,8 +3347,6 @@ int git_config_set_multivar_in_file_gently(const char *config_filename, size_t contents_sz; struct config_store_data store = CONFIG_STORE_INIT; - store.config_reader = &the_reader; - /* parse-key returns negative; flip the sign to feed exit(3) */ ret = 0 - git_config_parse_key(key, &store.key, &store.baselen); if (ret) @@ -3951,8 +3907,6 @@ static int reader_origin_type(struct config_reader *reader, { if (the_reader.config_kvi) *type = reader->config_kvi->origin_type; - else if(the_reader.source) - *type = reader->source->origin_type; else return 1; return 0; @@ -4005,8 +3959,6 @@ static int reader_config_name(struct config_reader *reader, const char **out) { if (the_reader.config_kvi) *out = reader->config_kvi->filename; - else if (the_reader.source) - *out = reader->source->name; else return 1; return 0; @@ -4039,7 +3991,7 @@ int current_config_line(void) if (the_reader.config_kvi) return the_reader.config_kvi->linenr; else - return the_reader.source->linenr; + BUG("current_config_line called outside config callback"); } int lookup_config(const char **mapping, int nr_mapping, const char *var) diff --git a/config.h b/config.h index f8bab9fdef4..525fc0d5e03 100644 --- a/config.h +++ b/config.h @@ -73,6 +73,7 @@ enum config_event_t { CONFIG_EVENT_ERROR }; +struct config_source; /* * The parser event function (if not NULL) is called with the event type and * the begin/end offsets of the parsed elements. @@ -82,6 +83,7 @@ enum config_event_t { */ typedef int (*config_parser_event_fn_t)(enum config_event_t type, size_t begin_offset, size_t end_offset, + struct config_source *cs, void *event_fn_data); struct config_options { @@ -101,6 +103,10 @@ struct config_options { const char *commondir; const char *git_dir; + /* + * event_fn and event_fn_data are for internal use only. Handles events + * emitted by the config parser. + */ config_parser_event_fn_t event_fn; void *event_fn_data; enum config_error_action { From patchwork Fri Apr 21 19:13:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220607 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3B3D2C7618E for ; Fri, 21 Apr 2023 19:13:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233464AbjDUTNa (ORCPT ); Fri, 21 Apr 2023 15:13:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37960 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233417AbjDUTN0 (ORCPT ); Fri, 21 Apr 2023 15:13:26 -0400 Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8AF2A10DA for ; Fri, 21 Apr 2023 12:13:24 -0700 (PDT) Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-3f1728c2a57so21818455e9.0 for ; Fri, 21 Apr 2023 12:13:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104404; x=1684696404; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=UPfRS8xz+S8liJ8a8okyP16iGqD5WcF5yfvBfyZgQaA=; b=SdYh+ig3Rmq4toidB4PQdsF3TTRXJFbFW9ZfUk5GIENqU0c097PNsbOuFH1zwqwVUL qRw7naLbCEj0e8qVrcor9GwW567FZiT3ZEAQA2WxTwmgU2aNO7rarIqOY4Nxa6+qQenJ vbdfFTGMk/c8H1e20YMw1PCzswggd8aqqMu7o7jpWPARetqk/kJMOS6UxpuPcPkvVO/G M/CEh6wYVD2FO6dtV4aoQcXe+7NZAhtPQ+3uWTwCOi9qtNEzraoa1x8njK/UdxZ9VNdj GXsiPro+Lh5ExhC8PQi+l/Qn454dE9Q5OBv16SHQt7HEEdeYr8N64XAGh6mDrdbgSED6 pp6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104404; x=1684696404; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UPfRS8xz+S8liJ8a8okyP16iGqD5WcF5yfvBfyZgQaA=; b=O6IgEq+f5GwFPKMKcsq0n0CSJIa/kr1U5wYYbs3AFIKiPiBLCXjhgZDp03IHM1DV7o z1qAK2dvDV8X570LZiFGznrDBPu9wxbR3nMbe7EnHIooyv+Wgsya75rTKLW9/K/gGMzi DDDhTcsSC7NNhxxinGiHhOhfYPseDBRAlVYg9Yq/LIEQUt4A6+6zkC/m/4qyJVqmb1Fb i71gMyqnfQTt64xtmIpJNDSXmTwiy6hADseD70w+0WTuEyoI7HOUMwPaKTwGMbrrgSXa mgWx9R3n1JF3c86i7e4RXkxhCTP5TkTQxI9qFmcVVTNpP+xVS9NAft6nM6978U+ZmlSy YziQ== X-Gm-Message-State: AAQBX9erm6oG+ibSV+eOTa9OMNt5csyzBBHJfpckHtBTh5KFfDH1t7QY DD8Xf6W54yiNggnCwqvP1905GXw+D6w= X-Google-Smtp-Source: AKy350ZeW84ISgA313TufPa3ddfJWJbn6yoyVcIgmHZSX/bSn6gBtjaC+zK4k7RXVcoK2fba1udxcA== X-Received: by 2002:a05:600c:259:b0:3f1:8223:6683 with SMTP id 25-20020a05600c025900b003f182236683mr2480272wmj.40.1682104403936; Fri, 21 Apr 2023 12:13:23 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id q10-20020a05600c46ca00b003f1957ace1fsm1571163wmo.13.2023.04.21.12.13.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:23 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:10 +0000 Subject: [PATCH 06/14] config: inline git_color_default_config Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo git_color_default_config() is a shorthand for calling two other config callbacks. There are no other non-static functions that do this and it will complicate our refactoring of config_fn_t so inline it instead. Signed-off-by: Glen Choo --- builtin/branch.c | 5 ++++- builtin/clean.c | 6 ++++-- builtin/grep.c | 5 ++++- builtin/show-branch.c | 5 ++++- builtin/tag.c | 6 +++++- color.c | 8 -------- color.h | 6 +----- 7 files changed, 22 insertions(+), 19 deletions(-) diff --git a/builtin/branch.c b/builtin/branch.c index 6413a016c57..c6982181fd5 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -114,7 +114,10 @@ static int git_branch_config(const char *var, const char *value, void *cb) return 0; } - return git_color_default_config(var, value, cb); + if (git_color_config(var, value, cb) < 0) + return -1; + + return git_default_config(var, value, cb); } static const char *branch_get_color(enum color_branch ix) diff --git a/builtin/clean.c b/builtin/clean.c index 14c0d555eac..a06df48a269 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -129,8 +129,10 @@ static int git_clean_config(const char *var, const char *value, void *cb) return 0; } - /* inspect the color.ui config variable and others */ - return git_color_default_config(var, value, cb); + if (git_color_config(var, value, cb) < 0) + return -1; + + return git_default_config(var, value, cb); } static const char *clean_get_color(enum color_clean ix) diff --git a/builtin/grep.c b/builtin/grep.c index a1b68d90bdb..c880c9538d6 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -290,7 +290,10 @@ static int wait_all(void) static int grep_cmd_config(const char *var, const char *value, void *cb) { int st = grep_config(var, value, cb); - if (git_color_default_config(var, value, NULL) < 0) + + if (git_color_config(var, value, cb) < 0) + st = -1; + else if (git_default_config(var, value, cb) < 0) st = -1; if (!strcmp(var, "grep.threads")) { diff --git a/builtin/show-branch.c b/builtin/show-branch.c index 463a8d11c31..82ae2a7e475 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -576,7 +576,10 @@ static int git_show_branch_config(const char *var, const char *value, void *cb) return 0; } - return git_color_default_config(var, value, cb); + if (git_color_config(var, value, cb) < 0) + return -1; + + return git_default_config(var, value, cb); } static int omit_in_dense(struct commit *commit, struct commit **rev, int n) diff --git a/builtin/tag.c b/builtin/tag.c index 782bb3aa2ff..7245a4d30e6 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -204,7 +204,11 @@ static int git_tag_config(const char *var, const char *value, void *cb) if (starts_with(var, "column.")) return git_column_config(var, value, "tag", &colopts); - return git_color_default_config(var, value, cb); + + if (git_color_config(var, value, cb) < 0) + return -1; + + return git_default_config(var, value, cb); } static void write_tag_body(int fd, const struct object_id *oid) diff --git a/color.c b/color.c index 672dcbb73a6..9bdbffe928d 100644 --- a/color.c +++ b/color.c @@ -427,14 +427,6 @@ int git_color_config(const char *var, const char *value, void *cb UNUSED) return 0; } -int git_color_default_config(const char *var, const char *value, void *cb) -{ - if (git_color_config(var, value, cb) < 0) - return -1; - - return git_default_config(var, value, cb); -} - void color_print_strbuf(FILE *fp, const char *color, const struct strbuf *sb) { if (*color) diff --git a/color.h b/color.h index cfc8f841b23..bb28343be21 100644 --- a/color.h +++ b/color.h @@ -88,12 +88,8 @@ extern const int column_colors_ansi_max; */ extern int color_stdout_is_tty; -/* - * Use the first one if you need only color config; the second is a convenience - * if you are just going to change to git_default_config, too. - */ +/* Parse color config. */ int git_color_config(const char *var, const char *value, void *cb); -int git_color_default_config(const char *var, const char *value, void *cb); /* * Parse a config option, which can be a boolean or one of From patchwork Fri Apr 21 19:13:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220611 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 755CFC77B76 for ; Fri, 21 Apr 2023 19:13:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233502AbjDUTNu (ORCPT ); Fri, 21 Apr 2023 15:13:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38146 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233465AbjDUTNa (ORCPT ); Fri, 21 Apr 2023 15:13:30 -0400 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 243D81FFB for ; Fri, 21 Apr 2023 12:13:27 -0700 (PDT) Received: by mail-wm1-x32b.google.com with SMTP id 5b1f17b1804b1-3f17e584462so21345285e9.2 for ; Fri, 21 Apr 2023 12:13:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104405; x=1684696405; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=A+g+cseGWF0n6yWo2TnbosWxiSzW8KXbJjRoZoq3BCE=; b=sclxW8axBwIB0Oip4dDaQy3CzRMvXuqlJ9PXddUgM9tW1q38GwEDEShSFji02aRp5m MeHhD+kYXwBDSMXUJzo4MY+0V2Xs0k0yfMDn7nzIaIRS8tW0zCGlaPUn3mm8IFOyHTIB RCsST+mDWGsqpE9+O5iitduC3iHIsBoe5IZUal0W56QFLmypxArj13ZZgWTe8vH75yWa 39NNbdwK/OTioRmf/kk4Kw5QwQg3xpQKi/S0efzfaLaeXV0Rq/vAxmun2DpmHZPN8djE Pr1wIrkXmIkPwzp/kNent7nSyGBM0INc8jn1lIjsAa3VEjjsq818nJ28Xg5ceUKQ5x+5 0LUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104405; x=1684696405; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=A+g+cseGWF0n6yWo2TnbosWxiSzW8KXbJjRoZoq3BCE=; b=HkK5LE3X30s4Oo7mnQ8djHVVvfEl5k9HNO2rADZ6GOHvPZv/es6/wMui4+XxsRg6jU DH1TC9ATROETuDh/N7aAuD4FGzT/SutSCsr2OX9m0Rnng+PnLKGnCePIpjHhUEhY7aQ0 0qbhbsGwDtUUrtuZv8Knndccd2dS61y+zYiAkP0rHM0cm4/j7F/yN4rs470a6jqmRs/Z Wi8Qj7+Jskk2ymOZxxcdHqDwvFrr66W99rlEHWztKgX2eD9YW7zUQvJ2w0nNO4g74WVx Sa2egL1rcP9uXO74UYCpyibNOpwL9fJU1IPeJfFX88E4+HVJOAMwvzSFFhar0mX+zf8u 3OQA== X-Gm-Message-State: AAQBX9eyIEzcwFK+SezBptdoT3tQHLOpoAf5+BAHCCxyJJUtablvi6T8 4dYu3TkPkqI26tHCoOHcVygXZvuMVm0= X-Google-Smtp-Source: AKy350aUz0KCYPh0uN1LJimceCJBlEPHDKqwkxWYeQy/k2TnZm6tUhvbWZvGniax78XI8fsJUUBIKg== X-Received: by 2002:a7b:c003:0:b0:3f1:885f:2e52 with SMTP id c3-20020a7bc003000000b003f1885f2e52mr2571398wmb.16.1682104404664; Fri, 21 Apr 2023 12:13:24 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id u8-20020a7bc048000000b003f1952a4bdesm1764569wmc.26.2023.04.21.12.13.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:24 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:11 +0000 Subject: [PATCH 07/14] urlmatch.h: use config_fn_t type Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo These are actually used as config callbacks, so use the typedef-ed type and make future refactors easier. Signed-off-by: Glen Choo --- urlmatch.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/urlmatch.h b/urlmatch.h index 9f40b00bfb8..bee374a642c 100644 --- a/urlmatch.h +++ b/urlmatch.h @@ -2,6 +2,7 @@ #define URL_MATCH_H #include "string-list.h" +#include "config.h" struct url_info { /* normalized url on success, must be freed, otherwise NULL */ @@ -48,8 +49,8 @@ struct urlmatch_config { const char *key; void *cb; - int (*collect_fn)(const char *var, const char *value, void *cb); - int (*cascade_fn)(const char *var, const char *value, void *cb); + config_fn_t collect_fn; + config_fn_t cascade_fn; /* * Compare the two matches, the one just discovered and the existing * best match and return a negative value if the found item is to be From patchwork Fri Apr 21 19:13:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220612 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2B7B7C7618E for ; Fri, 21 Apr 2023 19:13:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233517AbjDUTNv (ORCPT ); Fri, 21 Apr 2023 15:13:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38342 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233450AbjDUTNf (ORCPT ); Fri, 21 Apr 2023 15:13:35 -0400 Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F24291FF6 for ; Fri, 21 Apr 2023 12:13:26 -0700 (PDT) Received: by mail-wm1-x32d.google.com with SMTP id 5b1f17b1804b1-3f191c1a8a7so7405985e9.1 for ; Fri, 21 Apr 2023 12:13:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104405; x=1684696405; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=ug6N0lXLlD10R2gkLAtlCgygX6Ohv02n1hnop4ghWo8=; b=WaZ4XCORsju+6sRfMc4LHoI5Zo1Ftlc5U/uDaj/0b1vjTYsRMVze2uPScBdtoNlzsX lrUPT7iaYDmj+/Cr8rKqAUcPOjvk9p/zsttXSL+VyDQb3j16RCpriTJVef6UtyZBkOgt XHTWU6jNnpj5bAy8/jQI9ocK2v4iVGNDa5jHre2fZkpHmX57/k4DjiyB6mnVh7LVyuT0 IH+3mRwTIHTJmGErjFcOY7m2+mmwoMwusEkMPsdtSbCKmg6k6PQYmkwpKZErD2GNzXR3 ZgYh0bpcldH1S0WZQDDN6sDi+ePmhIKYcNguKadm2844VdUdxyUP6xJv7b7QJVqetTLE KVoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104405; x=1684696405; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ug6N0lXLlD10R2gkLAtlCgygX6Ohv02n1hnop4ghWo8=; b=kZT3KyNNLAvr7afB8l9PWt4o0ZhcGKDPX7FjTqkwUCdQNu3N+ptaOyAI5CHcARKNiP wb7o5VEOJ8+CExfIzfRcA0Tzbci31VnglxAx6Xv0oUxzNUdS4gMTaMp8xmPEpLGWk7KC +Jf3b++ahiAg6Ij+t8UKg7cJ5ojUmc4xiHEmklSYFV/gV4qj9QsktDpYLhSuRgxyySnw Xd8mUaQaaU0nRW5TvOrpXSDieXLg8nIEQDkZejQj7wFrlwr/YoeZ/TsoasU6mEbk91yb rOI4nvNaNVk2Y/01pYydXPTxrD/0Uun0wpyQE0RF+5XEPxIvDnN3A0cOopHCU01cdohR JI4w== X-Gm-Message-State: AAQBX9fxOp4UlzuL8lxZUCxoXwSAjCP+a2cQOEg+vfqFnUj8TFZij6pr iHWxOYSP1C1oP0X1BvD0GlemEnHIDPM= X-Google-Smtp-Source: AKy350bNlWCEPho1WrYz1Co9chSlZqh2BSA+2CIozngOxmvbE3v7l/cDc4o1ZqZtT7+XnAVuDH5qKA== X-Received: by 2002:a1c:730a:0:b0:3f1:7517:803d with SMTP id d10-20020a1c730a000000b003f17517803dmr2558144wmb.4.1682104405112; Fri, 21 Apr 2023 12:13:25 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id r6-20020a05600c458600b003f195d540d9sm1151846wmo.14.2023.04.21.12.13.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:24 -0700 (PDT) Message-Id: <961d06f89cb667c31a4a2c8f41fdd9a2bfda04f8.1682104399.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:12 +0000 Subject: [PATCH 08/14] (RFC-only) config: add kvi arg to config_fn_t Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo ..without actually changing any of its implementations. This commit does not build - I've split this out for readability, but post-RFC I will squash this with the rest of the refactor + cocci changes. Signed-off-by: Glen Choo --- config.c | 2 +- config.h | 20 +-- .../coccinelle/config_fn_kvi.pending.cocci | 146 ++++++++++++++++++ 3 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 contrib/coccinelle/config_fn_kvi.pending.cocci diff --git a/config.c b/config.c index 147e422a27b..758d6a5cc3b 100644 --- a/config.c +++ b/config.c @@ -617,7 +617,7 @@ static int kvi_fn(config_fn_t fn, const char *key, const char *value, { int ret; config_reader_push_kvi(&the_reader, kvi); - ret = fn(key, value, data); + ret = fn(key, value, kvi, data); config_reader_pop_kvi(&the_reader); return ret; } diff --git a/config.h b/config.h index 525fc0d5e03..2c7b7399691 100644 --- a/config.h +++ b/config.h @@ -117,6 +117,15 @@ struct config_options { } error_action; }; +struct key_value_info { + const char *filename; + int linenr; + enum config_origin_type origin_type; + enum config_scope scope; + const char *path; + struct key_value_info *prev; +}; + /** * A config callback function takes three parameters: * @@ -135,7 +144,7 @@ struct config_options { * A config callback should return 0 for success, or -1 if the variable * could not be parsed properly. */ -typedef int (*config_fn_t)(const char *, const char *, void *); +typedef int (*config_fn_t)(const char *, const char *, struct key_value_info *, void *); int git_default_config(const char *, const char *, void *); @@ -675,15 +684,6 @@ int git_config_get_expiry(const char *key, const char **output); /* parse either "this many days" integer, or "5.days.ago" approxidate */ int git_config_get_expiry_in_days(const char *key, timestamp_t *, timestamp_t now); -struct key_value_info { - const char *filename; - int linenr; - enum config_origin_type origin_type; - enum config_scope scope; - const char *path; - struct key_value_info *prev; -}; - /** * First prints the error message specified by the caller in `err` and then * dies printing the line number and the file name of the highest priority diff --git a/contrib/coccinelle/config_fn_kvi.pending.cocci b/contrib/coccinelle/config_fn_kvi.pending.cocci new file mode 100644 index 00000000000..d4c84599afa --- /dev/null +++ b/contrib/coccinelle/config_fn_kvi.pending.cocci @@ -0,0 +1,146 @@ +// These are safe to apply to *.c *.h builtin/*.c + +@ get_fn @ +identifier fn, R; +@@ +( +( +git_config_from_file +| +git_config_from_file_with_options +| +git_config_from_mem +| +git_config_from_blob_oid +| +read_early_config +| +read_very_early_config +| +config_with_options +| +git_config +| +git_protected_config +| +config_from_gitmodules +) + (fn, ...) +| +repo_config(R, fn, ...) +) + +@ extends get_fn @ +identifier C1, C2, D; +@@ +int fn(const char *C1, const char *C2, ++ struct key_value_info *kvi, + void *D); + +@ extends get_fn @ +@@ +int fn(const char *, const char *, ++ struct key_value_info *, + void *); + +@ extends get_fn @ +// Don't change fns that look like callback fns but aren't +identifier fn2 != tar_filter_config && != git_diff_heuristic_config && + != git_default_submodule_config && != git_color_config && + != bundle_list_update && != parse_object_filter_config; +identifier C1, C2, D1, D2, S; +attribute name UNUSED; +@@ +int fn(const char *C1, const char *C2, ++ struct key_value_info *kvi, + void *D1) { +<+... +( +fn2(C1, C2, ++ kvi, +D2); +| +if(fn2(C1, C2, ++ kvi, +D2) < 0) { ... } +| +return fn2(C1, C2, ++ kvi, +D2); +| +S = fn2(C1, C2, ++ kvi, +D2); +) +...+> + } + +@ extends get_fn@ +identifier C1, C2, D; +attribute name UNUSED; +@@ +int fn(const char *C1, const char *C2, ++ struct key_value_info *kvi UNUSED, + void *D) {...} + + +// The previous rules don't catch all callbacks, especially if they're defined +// in a separate file from the git_config() call. Fix these manually. +@@ +identifier C1, C2, D; +attribute name UNUSED; +@@ +int +( +git_ident_config +| +urlmatch_collect_fn +| +write_one_config +| +forbid_remote_url +| +credential_config_callback +) + (const char *C1, const char *C2, ++ struct key_value_info *kvi UNUSED, + void *D) {...} + +@@ +identifier C1, C2, D, D2, S, fn2; +@@ +int +( +http_options +| +git_status_config +| +git_commit_config +| +git_default_core_config +| +grep_config +) + (const char *C1, const char *C2, ++ struct key_value_info *kvi, + void *D) { +<+... +( +fn2(C1, C2, ++ kvi, +D2); +| +if(fn2(C1, C2, ++ kvi, +D2) < 0) { ... } +| +return fn2(C1, C2, ++ kvi, +D2); +| +S = fn2(C1, C2, ++ kvi, +D2); +) +...+> + } From patchwork Fri Apr 21 19:13:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philippe Blain via GitGitGadget X-Patchwork-Id: 13220617 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 32DE2C7618E for ; Fri, 21 Apr 2023 19:14:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233562AbjDUTOR (ORCPT ); Fri, 21 Apr 2023 15:14:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38892 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233450AbjDUTN6 (ORCPT ); Fri, 21 Apr 2023 15:13:58 -0400 Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A192A30CA for ; Fri, 21 Apr 2023 12:13:28 -0700 (PDT) Received: by mail-wr1-x431.google.com with SMTP id ffacd0b85a97d-3010889c6ebso1298425f8f.2 for ; Fri, 21 Apr 2023 12:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104407; x=1684696407; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=LrOfQL86duEp3XC0m3WNIALPgoOqAppp7gvKhiKTpJw=; b=EBsXqZCqGsXJ8O3goYxM6Eod7JS5KUaVRkgIdfcyaMFyzPrQxHvuYoVQP4mTGNLXLo ZVoGSTtrX3xovUf2oEbEN5Hno1Tias1cZ8+C7vD1Ac9OGjyCU062o+UBVNI2dmyQ89KF DZ12VjOJzd9gkFsEQGacok8SoZgxfGy76MKvtBg/a+07woS26300QY7ZBz8LccE6is2b KbP1SaxSqgxDMBcikie88tke8GLfcuEHK/eIMj7or15rhETrhQCHiLP7IP9eBMct57Xd B6Gb7p6vcVQuHHrYWNSk2PGjzahgMc6MhDTsMIpkFyj2FkulTyUdggnz4J2XOAyWM39v V2UQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104407; x=1684696407; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LrOfQL86duEp3XC0m3WNIALPgoOqAppp7gvKhiKTpJw=; b=j77QhSiPpH9UjmisEXuJ9FVv+BwGvkltnxaWzQR+CUVPR1z3uoWFOyvsVUOlHcTWuw yC971GQz/hHmwmu9+IWLg8gKd+gzDFU9uUe8OPwyOXOci6FiUDy7sYJUGIO+HuDx0tTc yCbFFCDJqPAMjuny082sB5WFutpSN9NxLHJuJUnJuJQrGQexgtGBoySWqYTf6n+sPmWV syOCwXOtHyt0k8KzQDaqzm6c81nqeFrfwIa/nZlPoSlLTXXzFrtusfxEdHmrL2/KjhlW HRzyrH8xb2fhx2z1EudtBlxpSqWw9ttnxeyxV2ijROOkAt0AL5I/kZ4Jh+/NW8wVljx8 KUjA== X-Gm-Message-State: AAQBX9e4vAtf9AKMwIHKfkxbOo6vdKeFXt4jDoVvWvTkNvZ8/6wHurpn nZOZjpPJuIaROxiXmRYIqoehTf7wBlU= X-Google-Smtp-Source: AKy350ZpA3lpI2m/6l9+hXgr7mZ90dd8dtr40OUgGZTUtGRHT/TRa2FIcJuFs8Pft9JZgGsXNYL2fA== X-Received: by 2002:a5d:4f05:0:b0:2ef:baa1:f3fc with SMTP id c5-20020a5d4f05000000b002efbaa1f3fcmr4128755wru.19.1682104406021; Fri, 21 Apr 2023 12:13:26 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id bi26-20020a05600c3d9a00b003eddc6aa5fasm5206051wmb.39.2023.04.21.12.13.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:25 -0700 (PDT) Message-Id: <5eb3874b49431e0d204735fe959f628367159735.1682104399.git.gitgitgadget@gmail.com> In-Reply-To: References: From: "Glen Choo via GitGitGadget" Date: Fri, 21 Apr 2023 19:13:13 +0000 Subject: [PATCH 09/14] (RFC-only) config: apply cocci to config_fn_t implementations Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo Pass "struct key_value_info" to *most* functions that are invoked as "config_fn_t" callbacks by applying contrib/coccinelle/config_fn_kvi.pending.cocci. None of the functions actually use the "kvi" arg yet (besides propagating it to a function that now expects "kvi"), but this will be addressed in a later commit. When deciding whether or not to propagate "kvi" to an inner function, only propagate the "kvi" arg if the inner function is actually invoked elsewhere as a config callback; it does not matter whether the function happens have the same signature as config_fn_t. This commit does not build and has several style issues (e.g. a lack of spacing around the "kvi" arg), but I've split this out for the RFC so that it's more obvious which changes are automatic vs manual. Post-RFC I will squash this with the rest of the refactor + cocci changes. Signed-off-by: Glen Choo --- alias.c | 3 ++- archive-tar.c | 3 ++- archive-zip.c | 1 + builtin/add.c | 5 +++-- builtin/blame.c | 5 +++-- builtin/branch.c | 5 +++-- builtin/cat-file.c | 5 +++-- builtin/checkout.c | 5 +++-- builtin/clean.c | 5 +++-- builtin/clone.c | 8 +++++--- builtin/column.c | 3 ++- builtin/commit-graph.c | 1 + builtin/commit.c | 10 ++++++---- builtin/config.c | 10 +++++++--- builtin/difftool.c | 5 +++-- builtin/fetch.c | 8 +++++--- builtin/fsmonitor--daemon.c | 5 +++-- builtin/grep.c | 5 +++-- builtin/help.c | 5 +++-- builtin/index-pack.c | 5 +++-- builtin/log.c | 10 ++++++---- builtin/merge.c | 7 ++++--- builtin/multi-pack-index.c | 1 + builtin/pack-objects.c | 5 +++-- builtin/patch-id.c | 5 +++-- builtin/pull.c | 5 +++-- builtin/push.c | 5 +++-- builtin/read-tree.c | 5 +++-- builtin/rebase.c | 5 +++-- builtin/receive-pack.c | 5 +++-- builtin/reflog.c | 7 ++++--- builtin/remote.c | 6 ++++-- builtin/repack.c | 5 +++-- builtin/reset.c | 5 +++-- builtin/send-pack.c | 5 +++-- builtin/show-branch.c | 5 +++-- builtin/stash.c | 5 +++-- builtin/submodule--helper.c | 1 + builtin/tag.c | 5 +++-- builtin/var.c | 5 +++-- builtin/worktree.c | 5 +++-- bundle-uri.c | 8 ++++++-- config.c | 28 ++++++++++++++++++---------- config.h | 3 ++- connect.c | 4 ++-- convert.c | 4 +++- credential.c | 1 + delta-islands.c | 3 ++- diff.c | 10 ++++++---- diff.h | 6 ++++-- fetch-pack.c | 5 +++-- fmt-merge-msg.c | 5 +++-- fmt-merge-msg.h | 3 ++- fsck.c | 8 +++++--- fsck.h | 3 ++- gpg-interface.c | 6 ++++-- grep.c | 3 ++- help.c | 7 +++++-- ident.c | 3 ++- ident.h | 3 ++- imap-send.c | 5 +++-- ll-merge.c | 1 + ls-refs.c | 2 +- mailinfo.c | 5 +++-- notes-utils.c | 3 ++- notes.c | 3 ++- pager.c | 5 ++++- pretty.c | 1 + promisor-remote.c | 4 +++- remote.c | 3 ++- revision.c | 3 ++- scalar.c | 3 ++- sequencer.c | 8 +++++--- setup.c | 15 ++++++++++----- submodule-config.c | 15 +++++++++++---- t/helper/test-config.c | 9 ++++++--- t/helper/test-userdiff.c | 4 +++- trace2/tr2_cfg.c | 3 ++- trace2/tr2_sysenv.c | 3 ++- trailer.c | 2 ++ upload-pack.c | 8 ++++++-- urlmatch.c | 3 ++- urlmatch.h | 3 ++- xdiff-interface.c | 5 +++-- xdiff-interface.h | 3 ++- 85 files changed, 285 insertions(+), 156 deletions(-) diff --git a/alias.c b/alias.c index e814948ced3..38c51038a13 100644 --- a/alias.c +++ b/alias.c @@ -11,7 +11,8 @@ struct config_alias_data { struct string_list *list; }; -static int config_alias_cb(const char *key, const char *value, void *d) +static int config_alias_cb(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *d) { struct config_alias_data *data = d; const char *p; diff --git a/archive-tar.c b/archive-tar.c index 497dad0b3af..dcfbce5225a 100644 --- a/archive-tar.c +++ b/archive-tar.c @@ -410,7 +410,8 @@ static int tar_filter_config(const char *var, const char *value, return 0; } -static int git_tar_config(const char *var, const char *value, void *cb) +static int git_tar_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { if (!strcmp(var, "tar.umask")) { if (value && !strcmp(value, "user")) { diff --git a/archive-zip.c b/archive-zip.c index e6f5c10a14f..0b028246689 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -616,6 +616,7 @@ static void dos_time(timestamp_t *timestamp, int *dos_date, int *dos_time) } static int archive_zip_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data UNUSED) { return userdiff_config(var, value); diff --git a/builtin/add.c b/builtin/add.c index f12054d9be1..f8e42e05b07 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -355,7 +355,8 @@ static struct option builtin_add_options[] = { OPT_END(), }; -static int add_config(const char *var, const char *value, void *cb) +static int add_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "add.ignoreerrors") || !strcmp(var, "add.ignore-errors")) { @@ -363,7 +364,7 @@ static int add_config(const char *var, const char *value, void *cb) return 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static const char embedded_advice[] = N_( diff --git a/builtin/blame.c b/builtin/blame.c index a8d2114adc9..0aafc8172e2 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -692,7 +692,8 @@ static const char *add_prefix(const char *prefix, const char *path) return prefix_path(prefix, prefix ? strlen(prefix) : 0, path); } -static int git_blame_config(const char *var, const char *value, void *cb) +static int git_blame_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "blame.showroot")) { show_root = git_config_bool(var, value); @@ -765,7 +766,7 @@ static int git_blame_config(const char *var, const char *value, void *cb) if (userdiff_config(var, value) < 0) return -1; - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static int blame_copy_callback(const struct option *option, const char *arg, int unset) diff --git a/builtin/branch.c b/builtin/branch.c index c6982181fd5..26091a036d2 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -80,7 +80,8 @@ static unsigned int colopts; define_list_config_array(color_branch_slots); -static int git_branch_config(const char *var, const char *value, void *cb) +static int git_branch_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { const char *slot_name; @@ -117,7 +118,7 @@ static int git_branch_config(const char *var, const char *value, void *cb) if (git_color_config(var, value, cb) < 0) return -1; - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static const char *branch_get_color(enum color_branch ix) diff --git a/builtin/cat-file.c b/builtin/cat-file.c index 04d4bb6c777..b1e0e95d631 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -882,12 +882,13 @@ static int batch_objects(struct batch_options *opt) return retval; } -static int git_cat_file_config(const char *var, const char *value, void *cb) +static int git_cat_file_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (userdiff_config(var, value) < 0) return -1; - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static int batch_option_callback(const struct option *opt, diff --git a/builtin/checkout.c b/builtin/checkout.c index 38a8cd6a965..92017ba6696 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -1182,7 +1182,8 @@ static int switch_branches(const struct checkout_opts *opts, return ret || writeout_error; } -static int git_checkout_config(const char *var, const char *value, void *cb) +static int git_checkout_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { struct checkout_opts *opts = cb; @@ -1198,7 +1199,7 @@ static int git_checkout_config(const char *var, const char *value, void *cb) if (starts_with(var, "submodule.")) return git_default_submodule_config(var, value, NULL); - return git_xmerge_config(var, value, NULL); + return git_xmerge_config(var, value,kvi, NULL); } static void setup_new_branch_info_and_source_tree( diff --git a/builtin/clean.c b/builtin/clean.c index a06df48a269..1c648276ebf 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -102,7 +102,8 @@ struct menu_stuff { define_list_config_array(color_interactive_slots); -static int git_clean_config(const char *var, const char *value, void *cb) +static int git_clean_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { const char *slot_name; @@ -132,7 +133,7 @@ static int git_clean_config(const char *var, const char *value, void *cb) if (git_color_config(var, value, cb) < 0) return -1; - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static const char *clean_get_color(enum color_clean ix) diff --git a/builtin/clone.c b/builtin/clone.c index 6dc89f1058b..1e1cf104194 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -775,7 +775,8 @@ static int checkout(int submodule_progress, int filter_submodules) return err; } -static int git_clone_config(const char *k, const char *v, void *cb) +static int git_clone_config(const char *k, const char *v, + struct key_value_info *kvi, void *cb) { if (!strcmp(k, "clone.defaultremotename")) { free(remote_name); @@ -786,10 +787,11 @@ static int git_clone_config(const char *k, const char *v, void *cb) if (!strcmp(k, "clone.filtersubmodules")) config_filter_submodules = git_config_bool(k, v); - return git_default_config(k, v, cb); + return git_default_config(k, v,kvi, cb); } -static int write_one_config(const char *key, const char *value, void *data) +static int write_one_config(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *data) { /* * give git_clone_config a chance to write config values back to the diff --git a/builtin/column.c b/builtin/column.c index de623a16c2d..30cfbed62ec 100644 --- a/builtin/column.c +++ b/builtin/column.c @@ -13,7 +13,8 @@ static const char * const builtin_column_usage[] = { }; static unsigned int colopts; -static int column_config(const char *var, const char *value, void *cb) +static int column_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { return git_column_config(var, value, cb, &colopts); } diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c index 90114269761..e811866b5dd 100644 --- a/builtin/commit-graph.c +++ b/builtin/commit-graph.c @@ -185,6 +185,7 @@ static int write_option_max_new_filters(const struct option *opt, } static int git_commit_graph_write_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb UNUSED) { if (!strcmp(var, "commitgraph.maxnewfilters")) diff --git a/builtin/commit.c b/builtin/commit.c index 9d8e1ea91a3..ec468e87039 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -1402,7 +1402,8 @@ static int parse_status_slot(const char *slot) return LOOKUP_CONFIG(color_status_slots, slot); } -static int git_status_config(const char *k, const char *v, void *cb) +static int git_status_config(const char *k, const char *v, + struct key_value_info *kvi, void *cb) { struct wt_status *s = cb; const char *slot_name; @@ -1487,7 +1488,7 @@ static int git_status_config(const char *k, const char *v, void *cb) s->detect_rename = git_config_rename(k, v); return 0; } - return git_diff_ui_config(k, v, NULL); + return git_diff_ui_config(k, v,kvi, NULL); } int cmd_status(int argc, const char **argv, const char *prefix) @@ -1602,7 +1603,8 @@ int cmd_status(int argc, const char **argv, const char *prefix) return 0; } -static int git_commit_config(const char *k, const char *v, void *cb) +static int git_commit_config(const char *k, const char *v, + struct key_value_info *kvi, void *cb) { struct wt_status *s = cb; @@ -1624,7 +1626,7 @@ static int git_commit_config(const char *k, const char *v, void *cb) return 0; } - return git_status_config(k, v, s); + return git_status_config(k, v,kvi, s); } int cmd_commit(int argc, const char **argv, const char *prefix) diff --git a/builtin/config.c b/builtin/config.c index fe79fb60c43..b2ad7351d0a 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -214,7 +214,7 @@ static void show_config_scope(struct strbuf *buf) } static int show_all_config(const char *key_, const char *value_, - void *cb UNUSED) + struct key_value_info *kvi UNUSED, void *cb UNUSED) { if (show_origin || show_scope) { struct strbuf buf = STRBUF_INIT; @@ -298,7 +298,8 @@ static int format_config(struct strbuf *buf, const char *key_, const char *value return 0; } -static int collect_config(const char *key_, const char *value_, void *cb) +static int collect_config(const char *key_, const char *value_, + struct key_value_info *kvi UNUSED, void *cb) { struct strbuf_list *values = cb; @@ -466,6 +467,7 @@ static const char *get_colorbool_slot; static char parsed_color[COLOR_MAXLEN]; static int git_get_color_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb UNUSED) { if (!strcmp(var, get_color_slot)) { @@ -498,6 +500,7 @@ static int get_colorbool_found; static int get_diff_color_found; static int get_color_ui_found; static int git_get_colorbool_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data UNUSED) { if (!strcmp(var, get_colorbool_slot)) @@ -555,7 +558,8 @@ struct urlmatch_current_candidate_value { struct strbuf value; }; -static int urlmatch_collect_fn(const char *var, const char *value, void *cb) +static int urlmatch_collect_fn(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { struct string_list *values = cb; struct string_list_item *item = string_list_insert(values, var); diff --git a/builtin/difftool.c b/builtin/difftool.c index e010a21bfbc..d4d149bcf6b 100644 --- a/builtin/difftool.c +++ b/builtin/difftool.c @@ -38,14 +38,15 @@ static const char *const builtin_difftool_usage[] = { NULL }; -static int difftool_config(const char *var, const char *value, void *cb) +static int difftool_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "difftool.trustexitcode")) { trust_exit_code = git_config_bool(var, value); return 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static int print_tool_help(void) diff --git a/builtin/fetch.c b/builtin/fetch.c index 85bd2801036..aa688291613 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -100,7 +100,8 @@ static int fetch_write_commit_graph = -1; static int stdin_refspecs = 0; static int negotiate_only; -static int git_fetch_config(const char *k, const char *v, void *cb) +static int git_fetch_config(const char *k, const char *v, + struct key_value_info *kvi, void *cb) { if (!strcmp(k, "fetch.prune")) { fetch_prune_config = git_config_bool(k, v); @@ -140,7 +141,7 @@ static int git_fetch_config(const char *k, const char *v, void *cb) return 0; } - return git_default_config(k, v, cb); + return git_default_config(k, v,kvi, cb); } static int parse_refmap_arg(const struct option *opt, const char *arg, int unset) @@ -1828,7 +1829,8 @@ struct remote_group_data { struct string_list *list; }; -static int get_remote_group(const char *key, const char *value, void *priv) +static int get_remote_group(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *priv) { struct remote_group_data *g = priv; diff --git a/builtin/fsmonitor--daemon.c b/builtin/fsmonitor--daemon.c index 42af6a2cc7e..a7375d61d02 100644 --- a/builtin/fsmonitor--daemon.c +++ b/builtin/fsmonitor--daemon.c @@ -36,7 +36,8 @@ static int fsmonitor__start_timeout_sec = 60; #define FSMONITOR__ANNOUNCE_STARTUP "fsmonitor.announcestartup" static int fsmonitor__announce_startup = 0; -static int fsmonitor_config(const char *var, const char *value, void *cb) +static int fsmonitor_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, FSMONITOR__IPC_THREADS)) { int i = git_config_int(var, value); @@ -66,7 +67,7 @@ static int fsmonitor_config(const char *var, const char *value, void *cb) return 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } /* diff --git a/builtin/grep.c b/builtin/grep.c index c880c9538d6..177befc3ed4 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -287,13 +287,14 @@ static int wait_all(void) return hit; } -static int grep_cmd_config(const char *var, const char *value, void *cb) +static int grep_cmd_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { int st = grep_config(var, value, cb); if (git_color_config(var, value, cb) < 0) st = -1; - else if (git_default_config(var, value, cb) < 0) + else if (git_default_config(var, value,kvi, cb) < 0) st = -1; if (!strcmp(var, "grep.threads")) { diff --git a/builtin/help.c b/builtin/help.c index 87333a02ec4..5d4a86c4b41 100644 --- a/builtin/help.c +++ b/builtin/help.c @@ -396,7 +396,8 @@ static int add_man_viewer_info(const char *var, const char *value) return 0; } -static int git_help_config(const char *var, const char *value, void *cb) +static int git_help_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "help.format")) { if (!value) @@ -419,7 +420,7 @@ static int git_help_config(const char *var, const char *value, void *cb) if (starts_with(var, "man.")) return add_man_viewer_info(var, value); - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static struct cmdnames main_cmds, other_cmds; diff --git a/builtin/index-pack.c b/builtin/index-pack.c index b17e79cd40f..4450510ddfc 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -1578,7 +1578,8 @@ static void final(const char *final_pack_name, const char *curr_pack_name, strbuf_release(&pack_name); } -static int git_index_pack_config(const char *k, const char *v, void *cb) +static int git_index_pack_config(const char *k, const char *v, + struct key_value_info *kvi, void *cb) { struct pack_idx_option *opts = cb; @@ -1605,7 +1606,7 @@ static int git_index_pack_config(const char *k, const char *v, void *cb) else opts->flags &= ~WRITE_REV; } - return git_default_config(k, v, cb); + return git_default_config(k, v,kvi, cb); } static int cmp_uint32(const void *a_, const void *b_) diff --git a/builtin/log.c b/builtin/log.c index 7d195789633..f8e61330491 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -559,7 +559,8 @@ static int cmd_log_walk(struct rev_info *rev) return retval; } -static int git_log_config(const char *var, const char *value, void *cb) +static int git_log_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { const char *slot_name; @@ -608,7 +609,7 @@ static int git_log_config(const char *var, const char *value, void *cb) return 0; } - return git_diff_ui_config(var, value, cb); + return git_diff_ui_config(var, value,kvi, cb); } int cmd_whatchanged(int argc, const char **argv, const char *prefix) @@ -974,7 +975,8 @@ static enum cover_from_description parse_cover_from_description(const char *arg) die(_("%s: invalid cover from description mode"), arg); } -static int git_format_config(const char *var, const char *value, void *cb) +static int git_format_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "format.headers")) { if (!value) @@ -1103,7 +1105,7 @@ static int git_format_config(const char *var, const char *value, void *cb) if (!strcmp(var, "diff.noprefix")) return 0; - return git_log_config(var, value, cb); + return git_log_config(var, value,kvi, cb); } static const char *output_directory = NULL; diff --git a/builtin/merge.c b/builtin/merge.c index a99be9610e9..492a83a900c 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -620,7 +620,8 @@ static void parse_branch_merge_options(char *bmo) free(argv); } -static int git_merge_config(const char *k, const char *v, void *cb) +static int git_merge_config(const char *k, const char *v, + struct key_value_info *kvi, void *cb) { int status; const char *str; @@ -665,10 +666,10 @@ static int git_merge_config(const char *k, const char *v, void *cb) return 0; } - status = fmt_merge_msg_config(k, v, cb); + status = fmt_merge_msg_config(k, v,kvi, cb); if (status) return status; - return git_diff_ui_config(k, v, cb); + return git_diff_ui_config(k, v,kvi, cb); } static int read_tree_trivial(struct object_id *common, struct object_id *head, diff --git a/builtin/multi-pack-index.c b/builtin/multi-pack-index.c index 1b5083f8b26..c3cd7163c84 100644 --- a/builtin/multi-pack-index.c +++ b/builtin/multi-pack-index.c @@ -82,6 +82,7 @@ static struct option *add_common_options(struct option *prev) } static int git_multi_pack_index_write_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb UNUSED) { if (!strcmp(var, "pack.writebitmaphashcache")) { diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 77d88f85b04..ca023000cc0 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -3134,7 +3134,8 @@ static void prepare_pack(int window, int depth) free(delta_list); } -static int git_pack_config(const char *k, const char *v, void *cb) +static int git_pack_config(const char *k, const char *v, + struct key_value_info *kvi, void *cb) { if (!strcmp(k, "pack.window")) { window = git_config_int(k, v); @@ -3226,7 +3227,7 @@ static int git_pack_config(const char *k, const char *v, void *cb) ex->uri = xstrdup(pack_end + 1); oidmap_put(&configured_exclusions, ex); } - return git_default_config(k, v, cb); + return git_default_config(k, v,kvi, cb); } /* Counters for trace2 output when in --stdin-packs mode. */ diff --git a/builtin/patch-id.c b/builtin/patch-id.c index 9d5585d3a72..9b4f5a71b87 100644 --- a/builtin/patch-id.c +++ b/builtin/patch-id.c @@ -196,7 +196,8 @@ struct patch_id_opts { int verbatim; }; -static int git_patch_id_config(const char *var, const char *value, void *cb) +static int git_patch_id_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { struct patch_id_opts *opts = cb; @@ -209,7 +210,7 @@ static int git_patch_id_config(const char *var, const char *value, void *cb) return 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } int cmd_patch_id(int argc, const char **argv, const char *prefix) diff --git a/builtin/pull.c b/builtin/pull.c index 5405d09f22f..1b244eee67c 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -359,7 +359,8 @@ static enum rebase_type config_get_rebase(int *rebase_unspecified) /** * Read config variables. */ -static int git_pull_config(const char *var, const char *value, void *cb) +static int git_pull_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "rebase.autostash")) { config_autostash = git_config_bool(var, value); @@ -372,7 +373,7 @@ static int git_pull_config(const char *var, const char *value, void *cb) check_trust_level = 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } /** diff --git a/builtin/push.c b/builtin/push.c index fa550b8f80a..65b79378b92 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -506,7 +506,8 @@ static void set_push_cert_flags(int *flags, int v) } -static int git_push_config(const char *k, const char *v, void *cb) +static int git_push_config(const char *k, const char *v, + struct key_value_info *kvi, void *cb) { const char *slot_name; int *flags = cb; @@ -573,7 +574,7 @@ static int git_push_config(const char *k, const char *v, void *cb) return 0; } - return git_default_config(k, v, NULL); + return git_default_config(k, v,kvi, NULL); } int cmd_push(int argc, const char **argv, const char *prefix) diff --git a/builtin/read-tree.c b/builtin/read-tree.c index 600d4f748fc..e9859b6157e 100644 --- a/builtin/read-tree.c +++ b/builtin/read-tree.c @@ -100,12 +100,13 @@ static int debug_merge(const struct cache_entry * const *stages, return 0; } -static int git_read_tree_config(const char *var, const char *value, void *cb) +static int git_read_tree_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "submodule.recurse")) return git_default_submodule_config(var, value, cb); - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix) diff --git a/builtin/rebase.c b/builtin/rebase.c index 680fe3c1453..1fd05d708b8 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -791,7 +791,8 @@ static void parse_rebase_merges_value(struct rebase_options *options, const char die(_("Unknown rebase-merges mode: %s"), value); } -static int rebase_config(const char *var, const char *value, void *data) +static int rebase_config(const char *var, const char *value, + struct key_value_info *kvi, void *data) { struct rebase_options *opts = data; @@ -850,7 +851,7 @@ static int rebase_config(const char *var, const char *value, void *data) return git_config_string(&opts->default_backend, var, value); } - return git_default_config(var, value, data); + return git_default_config(var, value,kvi, data); } static int checkout_up_to_date(struct rebase_options *options) diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 9109552533d..2f5fd2abbc3 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -135,7 +135,8 @@ static enum deny_action parse_deny_action(const char *var, const char *value) return DENY_IGNORE; } -static int receive_pack_config(const char *var, const char *value, void *cb) +static int receive_pack_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { int status = parse_hide_refs_config(var, value, "receive", &hidden_refs); @@ -262,7 +263,7 @@ static int receive_pack_config(const char *var, const char *value, void *cb) return 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static void show_ref(const char *path, const struct object_id *oid) diff --git a/builtin/reflog.c b/builtin/reflog.c index a1fa0c855f4..ecf21ac9c6e 100644 --- a/builtin/reflog.c +++ b/builtin/reflog.c @@ -108,7 +108,8 @@ static struct reflog_expire_cfg *find_cfg_ent(const char *pattern, size_t len) #define EXPIRE_TOTAL 01 #define EXPIRE_UNREACH 02 -static int reflog_expire_config(const char *var, const char *value, void *cb) +static int reflog_expire_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { const char *pattern, *key; size_t pattern_len; @@ -117,7 +118,7 @@ static int reflog_expire_config(const char *var, const char *value, void *cb) struct reflog_expire_cfg *ent; if (parse_config_key(var, "gc", &pattern, &pattern_len, &key) < 0) - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); if (!strcmp(key, "reflogexpire")) { slot = EXPIRE_TOTAL; @@ -128,7 +129,7 @@ static int reflog_expire_config(const char *var, const char *value, void *cb) if (git_config_expiry_date(&expire, var, value)) return -1; } else - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); if (!pattern) { switch (slot) { diff --git a/builtin/remote.c b/builtin/remote.c index 1e0b137d977..edb4a9ddd7f 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -268,6 +268,7 @@ static const char *abbrev_ref(const char *name, const char *prefix) #define abbrev_branch(name) abbrev_ref((name), "refs/heads/") static int config_read_branches(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *data UNUSED) { const char *orig_key = key; @@ -645,7 +646,7 @@ struct push_default_info }; static int config_read_push_default(const char *key, const char *value, - void *cb) + struct key_value_info *kvi UNUSED, void *cb) { struct push_default_info* info = cb; if (strcmp(key, "remote.pushdefault") || @@ -1494,7 +1495,8 @@ static int prune(int argc, const char **argv, const char *prefix) return result; } -static int get_remote_default(const char *key, const char *value UNUSED, void *priv) +static int get_remote_default(const char *key, const char *value UNUSED, + struct key_value_info *kvi UNUSED, void *priv) { if (strcmp(key, "remotes.default") == 0) { int *found = priv; diff --git a/builtin/repack.c b/builtin/repack.c index df4d8e0f0ba..7c8401b2227 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -58,7 +58,8 @@ struct pack_objects_args { int local; }; -static int repack_config(const char *var, const char *value, void *cb) +static int repack_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { struct pack_objects_args *cruft_po_args = cb; if (!strcmp(var, "repack.usedeltabaseoffset")) { @@ -90,7 +91,7 @@ static int repack_config(const char *var, const char *value, void *cb) return git_config_string(&cruft_po_args->depth, var, value); if (!strcmp(var, "repack.cruftthreads")) return git_config_string(&cruft_po_args->threads, var, value); - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } /* diff --git a/builtin/reset.c b/builtin/reset.c index 0ed329236c8..a04d46d7fdd 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -308,12 +308,13 @@ static int reset_refs(const char *rev, const struct object_id *oid) return update_ref_status; } -static int git_reset_config(const char *var, const char *value, void *cb) +static int git_reset_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "submodule.recurse")) return git_default_submodule_config(var, value, cb); - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } int cmd_reset(int argc, const char **argv, const char *prefix) diff --git a/builtin/send-pack.c b/builtin/send-pack.c index 4784143004d..b0c90e549b8 100644 --- a/builtin/send-pack.c +++ b/builtin/send-pack.c @@ -131,7 +131,8 @@ static void print_helper_status(struct ref *ref) strbuf_release(&buf); } -static int send_pack_config(const char *k, const char *v, void *cb) +static int send_pack_config(const char *k, const char *v, + struct key_value_info *kvi, void *cb) { if (!strcmp(k, "push.gpgsign")) { const char *value; @@ -151,7 +152,7 @@ static int send_pack_config(const char *k, const char *v, void *cb) } } } - return git_default_config(k, v, cb); + return git_default_config(k, v,kvi, cb); } int cmd_send_pack(int argc, const char **argv, const char *prefix) diff --git a/builtin/show-branch.c b/builtin/show-branch.c index 82ae2a7e475..ad8a391904e 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -556,7 +556,8 @@ static void append_one_rev(const char *av) die("bad sha1 reference %s", av); } -static int git_show_branch_config(const char *var, const char *value, void *cb) +static int git_show_branch_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "showbranch.default")) { if (!value) @@ -579,7 +580,7 @@ static int git_show_branch_config(const char *var, const char *value, void *cb) if (git_color_config(var, value, cb) < 0) return -1; - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static int omit_in_dense(struct commit *commit, struct commit **rev, int n) diff --git a/builtin/stash.c b/builtin/stash.c index 735d27039e1..689087d6240 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -836,7 +836,8 @@ static int show_stat = 1; static int show_patch; static int show_include_untracked; -static int git_stash_config(const char *var, const char *value, void *cb) +static int git_stash_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "stash.showstat")) { show_stat = git_config_bool(var, value); @@ -850,7 +851,7 @@ static int git_stash_config(const char *var, const char *value, void *cb) show_include_untracked = git_config_bool(var, value); return 0; } - return git_diff_basic_config(var, value, cb); + return git_diff_basic_config(var, value,kvi, cb); } static void diff_include_untracked(const struct stash_info *info, struct diff_options *diff_opt) diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 569068e6a2c..8570effbf0d 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -2187,6 +2187,7 @@ static int update_clone_task_finished(int result, } static int git_update_clone_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { int *max_jobs = cb; diff --git a/builtin/tag.c b/builtin/tag.c index 7245a4d30e6..626fe8c641e 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -183,7 +183,8 @@ static const char tag_template_nocleanup[] = "Lines starting with '%c' will be kept; you may remove them" " yourself if you want to.\n"); -static int git_tag_config(const char *var, const char *value, void *cb) +static int git_tag_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "tag.gpgsign")) { config_sign_tag = git_config_bool(var, value); @@ -208,7 +209,7 @@ static int git_tag_config(const char *var, const char *value, void *cb) if (git_color_config(var, value, cb) < 0) return -1; - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static void write_tag_body(int fd, const struct object_id *oid) diff --git a/builtin/var.c b/builtin/var.c index acb988d2d56..440add19bb5 100644 --- a/builtin/var.c +++ b/builtin/var.c @@ -69,13 +69,14 @@ static const struct git_var *get_git_var(const char *var) return NULL; } -static int show_config(const char *var, const char *value, void *cb) +static int show_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (value) printf("%s=%s\n", var, value); else printf("%s\n", var); - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } int cmd_var(int argc, const char **argv, const char *prefix UNUSED) diff --git a/builtin/worktree.c b/builtin/worktree.c index 39e9e5c9ce8..d5ccd741e87 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -103,14 +103,15 @@ static int verbose; static int guess_remote; static timestamp_t expire; -static int git_worktree_config(const char *var, const char *value, void *cb) +static int git_worktree_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "worktree.guessremote")) { guess_remote = git_config_bool(var, value); return 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static int delete_git_dir(const char *id) diff --git a/bundle-uri.c b/bundle-uri.c index 8c4e2b70b89..bb88ccbca4b 100644 --- a/bundle-uri.c +++ b/bundle-uri.c @@ -223,7 +223,9 @@ static int bundle_list_update(const char *key, const char *value, return 0; } -static int config_to_bundle_list(const char *key, const char *value, void *data) +static int config_to_bundle_list(const char *key, const char *value, + struct key_value_info *kvi UNUSED, + void *data) { struct bundle_list *list = data; return bundle_list_update(key, value, list); @@ -871,7 +873,9 @@ cached: return advertise_bundle_uri; } -static int config_to_packet_line(const char *key, const char *value, void *data) +static int config_to_packet_line(const char *key, const char *value, + struct key_value_info *kvi UNUSED, + void *data) { struct packet_reader *writer = data; diff --git a/config.c b/config.c index 758d6a5cc3b..60f8c0c666b 100644 --- a/config.c +++ b/config.c @@ -156,7 +156,8 @@ struct config_include_data { }; #define CONFIG_INCLUDE_INIT { 0 } -static int git_config_include(const char *var, const char *value, void *data); +static int git_config_include(const char *var, const char *value, + struct key_value_info *kvi, void *data); #define MAX_INCLUDE_DEPTH 10 static const char include_depth_advice[] = N_( @@ -336,7 +337,8 @@ static int include_by_branch(const char *cond, size_t cond_len) return ret; } -static int add_remote_url(const char *var, const char *value, void *data) +static int add_remote_url(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data) { struct string_list *remote_urls = data; const char *remote_name; @@ -364,6 +366,7 @@ static void populate_remote_urls(struct config_include_data *inc) } static int forbid_remote_url(const char *var, const char *value UNUSED, + struct key_value_info *kvi UNUSED, void *data UNUSED) { const char *remote_name; @@ -429,7 +432,8 @@ static int include_condition_is_true(struct key_value_info *kvi, static int kvi_fn(config_fn_t fn, const char *key, const char *value, struct key_value_info *kvi, void *data); -static int git_config_include(const char *var, const char *value, void *data) +static int git_config_include(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data) { struct config_include_data *inc = data; struct key_value_info *kvi = inc->config_reader->config_kvi; @@ -1541,7 +1545,8 @@ int git_config_color(char *dest, const char *var, const char *value) return 0; } -static int git_default_core_config(const char *var, const char *value, void *cb) +static int git_default_core_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { /* This needs a better name */ if (!strcmp(var, "core.filemode")) { @@ -1826,7 +1831,7 @@ static int git_default_core_config(const char *var, const char *value, void *cb) } /* Add other config variables here and to Documentation/config.txt. */ - return platform_core_config(var, value, cb); + return platform_core_config(var, value,kvi, cb); } static int git_default_sparse_config(const char *var, const char *value) @@ -1928,15 +1933,16 @@ static int git_default_mailmap_config(const char *var, const char *value) return 0; } -int git_default_config(const char *var, const char *value, void *cb) +int git_default_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (starts_with(var, "core.")) - return git_default_core_config(var, value, cb); + return git_default_core_config(var, value,kvi, cb); if (starts_with(var, "user.") || starts_with(var, "author.") || starts_with(var, "committer.")) - return git_ident_config(var, value, cb); + return git_ident_config(var, value,kvi, cb); if (starts_with(var, "i18n.")) return git_default_i18n_config(var, value); @@ -2455,7 +2461,8 @@ struct configset_add_data { }; #define CONFIGSET_ADD_INIT { 0 } -static int config_set_callback(const char *key, const char *value, void *cb) +static int config_set_callback(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { struct configset_add_data *data = cb; configset_add_value(data->config_reader, data->config_set, key, value); @@ -3063,7 +3070,8 @@ static int store_aux_event(enum config_event_t type, size_t begin, size_t end, return 0; } -static int store_aux(const char *key, const char *value, void *cb) +static int store_aux(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { struct config_store_data *store = cb; diff --git a/config.h b/config.h index 2c7b7399691..e4893e237e1 100644 --- a/config.h +++ b/config.h @@ -146,7 +146,8 @@ struct key_value_info { */ typedef int (*config_fn_t)(const char *, const char *, struct key_value_info *, void *); -int git_default_config(const char *, const char *, void *); +int git_default_config(const char *, const char *, struct key_value_info *, + void *); /** * Read a specific file in git-config format. diff --git a/connect.c b/connect.c index c0c8a38178c..72aad67a288 100644 --- a/connect.c +++ b/connect.c @@ -962,7 +962,7 @@ static struct child_process *git_tcp_connect(int fd[2], char *host, int flags) static char *git_proxy_command; static int git_proxy_command_options(const char *var, const char *value, - void *cb) + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "core.gitproxy")) { const char *for_pos; @@ -1008,7 +1008,7 @@ static int git_proxy_command_options(const char *var, const char *value, return 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static int git_use_proxy(const char *host) diff --git a/convert.c b/convert.c index da06e2f51cb..a563380e7e7 100644 --- a/convert.c +++ b/convert.c @@ -1011,7 +1011,9 @@ static int apply_filter(const char *path, const char *src, size_t len, return 0; } -static int read_convert_config(const char *var, const char *value, void *cb UNUSED) +static int read_convert_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, + void *cb UNUSED) { const char *key, *name; size_t namelen; diff --git a/credential.c b/credential.c index e6417bf8804..6b9b8bfbb79 100644 --- a/credential.c +++ b/credential.c @@ -46,6 +46,7 @@ static int credential_from_potentially_partial_url(struct credential *c, const char *url); static int credential_config_callback(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data) { struct credential *c = data; diff --git a/delta-islands.c b/delta-islands.c index 40f2ccfb550..404f9c07a42 100644 --- a/delta-islands.c +++ b/delta-islands.c @@ -341,7 +341,8 @@ static void free_remote_islands(kh_str_t *remote_islands) kh_destroy_str(remote_islands); } -static int island_config_callback(const char *k, const char *v, void *cb) +static int island_config_callback(const char *k, const char *v, + struct key_value_info *kvi UNUSED, void *cb) { struct island_load_data *ild = cb; diff --git a/diff.c b/diff.c index 78b0fdd8caa..d7ed2dc900b 100644 --- a/diff.c +++ b/diff.c @@ -350,7 +350,8 @@ static unsigned parse_color_moved_ws(const char *arg) return ret; } -int git_diff_ui_config(const char *var, const char *value, void *cb) +int git_diff_ui_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) { diff_use_color_default = git_config_colorbool(var, value); @@ -433,10 +434,11 @@ int git_diff_ui_config(const char *var, const char *value, void *cb) if (git_color_config(var, value, cb) < 0) return -1; - return git_diff_basic_config(var, value, cb); + return git_diff_basic_config(var, value,kvi, cb); } -int git_diff_basic_config(const char *var, const char *value, void *cb) +int git_diff_basic_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { const char *name; @@ -488,7 +490,7 @@ int git_diff_basic_config(const char *var, const char *value, void *cb) if (git_diff_heuristic_config(var, value, cb) < 0) return -1; - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static char *quote_two(const char *one, const char *two) diff --git a/diff.h b/diff.h index 6a0737b9c34..6a3efa63753 100644 --- a/diff.h +++ b/diff.h @@ -532,10 +532,12 @@ void free_diffstat_info(struct diffstat_t *diffstat); int parse_long_opt(const char *opt, const char **argv, const char **optarg); -int git_diff_basic_config(const char *var, const char *value, void *cb); +int git_diff_basic_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb); int git_diff_heuristic_config(const char *var, const char *value, void *cb); void init_diff_ui_defaults(void); -int git_diff_ui_config(const char *var, const char *value, void *cb); +int git_diff_ui_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb); void repo_diff_setup(struct repository *, struct diff_options *); struct option *add_diff_options(const struct option *, struct diff_options *); int diff_opt_parse(struct diff_options *, const char **, int, const char *); diff --git a/fetch-pack.c b/fetch-pack.c index 368f2ed25a1..c1072aa6cac 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -1858,7 +1858,8 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args, return ref; } -static int fetch_pack_config_cb(const char *var, const char *value, void *cb) +static int fetch_pack_config_cb(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (strcmp(var, "fetch.fsck.skiplist") == 0) { const char *path; @@ -1880,7 +1881,7 @@ static int fetch_pack_config_cb(const char *var, const char *value, void *cb) return 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } static void fetch_pack_config(void) diff --git a/fmt-merge-msg.c b/fmt-merge-msg.c index 1886c92ddb9..97358034fa0 100644 --- a/fmt-merge-msg.c +++ b/fmt-merge-msg.c @@ -19,7 +19,8 @@ static int use_branch_desc; static int suppress_dest_pattern_seen; 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, + struct key_value_info *kvi, void *cb) { if (!strcmp(key, "merge.log") || !strcmp(key, "merge.summary")) { int is_bool; @@ -39,7 +40,7 @@ int fmt_merge_msg_config(const char *key, const char *value, void *cb) string_list_append(&suppress_dest_patterns, value); suppress_dest_pattern_seen = 1; } else { - return git_default_config(key, value, cb); + return git_default_config(key, value,kvi, cb); } return 0; } diff --git a/fmt-merge-msg.h b/fmt-merge-msg.h index 99054042dc5..5262c39268a 100644 --- a/fmt-merge-msg.h +++ b/fmt-merge-msg.h @@ -13,7 +13,8 @@ struct fmt_merge_msg_opts { }; extern int merge_log_config; -int fmt_merge_msg_config(const char *key, const char *value, void *cb); +int fmt_merge_msg_config(const char *key, const char *value, + struct key_value_info *kvi, void *cb); int fmt_merge_msg(struct strbuf *in, struct strbuf *out, struct fmt_merge_msg_opts *); diff --git a/fsck.c b/fsck.c index 4238344ed82..ec26857c79d 100644 --- a/fsck.c +++ b/fsck.c @@ -1162,7 +1162,8 @@ struct fsck_gitmodules_data { int ret; }; -static int fsck_gitmodules_fn(const char *var, const char *value, void *vdata) +static int fsck_gitmodules_fn(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *vdata) { struct fsck_gitmodules_data *data = vdata; const char *subsection, *key; @@ -1373,7 +1374,8 @@ int fsck_finish(struct fsck_options *options) return ret; } -int git_fsck_config(const char *var, const char *value, void *cb) +int git_fsck_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { struct fsck_options *options = cb; if (strcmp(var, "fsck.skiplist") == 0) { @@ -1394,7 +1396,7 @@ int git_fsck_config(const char *var, const char *value, void *cb) return 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } /* diff --git a/fsck.h b/fsck.h index e17730e9da9..a06f202576c 100644 --- a/fsck.h +++ b/fsck.h @@ -237,6 +237,7 @@ const char *fsck_describe_object(struct fsck_options *options, * git_config() callback for use by fsck-y tools that want to support * fsck. fsck.skipList etc. */ -int git_fsck_config(const char *var, const char *value, void *cb); +int git_fsck_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb); #endif diff --git a/gpg-interface.c b/gpg-interface.c index aceeb083367..5ed89ef69ed 100644 --- a/gpg-interface.c +++ b/gpg-interface.c @@ -12,7 +12,8 @@ #include "alias.h" #include "wrapper.h" -static int git_gpg_config(const char *, const char *, void *); +static int git_gpg_config(const char *, const char *, struct key_value_info *, + void *); static void gpg_interface_lazy_init(void) { @@ -718,7 +719,8 @@ void set_signing_key(const char *key) configured_signing_key = xstrdup(key); } -static int git_gpg_config(const char *var, const char *value, void *cb UNUSED) +static int git_gpg_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb UNUSED) { struct gpg_format *fmt = NULL; char *fmtname = NULL; diff --git a/grep.c b/grep.c index b86462a12a9..1516b0689d0 100644 --- a/grep.c +++ b/grep.c @@ -54,7 +54,8 @@ define_list_config_array_extra(color_grep_slots, {"match"}); * Read the configuration file once and store it in * the grep_defaults template. */ -int grep_config(const char *var, const char *value, void *cb) +int grep_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { struct grep_opt *opt = cb; const char *slot; diff --git a/help.c b/help.c index 5d7637dce92..43d1eb702cd 100644 --- a/help.c +++ b/help.c @@ -309,7 +309,8 @@ void load_command_list(const char *prefix, exclude_cmds(other_cmds, main_cmds); } -static int get_colopts(const char *var, const char *value, void *data) +static int get_colopts(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data) { unsigned int *colopts = data; @@ -459,7 +460,8 @@ void list_developer_interfaces_help(void) putchar('\n'); } -static int get_alias(const char *var, const char *value, void *data) +static int get_alias(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data) { struct string_list *list = data; @@ -543,6 +545,7 @@ static struct cmdnames aliases; #define AUTOCORRECT_IMMEDIATELY (-1) static int git_unknown_cmd_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb UNUSED) { const char *p; diff --git a/ident.c b/ident.c index 8fad92d7007..21b7b3ff35b 100644 --- a/ident.c +++ b/ident.c @@ -671,7 +671,8 @@ static int set_ident(const char *var, const char *value) return 0; } -int git_ident_config(const char *var, const char *value, void *data UNUSED) +int git_ident_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data UNUSED) { if (!strcmp(var, "user.useconfigonly")) { ident_use_config_only = git_config_bool(var, value); diff --git a/ident.h b/ident.h index 96a64896a01..f55db41ff99 100644 --- a/ident.h +++ b/ident.h @@ -62,6 +62,7 @@ const char *fmt_name(enum want_ident); int committer_ident_sufficiently_given(void); int author_ident_sufficiently_given(void); -int git_ident_config(const char *, const char *, void *); +int git_ident_config(const char *, const char *, + struct key_value_info *UNUSED, void *); #endif diff --git a/imap-send.c b/imap-send.c index a62424e90a4..3cc98f1a0a5 100644 --- a/imap-send.c +++ b/imap-send.c @@ -1322,7 +1322,8 @@ static int split_msg(struct strbuf *all_msgs, struct strbuf *msg, int *ofs) return 1; } -static int git_imap_config(const char *var, const char *val, void *cb) +static int git_imap_config(const char *var, const char *val, + struct key_value_info *kvi, void *cb) { if (!strcmp("imap.sslverify", var)) @@ -1356,7 +1357,7 @@ static int git_imap_config(const char *var, const char *val, void *cb) server.host = xstrdup(val); } } else - return git_default_config(var, val, cb); + return git_default_config(var, val,kvi, cb); return 0; } diff --git a/ll-merge.c b/ll-merge.c index 8be38d3bd41..2d240609ddf 100644 --- a/ll-merge.c +++ b/ll-merge.c @@ -252,6 +252,7 @@ static struct ll_merge_driver *ll_user_merge, **ll_user_merge_tail; static const char *default_ll_merge; static int read_merge_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb UNUSED) { struct ll_merge_driver *fn; diff --git a/ls-refs.c b/ls-refs.c index b9f3e08ec3d..90b902c84f8 100644 --- a/ls-refs.c +++ b/ls-refs.c @@ -136,7 +136,7 @@ static void send_possibly_unborn_head(struct ls_refs_data *data) } static int ls_refs_config(const char *var, const char *value, - void *cb_data) + struct key_value_info *kvi UNUSED, void *cb_data) { struct ls_refs_data *data = cb_data; /* diff --git a/mailinfo.c b/mailinfo.c index 2aeb20e5e62..e2f469c96f7 100644 --- a/mailinfo.c +++ b/mailinfo.c @@ -1241,12 +1241,13 @@ int mailinfo_parse_quoted_cr_action(const char *actionstr, int *action) return 0; } -static int git_mailinfo_config(const char *var, const char *value, void *mi_) +static int git_mailinfo_config(const char *var, const char *value, + struct key_value_info *kvi, void *mi_) { struct mailinfo *mi = mi_; if (!starts_with(var, "mailinfo.")) - return git_default_config(var, value, NULL); + return git_default_config(var, value,kvi, NULL); if (!strcmp(var, "mailinfo.scissors")) { mi->use_scissors = git_config_bool(var, value); return 0; diff --git a/notes-utils.c b/notes-utils.c index cb88171b7bb..f7a0ec60731 100644 --- a/notes-utils.c +++ b/notes-utils.c @@ -93,7 +93,8 @@ static combine_notes_fn parse_combine_notes_fn(const char *v) return NULL; } -static int notes_rewrite_config(const char *k, const char *v, void *cb) +static int notes_rewrite_config(const char *k, const char *v, + struct key_value_info *kvi UNUSED, void *cb) { struct notes_rewrite_cfg *c = cb; if (starts_with(k, "notes.rewrite.") && !strcmp(k+14, c->cmd)) { diff --git a/notes.c b/notes.c index 45fb7f22d1d..89b84ea0869 100644 --- a/notes.c +++ b/notes.c @@ -973,7 +973,8 @@ void string_list_add_refs_from_colon_sep(struct string_list *list, free(globs_copy); } -static int notes_display_config(const char *k, const char *v, void *cb) +static int notes_display_config(const char *k, const char *v, + struct key_value_info *kvi UNUSED, void *cb) { int *load_refs = cb; diff --git a/pager.c b/pager.c index b66bbff2785..4b77e0d2e57 100644 --- a/pager.c +++ b/pager.c @@ -39,6 +39,7 @@ static void wait_for_pager_signal(int signo) } static int core_pager_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data UNUSED) { if (!strcmp(var, "core.pager")) @@ -224,7 +225,9 @@ struct pager_command_config_data { char *value; }; -static int pager_command_config(const char *var, const char *value, void *vdata) +static int pager_command_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, + void *vdata) { struct pager_command_config_data *data = vdata; const char *cmd; diff --git a/pretty.c b/pretty.c index 76fc4f61e40..7f57379c44e 100644 --- a/pretty.c +++ b/pretty.c @@ -55,6 +55,7 @@ static void save_user_format(struct rev_info *rev, const char *cp, int is_tforma } static int git_pretty_formats_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb UNUSED) { struct cmt_fmt_map *commit_format = NULL; diff --git a/promisor-remote.c b/promisor-remote.c index a8dbb788e8f..ea68df91209 100644 --- a/promisor-remote.c +++ b/promisor-remote.c @@ -99,7 +99,9 @@ static void promisor_remote_move_to_tail(struct promisor_remote_config *config, config->promisors_tail = &r->next; } -static int promisor_remote_config(const char *var, const char *value, void *data) +static int promisor_remote_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, + void *data) { struct promisor_remote_config *config = data; const char *name; diff --git a/remote.c b/remote.c index 3a831cb5304..10868a963f2 100644 --- a/remote.c +++ b/remote.c @@ -348,7 +348,8 @@ static void read_branches_file(struct remote_state *remote_state, remote->fetch_tags = 1; /* always auto-follow */ } -static int handle_config(const char *key, const char *value, void *cb) +static int handle_config(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { const char *name; size_t namelen; diff --git a/revision.c b/revision.c index 106ca1ce6c9..6de0132d719 100644 --- a/revision.c +++ b/revision.c @@ -1569,7 +1569,8 @@ struct exclude_hidden_refs_cb { const char *section; }; -static int hide_refs_config(const char *var, const char *value, void *cb_data) +static int hide_refs_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb_data) { struct exclude_hidden_refs_cb *cb = cb_data; cb->exclusions->hidden_refs_configured = 1; diff --git a/scalar.c b/scalar.c index de07c37d210..1c44df2ec7a 100644 --- a/scalar.c +++ b/scalar.c @@ -593,7 +593,8 @@ static int cmd_register(int argc, const char **argv) return register_dir(); } -static int get_scalar_repos(const char *key, const char *value, void *data) +static int get_scalar_repos(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *data) { struct string_list *list = data; diff --git a/sequencer.c b/sequencer.c index 6985ca526ae..171561c2cdb 100644 --- a/sequencer.c +++ b/sequencer.c @@ -214,7 +214,8 @@ static struct update_ref_record *init_update_ref_record(const char *ref) return rec; } -static int git_sequencer_config(const char *k, const char *v, void *cb) +static int git_sequencer_config(const char *k, const char *v, + struct key_value_info *kvi, void *cb) { struct replay_opts *opts = cb; int status; @@ -269,7 +270,7 @@ static int git_sequencer_config(const char *k, const char *v, void *cb) if (opts->action == REPLAY_REVERT && !strcmp(k, "revert.reference")) opts->commit_use_reference = git_config_bool(k, v); - return git_diff_basic_config(k, v, NULL); + return git_diff_basic_config(k, v,kvi, NULL); } void sequencer_init_config(struct replay_opts *opts) @@ -2876,7 +2877,8 @@ static int git_config_string_dup(char **dest, return 0; } -static int populate_opts_cb(const char *key, const char *value, void *data) +static int populate_opts_cb(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *data) { struct replay_opts *opts = data; int error_flag = 1; diff --git a/setup.c b/setup.c index 6c5b85e96c1..a461dd15233 100644 --- a/setup.c +++ b/setup.c @@ -514,7 +514,9 @@ no_prevention_needed: startup_info->original_cwd = NULL; } -static int read_worktree_config(const char *var, const char *value, void *vdata) +static int read_worktree_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, + void *vdata) { struct repository_format *data = vdata; @@ -585,7 +587,8 @@ static enum extension_result handle_extension(const char *var, return EXTENSION_UNKNOWN; } -static int check_repo_format(const char *var, const char *value, void *vdata) +static int check_repo_format(const char *var, const char *value, + struct key_value_info *kvi, void *vdata) { struct repository_format *data = vdata; const char *ext; @@ -614,7 +617,7 @@ static int check_repo_format(const char *var, const char *value, void *vdata) } } - return read_worktree_config(var, value, vdata); + return read_worktree_config(var, value,kvi, vdata); } static int check_repository_format_gently(const char *gitdir, struct repository_format *candidate, int *nongit_ok) @@ -1113,7 +1116,8 @@ struct safe_directory_data { int is_safe; }; -static int safe_directory_cb(const char *key, const char *value, void *d) +static int safe_directory_cb(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *d) { struct safe_directory_data *data = d; @@ -1169,7 +1173,8 @@ static int ensure_valid_ownership(const char *gitfile, return data.is_safe; } -static int allowed_bare_repo_cb(const char *key, const char *value, void *d) +static int allowed_bare_repo_cb(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *d) { enum allowed_bare_repo *allowed_bare_repo = d; diff --git a/submodule-config.c b/submodule-config.c index c2f71f0b2e3..522c9cd3213 100644 --- a/submodule-config.c +++ b/submodule-config.c @@ -424,7 +424,8 @@ struct parse_config_parameter { * config store (.git/config, etc). Callers are responsible for * checking for overrides in the main config store when appropriate. */ -static int parse_config(const char *var, const char *value, void *data) +static int parse_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data) { struct parse_config_parameter *me = data; struct submodule *submodule; @@ -673,7 +674,8 @@ out: } } -static int gitmodules_cb(const char *var, const char *value, void *data) +static int gitmodules_cb(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data) { struct repository *repo = data; struct parse_config_parameter parameter; @@ -801,7 +803,9 @@ void submodule_free(struct repository *r) submodule_cache_clear(r->submodule_cache); } -static int config_print_callback(const char *var, const char *value, void *cb_data) +static int config_print_callback(const char *var, const char *value, + struct key_value_info *kvi UNUSED, + void *cb_data) { char *wanted_key = cb_data; @@ -843,7 +847,9 @@ struct fetch_config { int *recurse_submodules; }; -static int gitmodules_fetch_config(const char *var, const char *value, void *cb) +static int gitmodules_fetch_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, + void *cb) { struct fetch_config *config = cb; if (!strcmp(var, "submodule.fetchjobs")) { @@ -871,6 +877,7 @@ void fetch_config_from_gitmodules(int *max_children, int *recurse_submodules) } static int gitmodules_update_clone_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { int *max_jobs = cb; diff --git a/t/helper/test-config.c b/t/helper/test-config.c index ad78fc17683..00cd49e5145 100644 --- a/t/helper/test-config.c +++ b/t/helper/test-config.c @@ -42,7 +42,8 @@ * */ -static int iterate_cb(const char *var, const char *value, void *data UNUSED) +static int iterate_cb(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data UNUSED) { static int nr; @@ -59,7 +60,8 @@ static int iterate_cb(const char *var, const char *value, void *data UNUSED) return 0; } -static int parse_int_cb(const char *var, const char *value, void *data) +static int parse_int_cb(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *data) { const char *key_to_match = data; @@ -70,7 +72,8 @@ static int parse_int_cb(const char *var, const char *value, void *data) return 0; } -static int early_config_cb(const char *var, const char *value, void *vdata) +static int early_config_cb(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *vdata) { const char *key = vdata; diff --git a/t/helper/test-userdiff.c b/t/helper/test-userdiff.c index 680124a6760..33dd3a65241 100644 --- a/t/helper/test-userdiff.c +++ b/t/helper/test-userdiff.c @@ -12,7 +12,9 @@ static int driver_cb(struct userdiff_driver *driver, return 0; } -static int cmd__userdiff_config(const char *var, const char *value, void *cb UNUSED) +static int cmd__userdiff_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, + void *cb UNUSED) { if (userdiff_config(var, value) < 0) return -1; diff --git a/trace2/tr2_cfg.c b/trace2/tr2_cfg.c index 78cfc15d52d..6871258d468 100644 --- a/trace2/tr2_cfg.c +++ b/trace2/tr2_cfg.c @@ -99,7 +99,8 @@ struct tr2_cfg_data { /* * See if the given config key matches any of our patterns of interest. */ -static int tr2_cfg_cb(const char *key, const char *value, void *d) +static int tr2_cfg_cb(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *d) { struct strbuf **s; struct tr2_cfg_data *data = (struct tr2_cfg_data *)d; diff --git a/trace2/tr2_sysenv.c b/trace2/tr2_sysenv.c index 069786cb927..d17a08b0f50 100644 --- a/trace2/tr2_sysenv.c +++ b/trace2/tr2_sysenv.c @@ -57,7 +57,8 @@ static struct tr2_sysenv_entry tr2_sysenv_settings[] = { }; /* clang-format on */ -static int tr2_sysenv_cb(const char *key, const char *value, void *d) +static int tr2_sysenv_cb(const char *key, const char *value, + struct key_value_info *kvi UNUSED, void *d) { int k; diff --git a/trailer.c b/trailer.c index a2c3ed6f28c..fac7e2cfe6e 100644 --- a/trailer.c +++ b/trailer.c @@ -482,6 +482,7 @@ static struct { }; static int git_trailer_default_config(const char *conf_key, const char *value, + struct key_value_info *kvi UNUSED, void *cb UNUSED) { const char *trailer_item, *variable_name; @@ -514,6 +515,7 @@ static int git_trailer_default_config(const char *conf_key, const char *value, } static int git_trailer_config(const char *conf_key, const char *value, + struct key_value_info *kvi UNUSED, void *cb UNUSED) { const char *trailer_item, *variable_name; diff --git a/upload-pack.c b/upload-pack.c index e23f16dfdd2..5f8232ff078 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -1298,7 +1298,9 @@ static int parse_object_filter_config(const char *var, const char *value, return 0; } -static int upload_pack_config(const char *var, const char *value, void *cb_data) +static int upload_pack_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, + void *cb_data) { struct upload_pack_data *data = cb_data; @@ -1339,7 +1341,9 @@ static int upload_pack_config(const char *var, const char *value, void *cb_data) return parse_hide_refs_config(var, value, "uploadpack", &data->hidden_refs); } -static int upload_pack_protected_config(const char *var, const char *value, void *cb_data) +static int upload_pack_protected_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, + void *cb_data) { struct upload_pack_data *data = cb_data; diff --git a/urlmatch.c b/urlmatch.c index eba0bdd77fe..47683974d8c 100644 --- a/urlmatch.c +++ b/urlmatch.c @@ -551,7 +551,8 @@ static int cmp_matches(const struct urlmatch_item *a, return 0; } -int urlmatch_config_entry(const char *var, const char *value, void *cb) +int urlmatch_config_entry(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { struct string_list_item *item; struct urlmatch_config *collect = cb; diff --git a/urlmatch.h b/urlmatch.h index bee374a642c..f6eac4af9ea 100644 --- a/urlmatch.h +++ b/urlmatch.h @@ -71,7 +71,8 @@ struct urlmatch_config { .vars = STRING_LIST_INIT_DUP, \ } -int urlmatch_config_entry(const char *var, const char *value, void *cb); +int urlmatch_config_entry(const char *var, const char *value, + struct key_value_info *kvi, void *cb); void urlmatch_config_release(struct urlmatch_config *config); #endif /* URL_MATCH_H */ diff --git a/xdiff-interface.c b/xdiff-interface.c index 0460e03f5ed..f1aac104285 100644 --- a/xdiff-interface.c +++ b/xdiff-interface.c @@ -307,7 +307,8 @@ int xdiff_compare_lines(const char *l1, long s1, int git_xmerge_style = -1; -int git_xmerge_config(const char *var, const char *value, void *cb) +int git_xmerge_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "merge.conflictstyle")) { if (!value) @@ -327,5 +328,5 @@ int git_xmerge_config(const char *var, const char *value, void *cb) value, var); return 0; } - return git_default_config(var, value, cb); + return git_default_config(var, value,kvi, cb); } diff --git a/xdiff-interface.h b/xdiff-interface.h index 3750794afe9..c1676b11702 100644 --- a/xdiff-interface.h +++ b/xdiff-interface.h @@ -50,7 +50,8 @@ int buffer_is_binary(const char *ptr, unsigned long size); void xdiff_set_find_func(xdemitconf_t *xecfg, const char *line, int cflags); void xdiff_clear_find_func(xdemitconf_t *xecfg); -int git_xmerge_config(const char *var, const char *value, void *cb); +int git_xmerge_config(const char *var, const char *value, + struct key_value_info *kvi, void *cb); extern int git_xmerge_style; /* From patchwork Fri Apr 21 19:13:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220613 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 18B4AC77B76 for ; Fri, 21 Apr 2023 19:14:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233538AbjDUTN7 (ORCPT ); Fri, 21 Apr 2023 15:13:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38146 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233493AbjDUTNt (ORCPT ); Fri, 21 Apr 2023 15:13:49 -0400 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A9C0B30CD for ; Fri, 21 Apr 2023 12:13:28 -0700 (PDT) Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-3f173af665fso14264345e9.3 for ; Fri, 21 Apr 2023 12:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104407; x=1684696407; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=2a85yV2tGCqUGpf5WRbk6k+FSe/9Q/9V+mQyzN/o9oI=; b=XMGDGcbEd2/DoquF9rcKr3fc0HTi7hB9bqmKUQbFK+uiJlRr7n4BnGoljU4kvR9eP7 EeYV5b5uFqwvjqEQO2jOWECX75kzg43kQ1TIaBQA+L9vhspdFzz4fH9EHqym6VaDi9oY /AsMWiT6P5HLtsLkyuHk3KyaQN2b+oj7lTtt8OSr1WasK3/EjGJ+1FAHrJo0DG0gJ07O 74itkclUpUDgjDyhVHE8G0e2gsR8quryQ03w8v2y8vcSbjeoIFqo8WZ1V5DqegR+fJJP vDXusHb14/PTS/M5iNtS1HHnI0r+VAE4q+TsLuNwORWJWh0XJqqT8MpfRsNYhDVgt8Un pnpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104407; x=1684696407; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2a85yV2tGCqUGpf5WRbk6k+FSe/9Q/9V+mQyzN/o9oI=; b=I2eYQL+8rK4Ph2VymTFznsaQV9lB+Os44ByWonumsoCa65uk9BWz1WuYyCFn/LhYMR b2FIt+9Sv/JGVRsZpnbXsR++BtRIg5IEDOuYNbc/INuqEAWqtWcjOZ2Oe1L2Vavz6CKr yOJvsTOzB5MRFa+J+u5FSWRgYo4PI4ckKszhiDiRGv7F1JRBq3MvZbkuVUCR0EODpyiq HY55hMsfP6uyoK8oDeH3IRQPUNAkEqs/GpmjHLkQPX/0mGFHO57wIyjf9LlxAufbKC9d Ra/O4v48Umuo8/WR4sxRT+9wEMzTIrBftoV+/PoE4eNsSHZC315V2CS2nTkhAtBjAzs0 UAyA== X-Gm-Message-State: AAQBX9dSTM24rLLo5F3cY9ECwcxYgMQ6ZpRd3ZoTTiaI7KeQqUGIf0pP 3rpr3bSZ2++K4/LRdJGyAUJLbVsLG68= X-Google-Smtp-Source: AKy350Z96r7R+v3K5oMmTT8g3bVWxe1cGL7Iqfj99MPYJbfFnpPOzZiJlLwgHN3dMZbAHQzfwY4J/g== X-Received: by 2002:a7b:c38e:0:b0:3f1:718d:a21c with SMTP id s14-20020a7bc38e000000b003f1718da21cmr2759321wmj.31.1682104406702; Fri, 21 Apr 2023 12:13:26 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id f3-20020adfdb43000000b002efb2d861dasm4991407wrj.77.2023.04.21.12.13.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:26 -0700 (PDT) Message-Id: <1071e70c92892166e1ed2cf22bcd7eb49bdf3b20.1682104399.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:14 +0000 Subject: [PATCH 10/14] (RFC-only) config: finish config_fn_t refactor Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo Here's an exhaustive list of all of the changes: * Cases that need a judgement call - trace2/tr2_cfg.c:tr2_cfg_set_fl() This function needs to account for tr2_cfg_cb() now using "kvi". Since this is only called (indirectly) by git_config_set(), config source information has never been available here, so just pass NULL. It will be tr2_cfg_cb()'s responsibility to not use "kvi". - builtin/checkout.c:checkout_main() This calls git_xmerge_config() as a shorthand for parsing a CLI arg. "kvi" doesn't apply, so just pass NULL. This might be worth refactoring away, since git_xmerge_config() can call git_default_config(). - config.c:git_config_include() Replace the local "kvi" variable with the "kvi" parameter. This makes config_include_data.config_reader obsolete, so remove it. * Hard for cocci to catch - urlmatch.c Manually refactor the custom config callbacks in "struct urlmatch_config". - diff.h, fsck.h, grep.h, ident.h, xdiff-interface.h "struct key_value_info" hasn't been defined yet, so forward declare it. Alternatively, maybe these files should "#include config.h". * Likely deficiencies in .cocci patch - submodule-config.c:gitmodules_cb() Manually refactor a parse_config() call that gets missed because it uses a different "*data" arg. - grep.h, various Manually refactor grep_config() calls. Not sure why these don't get picked up. - config.c:git_config_include(), http.c:http_options() Manually add "kvi" where it was missed. Not sure why they get missed. - builtin/clone.c:write_one_config() Manually refactor a git_clone_config() call. Probably got missed because I didn't include git_config_parse_parameter(). - ident.h Remove the UNUSED attribute. Not sure why this is the only instance of this. - git-compat-util.h, compat/mingw.[h|c] Manually refactor noop_core_config(), platform_core_config() and mingw_core_config(). I can probably add these as "manual fixups" in cocci. Signed-off-by: Glen Choo --- builtin/checkout.c | 2 +- builtin/clone.c | 4 ++-- builtin/grep.c | 2 +- compat/mingw.c | 3 ++- compat/mingw.h | 4 +++- config.c | 5 +---- diff.h | 1 + fsck.h | 1 + git-compat-util.h | 2 ++ grep.c | 6 +++--- grep.h | 4 +++- http.c | 5 +++-- ident.h | 3 ++- submodule-config.c | 4 ++-- trace2/tr2_cfg.c | 2 +- urlmatch.c | 6 +++--- xdiff-interface.h | 2 ++ 17 files changed, 33 insertions(+), 23 deletions(-) diff --git a/builtin/checkout.c b/builtin/checkout.c index 92017ba6696..9641423dc2f 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -1687,7 +1687,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix, if (opts->conflict_style) { opts->merge = 1; /* implied */ - git_xmerge_config("merge.conflictstyle", opts->conflict_style, NULL); + git_xmerge_config("merge.conflictstyle", opts->conflict_style, NULL, NULL); } if (opts->force) { opts->discard_changes = 1; diff --git a/builtin/clone.c b/builtin/clone.c index 1e1cf104194..e654757c45d 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -791,14 +791,14 @@ static int git_clone_config(const char *k, const char *v, } static int write_one_config(const char *key, const char *value, - struct key_value_info *kvi UNUSED, void *data) + struct key_value_info *kvi, void *data) { /* * give git_clone_config a chance to write config values back to the * environment, since git_config_set_multivar_gently only deals with * config-file writes */ - int apply_failed = git_clone_config(key, value, data); + int apply_failed = git_clone_config(key, value, kvi, data); if (apply_failed) return apply_failed; diff --git a/builtin/grep.c b/builtin/grep.c index 177befc3ed4..6e795f9f3a2 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -290,7 +290,7 @@ static int wait_all(void) static int grep_cmd_config(const char *var, const char *value, struct key_value_info *kvi, void *cb) { - int st = grep_config(var, value, cb); + int st = grep_config(var, value, kvi, cb); if (git_color_config(var, value, cb) < 0) st = -1; diff --git a/compat/mingw.c b/compat/mingw.c index 94c5a1daa40..c8181469a2f 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -242,7 +242,8 @@ static int core_restrict_inherited_handles = -1; static enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY; static char *unset_environment_variables; -int mingw_core_config(const char *var, const char *value, void *cb) +int mingw_core_config(const char *var, const char *value, + struct key_value_info *kvi UNUSED, void *cb) { if (!strcmp(var, "core.hidedotfiles")) { if (value && !strcasecmp(value, "dotgitonly")) diff --git a/compat/mingw.h b/compat/mingw.h index 209cf7cebad..4f2b489b883 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -11,7 +11,9 @@ typedef _sigset_t sigset_t; #undef _POSIX_THREAD_SAFE_FUNCTIONS #endif -int mingw_core_config(const char *var, const char *value, void *cb); +struct key_value_info; +int mingw_core_config(const char *var, const char *value, + struct key_value_info *, void *cb); #define platform_core_config mingw_core_config /* diff --git a/config.c b/config.c index 60f8c0c666b..aa183f6f244 100644 --- a/config.c +++ b/config.c @@ -147,7 +147,6 @@ struct config_include_data { void *data; const struct config_options *opts; struct git_config_source *config_source; - struct config_reader *config_reader; /* * All remote URLs discovered when reading all config files. @@ -433,10 +432,9 @@ static int include_condition_is_true(struct key_value_info *kvi, static int kvi_fn(config_fn_t fn, const char *key, const char *value, struct key_value_info *kvi, void *data); static int git_config_include(const char *var, const char *value, - struct key_value_info *kvi UNUSED, void *data) + struct key_value_info *kvi, void *data) { struct config_include_data *inc = data; - struct key_value_info *kvi = inc->config_reader->config_kvi; const char *cond, *key; size_t cond_len; int ret; @@ -2252,7 +2250,6 @@ int config_with_options(config_fn_t fn, void *data, inc.data = data; inc.opts = opts; inc.config_source = config_source; - inc.config_reader = &the_reader; fn = git_config_include; data = &inc; } diff --git a/diff.h b/diff.h index 6a3efa63753..2ceb0fd2d66 100644 --- a/diff.h +++ b/diff.h @@ -532,6 +532,7 @@ void free_diffstat_info(struct diffstat_t *diffstat); int parse_long_opt(const char *opt, const char **argv, const char **optarg); +struct key_value_info; int git_diff_basic_config(const char *var, const char *value, struct key_value_info *kvi, void *cb); int git_diff_heuristic_config(const char *var, const char *value, void *cb); diff --git a/fsck.h b/fsck.h index a06f202576c..914e67a067d 100644 --- a/fsck.h +++ b/fsck.h @@ -233,6 +233,7 @@ void fsck_put_object_name(struct fsck_options *options, const char *fsck_describe_object(struct fsck_options *options, const struct object_id *oid); +struct key_value_info; /* * git_config() callback for use by fsck-y tools that want to support * fsck. fsck.skipList etc. diff --git a/git-compat-util.h b/git-compat-util.h index 4a200a9fb41..6812b592c15 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -440,8 +440,10 @@ typedef uintmax_t timestamp_t; #endif #ifndef platform_core_config +struct key_value_info; static inline int noop_core_config(const char *var UNUSED, const char *value UNUSED, + struct key_value_info *kvi UNUSED, void *cb UNUSED) { return 0; diff --git a/grep.c b/grep.c index 1516b0689d0..2d3b9bf5d92 100644 --- a/grep.c +++ b/grep.c @@ -55,7 +55,7 @@ define_list_config_array_extra(color_grep_slots, {"match"}); * the grep_defaults template. */ int grep_config(const char *var, const char *value, - struct key_value_info *kvi UNUSED, void *cb) + struct key_value_info *kvi, void *cb) { struct grep_opt *opt = cb; const char *slot; @@ -90,9 +90,9 @@ int grep_config(const char *var, const char *value, if (!strcmp(var, "color.grep")) opt->color = git_config_colorbool(var, value); if (!strcmp(var, "color.grep.match")) { - if (grep_config("color.grep.matchcontext", value, cb) < 0) + if (grep_config("color.grep.matchcontext", value, kvi, cb) < 0) return -1; - if (grep_config("color.grep.matchselected", value, cb) < 0) + if (grep_config("color.grep.matchselected", value, kvi, cb) < 0) return -1; } else if (skip_prefix(var, "color.grep.", &slot)) { int i = LOOKUP_CONFIG(color_grep_slots, slot); diff --git a/grep.h b/grep.h index c59592e3bdb..6d2fb0ada54 100644 --- a/grep.h +++ b/grep.h @@ -202,7 +202,9 @@ struct grep_opt { .output = std_output, \ } -int grep_config(const char *var, const char *value, void *); +struct key_value_info; +int grep_config(const char *var, const char *value, struct key_value_info *kvi, + void *); void grep_init(struct grep_opt *, struct repository *repo); void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t); diff --git a/http.c b/http.c index d5d82c5230f..3d4292eba6a 100644 --- a/http.c +++ b/http.c @@ -361,7 +361,8 @@ static void process_curl_messages(void) } } -static int http_options(const char *var, const char *value, void *cb) +static int http_options(const char *var, const char *value, + struct key_value_info *kvi, void *cb) { if (!strcmp("http.version", var)) { return git_config_string(&curl_http_version, var, value); @@ -532,7 +533,7 @@ static int http_options(const char *var, const char *value, void *cb) } /* Fall back on the default ones */ - return git_default_config(var, value, cb); + return git_default_config(var, value, kvi, cb); } static int curl_empty_auth_enabled(void) diff --git a/ident.h b/ident.h index f55db41ff99..4e3bd347c52 100644 --- a/ident.h +++ b/ident.h @@ -62,7 +62,8 @@ const char *fmt_name(enum want_ident); int committer_ident_sufficiently_given(void); int author_ident_sufficiently_given(void); +struct key_value_info; int git_ident_config(const char *, const char *, - struct key_value_info *UNUSED, void *); + struct key_value_info *, void *); #endif diff --git a/submodule-config.c b/submodule-config.c index 522c9cd3213..7d773f33621 100644 --- a/submodule-config.c +++ b/submodule-config.c @@ -675,7 +675,7 @@ out: } static int gitmodules_cb(const char *var, const char *value, - struct key_value_info *kvi UNUSED, void *data) + struct key_value_info *kvi, void *data) { struct repository *repo = data; struct parse_config_parameter parameter; @@ -685,7 +685,7 @@ static int gitmodules_cb(const char *var, const char *value, parameter.gitmodules_oid = null_oid(); parameter.overwrite = 1; - return parse_config(var, value, ¶meter); + return parse_config(var, value, kvi, ¶meter); } void repo_read_gitmodules(struct repository *repo, int skip_if_read) diff --git a/trace2/tr2_cfg.c b/trace2/tr2_cfg.c index 6871258d468..8ed139c69f4 100644 --- a/trace2/tr2_cfg.c +++ b/trace2/tr2_cfg.c @@ -146,5 +146,5 @@ void tr2_cfg_set_fl(const char *file, int line, const char *key, struct tr2_cfg_data data = { file, line }; if (tr2_cfg_load_patterns() > 0) - tr2_cfg_cb(key, value, &data); + tr2_cfg_cb(key, value, NULL, &data); } diff --git a/urlmatch.c b/urlmatch.c index 47683974d8c..c94500b61b3 100644 --- a/urlmatch.c +++ b/urlmatch.c @@ -552,7 +552,7 @@ static int cmp_matches(const struct urlmatch_item *a, } int urlmatch_config_entry(const char *var, const char *value, - struct key_value_info *kvi UNUSED, void *cb) + struct key_value_info *kvi, void *cb) { struct string_list_item *item; struct urlmatch_config *collect = cb; @@ -566,7 +566,7 @@ int urlmatch_config_entry(const char *var, const char *value, if (!skip_prefix(var, collect->section, &key) || *(key++) != '.') { if (collect->cascade_fn) - return collect->cascade_fn(var, value, cb); + return collect->cascade_fn(var, value, kvi, cb); return 0; /* not interested */ } dot = strrchr(key, '.'); @@ -610,7 +610,7 @@ int urlmatch_config_entry(const char *var, const char *value, strbuf_addstr(&synthkey, collect->section); strbuf_addch(&synthkey, '.'); strbuf_addstr(&synthkey, key); - retval = collect->collect_fn(synthkey.buf, value, collect->cb); + retval = collect->collect_fn(synthkey.buf, value, kvi, collect->cb); strbuf_release(&synthkey); return retval; diff --git a/xdiff-interface.h b/xdiff-interface.h index c1676b11702..749cdf77579 100644 --- a/xdiff-interface.h +++ b/xdiff-interface.h @@ -50,6 +50,8 @@ int buffer_is_binary(const char *ptr, unsigned long size); void xdiff_set_find_func(xdemitconf_t *xecfg, const char *line, int cflags); void xdiff_clear_find_func(xdemitconf_t *xecfg); + +struct key_value_info; int git_xmerge_config(const char *var, const char *value, struct key_value_info *kvi, void *cb); extern int git_xmerge_style; From patchwork Fri Apr 21 19:13:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220614 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 897A0C7618E for ; Fri, 21 Apr 2023 19:14:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233514AbjDUTOA (ORCPT ); Fri, 21 Apr 2023 15:14:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38670 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233494AbjDUTNt (ORCPT ); Fri, 21 Apr 2023 15:13:49 -0400 Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7107C1BD1 for ; Fri, 21 Apr 2023 12:13:29 -0700 (PDT) Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-3f191c1a8a7so7406165e9.1 for ; Fri, 21 Apr 2023 12:13:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104407; x=1684696407; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=xZQcx+cDrstRj9pw3MXO5SVaKI/uKYBh/IIvYQUmAaM=; b=qLhGNvpXr4gJWuScx+TNv+RQhTvzuEOi2SZpP8rtjj51Y+AQinsb23vTrC44lfqXWO lj641+8konnomc1xcz4gtCfvTXe1YjnOuSjLB265YlnQgIQa+51DyKr3rj2ockUlncYk nBkeLIHBDAPJwFHeF4PJBv6DWq/SS6woQDQklgsOcaXkXY/x9U5D7yolrrDlG7RU+ona i53wYRS/tqfIHgaLrThEV+d77KxdLXpBTalmlsvKa0SzI7eE5y5vrmLJVbjtw6ZaKFOS MdA8TtVhQ15ecb6gLm2BhAAgP3Sl68cq3ijpC+zPycQ1Z+kdObtKpoh4lREOQDX1W9ML nTQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104407; x=1684696407; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xZQcx+cDrstRj9pw3MXO5SVaKI/uKYBh/IIvYQUmAaM=; b=HRGL3HP7WLRSuspr5N9gh9TbgP44bwIxHgb7VeADHHRZF664hOG3aNKqd/UzQxgTue pvt5EGeUdyMamWv1H2RZ1WyHgXVKeLiZLsZYDJIaGsH0Gfz3nyxIjU5FMuZ96q4pPT0M 5d8DZkE+Rixho4+rhvWGiCEt0vpfB8I/v/V+/IufXr5mnNn0M7xbqwYkO0d83cc1ieJR KF/sv63KO4vcV+RKMoWz/Yas+82kisc1HQ4OLRUnBBSHdzwmRoYjgs7vPSjhASJ7auWM cCfQfttpWRStE6ZNU0YZQ8f3BlImP+eWDNZAKD2RjoTkBOiXRuP2UOo8uF+tVKY2Ztdd 2EPQ== X-Gm-Message-State: AAQBX9foBnOTtVoA7zvX+jrVUP7AffC+A2/iSjUpb4Did0hkKS0Q3uGC m39mVgO1vmGyIkPPqNZzK4NfNsj4ujU= X-Google-Smtp-Source: AKy350Z48uUBgTE8WLO4PKE7+GyRHnid3fAIFYVX1LQQS1JQi6Ep0X6IuJoLMywgr8WE/Z4nH7nDrw== X-Received: by 2002:a7b:c3d8:0:b0:3f1:7972:429d with SMTP id t24-20020a7bc3d8000000b003f17972429dmr2714522wmj.18.1682104407613; Fri, 21 Apr 2023 12:13:27 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id p8-20020a05600c358800b003f1738d0d13sm12360248wmq.1.2023.04.21.12.13.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:27 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:15 +0000 Subject: [PATCH 11/14] config: remove current_config_(line|name|origin_type) Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo Trivially replace current_config_(line|name|origin_type) by reading the corresponding values from "struct key_value_info". This includes some light "kvi" plumbing for builtin/config.c, and for *origin_type, splitting out a function that turns "enum config_origin_type" into the human-readable string that callbacks actually want. Signed-off-by: Glen Choo --- builtin/config.c | 25 +++++++++++++------------ builtin/remote.c | 6 +++--- config.c | 23 +---------------------- config.h | 4 +--- t/helper/test-config.c | 8 ++++---- 5 files changed, 22 insertions(+), 44 deletions(-) diff --git a/builtin/config.c b/builtin/config.c index b2ad7351d0a..2ffa25139c6 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -191,16 +191,16 @@ static void check_argc(int argc, int min, int max) usage_builtin_config(); } -static void show_config_origin(struct strbuf *buf) +static void show_config_origin(struct key_value_info *kvi, struct strbuf *buf) { const char term = end_nul ? '\0' : '\t'; - strbuf_addstr(buf, current_config_origin_type()); + strbuf_addstr(buf, config_origin_type_name(kvi->origin_type)); strbuf_addch(buf, ':'); if (end_nul) - strbuf_addstr(buf, current_config_name()); + strbuf_addstr(buf, kvi->filename ? kvi->filename : ""); else - quote_c_style(current_config_name(), buf, NULL, 0); + quote_c_style(kvi->filename ? kvi->filename : "", buf, NULL, 0); strbuf_addch(buf, term); } @@ -214,14 +214,14 @@ static void show_config_scope(struct strbuf *buf) } static int show_all_config(const char *key_, const char *value_, - struct key_value_info *kvi UNUSED, void *cb UNUSED) + struct key_value_info *kvi, void *cb UNUSED) { if (show_origin || show_scope) { struct strbuf buf = STRBUF_INIT; if (show_scope) show_config_scope(&buf); if (show_origin) - show_config_origin(&buf); + show_config_origin(kvi, &buf); /* Use fwrite as "buf" can contain \0's if "end_null" is set. */ fwrite(buf.buf, 1, buf.len, stdout); strbuf_release(&buf); @@ -239,12 +239,13 @@ struct strbuf_list { int alloc; }; -static int format_config(struct strbuf *buf, const char *key_, const char *value_) +static int format_config(struct strbuf *buf, const char *key_, const char *value_, + struct key_value_info *kvi) { if (show_scope) show_config_scope(buf); if (show_origin) - show_config_origin(buf); + show_config_origin(kvi, buf); if (show_keys) strbuf_addstr(buf, key_); if (!omit_values) { @@ -299,7 +300,7 @@ static int format_config(struct strbuf *buf, const char *key_, const char *value } static int collect_config(const char *key_, const char *value_, - struct key_value_info *kvi UNUSED, void *cb) + struct key_value_info *kvi, void *cb) { struct strbuf_list *values = cb; @@ -316,7 +317,7 @@ static int collect_config(const char *key_, const char *value_, ALLOC_GROW(values->items, values->nr + 1, values->alloc); strbuf_init(&values->items[values->nr], 0); - return format_config(&values->items[values->nr++], key_, value_); + return format_config(&values->items[values->nr++], key_, value_, kvi); } static int get_value(const char *key_, const char *regex_, unsigned flags) @@ -381,7 +382,7 @@ static int get_value(const char *key_, const char *regex_, unsigned flags) ALLOC_GROW(values.items, values.nr + 1, values.alloc); item = &values.items[values.nr++]; strbuf_init(item, 0); - if (format_config(item, key_, default_value) < 0) + if (format_config(item, key_, default_value, NULL) < 0) die(_("failed to format default config value: %s"), default_value); } @@ -618,7 +619,7 @@ static int get_urlmatch(const char *var, const char *url) struct strbuf buf = STRBUF_INIT; format_config(&buf, item->string, - matched->value_is_null ? NULL : matched->value.buf); + matched->value_is_null ? NULL : matched->value.buf, NULL); fwrite(buf.buf, 1, buf.len, stdout); strbuf_release(&buf); diff --git a/builtin/remote.c b/builtin/remote.c index edb4a9ddd7f..fc4ea993ebb 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -646,7 +646,7 @@ struct push_default_info }; static int config_read_push_default(const char *key, const char *value, - struct key_value_info *kvi UNUSED, void *cb) + struct key_value_info *kvi, void *cb) { struct push_default_info* info = cb; if (strcmp(key, "remote.pushdefault") || @@ -655,8 +655,8 @@ static int config_read_push_default(const char *key, const char *value, info->scope = current_config_scope(); strbuf_reset(&info->origin); - strbuf_addstr(&info->origin, current_config_name()); - info->linenr = current_config_line(); + strbuf_addstr(&info->origin, kvi->filename); + info->linenr = kvi->linenr; return 0; } diff --git a/config.c b/config.c index aa183f6f244..0a5443243dc 100644 --- a/config.c +++ b/config.c @@ -3917,13 +3917,8 @@ static int reader_origin_type(struct config_reader *reader, return 0; } -const char *current_config_origin_type(void) +const char *config_origin_type_name(enum config_origin_type type) { - enum config_origin_type type = CONFIG_ORIGIN_UNKNOWN; - - if (reader_origin_type(&the_reader, &type)) - BUG("current_config_origin_type called outside config callback"); - switch (type) { case CONFIG_ORIGIN_BLOB: return "blob"; @@ -3969,14 +3964,6 @@ static int reader_config_name(struct config_reader *reader, const char **out) return 0; } -const char *current_config_name(void) -{ - const char *name; - if (reader_config_name(&the_reader, &name)) - BUG("current_config_name called outside config callback"); - return name ? name : ""; -} - enum config_scope current_config_scope(void) { if (the_reader.config_kvi) @@ -3991,14 +3978,6 @@ enum config_scope current_config_scope(void) return CONFIG_SCOPE_UNKNOWN; } -int current_config_line(void) -{ - if (the_reader.config_kvi) - return the_reader.config_kvi->linenr; - else - BUG("current_config_line called outside config callback"); -} - int lookup_config(const char **mapping, int nr_mapping, const char *var) { int i; diff --git a/config.h b/config.h index e4893e237e1..fb16c4aca77 100644 --- a/config.h +++ b/config.h @@ -375,9 +375,7 @@ void git_global_config(char **user, char **xdg); int git_config_parse_parameter(const char *, config_fn_t fn, void *data); enum config_scope current_config_scope(void); -const char *current_config_origin_type(void); -const char *current_config_name(void); -int current_config_line(void); +const char *config_origin_type_name(enum config_origin_type type); /* * Match and parse a config key of the form: diff --git a/t/helper/test-config.c b/t/helper/test-config.c index 00cd49e5145..337587df41d 100644 --- a/t/helper/test-config.c +++ b/t/helper/test-config.c @@ -43,7 +43,7 @@ */ static int iterate_cb(const char *var, const char *value, - struct key_value_info *kvi UNUSED, void *data UNUSED) + struct key_value_info *kvi, void *data UNUSED) { static int nr; @@ -52,9 +52,9 @@ static int iterate_cb(const char *var, const char *value, printf("key=%s\n", var); printf("value=%s\n", value ? value : "(null)"); - printf("origin=%s\n", current_config_origin_type()); - printf("name=%s\n", current_config_name()); - printf("lno=%d\n", current_config_line()); + printf("origin=%s\n", config_origin_type_name(kvi->origin_type)); + printf("name=%s\n", kvi->filename ? kvi->filename : ""); + printf("lno=%d\n", kvi->linenr); printf("scope=%s\n", config_scope_name(current_config_scope())); return 0; From patchwork Fri Apr 21 19:13:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220616 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 27BCAC77B76 for ; Fri, 21 Apr 2023 19:14:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229666AbjDUTOG (ORCPT ); Fri, 21 Apr 2023 15:14:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38664 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233512AbjDUTNv (ORCPT ); Fri, 21 Apr 2023 15:13:51 -0400 Received: from mail-wm1-x332.google.com (mail-wm1-x332.google.com [IPv6:2a00:1450:4864:20::332]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7050930F2 for ; Fri, 21 Apr 2023 12:13:30 -0700 (PDT) Received: by mail-wm1-x332.google.com with SMTP id 5b1f17b1804b1-3f09b9ac51dso59822415e9.0 for ; Fri, 21 Apr 2023 12:13:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104408; x=1684696408; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=kBsXuUNc4vnsPtHKg6TPxelBLp1IDG5bmC74/uk+bBg=; b=GGqExVUDazC0z71HgtFv6Xf79Q3ZKz6wdh7fAGBt4QTBXYiQCDwS1iDyFW3atwcxsp sFvO6im7W6gw2P3IXTRDXK4avqMUHJuZTCOZ486ebfndgWy88YL4j5jBgpNUi1woo45x WlqZhE/VukHlVr/MgcV5mHhXj3ylvIgpN5BkLSUq5S11Cfi9MwZ+FNMj7umx5M1/rsC1 iGa10dSbPjMYTHOyzBDt8iJ/b6kWbihPlCkHC0kx6CI4BPPGaivbShAHeUNelgn7d4S2 8ktwVP2YDKSfPiPPD38LHUuQ2spPrRnlU+r9o+Lv5Vz/9D+6F1rKmuzaNGXd+wbIppZB +tcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104408; x=1684696408; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kBsXuUNc4vnsPtHKg6TPxelBLp1IDG5bmC74/uk+bBg=; b=Vx9pjNbuutUqLFJLoZqEeqaNvlS3T/7173mJgMug5LHDsSposg+ofLigyzfCGBCm4H O2WbMJSJ8AlMf+hVzYaO3+sO8qfoKLee+EbVjhxdCsNpcTjnc6aoEqCcdCodxKCYgW/Y hP2MIAqDueJKt/EVlkafjECTtSlpHe0l9RULkefWPF0FJu4mWg4h+6I1OrSYMqFzr6/P yayEugdSJqxYbkCHHcI/HypoX8Hn3jYcJxO91adI0ye9d1sevDFLTdSwv5vDTV+xtJVh OL1wS0mtaouV/Kxuh9AiyGf75AMd/W6pZL3jKoAydoM1rFL5ztg2ohjXTCJJQt05roce d74Q== X-Gm-Message-State: AAQBX9dsZa/h9fyP3sHQ0/4WjfybtnUjaJMlNhO1cHwTzqN5AvnV4uKP PWFy+mYKU++3x7RJlPckhuczFIeNToo= X-Google-Smtp-Source: AKy350YDn8v6ARk+5NKDminqY60BxaQWi+OvQrZ3yDsUADXrmurwgJDe1K0irs8SwyPvMowH4dIxhg== X-Received: by 2002:a5d:6a11:0:b0:2f6:661:c03c with SMTP id m17-20020a5d6a11000000b002f60661c03cmr5145016wru.28.1682104408214; Fri, 21 Apr 2023 12:13:28 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id b5-20020a056000054500b002e5ff05765esm5013603wrf.73.2023.04.21.12.13.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:28 -0700 (PDT) Message-Id: <4723ae3bde6b8bacc4ed7b11902c65a3a72bc5e9.1682104399.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:16 +0000 Subject: [PATCH 12/14] config: remove current_config_scope() Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo Replace current_config_scope() by reading the corresponding value off "struct key_value_info". Most instances of this are trivial, except for the trace2/* files. There is a code path starting from trace2_def_param_fl() that eventually calls current_config_scope(), and thus it needs to have "kvi" plumbed through it. Additional plumbing is also needed to get "kvi" to trace2_def_param_fl(), which gets called by two code paths: - Through tr2_cfg_cb(), which is a config callback, so it trivially receives "kvi". - Through tr2_list_env_vars_fl(), which is a high level function that lists environment variables for tracing. This has been secretly behaving like git_config_from_parameters() (in that it parses config from environment variables/the CLI), but does not set config source information. Teach tr2_list_env_vars_fl() to be well-behaved by using kvi_from_param(), which is already used internally by config.c for CLI/environment variable-based config. Signed-off-by: Glen Choo --- builtin/config.c | 8 ++++---- builtin/remote.c | 2 +- config.c | 16 +--------------- config.h | 3 ++- remote.c | 6 +++--- t/helper/test-config.c | 2 +- trace2.c | 4 ++-- trace2.h | 3 ++- trace2/tr2_cfg.c | 9 ++++++--- trace2/tr2_tgt.h | 4 +++- trace2/tr2_tgt_event.c | 4 ++-- trace2/tr2_tgt_normal.c | 4 ++-- trace2/tr2_tgt_perf.c | 4 ++-- 13 files changed, 31 insertions(+), 38 deletions(-) diff --git a/builtin/config.c b/builtin/config.c index 2ffa25139c6..7899add68fb 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -204,10 +204,10 @@ static void show_config_origin(struct key_value_info *kvi, struct strbuf *buf) strbuf_addch(buf, term); } -static void show_config_scope(struct strbuf *buf) +static void show_config_scope(struct key_value_info *kvi, struct strbuf *buf) { const char term = end_nul ? '\0' : '\t'; - const char *scope = config_scope_name(current_config_scope()); + const char *scope = config_scope_name(kvi->scope); strbuf_addstr(buf, N_(scope)); strbuf_addch(buf, term); @@ -219,7 +219,7 @@ static int show_all_config(const char *key_, const char *value_, if (show_origin || show_scope) { struct strbuf buf = STRBUF_INIT; if (show_scope) - show_config_scope(&buf); + show_config_scope(kvi, &buf); if (show_origin) show_config_origin(kvi, &buf); /* Use fwrite as "buf" can contain \0's if "end_null" is set. */ @@ -243,7 +243,7 @@ static int format_config(struct strbuf *buf, const char *key_, const char *value struct key_value_info *kvi) { if (show_scope) - show_config_scope(buf); + show_config_scope(kvi, buf); if (show_origin) show_config_origin(kvi, buf); if (show_keys) diff --git a/builtin/remote.c b/builtin/remote.c index fc4ea993ebb..034998a1205 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -653,7 +653,7 @@ static int config_read_push_default(const char *key, const char *value, !value || strcmp(value, info->old_name)) return 0; - info->scope = current_config_scope(); + info->scope = kvi->scope; strbuf_reset(&info->origin); strbuf_addstr(&info->origin, kvi->filename); info->linenr = kvi->linenr; diff --git a/config.c b/config.c index 0a5443243dc..68c9b507a4d 100644 --- a/config.c +++ b/config.c @@ -643,7 +643,7 @@ static int config_parse_pair(const char *key, const char *value, /* for values read from `git_config_from_parameters()` */ -static void kvi_from_param(struct key_value_info *out) +void kvi_from_param(struct key_value_info *out) { out->filename = NULL; out->linenr = -1; @@ -3964,20 +3964,6 @@ static int reader_config_name(struct config_reader *reader, const char **out) return 0; } -enum config_scope current_config_scope(void) -{ - if (the_reader.config_kvi) - return the_reader.config_kvi->scope; - else - /* - * FIXME This should be a BUG, but tr2_list_env_vars_fl is - * calling this outside of a config callback. This will be - * easier to fix when we plumb kvi through the config callbacks, - * so leave this untouched for now. - */ - return CONFIG_SCOPE_UNKNOWN; -} - int lookup_config(const char **mapping, int nr_mapping, const char *var) { int i; diff --git a/config.h b/config.h index fb16c4aca77..f3b1a8c38a6 100644 --- a/config.h +++ b/config.h @@ -374,7 +374,6 @@ void git_global_config(char **user, char **xdg); int git_config_parse_parameter(const char *, config_fn_t fn, void *data); -enum config_scope current_config_scope(void); const char *config_origin_type_name(enum config_origin_type type); /* @@ -702,4 +701,6 @@ NORETURN void git_die_config_linenr(const char *key, const char *filename, int l lookup_config(mapping, ARRAY_SIZE(mapping), var) int lookup_config(const char **mapping, int nr_mapping, const char *var); +void kvi_from_param(struct key_value_info *out); + #endif /* CONFIG_H */ diff --git a/remote.c b/remote.c index 10868a963f2..266601157e3 100644 --- a/remote.c +++ b/remote.c @@ -349,7 +349,7 @@ static void read_branches_file(struct remote_state *remote_state, } static int handle_config(const char *key, const char *value, - struct key_value_info *kvi UNUSED, void *cb) + struct key_value_info *kvi, void *cb) { const char *name; size_t namelen; @@ -414,8 +414,8 @@ static int handle_config(const char *key, const char *value, } remote = make_remote(remote_state, name, namelen); remote->origin = REMOTE_CONFIG; - if (current_config_scope() == CONFIG_SCOPE_LOCAL || - current_config_scope() == CONFIG_SCOPE_WORKTREE) + if (kvi->scope == CONFIG_SCOPE_LOCAL || + kvi->scope == CONFIG_SCOPE_WORKTREE) remote->configured_in_repo = 1; if (!strcmp(subkey, "mirror")) remote->mirror = git_config_bool(key, value); diff --git a/t/helper/test-config.c b/t/helper/test-config.c index 337587df41d..7027ffa187f 100644 --- a/t/helper/test-config.c +++ b/t/helper/test-config.c @@ -55,7 +55,7 @@ static int iterate_cb(const char *var, const char *value, printf("origin=%s\n", config_origin_type_name(kvi->origin_type)); printf("name=%s\n", kvi->filename ? kvi->filename : ""); printf("lno=%d\n", kvi->linenr); - printf("scope=%s\n", config_scope_name(current_config_scope())); + printf("scope=%s\n", config_scope_name(kvi->scope)); return 0; } diff --git a/trace2.c b/trace2.c index e8ba62c0c3d..f519a3514b6 100644 --- a/trace2.c +++ b/trace2.c @@ -632,7 +632,7 @@ void trace2_thread_exit_fl(const char *file, int line) } void trace2_def_param_fl(const char *file, int line, const char *param, - const char *value) + const char *value, struct key_value_info *kvi) { struct tr2_tgt *tgt_j; int j; @@ -642,7 +642,7 @@ void trace2_def_param_fl(const char *file, int line, const char *param, for_each_wanted_builtin (j, tgt_j) if (tgt_j->pfn_param_fl) - tgt_j->pfn_param_fl(file, line, param, value); + tgt_j->pfn_param_fl(file, line, param, value, kvi); } void trace2_def_repo_fl(const char *file, int line, struct repository *repo) diff --git a/trace2.h b/trace2.h index 4ced30c0db3..af06f66739e 100644 --- a/trace2.h +++ b/trace2.h @@ -325,6 +325,7 @@ void trace2_thread_exit_fl(const char *file, int line); #define trace2_thread_exit() trace2_thread_exit_fl(__FILE__, __LINE__) +struct key_value_info; /* * Emits a "def_param" message containing a key/value pair. * @@ -334,7 +335,7 @@ void trace2_thread_exit_fl(const char *file, int line); * `core.abbrev`, `status.showUntrackedFiles`, or `--no-ahead-behind`. */ void trace2_def_param_fl(const char *file, int line, const char *param, - const char *value); + const char *value, struct key_value_info *kvi); #define trace2_def_param(param, value) \ trace2_def_param_fl(__FILE__, __LINE__, (param), (value)) diff --git a/trace2/tr2_cfg.c b/trace2/tr2_cfg.c index 8ed139c69f4..1450c9bec71 100644 --- a/trace2/tr2_cfg.c +++ b/trace2/tr2_cfg.c @@ -100,7 +100,7 @@ struct tr2_cfg_data { * See if the given config key matches any of our patterns of interest. */ static int tr2_cfg_cb(const char *key, const char *value, - struct key_value_info *kvi UNUSED, void *d) + struct key_value_info *kvi, void *d) { struct strbuf **s; struct tr2_cfg_data *data = (struct tr2_cfg_data *)d; @@ -109,7 +109,8 @@ static int tr2_cfg_cb(const char *key, const char *value, struct strbuf *buf = *s; int wm = wildmatch(buf->buf, key, WM_CASEFOLD); if (wm == WM_MATCH) { - trace2_def_param_fl(data->file, data->line, key, value); + trace2_def_param_fl(data->file, data->line, key, value, + kvi); return 0; } } @@ -127,8 +128,10 @@ void tr2_cfg_list_config_fl(const char *file, int line) void tr2_list_env_vars_fl(const char *file, int line) { + struct key_value_info kvi = { 0 }; struct strbuf **s; + kvi_from_param(&kvi); if (tr2_load_env_vars() <= 0) return; @@ -136,7 +139,7 @@ void tr2_list_env_vars_fl(const char *file, int line) struct strbuf *buf = *s; const char *val = getenv(buf->buf); if (val && *val) - trace2_def_param_fl(file, line, buf->buf, val); + trace2_def_param_fl(file, line, buf->buf, val, &kvi); } } diff --git a/trace2/tr2_tgt.h b/trace2/tr2_tgt.h index bf8745c4f05..9c88ca9beed 100644 --- a/trace2/tr2_tgt.h +++ b/trace2/tr2_tgt.h @@ -69,8 +69,10 @@ typedef void(tr2_tgt_evt_exec_result_fl_t)(const char *file, int line, uint64_t us_elapsed_absolute, int exec_id, int code); +struct key_value_info; typedef void(tr2_tgt_evt_param_fl_t)(const char *file, int line, - const char *param, const char *value); + const char *param, const char *value, + struct key_value_info *kvi); typedef void(tr2_tgt_evt_repo_fl_t)(const char *file, int line, const struct repository *repo); diff --git a/trace2/tr2_tgt_event.c b/trace2/tr2_tgt_event.c index 9e7aab6d510..83db3c755bd 100644 --- a/trace2/tr2_tgt_event.c +++ b/trace2/tr2_tgt_event.c @@ -476,11 +476,11 @@ static void fn_exec_result_fl(const char *file, int line, } static void fn_param_fl(const char *file, int line, const char *param, - const char *value) + const char *value, struct key_value_info *kvi) { const char *event_name = "def_param"; struct json_writer jw = JSON_WRITER_INIT; - enum config_scope scope = current_config_scope(); + enum config_scope scope = kvi->scope; const char *scope_name = config_scope_name(scope); jw_object_begin(&jw, 0); diff --git a/trace2/tr2_tgt_normal.c b/trace2/tr2_tgt_normal.c index 8672c2c2d04..65e9be9c5a4 100644 --- a/trace2/tr2_tgt_normal.c +++ b/trace2/tr2_tgt_normal.c @@ -296,10 +296,10 @@ static void fn_exec_result_fl(const char *file, int line, } static void fn_param_fl(const char *file, int line, const char *param, - const char *value) + const char *value, struct key_value_info *kvi) { struct strbuf buf_payload = STRBUF_INIT; - enum config_scope scope = current_config_scope(); + enum config_scope scope = kvi->scope; const char *scope_name = config_scope_name(scope); strbuf_addf(&buf_payload, "def_param scope:%s %s=%s", scope_name, param, diff --git a/trace2/tr2_tgt_perf.c b/trace2/tr2_tgt_perf.c index 3f2b2d53118..f402f6e3813 100644 --- a/trace2/tr2_tgt_perf.c +++ b/trace2/tr2_tgt_perf.c @@ -438,12 +438,12 @@ static void fn_exec_result_fl(const char *file, int line, } static void fn_param_fl(const char *file, int line, const char *param, - const char *value) + const char *value, struct key_value_info *kvi) { const char *event_name = "def_param"; struct strbuf buf_payload = STRBUF_INIT; struct strbuf scope_payload = STRBUF_INIT; - enum config_scope scope = current_config_scope(); + enum config_scope scope = kvi->scope; const char *scope_name = config_scope_name(scope); strbuf_addf(&buf_payload, "%s:%s", param, value); From patchwork Fri Apr 21 19:13:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220618 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6CB45C77B76 for ; Fri, 21 Apr 2023 19:14:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233572AbjDUTOW (ORCPT ); Fri, 21 Apr 2023 15:14:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38910 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233527AbjDUTN6 (ORCPT ); Fri, 21 Apr 2023 15:13:58 -0400 Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E66AA26A3 for ; Fri, 21 Apr 2023 12:13:31 -0700 (PDT) Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-3f178da21b2so22033895e9.1 for ; Fri, 21 Apr 2023 12:13:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104410; x=1684696410; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=38ror4x6wgTIJL+1zUDk/bTSNDrtdx5p1s8ovxTmpEs=; b=ftYbdMu8atr78nTfjNW9vOfDRmkxK0mSXP2OaUT3+fXt3T5XNjjQkWm71I5Ss4ykAP N9lUC2udtvxj/hejbUvw1bBHxejvp8nVftbHh5U3pDNgyS1w6hKC6rrNIksyKa+OEMHB /Loc0RMWDfj7YLI0G5ZkgywOe6K+QnVm44gEiPXsOR1IXnf5i3rRge1nbXrqtRksoU5S wPHX21jAlTKO1xvJpN//0HClXsmRmgum954TIWpI80yh+xuVFqWBaGODqv2NxdWEn8O3 YuU03+0S8/7YsLAGePTIU6dIG+1+VlJkCAIWf7oYMwXEyWIS5+npc1uii1XRxRQ+aosO 80Hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104410; x=1684696410; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=38ror4x6wgTIJL+1zUDk/bTSNDrtdx5p1s8ovxTmpEs=; b=A3PUjWh+TrNsSa5AOPiyrJZohUApzeHnd7Ddcr9gz1J84i7vjsU82/COSJQbWZDvPt yXZ81l9wejo8LT+nC9SCLO74IviMBe6Idg9oYZ9v4I2qQlbj/6E4gsjoOipF6n4n9tqz w0ERkJS1krEJDI3T1Id50mrGIzgXhXRzuyGhgILcCpt09qHK1jrDUdZfEhEsBoqcXQ8+ er7xcctAaAj++h6MDZfB+YQka0mIg3+dZrTt9hnQ6oDKTYXldN9Gq2/CcXCF5YE74Ld3 kI1VFctVN2kA8NN+hZUyA2aGDmuoB5r9Jr/l2oUzbGnBI4oa7dHFD0eCzVFsKIPl4GTG dh5w== X-Gm-Message-State: AAQBX9dpoJvMqTEVTWlCV8EOSvBs4v3ZhafFcXyGqNDDMrGpW9eUXs+A RsSiEE/57xhZTDbb3/+XNPHFsonG/uM= X-Google-Smtp-Source: AKy350Yu2V9b/4O2YD5lUgB+WACGcCxbfH9E7Kza5dVCcGtSZWs6ireb1yHDCLfbKT+0GRALm+9fIw== X-Received: by 2002:a1c:f602:0:b0:3f1:6836:5db0 with SMTP id w2-20020a1cf602000000b003f168365db0mr2806327wmc.27.1682104409234; Fri, 21 Apr 2023 12:13:29 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id t14-20020a05600c450e00b003f0a6a1f969sm9026911wmo.46.2023.04.21.12.13.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:29 -0700 (PDT) Message-Id: <11a32c86203648700cb43cd1ea1c664fd9b21c88.1682104399.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:17 +0000 Subject: [PATCH 13/14] config: pass kvi to die_bad_number() Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo Plumb "struct key_value_info" through all code paths that end in die_bad_number(), which lets us remove the helper functions that read analogous values from "struct config_reader". In config.c, this requires changing the signature of git_configset_get_value() to 'return' "kvi" in an out parameter so that git_configset_get_() can pass it to git_config_(). Outside of config.c, config callbacks now need to pass "kvi" to any of the git_config_() functions that parse a config string into a number type. Included is a .cocci patch to make that refactor. In cases where "kvi" would never be used, pass NULL, e.g.: - In config.c, when we are parsing a boolean instead of a number - In builtin/config.c, when calling normalize_value() before setting config to something the user gave us. Signed-off-by: Glen Choo --- archive-tar.c | 4 +- builtin/commit-graph.c | 4 +- builtin/commit.c | 10 +- builtin/config.c | 20 ++-- builtin/fetch.c | 4 +- builtin/fsmonitor--daemon.c | 6 +- builtin/grep.c | 2 +- builtin/index-pack.c | 4 +- builtin/log.c | 2 +- builtin/pack-objects.c | 14 +-- builtin/receive-pack.c | 10 +- builtin/submodule--helper.c | 4 +- config.c | 128 +++++++++------------ config.h | 14 ++- contrib/coccinelle/git_config_number.cocci | 27 +++++ diff.c | 9 +- fmt-merge-msg.c | 2 +- help.c | 5 +- http.c | 10 +- imap-send.c | 2 +- sequencer.c | 22 ++-- setup.c | 2 +- submodule-config.c | 15 ++- submodule-config.h | 3 +- t/helper/test-config.c | 6 +- upload-pack.c | 12 +- worktree.c | 2 +- 27 files changed, 182 insertions(+), 161 deletions(-) create mode 100644 contrib/coccinelle/git_config_number.cocci diff --git a/archive-tar.c b/archive-tar.c index dcfbce5225a..1cd6d72d21e 100644 --- a/archive-tar.c +++ b/archive-tar.c @@ -411,14 +411,14 @@ static int tar_filter_config(const char *var, const char *value, } static int git_tar_config(const char *var, const char *value, - struct key_value_info *kvi UNUSED, void *cb) + struct key_value_info *kvi, void *cb) { if (!strcmp(var, "tar.umask")) { if (value && !strcmp(value, "user")) { tar_umask = umask(0); umask(tar_umask); } else { - tar_umask = git_config_int(var, value); + tar_umask = git_config_int(var, value, kvi); } return 0; } diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c index e811866b5dd..c99804abc7e 100644 --- a/builtin/commit-graph.c +++ b/builtin/commit-graph.c @@ -185,11 +185,11 @@ static int write_option_max_new_filters(const struct option *opt, } static int git_commit_graph_write_config(const char *var, const char *value, - struct key_value_info *kvi UNUSED, + struct key_value_info *kvi, void *cb UNUSED) { if (!strcmp(var, "commitgraph.maxnewfilters")) - write_opts.max_new_filters = git_config_int(var, value); + write_opts.max_new_filters = git_config_int(var, value, kvi); /* * No need to fall-back to 'git_default_config', since this was already * called in 'cmd_commit_graph()'. diff --git a/builtin/commit.c b/builtin/commit.c index ec468e87039..e846355ec39 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -1412,7 +1412,8 @@ static int git_status_config(const char *k, const char *v, return git_column_config(k, v, "status", &s->colopts); if (!strcmp(k, "status.submodulesummary")) { int is_bool; - s->submodule_summary = git_config_bool_or_int(k, v, &is_bool); + s->submodule_summary = git_config_bool_or_int(k, v, kvi, + &is_bool); if (is_bool && s->submodule_summary) s->submodule_summary = -1; return 0; @@ -1472,11 +1473,11 @@ static int git_status_config(const char *k, const char *v, } if (!strcmp(k, "diff.renamelimit")) { if (s->rename_limit == -1) - s->rename_limit = git_config_int(k, v); + s->rename_limit = git_config_int(k, v, kvi); return 0; } if (!strcmp(k, "status.renamelimit")) { - s->rename_limit = git_config_int(k, v); + s->rename_limit = git_config_int(k, v, kvi); return 0; } if (!strcmp(k, "diff.renames")) { @@ -1622,7 +1623,8 @@ static int git_commit_config(const char *k, const char *v, } if (!strcmp(k, "commit.verbose")) { int is_bool; - config_commit_verbose = git_config_bool_or_int(k, v, &is_bool); + config_commit_verbose = git_config_bool_or_int(k, v, kvi, + &is_bool); return 0; } diff --git a/builtin/config.c b/builtin/config.c index 7899add68fb..fcfceb8e156 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -254,13 +254,14 @@ static int format_config(struct strbuf *buf, const char *key_, const char *value if (type == TYPE_INT) strbuf_addf(buf, "%"PRId64, - git_config_int64(key_, value_ ? value_ : "")); + git_config_int64(key_, value_ ? value_ : "", kvi)); else if (type == TYPE_BOOL) strbuf_addstr(buf, git_config_bool(key_, value_) ? "true" : "false"); else if (type == TYPE_BOOL_OR_INT) { int is_bool, v; - v = git_config_bool_or_int(key_, value_, &is_bool); + v = git_config_bool_or_int(key_, value_, kvi, + &is_bool); if (is_bool) strbuf_addstr(buf, v ? "true" : "false"); else @@ -411,7 +412,8 @@ free_strings: return ret; } -static char *normalize_value(const char *key, const char *value) +static char *normalize_value(const char *key, const char *value, + struct key_value_info *kvi) { if (!value) return NULL; @@ -426,12 +428,12 @@ static char *normalize_value(const char *key, const char *value) */ return xstrdup(value); if (type == TYPE_INT) - return xstrfmt("%"PRId64, git_config_int64(key, value)); + return xstrfmt("%"PRId64, git_config_int64(key, value, kvi)); if (type == TYPE_BOOL) return xstrdup(git_config_bool(key, value) ? "true" : "false"); if (type == TYPE_BOOL_OR_INT) { int is_bool, v; - v = git_config_bool_or_int(key, value, &is_bool); + v = git_config_bool_or_int(key, value, kvi, &is_bool); if (!is_bool) return xstrfmt("%d", v); else @@ -870,7 +872,7 @@ int cmd_config(int argc, const char **argv, const char *prefix) else if (actions == ACTION_SET) { check_write(); check_argc(argc, 2, 2); - value = normalize_value(argv[0], argv[1]); + value = normalize_value(argv[0], argv[1], NULL); ret = git_config_set_in_file_gently(given_config_source.file, argv[0], value); if (ret == CONFIG_NOTHING_SET) error(_("cannot overwrite multiple values with a single value\n" @@ -879,7 +881,7 @@ int cmd_config(int argc, const char **argv, const char *prefix) else if (actions == ACTION_SET_ALL) { check_write(); check_argc(argc, 2, 3); - value = normalize_value(argv[0], argv[1]); + value = normalize_value(argv[0], argv[1], NULL); ret = git_config_set_multivar_in_file_gently(given_config_source.file, argv[0], value, argv[2], flags); @@ -887,7 +889,7 @@ int cmd_config(int argc, const char **argv, const char *prefix) else if (actions == ACTION_ADD) { check_write(); check_argc(argc, 2, 2); - value = normalize_value(argv[0], argv[1]); + value = normalize_value(argv[0], argv[1], NULL); ret = git_config_set_multivar_in_file_gently(given_config_source.file, argv[0], value, CONFIG_REGEX_NONE, @@ -896,7 +898,7 @@ int cmd_config(int argc, const char **argv, const char *prefix) else if (actions == ACTION_REPLACE_ALL) { check_write(); check_argc(argc, 2, 3); - value = normalize_value(argv[0], argv[1]); + value = normalize_value(argv[0], argv[1], NULL); ret = git_config_set_multivar_in_file_gently(given_config_source.file, argv[0], value, argv[2], flags | CONFIG_FLAGS_MULTI_REPLACE); diff --git a/builtin/fetch.c b/builtin/fetch.c index aa688291613..04cf5518d2c 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -125,7 +125,7 @@ static int git_fetch_config(const char *k, const char *v, } if (!strcmp(k, "submodule.fetchjobs")) { - submodule_fetch_jobs_config = parse_submodule_fetchjobs(k, v); + submodule_fetch_jobs_config = parse_submodule_fetchjobs(k, v, kvi); return 0; } else if (!strcmp(k, "fetch.recursesubmodules")) { recurse_submodules = parse_fetch_recurse_submodules_arg(k, v); @@ -133,7 +133,7 @@ static int git_fetch_config(const char *k, const char *v, } if (!strcmp(k, "fetch.parallel")) { - fetch_parallel_config = git_config_int(k, v); + fetch_parallel_config = git_config_int(k, v, kvi); if (fetch_parallel_config < 0) die(_("fetch.parallel cannot be negative")); if (!fetch_parallel_config) diff --git a/builtin/fsmonitor--daemon.c b/builtin/fsmonitor--daemon.c index a7375d61d02..cde4a575836 100644 --- a/builtin/fsmonitor--daemon.c +++ b/builtin/fsmonitor--daemon.c @@ -40,7 +40,7 @@ static int fsmonitor_config(const char *var, const char *value, struct key_value_info *kvi, void *cb) { if (!strcmp(var, FSMONITOR__IPC_THREADS)) { - int i = git_config_int(var, value); + int i = git_config_int(var, value, kvi); if (i < 1) return error(_("value of '%s' out of range: %d"), FSMONITOR__IPC_THREADS, i); @@ -49,7 +49,7 @@ static int fsmonitor_config(const char *var, const char *value, } if (!strcmp(var, FSMONITOR__START_TIMEOUT)) { - int i = git_config_int(var, value); + int i = git_config_int(var, value, kvi); if (i < 0) return error(_("value of '%s' out of range: %d"), FSMONITOR__START_TIMEOUT, i); @@ -59,7 +59,7 @@ static int fsmonitor_config(const char *var, const char *value, if (!strcmp(var, FSMONITOR__ANNOUNCE_STARTUP)) { int is_bool; - int i = git_config_bool_or_int(var, value, &is_bool); + int i = git_config_bool_or_int(var, value, kvi, &is_bool); if (i < 0) return error(_("value of '%s' not bool or int: %d"), var, i); diff --git a/builtin/grep.c b/builtin/grep.c index 6e795f9f3a2..edb57f048ef 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -298,7 +298,7 @@ static int grep_cmd_config(const char *var, const char *value, st = -1; if (!strcmp(var, "grep.threads")) { - num_threads = git_config_int(var, value); + num_threads = git_config_int(var, value, kvi); if (num_threads < 0) die(_("invalid number of threads specified (%d) for %s"), num_threads, var); diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 4450510ddfc..e7685fa9a6f 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -1584,13 +1584,13 @@ static int git_index_pack_config(const char *k, const char *v, struct pack_idx_option *opts = cb; if (!strcmp(k, "pack.indexversion")) { - opts->version = git_config_int(k, v); + opts->version = git_config_int(k, v, kvi); if (opts->version > 2) die(_("bad pack.indexVersion=%"PRIu32), opts->version); return 0; } if (!strcmp(k, "pack.threads")) { - nr_threads = git_config_int(k, v); + nr_threads = git_config_int(k, v, kvi); if (nr_threads < 0) die(_("invalid number of threads specified (%d)"), nr_threads); diff --git a/builtin/log.c b/builtin/log.c index f8e61330491..805320a1abf 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -569,7 +569,7 @@ static int git_log_config(const char *var, const char *value, if (!strcmp(var, "format.subjectprefix")) return git_config_string(&fmt_patch_subject_prefix, var, value); if (!strcmp(var, "format.filenamemaxlength")) { - fmt_patch_name_max = git_config_int(var, value); + fmt_patch_name_max = git_config_int(var, value, kvi); return 0; } if (!strcmp(var, "format.encodeemailheaders")) { diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index ca023000cc0..cde11f83f81 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -3138,23 +3138,23 @@ static int git_pack_config(const char *k, const char *v, struct key_value_info *kvi, void *cb) { if (!strcmp(k, "pack.window")) { - window = git_config_int(k, v); + window = git_config_int(k, v, kvi); return 0; } if (!strcmp(k, "pack.windowmemory")) { - window_memory_limit = git_config_ulong(k, v); + window_memory_limit = git_config_ulong(k, v, kvi); return 0; } if (!strcmp(k, "pack.depth")) { - depth = git_config_int(k, v); + depth = git_config_int(k, v, kvi); return 0; } if (!strcmp(k, "pack.deltacachesize")) { - max_delta_cache_size = git_config_int(k, v); + max_delta_cache_size = git_config_int(k, v, kvi); return 0; } if (!strcmp(k, "pack.deltacachelimit")) { - cache_max_small_delta_size = git_config_int(k, v); + cache_max_small_delta_size = git_config_int(k, v, kvi); return 0; } if (!strcmp(k, "pack.writebitmaphashcache")) { @@ -3180,7 +3180,7 @@ static int git_pack_config(const char *k, const char *v, return 0; } if (!strcmp(k, "pack.threads")) { - delta_search_threads = git_config_int(k, v); + delta_search_threads = git_config_int(k, v, kvi); if (delta_search_threads < 0) die(_("invalid number of threads specified (%d)"), delta_search_threads); @@ -3191,7 +3191,7 @@ static int git_pack_config(const char *k, const char *v, return 0; } if (!strcmp(k, "pack.indexversion")) { - pack_idx_opts.version = git_config_int(k, v); + pack_idx_opts.version = git_config_int(k, v, kvi); if (pack_idx_opts.version > 2) die(_("bad pack.indexVersion=%"PRIu32), pack_idx_opts.version); diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 2f5fd2abbc3..d2bc0fead9f 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -154,12 +154,12 @@ static int receive_pack_config(const char *var, const char *value, } if (strcmp(var, "receive.unpacklimit") == 0) { - receive_unpack_limit = git_config_int(var, value); + receive_unpack_limit = git_config_int(var, value, kvi); return 0; } if (strcmp(var, "transfer.unpacklimit") == 0) { - transfer_unpack_limit = git_config_int(var, value); + transfer_unpack_limit = git_config_int(var, value, kvi); return 0; } @@ -227,7 +227,7 @@ static int receive_pack_config(const char *var, const char *value, return git_config_string(&cert_nonce_seed, var, value); if (strcmp(var, "receive.certnonceslop") == 0) { - nonce_stamp_slop_limit = git_config_ulong(var, value); + nonce_stamp_slop_limit = git_config_ulong(var, value, kvi); return 0; } @@ -242,12 +242,12 @@ static int receive_pack_config(const char *var, const char *value, } if (strcmp(var, "receive.keepalive") == 0) { - keepalive_in_sec = git_config_int(var, value); + keepalive_in_sec = git_config_int(var, value, kvi); return 0; } if (strcmp(var, "receive.maxinputsize") == 0) { - max_input_size = git_config_int64(var, value); + max_input_size = git_config_int64(var, value, kvi); return 0; } diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 8570effbf0d..bda10764db5 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -2187,13 +2187,13 @@ static int update_clone_task_finished(int result, } static int git_update_clone_config(const char *var, const char *value, - struct key_value_info *kvi UNUSED, + struct key_value_info *kvi, void *cb) { int *max_jobs = cb; if (!strcmp(var, "submodule.fetchjobs")) - *max_jobs = parse_submodule_fetchjobs(var, value); + *max_jobs = parse_submodule_fetchjobs(var, value, kvi); return 0; } diff --git a/config.c b/config.c index 68c9b507a4d..e78de67c452 100644 --- a/config.c +++ b/config.c @@ -1309,80 +1309,74 @@ int git_parse_ssize_t(const char *value, ssize_t *ret) return 1; } -static int reader_config_name(struct config_reader *reader, const char **out); -static int reader_origin_type(struct config_reader *reader, - enum config_origin_type *type); NORETURN -static void die_bad_number(struct config_reader *reader, const char *name, - const char *value) +static void die_bad_number(const char *name, const char *value, + struct key_value_info *kvi) { const char *error_type = (errno == ERANGE) ? N_("out of range") : N_("invalid unit"); const char *bad_numeric = N_("bad numeric config value '%s' for '%s': %s"); - const char *config_name = NULL; - enum config_origin_type config_origin = CONFIG_ORIGIN_UNKNOWN; if (!value) value = ""; - /* Ignoring the return value is okay since we handle missing values. */ - reader_config_name(reader, &config_name); - reader_origin_type(reader, &config_origin); - - if (!config_name) + if (!kvi || !kvi->filename) die(_(bad_numeric), value, name, _(error_type)); - switch (config_origin) { + switch (kvi->origin_type) { case CONFIG_ORIGIN_BLOB: die(_("bad numeric config value '%s' for '%s' in blob %s: %s"), - value, name, config_name, _(error_type)); + value, name, kvi->filename, _(error_type)); case CONFIG_ORIGIN_FILE: die(_("bad numeric config value '%s' for '%s' in file %s: %s"), - value, name, config_name, _(error_type)); + value, name, kvi->filename, _(error_type)); case CONFIG_ORIGIN_STDIN: die(_("bad numeric config value '%s' for '%s' in standard input: %s"), value, name, _(error_type)); case CONFIG_ORIGIN_SUBMODULE_BLOB: die(_("bad numeric config value '%s' for '%s' in submodule-blob %s: %s"), - value, name, config_name, _(error_type)); + value, name, kvi->filename, _(error_type)); case CONFIG_ORIGIN_CMDLINE: die(_("bad numeric config value '%s' for '%s' in command line %s: %s"), - value, name, config_name, _(error_type)); + value, name, kvi->filename, _(error_type)); default: die(_("bad numeric config value '%s' for '%s' in %s: %s"), - value, name, config_name, _(error_type)); + value, name, kvi->filename, _(error_type)); } } -int git_config_int(const char *name, const char *value) +int git_config_int(const char *name, const char *value, + struct key_value_info *kvi) { int ret; if (!git_parse_int(value, &ret)) - die_bad_number(&the_reader, name, value); + die_bad_number(name, value, kvi); return ret; } -int64_t git_config_int64(const char *name, const char *value) +int64_t git_config_int64(const char *name, const char *value, struct key_value_info *kvi) { int64_t ret; if (!git_parse_int64(value, &ret)) - die_bad_number(&the_reader, name, value); + die_bad_number(name, value, kvi); return ret; } -unsigned long git_config_ulong(const char *name, const char *value) +unsigned long git_config_ulong(const char *name, const char *value, + struct key_value_info *kvi) { unsigned long ret; if (!git_parse_ulong(value, &ret)) - die_bad_number(&the_reader, name, value); + die_bad_number(name, value, kvi); return ret; } -ssize_t git_config_ssize_t(const char *name, const char *value) +ssize_t git_config_ssize_t(const char *name, const char *value, + struct key_value_info *kvi) { ssize_t ret; if (!git_parse_ssize_t(value, &ret)) - die_bad_number(&the_reader, name, value); + die_bad_number(name, value, kvi); return ret; } @@ -1487,7 +1481,8 @@ int git_parse_maybe_bool(const char *value) return -1; } -int git_config_bool_or_int(const char *name, const char *value, int *is_bool) +int git_config_bool_or_int(const char *name, const char *value, + struct key_value_info *kvi, int *is_bool) { int v = git_parse_maybe_bool_text(value); if (0 <= v) { @@ -1495,7 +1490,7 @@ int git_config_bool_or_int(const char *name, const char *value, int *is_bool) return v; } *is_bool = 0; - return git_config_int(name, value); + return git_config_int(name, value, kvi); } int git_config_bool(const char *name, const char *value) @@ -1621,7 +1616,7 @@ static int git_default_core_config(const char *var, const char *value, else if (!git_parse_maybe_bool_text(value)) default_abbrev = the_hash_algo->hexsz; else { - int abbrev = git_config_int(var, value); + int abbrev = git_config_int(var, value, kvi); if (abbrev < minimum_abbrev || abbrev > the_hash_algo->hexsz) return error(_("abbrev length out of range: %d"), abbrev); default_abbrev = abbrev; @@ -1633,7 +1628,7 @@ static int git_default_core_config(const char *var, const char *value, return set_disambiguate_hint_config(var, value); if (!strcmp(var, "core.loosecompression")) { - int level = git_config_int(var, value); + int level = git_config_int(var, value, kvi); if (level == -1) level = Z_DEFAULT_COMPRESSION; else if (level < 0 || level > Z_BEST_COMPRESSION) @@ -1644,7 +1639,7 @@ static int git_default_core_config(const char *var, const char *value, } if (!strcmp(var, "core.compression")) { - int level = git_config_int(var, value); + int level = git_config_int(var, value, kvi); if (level == -1) level = Z_DEFAULT_COMPRESSION; else if (level < 0 || level > Z_BEST_COMPRESSION) @@ -1658,7 +1653,7 @@ static int git_default_core_config(const char *var, const char *value, if (!strcmp(var, "core.packedgitwindowsize")) { int pgsz_x2 = getpagesize() * 2; - packed_git_window_size = git_config_ulong(var, value); + packed_git_window_size = git_config_ulong(var, value, kvi); /* This value must be multiple of (pagesize * 2) */ packed_git_window_size /= pgsz_x2; @@ -1669,17 +1664,17 @@ static int git_default_core_config(const char *var, const char *value, } if (!strcmp(var, "core.bigfilethreshold")) { - big_file_threshold = git_config_ulong(var, value); + big_file_threshold = git_config_ulong(var, value, kvi); return 0; } if (!strcmp(var, "core.packedgitlimit")) { - packed_git_limit = git_config_ulong(var, value); + packed_git_limit = git_config_ulong(var, value, kvi); return 0; } if (!strcmp(var, "core.deltabasecachelimit")) { - delta_base_cache_limit = git_config_ulong(var, value); + delta_base_cache_limit = git_config_ulong(var, value, kvi); return 0; } @@ -1963,12 +1958,12 @@ int git_default_config(const char *var, const char *value, } if (!strcmp(var, "pack.packsizelimit")) { - pack_size_limit_cfg = git_config_ulong(var, value); + pack_size_limit_cfg = git_config_ulong(var, value, kvi); return 0; } if (!strcmp(var, "pack.compression")) { - int level = git_config_int(var, value); + int level = git_config_int(var, value, kvi); if (level == -1) level = Z_DEFAULT_COMPRESSION; else if (level < 0 || level > Z_BEST_COMPRESSION) @@ -2474,11 +2469,12 @@ int git_configset_add_file(struct config_set *set, const char *filename) return git_config_from_file(config_set_callback, filename, &data); } -int git_configset_get_value(struct config_set *set, const char *key, const char **value) +int git_configset_get_value(struct config_set *set, const char *key, + const char **value, struct key_value_info *kvi) { const struct string_list *values = NULL; int ret; - + struct string_list_item item; /* * Follows "last one wins" semantic, i.e., if there are multiple matches for the * queried key in the files of the configset, the value returned will be the last @@ -2488,7 +2484,10 @@ int git_configset_get_value(struct config_set *set, const char *key, const char return ret; assert(values->nr > 0); - *value = values->items[values->nr - 1].string; + item = values->items[values->nr - 1]; + *value = item.string; + if (kvi) + *kvi = *((struct key_value_info *)item.util); return 0; } @@ -2541,7 +2540,7 @@ int git_configset_get(struct config_set *set, const char *key) int git_configset_get_string(struct config_set *set, const char *key, char **dest) { const char *value; - if (!git_configset_get_value(set, key, &value)) + if (!git_configset_get_value(set, key, &value, NULL)) return git_config_string((const char **)dest, key, value); else return 1; @@ -2551,7 +2550,7 @@ static int git_configset_get_string_tmp(struct config_set *set, const char *key, const char **dest) { const char *value; - if (!git_configset_get_value(set, key, &value)) { + if (!git_configset_get_value(set, key, &value, NULL)) { if (!value) return config_error_nonbool(key); *dest = value; @@ -2564,8 +2563,10 @@ static int git_configset_get_string_tmp(struct config_set *set, const char *key, int git_configset_get_int(struct config_set *set, const char *key, int *dest) { const char *value; - if (!git_configset_get_value(set, key, &value)) { - *dest = git_config_int(key, value); + struct key_value_info kvi; + + if (!git_configset_get_value(set, key, &value, &kvi)) { + *dest = git_config_int(key, value, &kvi); return 0; } else return 1; @@ -2574,8 +2575,10 @@ int git_configset_get_int(struct config_set *set, const char *key, int *dest) int git_configset_get_ulong(struct config_set *set, const char *key, unsigned long *dest) { const char *value; - if (!git_configset_get_value(set, key, &value)) { - *dest = git_config_ulong(key, value); + struct key_value_info kvi; + + if (!git_configset_get_value(set, key, &value, &kvi)) { + *dest = git_config_ulong(key, value, &kvi); return 0; } else return 1; @@ -2584,7 +2587,7 @@ int git_configset_get_ulong(struct config_set *set, const char *key, unsigned lo int git_configset_get_bool(struct config_set *set, const char *key, int *dest) { const char *value; - if (!git_configset_get_value(set, key, &value)) { + if (!git_configset_get_value(set, key, &value, NULL)) { *dest = git_config_bool(key, value); return 0; } else @@ -2595,8 +2598,10 @@ int git_configset_get_bool_or_int(struct config_set *set, const char *key, int *is_bool, int *dest) { const char *value; - if (!git_configset_get_value(set, key, &value)) { - *dest = git_config_bool_or_int(key, value, is_bool); + struct key_value_info kvi; + + if (!git_configset_get_value(set, key, &value, &kvi)) { + *dest = git_config_bool_or_int(key, value, &kvi, is_bool); return 0; } else return 1; @@ -2605,7 +2610,7 @@ int git_configset_get_bool_or_int(struct config_set *set, const char *key, int git_configset_get_maybe_bool(struct config_set *set, const char *key, int *dest) { const char *value; - if (!git_configset_get_value(set, key, &value)) { + if (!git_configset_get_value(set, key, &value, NULL)) { *dest = git_parse_maybe_bool(value); if (*dest == -1) return -1; @@ -2617,7 +2622,7 @@ int git_configset_get_maybe_bool(struct config_set *set, const char *key, int *d int git_configset_get_pathname(struct config_set *set, const char *key, const char **dest) { const char *value; - if (!git_configset_get_value(set, key, &value)) + if (!git_configset_get_value(set, key, &value, NULL)) return git_config_pathname(dest, key, value); else return 1; @@ -2687,7 +2692,7 @@ int repo_config_get_value(struct repository *repo, const char *key, const char **value) { git_config_check_init(repo); - return git_configset_get_value(repo->config, key, value); + return git_configset_get_value(repo->config, key, value, NULL); } int repo_config_get_value_multi(struct repository *repo, const char *key, @@ -3907,16 +3912,6 @@ int parse_config_key(const char *var, return 0; } -static int reader_origin_type(struct config_reader *reader, - enum config_origin_type *type) -{ - if (the_reader.config_kvi) - *type = reader->config_kvi->origin_type; - else - return 1; - return 0; -} - const char *config_origin_type_name(enum config_origin_type type) { switch (type) { @@ -3955,15 +3950,6 @@ const char *config_scope_name(enum config_scope scope) } } -static int reader_config_name(struct config_reader *reader, const char **out) -{ - if (the_reader.config_kvi) - *out = reader->config_kvi->filename; - else - return 1; - return 0; -} - int lookup_config(const char **mapping, int nr_mapping, const char *var) { int i; diff --git a/config.h b/config.h index f3b1a8c38a6..ffb2d76823c 100644 --- a/config.h +++ b/config.h @@ -237,22 +237,23 @@ int git_parse_maybe_bool(const char *); * Parse the string to an integer, including unit factors. Dies on error; * otherwise, returns the parsed result. */ -int git_config_int(const char *, const char *); +int git_config_int(const char *, const char *, struct key_value_info *); -int64_t git_config_int64(const char *, const char *); +int64_t git_config_int64(const char *, const char *, struct key_value_info *); /** * Identical to `git_config_int`, but for unsigned longs. */ -unsigned long git_config_ulong(const char *, const char *); +unsigned long git_config_ulong(const char *, const char *, struct key_value_info *); -ssize_t git_config_ssize_t(const char *, const char *); +ssize_t git_config_ssize_t(const char *, const char *, struct key_value_info *); /** * Same as `git_config_bool`, except that integers are returned as-is, and * an `is_bool` flag is unset. */ -int git_config_bool_or_int(const char *, const char *, int *); +int git_config_bool_or_int(const char *, const char *, struct key_value_info *, + int *); /** * Parse a string into a boolean value, respecting keywords like "true" and @@ -516,7 +517,8 @@ int git_configset_get(struct config_set *cs, const char *key); * touching `value`. The caller should not free or modify `value`, as it * is owned by the cache. */ -int git_configset_get_value(struct config_set *cs, const char *key, const char **dest); +int git_configset_get_value(struct config_set *cs, const char *key, + const char **dest, struct key_value_info *kvi); int git_configset_get_string(struct config_set *cs, const char *key, char **dest); int git_configset_get_int(struct config_set *cs, const char *key, int *dest); diff --git a/contrib/coccinelle/git_config_number.cocci b/contrib/coccinelle/git_config_number.cocci new file mode 100644 index 00000000000..f46c74dd23c --- /dev/null +++ b/contrib/coccinelle/git_config_number.cocci @@ -0,0 +1,27 @@ +@@ +identifier C1, C2, C3; +@@ +( +( +git_config_int +| +git_config_int64 +| +git_config_ulong +| +git_config_ssize_t +) + (C1, C2 ++ , kvi + ) +| +( +git_configset_get_value +| +git_config_bool_or_int +) + (C1, C2, ++ kvi, + C3 + ) +) diff --git a/diff.c b/diff.c index d7ed2dc900b..da7cd353a6d 100644 --- a/diff.c +++ b/diff.c @@ -372,13 +372,14 @@ int git_diff_ui_config(const char *var, const char *value, return 0; } if (!strcmp(var, "diff.context")) { - diff_context_default = git_config_int(var, value); + diff_context_default = git_config_int(var, value, kvi); if (diff_context_default < 0) return -1; return 0; } if (!strcmp(var, "diff.interhunkcontext")) { - diff_interhunk_context_default = git_config_int(var, value); + diff_interhunk_context_default = git_config_int(var, value, + kvi); if (diff_interhunk_context_default < 0) return -1; return 0; @@ -404,7 +405,7 @@ int git_diff_ui_config(const char *var, const char *value, return 0; } if (!strcmp(var, "diff.statgraphwidth")) { - diff_stat_graph_width = git_config_int(var, value); + diff_stat_graph_width = git_config_int(var, value, kvi); return 0; } if (!strcmp(var, "diff.external")) @@ -443,7 +444,7 @@ int git_diff_basic_config(const char *var, const char *value, const char *name; if (!strcmp(var, "diff.renamelimit")) { - diff_rename_limit_default = git_config_int(var, value); + diff_rename_limit_default = git_config_int(var, value, kvi); return 0; } diff --git a/fmt-merge-msg.c b/fmt-merge-msg.c index 97358034fa0..d1b59af44bb 100644 --- a/fmt-merge-msg.c +++ b/fmt-merge-msg.c @@ -24,7 +24,7 @@ int fmt_merge_msg_config(const char *key, const char *value, { if (!strcmp(key, "merge.log") || !strcmp(key, "merge.summary")) { 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, kvi, &is_bool); if (!is_bool && merge_log_config < 0) return error("%s: negative length %s", key, value); if (is_bool && merge_log_config) diff --git a/help.c b/help.c index 43d1eb702cd..08f0b953736 100644 --- a/help.c +++ b/help.c @@ -545,8 +545,7 @@ static struct cmdnames aliases; #define AUTOCORRECT_IMMEDIATELY (-1) static int git_unknown_cmd_config(const char *var, const char *value, - struct key_value_info *kvi UNUSED, - void *cb UNUSED) + struct key_value_info *kvi, void *cb UNUSED) { const char *p; @@ -560,7 +559,7 @@ static int git_unknown_cmd_config(const char *var, const char *value, } else if (!strcmp(value, "prompt")) { autocorrect = AUTOCORRECT_PROMPT; } else { - int v = git_config_int(var, value); + int v = git_config_int(var, value, kvi); autocorrect = (v < 0) ? AUTOCORRECT_IMMEDIATELY : v; } diff --git a/http.c b/http.c index 3d4292eba6a..a26c3dff827 100644 --- a/http.c +++ b/http.c @@ -412,21 +412,21 @@ static int http_options(const char *var, const char *value, } if (!strcmp("http.minsessions", var)) { - min_curl_sessions = git_config_int(var, value); + min_curl_sessions = git_config_int(var, value, kvi); if (min_curl_sessions > 1) min_curl_sessions = 1; return 0; } if (!strcmp("http.maxrequests", var)) { - max_requests = git_config_int(var, value); + max_requests = git_config_int(var, value, kvi); return 0; } if (!strcmp("http.lowspeedlimit", var)) { - curl_low_speed_limit = (long)git_config_int(var, value); + curl_low_speed_limit = (long)git_config_int(var, value, kvi); return 0; } if (!strcmp("http.lowspeedtime", var)) { - curl_low_speed_time = (long)git_config_int(var, value); + curl_low_speed_time = (long)git_config_int(var, value, kvi); return 0; } @@ -462,7 +462,7 @@ static int http_options(const char *var, const char *value, } if (!strcmp("http.postbuffer", var)) { - http_post_buffer = git_config_ssize_t(var, value); + http_post_buffer = git_config_ssize_t(var, value, kvi); if (http_post_buffer < 0) warning(_("negative value for http.postBuffer; defaulting to %d"), LARGE_PACKET_MAX); if (http_post_buffer < LARGE_PACKET_MAX) diff --git a/imap-send.c b/imap-send.c index 3cc98f1a0a5..3c391a52c5a 100644 --- a/imap-send.c +++ b/imap-send.c @@ -1341,7 +1341,7 @@ static int git_imap_config(const char *var, const char *val, else if (!strcmp("imap.authmethod", var)) return git_config_string(&server.auth_method, var, val); else if (!strcmp("imap.port", var)) - server.port = git_config_int(var, val); + server.port = git_config_int(var, val, kvi); else if (!strcmp("imap.host", var)) { if (!val) { git_die_config("imap.host", "Missing value for 'imap.host'"); diff --git a/sequencer.c b/sequencer.c index 171561c2cdb..76b4750b4bd 100644 --- a/sequencer.c +++ b/sequencer.c @@ -2878,7 +2878,7 @@ static int git_config_string_dup(char **dest, } static int populate_opts_cb(const char *key, const char *value, - struct key_value_info *kvi UNUSED, void *data) + struct key_value_info *kvi, void *data) { struct replay_opts *opts = data; int error_flag = 1; @@ -2886,26 +2886,26 @@ static int populate_opts_cb(const char *key, const char *value, if (!value) error_flag = 0; else if (!strcmp(key, "options.no-commit")) - opts->no_commit = git_config_bool_or_int(key, value, &error_flag); + opts->no_commit = git_config_bool_or_int(key, value, kvi, &error_flag); else if (!strcmp(key, "options.edit")) - opts->edit = git_config_bool_or_int(key, value, &error_flag); + opts->edit = git_config_bool_or_int(key, value, kvi, &error_flag); else if (!strcmp(key, "options.allow-empty")) opts->allow_empty = - git_config_bool_or_int(key, value, &error_flag); + git_config_bool_or_int(key, value, kvi, &error_flag); else if (!strcmp(key, "options.allow-empty-message")) opts->allow_empty_message = - git_config_bool_or_int(key, value, &error_flag); + git_config_bool_or_int(key, value, kvi, &error_flag); else if (!strcmp(key, "options.keep-redundant-commits")) opts->keep_redundant_commits = - git_config_bool_or_int(key, value, &error_flag); + git_config_bool_or_int(key, value, kvi, &error_flag); else if (!strcmp(key, "options.signoff")) - opts->signoff = git_config_bool_or_int(key, value, &error_flag); + opts->signoff = git_config_bool_or_int(key, value, kvi, &error_flag); else if (!strcmp(key, "options.record-origin")) - opts->record_origin = git_config_bool_or_int(key, value, &error_flag); + opts->record_origin = git_config_bool_or_int(key, value, kvi, &error_flag); else if (!strcmp(key, "options.allow-ff")) - opts->allow_ff = git_config_bool_or_int(key, value, &error_flag); + opts->allow_ff = git_config_bool_or_int(key, value, kvi, &error_flag); else if (!strcmp(key, "options.mainline")) - opts->mainline = git_config_int(key, value); + opts->mainline = git_config_int(key, value, kvi); else if (!strcmp(key, "options.strategy")) git_config_string_dup(&opts->strategy, key, value); else if (!strcmp(key, "options.gpg-sign")) @@ -2915,7 +2915,7 @@ static int populate_opts_cb(const char *key, const char *value, opts->xopts[opts->xopts_nr++] = xstrdup(value); } else if (!strcmp(key, "options.allow-rerere-auto")) opts->allow_rerere_auto = - git_config_bool_or_int(key, value, &error_flag) ? + git_config_bool_or_int(key, value, kvi, &error_flag) ? RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE; else if (!strcmp(key, "options.default-msg-cleanup")) { opts->explicit_cleanup = 1; diff --git a/setup.c b/setup.c index a461dd15233..75934d7438f 100644 --- a/setup.c +++ b/setup.c @@ -594,7 +594,7 @@ static int check_repo_format(const char *var, const char *value, const char *ext; if (strcmp(var, "core.repositoryformatversion") == 0) - data->version = git_config_int(var, value); + data->version = git_config_int(var, value, kvi); else if (skip_prefix(var, "extensions.", &ext)) { switch (handle_extension_v0(var, value, ext, data)) { case EXTENSION_ERROR: diff --git a/submodule-config.c b/submodule-config.c index 7d773f33621..b86547fd1ee 100644 --- a/submodule-config.c +++ b/submodule-config.c @@ -302,9 +302,10 @@ static int parse_fetch_recurse(const char *opt, const char *arg, } } -int parse_submodule_fetchjobs(const char *var, const char *value) +int parse_submodule_fetchjobs(const char *var, const char *value, + struct key_value_info *kvi) { - int fetchjobs = git_config_int(var, value); + int fetchjobs = git_config_int(var, value, kvi); if (fetchjobs < 0) die(_("negative values not allowed for submodule.fetchJobs")); if (!fetchjobs) @@ -848,14 +849,13 @@ struct fetch_config { }; static int gitmodules_fetch_config(const char *var, const char *value, - struct key_value_info *kvi UNUSED, - void *cb) + struct key_value_info *kvi, void *cb) { struct fetch_config *config = cb; if (!strcmp(var, "submodule.fetchjobs")) { if (config->max_children) *(config->max_children) = - parse_submodule_fetchjobs(var, value); + parse_submodule_fetchjobs(var, value, kvi); return 0; } else if (!strcmp(var, "fetch.recursesubmodules")) { if (config->recurse_submodules) @@ -877,12 +877,11 @@ void fetch_config_from_gitmodules(int *max_children, int *recurse_submodules) } static int gitmodules_update_clone_config(const char *var, const char *value, - struct key_value_info *kvi UNUSED, - void *cb) + struct key_value_info *kvi, void *cb) { int *max_jobs = cb; if (!strcmp(var, "submodule.fetchjobs")) - *max_jobs = parse_submodule_fetchjobs(var, value); + *max_jobs = parse_submodule_fetchjobs(var, value, kvi); return 0; } diff --git a/submodule-config.h b/submodule-config.h index c2045875bbb..944cae75cc9 100644 --- a/submodule-config.h +++ b/submodule-config.h @@ -50,7 +50,8 @@ struct repository; void submodule_cache_free(struct submodule_cache *cache); -int parse_submodule_fetchjobs(const char *var, const char *value); +int parse_submodule_fetchjobs(const char *var, const char *value, + struct key_value_info *kvi); int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg); struct option; int option_fetch_parse_recurse_submodules(const struct option *opt, diff --git a/t/helper/test-config.c b/t/helper/test-config.c index 7027ffa187f..737505583d4 100644 --- a/t/helper/test-config.c +++ b/t/helper/test-config.c @@ -61,12 +61,12 @@ static int iterate_cb(const char *var, const char *value, } static int parse_int_cb(const char *var, const char *value, - struct key_value_info *kvi UNUSED, void *data) + struct key_value_info *kvi, void *data) { const char *key_to_match = data; if (!strcmp(key_to_match, var)) { - int parsed = git_config_int(value, value); + int parsed = git_config_int(value, value, kvi); printf("%d\n", parsed); } return 0; @@ -179,7 +179,7 @@ int cmd__config(int argc, const char **argv) goto exit2; } } - if (!git_configset_get_value(&cs, argv[2], &v)) { + if (!git_configset_get_value(&cs, argv[2], &v, NULL)) { if (!v) printf("(NULL)\n"); else diff --git a/upload-pack.c b/upload-pack.c index 5f8232ff078..7cf776cde91 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -1264,7 +1264,8 @@ static int find_symref(const char *refname, } static int parse_object_filter_config(const char *var, const char *value, - struct upload_pack_data *data) + struct key_value_info *kvi, + struct upload_pack_data *data) { struct strbuf buf = STRBUF_INIT; const char *sub, *key; @@ -1291,7 +1292,8 @@ static int parse_object_filter_config(const char *var, const char *value, } string_list_insert(&data->allowed_filters, buf.buf)->util = (void *)(intptr_t)1; - data->tree_filter_max_depth = git_config_ulong(var, value); + data->tree_filter_max_depth = git_config_ulong(var, value, + kvi); } strbuf_release(&buf); @@ -1299,7 +1301,7 @@ static int parse_object_filter_config(const char *var, const char *value, } static int upload_pack_config(const char *var, const char *value, - struct key_value_info *kvi UNUSED, + struct key_value_info *kvi, void *cb_data) { struct upload_pack_data *data = cb_data; @@ -1320,7 +1322,7 @@ static int upload_pack_config(const char *var, const char *value, else data->allow_uor &= ~ALLOW_ANY_SHA1; } else if (!strcmp("uploadpack.keepalive", var)) { - data->keepalive = git_config_int(var, value); + data->keepalive = git_config_int(var, value, kvi); if (!data->keepalive) data->keepalive = -1; } else if (!strcmp("uploadpack.allowfilter", var)) { @@ -1335,7 +1337,7 @@ static int upload_pack_config(const char *var, const char *value, data->advertise_sid = git_config_bool(var, value); } - if (parse_object_filter_config(var, value, data) < 0) + if (parse_object_filter_config(var, value, kvi, data) < 0) return -1; return parse_hide_refs_config(var, value, "uploadpack", &data->hidden_refs); diff --git a/worktree.c b/worktree.c index b5ee71c5ebd..1fbdbd745fb 100644 --- a/worktree.c +++ b/worktree.c @@ -835,7 +835,7 @@ int init_worktree_config(struct repository *r) * Relocate that value to avoid breaking all worktrees with this * upgrade to worktree config. */ - if (!git_configset_get_value(&cs, "core.worktree", &core_worktree)) { + if (!git_configset_get_value(&cs, "core.worktree", &core_worktree, NULL)) { if ((res = move_config_setting("core.worktree", core_worktree, common_config_file, main_worktree_file))) From patchwork Fri Apr 21 19:13:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glen Choo X-Patchwork-Id: 13220615 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B063EC7618E for ; Fri, 21 Apr 2023 19:14:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233293AbjDUTOD (ORCPT ); Fri, 21 Apr 2023 15:14:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38366 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233470AbjDUTNu (ORCPT ); Fri, 21 Apr 2023 15:13:50 -0400 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A3A3D30C0 for ; Fri, 21 Apr 2023 12:13:30 -0700 (PDT) Received: by mail-wr1-x42b.google.com with SMTP id ffacd0b85a97d-2f86ee42669so2020670f8f.2 for ; Fri, 21 Apr 2023 12:13:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682104410; x=1684696410; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=KCS8EuGOJ+3i8Nh6ql6erR2ZLU3MRiOjA+7OQ098TTc=; b=NlHKWshFInaDEit334a37tWz8oE/fnr9rdtLkG53ZbHLbQ1LC279qyuV7CgQX/bFgY nxG0IloGiJM7TS+ZmDUR4eKgfhJjUphPLR9GZ7i3obuHUaCy/4WGwzJZrKcKewulPFns Rz/tWC6NLDydtpMYH5wf5CbzwhjNI9lKQKEyhFaGCMFMZICaVXtdRf9odBMeDsHp9DLL yuZqBmw9YkrHic1ARqSVSjnI+gBmbcSkJQbbXskIr5GO/3wbpEMzngurJjLZ7l1rullV ySlPMg9VNATc5iS+wCXu1HhnOv7IQGa7VZ1oh0IQYGxwvMHdhNZ2BnNIYJyLnFkAqZn6 0mNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682104410; x=1684696410; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KCS8EuGOJ+3i8Nh6ql6erR2ZLU3MRiOjA+7OQ098TTc=; b=FsFSZhESGEfxTnpwhsnxIPVnv/Xf/nfhj+A5zisk7pBd3ZjGebUHL7O92K3NjiV3H0 48y7k97Nw96SEDRtzuoVhxdc/1S0QMMKXEn+wkC0JZ+CvKH/xuM7+iD1mPcipaQSdB8F P/y9dozstJCDS0AIBIX0hArmSLGZpHjTejhyxS9sNE9ItVGUQXu4IN3SQC78BTqerzx3 5uZxeotpYuxfs/FxSP+LX27W0/SPQPMP0yZ6xJ8B8jNC0PgiA/S9siS3OCAp0UgY2h9m q8l7dqh84Jl27nqpEBymgc7f7bgUYL29brXVzr/nDoRPJ0f4tWZZ6dJC2V229MOIgm/P 05Ig== X-Gm-Message-State: AAQBX9cRNvO0HF5CRfjjWTAxvVgNyuSF/NDw+FAA8Lsy2JC3JeGBNo4T ksoe5h+/1qDx1P6JEdHAJLV5EP9cY0A= X-Google-Smtp-Source: AKy350bKXnCbAbeCySOgZmnXbZu09B0KnmEsZzpOwDv9NnMoVO7hRMm/PZwbIdms1Bqpk8gb0/eYgg== X-Received: by 2002:a5d:55cf:0:b0:2ff:613c:af5d with SMTP id i15-20020a5d55cf000000b002ff613caf5dmr4361194wrw.36.1682104409820; Fri, 21 Apr 2023 12:13:29 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id u8-20020a7bc048000000b003f1952a4bdesm1764737wmc.26.2023.04.21.12.13.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 12:13:29 -0700 (PDT) Message-Id: <33e59152293136e6430cc47e311c1167da167e37.1682104399.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 21 Apr 2023 19:13:18 +0000 Subject: [PATCH 14/14] config: remove config_reader from configset_add_value Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jonathan Tan , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Emily Shaffer , Glen Choo , Glen Choo Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Glen Choo From: Glen Choo Since we now get "kvi" from the config callback, we can stop passing it via "*data". Now "struct config_reader" has no more references, so get rid of it. Signed-off-by: Glen Choo --- config.c | 81 ++++++++++---------------------------------------------- 1 file changed, 14 insertions(+), 67 deletions(-) diff --git a/config.c b/config.c index e78de67c452..fbb4aab46cf 100644 --- a/config.c +++ b/config.c @@ -59,33 +59,6 @@ struct config_source { }; #define CONFIG_SOURCE_INIT { 0 } -struct config_reader { - struct key_value_info *config_kvi; -}; -/* - * Where possible, prefer to accept "struct config_reader" as an arg than to use - * "the_reader". "the_reader" should only be used if that is infeasible, e.g. in - * a public function. - */ -static struct config_reader the_reader; - -static inline void config_reader_push_kvi(struct config_reader *reader, - struct key_value_info *kvi) -{ - kvi->prev = reader->config_kvi; - reader->config_kvi = kvi; -} - -static inline struct key_value_info *config_reader_pop_kvi(struct config_reader *reader) -{ - struct key_value_info *ret; - if (!reader->config_kvi) - BUG("tried to pop config_kvi, but we weren't reading config"); - ret = reader->config_kvi; - reader->config_kvi = reader->config_kvi->prev; - return ret; -} - static int pack_compression_seen; static int zlib_compression_seen; @@ -429,8 +402,6 @@ static int include_condition_is_true(struct key_value_info *kvi, return 0; } -static int kvi_fn(config_fn_t fn, const char *key, const char *value, - struct key_value_info *kvi, void *data); static int git_config_include(const char *var, const char *value, struct key_value_info *kvi, void *data) { @@ -443,7 +414,7 @@ static int git_config_include(const char *var, const char *value, * Pass along all values, including "include" directives; this makes it * possible to query information on the includes themselves. */ - ret = kvi_fn(inc->fn, var, value, kvi, inc->data); + ret = inc->fn(var, value, kvi, inc->data); if (ret < 0) return ret; @@ -614,16 +585,6 @@ out_free_ret_1: return -CONFIG_INVALID_KEY; } -static int kvi_fn(config_fn_t fn, const char *key, const char *value, - struct key_value_info *kvi, void *data) -{ - int ret; - config_reader_push_kvi(&the_reader, kvi); - ret = fn(key, value, kvi, data); - config_reader_pop_kvi(&the_reader); - return ret; -} - static int config_parse_pair(const char *key, const char *value, struct key_value_info *kvi, config_fn_t fn, void *data) @@ -636,7 +597,7 @@ static int config_parse_pair(const char *key, const char *value, if (git_config_parse_key(key, &canonical_name, NULL)) return -1; - ret = (kvi_fn(fn, canonical_name, value, kvi, data) < 0) ? -1 : 0; + ret = (fn(canonical_name, value, kvi, data) < 0) ? -1 : 0; free(canonical_name); return ret; } @@ -937,7 +898,7 @@ static int get_value(struct config_source *cs, struct key_value_info *kvi, */ cs->linenr--; kvi->linenr = cs->linenr; - ret = kvi_fn(fn, name->buf, value, kvi, data); + ret = fn(name->buf, value, kvi, data); if (ret >= 0) cs->linenr++; return ret; @@ -2289,8 +2250,8 @@ static void configset_iter(struct config_set *set, config_fn_t fn, void *data) values = &entry->value_list; kvi = values->items[value_index].util; - if (kvi_fn(fn, entry->key, values->items[value_index].string, - kvi, data) < 0) + if (fn(entry->key, values->items[value_index].string, kvi, + data) < 0) git_die_config_linenr(entry->key, kvi->filename, kvi->linenr); } @@ -2368,9 +2329,8 @@ static int configset_find_element(struct config_set *set, const char *key, return 0; } -static int configset_add_value(struct config_reader *reader, - struct config_set *set, const char *key, - const char *value) +static int configset_add_value(struct config_set *set, const char *key, + const char *value, struct key_value_info *kvi_p) { struct config_set_element *e; struct string_list_item *si; @@ -2399,7 +2359,7 @@ static int configset_add_value(struct config_reader *reader, l_item->e = e; l_item->value_index = e->value_list.nr - 1; - memcpy(kv_info, reader->config_kvi, sizeof(struct key_value_info)); + memcpy(kv_info, kvi_p, sizeof(struct key_value_info)); si->util = kv_info; return 0; @@ -2447,26 +2407,19 @@ void git_configset_clear(struct config_set *set) set->list.items = NULL; } -struct configset_add_data { - struct config_set *config_set; - struct config_reader *config_reader; -}; #define CONFIGSET_ADD_INIT { 0 } static int config_set_callback(const char *key, const char *value, - struct key_value_info *kvi UNUSED, void *cb) + struct key_value_info *kvi, void *cb) { - struct configset_add_data *data = cb; - configset_add_value(data->config_reader, data->config_set, key, value); + struct config_set *set = cb; + configset_add_value(set, key, value, kvi); return 0; } int git_configset_add_file(struct config_set *set, const char *filename) { - struct configset_add_data data = CONFIGSET_ADD_INIT; - data.config_reader = &the_reader; - data.config_set = set; - return git_config_from_file(config_set_callback, filename, &data); + return git_config_from_file(config_set_callback, filename, set); } int git_configset_get_value(struct config_set *set, const char *key, @@ -2632,7 +2585,6 @@ int git_configset_get_pathname(struct config_set *set, const char *key, const ch static void repo_read_config(struct repository *repo) { struct config_options opts = { 0 }; - struct configset_add_data data = CONFIGSET_ADD_INIT; opts.respect_includes = 1; opts.commondir = repo->commondir; @@ -2644,10 +2596,8 @@ static void repo_read_config(struct repository *repo) git_configset_clear(repo->config); git_configset_init(repo->config); - data.config_set = repo->config; - data.config_reader = &the_reader; - if (config_with_options(config_set_callback, &data, NULL, &opts) < 0) + if (config_with_options(config_set_callback, repo->config, NULL, &opts) < 0) /* * config_with_options() normally returns only * zero, as most errors are fatal, and @@ -2786,12 +2736,9 @@ static void read_protected_config(void) .ignore_worktree = 1, .system_gently = 1, }; - struct configset_add_data data = CONFIGSET_ADD_INIT; git_configset_init(&protected_config); - data.config_set = &protected_config; - data.config_reader = &the_reader; - config_with_options(config_set_callback, &data, NULL, &opts); + config_with_options(config_set_callback, &protected_config, NULL, &opts); } void git_protected_config(config_fn_t fn, void *data)