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

View File

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