about summary refs log tree commit diff
path: root/rellns-sh
diff options
context:
space:
mode:
Diffstat (limited to 'rellns-sh')
-rwxr-xr-xrellns-sh59
1 files changed, 35 insertions, 24 deletions
diff --git a/rellns-sh b/rellns-sh
index abe758a997..4c4b431a52 100755
--- a/rellns-sh
+++ b/rellns-sh
@@ -22,33 +22,44 @@ if test $# -ne 2; then
   exit 1
 fi
 
-case $1 in
-/*)
-  # Make both paths absolute.
-  to=`echo $1 | sed 's%^/%%'`
+# A problem with this script is that we must be able to handle symbolic
+# links somewhere in the paths of either path.  To resolve symlinks we use
+# the `pwd' program.  But some `pwd' programs are no real programs but
+# instead aliases (defined by the user) or builtins (as in bash-2).  Both
+# kinds have in common that they might not give the correct result.  E.g.,
+# the builtin in bash-2 returns the path which was used to change to the
+# directory and not the real path.
+#
+# To prevent this problem we make sure the real `pwd' somewhere in the
+# path is used.  Currently there is only support for bash-2 available.
+# If other shells also have problems we have to add more code here.
+
+if test "$BASH_VERSINFO" = "2"; then
+  unalias pwd
+  unset pwd
+  enable -n pwd
+fi
 
-  if test -d $2; then
-    from=`echo $2 | sed 's%/*$%%'`
-  else
-    from=`echo $2 | sed 's%/*[^/]*$%%'`
-  fi
+# Make both paths absolute.
+if test -d $1; then
+  to=`cd $1 && pwd`
+else
+  temp=`echo $1 | sed 's%/*[^/]*$%%'`
+  to=`cd $temp && pwd`
+  to="$to/`echo $1 | sed 's%.*/\([^/][^/]*\)$%\1%'`"
+fi
+to=`echo $to | sed 's%^/%%'`
 
-  case "$from" in
-  /*) from=`echo $from | sed 's%^/*%%'` ;;
-  ?*) from=`cd $from && pwd | sed 's%^/%%'` ;;
-  *) from=`pwd | sed 's%^/%%'` ;;
-  esac
-  ;;
-*)
-  to=$1
+if test -d $2; then
+  from=`echo $2 | sed 's%/*$%%'`
+else
+  from=`echo $2 | sed 's%/*[^/]*$%%'`
+fi
 
-  if test -d $2; then
-    from=`echo $2 | sed 's%/*$%%'`
-  else
-    from=`echo $2 | sed 's%/*[^/]*$%%'`
-  fi
-  ;;
-esac
+if test -z "$from"; then
+  from=`pwd`;
+fi
+from=`cd $from && pwd | sed 's%^/%%'`
 
 while test -n "$to" && test -n "$from"; do
   preto=`echo $to | sed 's%^\([^/]*\)/.*%\1%'`