@@ -97,20 +97,65 @@ func (rs *GSUtilCache) Download(ctx context.Context, dst cache.LocalCache, pkgs
97
97
files []string
98
98
dest string
99
99
)
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 )
100
108
for _ , pkg := range pkgs {
101
109
fn , exists := dst .Location (pkg )
102
110
if exists {
103
111
continue
104
112
}
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
+ }
106
118
if dest == "" {
107
119
dest = filepath .Dir (fn )
108
120
} else if dest != filepath .Dir (fn ) {
109
121
return fmt .Errorf ("gsutil only supports one target folder, not %s and %s" , dest , filepath .Dir (fn ))
110
122
}
111
123
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
+ }
113
157
}
158
+
114
159
return gsutilTransfer (dest , files )
115
160
}
116
161
0 commit comments