SQOOP-2531: readlink -f not supported on OS X
(Stuart Williams via Jarek Jarcec Cecho)
diff --git a/src/scripts/tool-script.sh.template b/src/scripts/tool-script.sh.template
index 56b5a1a..94ac915 100644
--- a/src/scripts/tool-script.sh.template
+++ b/src/scripts/tool-script.sh.template
@@ -19,7 +19,81 @@
# specific language governing permissions and limitations
# under the License.
-prgm=`readlink -f $0`
+follow_one() {
+ # Resolve symlinks and relative path components along a path. This requires
+ # its argument to be an absolute path. This does not recursively re-resolve
+ # symlinks; if that is required, use the 'follow' method.
+
+ target=$1
+ OIFS=$IFS
+ IFS='/'
+
+ # Taking each dir component along the way, build up a new target directory,
+ # resolving '.', '..', and symlinks.
+ newtarget=''
+ for part in ${target}; do
+ if [ -z "${part}" ]; then
+ continue # Empty dir part. 'foo//bar'
+ elif [ "." == "${part}" ]; then
+ continue # Nothing special to do for '.'
+ elif [ ".." == "${part}" ]; then
+ IFS=$OIFS
+ newtarget=`dirname ${newtarget}` # pop a component.
+ elif [ -h "${newtarget}/${part}" ]; then
+ IFS=$OIFS
+ link=`readlink ${newtarget}/${part}`
+ # links can be relative or absolute. Relative ones get appended to
+ # newtarget; absolute ones replace it.
+ if [ "${link:0:1}" != "/" ]; then
+ newtarget="${newtarget}/${link}" # relative
+ else
+ newtarget="${link}" # absolute
+ fi
+ else # Regular file component.
+ newtarget="${newtarget}/${part}"
+ fi
+ IFS='/'
+ done
+
+ IFS=$OIFS
+ echo $newtarget
+}
+
+follow() {
+ # Portable 'readlink -f' function to follow a file's links to the final
+ # target. Calls follow_one recursively til we're finished tracing symlinks.
+
+ target=$1
+ depth=$2
+
+ if [ -z "$depth" ]; then
+ depth=0
+ elif [ "$depth" == "1000" ]; then
+ # Don't recurse indefinitely; we've probably hit a symlink cycle.
+ # Just bail out here.
+ echo $target
+ return 1
+ fi
+
+ # Canonicalize the target to be an absolute path.
+ targetdir=`dirname ${target}`
+ targetdir=`cd ${targetdir} && pwd`
+ target=${targetdir}/`basename ${target}`
+
+ # Use follow_one to resolve links. Test that we get the same result twice,
+ # to terminate iteration.
+ first=`follow_one ${target}`
+ second=`follow_one ${first}`
+ if [ "${first}" == "${second}" ]; then
+ # We're done.
+ echo "${second}"
+ else
+ # Need to continue resolving links.
+ echo `follow ${second} $(( $depth + 1 ))`
+ fi
+}
+
+prgm=`follow $0`
bin=`dirname ${prgm}`
bin=`cd ${bin} && pwd`