95 lines
3.2 KiB
Bash
Executable File
95 lines
3.2 KiB
Bash
Executable File
#!/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 -eo pipefail
|
|
|
|
# Discovery the package name from the go.mod file.
|
|
declare -r module=$(cat go.mod | grep -E "^module" | cut -d' ' -f2)
|
|
declare -r origpwd=$(pwd)
|
|
declare -r othersrc=("go.mod" "go.sum" "AUTHORS" "LICENSE")
|
|
|
|
# Check that gopath has been built.
|
|
declare -r gopath_dir="$(pwd)/bazel-bin/gopath/src/${module}"
|
|
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 -r tmp_dir=$(mktemp -d)
|
|
finish() {
|
|
cd # Leave tmp_dir.
|
|
rm -rf "${tmp_dir}"
|
|
}
|
|
trap finish EXIT
|
|
|
|
# Record the current working commit.
|
|
declare -r head=$(git describe --always)
|
|
|
|
# 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.
|
|
declare -r go_branch=$(git show-ref --hash origin/go)
|
|
|
|
# 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 -r repo_orig="$(pwd)"
|
|
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}
|
|
|
|
# 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 <<EOF
|
|
# gVisor
|
|
|
|
This branch is a synthetic branch, containing only Go sources, that is
|
|
compatible with standard Go tools. See the `master` branch for authoritative
|
|
sources and tests.
|
|
EOF
|
|
|
|
# There are a few solitary files that can get left behind due to the way bazel
|
|
# constructs the gopath target. Note that we don't find all Go files here
|
|
# because they may correspond to unused templates, etc.
|
|
cp "${repo_orig}"/runsc/*.go runsc/
|
|
|
|
# Update the current working set and commit.
|
|
git add . && git commit -m "Merge ${head} (automated)"
|
|
|
|
# Push the branch back to the original repository.
|
|
git remote add orig "${repo_orig}" && git push -f orig go:go
|