From: Junio C Hamano Date: Wed, 18 Jan 2017 23:12:11 +0000 (-0800) Subject: Merge branch 'sb/submodule-rm-absorb' X-Git-Tag: v2.12.0-rc0~75 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ccd681c2a;p=git Merge branch 'sb/submodule-rm-absorb' "git rm" used to refuse to remove a submodule when it has its own git repository embedded in its working tree. It learned to move the repository away to $GIT_DIR/modules/ of the superproject instead, and allow the submodule to be deleted (as long as there will be no loss of local modifications, that is). * sb/submodule-rm-absorb: rm: absorb a submodules git dir before deletion submodule: rename and add flags to ok_to_remove_submodule submodule: modernize ok_to_remove_submodule to use argv_array submodule.h: add extern keyword to functions --- 3ccd681c2ab11522591be8a7a3eddb1a85a43ab0 diff --cc submodule.h index 1ccaf0e6ba,21b1569413..b7fe4d2027 --- a/submodule.h +++ b/submodule.h @@@ -30,22 -29,19 +30,22 @@@ struct submodule_update_strategy }; #define SUBMODULE_UPDATE_STRATEGY_INIT {SM_UPDATE_UNSPECIFIED, NULL} - int is_staging_gitmodules_ok(void); - int update_path_in_gitmodules(const char *oldpath, const char *newpath); - int remove_path_from_gitmodules(const char *path); - void stage_updated_gitmodules(void); - void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt, + extern int is_staging_gitmodules_ok(void); + extern int update_path_in_gitmodules(const char *oldpath, const char *newpath); + extern int remove_path_from_gitmodules(const char *path); + extern void stage_updated_gitmodules(void); + extern void set_diffopt_flags_from_submodule_config(struct diff_options *, const char *path); - int submodule_config(const char *var, const char *value, void *cb); - void gitmodules_config(void); + extern int submodule_config(const char *var, const char *value, void *cb); + extern void gitmodules_config(void); +extern void gitmodules_config_sha1(const unsigned char *commit_sha1); +extern int is_submodule_initialized(const char *path); +extern int is_submodule_populated(const char *path); - int parse_submodule_update_strategy(const char *value, + extern int parse_submodule_update_strategy(const char *value, struct submodule_update_strategy *dst); - const char *submodule_strategy_to_string(const struct submodule_update_strategy *s); - void handle_ignore_submodules_arg(struct diff_options *diffopt, const char *); - void show_submodule_summary(FILE *f, const char *path, + extern const char *submodule_strategy_to_string(const struct submodule_update_strategy *s); + extern void handle_ignore_submodules_arg(struct diff_options *, const char *); + extern void show_submodule_summary(FILE *f, const char *path, const char *line_prefix, struct object_id *one, struct object_id *two, unsigned dirty_submodule, const char *meta, @@@ -56,22 -52,29 +56,30 @@@ extern void show_submodule_inline_diff( unsigned dirty_submodule, const char *meta, const char *del, const char *add, const char *reset, const struct diff_options *opt); - void set_config_fetch_recurse_submodules(int value); - void check_for_new_submodule_commits(unsigned char new_sha1[20]); - int fetch_populated_submodules(const struct argv_array *options, + extern void set_config_fetch_recurse_submodules(int value); + extern void check_for_new_submodule_commits(unsigned char new_sha1[20]); + extern int fetch_populated_submodules(const struct argv_array *options, const char *prefix, int command_line_option, int quiet, int max_parallel_jobs); - unsigned is_submodule_modified(const char *path, int ignore_untracked); - int submodule_uses_gitfile(const char *path); - int ok_to_remove_submodule(const char *path); - int merge_submodule(unsigned char result[20], const char *path, const unsigned char base[20], - const unsigned char a[20], const unsigned char b[20], int search); - int find_unpushed_submodules(struct sha1_array *commits, const char *remotes_name, - struct string_list *needs_pushing); + extern unsigned is_submodule_modified(const char *path, int ignore_untracked); + extern int submodule_uses_gitfile(const char *path); + + #define SUBMODULE_REMOVAL_DIE_ON_ERROR (1<<0) + #define SUBMODULE_REMOVAL_IGNORE_UNTRACKED (1<<1) + #define SUBMODULE_REMOVAL_IGNORE_IGNORED_UNTRACKED (1<<2) + extern int bad_to_remove_submodule(const char *path, unsigned flags); + extern int merge_submodule(unsigned char result[20], const char *path, + const unsigned char base[20], + const unsigned char a[20], + const unsigned char b[20], int search); -extern int find_unpushed_submodules(unsigned char new_sha1[20], ++extern int find_unpushed_submodules(struct sha1_array *commits, + const char *remotes_name, + struct string_list *needs_pushing); -extern int push_unpushed_submodules(unsigned char new_sha1[20], - const char *remotes_name); +extern int push_unpushed_submodules(struct sha1_array *commits, + const char *remotes_name, + int dry_run); - int parallel_submodules(void); + extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir); + extern int parallel_submodules(void); /* * Prepare the "env_array" parameter of a "struct child_process" for executing diff --cc t/t3600-rm.sh index bcbb680651,030d6c32ae..5aa6db584c --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@@ -684,10 -697,10 +675,10 @@@ test_expect_success 'rm of a populated ' test_expect_success 'checking out a commit after submodule removal needs manual updates' ' - git commit -m "submodule removal" submod && + git commit -m "submodule removal" submod .gitmodules && git checkout HEAD^ && git submodule update && - git checkout -q HEAD^ 2>actual && + git checkout -q HEAD^ && git checkout -q master 2>actual && test_i18ngrep "^warning: unable to rmdir submod:" actual && git status -s submod >actual &&