This commit adds the functions and files needed for configuration, documentation, setting the default behavior and determining if a submodule path should be updated automatically. It won't really enable recursive submodule update. This will be done by later commits. Signed-off-by: Jens Lehmann <Jens.Lehmann@xxxxxx> --- Documentation/recurse-submodules-update.txt | 8 +++++ submodule.c | 50 +++++++++++++++++++++++++++++ submodule.h | 6 ++++ 3 files changed, 64 insertions(+) create mode 100644 Documentation/recurse-submodules-update.txt diff --git a/Documentation/recurse-submodules-update.txt b/Documentation/recurse-submodules-update.txt new file mode 100644 index 0000000..e57d452 --- /dev/null +++ b/Documentation/recurse-submodules-update.txt @@ -0,0 +1,8 @@ +--[no-]recurse-submodules:: + Using --recurse-submodules will update the work tree of all + initialized submodules according to the commit recorded in the + superproject if their update configuration is set to checkout'. If + local modifications in a submodule would be overwritten the checkout + will fail unless forced. Without this option or with + --no-recurse-submodules is, the work trees of submodules will not be + updated, only the hash recorded in the superproject will be updated. diff --git a/submodule.c b/submodule.c index 613857e..b3eb28d 100644 --- a/submodule.c +++ b/submodule.c @@ -16,6 +16,8 @@ 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 int config_update_recurse_submodules = RECURSE_SUBMODULES_OFF; +static int option_update_recurse_submodules = RECURSE_SUBMODULES_DEFAULT; static struct string_list changed_submodule_paths; static int initialized_fetch_ref_tips; static struct sha1_array ref_tips_before_fetch; @@ -382,6 +384,48 @@ int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg) } } +int parse_update_recurse_submodules_arg(const char *opt, const char *arg) +{ + switch (git_config_maybe_bool(opt, arg)) { + case 1: + return RECURSE_SUBMODULES_ON; + case 0: + return RECURSE_SUBMODULES_OFF; + default: + if (!strcmp(arg, "checkout")) + return RECURSE_SUBMODULES_ON; + die("bad %s argument: %s", opt, arg); + } +} + +int option_parse_update_submodules(const struct option *opt, + const char *arg, int unset) +{ + if (unset) { + *(int *)opt->value = RECURSE_SUBMODULES_OFF; + } else { + if (arg) + *(int *)opt->value = parse_update_recurse_submodules_arg(opt->long_name, arg); + else + *(int *)opt->value = RECURSE_SUBMODULES_ON; + } + return 0; +} + +int submodule_needs_update(const char *path) +{ + struct string_list_item *path_option; + path_option = unsorted_string_list_lookup(&config_name_for_path, path); + if (!path_option) + return 0; + + /* update can't be "none", "merge" or "rebase" */ + + if (option_update_recurse_submodules != RECURSE_SUBMODULES_DEFAULT) + return 1; + return config_update_recurse_submodules != RECURSE_SUBMODULES_OFF; +} + void show_submodule_summary(FILE *f, const char *path, const char *line_prefix, unsigned char one[20], unsigned char two[20], @@ -589,6 +633,12 @@ int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_nam return ret; } +void set_config_update_recurse_submodules(int default_value, int option_value) +{ + config_update_recurse_submodules = default_value; + option_update_recurse_submodules = option_value; +} + static int is_submodule_commit_present(const char *path, unsigned char sha1[20]) { int is_present = 0; diff --git a/submodule.h b/submodule.h index 7beec48..79b336b 100644 --- a/submodule.h +++ b/submodule.h @@ -3,6 +3,7 @@ struct diff_options; struct argv_array; +struct option; enum { RECURSE_SUBMODULES_ON_DEMAND = -1, @@ -22,12 +23,17 @@ void gitmodules_config(void); int parse_submodule_config_option(const char *var, const char *value); void handle_ignore_submodules_arg(struct diff_options *diffopt, const char *); int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg); +int parse_update_recurse_submodules_arg(const char *opt, const char *arg); +int option_parse_update_submodules(const struct option *opt, + const char *arg, int unset); +int submodule_needs_update(const char *path); void show_submodule_summary(FILE *f, const char *path, const char *line_prefix, unsigned char one[20], unsigned char two[20], unsigned dirty_submodule, const char *meta, const char *del, const char *add, const char *reset); void set_config_fetch_recurse_submodules(int value); +void set_config_update_recurse_submodules(int default_value, int option_value); void check_for_new_submodule_commits(unsigned char new_sha1[20]); int fetch_populated_submodules(const struct argv_array *options, const char *prefix, int command_line_option, -- 1.9.rc0.28.ge3363ff -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html