Merge branch 'sb/submodule-rm-absorb'
authorJunio C Hamano <gitster@pobox.com>
Wed, 18 Jan 2017 23:12:11 +0000 (15:12 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 18 Jan 2017 23:12:11 +0000 (15:12 -0800)
"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

1  2 
builtin/rm.c
submodule.c
submodule.h
t/t3600-rm.sh
diff --cc builtin/rm.c
Simple merge
diff --cc submodule.c
Simple merge
diff --cc submodule.h
index 1ccaf0e6ba29168d3fe0a2354d4c643e4f3a080e,21b1569413829b36ab51b21705ddb23048ec0c26..b7fe4d20279dfe165338dc412595fe1ccf6ad73c
@@@ -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 bcbb68065113f6a2032a3879fabb3353c42e79d0,030d6c32ae94b2132d676a698a7a1d053e63a784..5aa6db584cd0dbddf6060eeb46f4c1c9836bc935
@@@ -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 &&