submodule: fix handling of superproject origin URLs like foo, ./foo and ./foo/bar
authorJon Seymour <jon.seymour@gmail.com>
Wed, 6 Jun 2012 11:57:30 +0000 (21:57 +1000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 6 Jun 2012 18:43:55 +0000 (11:43 -0700)
Currently git submodule init and git submodule sync fail with an error
if the superproject origin URL is of the form foo but succeed if the
superproject origin URL is of the form ./foo or ./foo/bar or foo/bar.

This change makes handling of the foo case behave like the handling
of the ./foo case and also ensures that superfluous leading and
embedded ./'s are removed from the resulting derived URLs.

Signed-off-by: Jon Seymour <jon.seymour@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-submodule.sh
t/t7400-submodule-basic.sh
t/t7403-submodule-sync.sh

index 0a3e1465e39cb9c5973718496ff6867728884ec0..b0b6ccbe723e7c86a478b19166871245bf10ed5d 100755 (executable)
@@ -60,8 +60,12 @@ resolve_relative_url ()
        *:*|/*)
                is_relative=
                ;;
+       ./*|../*)
+               is_relative=t
+               ;;
        *)
                is_relative=t
+               remoteurl="./$remoteurl"
                ;;
        esac
 
@@ -79,7 +83,12 @@ resolve_relative_url ()
                                sep=:
                                ;;
                        *)
-                               die "$(eval_gettext "cannot strip one component off url '\$remoteurl'")"
+                               if test -z "$is_relative" || test "." = "$remoteurl"
+                               then
+                                       die "$(eval_gettext "cannot strip one component off url '\$remoteurl'")"
+                               else
+                                       remoteurl=.
+                               fi
                                ;;
                        esac
                        ;;
@@ -90,7 +99,8 @@ resolve_relative_url ()
                        break;;
                esac
        done
-       echo "${is_relative:+${up_path}}$remoteurl$sep${url%/}"
+       remoteurl="$remoteurl$sep${url%/}"
+       echo "${is_relative:+${up_path}}${remoteurl#./}"
 }
 
 #
index 09e2b9bf16e6bd2d9031aa221e8b259228602d54..a899e6dbf5812f77183bd7e5d6a7be3afc8a49ef 100755 (executable)
@@ -564,7 +564,7 @@ test_expect_success '../subrepo works with scp-style URL - user@host:path/to/rep
        )
 '
 
-test_expect_failure '../subrepo works with relative local path - foo' '
+test_expect_success '../subrepo works with relative local path - foo' '
        (
                cd reltest &&
                cp pristine-.git-config .git/config &&
@@ -587,7 +587,7 @@ test_expect_success '../subrepo works with relative local path - foo/bar' '
        )
 '
 
-test_expect_failure '../subrepo works with relative local path - ./foo' '
+test_expect_success '../subrepo works with relative local path - ./foo' '
        (
                cd reltest &&
                cp pristine-.git-config .git/config &&
@@ -598,7 +598,7 @@ test_expect_failure '../subrepo works with relative local path - ./foo' '
        )
 '
 
-test_expect_failure '../subrepo works with relative local path - ./foo/bar' '
+test_expect_success '../subrepo works with relative local path - ./foo/bar' '
        (
                cd reltest &&
                cp pristine-.git-config .git/config &&
index 98bc74a4e9cc3b5b122cc114e1ec357828c1dc06..524d5c1b21a507c5ed16edc52fb9353792b83f28 100755 (executable)
@@ -88,7 +88,7 @@ test_expect_success '"git submodule sync" should not vivify uninteresting submod
        )
 '
 
-test_expect_failure '"git submodule sync" handles origin URL of the form foo' '
+test_expect_success '"git submodule sync" handles origin URL of the form foo' '
        (cd relative-clone &&
         git remote set-url origin foo &&
         git submodule sync &&
@@ -110,7 +110,7 @@ test_expect_success '"git submodule sync" handles origin URL of the form foo/bar
        )
 '
 
-test_expect_failure '"git submodule sync" handles origin URL of the form ./foo' '
+test_expect_success '"git submodule sync" handles origin URL of the form ./foo' '
        (cd relative-clone &&
         git remote set-url origin ./foo &&
         git submodule sync &&
@@ -121,7 +121,7 @@ test_expect_failure '"git submodule sync" handles origin URL of the form ./foo'
        )
 '
 
-test_expect_failure '"git submodule sync" handles origin URL of the form ./foo/bar' '
+test_expect_success '"git submodule sync" handles origin URL of the form ./foo/bar' '
        (cd relative-clone &&
         git remote set-url origin ./foo/bar &&
         git submodule sync &&