previous work:
https://public-inbox.org/git/20170309221543.15897-1-sbel...@google.com/

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"

Reply via email to