Success with most tests, proceeding to more corner cases
This commit is contained in:
63
rdlink.sh
63
rdlink.sh
@@ -17,24 +17,67 @@ set -o pipefail
|
|||||||
LOG_LEVEL="${LOG_LEVEL:-1}" # 7 = debug -> 0 = emergency
|
LOG_LEVEL="${LOG_LEVEL:-1}" # 7 = debug -> 0 = emergency
|
||||||
|
|
||||||
rl::rdlink() {
|
rl::rdlink() {
|
||||||
local normalized=
|
local subject=
|
||||||
info "Processing... $@"
|
|
||||||
normalized="$(rl::normalize "${1:-}")"
|
|
||||||
rl::quicklink "${normalized}"
|
|
||||||
}
|
|
||||||
|
|
||||||
rl::canon() {
|
info "pwd: $(pwd)"
|
||||||
info "Canonicalize path... $@"
|
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() {
|
rl::quicklink() {
|
||||||
info "Quick rdlink... ${1:-}"
|
subject=
|
||||||
readlink "${1:-}" || printf "${1:-}\n"
|
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() {
|
rl::normalize() {
|
||||||
info "Normalizing... ${1:-}"
|
info "Normalizing... ${1:-}"
|
||||||
printf "${1:-}\n"
|
printf -- "${1:-}\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
rl::main() {
|
rl::main() {
|
||||||
|
Reference in New Issue
Block a user