runtime: support symlinked translator installs
Signed-off-by: Hanlu Li <heuleehanlu@gmail.com>
This commit is contained in:
parent
ff70bc14b6
commit
f7f5dcd0a8
|
|
@ -16,7 +16,27 @@ probe_translator()
|
|||
fi
|
||||
path=$translator_dir/$name
|
||||
|
||||
if [ ! -L "$path" ] && [ -f "$path" ] && [ -x "$path" ]; then
|
||||
if [ -L "$path" ]; then
|
||||
if ! resolved_path=$(readlink -f -- "$path" 2>/dev/null); then
|
||||
echo unknown
|
||||
return
|
||||
fi
|
||||
case "$translator_root" in
|
||||
/|'') ;;
|
||||
*)
|
||||
case "$resolved_path" in
|
||||
"$translator_root"|"$translator_root"/*) ;;
|
||||
*)
|
||||
echo unknown
|
||||
return
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
path=$resolved_path
|
||||
fi
|
||||
|
||||
if [ -f "$path" ] && [ -x "$path" ]; then
|
||||
echo present
|
||||
else
|
||||
echo missing
|
||||
|
|
@ -26,12 +46,29 @@ probe_translator()
|
|||
case "$#" in
|
||||
1)
|
||||
[ "$1" = status ] || usage
|
||||
if ! translator_dir=$(CDPATH= cd -P -- "$(dirname -- "$0")" \
|
||||
manager_path=$0
|
||||
case "$manager_path" in
|
||||
*/*) ;;
|
||||
*)
|
||||
if ! manager_path=$(command -v "$manager_path" 2>/dev/null); then
|
||||
echo 'latu-runtime-manager: cannot locate its executable' >&2
|
||||
exit 2
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
if [ -L "$manager_path" ]; then
|
||||
if ! manager_path=$(readlink -f -- "$manager_path" 2>/dev/null); then
|
||||
echo 'latu-runtime-manager: cannot resolve its executable' >&2
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
if ! translator_dir=$(CDPATH= cd -P -- "$(dirname -- "$manager_path")" \
|
||||
2>/dev/null && pwd); then
|
||||
echo 'latu-runtime-manager: cannot locate its installation directory' >&2
|
||||
exit 2
|
||||
fi
|
||||
translator_dir_status=known
|
||||
translator_root=
|
||||
;;
|
||||
3)
|
||||
[ "$1" = status ] || usage
|
||||
|
|
@ -44,6 +81,7 @@ case "$#" in
|
|||
|
||||
translator_dir=$root/usr/bin
|
||||
translator_dir_status=known
|
||||
translator_root=$root
|
||||
if resolved_dir=$(CDPATH= cd -P -- "$translator_dir" \
|
||||
2>/dev/null && pwd); then
|
||||
case "$root" in
|
||||
|
|
|
|||
|
|
@ -65,6 +65,8 @@ neither='translator_x86_64=missing
|
|||
translator_i386=missing'
|
||||
unknown='translator_x86_64=unknown
|
||||
translator_i386=unknown'
|
||||
x86_64_unknown='translator_x86_64=unknown
|
||||
translator_i386=missing'
|
||||
|
||||
root=$workdir/both
|
||||
install_translator "$root" latx-x86_64
|
||||
|
|
@ -101,6 +103,26 @@ run_status "$root"
|
|||
assert_status 0 "$status_code" 'non-executable files'
|
||||
assert_output "$neither" "$status_output" 'non-executable files'
|
||||
|
||||
root=$workdir/translator-symlink
|
||||
mkdir -p "$root/usr/libexec/latu" "$root/usr/bin"
|
||||
: > "$root/usr/libexec/latu/latx-x86_64"
|
||||
chmod +x "$root/usr/libexec/latu/latx-x86_64"
|
||||
ln -s ../libexec/latu/latx-x86_64 "$root/usr/bin/latx-x86_64"
|
||||
run_status "$root"
|
||||
assert_status 0 "$status_code" 'translator symlink inside root'
|
||||
assert_output "$x86_64_only" "$status_output" \
|
||||
'translator symlink inside root'
|
||||
|
||||
outside=$workdir/translator-outside
|
||||
root=$workdir/translator-symlink-escape
|
||||
install_translator "$outside" latx-x86_64
|
||||
mkdir -p "$root/usr/bin"
|
||||
ln -s "$outside/usr/bin/latx-x86_64" "$root/usr/bin/latx-x86_64"
|
||||
run_status "$root"
|
||||
assert_status 0 "$status_code" 'translator symlink escapes root'
|
||||
assert_output "$x86_64_unknown" "$status_output" \
|
||||
'translator symlink escapes root'
|
||||
|
||||
outside=$workdir/outside
|
||||
root=$workdir/symlink-escape
|
||||
install_translator "$outside" latx-x86_64
|
||||
|
|
@ -137,6 +159,35 @@ translator_i386='*) ;;
|
|||
*) fail 'default status output does not contain both translators' ;;
|
||||
esac
|
||||
|
||||
real_bin=$workdir/real-bin
|
||||
alias_bin=$workdir/alias-bin
|
||||
mkdir -p "$real_bin" "$alias_bin"
|
||||
cp "$manager" "$real_bin/latu-runtime-manager"
|
||||
: > "$real_bin/latx-x86_64"
|
||||
: > "$real_bin/latx-i386"
|
||||
chmod +x "$real_bin/latx-x86_64" "$real_bin/latx-i386"
|
||||
ln -s "$real_bin/latu-runtime-manager" "$alias_bin/latu-runtime-manager"
|
||||
set +e
|
||||
symlink_output=$("$alias_bin/latu-runtime-manager" status \
|
||||
2> "$workdir/symlink.stderr")
|
||||
symlink_status=$?
|
||||
set -e
|
||||
assert_status 0 "$symlink_status" 'manager invoked through symlink'
|
||||
assert_output "$both" "$symlink_output" 'manager invoked through symlink'
|
||||
|
||||
alternatives_bin=$workdir/alternatives-bin
|
||||
mkdir -p "$alternatives_bin"
|
||||
mv "$real_bin/latx-x86_64" "$alternatives_bin/latx-x86_64"
|
||||
ln -s "$alternatives_bin/latx-x86_64" "$real_bin/latx-x86_64"
|
||||
set +e
|
||||
alternatives_output=$("$real_bin/latu-runtime-manager" status \
|
||||
2> "$workdir/alternatives.stderr")
|
||||
alternatives_status=$?
|
||||
set -e
|
||||
assert_status 0 "$alternatives_status" 'translator installed via symlink'
|
||||
assert_output "$both" "$alternatives_output" \
|
||||
'translator installed via symlink'
|
||||
|
||||
set +e
|
||||
"$manager" doctor > "$workdir/usage.stdout" 2> "$workdir/usage.stderr"
|
||||
usage_status=$?
|
||||
|
|
|
|||
Loading…
Reference in New Issue