@@ -97,20 +97,65 @@ func (rs *GSUtilCache) Download(ctx context.Context, dst cache.LocalCache, pkgs
9797 files []string
9898 dest string
9999 )
100+ type urlPair struct {
101+ gzURL string
102+ tarURL string
103+ }
104+
105+ // Create a list of all possible URLs
106+ var urls []string
107+ packageToURLMap := make (map [cache.Package ]urlPair )
100108 for _ , pkg := range pkgs {
101109 fn , exists := dst .Location (pkg )
102110 if exists {
103111 continue
104112 }
105-
113+ version , err := pkg .Version ()
114+ if err != nil {
115+ log .WithError (err ).WithField ("package" , pkg .FullName ()).Warn ("Failed to get version for package, skipping" )
116+ continue
117+ }
106118 if dest == "" {
107119 dest = filepath .Dir (fn )
108120 } else if dest != filepath .Dir (fn ) {
109121 return fmt .Errorf ("gsutil only supports one target folder, not %s and %s" , dest , filepath .Dir (fn ))
110122 }
111123
112- files = append (files , fmt .Sprintf ("gs://%s/%s" , rs .BucketName , filepath .Base (fn )))
124+ pair := urlPair {
125+ gzURL : fmt .Sprintf ("gs://%s/%s.tar.gz" , rs .BucketName , version ),
126+ tarURL : fmt .Sprintf ("gs://%s/%s.tar" , rs .BucketName , version ),
127+ }
128+ packageToURLMap [pkg ] = pair
129+ urls = append (urls , pair .gzURL , pair .tarURL )
130+ }
131+ if len (urls ) == 0 {
132+ return nil
133+ }
134+
135+ args := append ([]string {"stat" }, urls ... )
136+ cmd := exec .Command ("gsutil" , args ... )
137+
138+ var stdoutBuffer , stderrBuffer strings.Builder
139+ cmd .Stdout = & stdoutBuffer
140+ cmd .Stderr = & stderrBuffer
141+
142+ err := cmd .Run ()
143+ if err != nil && (! strings .Contains (stderrBuffer .String (), "No URLs matched" )) {
144+ log .Debugf ("gsutil stat returned non-zero exit code: [%v], stderr: [%v]" , err , stderrBuffer .String ())
145+ return fmt .Errorf ("failed to check if files exist in remote cache: %w" , err )
146+ }
147+
148+ existingURLs := parseGSUtilStatOutput (strings .NewReader (stdoutBuffer .String ()))
149+ for _ , urls := range packageToURLMap {
150+ if _ , exists := existingURLs [urls .gzURL ]; exists {
151+ files = append (files , urls .gzURL )
152+ continue
153+ }
154+ if _ , exists := existingURLs [urls .tarURL ]; exists {
155+ files = append (files , urls .tarURL )
156+ }
113157 }
158+
114159 return gsutilTransfer (dest , files )
115160}
116161
0 commit comments