// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:flutter_devicelab/framework/framework.dart'; import 'package:flutter_devicelab/framework/utils.dart'; import 'package:path/path.dart' as path; // the numbers below are odd, so that the totals don't seem round. :-) const double todoCost = 1009.0; // about two average SWE days, in dollars const double ignoreCost = 2003.0; // four average SWE days, in dollars const double pythonCost = 3001.0; // six average SWE days, in dollars const double skipCost = 2473.0; // 20 hours: 5 to fix the issue we're ignoring, 15 to fix the bugs we missed because the test was off final RegExp todoPattern = new RegExp(r'(?://|#) *TODO'); final RegExp ignorePattern = new RegExp(r'// *ignore:'); Future<double> findCostsForFile(File file) async { if (path.extension(file.path) == '.py') return pythonCost; if (path.extension(file.path) != '.dart' && path.extension(file.path) != '.yaml' && path.extension(file.path) != '.sh') return 0.0; final bool isTest = file.path.endsWith('_test.dart'); double total = 0.0; for (String line in await file.readAsLines()) { if (line.contains(todoPattern)) total += todoCost; if (line.contains(ignorePattern)) total += ignoreCost; if (isTest && line.contains('skip:')) total += skipCost; } return total; } const String _kBenchmarkKey = 'technical_debt_in_dollars'; Future<Null> main() async { await task(() async { final Process git = await startProcess( 'git', <String>['ls-files', '--full-name', flutterDirectory.path], workingDirectory: flutterDirectory.path, ); double total = 0.0; await for (String entry in git.stdout.transform(UTF8.decoder).transform(const LineSplitter())) total += await findCostsForFile(new File(path.join(flutterDirectory.path, entry))); final int gitExitCode = await git.exitCode; if (gitExitCode != 0) throw new Exception('git exit with unexpected error code $gitExitCode'); return new TaskResult.success( <String, dynamic>{_kBenchmarkKey: total}, benchmarkScoreKeys: <String>[_kBenchmarkKey], ); }); }