#!/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`

exec \${bin}/sqoop ${applicationName} "\$@"
