[devicelab] Delete run.dart
diff --git a/dev/devicelab/bin/run.dart b/dev/devicelab/bin/run.dart
deleted file mode 100644
index 26a9f26..0000000
--- a/dev/devicelab/bin/run.dart
+++ /dev/null
@@ -1,379 +0,0 @@
-// Copyright 2014 The Flutter 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:convert';
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:flutter_devicelab/framework/ab.dart';
-import 'package:flutter_devicelab/framework/manifest.dart';
-import 'package:flutter_devicelab/framework/runner.dart';
-import 'package:flutter_devicelab/framework/task_result.dart';
-import 'package:flutter_devicelab/framework/utils.dart';
-import 'package:path/path.dart' as path;
-
-ArgResults args;
-
-List<String> _taskNames = <String>[];
-
-/// The device-id to run test on.
-String deviceId;
-
-/// The git branch being tested on.
-String gitBranch;
-
-/// The build of the local engine to use.
-///
-/// Required for A/B test mode.
-String localEngine;
-
-/// The path to the engine "src/" directory.
-String localEngineSrcPath;
-
-/// Name of the LUCI builder this test is currently running on.
-///
-/// This is only passed on CI runs for Cocoon to be able to uniquely identify
-/// this test run.
-String luciBuilder;
-
-/// Whether to exit on first test failure.
-bool exitOnFirstTestFailure;
-
-/// Path to write test results to.
-String resultsPath;
-
-/// File containing a service account token.
-///
-/// If passed, the test run results will be uploaded to Flutter infrastructure.
-String serviceAccountTokenFile;
-
-/// Suppresses standard output, prints only standard error output.
-bool silent;
-
-/// Runs tasks.
-///
-/// The tasks are chosen depending on the command-line options
-/// (see [_argParser]).
-Future<void> main(List<String> rawArgs) async {
-  try {
-    args = _argParser.parse(rawArgs);
-  } on FormatException catch (error) {
-    stderr.writeln('${error.message}\n');
-    stderr.writeln('Usage:\n');
-    stderr.writeln(_argParser.usage);
-    exitCode = 1;
-    return;
-  }
-
-  deviceId = args['device-id'] as String;
-  exitOnFirstTestFailure = args['exit'] as bool;
-  gitBranch = args['git-branch'] as String;
-  localEngine = args['local-engine'] as String;
-  localEngineSrcPath = args['local-engine-src-path'] as String;
-  luciBuilder = args['luci-builder'] as String;
-  resultsPath = args['results-file'] as String;
-  serviceAccountTokenFile = args['service-account-token-file'] as String;
-  silent = args['silent'] as bool;
-
-  if (!args.wasParsed('task')) {
-    if (args.wasParsed('stage') || args.wasParsed('all')) {
-      addTasks(
-        tasks: loadTaskManifest().tasks,
-        args: args,
-        taskNames: _taskNames,
-      );
-    }
-  }
-
-  if (args.wasParsed('list')) {
-    for (int i = 0; i < _taskNames.length; i++) {
-      print('${(i + 1).toString().padLeft(3)} - ${_taskNames[i]}');
-    }
-    exitCode = 0;
-    return;
-  }
-
-  if (_taskNames.isEmpty) {
-    stderr.writeln('Failed to find tasks to run based on supplied options.');
-    exitCode = 1;
-    return;
-  }
-
-  if (args.wasParsed('ab')) {
-    await _runABTest();
-  } else {
-    await runTasks(_taskNames,
-      silent: silent,
-      localEngine: localEngine,
-      localEngineSrcPath: localEngineSrcPath,
-      deviceId: deviceId,
-      exitOnFirstTestFailure: exitOnFirstTestFailure,
-      gitBranch: gitBranch,
-      luciBuilder: luciBuilder,
-      resultsPath: resultsPath,
-    );
-  }
-}
-
-Future<void> _runABTest() async {
-  final int runsPerTest = int.parse(args['ab'] as String);
-
-  if (_taskNames.length > 1) {
-    stderr.writeln('When running in A/B test mode exactly one task must be passed but got ${_taskNames.join(', ')}.\n');
-    stderr.writeln(_argParser.usage);
-    exit(1);
-  }
-
-  if (!args.wasParsed('local-engine')) {
-    stderr.writeln('When running in A/B test mode --local-engine is required.\n');
-    stderr.writeln(_argParser.usage);
-    exit(1);
-  }
-
-  final String taskName = _taskNames.single;
-
-  print('$taskName A/B test. Will run $runsPerTest times.');
-
-  final ABTest abTest = ABTest(localEngine, taskName);
-  for (int i = 1; i <= runsPerTest; i++) {
-    section('Run #$i');
-
-    print('Running with the default engine (A)');
-    final TaskResult defaultEngineResult = await runTask(
-      taskName,
-      silent: silent,
-      deviceId: deviceId,
-    );
-
-    print('Default engine result:');
-    print(const JsonEncoder.withIndent('  ').convert(defaultEngineResult));
-
-    if (!defaultEngineResult.succeeded) {
-      stderr.writeln('Task failed on the default engine.');
-      exit(1);
-    }
-
-    abTest.addAResult(defaultEngineResult);
-
-    print('Running with the local engine (B)');
-    final TaskResult localEngineResult = await runTask(
-      taskName,
-      silent: silent,
-      localEngine: localEngine,
-      localEngineSrcPath: localEngineSrcPath,
-      deviceId: deviceId,
-    );
-
-    print('Task localEngineResult:');
-    print(const JsonEncoder.withIndent('  ').convert(localEngineResult));
-
-    if (!localEngineResult.succeeded) {
-      stderr.writeln('Task failed on the local engine.');
-      exit(1);
-    }
-
-    abTest.addBResult(localEngineResult);
-
-    if (!silent && i < runsPerTest) {
-      section('A/B results so far');
-      print(abTest.printSummary());
-    }
-  }
-  abTest.finalize();
-
-  final File jsonFile = _uniqueFile(args['ab-result-file'] as String ?? 'ABresults#.json');
-  jsonFile.writeAsString(const JsonEncoder.withIndent('  ').convert(abTest.jsonMap));
-
-  if (!silent) {
-    section('Raw results');
-    print(abTest.rawResults());
-  }
-
-  section('Final A/B results');
-  print(abTest.printSummary());
-
-  print('');
-  print('Results saved to ${jsonFile.path}');
-}
-
-File _uniqueFile(String filenameTemplate) {
-  final List<String> parts = filenameTemplate.split('#');
-  if (parts.length != 2) {
-    return File(filenameTemplate);
-  }
-  File file = File(parts[0] + parts[1]);
-  int i = 1;
-  while (file.existsSync()) {
-    file = File(parts[0] + i.toString() + parts[1]);
-    i++;
-  }
-  return file;
-}
-
-void addTasks({
-  List<ManifestTask> tasks,
-  ArgResults args,
-  List<String> taskNames,
-}) {
-  if (args.wasParsed('continue-from')) {
-    final int index = tasks.indexWhere((ManifestTask task) => task.name == args['continue-from']);
-    if (index == -1) {
-      throw Exception('Invalid task name "${args['continue-from']}"');
-    }
-    tasks.removeRange(0, index);
-  }
-  // Only start skipping if user specified a task to continue from
-  final String stage = args['stage'] as String;
-  for (final ManifestTask task in tasks) {
-    final bool isQualifyingStage = stage == null || task.stage == stage;
-    final bool isQualifyingHost = !(args['match-host-platform'] as bool) || task.isSupportedByHost();
-    if (isQualifyingHost && isQualifyingStage) {
-      taskNames.add(task.name);
-    }
-  }
-}
-
-/// Command-line options for the `run.dart` command.
-final ArgParser _argParser = ArgParser()
-  ..addMultiOption(
-    'task',
-    abbr: 't',
-    splitCommas: true,
-    help: 'Either:\n'
-        ' - the name of a task defined in manifest.yaml.\n'
-        '   Example: complex_layout__start_up.\n'
-        ' - the path to a Dart file corresponding to a task,\n'
-        '   which resides in bin/tasks.\n'
-        '   Example: bin/tasks/complex_layout__start_up.dart.\n'
-        '\n'
-        'This option may be repeated to specify multiple tasks.',
-    callback: (List<String> value) {
-      for (final String nameOrPath in value) {
-        final List<String> fragments = path.split(nameOrPath);
-        final bool isDartFile = fragments.last.endsWith('.dart');
-
-        if (fragments.length == 1 && !isDartFile) {
-          // Not a path
-          _taskNames.add(nameOrPath);
-        } else if (!isDartFile || !path.equals(path.dirname(nameOrPath), path.join('bin', 'tasks'))) {
-          // Unsupported executable location
-          throw FormatException('Invalid value for option -t (--task): $nameOrPath');
-        } else {
-          _taskNames.add(path.withoutExtension(fragments.last));
-        }
-      }
-    },
-  )
-  ..addOption(
-    'device-id',
-    abbr: 'd',
-    help: 'Target device id (prefixes are allowed, names are not supported).\n'
-          'The option will be ignored if the test target does not run on a\n'
-          'mobile device. This still respects the device operating system\n'
-          'settings in the test case, and will results in error if no device\n'
-          'with given ID/ID prefix is found.',
-  )
-  ..addOption(
-    'ab',
-    help: 'Runs an A/B test comparing the default engine with the local\n'
-          'engine build for one task. This option does not support running\n'
-          'multiple tasks. The value is the number of times to run the task.\n'
-          'The task is expected to be a benchmark that reports score keys.\n'
-          'The A/B test collects the metrics collected by the test and\n'
-          'produces a report containing averages, noise, and the speed-up\n'
-          'between the two engines. --local-engine is required when running\n'
-          'an A/B test.',
-    callback: (String value) {
-      if (value != null && int.tryParse(value) == null) {
-        throw ArgParserException('Option --ab must be a number, but was "$value".');
-      }
-    },
-  )
-  ..addOption(
-    'ab-result-file',
-    help: 'The filename in which to place the json encoded results of an A/B test.\n'
-          'The filename may contain a single # character to be replaced by a sequence\n'
-          'number if the name already exists.',
-  )
-  ..addFlag(
-    'all',
-    abbr: 'a',
-    help: 'Runs all tasks defined in manifest.yaml in alphabetical order.',
-  )
-  ..addOption(
-    'continue-from',
-    abbr: 'c',
-    help: 'With --all or --stage, continue from the given test.',
-  )
-  ..addFlag(
-    'exit',
-    defaultsTo: true,
-    help: 'Exit on the first test failure.',
-  )
-  ..addOption(
-    'git-branch',
-    help: '[Flutter infrastructure] Git branch of the current commit. LUCI\n'
-          'checkouts run in detached HEAD state, so the branch must be passed.',
-  )
-  ..addOption(
-    'local-engine',
-    help: 'Name of a build output within the engine out directory, if you\n'
-          'are building Flutter locally. Use this to select a specific\n'
-          'version of the engine if you have built multiple engine targets.\n'
-          'This path is relative to --local-engine-src-path/out. This option\n'
-          'is required when running an A/B test (see the --ab option).',
-  )
-  ..addFlag(
-    'list',
-    abbr: 'l',
-    help: "Don't actually run the tasks, but list out the tasks that would\n"
-          'have been run, in the order they would have run.',
-  )
-  ..addOption(
-    'local-engine-src-path',
-    help: 'Path to your engine src directory, if you are building Flutter\n'
-          'locally. Defaults to \$FLUTTER_ENGINE if set, or tries to guess at\n'
-          'the location based on the value of the --flutter-root option.',
-  )
-  ..addOption('luci-builder', help: '[Flutter infrastructure] Name of the LUCI builder being run on.')
-  ..addFlag(
-    'match-host-platform',
-    defaultsTo: true,
-    help: 'Only run tests that match the host platform (e.g. do not run a\n'
-          'test with a `required_agent_capabilities` value of "mac/android"\n'
-          'on a windows host). Each test publishes its '
-          '`required_agent_capabilities`\nin the `manifest.yaml` file.',
-  )
-  ..addOption(
-    'results-file',
-    help: '[Flutter infrastructure] File path for test results. If passed with\n'
-          'task, will write test results to the file.'
-  )
-  ..addOption(
-    'service-account-token-file',
-    help: '[Flutter infrastructure] Authentication for uploading results.',
-  )
-  ..addOption(
-    'stage',
-    abbr: 's',
-    help: 'Name of the stage. Runs all tasks for that stage. The tasks and\n'
-          'their stages are read from manifest.yaml.',
-  )
-  ..addFlag(
-    'silent',
-    negatable: true,
-    defaultsTo: false,
-  )
-  ..addMultiOption(
-    'test',
-    hide: true,
-    splitCommas: true,
-    callback: (List<String> value) {
-      if (value.isNotEmpty) {
-        throw const FormatException(
-          'Invalid option --test. Did you mean --task (-t)?',
-        );
-      }
-    },
-  );