@@ -40,12 +40,13 @@ const (
40
40
)
41
41
42
42
var (
43
- apiToGenerate = flag .String ("api" , "*" , "The API ID to generate, like 'tasks:v1'. A value of '*' means all." )
44
- useCache = flag .Bool ("cache" , true , "Use cache of discovered Google API discovery documents." )
45
- genDir = flag .String ("gendir" , defaultGenDir (), "Directory to use to write out generated Go files" )
46
- build = flag .Bool ("build" , false , "Compile generated packages." )
47
- install = flag .Bool ("install" , false , "Install generated packages." )
48
- apisURL = flag .String ("discoveryurl" , googleDiscoveryURL , "URL to root discovery document" )
43
+ apiToGenerate = flag .String ("api" , "*" , "The API ID to generate, like 'tasks:v1'. A value of '*' means all." )
44
+ useCache = flag .Bool ("cache" , true , "Use cache of discovered Google API discovery documents." )
45
+ genDir = flag .String ("gendir" , defaultGenDir (), "Directory to use to write out generated Go files" )
46
+ build = flag .Bool ("build" , false , "Compile generated packages." )
47
+ install = flag .Bool ("install" , false , "Install generated packages." )
48
+ apisURL = flag .String ("discoveryurl" , googleDiscoveryURL , "URL to root discovery document" )
49
+ remoteCacheDir = flag .String ("remote_cache_dir" , os .Getenv ("REMOTE_CACHE_DIR" ), "Directory of remote cache index and schemas." )
49
50
50
51
publicOnly = flag .Bool ("publiconly" , true , "Only build public, released APIs. Only applicable for Google employees." )
51
52
@@ -159,7 +160,7 @@ func main() {
159
160
var (
160
161
apiIds = []string {}
161
162
matches = []* API {}
162
- errors = []error {}
163
+ errs = []error {}
163
164
)
164
165
for _ , api := range getAPIs () {
165
166
apiIds = append (apiIds , api .ID )
@@ -172,8 +173,8 @@ func main() {
172
173
if err == errOldRevision {
173
174
log .Printf ("Old revision found for %s, skipping generation" , api .ID )
174
175
continue
175
- } else if err != nil && err != errNoDoc {
176
- errors = append (errors , & generateError {api , err })
176
+ } else if err != nil && ! errors . Is ( err , errNoDoc ) {
177
+ errs = append (errs , & generateError {api , err })
177
178
continue
178
179
}
179
180
if * build && err == nil {
@@ -186,7 +187,7 @@ func main() {
186
187
args = append (args , api .Target ())
187
188
out , err := exec .Command ("go" , args ... ).CombinedOutput ()
188
189
if err != nil {
189
- errors = append (errors , & compileError {api , string (out )})
190
+ errs = append (errs , & compileError {api , string (out )})
190
191
}
191
192
}
192
193
}
@@ -195,9 +196,9 @@ func main() {
195
196
log .Fatalf ("No APIs matched %q; options are %v" , * apiToGenerate , apiIds )
196
197
}
197
198
198
- if len (errors ) > 0 {
199
- log .Printf ("%d API(s) failed to generate or compile:" , len (errors ))
200
- for _ , ce := range errors {
199
+ if len (errs ) > 0 {
200
+ log .Printf ("%d API(s) failed to generate or compile:" , len (errs ))
201
+ for _ , ce := range errs {
201
202
log .Println (ce .Error ())
202
203
}
203
204
os .Exit (1 )
@@ -241,6 +242,14 @@ func getAPIs() []*API {
241
242
log .Fatal (err )
242
243
}
243
244
source = apiListFile
245
+ } else if * remoteCacheDir != "" {
246
+ var err error
247
+ name := filepath .Join (* remoteCacheDir , "index.json" )
248
+ bytes , err = os .ReadFile (name )
249
+ if err != nil {
250
+ log .Fatal (err )
251
+ }
252
+ source = name
244
253
} else {
245
254
bytes = slurpURL (* apisURL )
246
255
if * publicOnly {
@@ -590,34 +599,52 @@ func (a *API) needsDataWrapper() bool {
590
599
return false
591
600
}
592
601
593
- func (a * API ) jsonBytes () []byte {
602
+ func (a * API ) jsonBytes () ( []byte , error ) {
594
603
if a .forceJSON == nil {
595
604
var slurp []byte
596
605
var err error
597
606
if * useCache {
598
607
slurp , err = os .ReadFile (a .JSONFile ())
599
608
if err != nil {
600
- log .Fatal (err )
609
+ return nil , err
610
+ }
611
+ } else if * remoteCacheDir != "" {
612
+ filename := fmt .Sprintf ("%s.%s.json" , a .Name , a .Version )
613
+ b , err := os .ReadFile (filepath .Join (* remoteCacheDir , filename ))
614
+ if err != nil {
615
+ return nil , fmt .Errorf ("%s: %w" , err , errNoDoc )
616
+ }
617
+
618
+ // Make sure that keys are sorted by re-marshalling.
619
+ d := make (map [string ]any )
620
+ json .Unmarshal (b , & d )
621
+ if err != nil {
622
+ return nil , err
623
+ }
624
+
625
+ slurp , err = json .MarshalIndent (d , "" , " " )
626
+ if err != nil {
627
+ return nil , err
601
628
}
602
629
} else {
603
630
slurp = slurpURL (a .DiscoveryURL ())
604
631
if slurp != nil {
605
632
// Make sure that keys are sorted by re-marshalling.
606
- d := make (map [string ]interface {} )
633
+ d := make (map [string ]any )
607
634
json .Unmarshal (slurp , & d )
608
635
if err != nil {
609
- log . Fatal ( err )
636
+ return nil , err
610
637
}
611
638
var err error
612
639
slurp , err = json .MarshalIndent (d , "" , " " )
613
640
if err != nil {
614
- log . Fatal ( err )
641
+ return nil , err
615
642
}
616
643
}
617
644
}
618
645
a .forceJSON = slurp
619
646
}
620
- return a .forceJSON
647
+ return a .forceJSON , nil
621
648
}
622
649
623
650
func (a * API ) JSONFile () string {
@@ -629,7 +656,10 @@ func (a *API) JSONFile() string {
629
656
// if the API spec file being pulled in is older than the local cache.
630
657
func (a * API ) WriteGeneratedCode () error {
631
658
genfilename := * output
632
- jsonBytes := a .jsonBytes ()
659
+ jsonBytes , err := a .jsonBytes ()
660
+ if err != nil {
661
+ return err
662
+ }
633
663
// Skip generation if we don't have the discovery doc.
634
664
if jsonBytes == nil {
635
665
// No message here, because slurpURL printed one.
@@ -729,8 +759,10 @@ var docsLink string
729
759
func (a * API ) GenerateCode () ([]byte , error ) {
730
760
pkg := a .Package ()
731
761
732
- jsonBytes := a .jsonBytes ()
733
- var err error
762
+ jsonBytes , err := a .jsonBytes ()
763
+ if err != nil {
764
+ return nil , err
765
+ }
734
766
if a .doc == nil {
735
767
a .doc , err = disco .NewDocument (jsonBytes )
736
768
if err != nil {
0 commit comments