| // Copyright 2021 Google LLC |
| // |
| // 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. |
| |
| // +build !windows |
| |
| package main |
| |
| import ( |
| "context" |
| "io/ioutil" |
| "log" |
| "os" |
| "path/filepath" |
| |
| "cloud.google.com/go/internal/gapicgen/generator" |
| "golang.org/x/sync/errgroup" |
| "gopkg.in/src-d/go-git.v4" |
| ) |
| |
| type localConfig struct { |
| googleapisDir string |
| gocloudDir string |
| genprotoDir string |
| protoDir string |
| gapicToGenerate string |
| onlyGapics bool |
| } |
| |
| func genLocal(ctx context.Context, c localConfig) error { |
| log.Println("creating temp dir") |
| tmpDir, err := ioutil.TempDir("", "update-genproto") |
| if err != nil { |
| log.Fatal(err) |
| } |
| log.Printf("temp dir created at %s\n", tmpDir) |
| tmpGoogleapisDir := filepath.Join(tmpDir, "googleapis") |
| tmpGenprotoDir := filepath.Join(tmpDir, "genproto") |
| tmpGocloudDir := filepath.Join(tmpDir, "gocloud") |
| tmpProtoDir := filepath.Join(tmpDir, "proto") |
| |
| // Clone repositories if needed. |
| grp, _ := errgroup.WithContext(ctx) |
| gitShallowClone(grp, "https://github.com/googleapis/googleapis.git", c.googleapisDir, tmpGoogleapisDir) |
| gitShallowClone(grp, "https://github.com/googleapis/go-genproto", c.genprotoDir, tmpGenprotoDir) |
| gitShallowClone(grp, "https://github.com/googleapis/google-cloud-go", c.gocloudDir, tmpGocloudDir) |
| gitShallowClone(grp, "https://github.com/protocolbuffers/protobuf", c.protoDir, tmpProtoDir) |
| if err := grp.Wait(); err != nil { |
| log.Println(err) |
| } |
| |
| // Regen. |
| conf := &generator.Config{ |
| GoogleapisDir: deafultDir(tmpGoogleapisDir, c.googleapisDir), |
| GenprotoDir: deafultDir(tmpGenprotoDir, c.genprotoDir), |
| GapicDir: deafultDir(tmpGocloudDir, c.gocloudDir), |
| ProtoDir: deafultDir(tmpProtoDir, c.protoDir), |
| GapicToGenerate: c.gapicToGenerate, |
| OnlyGenerateGapic: c.onlyGapics, |
| LocalMode: true, |
| } |
| if _, err := generator.Generate(ctx, conf); err != nil { |
| log.Printf("Generator ran (and failed) in %s\n", tmpDir) |
| log.Fatal(err) |
| } |
| return nil |
| } |
| |
| // gitShallowClone clones a repository into the provided tmpDir if a dir has not |
| // been specified. |
| func gitShallowClone(eg *errgroup.Group, repo, dir, tmpDir string) { |
| if dir != "" { |
| return |
| } |
| eg.Go(func() error { |
| log.Printf("cloning %s\n", repo) |
| |
| _, err := git.PlainClone(tmpDir, false, &git.CloneOptions{ |
| URL: repo, |
| Progress: os.Stdout, |
| Depth: 1, |
| Tags: git.NoTags, |
| }) |
| return err |
| }) |
| } |
| |
| // deafultDir returns the default option if dir is not set. |
| func deafultDir(def, dir string) string { |
| if dir == "" { |
| return def |
| } |
| return dir |
| } |