@@ -24,7 +24,9 @@ import (
2424 "strings"
2525
2626 "cloud.google.com/go/internal/gapicgen/execv"
27+ "cloud.google.com/go/internal/gapicgen/execv/gocmd"
2728 "cloud.google.com/go/internal/gapicgen/gensnippets"
29+ "cloud.google.com/go/internal/gapicgen/git"
2830 "gopkg.in/yaml.v2"
2931)
3032
@@ -37,10 +39,11 @@ type GapicGenerator struct {
3739 gapicToGenerate string
3840 regenOnly bool
3941 onlyGenerateGapic bool
42+ modifiedPkgs []string
4043}
4144
4245// NewGapicGenerator creates a GapicGenerator.
43- func NewGapicGenerator (c * Config ) * GapicGenerator {
46+ func NewGapicGenerator (c * Config , modifiedPkgs [] string ) * GapicGenerator {
4447 return & GapicGenerator {
4548 googleapisDir : c .GoogleapisDir ,
4649 protoDir : c .ProtoDir ,
@@ -49,6 +52,7 @@ func NewGapicGenerator(c *Config) *GapicGenerator {
4952 gapicToGenerate : c .GapicToGenerate ,
5053 regenOnly : c .RegenOnly ,
5154 onlyGenerateGapic : c .OnlyGenerateGapic ,
55+ modifiedPkgs : modifiedPkgs ,
5256 }
5357}
5458
@@ -72,6 +76,16 @@ func (g *GapicGenerator) Regen(ctx context.Context) error {
7276 return err
7377 }
7478
79+ // TODO(codyoss): Remove once https://github.com/googleapis/gapic-generator-go/pull/606
80+ // is released.
81+ if err := gocmd .Vet (g .googleCloudDir ); err != nil {
82+ return err
83+ }
84+
85+ if err := g .resetUnknownVersion (); err != nil {
86+ return err
87+ }
88+
7589 if g .regenOnly {
7690 return nil
7791 }
@@ -94,11 +108,11 @@ func (g *GapicGenerator) Regen(ctx context.Context) error {
94108 return err
95109 }
96110
97- if err := vet (g .googleCloudDir ); err != nil {
111+ if err := gocmd . Vet (g .googleCloudDir ); err != nil {
98112 return err
99113 }
100114
101- if err := build (g .googleCloudDir ); err != nil {
115+ if err := gocmd . Build (g .googleCloudDir ); err != nil {
102116 return err
103117 }
104118
@@ -124,33 +138,19 @@ func (g *GapicGenerator) regenSnippets(ctx context.Context) error {
124138 if err := replaceAllForSnippets (g .googleCloudDir , snippetDir ); err != nil {
125139 return err
126140 }
127- if err := goModTidy (snippetDir ); err != nil {
141+ if err := gocmd . ModTidy (snippetDir ); err != nil {
128142 return err
129143 }
130144 return nil
131145}
132146
133- func goModTidy (dir string ) error {
134- log .Printf ("[%s] running go mod tidy" , dir )
135- c := execv .Command ("go" , "mod" , "tidy" )
136- c .Dir = dir
137- c .Env = []string {
138- fmt .Sprintf ("PATH=%s" , os .Getenv ("PATH" )), // TODO(deklerk): Why do we need to do this? Doesn't seem to be necessary in other exec.Commands.
139- fmt .Sprintf ("HOME=%s" , os .Getenv ("HOME" )), // TODO(deklerk): Why do we need to do this? Doesn't seem to be necessary in other exec.Commands.
140- }
141- return c .Run ()
142- }
143-
144147func replaceAllForSnippets (googleCloudDir , snippetDir string ) error {
145148 return execv .ForEachMod (googleCloudDir , func (dir string ) error {
146149 if dir == snippetDir {
147150 return nil
148151 }
149152
150- // Get the module name in this dir.
151- modC := execv .Command ("go" , "list" , "-m" )
152- modC .Dir = dir
153- mod , err := modC .Output ()
153+ mod , err := gocmd .ListModName (dir )
154154 if err != nil {
155155 return err
156156 }
@@ -208,23 +208,60 @@ go mod edit -dropreplace "google.golang.org/genproto"
208208 return c .Run ()
209209}
210210
211+ // resetUnknownVersion resets doc.go files that have only had their version
212+ // changed to UNKNOWN by the generator.
213+ func (g * GapicGenerator ) resetUnknownVersion () error {
214+ files , err := git .FindModifiedFiles (g .googleCloudDir )
215+ if err != nil {
216+ return err
217+ }
218+
219+ for _ , file := range files {
220+ if ! strings .HasSuffix (file , "doc.go" ) {
221+ continue
222+ }
223+ diff , err := git .FileDiff (g .googleCloudDir , file )
224+ if err != nil {
225+ return err
226+ }
227+ // More than one diff, don't reset.
228+ if strings .Count (diff , "@@" ) != 2 {
229+ log .Println (diff )
230+ continue
231+ }
232+ // Not related to version, don't reset.
233+ if ! strings .Contains (diff , "+const versionClient = \" UNKNOWN\" " ) {
234+ continue
235+ }
236+
237+ if err := git .ResetFile (g .googleCloudDir , file ); err != nil {
238+ return err
239+ }
240+ }
241+ return nil
242+ }
243+
211244// setVersion updates the versionClient constant in all .go files. It may create
212245// .backup files on certain systems (darwin), and so should be followed by a
213246// clean-up of .backup files.
214247func (g * GapicGenerator ) setVersion () error {
248+ dirs , err := g .findModifiedDirs ()
249+ if err != nil {
250+ return err
251+ }
215252 log .Println ("updating client version" )
216- // TODO(deklerk): Migrate this all to Go instead of using bash.
217-
218- c := execv .Command ("bash" , "-c" , `
253+ for _ , dir := range dirs {
254+ c := execv .Command ("bash" , "-c" , `
219255ver=$(date +%Y%m%d)
220- git ls-files -mo | while read modified; do
221- dir=${modified%/*.*}
222- find . -path "*/$dir/doc.go" -exec sed -i.backup -e "s/^const versionClient.*/const versionClient = \"$ver\"/" '{}' +;
223- done
256+ find . -path "*/doc.go" -exec sed -i.backup -e "s/^const versionClient.*/const versionClient = \"$ver\"/" '{}' +;
224257find . -name '*.backup' -delete
225258` )
226- c .Dir = g .googleCloudDir
227- return c .Run ()
259+ c .Dir = dir
260+ if err := c .Run (); err != nil {
261+ return err
262+ }
263+ }
264+ return nil
228265}
229266
230267// microgen runs the microgenerator on a single microgen config.
@@ -501,3 +538,30 @@ func (g *GapicGenerator) parseAPIShortnames(confs []*microgenConfig, manualEntri
501538 }
502539 return shortnames , nil
503540}
541+
542+ func (g * GapicGenerator ) findModifiedDirs () ([]string , error ) {
543+ log .Println ("finding modifiled directories" )
544+ files , err := git .FindModifiedAndUntrackedFiles (g .googleCloudDir )
545+ if err != nil {
546+ return nil , err
547+ }
548+ dirs := map [string ]bool {}
549+ for _ , file := range files {
550+ dir := filepath .Dir (filepath .Join (g .googleCloudDir , file ))
551+ dirs [dir ] = true
552+ }
553+
554+ // Add modified dirs from genproto. Sometimes only a request struct will be
555+ // updated, in these cases we should still make modifications the
556+ // corresponding gapic directories.
557+ for _ , pkg := range g .modifiedPkgs {
558+ dir := filepath .Join (g .googleCloudDir , pkg )
559+ dirs [dir ] = true
560+ }
561+
562+ var dirList []string
563+ for dir := range dirs {
564+ dirList = append (dirList , dir )
565+ }
566+ return dirList , nil
567+ }
0 commit comments