summaryrefslogtreecommitdiffhomepage
path: root/tools/go_branch.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tools/go_branch.sh')
-rwxr-xr-xtools/go_branch.sh45
1 files changed, 33 insertions, 12 deletions
diff --git a/tools/go_branch.sh b/tools/go_branch.sh
index e5c060024..100c4ae41 100755
--- a/tools/go_branch.sh
+++ b/tools/go_branch.sh
@@ -14,23 +14,30 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-set -xeo pipefail
+set -xeou 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")
+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 -r gopath_dir="$(pwd)/bazel-bin/gopath/src/${module}"
-if ! [ -d "${gopath_dir}" ]; then
+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 -r tmp_dir=$(mktemp -d)
+declare tmp_dir
+tmp_dir=$(mktemp -d)
+readonly tmp_dir
finish() {
cd # Leave tmp_dir.
rm -rf "${tmp_dir}"
@@ -38,21 +45,35 @@ finish() {
trap finish EXIT
# Record the current working commit.
-declare -r head=$(git describe --always)
+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 -r go_branch=$( \
+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
+
+declare commit
+commit=$(git rev-parse HEAD)
+readonly commit
+if [[ -n "$(git branch --contains="${commit}" go)" ]]; then
+ # The go branch already has the commit.
+ exit 0
+fi
# 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 repo_orig
+repo_orig="$(pwd)"
+readonly repo_orig
declare -r repo_new="${tmp_dir}/repository"
git clone . "${repo_new}"
cd "${repo_new}"
@@ -68,8 +89,8 @@ git checkout -b go "${go_branch}"
#
# 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}
+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.