[monorepo] Fix tech debt cost benchmark (#160609)
* delete null safety stuff since everything is migrated * Filter out engine subdirectory on listing of framework fies.
This commit is contained in:
parent
5491c8c146
commit
17c1b91037
@ -9,8 +9,6 @@ import 'package:flutter_devicelab/framework/framework.dart';
|
|||||||
import 'package:flutter_devicelab/framework/task_result.dart';
|
import 'package:flutter_devicelab/framework/task_result.dart';
|
||||||
import 'package:flutter_devicelab/framework/utils.dart';
|
import 'package:flutter_devicelab/framework/utils.dart';
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:path/path.dart' as path;
|
||||||
import 'package:pub_semver/pub_semver.dart';
|
|
||||||
import 'package:pubspec_parse/pubspec_parse.dart';
|
|
||||||
|
|
||||||
// the numbers below are prime, so that the totals don't seem round. :-)
|
// the numbers below are prime, so that the totals don't seem round. :-)
|
||||||
const double todoCost = 1009.0; // about two average SWE days, in dollars
|
const double todoCost = 1009.0; // about two average SWE days, in dollars
|
||||||
@ -22,8 +20,6 @@ const double ignoreForFileCost = 2477.0; // similar thinking as skipCost
|
|||||||
const double asDynamicCost = 2011.0; // a few days to refactor the code.
|
const double asDynamicCost = 2011.0; // a few days to refactor the code.
|
||||||
const double deprecationCost = 233.0; // a few hours to remove the old code.
|
const double deprecationCost = 233.0; // a few hours to remove the old code.
|
||||||
const double legacyDeprecationCost = 9973.0; // a couple of weeks.
|
const double legacyDeprecationCost = 9973.0; // a couple of weeks.
|
||||||
const double packageNullSafetyMigrationCost = 2017.0; // a few days to migrate package.
|
|
||||||
const double fileNullSafetyMigrationCost = 257.0; // a few hours to migrate file.
|
|
||||||
|
|
||||||
final RegExp todoPattern = RegExp(r'(?://|#) *TODO');
|
final RegExp todoPattern = RegExp(r'(?://|#) *TODO');
|
||||||
final RegExp ignorePattern = RegExp(r'// *ignore:');
|
final RegExp ignorePattern = RegExp(r'// *ignore:');
|
||||||
@ -32,9 +28,6 @@ final RegExp asDynamicPattern = RegExp(r'\bas dynamic\b');
|
|||||||
final RegExp deprecationPattern = RegExp(r'^ *@[dD]eprecated');
|
final RegExp deprecationPattern = RegExp(r'^ *@[dD]eprecated');
|
||||||
const Pattern globalsPattern = 'globals.';
|
const Pattern globalsPattern = 'globals.';
|
||||||
const String legacyDeprecationPattern = '// flutter_ignore: deprecation_syntax, https';
|
const String legacyDeprecationPattern = '// flutter_ignore: deprecation_syntax, https';
|
||||||
final RegExp dartVersionPattern = RegExp(r'// *@dart *= *(\d+).(\d+)');
|
|
||||||
|
|
||||||
final Version firstNullSafeDartVersion = Version(2, 12, 0);
|
|
||||||
|
|
||||||
Future<double> findCostsForFile(File file) async {
|
Future<double> findCostsForFile(File file) async {
|
||||||
if (path.extension(file.path) == '.py') {
|
if (path.extension(file.path) == '.py') {
|
||||||
@ -46,7 +39,6 @@ Future<double> findCostsForFile(File file) async {
|
|||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
final bool isTest = file.path.endsWith('_test.dart');
|
final bool isTest = file.path.endsWith('_test.dart');
|
||||||
final bool isDart = file.path.endsWith('.dart');
|
|
||||||
double total = 0.0;
|
double total = 0.0;
|
||||||
for (final String line in await file.readAsLines()) {
|
for (final String line in await file.readAsLines()) {
|
||||||
if (line.contains(todoPattern)) {
|
if (line.contains(todoPattern)) {
|
||||||
@ -70,38 +62,10 @@ Future<double> findCostsForFile(File file) async {
|
|||||||
if (isTest && line.contains('skip:') && !line.contains('[intended]')) {
|
if (isTest && line.contains('skip:') && !line.contains('[intended]')) {
|
||||||
total += skipCost;
|
total += skipCost;
|
||||||
}
|
}
|
||||||
if (isDart && isOptingOutOfNullSafety(line)) {
|
|
||||||
total += fileNullSafetyMigrationCost;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (path.basename(file.path) == 'pubspec.yaml' && !packageIsNullSafe(file)) {
|
|
||||||
total += packageNullSafetyMigrationCost;
|
|
||||||
}
|
}
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isOptingOutOfNullSafety(String line) {
|
|
||||||
final RegExpMatch? match = dartVersionPattern.firstMatch(line);
|
|
||||||
if (match == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
assert(match.groupCount == 2);
|
|
||||||
return Version(int.parse(match.group(1)!), int.parse(match.group(2)!), 0) <
|
|
||||||
firstNullSafeDartVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool packageIsNullSafe(File file) {
|
|
||||||
assert(path.basename(file.path) == 'pubspec.yaml');
|
|
||||||
final Pubspec pubspec = Pubspec.parse(file.readAsStringSync());
|
|
||||||
final VersionConstraint? constraint =
|
|
||||||
pubspec.environment == null ? null : pubspec.environment!['sdk'];
|
|
||||||
final bool hasConstraint = constraint != null && !constraint.isAny && !constraint.isEmpty;
|
|
||||||
return hasConstraint &&
|
|
||||||
constraint is VersionRange &&
|
|
||||||
constraint.min != null &&
|
|
||||||
Version(constraint.min!.major, constraint.min!.minor, 0) >= firstNullSafeDartVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<int> findGlobalsForFile(File file) async {
|
Future<int> findGlobalsForFile(File file) async {
|
||||||
if (path.extension(file.path) != '.dart') {
|
if (path.extension(file.path) != '.dart') {
|
||||||
return 0;
|
return 0;
|
||||||
@ -118,6 +82,8 @@ Future<int> findGlobalsForFile(File file) async {
|
|||||||
Future<double> findCostsForRepo() async {
|
Future<double> findCostsForRepo() async {
|
||||||
final Process git = await startProcess('git', <String>[
|
final Process git = await startProcess('git', <String>[
|
||||||
'ls-files',
|
'ls-files',
|
||||||
|
'--exclude',
|
||||||
|
'engine',
|
||||||
'--full-name',
|
'--full-name',
|
||||||
flutterDirectory.path,
|
flutterDirectory.path,
|
||||||
], workingDirectory: flutterDirectory.path);
|
], workingDirectory: flutterDirectory.path);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user