| #!/bin/bash |
| # |
| # Copyright 2011 The Apache Software Foundation |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| |
| 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` |
| |
| source ${bin}/configure-sqoop "${bin}" |
| exec ${HADOOP_COMMON_HOME}/bin/hadoop org.apache.sqoop.Sqoop "$@" |