@@ -8,6 +8,7 @@ import 'package:crypto/crypto.dart';
88import 'package:gcloud/storage.dart' ;
99import 'package:logging/logging.dart' ;
1010import 'package:meta/meta.dart' ;
11+ import 'package:pub_dev/package/api_export/exported_api.dart' ;
1112import '../shared/datastore.dart' ;
1213import '../shared/storage.dart' ;
1314import '../shared/utils.dart' ;
@@ -52,6 +53,38 @@ class TarballStorage {
5253 return await _canonicalBucket.tryInfo (objectName);
5354 }
5455
56+ /// Gets `gs:/<bucket>/<objectName>` for [package] and [version] in the
57+ /// canonical bucket.
58+ ///
59+ /// Returns the absolute objectName on the form created by
60+ /// [Bucket.absoluteObjectName] .
61+ String getCanonicalBucketAbsoluteObjectName (String package, String version) =>
62+ _canonicalBucket.absoluteObjectName (tarballObjectName (package, version));
63+
64+ /// Get map from `version` to [SourceObjectInfo] for each version of [package] in
65+ /// canonical bucket.
66+ Future <Map <String , SourceObjectInfo >> listVersionsInCanonicalBucket (
67+ String package,
68+ ) async {
69+ final prefix = _tarballObjectNamePackagePrefix (package);
70+ final items = await _canonicalBucket
71+ .list (
72+ prefix: prefix,
73+ delimiter: '' ,
74+ )
75+ .toList ();
76+ return Map .fromEntries (items.whereType <BucketObjectEntry >().map ((item) {
77+ final version = item.name.without (prefix: prefix, suffix: '.tar.gz' );
78+ return MapEntry (
79+ version,
80+ SourceObjectInfo .fromObjectInfo (
81+ _canonicalBucket,
82+ item,
83+ ),
84+ );
85+ }));
86+ }
87+
5588 /// Gets the object info of the archive file from the public bucket.
5689 Future <ObjectInfo ?> getPublicBucketArchiveInfo (
5790 String package, String version) async {
0 commit comments