mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Fix path munging funcs and usage
Our `realpath` and `readlink -f` functions (required only because of MacOS, thanks Steve) were poor substitutes at best. Mostly they were downright broken. This thoroughly overhauls them and adds a test (in comments, since we don't seem to have shell tests). For all the interesting cases I could think of, the fakes act just like the real thing. Then use those and canonicalize KUBE_ROOT. In order to make recursive calls of our shell tool not additively grow `pwd` we have to essentially make the sourcing of init.sh idempotent.
This commit is contained in:
		@@ -26,11 +26,8 @@ DOCKER_HOST=${DOCKER_HOST:-""}
 | 
				
			|||||||
DOCKER_MACHINE_NAME=${DOCKER_MACHINE_NAME:-"kube-dev"}
 | 
					DOCKER_MACHINE_NAME=${DOCKER_MACHINE_NAME:-"kube-dev"}
 | 
				
			||||||
readonly DOCKER_MACHINE_DRIVER=${DOCKER_MACHINE_DRIVER:-"virtualbox --virtualbox-memory 4096 --virtualbox-cpu-count -1"}
 | 
					readonly DOCKER_MACHINE_DRIVER=${DOCKER_MACHINE_DRIVER:-"virtualbox --virtualbox-memory 4096 --virtualbox-cpu-count -1"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
KUBE_ROOT=$(dirname "${BASH_SOURCE}")/..
 | 
					# This will canonicalize the path
 | 
				
			||||||
cd "${KUBE_ROOT}"
 | 
					KUBE_ROOT=$(cd $(dirname "${BASH_SOURCE}")/.. && pwd -P)
 | 
				
			||||||
 | 
					 | 
				
			||||||
# This'll canonicalize the path
 | 
					 | 
				
			||||||
KUBE_ROOT=$PWD
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
source hack/lib/init.sh
 | 
					source hack/lib/init.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -309,7 +309,7 @@ kube::golang::setup_env() {
 | 
				
			|||||||
  # resultant binaries.  Go will not let us use GOBIN with `go install` and
 | 
					  # resultant binaries.  Go will not let us use GOBIN with `go install` and
 | 
				
			||||||
  # cross-compiling, and `go install -o <file>` only works for a single pkg.
 | 
					  # cross-compiling, and `go install -o <file>` only works for a single pkg.
 | 
				
			||||||
  local subdir
 | 
					  local subdir
 | 
				
			||||||
  subdir=$(pwd | sed "s|$KUBE_ROOT||")
 | 
					  subdir=$(kube::realpath . | sed "s|$KUBE_ROOT||")
 | 
				
			||||||
  cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}"
 | 
					  cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Unset GOBIN in case it already exists in the current session.
 | 
					  # Unset GOBIN in case it already exists in the current session.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,12 +19,7 @@ set -o nounset
 | 
				
			|||||||
set -o pipefail
 | 
					set -o pipefail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# The root of the build/dist directory
 | 
					# The root of the build/dist directory
 | 
				
			||||||
KUBE_ROOT=$(
 | 
					KUBE_ROOT=$(cd $(dirname "${BASH_SOURCE}")/../.. && pwd -P)
 | 
				
			||||||
  unset CDPATH
 | 
					 | 
				
			||||||
  kube_root=$(dirname "${BASH_SOURCE}")/../..
 | 
					 | 
				
			||||||
  cd "${kube_root}"
 | 
					 | 
				
			||||||
  pwd
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
KUBE_OUTPUT_SUBPATH="${KUBE_OUTPUT_SUBPATH:-_output/local}"
 | 
					KUBE_OUTPUT_SUBPATH="${KUBE_OUTPUT_SUBPATH:-_output/local}"
 | 
				
			||||||
KUBE_OUTPUT="${KUBE_ROOT}/${KUBE_OUTPUT_SUBPATH}"
 | 
					KUBE_OUTPUT="${KUBE_ROOT}/${KUBE_OUTPUT_SUBPATH}"
 | 
				
			||||||
@@ -44,15 +39,83 @@ KUBE_GIT_UPSTREAM="${KUBE_GIT_UPSTREAM:-upstream}"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
KUBE_OUTPUT_HOSTBIN="${KUBE_OUTPUT_BINPATH}/$(kube::util::host_platform)"
 | 
					KUBE_OUTPUT_HOSTBIN="${KUBE_OUTPUT_BINPATH}/$(kube::util::host_platform)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# emulates "readlink -f" which is not available on BSD (OS X).
 | 
					# This emulates "readlink -f" which is not available on MacOS X.
 | 
				
			||||||
function readlinkdashf {
 | 
					# Test:
 | 
				
			||||||
  path=$1
 | 
					# T=/tmp/$$.$RANDOM
 | 
				
			||||||
  # Follow links until there are no more links to follow.
 | 
					# mkdir $T
 | 
				
			||||||
  while readlink "$path"; do
 | 
					# touch $T/file
 | 
				
			||||||
    path="$(readlink $path)"
 | 
					# mkdir $T/dir
 | 
				
			||||||
  done
 | 
					# ln -s $T/file $T/linkfile
 | 
				
			||||||
  # Convert to canonical path.
 | 
					# ln -s $T/dir $T/linkdir
 | 
				
			||||||
  path=$(cd "$(dirname "${path}")" && pwd -P)
 | 
					# function testone() {
 | 
				
			||||||
  echo "$path"
 | 
					#   X=$(readlink -f $1 2>&1)
 | 
				
			||||||
 | 
					#   Y=$(kube::readlinkdashf $1 2>&1)
 | 
				
			||||||
 | 
					#   if [ "$X" != "$Y" ]; then
 | 
				
			||||||
 | 
					#     echo readlinkdashf $1: expected "$X", got "$Y"
 | 
				
			||||||
 | 
					#   fi
 | 
				
			||||||
 | 
					# }
 | 
				
			||||||
 | 
					# testone /
 | 
				
			||||||
 | 
					# testone /tmp
 | 
				
			||||||
 | 
					# testone $T
 | 
				
			||||||
 | 
					# testone $T/file
 | 
				
			||||||
 | 
					# testone $T/dir
 | 
				
			||||||
 | 
					# testone $T/linkfile
 | 
				
			||||||
 | 
					# testone $T/linkdir
 | 
				
			||||||
 | 
					# testone $T/nonexistant
 | 
				
			||||||
 | 
					# testone $T/linkdir/file
 | 
				
			||||||
 | 
					# testone $T/linkdir/dir
 | 
				
			||||||
 | 
					# testone $T/linkdir/linkfile
 | 
				
			||||||
 | 
					# testone $T/linkdir/linkdir
 | 
				
			||||||
 | 
					function kube::readlinkdashf {
 | 
				
			||||||
 | 
					  # run in a subshell for simpler 'cd'
 | 
				
			||||||
 | 
					  (
 | 
				
			||||||
 | 
					    if [[ -d "$1" ]]; then # This also catch symlinks to dirs.
 | 
				
			||||||
 | 
					      cd "$1"
 | 
				
			||||||
 | 
					      pwd -P
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      cd $(dirname "$1")
 | 
				
			||||||
 | 
					      local f
 | 
				
			||||||
 | 
					      f=$(basename "$1")
 | 
				
			||||||
 | 
					      if [[ -L "$f" ]]; then
 | 
				
			||||||
 | 
					        readlink "$f"
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        echo "$(pwd -P)/${f}"
 | 
				
			||||||
 | 
					      fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This emulates "realpath" which is not available on MacOS X
 | 
				
			||||||
 | 
					# Test:
 | 
				
			||||||
 | 
					# T=/tmp/$$.$RANDOM
 | 
				
			||||||
 | 
					# mkdir $T
 | 
				
			||||||
 | 
					# touch $T/file
 | 
				
			||||||
 | 
					# mkdir $T/dir
 | 
				
			||||||
 | 
					# ln -s $T/file $T/linkfile
 | 
				
			||||||
 | 
					# ln -s $T/dir $T/linkdir
 | 
				
			||||||
 | 
					# function testone() {
 | 
				
			||||||
 | 
					#   X=$(realpath $1 2>&1)
 | 
				
			||||||
 | 
					#   Y=$(kube::realpath $1 2>&1)
 | 
				
			||||||
 | 
					#   if [ "$X" != "$Y" ]; then
 | 
				
			||||||
 | 
					#     echo realpath $1: expected "$X", got "$Y"
 | 
				
			||||||
 | 
					#   fi
 | 
				
			||||||
 | 
					# }
 | 
				
			||||||
 | 
					# testone /
 | 
				
			||||||
 | 
					# testone /tmp
 | 
				
			||||||
 | 
					# testone $T
 | 
				
			||||||
 | 
					# testone $T/file
 | 
				
			||||||
 | 
					# testone $T/dir
 | 
				
			||||||
 | 
					# testone $T/linkfile
 | 
				
			||||||
 | 
					# testone $T/linkdir
 | 
				
			||||||
 | 
					# testone $T/nonexistant
 | 
				
			||||||
 | 
					# testone $T/linkdir/file
 | 
				
			||||||
 | 
					# testone $T/linkdir/dir
 | 
				
			||||||
 | 
					# testone $T/linkdir/linkfile
 | 
				
			||||||
 | 
					# testone $T/linkdir/linkdir
 | 
				
			||||||
 | 
					kube::realpath() {
 | 
				
			||||||
 | 
					  if [[ ! -e "$1" ]]; then
 | 
				
			||||||
 | 
					    echo "$1: No such file or directory" >&2
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  kube::readlinkdashf "$1"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,12 +18,6 @@ kube::util::sortable_date() {
 | 
				
			|||||||
  date "+%Y%m%d-%H%M%S"
 | 
					  date "+%Y%m%d-%H%M%S"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# this mimics the behavior of linux realpath which is not shipped by default with
 | 
					 | 
				
			||||||
# mac OS X
 | 
					 | 
				
			||||||
kube::util::realpath() {
 | 
					 | 
				
			||||||
  [[ $1 = /* ]] && echo "$1" | sed 's/\/$//' || echo "$PWD/${1#./}"  | sed 's/\/$//'
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
kube::util::wait_for_url() {
 | 
					kube::util::wait_for_url() {
 | 
				
			||||||
  local url=$1
 | 
					  local url=$1
 | 
				
			||||||
  local prefix=${2:-}
 | 
					  local prefix=${2:-}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user