Skip to content

Commit 2458c14

Browse files
authored
More integrity checks: pubspec and info entries. (#2116)
* More integrity checks: pubspec and info entries. * documentation
1 parent 09c4fd8 commit 2458c14

File tree

2 files changed

+80
-4
lines changed

2 files changed

+80
-4
lines changed

app/bin/tools/check_integrity.dart

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,12 @@ Future _checkPackage(Package p) async {
122122
_problems.add('Package(${p.name}) has invalid uploader: User($userId)');
123123
}
124124
}
125-
final versions = <Key>{};
125+
final versionKeys = <Key>{};
126+
final qualifiedVersionKeys = <QualifiedVersionKey>{};
126127
await for (PackageVersion pv
127128
in dbService.query<PackageVersion>(ancestorKey: p.key).run()) {
128-
versions.add(pv.key);
129+
versionKeys.add(pv.key);
130+
qualifiedVersionKeys.add(pv.qualifiedVersionKey);
129131
if (pv.uploader == null) {
130132
_problems
131133
.add('PackageVersion(${pv.package} ${pv.version}) has no uploader.');
@@ -139,15 +141,50 @@ Future _checkPackage(Package p) async {
139141
'PackageVersion(${pv.package} ${pv.version}) has invalid uploader: User(${pv.uploader})');
140142
}
141143
}
142-
if (p.latestVersionKey != null && !versions.contains(p.latestVersionKey)) {
144+
if (p.latestVersionKey != null && !versionKeys.contains(p.latestVersionKey)) {
143145
_problems.add(
144146
'Package(${p.name}) has missing latestVersionKey: ${p.latestVersionKey.id}');
145147
}
146148
if (p.latestDevVersionKey != null &&
147-
!versions.contains(p.latestDevVersionKey)) {
149+
!versionKeys.contains(p.latestDevVersionKey)) {
148150
_problems.add(
149151
'Package(${p.name}) has missing latestDevVersionKey: ${p.latestDevVersionKey.id}');
150152
}
153+
154+
// Checking if PackageVersionPubspec is referenced by a PackageVersion entity.
155+
final pvpQuery = dbService.query<PackageVersionPubspec>()
156+
..filter('package =', p.name);
157+
final pvpKeys = <QualifiedVersionKey>{};
158+
await for (PackageVersionPubspec pvp in pvpQuery.run()) {
159+
final key = pvp.qualifiedVersionKey;
160+
pvpKeys.add(key);
161+
if (!qualifiedVersionKeys.contains(key)) {
162+
_problems.add('PackageVersionPubspec($key) has no PackageVersion.');
163+
}
164+
}
165+
for (QualifiedVersionKey key in qualifiedVersionKeys) {
166+
if (!pvpKeys.contains(key)) {
167+
_problems.add('PackageVersion($key) has no PackageVersionPubspec.');
168+
}
169+
}
170+
171+
// Checking if PackageVersionInfo is referenced by a PackageVersion entity.
172+
final pviQuery = dbService.query<PackageVersionInfo>()
173+
..filter('package =', p.name);
174+
final pviKeys = <QualifiedVersionKey>{};
175+
await for (PackageVersionInfo pvi in pviQuery.run()) {
176+
final key = pvi.qualifiedVersionKey;
177+
pviKeys.add(key);
178+
if (!qualifiedVersionKeys.contains(key)) {
179+
_problems.add('PackageVersionInfo($key) has no PackageVersion.');
180+
}
181+
}
182+
for (QualifiedVersionKey key in qualifiedVersionKeys) {
183+
if (!pviKeys.contains(key)) {
184+
_problems.add('PackageVersion($key) has no PackageVersionInfo.');
185+
}
186+
}
187+
151188
_packageChecked++;
152189
if (_packageChecked % 200 == 0) {
153190
print(' .. $_packageChecked done (${p.name})');

app/lib/frontend/models.dart

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,14 @@ class PackageVersion extends db.ExpandoModel {
234234
issueTrackerUrl: pubspec.issueTracker,
235235
);
236236
}
237+
238+
QualifiedVersionKey get qualifiedVersionKey {
239+
return QualifiedVersionKey(
240+
namespace: '',
241+
package: package,
242+
version: version,
243+
);
244+
}
237245
}
238246

239247
/// An derived entity that holds only the `pubspec.yaml` content of [PackageVersion].
@@ -269,6 +277,14 @@ class PackageVersionPubspec extends db.ExpandoModel {
269277
qualifiedPackage = key.qualifiedPackage;
270278
version = key.version;
271279
}
280+
281+
QualifiedVersionKey get qualifiedVersionKey {
282+
return QualifiedVersionKey(
283+
namespace: namespace,
284+
package: package,
285+
version: version,
286+
);
287+
}
272288
}
273289

274290
/// An derived entity that holds derived/cleaned content of [PackageVersion].
@@ -343,6 +359,14 @@ class PackageVersionInfo extends db.ExpandoModel {
343359
qualifiedPackage = key.qualifiedPackage;
344360
version = key.version;
345361
}
362+
363+
QualifiedVersionKey get qualifiedVersionKey {
364+
return QualifiedVersionKey(
365+
namespace: namespace,
366+
package: package,
367+
version: version,
368+
);
369+
}
346370
}
347371

348372
/// An identifier to point to a specific [namespace], [package] and [version].
@@ -361,6 +385,21 @@ class QualifiedVersionKey {
361385
namespace == null || namespace.isEmpty ? package : '$namespace:$package';
362386

363387
String get qualifiedVersion => '$qualifiedPackage-$version';
388+
389+
@override
390+
bool operator ==(Object other) =>
391+
identical(this, other) ||
392+
other is QualifiedVersionKey &&
393+
runtimeType == other.runtimeType &&
394+
namespace == other.namespace &&
395+
package == other.package &&
396+
version == other.version;
397+
398+
@override
399+
int get hashCode => namespace.hashCode ^ package.hashCode ^ version.hashCode;
400+
401+
@override
402+
String toString() => qualifiedVersion;
364403
}
365404

366405
/// A secret value stored in Datastore, typically an access credential used by

0 commit comments

Comments
 (0)