runtime: support symlinked translator installs

Signed-off-by: Hanlu Li <heuleehanlu@gmail.com>
This commit is contained in:
Hanlu Li 2026-08-04 19:47:03 +08:00 committed by Hanlu Li
parent ff70bc14b6
commit f7f5dcd0a8
2 changed files with 91 additions and 2 deletions

View File

@ -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

View File

@ -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=$?