From a53611ab3e4c9a4900de17a759bdc35cfe225af2 Mon Sep 17 00:00:00 2001 From: deads2k Date: Fri, 17 Feb 2017 08:47:58 -0500 Subject: [PATCH] add godep.json to staging repos --- hack/update-staging-godeps.sh | 104 +++++++++++++++++++++++++++++++++ hack/verify-staging-godeps.sh | 49 ++++++++++++++++ hack/verify-staging-imports.sh | 8 +-- staging/godeps-json-updater.go | 8 +-- 4 files changed, 158 insertions(+), 11 deletions(-) create mode 100755 hack/update-staging-godeps.sh create mode 100755 hack/verify-staging-godeps.sh diff --git a/hack/update-staging-godeps.sh b/hack/update-staging-godeps.sh new file mode 100755 index 00000000000..b999ad34eb6 --- /dev/null +++ b/hack/update-staging-godeps.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +# Copyright 2017 The Kubernetes Authors. +# +# Licensed 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. + +# updates the godeps.json file in the staging folders to allow clean vendoring +# based on kubernetes levels. +# TODO this does not address client-go, since it takes a different approach to vendoring +# TODO client-go should probably be made consistent + +set -o errexit +set -o nounset +set -o pipefail + + +KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. +source "${KUBE_ROOT}/hack/lib/init.sh" + +kube::golang::setup_env + +# keep the godep restore path reasonably stable to avoid unnecessary restores +godepRestoreDir=${TMPDIR:-/tmp/}/kube-godep-restore + +TARGET_DIR=${TARGET_DIR:-${KUBE_ROOT}/staging} +echo "working in ${TARGET_DIR}" + +ORIGINAL_GOPATH="${GOPATH}" + +SKIP_RESTORE=${SKIP_RESTORE:-} +if [ "${SKIP_RESTORE}" != "true" ]; then + echo "starting godep restore" + mkdir -p "${godepRestoreDir}" + + # add the vendor folder so that we don't redownload things during restore + GOPATH="${godepRestoreDir}:${KUBE_ROOT}/staging:${ORIGINAL_GOPATH}" + # restore from kubernetes godeps to ensure we get the correct levels + # you get errors about the staging repos not using a known version control system + godep restore > ${godepRestoreDir}/godep-restore.log + echo "finished godep restore" +fi + +echo "forcing fake godep folders to match the current state of master in tmp" +for stagingRepo in $(ls ${KUBE_ROOT}/staging/src/k8s.io); do + echo " creating ${stagingRepo}" + rm -rf ${godepRestoreDir}/src/k8s.io/${stagingRepo} + cp -a ${KUBE_ROOT}/staging/src/k8s.io/${stagingRepo} ${godepRestoreDir}/src/k8s.io + + # we need a git commit in the godep folder, otherwise godep won't save + pushd ${godepRestoreDir}/src/k8s.io/${stagingRepo} + git init > /dev/null + # we need this so later commands work, but nothing should ever actually include these commits + # these are local only, not global + git config user.email "you@example.com" + git config user.name "Your Name" + git add . > /dev/null + git commit -qm "fake commit" + popd +done + +function updateGodepManifest() { + local repo=${1} + + echo "starting ${repo} save" + mkdir -p ${TARGET_DIR}/src/k8s.io + # if target_dir isn't the same as source dir, you need copy + test "${KUBE_ROOT}/staging" = "${TARGET_DIR}" || cp -a ${KUBE_ROOT}/staging/src/${repo} ${TARGET_DIR}/src/k8s.io + # remove the current Godeps.json so we always rebuild it + rm -rf ${TARGET_DIR}/src/${repo}/Godeps + GOPATH="${godepRestoreDir}:${TARGET_DIR}" + pushd ${TARGET_DIR}/src/${repo} + godep save ./... + + # now remove all the go files. We'll re-run a restore, go get, godep save cycle in the sync scripts + # to get the commits for other staging k8s.io repos anyway, so we don't need the added files + rm -rf vendor + + echo "rewriting Godeps.json to remove commits that don't really exist because we haven't pushed the prereqs yet" + GOPATH="${ORIGINAL_GOPATH}" + go run "${KUBE_ROOT}/staging/godeps-json-updater.go" --godeps-file="${TARGET_DIR}/src/${repo}/Godeps/Godeps.json" --client-go-import-path="${repo}" + + popd + echo "finished ${repo} save" +} + +# move into staging and save the dependencies for everything in order +for stagingRepo in $(ls ${KUBE_ROOT}/staging/src/k8s.io); do + # we have to skip client-go because it does unusual manipulation of its godeps + if [ "${stagingRepo}" == "client-go" ]; then + continue + fi + + updateGodepManifest "k8s.io/${stagingRepo}" +done diff --git a/hack/verify-staging-godeps.sh b/hack/verify-staging-godeps.sh new file mode 100755 index 00000000000..2cfa1b91cab --- /dev/null +++ b/hack/verify-staging-godeps.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +# Copyright 2017 The Kubernetes Authors. +# +# Licensed 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. + +# TODO this does not address client-go, since it takes a different approach to vendoring +# TODO client-go should probably be made consistent + +set -o errexit +set -o nounset +set -o pipefail + + +KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. +source "${KUBE_ROOT}/hack/lib/init.sh" + + +TARGET_DIR=$(mktemp -d "${TMPDIR:-/tmp/}$(basename 0).XXXXXXXXXXXX") +# Register function to be called on EXIT to remove folder. +function cleanup { + SKIP_CLEANUP=${SKIP_CLEANUP:-} + if [ "${SKIP_CLEANUP}" != "true" ]; then + rm -rf "${TARGET_DIR}" + fi +} +trap cleanup EXIT + +TARGET_DIR=${TARGET_DIR} ${KUBE_ROOT}/hack/update-staging-godeps.sh + +# check each staging repo to make sure its Godeps.json is correct +for stagingRepo in $(ls ${KUBE_ROOT}/staging/src/k8s.io); do + # we have to skip client-go because it does unusual manipulation of its godeps + if [ "${stagingRepo}" == "client-go" ]; then + continue + fi + + diff --ignore-matching-lines='^\s*\"Comment\"' ${KUBE_ROOT}/staging/src/k8s.io/${stagingRepo}/Godeps/Godeps.json ${TARGET_DIR}/src/k8s.io/${stagingRepo}/Godeps/Godeps.json +done diff --git a/hack/verify-staging-imports.sh b/hack/verify-staging-imports.sh index 9edcc3d8c60..8a4671e307b 100755 --- a/hack/verify-staging-imports.sh +++ b/hack/verify-staging-imports.sh @@ -46,16 +46,16 @@ function print_forbidden_imports () { echo return 1 fi - local FORBIDDEN=$( + local TEST_FORBIDDEN=$( go list -f $'{{with $package := .ImportPath}}{{range $.TestImports}}{{$package}} imports {{.}}\n{{end}}{{end}}' ./vendor/k8s.io/${PACKAGE}/... | sed 's|^k8s.io/kubernetes/vendor/||;s| k8s.io/kubernetes/vendor/| |' | grep -v " k8s.io/${PACKAGE}" | grep -e "imports \(${RE}\)" ) - if [ -n "${FORBIDDEN}" ]; then - echo "${PACKAGE} has a forbidden dependency:" + if [ -n "${TEST_FORBIDDEN}" ]; then + echo "${PACKAGE} has a forbidden dependency in test code:" echo - echo "${FORBIDDEN}" | sed 's/^/ /' + echo "${TEST_FORBIDDEN}" | sed 's/^/ /' echo return 1 fi diff --git a/staging/godeps-json-updater.go b/staging/godeps-json-updater.go index 9b87dc93a47..d13aaf4f4d1 100644 --- a/staging/godeps-json-updater.go +++ b/staging/godeps-json-updater.go @@ -68,13 +68,7 @@ func main() { // removes the Deps whose ImportPath contains "k8s.io/kubernetes" i := 0 for _, dep := range g.Deps { - if strings.Contains(dep.ImportPath, "k8s.io/apimachinery") { - continue - } - if strings.Contains(dep.ImportPath, "k8s.io/kubernetes") { - continue - } - if strings.Contains(dep.ImportPath, "k8s.io/client-go") { + if strings.Contains(dep.ImportPath, "k8s.io/") { continue } g.Deps[i] = dep