submodule-config: rename commit_sha1 to treeish_name

It is also possible to pass in any treeish name to lookup a submodule
config. Make it clear by naming the variables accordingly. Looking up
a submodule config by tree hash will come in handy in a later patch.

Signed-off-by: Stefan Beller <sbeller@google.com>
Reviewed-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Stefan Beller 2016-11-22 12:14:37 -08:00 committed by Junio C Hamano
parent e6ead0f2db
commit 73c293bb6c
4 changed files with 44 additions and 29 deletions

View File

@ -47,15 +47,16 @@ Functions
Can be passed to the config parsing infrastructure to parse Can be passed to the config parsing infrastructure to parse
local (worktree) submodule configurations. local (worktree) submodule configurations.
`const struct submodule *submodule_from_path(const unsigned char *commit_sha1, const char *path)`:: `const struct submodule *submodule_from_path(const unsigned char *treeish_name, const char *path)`::
Lookup values for one submodule by its commit_sha1 and path. Given a tree-ish in the superproject and a path, return the
submodule that is bound at the path in the named tree.
`const struct submodule *submodule_from_name(const unsigned char *commit_sha1, const char *name)`:: `const struct submodule *submodule_from_name(const unsigned char *treeish_name, const char *name)`::
The same as above but lookup by name. The same as above but lookup by name.
If given the null_sha1 as commit_sha1 the local configuration of a If given the null_sha1 as treeish_name the local configuration of a
submodule will be returned (e.g. consolidated values from local git submodule will be returned (e.g. consolidated values from local git
configuration and the .gitmodules file in the worktree). configuration and the .gitmodules file in the worktree).

View File

@ -263,12 +263,12 @@ int parse_push_recurse_submodules_arg(const char *opt, const char *arg)
return parse_push_recurse(opt, arg, 1); return parse_push_recurse(opt, arg, 1);
} }
static void warn_multiple_config(const unsigned char *commit_sha1, static void warn_multiple_config(const unsigned char *treeish_name,
const char *name, const char *option) const char *name, const char *option)
{ {
const char *commit_string = "WORKTREE"; const char *commit_string = "WORKTREE";
if (commit_sha1) if (treeish_name)
commit_string = sha1_to_hex(commit_sha1); commit_string = sha1_to_hex(treeish_name);
warning("%s:.gitmodules, multiple configurations found for " warning("%s:.gitmodules, multiple configurations found for "
"'submodule.%s.%s'. Skipping second one!", "'submodule.%s.%s'. Skipping second one!",
commit_string, name, option); commit_string, name, option);
@ -276,7 +276,7 @@ static void warn_multiple_config(const unsigned char *commit_sha1,
struct parse_config_parameter { struct parse_config_parameter {
struct submodule_cache *cache; struct submodule_cache *cache;
const unsigned char *commit_sha1; const unsigned char *treeish_name;
const unsigned char *gitmodules_sha1; const unsigned char *gitmodules_sha1;
int overwrite; int overwrite;
}; };
@ -300,7 +300,7 @@ static int parse_config(const char *var, const char *value, void *data)
if (!value) if (!value)
ret = config_error_nonbool(var); ret = config_error_nonbool(var);
else if (!me->overwrite && submodule->path) else if (!me->overwrite && submodule->path)
warn_multiple_config(me->commit_sha1, submodule->name, warn_multiple_config(me->treeish_name, submodule->name,
"path"); "path");
else { else {
if (submodule->path) if (submodule->path)
@ -314,7 +314,7 @@ static int parse_config(const char *var, const char *value, void *data)
int die_on_error = is_null_sha1(me->gitmodules_sha1); int die_on_error = is_null_sha1(me->gitmodules_sha1);
if (!me->overwrite && if (!me->overwrite &&
submodule->fetch_recurse != RECURSE_SUBMODULES_NONE) submodule->fetch_recurse != RECURSE_SUBMODULES_NONE)
warn_multiple_config(me->commit_sha1, submodule->name, warn_multiple_config(me->treeish_name, submodule->name,
"fetchrecursesubmodules"); "fetchrecursesubmodules");
else else
submodule->fetch_recurse = parse_fetch_recurse( submodule->fetch_recurse = parse_fetch_recurse(
@ -324,7 +324,7 @@ static int parse_config(const char *var, const char *value, void *data)
if (!value) if (!value)
ret = config_error_nonbool(var); ret = config_error_nonbool(var);
else if (!me->overwrite && submodule->ignore) else if (!me->overwrite && submodule->ignore)
warn_multiple_config(me->commit_sha1, submodule->name, warn_multiple_config(me->treeish_name, submodule->name,
"ignore"); "ignore");
else if (strcmp(value, "untracked") && else if (strcmp(value, "untracked") &&
strcmp(value, "dirty") && strcmp(value, "dirty") &&
@ -340,7 +340,7 @@ static int parse_config(const char *var, const char *value, void *data)
if (!value) { if (!value) {
ret = config_error_nonbool(var); ret = config_error_nonbool(var);
} else if (!me->overwrite && submodule->url) { } else if (!me->overwrite && submodule->url) {
warn_multiple_config(me->commit_sha1, submodule->name, warn_multiple_config(me->treeish_name, submodule->name,
"url"); "url");
} else { } else {
free((void *) submodule->url); free((void *) submodule->url);
@ -351,21 +351,21 @@ static int parse_config(const char *var, const char *value, void *data)
ret = config_error_nonbool(var); ret = config_error_nonbool(var);
else if (!me->overwrite && else if (!me->overwrite &&
submodule->update_strategy.type != SM_UPDATE_UNSPECIFIED) submodule->update_strategy.type != SM_UPDATE_UNSPECIFIED)
warn_multiple_config(me->commit_sha1, submodule->name, warn_multiple_config(me->treeish_name, submodule->name,
"update"); "update");
else if (parse_submodule_update_strategy(value, else if (parse_submodule_update_strategy(value,
&submodule->update_strategy) < 0) &submodule->update_strategy) < 0)
die(_("invalid value for %s"), var); die(_("invalid value for %s"), var);
} else if (!strcmp(item.buf, "shallow")) { } else if (!strcmp(item.buf, "shallow")) {
if (!me->overwrite && submodule->recommend_shallow != -1) if (!me->overwrite && submodule->recommend_shallow != -1)
warn_multiple_config(me->commit_sha1, submodule->name, warn_multiple_config(me->treeish_name, submodule->name,
"shallow"); "shallow");
else else
submodule->recommend_shallow = submodule->recommend_shallow =
git_config_bool(var, value); git_config_bool(var, value);
} else if (!strcmp(item.buf, "branch")) { } else if (!strcmp(item.buf, "branch")) {
if (!me->overwrite && submodule->branch) if (!me->overwrite && submodule->branch)
warn_multiple_config(me->commit_sha1, submodule->name, warn_multiple_config(me->treeish_name, submodule->name,
"branch"); "branch");
else { else {
free((void *)submodule->branch); free((void *)submodule->branch);
@ -379,18 +379,18 @@ static int parse_config(const char *var, const char *value, void *data)
return ret; return ret;
} }
static int gitmodule_sha1_from_commit(const unsigned char *commit_sha1, static int gitmodule_sha1_from_commit(const unsigned char *treeish_name,
unsigned char *gitmodules_sha1, unsigned char *gitmodules_sha1,
struct strbuf *rev) struct strbuf *rev)
{ {
int ret = 0; int ret = 0;
if (is_null_sha1(commit_sha1)) { if (is_null_sha1(treeish_name)) {
hashclr(gitmodules_sha1); hashclr(gitmodules_sha1);
return 1; return 1;
} }
strbuf_addf(rev, "%s:.gitmodules", sha1_to_hex(commit_sha1)); strbuf_addf(rev, "%s:.gitmodules", sha1_to_hex(treeish_name));
if (get_sha1(rev->buf, gitmodules_sha1) >= 0) if (get_sha1(rev->buf, gitmodules_sha1) >= 0)
ret = 1; ret = 1;
@ -402,7 +402,7 @@ static int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
* revisions. * revisions.
*/ */
static const struct submodule *config_from(struct submodule_cache *cache, static const struct submodule *config_from(struct submodule_cache *cache,
const unsigned char *commit_sha1, const char *key, const unsigned char *treeish_name, const char *key,
enum lookup_type lookup_type) enum lookup_type lookup_type)
{ {
struct strbuf rev = STRBUF_INIT; struct strbuf rev = STRBUF_INIT;
@ -418,7 +418,7 @@ static const struct submodule *config_from(struct submodule_cache *cache,
* return the first submodule. Can be used to check whether * return the first submodule. Can be used to check whether
* there are any submodules parsed. * there are any submodules parsed.
*/ */
if (!commit_sha1 || !key) { if (!treeish_name || !key) {
struct hashmap_iter iter; struct hashmap_iter iter;
struct submodule_entry *entry; struct submodule_entry *entry;
@ -428,7 +428,7 @@ static const struct submodule *config_from(struct submodule_cache *cache,
return entry->config; return entry->config;
} }
if (!gitmodule_sha1_from_commit(commit_sha1, sha1, &rev)) if (!gitmodule_sha1_from_commit(treeish_name, sha1, &rev))
goto out; goto out;
switch (lookup_type) { switch (lookup_type) {
@ -448,7 +448,7 @@ static const struct submodule *config_from(struct submodule_cache *cache,
/* fill the submodule config into the cache */ /* fill the submodule config into the cache */
parameter.cache = cache; parameter.cache = cache;
parameter.commit_sha1 = commit_sha1; parameter.treeish_name = treeish_name;
parameter.gitmodules_sha1 = sha1; parameter.gitmodules_sha1 = sha1;
parameter.overwrite = 0; parameter.overwrite = 0;
git_config_from_mem(parse_config, CONFIG_ORIGIN_SUBMODULE_BLOB, rev.buf, git_config_from_mem(parse_config, CONFIG_ORIGIN_SUBMODULE_BLOB, rev.buf,
@ -484,7 +484,7 @@ int parse_submodule_config_option(const char *var, const char *value)
{ {
struct parse_config_parameter parameter; struct parse_config_parameter parameter;
parameter.cache = &the_submodule_cache; parameter.cache = &the_submodule_cache;
parameter.commit_sha1 = NULL; parameter.treeish_name = NULL;
parameter.gitmodules_sha1 = null_sha1; parameter.gitmodules_sha1 = null_sha1;
parameter.overwrite = 1; parameter.overwrite = 1;
@ -492,18 +492,18 @@ int parse_submodule_config_option(const char *var, const char *value)
return parse_config(var, value, &parameter); return parse_config(var, value, &parameter);
} }
const struct submodule *submodule_from_name(const unsigned char *commit_sha1, const struct submodule *submodule_from_name(const unsigned char *treeish_name,
const char *name) const char *name)
{ {
ensure_cache_init(); ensure_cache_init();
return config_from(&the_submodule_cache, commit_sha1, name, lookup_name); return config_from(&the_submodule_cache, treeish_name, name, lookup_name);
} }
const struct submodule *submodule_from_path(const unsigned char *commit_sha1, const struct submodule *submodule_from_path(const unsigned char *treeish_name,
const char *path) const char *path)
{ {
ensure_cache_init(); ensure_cache_init();
return config_from(&the_submodule_cache, commit_sha1, path, lookup_path); return config_from(&the_submodule_cache, treeish_name, path, lookup_path);
} }
void submodule_free(void) void submodule_free(void)

View File

@ -25,9 +25,9 @@ struct submodule {
int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg); int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
int parse_push_recurse_submodules_arg(const char *opt, const char *arg); int parse_push_recurse_submodules_arg(const char *opt, const char *arg);
int parse_submodule_config_option(const char *var, const char *value); int parse_submodule_config_option(const char *var, const char *value);
const struct submodule *submodule_from_name(const unsigned char *commit_sha1, const struct submodule *submodule_from_name(const unsigned char *commit_or_tree,
const char *name); const char *name);
const struct submodule *submodule_from_path(const unsigned char *commit_sha1, const struct submodule *submodule_from_path(const unsigned char *commit_or_tree,
const char *path); const char *path);
void submodule_free(void); void submodule_free(void);

View File

@ -93,6 +93,20 @@ test_expect_success 'error message contains blob reference' '
) )
' '
test_expect_success 'using different treeishs works' '
(
cd super &&
git tag new_tag &&
tree=$(git rev-parse HEAD^{tree}) &&
commit=$(git rev-parse HEAD^{commit}) &&
test-submodule-config $commit b >expect &&
test-submodule-config $tree b >actual.1 &&
test-submodule-config new_tag b >actual.2 &&
test_cmp expect actual.1 &&
test_cmp expect actual.2
)
'
cat >super/expect_url <<EOF cat >super/expect_url <<EOF
Submodule url: 'git@somewhere.else.net:a.git' for path 'b' Submodule url: 'git@somewhere.else.net:a.git' for path 'b'
Submodule url: 'git@somewhere.else.net:submodule.git' for path 'submodule' Submodule url: 'git@somewhere.else.net:submodule.git' for path 'submodule'