From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS53758 23.128.96.0/24 X-Spam-Status: No, score=-4.0 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by dcvr.yhbt.net (Postfix) with ESMTP id 4E7BE1F5AE for ; Sat, 5 Jun 2021 11:42:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230158AbhFELoH (ORCPT ); Sat, 5 Jun 2021 07:44:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42784 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229931AbhFELoG (ORCPT ); Sat, 5 Jun 2021 07:44:06 -0400 Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8FC82C061766 for ; Sat, 5 Jun 2021 04:42:18 -0700 (PDT) Received: by mail-pl1-x636.google.com with SMTP id b12so12249plg.11 for ; Sat, 05 Jun 2021 04:42:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ZEko40GhsV/r0ZFbpSgpnOqNjWDGgOnfjwu298F85WM=; b=EbAyoCO2Rd8dbC6hPJGvzkEqD1y9CvdN0Pz6UJW+JPYt8tvzRMao24o1phJ/0jDcpb hdty7mbaQOzAkDMqVBkOshBn2PEeRlqNyD7opjEQrgojXrXFoqp9vmAJ4xt4SK+dykpT s/gkYl0QpliV26s4vjWDwCLLCTLbPxJPYUfYH6gIGWtEI1/miPtIyivMVJUz5OrQnJgh iSEeWzxYJbHnJ5ohtdX+Xk/BOrey1SFVXqPnwEd7vhLeyn+I56IDDiwuqsrIxLxsl/jV b7FpnNgJtVRnBm9dQqclqub6Qal17ayCOWkdB2R55ARPYbHlih9bxbYEhWq1NzAG1LkD pnPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZEko40GhsV/r0ZFbpSgpnOqNjWDGgOnfjwu298F85WM=; b=uAH9Q8IT+SpGsMOcIe7zmpb8WRJrDCOMtHyreR7swBoYXffdBW3FI73LRjdf79Wf5h 4So3NsVCNCx6BcJPiVUmhK2ZgCXr4JsP7Ubn2QxbNcbqTX304OTWjArkNp5pYauEwndB nnqQ78UUpsym8XpWzgsroHTiTCkPhsjEMfIh0f+6iqZWmnaSTr8DqcA7vmjUm+3+Uf6g nh8nLBnUZOO7WJYg/8LUpCVWUbzLdcv4usmVWz6UiMlRy3IhTib2rjivTek7Qhr0gr4d KJKBnt1LurfBwQTaJz8igJLj9AjYdqe4LWTVabMIdCyT47fU/KLJ79b17nD+UFLlFhDG k/iw== X-Gm-Message-State: AOAM531yK18tq7p9fdwLSciJlmXgtHSGH/PczK6e4iN2elUCWKv75ceD +pRxLNZZywZYu9vK0a+/FcgHL5DjjLMyvcPbPV8= X-Google-Smtp-Source: ABdhPJzAEiYKRzJGOcth6wLmSw1LZ+9RXVkbpP5+d1m4+A/IOVyuvMvLpQ0BsbsylhiUCooBAz+s5w== X-Received: by 2002:a17:90a:dc04:: with SMTP id i4mr10089336pjv.75.1622893337872; Sat, 05 Jun 2021 04:42:17 -0700 (PDT) Received: from atharva-on-air.Dlink ([119.82.107.60]) by smtp.gmail.com with ESMTPSA id ig1sm6901594pjb.27.2021.06.05.04.42.15 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 05 Jun 2021 04:42:17 -0700 (PDT) From: Atharva Raykar To: git@vger.kernel.org Cc: Atharva Raykar , Junio C Hamano , Christian Couder , Shourya Shukla , Prathamesh Chavan Subject: [GSoC] [PATCH 2/2] submodule--helper: introduce add-config subcommand Date: Sat, 5 Jun 2021 17:09:16 +0530 Message-Id: <20210605113913.29005-3-raykar.ath@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210605113913.29005-1-raykar.ath@gmail.com> References: <20210605113913.29005-1-raykar.ath@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Add a new "add-config" subcommand to `git submodule--helper` with the goal of converting part of the shell code in git-submodule.sh related to `git submodule add` into C code. This new subcommand sets the configuration variables of a newly added submodule, by registering the url in local git config, as well as the submodule name and path in the .gitmodules file. It also sets 'submodule..active' to "true" if the submodule path has not already been covered by any pathspec specified in 'submodule.active'. This is meant to be a faithful conversion from shell to C, with only one minor change: A warning is emitted if no value is specified in 'submodule.active', ie, the config looks like: "[submodule] active\n". The structure of the conditional to check if we need to set the 'active' toggle looks different from the shell version -- but behaves the same. The change was made to decrease code duplication. A comment has been added to explain that only one value of 'submodule.active' is obtained to check if we need to call is_submodule_active() at all. This is part of a series of changes that will result in all of 'submodule add' being converted to C. Signed-off-by: Atharva Raykar Mentored-by: Christian Couder Mentored-by: Shourya Shukla Based-on-patch-by: Shourya Shukla Based-on-patch-by: Prathamesh Chavan --- builtin/submodule--helper.c | 113 ++++++++++++++++++++++++++++++++++++ git-submodule.sh | 28 +-------- 2 files changed, 114 insertions(+), 27 deletions(-) diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index c9cb535312..92d105be02 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -2943,6 +2943,118 @@ static int add_clone(int argc, const char **argv, const char *prefix) return 0; } +static void configure_added_submodule(struct add_data *add_data) +{ + char *key, *submod_pathspec = NULL; + struct child_process add_submod = CHILD_PROCESS_INIT; + struct child_process add_gitmodules = CHILD_PROCESS_INIT; + int pathspec_key_exists; + + key = xstrfmt("submodule.%s.url", add_data->sm_name); + git_config_set_gently(key, add_data->realrepo); + free(key); + + add_submod.git_cmd = 1; + strvec_pushl(&add_submod.args, "add", + "--no-warn-embedded-repo", NULL); + if (add_data->force) + strvec_push(&add_submod.args, "--force"); + strvec_pushl(&add_submod.args, "--", add_data->sm_path, NULL); + + if (run_command(&add_submod)) + die(_("Failed to add submodule '%s'"), add_data->sm_path); + + key = xstrfmt("submodule.%s.path", add_data->sm_name); + config_set_in_gitmodules_file_gently(key, add_data->sm_path); + free(key); + key = xstrfmt("submodule.%s.url", add_data->sm_name); + config_set_in_gitmodules_file_gently(key, add_data->repo); + free(key); + if (add_data->branch) { + key = xstrfmt("submodule.%s.branch", add_data->sm_path); + config_set_in_gitmodules_file_gently(key, add_data->branch); + free(key); + } + + add_gitmodules.git_cmd = 1; + strvec_pushl(&add_gitmodules.args, + "add", "--force", "--", ".gitmodules", NULL); + + if (run_command(&add_gitmodules)) + die(_("Failed to register submodule '%s'"), add_data->sm_path); + + /* + * NEEDSWORK: In a multi-working-tree world this needs to be + * set in the per-worktree config. + */ + pathspec_key_exists = !git_config_get_string("submodule.active", + &submod_pathspec); + if (pathspec_key_exists && !submod_pathspec) + warning(_("The submodule.active configuration exists, but " + "no pathspec was specified. Setting the value of " + "submodule.%s.active to 'true'."), add_data->sm_name); + + /* + * If submodule.active does not exist, we will activate this + * module unconditionally. + * + * Otherwise, we ask is_submodule_active(), which iterates + * through all the values of 'submodule.active' to determine + * if this module is already active. + */ + if (!pathspec_key_exists || + !is_submodule_active(the_repository, add_data->sm_path)) { + key = xstrfmt("submodule.%s.active", add_data->sm_name); + git_config_set_gently(key, "true"); + free(key); + } +} + +static int add_config(int argc, const char **argv, const char *prefix) +{ + int force = 0; + struct add_data add_data = ADD_DATA_INIT; + + struct option options[] = { + OPT_STRING('b', "branch", &add_data.branch, + N_("branch"), + N_("branch of repository to store in " + "the submodule configuration")), + OPT_STRING(0, "url", &add_data.repo, + N_("string"), + N_("url to clone submodule from")), + OPT_STRING(0, "resolved-url", &add_data.realrepo, + N_("string"), + N_("url to clone the submodule from, after it has " + "been dereferenced relative to parent's url, " + "in the case where is a relative url")), + OPT_STRING(0, "path", &add_data.sm_path, + N_("path"), + N_("where the new submodule will be cloned to")), + OPT_STRING(0, "name", &add_data.sm_name, + N_("string"), + N_("name of the new submodule")), + OPT_BOOL('f', "force", &force, + N_("allow adding an otherwise ignored submodule path")), + OPT_END() + }; + + const char *const usage[] = { + N_("git submodule--helper add-config " + "[--force|-f] [--branch|-b ] " + "--url --resolved-url " + "--path --name "), + NULL + }; + + argc = parse_options(argc, argv, prefix, options, usage, 0); + + add_data.force = !!force; + configure_added_submodule(&add_data); + + return 0; +} + #define SUPPORT_SUPER_PREFIX (1<<0) struct cmd_struct { @@ -2956,6 +3068,7 @@ static struct cmd_struct commands[] = { {"name", module_name, 0}, {"clone", module_clone, 0}, {"add-clone", add_clone, 0}, + {"add-config", add_config, 0}, {"update-module-mode", module_update_module_mode, 0}, {"update-clone", update_clone, 0}, {"ensure-core-worktree", ensure_core_worktree, 0}, diff --git a/git-submodule.sh b/git-submodule.sh index f71e1e5495..9826378fa6 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -242,33 +242,7 @@ cmd_add() fi git submodule--helper add-clone ${GIT_QUIET:+--quiet} ${force:+"--force"} ${progress:+"--progress"} ${branch:+--branch "$branch"} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" ${reference:+"$reference"} ${dissociate:+"--dissociate"} ${depth:+"$depth"} || exit - git config submodule."$sm_name".url "$realrepo" - - git add --no-warn-embedded-repo $force "$sm_path" || - die "$(eval_gettext "Failed to add submodule '\$sm_path'")" - - git submodule--helper config submodule."$sm_name".path "$sm_path" && - git submodule--helper config submodule."$sm_name".url "$repo" && - if test -n "$branch" - then - git submodule--helper config submodule."$sm_name".branch "$branch" - fi && - git add --force .gitmodules || - die "$(eval_gettext "Failed to register submodule '\$sm_path'")" - - # NEEDSWORK: In a multi-working-tree world, this needs to be - # set in the per-worktree config. - if git config --get submodule.active >/dev/null - then - # If the submodule being adding isn't already covered by the - # current configured pathspec, set the submodule's active flag - if ! git submodule--helper is-active "$sm_path" - then - git config submodule."$sm_name".active "true" - fi - else - git config submodule."$sm_name".active "true" - fi + git submodule--helper add-config ${force:+--force} ${branch:+--branch "$branch"} --url "$repo" --resolved-url "$realrepo" --path "$sm_path" --name "$sm_name" } # -- 2.31.1