On Mon, Oct 31, 2016 at 3:38 PM, Brandon Williams <[email protected]> wrote:
> Teach submodules to load a '.gitmodules' file from a commit sha1. This
> enables the population of the submodule_cache to be based on the state
> of the '.gitmodules' file from a particular commit.
>
> Signed-off-by: Brandon Williams <[email protected]>
> ---
> cache.h | 2 ++
> config.c | 8 ++++----
> submodule-config.c | 6 +++---
> submodule-config.h | 3 +++
> submodule.c | 12 ++++++++++++
> submodule.h | 1 +
> 6 files changed, 25 insertions(+), 7 deletions(-)
>
> diff --git a/cache.h b/cache.h
> index 1be6526..559a461 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -1690,6 +1690,8 @@ extern int git_default_config(const char *, const char
> *, void *);
> extern int git_config_from_file(config_fn_t fn, const char *, void *);
> extern int git_config_from_mem(config_fn_t fn, const enum config_origin_type,
> const char *name, const char *buf,
> size_t len, void *data);
> +extern int git_config_from_blob_sha1(config_fn_t fn, const char *name,
> + const unsigned char *sha1, void *data);
> extern void git_config_push_parameter(const char *text);
> extern int git_config_from_parameters(config_fn_t fn, void *data);
> extern void git_config(config_fn_t fn, void *);
> diff --git a/config.c b/config.c
> index 83fdecb..4d78e72 100644
> --- a/config.c
> +++ b/config.c
> @@ -1214,10 +1214,10 @@ int git_config_from_mem(config_fn_t fn, const enum
> config_origin_type origin_typ
> return do_config_from(&top, fn, data);
> }
>
> -static int git_config_from_blob_sha1(config_fn_t fn,
> - const char *name,
> - const unsigned char *sha1,
> - void *data)
> +int git_config_from_blob_sha1(config_fn_t fn,
> + const char *name,
> + const unsigned char *sha1,
While looking at this code, we may want to investigate if a conversion
to struct object_id (instead of const char * for sha1) is feasible.
> + void *data)
> {
> enum object_type type;
> char *buf;
> diff --git a/submodule-config.c b/submodule-config.c
> index 098085b..8b9a2ef 100644
> --- a/submodule-config.c
> +++ b/submodule-config.c
> @@ -379,9 +379,9 @@ static int parse_config(const char *var, const char
> *value, void *data)
> return ret;
> }
>
> -static int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
> - unsigned char *gitmodules_sha1,
> - struct strbuf *rev)
> +int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
> + unsigned char *gitmodules_sha1,
> + struct strbuf *rev)
> {
> int ret = 0;
>
> diff --git a/submodule-config.h b/submodule-config.h
> index d05c542..78584ba 100644
> --- a/submodule-config.h
> +++ b/submodule-config.h
> @@ -29,6 +29,9 @@ const struct submodule *submodule_from_name(const unsigned
> char *commit_sha1,
> const char *name);
> const struct submodule *submodule_from_path(const unsigned char *commit_sha1,
> const char *path);
> +extern int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
> + unsigned char *gitmodules_sha1,
> + struct strbuf *rev);
no need for extern here as it is a function declaration, not a
variable declaration;
(as said on patch 1, I think consistency to the surrounding is important here)
> void submodule_free(void);
>
> #endif /* SUBMODULE_CONFIG_H */
> diff --git a/submodule.c b/submodule.c
> index ff4e7b2..19dfbd4 100644
> --- a/submodule.c
> +++ b/submodule.c
> @@ -198,6 +198,18 @@ void gitmodules_config(void)
> }
> }
>
> +void gitmodules_config_sha1(const unsigned char *commit_sha1)
> +{
> + struct strbuf rev = STRBUF_INIT;
> + unsigned char sha1[20];
> +
> + if (gitmodule_sha1_from_commit(commit_sha1, sha1, &rev)) {
> + git_config_from_blob_sha1(submodule_config, rev.buf,
> + sha1, NULL);
> + }
> + strbuf_release(&rev);
> +}
> +
> /*
> * Determine if a submodule has been initialized at a given 'path'
> */
> diff --git a/submodule.h b/submodule.h
> index bd039ca..9a24ac8 100644
> --- a/submodule.h
> +++ b/submodule.h
> @@ -37,6 +37,7 @@ void set_diffopt_flags_from_submodule_config(struct
> diff_options *diffopt,
> const char *path);
> int submodule_config(const char *var, const char *value, void *cb);
> void gitmodules_config(void);
> +extern void gitmodules_config_sha1(const unsigned char *commit_sha1);
same.
> extern int is_submodule_initialized(const char *path);
> extern int is_submodule_checked_out(const char *path);
> int parse_submodule_update_strategy(const char *value,
> --
> 2.8.0.rc3.226.g39d4020
>