diff options
Diffstat (limited to 'submodule.c')
-rw-r--r-- | submodule.c | 160 |
1 files changed, 26 insertions, 134 deletions
diff --git a/submodule.c b/submodule.c index c3b5f4400..97355eb7a 100644 --- a/submodule.c +++ b/submodule.c @@ -1,4 +1,5 @@ #include "cache.h" +#include "submodule-config.h" #include "submodule.h" #include "dir.h" #include "diff.h" @@ -12,9 +13,6 @@ #include "argv-array.h" #include "blob.h" -static struct string_list config_name_for_path; -static struct string_list config_fetch_recurse_submodules_for_name; -static struct string_list config_ignore_for_name; static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND; static struct string_list changed_submodule_paths; static int initialized_fetch_ref_tips; @@ -41,77 +39,6 @@ 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) { return !gitmodules_is_modified; @@ -125,7 +52,7 @@ int is_staging_gitmodules_ok(void) int update_path_in_gitmodules(const char *oldpath, const char *newpath) { struct strbuf entry = STRBUF_INIT; - const char *path; + const struct submodule *submodule; if (!file_exists(".gitmodules")) /* Do nothing without .gitmodules */ return -1; @@ -133,13 +60,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 = get_name_for_path(oldpath); - if (!path) { + submodule = submodule_from_path(null_sha1, oldpath); + if (!submodule || !submodule->name) { warning(_("Could not find section in .gitmodules where path=%s"), oldpath); return -1; } strbuf_addstr(&entry, "submodule."); - strbuf_addstr(&entry, path); + strbuf_addstr(&entry, submodule->name); 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 */ @@ -159,7 +86,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; - const char *path_option; + const struct submodule *submodule; if (!file_exists(".gitmodules")) /* Do nothing without .gitmodules */ return -1; @@ -167,13 +94,13 @@ int remove_path_from_gitmodules(const char *path) if (gitmodules_is_unmerged) die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first")); - path_option = get_name_for_path(path); - if (!path_option) { + submodule = submodule_from_path(null_sha1, path); + if (!submodule || !submodule->name) { warning(_("Could not find section in .gitmodules where path=%s"), path); return -1; } strbuf_addstr(§, "submodule."); - strbuf_addstr(§, path_option); + strbuf_addstr(§, submodule->name); 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); @@ -235,11 +162,10 @@ done: void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt, const char *path) { - 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); + const struct submodule *submodule = submodule_from_path(null_sha1, path); + if (submodule) { + if (submodule->ignore) + handle_ignore_submodules_arg(diffopt, submodule->ignore); else if (gitmodules_is_unmerged) DIFF_OPT_SET(diffopt, IGNORE_SUBMODULES); } @@ -288,42 +214,6 @@ void gitmodules_config(void) } } -int parse_submodule_config_option(const char *var, const char *value) -{ - const char *name, *key; - int namelen; - - if (parse_config_key(var, "submodule", &name, &namelen, &key) < 0 || !name) - return 0; - - if (!strcmp(key, "path")) { - if (!value) - return config_error_nonbool(var); - - set_name_for_path(value, name, namelen); - - } else if (!strcmp(key, "fetchrecursesubmodules")) { - int fetch_recurse = parse_fetch_recurse_submodules_arg(var, value); - - set_fetch_recurse_for_name(name, namelen, fetch_recurse); - - } else if (!strcmp(key, "ignore")) { - - if (!value) - return config_error_nonbool(var); - - if (strcmp(value, "untracked") && strcmp(value, "dirty") && - strcmp(value, "all") && strcmp(value, "none")) { - warning("Invalid parameter \"%s\" for config option \"submodule.%s.ignore\"", value, var); - return 0; - } - - set_ignore_for_name(name, namelen, value); - return 0; - } - return 0; -} - void handle_ignore_submodules_arg(struct diff_options *diffopt, const char *arg) { @@ -699,7 +589,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 (!get_name_for_path(NULL)) + if (!submodule_from_path(NULL, NULL)) return; init_revisions(&rev, NULL); @@ -746,7 +636,6 @@ int fetch_populated_submodules(const struct argv_array *options, int i, result = 0; struct child_process cp = CHILD_PROCESS_INIT; struct argv_array argv = ARGV_ARRAY_INIT; - const char *name_for_path; const char *work_tree = get_git_work_tree(); if (!work_tree) goto out; @@ -771,23 +660,26 @@ int fetch_populated_submodules(const struct argv_array *options, struct strbuf submodule_git_dir = STRBUF_INIT; struct strbuf submodule_prefix = STRBUF_INIT; const struct cache_entry *ce = active_cache[i]; - const char *git_dir, *name, *default_argv; + const char *git_dir, *default_argv; + const struct submodule *submodule; if (!S_ISGITLINK(ce->ce_mode)) continue; - name = ce->name; - name_for_path = get_name_for_path(ce->name); - if (name_for_path) - name = name_for_path; + submodule = submodule_from_path(null_sha1, ce->name); + if (!submodule) + submodule = submodule_from_name(null_sha1, ce->name); default_argv = "yes"; if (command_line_option == RECURSE_SUBMODULES_DEFAULT) { - int fetch_recurse_option = get_fetch_recurse_for_name(name); - if (fetch_recurse_option != RECURSE_SUBMODULES_NONE) { - if (fetch_recurse_option == RECURSE_SUBMODULES_OFF) + if (submodule && + submodule->fetch_recurse != + RECURSE_SUBMODULES_NONE) { + if (submodule->fetch_recurse == + RECURSE_SUBMODULES_OFF) continue; - if (fetch_recurse_option == RECURSE_SUBMODULES_ON_DEMAND) { + if (submodule->fetch_recurse == + RECURSE_SUBMODULES_ON_DEMAND) { if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name)) continue; default_argv = "on-demand"; |