in app/lib/scorecard/backend.dart [183:312]
Future<void> updateReportOnCard(
String packageName,
String packageVersion, {
PanaReport? panaReport,
DartdocReport? dartdocReport,
}) async {
final key = scoreCardKey(packageName, packageVersion);
final pAndPv = await _db.lookup([key.parent!, key.parent!.parent!]);
final version = pAndPv[0] as PackageVersion?;
final package = pAndPv[1] as Package?;
if (package == null || version == null) {
throw Exception('Unable to lookup $packageName $packageVersion.');
}
final status = PackageStatus.fromModels(package, version);
await db.withRetryTransaction(_db, (tx) async {
var scoreCard = await tx.lookupOrNull<ScoreCard>(key);
if (scoreCard == null) {
_logger.info('Creating new ScoreCard $packageName $packageVersion.');
scoreCard = ScoreCard.init(
packageName: packageName,
packageVersion: packageVersion,
packageCreated: package.created,
packageVersionCreated: version.created,
);
} else {
_logger.info('Updating ScoreCard $packageName $packageVersion.');
scoreCard.updated = clock.now().toUtc();
}
scoreCard.flags.clear();
if (package.isDiscontinued) {
scoreCard.addFlag(PackageFlags.isDiscontinued);
}
if (status.isLatestStable) {
scoreCard.addFlag(PackageFlags.isLatestStable);
}
if (status.isLegacy) {
scoreCard.addFlag(PackageFlags.isLegacy);
}
if (status.isObsolete) {
scoreCard.addFlag(PackageFlags.isObsolete);
}
if (version.pubspec!.usesFlutter) {
scoreCard.addFlag(PackageFlags.usesFlutter);
}
scoreCard.popularityScore = popularityStorage.lookup(packageName);
scoreCard.updateReports(
panaReport: panaReport,
dartdocReport: dartdocReport,
);
bool reportIsTooBig(String reportType, List<int>? bytes) {
if (bytes == null || bytes.isEmpty) return false;
final size = bytes.length;
if (size > _reportSizeDropThreshold) {
_logger.reportError(
'$reportType report exceeded size threshold ($size > $_reportSizeWarnThreshold)');
return true;
} else if (size > _reportSizeWarnThreshold) {
_logger.warning(
'$reportType report exceeded size threshold ($size > $_reportSizeWarnThreshold)');
}
return false;
}
if (panaReport != null &&
reportIsTooBig(ReportType.pana, scoreCard.panaReportJsonGz)) {
scoreCard.updateReports(
panaReport: PanaReport(
timestamp: clock.now().toUtc(),
panaRuntimeInfo: null,
reportStatus: ReportStatus.aborted,
derivedTags: <String>[],
allDependencies: <String>[],
licenseFile: null,
report: pana.Report(
sections: [
pana.ReportSection(
id: 'error',
title: 'Report exceeded size limit.',
grantedPoints: panaReport.report?.grantedPoints ?? 0,
maxPoints: panaReport.report?.maxPoints ?? 1,
status: pana.ReportStatus.partial,
summary: 'The `pana` report exceeded size limit. '
'A log about the issue has been filed, the site admins will address it soon.',
),
],
),
flags: <String>[],
urlProblems: <pana.UrlProblem>[],
),
);
}
if (dartdocReport != null &&
reportIsTooBig(ReportType.dartdoc, scoreCard.dartdocReportJsonGz)) {
scoreCard.updateReports(
dartdocReport: DartdocReport(
timestamp: dartdocReport.timestamp,
reportStatus: ReportStatus.aborted,
dartdocEntry: null,
documentationSection: pana.ReportSection(
id: pana.ReportSectionId.documentation,
title: pana.documentationSectionTitle,
grantedPoints:
dartdocReport.documentationSection?.grantedPoints ?? 0,
maxPoints: dartdocReport.documentationSection?.maxPoints ?? 10,
status: pana.ReportStatus.partial,
summary: 'The `dartdoc` report exceeded size limit. '
'A log about the issue has been filed, the site admins will address it soon.',
),
),
);
}
tx.insert(scoreCard);
});
final isLatest = package.latestVersion == version.version;
await Future.wait([
cache.scoreCardData(packageName, packageVersion).purge(),
cache.uiPackagePage(packageName, packageVersion).purge(),
if (isLatest) cache.uiPackagePage(packageName, null).purge(),
if (isLatest) cache.packageView(packageName).purge(),
]);
}