import 'dart:io'; enum Platform { linux, win, mac } enum BuildType { compile, existing, none } void main(List args) { print("This tool will help to generate a custom try build and run, that one " "can use for testing on different platforms."); print(""); Platform builderPlatform = Platform.values[getIntegerStepInput( "Choose platform: (1) Linux, (2) Windows or (3) Mac") - 1]; BuildType buildType = BuildType.values[getIntegerStepInput("Do you want to: \n" "\t(1) Make a new build on the platform.\n" "\t(2) Use an existing build by using a file-set hash.\n" "\t(3) No build.") - 1]; String buildArgs = null; if (buildType == BuildType.compile) { buildArgs = getStepInput("Give the arguments to build.py, separate by " "' '"); } else if (buildType == BuildType.existing) { buildArgs = getStepInput("Input the fileset hash"); } var testCommands = []; var testCommandString = getStepInput("Write a command to execute after the " "build-step. Use ' ' to separate arguments. If you only wish to build, " "just press "); while (testCommandString.isNotEmpty) { if (builderPlatform == Platform.linux) { var useXvfb = getIntegerStepInput( "Should the command be wrapped by xvfb (i.e. is the runtime 'drt', " "'chrome' or 'ff')?: (0) No, (1) Yes"); if (useXvfb == 1) { testCommandString = "xvfb $testCommandString"; } } var testCommandRepeat = getIntegerStepInput("How many times would you like " "the command '${testCommandString}' to be invoked?"); testCommands.add(new TestCommand(testCommandString, testCommandRepeat)); testCommandString = getStepInput("Write an additional command to execute. " "Use ' ' to separate arguments. If no additional commands should be run" ", press "); } print("Run the following command in a branch with a CL that you would like to" " test:"); int commandIndex = 1; var allTestCommands = testCommands .expand((testCommand) => testCommand.toTryCommand(commandIndex++)); print("git cl try -B luci.dart.try -b ${getBuilderName(builderPlatform)} " "${getBuildProperties(buildType, buildArgs)}" "${allTestCommands.join(' ')}"); } String getBuilderName(Platform builderPlatform) { switch (builderPlatform) { case Platform.linux: return "cl-linux-try"; case Platform.win: return "cl-win-try"; case Platform.mac: return "cl-mac-try"; } return "cl-linux-try"; } String getBuildProperties(BuildType buildType, String buildArgs) { switch (buildType) { case BuildType.compile: return "-p try_build_args='\"$buildArgs\"' "; case BuildType.existing: return "-p parent_fileset='\"$buildArgs\"' "; case BuildType.none: return ""; } return ""; } class TestCommand { final String command; final int repeat; TestCommand(this.command, this.repeat); List toTryCommand(int index) { String commandSuffix = index.toString().padLeft(2, "0"); return [ "-p try_cmd_$commandSuffix='\"$command\"'", "-p try_cmd_${commandSuffix}_repeat='$repeat'" ]; } } String getStepInput(String information) { print("$information:"); var input = stdin.readLineSync(); print(""); return input; } int getIntegerStepInput(String information) { print("$information:"); var input = stdin.readLineSync(); var value = int.parse(input, onError: (source) => null); if (value == null) { print("Input could not be parsed as an integer."); return getIntegerStepInput(information); } print(""); return value; }