submodule: remove bashism from shell script

Junio pointed out `relative_path` was using bashisms via the
local variables. As the longer term goal is to rewrite most of the
submodule code in C, do it now.

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Stefan Beller 2016-05-31 17:27:59 -07:00 committed by Junio C Hamano
parent b0f4b40846
commit 44431df024
2 changed files with 20 additions and 43 deletions

View File

@ -831,6 +831,17 @@ static int update_clone(int argc, const char **argv, const char *prefix)
return 0; return 0;
} }
static int resolve_relative_path(int argc, const char **argv, const char *prefix)
{
struct strbuf sb = STRBUF_INIT;
if (argc != 3)
die("submodule--helper relative_path takes exactly 2 arguments, got %d", argc);
printf("%s", relative_path(argv[1], argv[2], &sb));
strbuf_release(&sb);
return 0;
}
struct cmd_struct { struct cmd_struct {
const char *cmd; const char *cmd;
int (*fn)(int, const char **, const char *); int (*fn)(int, const char **, const char *);
@ -841,6 +852,7 @@ static struct cmd_struct commands[] = {
{"name", module_name}, {"name", module_name},
{"clone", module_clone}, {"clone", module_clone},
{"update-clone", update_clone}, {"update-clone", update_clone},
{"relative-path", resolve_relative_path},
{"resolve-relative-url", resolve_relative_url}, {"resolve-relative-url", resolve_relative_url},
{"resolve-relative-url-test", resolve_relative_url_test}, {"resolve-relative-url-test", resolve_relative_url_test},
{"init", module_init} {"init", module_init}

View File

@ -46,41 +46,6 @@ prefix=
custom_name= custom_name=
depth= depth=
# Resolve a path to be relative to another path. This is intended for
# converting submodule paths when git-submodule is run in a subdirectory
# and only handles paths where the directory separator is '/'.
#
# The output is the first argument as a path relative to the second argument,
# which defaults to $wt_prefix if it is omitted.
relative_path ()
{
local target curdir result
target=$1
curdir=${2-$wt_prefix}
curdir=${curdir%/}
result=
while test -n "$curdir"
do
case "$target" in
"$curdir/"*)
target=${target#"$curdir"/}
break
;;
esac
result="${result}../"
if test "$curdir" = "${curdir%/*}"
then
curdir=
else
curdir="${curdir%/*}"
fi
done
echo "$result$target"
}
die_if_unmatched () die_if_unmatched ()
{ {
if test "$1" = "#unmatched" if test "$1" = "#unmatched"
@ -354,14 +319,14 @@ cmd_foreach()
die_if_unmatched "$mode" die_if_unmatched "$mode"
if test -e "$sm_path"/.git if test -e "$sm_path"/.git
then then
displaypath=$(relative_path "$prefix$sm_path") displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
say "$(eval_gettext "Entering '\$displaypath'")" say "$(eval_gettext "Entering '\$displaypath'")"
name=$(git submodule--helper name "$sm_path") name=$(git submodule--helper name "$sm_path")
( (
prefix="$prefix$sm_path/" prefix="$prefix$sm_path/"
sanitize_submodule_env sanitize_submodule_env
cd "$sm_path" && cd "$sm_path" &&
sm_path=$(relative_path "$sm_path") && sm_path=$(git submodule--helper relative-path "$sm_path" "$wt_prefix") &&
# we make $path available to scripts ... # we make $path available to scripts ...
path=$sm_path && path=$sm_path &&
if test $# -eq 1 if test $# -eq 1
@ -465,7 +430,7 @@ cmd_deinit()
die_if_unmatched "$mode" die_if_unmatched "$mode"
name=$(git submodule--helper name "$sm_path") || exit name=$(git submodule--helper name "$sm_path") || exit
displaypath=$(relative_path "$sm_path") displaypath=$(git submodule--helper relative-path "$sm_path" "$wt_prefix")
# Remove the submodule work tree (unless the user already did it) # Remove the submodule work tree (unless the user already did it)
if test -d "$sm_path" if test -d "$sm_path"
@ -629,7 +594,7 @@ cmd_update()
fi fi
fi fi
displaypath=$(relative_path "$prefix$sm_path") displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
if test $just_cloned -eq 1 if test $just_cloned -eq 1
then then
@ -723,7 +688,7 @@ cmd_update()
if test -n "$recursive" if test -n "$recursive"
then then
( (
prefix=$(relative_path "$prefix$sm_path/") prefix=$(git submodule--helper relative-path "$prefix$sm_path/" "$wt_prefix")
wt_prefix= wt_prefix=
sanitize_submodule_env sanitize_submodule_env
cd "$sm_path" && cd "$sm_path" &&
@ -907,7 +872,7 @@ cmd_summary() {
! GIT_DIR="$name/.git" git-rev-parse -q --verify $sha1_dst^0 >/dev/null && ! GIT_DIR="$name/.git" git-rev-parse -q --verify $sha1_dst^0 >/dev/null &&
missing_dst=t missing_dst=t
display_name=$(relative_path "$name") display_name=$(git submodule--helper relative-path "$name" "$wt_prefix")
total_commits= total_commits=
case "$missing_src,$missing_dst" in case "$missing_src,$missing_dst" in
@ -1028,7 +993,7 @@ cmd_status()
die_if_unmatched "$mode" die_if_unmatched "$mode"
name=$(git submodule--helper name "$sm_path") || exit name=$(git submodule--helper name "$sm_path") || exit
url=$(git config submodule."$name".url) url=$(git config submodule."$name".url)
displaypath=$(relative_path "$prefix$sm_path") displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
if test "$stage" = U if test "$stage" = U
then then
say "U$sha1 $displaypath" say "U$sha1 $displaypath"
@ -1131,7 +1096,7 @@ cmd_sync()
if git config "submodule.$name.url" >/dev/null 2>/dev/null if git config "submodule.$name.url" >/dev/null 2>/dev/null
then then
displaypath=$(relative_path "$prefix$sm_path") displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
say "$(eval_gettext "Synchronizing submodule url for '\$displaypath'")" say "$(eval_gettext "Synchronizing submodule url for '\$displaypath'")"
git config submodule."$name".url "$super_config_url" git config submodule."$name".url "$super_config_url"