Add commentary, fix broken relative symlink resolution

This commit is contained in:
Nero 2018-03-16 04:18:57 +00:00
parent 4e0af9dc0a
commit c089ff4a3a
1 changed files with 14 additions and 2 deletions

View File

@ -14,37 +14,49 @@ result=""
while [ -n "$left" ]; do
case "$left" in
*/*)
# Snip one path segment off $left
seg="${left%%/*}"
left="${left#*/}"
;;
*)
# Last path segment already
seg="$left"
left=""
;;
esac
case "$seg" in
.)
# /foo/a -> . will become /foo
result="${result%/*}"
continue
;;
..)
# /foo/bar/a -> .. will become /foo
result="${result%/*/*}"
continue
;;
esac
result="$result/$seg"
target="$(readlink "$result")"
case "$target" in
/*)
left="${target}"
# Absolute symlink. Resets buildup of $result
left="${target}/${left}"
result=""
;;
'')
# Readlink failed, its not a symlink
;;
*)
left="${left%/*}/${target}"
# Relative symlink: Keep $result, its the symlink base
left="${target}/${left}"
;;
esac
# Make sure $left never starts with a slash
left="${left#/}"
done