diff options
Diffstat (limited to 'third_party/git/submodule-config.c')
-rw-r--r-- | third_party/git/submodule-config.c | 88 |
1 files changed, 39 insertions, 49 deletions
diff --git a/third_party/git/submodule-config.c b/third_party/git/submodule-config.c index 4d1c92d5826d..4264ee216f49 100644 --- a/third_party/git/submodule-config.c +++ b/third_party/git/submodule-config.c @@ -38,28 +38,24 @@ enum lookup_type { }; static int config_path_cmp(const void *unused_cmp_data, - const struct hashmap_entry *eptr, - const struct hashmap_entry *entry_or_key, + const void *entry, + const void *entry_or_key, const void *unused_keydata) { - const struct submodule_entry *a, *b; - - a = container_of(eptr, const struct submodule_entry, ent); - b = container_of(entry_or_key, const struct submodule_entry, ent); + const struct submodule_entry *a = entry; + const struct submodule_entry *b = entry_or_key; return strcmp(a->config->path, b->config->path) || !oideq(&a->config->gitmodules_oid, &b->config->gitmodules_oid); } static int config_name_cmp(const void *unused_cmp_data, - const struct hashmap_entry *eptr, - const struct hashmap_entry *entry_or_key, + const void *entry, + const void *entry_or_key, const void *unused_keydata) { - const struct submodule_entry *a, *b; - - a = container_of(eptr, const struct submodule_entry, ent); - b = container_of(entry_or_key, const struct submodule_entry, ent); + const struct submodule_entry *a = entry; + const struct submodule_entry *b = entry_or_key; return strcmp(a->config->name, b->config->name) || !oideq(&a->config->gitmodules_oid, &b->config->gitmodules_oid); @@ -99,12 +95,12 @@ static void submodule_cache_clear(struct submodule_cache *cache) * allocation of struct submodule entries. Each is allocated by * their .gitmodules blob sha1 and submodule name. */ - hashmap_for_each_entry(&cache->for_name, &iter, entry, - ent /* member name */) + hashmap_iter_init(&cache->for_name, &iter); + while ((entry = hashmap_iter_next(&iter))) free_one_config(entry); - hashmap_free_entries(&cache->for_path, struct submodule_entry, ent); - hashmap_free_entries(&cache->for_name, struct submodule_entry, ent); + hashmap_free(&cache->for_path, 1); + hashmap_free(&cache->for_name, 1); cache->initialized = 0; cache->gitmodules_read = 0; } @@ -127,9 +123,9 @@ static void cache_put_path(struct submodule_cache *cache, unsigned int hash = hash_oid_string(&submodule->gitmodules_oid, submodule->path); struct submodule_entry *e = xmalloc(sizeof(*e)); - hashmap_entry_init(&e->ent, hash); + hashmap_entry_init(e, hash); e->config = submodule; - hashmap_put(&cache->for_path, &e->ent); + hashmap_put(&cache->for_path, e); } static void cache_remove_path(struct submodule_cache *cache, @@ -139,9 +135,9 @@ static void cache_remove_path(struct submodule_cache *cache, submodule->path); struct submodule_entry e; struct submodule_entry *removed; - hashmap_entry_init(&e.ent, hash); + hashmap_entry_init(&e, hash); e.config = submodule; - removed = hashmap_remove_entry(&cache->for_path, &e, ent, NULL); + removed = hashmap_remove(&cache->for_path, &e, NULL); free(removed); } @@ -151,9 +147,9 @@ static void cache_add(struct submodule_cache *cache, unsigned int hash = hash_oid_string(&submodule->gitmodules_oid, submodule->name); struct submodule_entry *e = xmalloc(sizeof(*e)); - hashmap_entry_init(&e->ent, hash); + hashmap_entry_init(e, hash); e->config = submodule; - hashmap_add(&cache->for_name, &e->ent); + hashmap_add(&cache->for_name, e); } static const struct submodule *cache_lookup_path(struct submodule_cache *cache, @@ -167,10 +163,10 @@ static const struct submodule *cache_lookup_path(struct submodule_cache *cache, oidcpy(&key_config.gitmodules_oid, gitmodules_oid); key_config.path = path; - hashmap_entry_init(&key.ent, hash); + hashmap_entry_init(&key, hash); key.config = &key_config; - entry = hashmap_get_entry(&cache->for_path, &key, ent, NULL); + entry = hashmap_get(&cache->for_path, &key, NULL); if (entry) return entry->config; return NULL; @@ -187,10 +183,10 @@ static struct submodule *cache_lookup_name(struct submodule_cache *cache, oidcpy(&key_config.gitmodules_oid, gitmodules_oid); key_config.name = name; - hashmap_entry_init(&key.ent, hash); + hashmap_entry_init(&key, hash); key.config = &key_config; - entry = hashmap_get_entry(&cache->for_name, &key, ent, NULL); + entry = hashmap_get(&cache->for_name, &key, NULL); if (entry) return entry->config; return NULL; @@ -409,13 +405,6 @@ struct parse_config_parameter { int overwrite; }; -/* - * Parse a config item from .gitmodules. - * - * This does not handle submodule-related configuration from the main - * 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) { struct parse_config_parameter *me = data; @@ -493,9 +482,8 @@ static int parse_config(const char *var, const char *value, void *data) warn_multiple_config(me->treeish_name, submodule->name, "update"); else if (parse_submodule_update_strategy(value, - &submodule->update_strategy) < 0 || - submodule->update_strategy.type == SM_UPDATE_COMMAND) - die(_("invalid value for %s"), var); + &submodule->update_strategy) < 0) + die(_("invalid value for %s"), var); } else if (!strcmp(item.buf, "shallow")) { if (!me->overwrite && submodule->recommend_shallow != -1) warn_multiple_config(me->treeish_name, submodule->name, @@ -562,9 +550,7 @@ static const struct submodule *config_from(struct submodule_cache *cache, struct hashmap_iter iter; struct submodule_entry *entry; - entry = hashmap_iter_first_entry(&cache->for_name, &iter, - struct submodule_entry, - ent /* member name */); + entry = hashmap_iter_first(&cache->for_name, &iter); if (!entry) return NULL; return entry->config; @@ -626,7 +612,7 @@ static void submodule_cache_check_init(struct repository *repo) /* * Note: This function is private for a reason, the '.gitmodules' file should - * not be used as a mechanism to retrieve arbitrary configuration stored in + * not be used as as a mechanism to retrieve arbitrary configuration stored in * the repository. * * Runs the provided config function on the '.gitmodules' file found in the @@ -635,9 +621,7 @@ static void submodule_cache_check_init(struct repository *repo) static void config_from_gitmodules(config_fn_t fn, struct repository *repo, void *data) { if (repo->worktree) { - struct git_config_source config_source = { - 0, .scope = CONFIG_SCOPE_SUBMODULE - }; + struct git_config_source config_source = { 0 }; const struct config_options opts = { 0 }; struct object_id oid; char *file; @@ -676,13 +660,10 @@ static int gitmodules_cb(const char *var, const char *value, void *data) return parse_config(var, value, ¶meter); } -void repo_read_gitmodules(struct repository *repo, int skip_if_read) +void repo_read_gitmodules(struct repository *repo) { submodule_cache_check_init(repo); - if (repo->submodule_cache->gitmodules_read && skip_if_read) - return; - if (repo_read_index(repo) < 0) return; @@ -708,11 +689,20 @@ void gitmodules_config_oid(const struct object_id *commit_oid) the_repository->submodule_cache->gitmodules_read = 1; } +static void gitmodules_read_check(struct repository *repo) +{ + submodule_cache_check_init(repo); + + /* read the repo's .gitmodules file if it hasn't been already */ + if (!repo->submodule_cache->gitmodules_read) + repo_read_gitmodules(repo); +} + const struct submodule *submodule_from_name(struct repository *r, const struct object_id *treeish_name, const char *name) { - repo_read_gitmodules(r, 1); + gitmodules_read_check(r); return config_from(r->submodule_cache, treeish_name, name, lookup_name); } @@ -720,7 +710,7 @@ const struct submodule *submodule_from_path(struct repository *r, const struct object_id *treeish_name, const char *path) { - repo_read_gitmodules(r, 1); + gitmodules_read_check(r); return config_from(r->submodule_cache, treeish_name, path, lookup_path); } |