git-submodule.sh: Don't use $path variable in eval_gettext string

The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.

Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.

In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)

As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.

Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ramsay Jones 2012-04-17 19:00:58 +01:00 коммит произвёл Junio C Hamano
Родитель e8dde3e5f9
Коммит 64394e3ae9
1 изменённых файлов: 82 добавлений и 79 удалений

Просмотреть файл

@ -101,11 +101,12 @@ module_list()
module_name() module_name()
{ {
# Do we have "submodule.<something>.path = $1" defined in .gitmodules file? # Do we have "submodule.<something>.path = $1" defined in .gitmodules file?
sm_path="$1"
re=$(printf '%s\n' "$1" | sed -e 's/[].[^$\\*]/\\&/g') re=$(printf '%s\n' "$1" | sed -e 's/[].[^$\\*]/\\&/g')
name=$( git config -f .gitmodules --get-regexp '^submodule\..*\.path$' | name=$( git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' ) sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' )
test -z "$name" && test -z "$name" &&
die "$(eval_gettext "No submodule mapping found in .gitmodules for path '\$path'")" die "$(eval_gettext "No submodule mapping found in .gitmodules for path '\$sm_path'")"
echo "$name" echo "$name"
} }
@ -119,7 +120,7 @@ module_name()
# #
module_clone() module_clone()
{ {
path=$1 sm_path=$1
url=$2 url=$2
reference="$3" reference="$3"
quiet= quiet=
@ -130,8 +131,8 @@ module_clone()
gitdir= gitdir=
gitdir_base= gitdir_base=
name=$(module_name "$path" 2>/dev/null) name=$(module_name "$sm_path" 2>/dev/null)
test -n "$name" || name="$path" test -n "$name" || name="$sm_path"
base_name=$(dirname "$name") base_name=$(dirname "$name")
gitdir=$(git rev-parse --git-dir) gitdir=$(git rev-parse --git-dir)
@ -140,17 +141,17 @@ module_clone()
if test -d "$gitdir" if test -d "$gitdir"
then then
mkdir -p "$path" mkdir -p "$sm_path"
rm -f "$gitdir/index" rm -f "$gitdir/index"
else else
mkdir -p "$gitdir_base" mkdir -p "$gitdir_base"
git clone $quiet -n ${reference:+"$reference"} \ git clone $quiet -n ${reference:+"$reference"} \
--separate-git-dir "$gitdir" "$url" "$path" || --separate-git-dir "$gitdir" "$url" "$sm_path" ||
die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")" die "$(eval_gettext "Clone of '\$url' into submodule path '\$sm_path' failed")"
fi fi
a=$(cd "$gitdir" && pwd)/ a=$(cd "$gitdir" && pwd)/
b=$(cd "$path" && pwd)/ b=$(cd "$sm_path" && pwd)/
# normalize Windows-style absolute paths to POSIX-style absolute paths # normalize Windows-style absolute paths to POSIX-style absolute paths
case $a in [a-zA-Z]:/*) a=/${a%%:*}${a#*:} ;; esac case $a in [a-zA-Z]:/*) a=/${a%%:*}${a#*:} ;; esac
case $b in [a-zA-Z]:/*) b=/${b%%:*}${b#*:} ;; esac case $b in [a-zA-Z]:/*) b=/${b%%:*}${b#*:} ;; esac
@ -168,10 +169,10 @@ module_clone()
b=${b%/} b=${b%/}
rel=$(echo $b | sed -e 's|[^/]*|..|g') rel=$(echo $b | sed -e 's|[^/]*|..|g')
echo "gitdir: $rel/$a" >"$path/.git" echo "gitdir: $rel/$a" >"$sm_path/.git"
rel=$(echo $a | sed -e 's|[^/]*|..|g') rel=$(echo $a | sed -e 's|[^/]*|..|g')
(clear_local_git_env; cd "$path" && GIT_WORK_TREE=. git config core.worktree "$rel/$b") (clear_local_git_env; cd "$sm_path" && GIT_WORK_TREE=. git config core.worktree "$rel/$b")
} }
# #
@ -222,14 +223,14 @@ cmd_add()
done done
repo=$1 repo=$1
path=$2 sm_path=$2
if test -z "$path"; then if test -z "$sm_path"; then
path=$(echo "$repo" | sm_path=$(echo "$repo" |
sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g') sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
fi fi
if test -z "$repo" -o -z "$path"; then if test -z "$repo" -o -z "$sm_path"; then
usage usage
fi fi
@ -250,7 +251,7 @@ cmd_add()
# normalize path: # normalize path:
# multiple //; leading ./; /./; /../; trailing / # multiple //; leading ./; /./; /../; trailing /
path=$(printf '%s/\n' "$path" | sm_path=$(printf '%s/\n' "$sm_path" |
sed -e ' sed -e '
s|//*|/|g s|//*|/|g
s|^\(\./\)*|| s|^\(\./\)*||
@ -260,49 +261,49 @@ cmd_add()
tstart tstart
s|/*$|| s|/*$||
') ')
git ls-files --error-unmatch "$path" > /dev/null 2>&1 && git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 &&
die "$(eval_gettext "'\$path' already exists in the index")" die "$(eval_gettext "'\$sm_path' already exists in the index")"
if test -z "$force" && ! git add --dry-run --ignore-missing "$path" > /dev/null 2>&1 if test -z "$force" && ! git add --dry-run --ignore-missing "$sm_path" > /dev/null 2>&1
then then
eval_gettextln "The following path is ignored by one of your .gitignore files: eval_gettextln "The following path is ignored by one of your .gitignore files:
\$path \$sm_path
Use -f if you really want to add it." >&2 Use -f if you really want to add it." >&2
exit 1 exit 1
fi fi
# perhaps the path exists and is already a git repo, else clone it # perhaps the path exists and is already a git repo, else clone it
if test -e "$path" if test -e "$sm_path"
then then
if test -d "$path"/.git -o -f "$path"/.git if test -d "$sm_path"/.git -o -f "$sm_path"/.git
then then
eval_gettextln "Adding existing repo at '\$path' to the index" eval_gettextln "Adding existing repo at '\$sm_path' to the index"
else else
die "$(eval_gettext "'\$path' already exists and is not a valid git repo")" die "$(eval_gettext "'\$sm_path' already exists and is not a valid git repo")"
fi fi
else else
module_clone "$path" "$realrepo" "$reference" || exit module_clone "$sm_path" "$realrepo" "$reference" || exit
( (
clear_local_git_env clear_local_git_env
cd "$path" && cd "$sm_path" &&
# ash fails to wordsplit ${branch:+-b "$branch"...} # ash fails to wordsplit ${branch:+-b "$branch"...}
case "$branch" in case "$branch" in
'') git checkout -f -q ;; '') git checkout -f -q ;;
?*) git checkout -f -q -B "$branch" "origin/$branch" ;; ?*) git checkout -f -q -B "$branch" "origin/$branch" ;;
esac esac
) || die "$(eval_gettext "Unable to checkout submodule '\$path'")" ) || die "$(eval_gettext "Unable to checkout submodule '\$sm_path'")"
fi fi
git config submodule."$path".url "$realrepo" git config submodule."$sm_path".url "$realrepo"
git add $force "$path" || git add $force "$sm_path" ||
die "$(eval_gettext "Failed to add submodule '\$path'")" die "$(eval_gettext "Failed to add submodule '\$sm_path'")"
git config -f .gitmodules submodule."$path".path "$path" && git config -f .gitmodules submodule."$sm_path".path "$sm_path" &&
git config -f .gitmodules submodule."$path".url "$repo" && git config -f .gitmodules submodule."$sm_path".url "$repo" &&
git add --force .gitmodules || git add --force .gitmodules ||
die "$(eval_gettext "Failed to register submodule '\$path'")" die "$(eval_gettext "Failed to register submodule '\$sm_path'")"
} }
# #
@ -340,23 +341,25 @@ cmd_foreach()
exec 3<&0 exec 3<&0
module_list | module_list |
while read mode sha1 stage path while read mode sha1 stage sm_path
do do
if test -e "$path"/.git if test -e "$sm_path"/.git
then then
say "$(eval_gettext "Entering '\$prefix\$path'")" say "$(eval_gettext "Entering '\$prefix\$sm_path'")"
name=$(module_name "$path") name=$(module_name "$sm_path")
( (
prefix="$prefix$path/" prefix="$prefix$sm_path/"
clear_local_git_env clear_local_git_env
cd "$path" && # we make $path available to scripts ...
path=$sm_path
cd "$sm_path" &&
eval "$@" && eval "$@" &&
if test -n "$recursive" if test -n "$recursive"
then then
cmd_foreach "--recursive" "$@" cmd_foreach "--recursive" "$@"
fi fi
) <&3 3<&- || ) <&3 3<&- ||
die "$(eval_gettext "Stopping at '\$path'; script returned non-zero status.")" die "$(eval_gettext "Stopping at '\$sm_path'; script returned non-zero status.")"
fi fi
done done
} }
@ -390,15 +393,15 @@ cmd_init()
done done
module_list "$@" | module_list "$@" |
while read mode sha1 stage path while read mode sha1 stage sm_path
do do
# Skip already registered paths # Skip already registered paths
name=$(module_name "$path") || exit name=$(module_name "$sm_path") || exit
if test -z "$(git config "submodule.$name.url")" if test -z "$(git config "submodule.$name.url")"
then then
url=$(git config -f .gitmodules submodule."$name".url) url=$(git config -f .gitmodules submodule."$name".url)
test -z "$url" && test -z "$url" &&
die "$(eval_gettext "No url found for submodule path '\$path' in .gitmodules")" die "$(eval_gettext "No url found for submodule path '\$sm_path' in .gitmodules")"
# Possibly a url relative to parent # Possibly a url relative to parent
case "$url" in case "$url" in
@ -407,7 +410,7 @@ cmd_init()
;; ;;
esac esac
git config submodule."$name".url "$url" || git config submodule."$name".url "$url" ||
die "$(eval_gettext "Failed to register url for submodule path '\$path'")" die "$(eval_gettext "Failed to register url for submodule path '\$sm_path'")"
fi fi
# Copy "update" setting when it is not set yet # Copy "update" setting when it is not set yet
@ -415,9 +418,9 @@ cmd_init()
test -z "$upd" || test -z "$upd" ||
test -n "$(git config submodule."$name".update)" || test -n "$(git config submodule."$name".update)" ||
git config submodule."$name".update "$upd" || git config submodule."$name".update "$upd" ||
die "$(eval_gettext "Failed to register update mode for submodule path '\$path'")" die "$(eval_gettext "Failed to register update mode for submodule path '\$sm_path'")"
say "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$path'")" say "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$sm_path'")"
done done
} }
@ -489,14 +492,14 @@ cmd_update()
cloned_modules= cloned_modules=
module_list "$@" | { module_list "$@" | {
err= err=
while read mode sha1 stage path while read mode sha1 stage sm_path
do do
if test "$stage" = U if test "$stage" = U
then then
echo >&2 "Skipping unmerged submodule $path" echo >&2 "Skipping unmerged submodule $sm_path"
continue continue
fi fi
name=$(module_name "$path") || exit name=$(module_name "$sm_path") || exit
url=$(git config submodule."$name".url) url=$(git config submodule."$name".url)
if ! test -z "$update" if ! test -z "$update"
then then
@ -507,7 +510,7 @@ cmd_update()
if test "$update_module" = "none" if test "$update_module" = "none"
then then
echo "Skipping submodule '$path'" echo "Skipping submodule '$sm_path'"
continue continue
fi fi
@ -516,20 +519,20 @@ cmd_update()
# Only mention uninitialized submodules when its # Only mention uninitialized submodules when its
# path have been specified # path have been specified
test "$#" != "0" && test "$#" != "0" &&
say "$(eval_gettext "Submodule path '\$path' not initialized say "$(eval_gettext "Submodule path '\$sm_path' not initialized
Maybe you want to use 'update --init'?")" Maybe you want to use 'update --init'?")"
continue continue
fi fi
if ! test -d "$path"/.git -o -f "$path"/.git if ! test -d "$sm_path"/.git -o -f "$sm_path"/.git
then then
module_clone "$path" "$url" "$reference"|| exit module_clone "$sm_path" "$url" "$reference"|| exit
cloned_modules="$cloned_modules;$name" cloned_modules="$cloned_modules;$name"
subsha1= subsha1=
else else
subsha1=$(clear_local_git_env; cd "$path" && subsha1=$(clear_local_git_env; cd "$sm_path" &&
git rev-parse --verify HEAD) || git rev-parse --verify HEAD) ||
die "$(eval_gettext "Unable to find current revision in submodule path '\$path'")" die "$(eval_gettext "Unable to find current revision in submodule path '\$sm_path'")"
fi fi
if test "$subsha1" != "$sha1" if test "$subsha1" != "$sha1"
@ -545,10 +548,10 @@ Maybe you want to use 'update --init'?")"
then then
# Run fetch only if $sha1 isn't present or it # Run fetch only if $sha1 isn't present or it
# is not reachable from a ref. # is not reachable from a ref.
(clear_local_git_env; cd "$path" && (clear_local_git_env; cd "$sm_path" &&
( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) && ( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&
test -z "$rev") || git-fetch)) || test -z "$rev") || git-fetch)) ||
die "$(eval_gettext "Unable to fetch in submodule path '\$path'")" die "$(eval_gettext "Unable to fetch in submodule path '\$sm_path'")"
fi fi
# Is this something we just cloned? # Is this something we just cloned?
@ -562,24 +565,24 @@ Maybe you want to use 'update --init'?")"
case "$update_module" in case "$update_module" in
rebase) rebase)
command="git rebase" command="git rebase"
die_msg="$(eval_gettext "Unable to rebase '\$sha1' in submodule path '\$path'")" die_msg="$(eval_gettext "Unable to rebase '\$sha1' in submodule path '\$sm_path'")"
say_msg="$(eval_gettext "Submodule path '\$path': rebased into '\$sha1'")" say_msg="$(eval_gettext "Submodule path '\$sm_path': rebased into '\$sha1'")"
must_die_on_failure=yes must_die_on_failure=yes
;; ;;
merge) merge)
command="git merge" command="git merge"
die_msg="$(eval_gettext "Unable to merge '\$sha1' in submodule path '\$path'")" die_msg="$(eval_gettext "Unable to merge '\$sha1' in submodule path '\$sm_path'")"
say_msg="$(eval_gettext "Submodule path '\$path': merged in '\$sha1'")" say_msg="$(eval_gettext "Submodule path '\$sm_path': merged in '\$sha1'")"
must_die_on_failure=yes must_die_on_failure=yes
;; ;;
*) *)
command="git checkout $subforce -q" command="git checkout $subforce -q"
die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$path'")" die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$sm_path'")"
say_msg="$(eval_gettext "Submodule path '\$path': checked out '\$sha1'")" say_msg="$(eval_gettext "Submodule path '\$sm_path': checked out '\$sha1'")"
;; ;;
esac esac
if (clear_local_git_env; cd "$path" && $command "$sha1") if (clear_local_git_env; cd "$sm_path" && $command "$sha1")
then then
say "$say_msg" say "$say_msg"
elif test -n "$must_die_on_failure" elif test -n "$must_die_on_failure"
@ -593,11 +596,11 @@ Maybe you want to use 'update --init'?")"
if test -n "$recursive" if test -n "$recursive"
then then
(clear_local_git_env; cd "$path" && eval cmd_update "$orig_flags") (clear_local_git_env; cd "$sm_path" && eval cmd_update "$orig_flags")
res=$? res=$?
if test $res -gt 0 if test $res -gt 0
then then
die_msg="$(eval_gettext "Failed to recurse into submodule path '\$path'")" die_msg="$(eval_gettext "Failed to recurse into submodule path '\$sm_path'")"
if test $res -eq 1 if test $res -eq 1
then then
err="${err};$die_msg" err="${err};$die_msg"
@ -884,30 +887,30 @@ cmd_status()
done done
module_list "$@" | module_list "$@" |
while read mode sha1 stage path while read mode sha1 stage sm_path
do do
name=$(module_name "$path") || exit name=$(module_name "$sm_path") || exit
url=$(git config submodule."$name".url) url=$(git config submodule."$name".url)
displaypath="$prefix$path" displaypath="$prefix$sm_path"
if test "$stage" = U if test "$stage" = U
then then
say "U$sha1 $displaypath" say "U$sha1 $displaypath"
continue continue
fi fi
if test -z "$url" || ! test -d "$path"/.git -o -f "$path"/.git if test -z "$url" || ! test -d "$sm_path"/.git -o -f "$sm_path"/.git
then then
say "-$sha1 $displaypath" say "-$sha1 $displaypath"
continue; continue;
fi fi
set_name_rev "$path" "$sha1" set_name_rev "$sm_path" "$sha1"
if git diff-files --ignore-submodules=dirty --quiet -- "$path" if git diff-files --ignore-submodules=dirty --quiet -- "$sm_path"
then then
say " $sha1 $displaypath$revname" say " $sha1 $displaypath$revname"
else else
if test -z "$cached" if test -z "$cached"
then then
sha1=$(clear_local_git_env; cd "$path" && git rev-parse --verify HEAD) sha1=$(clear_local_git_env; cd "$sm_path" && git rev-parse --verify HEAD)
set_name_rev "$path" "$sha1" set_name_rev "$sm_path" "$sha1"
fi fi
say "+$sha1 $displaypath$revname" say "+$sha1 $displaypath$revname"
fi fi
@ -917,10 +920,10 @@ cmd_status()
( (
prefix="$displaypath/" prefix="$displaypath/"
clear_local_git_env clear_local_git_env
cd "$path" && cd "$sm_path" &&
eval cmd_status "$orig_args" eval cmd_status "$orig_args"
) || ) ||
die "$(eval_gettext "Failed to recurse into submodule path '\$path'")" die "$(eval_gettext "Failed to recurse into submodule path '\$sm_path'")"
fi fi
done done
} }
@ -952,9 +955,9 @@ cmd_sync()
done done
cd_to_toplevel cd_to_toplevel
module_list "$@" | module_list "$@" |
while read mode sha1 stage path while read mode sha1 stage sm_path
do do
name=$(module_name "$path") name=$(module_name "$sm_path")
url=$(git config -f .gitmodules --get submodule."$name".url) url=$(git config -f .gitmodules --get submodule."$name".url)
# Possibly a url relative to parent # Possibly a url relative to parent
@ -969,11 +972,11 @@ cmd_sync()
say "$(eval_gettext "Synchronizing submodule url for '\$name'")" say "$(eval_gettext "Synchronizing submodule url for '\$name'")"
git config submodule."$name".url "$url" git config submodule."$name".url "$url"
if test -e "$path"/.git if test -e "$sm_path"/.git
then then
( (
clear_local_git_env clear_local_git_env
cd "$path" cd "$sm_path"
remote=$(get_default_remote) remote=$(get_default_remote)
git config remote."$remote".url "$url" git config remote."$remote".url "$url"
) )