mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
Be gentler, for MacOS (#7684)
Turns out MacOS has a really low open files limit and so if you try to open EVERY FILE AT THE SAME TIME it falls over. This just opens the files one at a time, the way we used to back in the old days.
This commit is contained in:
parent
a4a1392c44
commit
f1cdf57053
@ -18,55 +18,21 @@ const double pythonCost = 3001.0; // six average SWE days, in dollars
|
|||||||
final RegExp todoPattern = new RegExp(r'(?://|#) *TODO');
|
final RegExp todoPattern = new RegExp(r'(?://|#) *TODO');
|
||||||
final RegExp ignorePattern = new RegExp(r'// *ignore:');
|
final RegExp ignorePattern = new RegExp(r'// *ignore:');
|
||||||
|
|
||||||
Stream<double> findCostsForFile(File file) {
|
Future<double> findCostsForFile(File file) async {
|
||||||
if (path.extension(file.path) == '.py')
|
if (path.extension(file.path) == '.py')
|
||||||
return new Stream<double>.fromIterable(<double>[pythonCost]);
|
return pythonCost;
|
||||||
if (path.extension(file.path) != '.dart' &&
|
if (path.extension(file.path) != '.dart' &&
|
||||||
path.extension(file.path) != '.yaml' &&
|
path.extension(file.path) != '.yaml' &&
|
||||||
path.extension(file.path) != '.sh')
|
path.extension(file.path) != '.sh')
|
||||||
return null;
|
return 0.0;
|
||||||
StreamController<double> result = new StreamController<double>();
|
double total = 0.0;
|
||||||
file.openRead().transform(UTF8.decoder).transform(const LineSplitter()).listen((String line) {
|
for (String line in await file.readAsLines()) {
|
||||||
if (line.contains(todoPattern))
|
if (line.contains(todoPattern))
|
||||||
result.add(todoCost);
|
total += todoCost;
|
||||||
if (line.contains(ignorePattern))
|
if (line.contains(ignorePattern))
|
||||||
result.add(ignoreCost);
|
total += ignoreCost;
|
||||||
}, onDone: () { result.close(); });
|
|
||||||
return result.stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
Stream<double> findCostsForDirectory(Directory directory, Set<String> gitFiles) {
|
|
||||||
StreamController<double> result = new StreamController<double>();
|
|
||||||
Set<StreamSubscription<dynamic>> subscriptions = new Set<StreamSubscription<dynamic>>();
|
|
||||||
|
|
||||||
void checkDone(StreamSubscription<dynamic> subscription, String path) {
|
|
||||||
subscriptions.remove(subscription);
|
|
||||||
if (subscriptions.isEmpty)
|
|
||||||
result.close();
|
|
||||||
}
|
}
|
||||||
|
return total;
|
||||||
StreamSubscription<FileSystemEntity> listSubscription;
|
|
||||||
subscriptions.add(listSubscription = directory.list(followLinks: false).listen((FileSystemEntity entity) {
|
|
||||||
String name = path.relative(entity.path, from: flutterDirectory.path);
|
|
||||||
if (gitFiles.contains(name)) {
|
|
||||||
if (entity is File) {
|
|
||||||
StreamSubscription<double> subscription;
|
|
||||||
subscription = findCostsForFile(entity)?.listen((double cost) {
|
|
||||||
result.add(cost);
|
|
||||||
}, onDone: () { checkDone(subscription, name); });
|
|
||||||
if (subscription != null)
|
|
||||||
subscriptions.add(subscription);
|
|
||||||
} else if (entity is Directory) {
|
|
||||||
StreamSubscription<double> subscription;
|
|
||||||
subscription = findCostsForDirectory(entity, gitFiles)?.listen((double cost) {
|
|
||||||
result.add(cost);
|
|
||||||
}, onDone: () { checkDone(subscription, name); });
|
|
||||||
if (subscription != null)
|
|
||||||
subscriptions.add(subscription);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, onDone: () { checkDone(listSubscription, directory.path); }));
|
|
||||||
return result.stream;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const String _kBenchmarkKey = 'technical_debt_in_dollars';
|
const String _kBenchmarkKey = 'technical_debt_in_dollars';
|
||||||
@ -78,21 +44,12 @@ Future<Null> main() async {
|
|||||||
<String>['ls-files', '--full-name', flutterDirectory.path],
|
<String>['ls-files', '--full-name', flutterDirectory.path],
|
||||||
workingDirectory: flutterDirectory.path,
|
workingDirectory: flutterDirectory.path,
|
||||||
);
|
);
|
||||||
Set<String> gitFiles = new Set<String>();
|
double total = 0.0;
|
||||||
await for (String entry in git.stdout.transform(UTF8.decoder).transform(const LineSplitter())) {
|
await for (String entry in git.stdout.transform(UTF8.decoder).transform(const LineSplitter()))
|
||||||
String subentry = '';
|
total += await findCostsForFile(new File(path.join(flutterDirectory.path, entry)));
|
||||||
for (String component in path.split(entry)) {
|
|
||||||
if (subentry.isNotEmpty)
|
|
||||||
subentry += path.separator;
|
|
||||||
subentry += component;
|
|
||||||
gitFiles.add(subentry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int gitExitCode = await git.exitCode;
|
int gitExitCode = await git.exitCode;
|
||||||
if (gitExitCode != 0)
|
if (gitExitCode != 0)
|
||||||
throw new Exception('git exit with unexpected error code $gitExitCode');
|
throw new Exception('git exit with unexpected error code $gitExitCode');
|
||||||
List<double> costs = await findCostsForDirectory(flutterDirectory, gitFiles).toList();
|
|
||||||
double total = costs.fold(0.0, (double total, double cost) => total + cost);
|
|
||||||
return new TaskResult.success(
|
return new TaskResult.success(
|
||||||
<String, dynamic>{_kBenchmarkKey: total},
|
<String, dynamic>{_kBenchmarkKey: total},
|
||||||
benchmarkScoreKeys: <String>[_kBenchmarkKey],
|
benchmarkScoreKeys: <String>[_kBenchmarkKey],
|
||||||
|
Loading…
Reference in New Issue
Block a user