#!/bin/bash -e # # This script rebuilds the generated code for the protocol buffers. # To run this you will need protoc and goprotobuf installed; # see https://github.com/golang/protobuf for instructions. # You also need Go and Git installed. PKG=google.golang.org/cloud/bigtable UPSTREAM=https://github.com/GoogleCloudPlatform/cloud-bigtable-client UPSTREAM_SUBDIR=bigtable-protos/src/main/proto function die() { echo 1>&2 $* exit 1 } # Sanity check that the right tools are accessible. for tool in go git protoc protoc-gen-go; do q=$(which $tool) || die "didn't find $tool" echo 1>&2 "$tool: $q" done tmpdir=$(mktemp -d -t regen-cbt.XXXXXX) trap 'rm -rf $tmpdir' EXIT echo -n 1>&2 "finding package dir... " pkgdir=$(go list -f '{{.Dir}}' $PKG) echo 1>&2 $pkgdir base=$(echo $pkgdir | sed "s,/$PKG\$,,") echo 1>&2 "base: $base" cd $base echo 1>&2 "fetching latest protos... " git clone -q $UPSTREAM $tmpdir # Pass 1: build mapping from upstream filename to our filename. declare -A filename_map for f in $(cd $PKG && find internal -name '*.proto'); do echo -n 1>&2 "looking for latest version of $f... " up=$(cd $tmpdir/$UPSTREAM_SUBDIR && find * -name $(basename $f)) echo 1>&2 $up if [ $(echo $up | wc -w) != "1" ]; then die "not exactly one match" fi filename_map[$up]=$f done # Pass 2: build sed script for fixing imports. import_fixes=$tmpdir/fix_imports.sed for up in "${!filename_map[@]}"; do f=${filename_map[$up]} echo >>$import_fixes "s,\"$up\",\"$PKG/$f\"," done cat $import_fixes | sed 's,^,### ,' 1>&2 # Pass 3: copy files, making necessary adjustments. for up in "${!filename_map[@]}"; do f=${filename_map[$up]} cat $tmpdir/$UPSTREAM_SUBDIR/$up | # Adjust proto imports. sed -f $import_fixes | # Drop the UndeleteCluster RPC method. It returns a google.longrunning.Operation. sed '/^ rpc UndeleteCluster(/,/^ }$/d' | # Drop annotations, long-running operations and timestamps. They aren't supported (yet). sed '/"google\/longrunning\/operations.proto"/d' | sed '/google.longrunning.Operation/d' | sed '/"google\/protobuf\/timestamp.proto"/d' | sed '/google\.protobuf\.Timestamp/d' | sed '/"google\/api\/annotations.proto"/d' | sed '/option.*google\.api\.http.*{.*};$/d' | cat > $PKG/$f done # Run protoc once per package. for dir in $(find $PKG/internal -name '*.proto' | xargs dirname | sort | uniq); do echo 1>&2 "* $dir" protoc --go_out=plugins=grpc:. $dir/*.proto done echo 1>&2 "All OK"