#!/bin/bash # Copyright 2019 The gVisor 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. set -xeou pipefail # Discovery the package name from the go.mod file. declare module origpwd othersrc module=$(cat go.mod | grep -E "^module" | cut -d' ' -f2) origpwd=$(pwd) othersrc=("go.mod" "go.sum" "AUTHORS" "LICENSE") readonly module origpwd othersrc # Check that gopath has been built. declare gopath_dir gopath_dir="$(pwd)/bazel-bin/gopath/src/${module}" readonly gopath_dir if ! [[ -d "${gopath_dir}" ]]; then echo "No gopath directory found; build the :gopath target." >&2 exit 1 fi # Create a temporary working directory, and ensure that this directory and all # subdirectories are cleaned up upon exit. declare tmp_dir tmp_dir=$(mktemp -d) readonly tmp_dir finish() { cd / # Leave tmp_dir. rm -rf "${tmp_dir}" } trap finish EXIT # Record the current working commit. declare head head=$(git describe --always) readonly head # We expect to have an existing go branch that we will use as the basis for this # commit. That branch may be empty, but it must exist. We search for this branch # using the local branch, the "origin" branch, and other remotes, in order. git fetch --all declare go_branch go_branch=$( \ git show-ref --hash refs/heads/go || \ git show-ref --hash refs/remotes/origin/go || \ git show-ref --hash go | head -n 1 \ ) readonly go_branch # Clone the current repository to the temporary directory, and check out the # current go_branch directory. We move to the new repository for convenience. declare repo_orig repo_orig="$(pwd)" readonly repo_orig declare -r repo_new="${tmp_dir}/repository" git clone . "${repo_new}" cd "${repo_new}" # Setup the repository and checkout the branch. git config user.email "gvisor-bot@google.com" git config user.name "gVisor bot" git fetch origin "${go_branch}" git checkout -b go "${go_branch}" # Start working on a merge commit that combines the previous history with the # current history. Note that we don't actually want any changes yet. # # N.B. The git behavior changed at some point and the relevant flag was added # to allow for override, so try the only behavior first then pass the flag. git merge --no-commit --strategy ours "${head}" || \ git merge --allow-unrelated-histories --no-commit --strategy ours "${head}" # Normalize the permissions on the old branch. Note that they should be # normalized if constructed by this tool, but we do so before the rsync. find . -type f -exec chmod 0644 {} \; find . -type d -exec chmod 0755 {} \; # Sync the entire gopath_dir. rsync --recursive --verbose --delete --exclude .git -L "${gopath_dir}/" . # Add additional files. for file in "${othersrc[@]}"; do cp "${origpwd}"/"${file}" . done # Construct a new README.md. cat > README.md <