in cmd/manager/main.go [476:531]
func downloadFolder(ctx context.Context, client *storage.Client, bucket, folder, dstDir string) error {
// Create the destination directory if it doesn't exist.
if err := os.MkdirAll(dstDir, 0755); err != nil {
return err
}
// List all objects in the folder.
query := &storage.Query{
Prefix: folder,
}
objs := client.Bucket(bucket).Objects(ctx, query)
// Download each object to the destination directory.
for {
obj, err := objs.Next()
if err == iterator.Done {
break
}
if err != nil {
return err
}
dstFile := filepath.Join(dstDir, obj.Name)
if strings.Contains(dstFile, "/sources/") {
continue
}
// Remote path might contain subfolders, create them locally too.
fileDstDir := filepath.Dir(dstFile)
if err := os.MkdirAll(fileDstDir, 0755); err != nil {
log.Printf("failed to create %s: %v", fileDstDir, err)
continue
}
file, err := os.Create(dstFile)
if err != nil {
log.Printf("failed to write %s: %v", dstFile, err)
continue
}
objReader, err := client.Bucket(bucket).Object(obj.Name).NewReader(ctx)
if err != nil {
log.Printf("failed to make reader for %s: %v", obj.Name, err)
continue
}
if _, err := io.Copy(file, objReader); err != nil {
log.Printf("failed to copy %s to disk: %v", obj.Name, err)
continue
}
if err := objReader.Close(); err != nil {
log.Printf("failed to close %s reader: %v", obj.Name, err)
continue
}
}
return nil
}