summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael J Gruber <git@drmicha.warpmail.net>2009-03-03 15:08:21 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-03-04 05:46:09 (GMT)
commitdb75ada559dd4de99fedd1fc4f62a9273f032dd3 (patch)
tree4761f0ffa459a46195a6eeac39a4ed35334c3fa6
parentac8463d2b4c0e88011c40985bc519c0e2e2f2278 (diff)
downloadgit-db75ada559dd4de99fedd1fc4f62a9273f032dd3.zip
git-db75ada559dd4de99fedd1fc4f62a9273f032dd3.tar.gz
git-db75ada559dd4de99fedd1fc4f62a9273f032dd3.tar.bz2
git submodule: Fix adding of submodules at paths with ./, .. and //
Make 'git submodule add' normalize the submodule path in the same way as 'git ls-files' does, so that 'git submodule init' looks up the information in .gitmodules with the same key under which 'git submodule add' stores it. This fixes 4 known breakages. Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-xgit-submodule.sh15
-rwxr-xr-xt/t7400-submodule-basic.sh8
2 files changed, 16 insertions, 7 deletions
diff --git a/git-submodule.sh b/git-submodule.sh
index 2f47e06..68d6afd 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -166,9 +166,18 @@ cmd_add()
;;
esac
- # strip trailing slashes from path
- path=$(echo "$path" | sed -e 's|/*$||')
-
+ # normalize path:
+ # multiple //; leading ./; /./; /../; trailing /
+ path=$(printf '%s/\n' "$path" |
+ sed -e '
+ s|//*|/|g
+ s|^\(\./\)*||
+ s|/\./|/|g
+ :start
+ s|\([^/]*\)/\.\./||
+ tstart
+ s|/*$||
+ ')
git ls-files --error-unmatch "$path" > /dev/null 2>&1 &&
die "'$path' already exists in the index"
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index 132d0b9..21c19a2 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -64,7 +64,7 @@ test_expect_success 'submodule add' '
)
'
-test_expect_failure 'submodule add with ./ in path' '
+test_expect_success 'submodule add with ./ in path' '
(
cd addtest &&
git submodule add "$submodurl" ././dotsubmod/./frotz/./ &&
@@ -72,7 +72,7 @@ test_expect_failure 'submodule add with ./ in path' '
)
'
-test_expect_failure 'submodule add with // in path' '
+test_expect_success 'submodule add with // in path' '
(
cd addtest &&
git submodule add "$submodurl" slashslashsubmod///frotz// &&
@@ -80,7 +80,7 @@ test_expect_failure 'submodule add with // in path' '
)
'
-test_expect_failure 'submodule add with /.. in path' '
+test_expect_success 'submodule add with /.. in path' '
(
cd addtest &&
git submodule add "$submodurl" dotdotsubmod/../realsubmod/frotz/.. &&
@@ -88,7 +88,7 @@ test_expect_failure 'submodule add with /.. in path' '
)
'
-test_expect_failure 'submodule add with ./, /.. and // in path' '
+test_expect_success 'submodule add with ./, /.. and // in path' '
(
cd addtest &&
git submodule add "$submodurl" dot/dotslashsubmod/./../..////realsubmod2/a/b/c/d/../../../../frotz//.. &&