in tool/extract_all_pub_dev.dart [32:105]
Future<void> main() async {
var alreadyDonePackages = <String>{};
var failures = <Map<String, dynamic>?>[];
if (fileExists(statusFilename)) {
final json = jsonDecode(readTextFile(statusFilename));
for (final packageName in json['packages'] ?? []) {
alreadyDonePackages.add(packageName);
}
for (final failure in json['failures'] ?? []) {
failures.add(failure);
}
}
print('Already processed ${alreadyDonePackages.length} packages');
print('Already found ${alreadyDonePackages.length}');
void writeStatus() {
writeTextFile(
statusFilename,
JsonEncoder.withIndent(' ').convert({
'packages': [...alreadyDonePackages],
'failures': [...failures],
}),
);
print('Wrote status to $statusFilename');
}
ProcessSignal.sigint.watch().listen((_) {
writeStatus();
exit(1);
});
final pool = Pool(10); // Process 10 packages at a time.
try {
for (final packageName in await allPackageNames()) {
if (alreadyDonePackages.contains(packageName)) {
print('Skipping $packageName - already done');
continue;
}
print('Processing all versions of $packageName '
'[+${alreadyDonePackages.length}, - ${failures.length}]');
final resource = await pool.request();
scheduleMicrotask(() async {
try {
final versions = await versionArchiveUrls(packageName);
var allVersionsGood = true;
await Future.wait(versions.map((archiveUrl) async {
await withTempDir((tempDir) async {
print('downloading $archiveUrl');
http.StreamedResponse response;
try {
response = await httpClient
.send(http.Request('GET', Uri.parse(archiveUrl)));
await extractTarGz(response.stream, tempDir);
print('Extracted $archiveUrl');
} catch (e, _) {
print('Failed to get and extract $archiveUrl $e');
failures.add({'archive': archiveUrl, 'error': e.toString()});
allVersionsGood = false;
return;
}
});
}));
if (allVersionsGood) alreadyDonePackages.add(packageName);
} finally {
resource.release();
}
});
}
} finally {
writeStatus();
exit(failures.isEmpty ? 0 : 1);
}
}