// Copyright 2016 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:args/args.dart'; import 'package:flutter_devicelab/framework/manifest.dart'; import 'package:flutter_devicelab/framework/runner.dart'; import 'package:flutter_devicelab/framework/utils.dart'; /// Runs tasks. /// /// The tasks are chosen depending on the command-line options /// (see [_argParser]). Future main(List rawArgs) async { ArgResults args; 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 null; } List taskNames = []; if (args.wasParsed('task')) { taskNames.addAll(args['task']); } else if (args.wasParsed('stage')) { String stageName = args['stage']; List tasks = loadTaskManifest().tasks; for (ManifestTask task in tasks) { if (task.stage == stageName) taskNames.add(task.name); } } else if (args.wasParsed('all')) { List tasks = loadTaskManifest().tasks; for (ManifestTask task in tasks) { taskNames.add(task.name); } } if (taskNames.isEmpty) { stderr.writeln('Failed to find tasks to run based on supplied options.'); exitCode = 1; return null; } bool silent = args['silent']; for (String taskName in taskNames) { section('Running task "$taskName"'); Map result = await runTask(taskName, silent: silent); if (!result['success']) exitCode = 1; print('Task result:'); print(new JsonEncoder.withIndent(' ').convert(result)); section('Finished task "$taskName"'); } } /// Command-line options for the `run.dart` command. final ArgParser _argParser = new ArgParser() ..addOption( 'task', abbr: 't', allowMultiple: true, splitCommas: true, help: 'Name of the task to run. This option may be repeated to ' 'specify multiple tasks. A task selected by name does not have to be ' 'defined in manifest.yaml. It only needs a Dart executable in bin/tasks.', ) ..addOption( 'stage', abbr: 's', help: 'Name of the stage. Runs all tasks for that stage. ' 'The tasks and their stages are read from manifest.yaml.', ) ..addOption( 'all', abbr: 'a', help: 'Runs all tasks defined in manifest.yaml.', ) ..addOption( 'test', hide: true, allowMultiple: true, splitCommas: true, callback: (List value) { if (value.isNotEmpty) { throw new FormatException( 'Invalid option --test. Did you mean --task (-t)?', ); } }, ) ..addFlag( 'silent', negatable: true, defaultsTo: false, );