previous work: https://public-inbox.org/git/20170309221543.15897-1-sbeller@xxxxxxxxxx/ v9: * inderdiff to current origin/sb/checkout-recurse-submodules below * fixed a '\' that was violating the style guide. * reordered the patches, such that -> the first two patches are Valerys series and could go on its own as a cleanup -> added a new patch "submodule.c: get_super_prefix_or_empty" to have cleaner code. * split up the error conditions in the test lib for readability v1..v8: see description in link to previous work above. Thanks, Stefan diff --git a/submodule.c b/submodule.c index bc5fecf8c5..929fc7bf04 100644 --- a/submodule.c +++ b/submodule.c @@ -1239,6 +1239,14 @@ int bad_to_remove_submodule(const char *path, unsigned flags) return ret; } +static const char *get_super_prefix_or_empty() +{ + const char *s = get_super_prefix(); + if (!s) + s = ""; + return s; +} + static int submodule_has_dirty_index(const struct submodule *sub) { struct child_process cp = CHILD_PROCESS_INIT; @@ -1246,8 +1254,8 @@ static int submodule_has_dirty_index(const struct submodule *sub) prepare_submodule_repo_env_no_git_dir(&cp.env_array); cp.git_cmd = 1; - argv_array_pushl(&cp.args, "diff-index", "--quiet", \ - "--cached", "HEAD", NULL); + argv_array_pushl(&cp.args, "diff-index", "--quiet", + "--cached", "HEAD", NULL); cp.no_stdin = 1; cp.no_stdout = 1; cp.dir = sub->path; @@ -1266,7 +1274,8 @@ static void submodule_reset_index(const char *path) cp.no_stdin = 1; cp.dir = path; - argv_array_pushf(&cp.args, "--super-prefix=%s/", path); + argv_array_pushf(&cp.args, "--super-prefix=%s%s/", + get_super_prefix_or_empty(), path); argv_array_pushl(&cp.args, "read-tree", "-u", "--reset", NULL); argv_array_push(&cp.args, EMPTY_TREE_SHA1_HEX); @@ -1323,7 +1332,8 @@ int submodule_move_head(const char *path, cp.no_stdin = 1; cp.dir = path; - argv_array_pushf(&cp.args, "--super-prefix=%s/", path); + argv_array_pushf(&cp.args, "--super-prefix=%s%s/", + get_super_prefix_or_empty(), path); argv_array_pushl(&cp.args, "read-tree", NULL); if (flags & SUBMODULE_MOVE_HEAD_DRY_RUN) @@ -1573,11 +1583,8 @@ static void relocate_single_git_dir_into_superproject(const char *prefix, die(_("could not create directory '%s'"), new_git_dir); real_new_git_dir = real_pathdup(new_git_dir); - if (!prefix) - prefix = get_super_prefix(); - fprintf(stderr, _("Migrating git directory of '%s%s' from\n'%s' to\n'%s'\n"), - prefix ? prefix : "", path, + get_super_prefix_or_empty(), path, real_old_git_dir, real_new_git_dir); relocate_gitdir(path, real_old_git_dir, real_new_git_dir); @@ -1648,8 +1655,7 @@ void absorb_git_dir_into_superproject(const char *prefix, if (flags & ~ABSORB_GITDIR_RECURSE_SUBMODULES) die("BUG: we don't know how to pass the flags down?"); - if (get_super_prefix()) - strbuf_addstr(&sb, get_super_prefix()); + strbuf_addstr(&sb, get_super_prefix_or_empty()); strbuf_addstr(&sb, path); strbuf_addch(&sb, '/'); diff --git a/t/lib-submodule-update.sh b/t/lib-submodule-update.sh index e195b590a1..fb4f7b014e 100755 --- a/t/lib-submodule-update.sh +++ b/t/lib-submodule-update.sh @@ -782,15 +782,20 @@ test_submodule_forced_switch () { test_submodule_switch_recursing () { command="$1" - RESULT=success + RESULTDS=success if test "$KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS" = 1 then - RESULT=failure + RESULTDS=failure + fi + RESULTR=success + if test "$KNOWN_FAILURE_SUBMODULE_RECURSIVE_NESTED" = 1 + then + RESULTR=failure fi - RESULT1=success + RESULTOI=success if test "$KNOWN_FAILURE_SUBMODULE_OVERWRITE_IGNORED_UNTRACKED" = 1 then - RESULT1=failure + RESULTOI=failure fi ######################### Appearing submodule ######################### # Switching to a commit letting a submodule appear checks it out ... @@ -832,7 +837,7 @@ test_submodule_switch_recursing () { ) ' # ... but an ignored file is fine. - test_expect_$RESULT1 "$command: added submodule removes an untracked ignored file" ' + test_expect_$RESULTOI "$command: added submodule removes an untracked ignored file" ' test_when_finished "rm submodule_update/.git/info/exclude" && prolog && reset_work_tree_to_interested no_submodule && @@ -901,7 +906,7 @@ test_submodule_switch_recursing () { ' # Replacing a submodule with files in a directory must succeeds # when the submodule is clean - test_expect_$RESULT "$command: replace submodule with a directory" ' + test_expect_$RESULTDS "$command: replace submodule with a directory" ' prolog && reset_work_tree_to_interested add_sub1 && ( @@ -913,7 +918,7 @@ test_submodule_switch_recursing () { ) ' # ... absorbing a .git directory. - test_expect_$RESULT "$command: replace submodule containing a .git directory with a directory must absorb the git dir" ' + test_expect_$RESULTDS "$command: replace submodule containing a .git directory with a directory must absorb the git dir" ' prolog && reset_work_tree_to_interested add_sub1 && ( @@ -941,7 +946,7 @@ test_submodule_switch_recursing () { ' # ... must check its local work tree for untracked files - test_expect_$RESULT "$command: replace submodule with a file must fail with untracked files" ' + test_expect_$RESULTDS "$command: replace submodule with a file must fail with untracked files" ' prolog && reset_work_tree_to_interested add_sub1 && ( @@ -998,7 +1003,7 @@ test_submodule_switch_recursing () { ' # recursing deeper than one level doesn't work yet. - test_expect_failure "$command: modified submodule updates submodule recursively" ' + test_expect_$RESULTR "$command: modified submodule updates submodule recursively" ' prolog && reset_work_tree_to_interested add_nested_sub && ( @@ -1116,13 +1121,13 @@ test_submodule_forced_switch_recursing () { ) ' # Replacing a submodule with files in a directory ... - test_expect_$RESULT "$command: replace submodule with a directory" ' + test_expect_success "$command: replace submodule with a directory" ' prolog && reset_work_tree_to_interested add_sub1 && ( cd submodule_update && git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory && - test_must_fail $command replace_sub1_with_directory && + $command replace_sub1_with_directory && test_superproject_content origin/replace_sub1_with_directory ) ' diff --git a/t/t1013-read-tree-submodule.sh b/t/t1013-read-tree-submodule.sh index 7019d0a04f..de1ba02dc5 100755 --- a/t/t1013-read-tree-submodule.sh +++ b/t/t1013-read-tree-submodule.sh @@ -5,6 +5,7 @@ test_description='read-tree can handle submodules' . ./test-lib.sh . "$TEST_DIRECTORY"/lib-submodule-update.sh +KNOWN_FAILURE_SUBMODULE_RECURSIVE_NESTED=1 KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS=1 KNOWN_FAILURE_SUBMODULE_OVERWRITE_IGNORED_UNTRACKED=1 diff --git a/t/t2013-checkout-submodule.sh b/t/t2013-checkout-submodule.sh index aa35223369..e8f70b806f 100755 --- a/t/t2013-checkout-submodule.sh +++ b/t/t2013-checkout-submodule.sh @@ -64,6 +64,7 @@ test_expect_success '"checkout <submodule>" honors submodule.*.ignore from .git/ ' KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS=1 +KNOWN_FAILURE_SUBMODULE_RECURSIVE_NESTED=1 test_submodule_switch_recursing "git checkout --recurse-submodules" test_submodule_forced_switch_recursing "git checkout -f --recurse-submodules"