diff options
-rwxr-xr-x | tools/go_branch.sh | 45 |
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. |