From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Voigt Subject: [PATCH 3/5] extract functions for submodule config set and lookup Date: Thu, 5 Jun 2014 08:08:36 +0200 Message-ID: <20140605060836.GD23874@sandbox-ub> References: <20140605060425.GA23874@sandbox-ub> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: git@vger.kernel.org, Jens Lehmann , Jonathan Nieder , Jeff King To: Junio C Hamano X-From: git-owner@vger.kernel.org Thu Jun 05 08:08:49 2014 Return-path: Envelope-to: gcvg-git-2@plane.gmane.org Received: from vger.kernel.org ([209.132.180.67]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1WsQqz-0008Sx-0D for gcvg-git-2@plane.gmane.org; Thu, 05 Jun 2014 08:08:45 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751290AbaFEGIl (ORCPT ); Thu, 5 Jun 2014 02:08:41 -0400 Received: from smtprelay01.ispgateway.de ([80.67.31.24]:60837 "EHLO smtprelay01.ispgateway.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751139AbaFEGIk (ORCPT ); Thu, 5 Jun 2014 02:08:40 -0400 Received: from [77.20.146.74] (helo=sandbox-ub) by smtprelay01.ispgateway.de with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.68) (envelope-from ) id 1WsQqs-0006BN-8p; Thu, 05 Jun 2014 08:08:38 +0200 Content-Disposition: inline In-Reply-To: <20140605060425.GA23874@sandbox-ub> User-Agent: Mutt/1.5.21 (2010-09-15) X-Df-Sender: aHZvaWd0QGh2b2lndC5uZXQ= Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: This is one step towards using the new configuration API. We just extract these functions to make replacing the actual code easier. Signed-off-by: Heiko Voigt --- This refactoring is included in the series to make following the series easier (and because it was one step I did). The extracted functions will be replaced in the next commit with the ones from the cache. I think its easier to follow the implementation this way. In case you think its unnecessary I can squash this commit into the next one. submodule.c | 142 +++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 97 insertions(+), 45 deletions(-) diff --git a/submodule.c b/submodule.c index 85e2b12..86ec2e3 100644 --- a/submodule.c +++ b/submodule.c @@ -41,6 +41,76 @@ static int gitmodules_is_unmerged; */ static int gitmodules_is_modified; +static const char *get_name_for_path(const char *path) +{ + struct string_list_item *path_option; + if (path == NULL) { + if (config_name_for_path.nr > 0) + return config_name_for_path.items[0].util; + else + return NULL; + } + path_option = unsorted_string_list_lookup(&config_name_for_path, path); + if (!path_option) + return NULL; + return path_option->util; +} + +static void set_name_for_path(const char *path, const char *name, int namelen) +{ + struct string_list_item *config; + config = unsorted_string_list_lookup(&config_name_for_path, path); + if (config) + free(config->util); + else + config = string_list_append(&config_name_for_path, xstrdup(path)); + config->util = xmemdupz(name, namelen); +} + +static const char *get_ignore_for_name(const char *name) +{ + struct string_list_item *ignore_option; + ignore_option = unsorted_string_list_lookup(&config_ignore_for_name, name); + if (!ignore_option) + return NULL; + + return ignore_option->util; +} + +static void set_ignore_for_name(const char *name, int namelen, const char *ignore) +{ + struct string_list_item *config; + char *name_cstr = xmemdupz(name, namelen); + config = unsorted_string_list_lookup(&config_ignore_for_name, name_cstr); + if (config) { + free(config->util); + free(name_cstr); + } else + config = string_list_append(&config_ignore_for_name, name_cstr); + config->util = xstrdup(ignore); +} + +static int get_fetch_recurse_for_name(const char *name) +{ + struct string_list_item *fetch_recurse; + fetch_recurse = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name); + if (!fetch_recurse) + return RECURSE_SUBMODULES_NONE; + + return (intptr_t) fetch_recurse->util; +} + +static void set_fetch_recurse_for_name(const char *name, int namelen, int fetch_recurse) +{ + struct string_list_item *config; + char *name_cstr = xmemdupz(name, namelen); + config = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name_cstr); + if (!config) + config = string_list_append(&config_fetch_recurse_submodules_for_name, name_cstr); + else + free(name_cstr); + config->util = (void *)(intptr_t) fetch_recurse; +} int is_staging_gitmodules_ok(void) { @@ -55,7 +125,7 @@ int is_staging_gitmodules_ok(void) int update_path_in_gitmodules(const char *oldpath, const char *newpath) { struct strbuf entry = STRBUF_INIT; - struct string_list_item *path_option; + const char *path; if (!file_exists(".gitmodules")) /* Do nothing without .gitmodules */ return -1; @@ -63,13 +133,13 @@ int update_path_in_gitmodules(const char *oldpath, const char *newpath) if (gitmodules_is_unmerged) die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first")); - path_option = unsorted_string_list_lookup(&config_name_for_path, oldpath); - if (!path_option) { + path = get_name_for_path(oldpath); + if (!path) { warning(_("Could not find section in .gitmodules where path=%s"), oldpath); return -1; } strbuf_addstr(&entry, "submodule."); - strbuf_addstr(&entry, path_option->util); + strbuf_addstr(&entry, path); strbuf_addstr(&entry, ".path"); if (git_config_set_in_file(".gitmodules", entry.buf, newpath) < 0) { /* Maybe the user already did that, don't error out here */ @@ -89,7 +159,7 @@ int update_path_in_gitmodules(const char *oldpath, const char *newpath) int remove_path_from_gitmodules(const char *path) { struct strbuf sect = STRBUF_INIT; - struct string_list_item *path_option; + const char *path_option; if (!file_exists(".gitmodules")) /* Do nothing without .gitmodules */ return -1; @@ -97,13 +167,13 @@ int remove_path_from_gitmodules(const char *path) if (gitmodules_is_unmerged) die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first")); - path_option = unsorted_string_list_lookup(&config_name_for_path, path); + path_option = get_name_for_path(path); if (!path_option) { warning(_("Could not find section in .gitmodules where path=%s"), path); return -1; } strbuf_addstr(§, "submodule."); - strbuf_addstr(§, path_option->util); + strbuf_addstr(§, path_option); if (git_config_rename_section_in_file(".gitmodules", sect.buf, NULL) < 0) { /* Maybe the user already did that, don't error out here */ warning(_("Could not remove .gitmodules entry for %s"), path); @@ -165,12 +235,11 @@ done: void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt, const char *path) { - struct string_list_item *path_option, *ignore_option; - path_option = unsorted_string_list_lookup(&config_name_for_path, path); - if (path_option) { - ignore_option = unsorted_string_list_lookup(&config_ignore_for_name, path_option->util); - if (ignore_option) - handle_ignore_submodules_arg(diffopt, ignore_option->util); + const char *name = get_name_for_path(path); + if (name) { + const char *ignore = get_ignore_for_name(name); + if (ignore) + handle_ignore_submodules_arg(diffopt, ignore); else if (gitmodules_is_unmerged) DIFF_OPT_SET(diffopt, IGNORE_SUBMODULES); } @@ -221,7 +290,6 @@ void gitmodules_config(void) int parse_submodule_config_option(const char *var, const char *value) { - struct string_list_item *config; const char *name, *key; int namelen; @@ -232,22 +300,14 @@ int parse_submodule_config_option(const char *var, const char *value) if (!value) return config_error_nonbool(var); - config = unsorted_string_list_lookup(&config_name_for_path, value); - if (config) - free(config->util); - else - config = string_list_append(&config_name_for_path, xstrdup(value)); - config->util = xmemdupz(name, namelen); + set_name_for_path(value, name, namelen); + } else if (!strcmp(key, "fetchrecursesubmodules")) { - char *name_cstr = xmemdupz(name, namelen); - config = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name_cstr); - if (!config) - config = string_list_append(&config_fetch_recurse_submodules_for_name, name_cstr); - else - free(name_cstr); - config->util = (void *)(intptr_t)parse_fetch_recurse_submodules_arg(var, value); + int fetch_recurse = parse_fetch_recurse_submodules_arg(var, value); + + set_fetch_recurse_for_name(name, namelen, fetch_recurse); + } else if (!strcmp(key, "ignore")) { - char *name_cstr; if (!value) return config_error_nonbool(var); @@ -258,14 +318,7 @@ int parse_submodule_config_option(const char *var, const char *value) return 0; } - name_cstr = xmemdupz(name, namelen); - config = unsorted_string_list_lookup(&config_ignore_for_name, name_cstr); - if (config) { - free(config->util); - free(name_cstr); - } else - config = string_list_append(&config_ignore_for_name, name_cstr); - config->util = xstrdup(value); + set_ignore_for_name(name, namelen, value); return 0; } return 0; @@ -654,7 +707,7 @@ static void calculate_changed_submodule_paths(void) struct argv_array argv = ARGV_ARRAY_INIT; /* No need to check if there are no submodules configured */ - if (!config_name_for_path.nr) + if (!get_name_for_path(NULL)) return; init_revisions(&rev, NULL); @@ -701,7 +754,7 @@ int fetch_populated_submodules(const struct argv_array *options, int i, result = 0; struct child_process cp; struct argv_array argv = ARGV_ARRAY_INIT; - struct string_list_item *name_for_path; + const char *name_for_path; const char *work_tree = get_git_work_tree(); if (!work_tree) goto out; @@ -733,18 +786,17 @@ int fetch_populated_submodules(const struct argv_array *options, continue; name = ce->name; - name_for_path = unsorted_string_list_lookup(&config_name_for_path, ce->name); + name_for_path = get_name_for_path(ce->name); if (name_for_path) - name = name_for_path->util; + name = name_for_path; default_argv = "yes"; if (command_line_option == RECURSE_SUBMODULES_DEFAULT) { - struct string_list_item *fetch_recurse_submodules_option; - fetch_recurse_submodules_option = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name); - if (fetch_recurse_submodules_option) { - if ((intptr_t)fetch_recurse_submodules_option->util == RECURSE_SUBMODULES_OFF) + int fetch_recurse_option = get_fetch_recurse_for_name(name); + if (fetch_recurse_option != RECURSE_SUBMODULES_NONE) { + if (fetch_recurse_option == RECURSE_SUBMODULES_OFF) continue; - if ((intptr_t)fetch_recurse_submodules_option->util == RECURSE_SUBMODULES_ON_DEMAND) { + if (fetch_recurse_option == RECURSE_SUBMODULES_ON_DEMAND) { if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name)) continue; default_argv = "on-demand"; -- 2.0.0