From 16f5894ac53854b29074fe2bd35f17ceb692e26c Mon Sep 17 00:00:00 2001 From: Martin Winkler Date: Sun, 20 Mar 2022 03:19:36 +0100 Subject: [PATCH] Success with most tests, proceeding to more corner cases --- rdlink.sh | 63 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/rdlink.sh b/rdlink.sh index b4b6a58..29e60b7 100755 --- a/rdlink.sh +++ b/rdlink.sh @@ -17,24 +17,67 @@ set -o pipefail LOG_LEVEL="${LOG_LEVEL:-1}" # 7 = debug -> 0 = emergency rl::rdlink() { - local normalized= - info "Processing... $@" - normalized="$(rl::normalize "${1:-}")" - rl::quicklink "${normalized}" -} + local subject= -rl::canon() { - info "Canonicalize path... $@" + info "pwd: $(pwd)" + info "Processing... $@" + + subject="$(rl::normalize "${1:-}")" || true + # Follow multiple symlinks + while subject="$(rl::quicklink "${subject}")" ; do : ; done + subject="$(rl::canon "${subject}")" || true + + printf "${subject}\n" } rl::quicklink() { - info "Quick rdlink... ${1:-}" - readlink "${1:-}" || printf "${1:-}\n" + subject= + work= + + info "Quicklink... ${1:-}" + + # Check if current candidate is a symlink + if ! subject=$(readlink -- "${1:-}"); then + printf -- "${1:-}\n" + return 1 + fi + info " - symlink ${1} -> ${subject}" + + # relative target; append root + if [[ "${subject}" != "/"* ]]; then + work="$(rl::canon "$(dirname -- "${1:-}")")" + subject="${work}/${subject}" + info " - relative link resolved: ${subject}" + fi + + printf "${subject}\n" + return 0 +} + +rl::canon() { + local subject= + local work= + local bname= + + info "Canonicalize path... ${1:-}" + if work="$(cd "${1:-}" >/dev/null 2>&1 && pwd -P)" ; then + subject="${work}" + info " - directory: ${subject}" + elif work="$(cd "$(dirname -- "${1:-}")" >/dev/null 2>&1 && pwd -P)" ; then + bname="$(basename -- "${1:-}")" + subject="${work}${bname:+"/${bname}"}" + info " - parent: ${subject}" + else + info " - no hit" + subject="${1:-}" + fi + + printf "${subject}\n" } rl::normalize() { info "Normalizing... ${1:-}" - printf "${1:-}\n" + printf -- "${1:-}\n" } rl::main() {