Merge pull request #16788 from wojtek-t/fix_codecgen

Auto commit by PR queue bot
pull/6/head
k8s-merge-robot 2015-11-04 23:19:56 -08:00
commit ecb394a5e0
2 changed files with 93 additions and 10 deletions

View File

@ -23,7 +23,7 @@ source "${KUBE_ROOT}/hack/lib/init.sh"
kube::golang::setup_env
generated_files=$(
generated_files=($(
find . -not \( \
\( \
-wholename './output' \
@ -33,7 +33,7 @@ generated_files=$(
-o -wholename '*/third_party/*' \
-o -wholename '*/Godeps/*' \
\) -prune \
\) -name '*.generated.go')
\) -name '*.generated.go'))
# Build codecgen binary from Godeps.
function cleanup {
@ -41,6 +41,46 @@ function cleanup {
}
trap cleanup EXIT
# Sort all files in the dependency order.
number=${#generated_files[@]}
for (( i=0; i<number; i++ )); do
visited[${i}]=false
done
result=""
function depends {
file=${generated_files[$1]//\.generated\.go/.go}
deps=$(go list -f "{{.Deps}}" ${file} | tr "[" " " | tr "]" " ")
fullpath=$(readlink -f ${generated_files[$2]//\.generated\.go/.go})
candidate=$(dirname "${fullpath}")
result=false
for dep in ${deps}; do
if [[ ${candidate} = *${dep} ]]; then
result=true
fi
done
echo ${result}
}
function tsort {
visited[$1]=true
local j=0
for (( j=0; j<number; j++ )); do
if ! ${visited[${j}]}; then
if $(depends "$1" ${j}); then
tsort $j
fi
fi
done
result="${result} $1"
}
for (( i=0; i<number; i++ )); do
if ! ${visited[${i}]}; then
tsort ${i}
fi
done
index=(${result})
CODECGEN="${PWD}/codecgen_binary"
godep go build -o "${CODECGEN}" github.com/ugorji/go/codec/codecgen
@ -48,11 +88,13 @@ godep go build -o "${CODECGEN}" github.com/ugorji/go/codec/codecgen
# Thus (since all the files are completely auto-generated and
# not required for the code to be compilable, we first remove
# them and the regenerate them.
for generated_file in ${generated_files}; do
rm -f "${generated_file}"
for (( i=0; i < number; i++ )); do
rm -f "${generated_files[${i}]}"
done
for generated_file in ${generated_files}; do
# Generate files in the dependency order.
for current in "${index[@]}"; do
generated_file=${generated_files[${current}]}
initial_dir=${PWD}
file=${generated_file//\.generated\.go/.go}
# codecgen work only if invoked from directory where the file
@ -67,5 +109,6 @@ for generated_file in ${generated_files}; do
sed 's/YEAR/2015/' "${initial_dir}/hack/boilerplate/boilerplate.go.txt" > "${base_generated_file}.tmp"
cat "${base_generated_file}" >> "${base_generated_file}.tmp"
mv "${base_generated_file}.tmp" "${base_generated_file}"
echo "${generated_file} is regenerated."
popd > /dev/null
done

View File

@ -23,9 +23,7 @@ source "${KUBE_ROOT}/hack/lib/init.sh"
kube::golang::setup_env
cd "${KUBE_ROOT}"
generated_files=$(
generated_files=($(
find . -not \( \
\( \
-wholename './output' \
@ -35,7 +33,7 @@ generated_files=$(
-o -wholename '*/third_party/*' \
-o -wholename '*/Godeps/*' \
\) -prune \
\) -name '*.generated.go')
\) -name '*.generated.go'))
# create a nice clean place to put codecgen there
_tmpdir="$(mktemp -d -t codecgen.XXXXXX)"
@ -45,6 +43,46 @@ function cleanup {
}
trap cleanup EXIT
# Sort all files in the dependency order.
number=${#generated_files[@]}
for (( i=0; i<number; i++ )); do
visited[${i}]=false
done
result=""
function depends {
file=${generated_files[$1]//\.generated\.go/.go}
deps=$(go list -f "{{.Deps}}" ${file} | tr "[" " " | tr "]" " ")
fullpath=$(readlink -f ${generated_files[$2]//\.generated\.go/.go})
candidate=$(dirname "${fullpath}")
result=false
for dep in ${deps}; do
if [[ ${candidate} = *${dep} ]]; then
result=true
fi
done
echo ${result}
}
function tsort {
visited[$1]=true
local j=0
for (( j=0; j<number; j++ )); do
if ! ${visited[${j}]}; then
if $(depends "$1" ${j}); then
tsort $j
fi
fi
done
result="${result} $1"
}
for (( i=0; i<number; i++ )); do
if ! ${visited[${i}]}; then
tsort ${i}
fi
done
index=(${result})
# Build codecgen from Godeps.
# However, we need to install godep first.
# We make some tricks with GOPATH variable to make it work with Travis.
@ -58,7 +96,9 @@ export GOPATH=${_gopath}
CODECGEN="${_tmpdir}/codecgen_binary"
${GODEP} go build -o "${CODECGEN}" github.com/ugorji/go/codec/codecgen
for generated_file in ${generated_files}; do
# Generate files in the dependency order.
for current in ${index[@]}; do
generated_file=${generated_files[${current}]}
initial_dir=${PWD}
file=${generated_file//\.generated\.go/.go}
# codecgen work only if invoked from directory where the file