func downloadFolder()

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
}