1#!/bin/bash
2
3# This script generates all GAPIC clients in this repo.
4# One-time setup:
5#   cd path/to/googleapis # https://github.com/googleapis/googleapis
6#   virtualenv env
7#   . env/bin/activate
8#   pip install googleapis-artman
9#   deactivate
10#
11# Regenerate:
12#   cd path/to/googleapis
13#   . env/bin/activate
14#   $GOPATH/src/cloud.google.com/go/regen-gapic.sh
15#   deactivate
16#
17# Being in googleapis directory is important;
18# that's where we find YAML files and where artman puts the "artman-genfiles" directory.
19#
20# NOTE: This script does not generate the "raw" gRPC client found in google.golang.org/genproto.
21# To do that, use the regen.sh script in the genproto repo instead.
22
23set -ex
24
25APIS=(
26google/api/expr/artman_cel.yaml
27google/iam/artman_iam_admin.yaml
28google/cloud/asset/artman_cloudasset_v1beta1.yaml
29google/cloud/asset/artman_cloudasset_v1.yaml
30google/iam/credentials/artman_iamcredentials_v1.yaml
31google/cloud/bigquery/datatransfer/artman_bigquerydatatransfer.yaml
32google/cloud/bigquery/storage/artman_bigquerystorage_v1beta1.yaml
33google/cloud/dataproc/artman_dataproc_v1.yaml
34google/cloud/dataproc/artman_dataproc_v1beta2.yaml
35google/cloud/dialogflow/artman_dialogflow_v2.yaml
36google/cloud/iot/artman_cloudiot.yaml
37google/cloud/irm/artman_irm_v1alpha2.yaml
38google/cloud/kms/artman_cloudkms.yaml
39google/cloud/language/artman_language_v1.yaml
40google/cloud/language/artman_language_v1beta2.yaml
41google/cloud/oslogin/artman_oslogin_v1.yaml
42google/cloud/oslogin/artman_oslogin_v1beta.yaml
43google/cloud/phishingprotection/artman_phishingprotection_v1beta1.yaml
44google/cloud/recaptchaenterprise/artman_recaptchaenterprise_v1beta1.yaml
45google/cloud/redis/artman_redis_v1beta1.yaml
46google/cloud/redis/artman_redis_v1.yaml
47google/cloud/scheduler/artman_cloudscheduler_v1beta1.yaml
48google/cloud/scheduler/artman_cloudscheduler_v1.yaml
49google/cloud/securitycenter/artman_securitycenter_v1beta1.yaml
50google/cloud/securitycenter/artman_securitycenter_v1.yaml
51google/cloud/speech/artman_speech_v1.yaml
52google/cloud/speech/artman_speech_v1p1beta1.yaml
53google/cloud/talent/artman_talent_v4beta1.yaml
54google/cloud/tasks/artman_cloudtasks_v2beta2.yaml
55google/cloud/tasks/artman_cloudtasks_v2beta3.yaml
56google/cloud/tasks/artman_cloudtasks_v2.yaml
57google/cloud/texttospeech/artman_texttospeech_v1.yaml
58google/cloud/videointelligence/artman_videointelligence_v1.yaml
59google/cloud/videointelligence/artman_videointelligence_v1beta1.yaml
60google/cloud/videointelligence/artman_videointelligence_v1beta2.yaml
61google/cloud/vision/artman_vision_v1.yaml
62google/cloud/vision/artman_vision_v1p1beta1.yaml
63google/cloud/webrisk/artman_webrisk_v1beta1.yaml
64google/devtools/artman_clouddebugger.yaml
65google/devtools/clouderrorreporting/artman_errorreporting.yaml
66google/devtools/cloudtrace/artman_cloudtrace_v1.yaml
67google/devtools/cloudtrace/artman_cloudtrace_v2.yaml
68google/devtools/containeranalysis/artman_containeranalysis_v1.yaml
69google/devtools/containeranalysis/artman_containeranalysis_v1beta1.yaml
70google/firestore/artman_firestore.yaml
71google/firestore/admin/artman_firestore_v1.yaml
72grafeas/artman_grafeas_v1.yaml
73google/logging/artman_logging.yaml
74google/longrunning/artman_longrunning.yaml
75google/monitoring/artman_monitoring.yaml
76google/privacy/dlp/artman_dlp_v2.yaml
77google/pubsub/artman_pubsub.yaml
78google/spanner/admin/database/artman_spanner_admin_database.yaml
79google/spanner/admin/instance/artman_spanner_admin_instance.yaml
80google/spanner/artman_spanner.yaml
81)
82
83for api in "${APIS[@]}"; do
84  rm -rf artman-genfiles/*
85  artman --config "$api" generate go_gapic
86  cp -r artman-genfiles/gapi-*/cloud.google.com/go/* $GOPATH/src/cloud.google.com/go/
87done
88
89microgen() {
90  input=$1
91  options="${@:2}"
92
93  # see https://github.com/googleapis/gapic-generator-go/blob/master/README.md#docker-wrapper for details
94  docker run \
95    --mount type=bind,source=$(pwd),destination=/conf,readonly \
96    --mount type=bind,source=$(pwd)/$input,destination=/in/$input,readonly \
97    --mount type=bind,source=$GOPATH/src,destination=/out \
98    --rm \
99    gcr.io/gapic-images/gapic-generator-go:latest \
100    $options
101}
102
103MICROAPIS=(
104  # input proto directory  |  gapic-generator-go flag  | gapic-service-config flag
105  # "google/cloud/language/v1 --go-gapic-package cloud.google.com/go/language/apiv1;language --gapic-service-config google/cloud/language/language_v1.yaml"
106)
107
108for api in "${MICROAPIS[@]}"; do
109  microgen $api
110done
111
112pushd $GOPATH/src/cloud.google.com/go/
113  gofmt -s -d -l -w . && goimports -w .
114
115  # NOTE(pongad): `sed -i` doesn't work on Macs, because -i option needs an argument.
116  # `-i ''` doesn't work on GNU, since the empty string is treated as a file name.
117  # So we just create the backup and delete it after.
118  ver=$(date +%Y%m%d)
119  git ls-files -mo | while read modified; do
120    dir=${modified%/*.*}
121    find . -path "*/$dir/doc.go" -exec sed -i.backup -e "s/^const versionClient.*/const versionClient = \"$ver\"/" '{}' +
122  done
123popd
124
125
126HASMANUAL=(
127errorreporting/apiv1beta1
128firestore/apiv1beta1
129firestore/apiv1
130logging/apiv2
131longrunning/autogen
132pubsub/apiv1
133spanner/apiv1
134trace/apiv1
135)
136for dir in "${HASMANUAL[@]}"; do
137	find "$GOPATH/src/cloud.google.com/go/$dir" -name '*.go' -exec sed -i.backup -e 's/setGoogleClientInfo/SetGoogleClientInfo/g' '{}' '+'
138done
139
140# These have manual edits and should not be auto-generated blindly. See jskeet@
141# for details.
142git checkout grafeas
143git checkout containeranalysis/v1
144
145find $GOPATH/src/cloud.google.com/go/ -name '*.backup' -delete
146