anchor.diff:    final tmpdir = await Directory.systemTemp.createTemp("approve_results.");
     try {
       // The 'latest' file contains the name of the latest build that we
  -    // should download.
  -    final build = await readFile(bot, "latest");
  +    // should download. When preapproving a changelist, we instead find out
  +    // which build the commit queue was rebased on.
  +    final build = (changelistBuild != null
  +            ? await loadLog(changelistBuild["id"],
  +                "gsutil_find_latest_build/0/logs/raw_io.output_text_latest_/0")
  +            : await readFile(bot, "latest"))
  +        .trim();
   
       // Asynchronously download the latest build and the current approved
  -    // results.
  +    // results. Download try results from trybot try runs if preapproving.
  +    final tryResults = <String, Map<String, dynamic>>{};
       await Future.wait([
         cpRecursiveGsutil(buildCloudPath(bot, build), tmpdir.path),
         cpRecursiveGsutil(
             "$approvedResultsStoragePath/$bot/approved_results.json",
             "${tmpdir.path}/approved_results.json"),
  +      new Future(() async {
  +        if (changelistBuild != null) {
  +          tryResults.addAll(parseResultsMap(await loadLog(
  +              changelistBuild["id"], "test_results/0/logs/results.json/0")));
  +        }
  +      }),
       ]);
   
       // Check the build was properly downloaded.
  
positive.code:       abbr: "n",
        help: "Show changed results but don't approve.",
        negatable: false);
    parser.addFlag("verbose",
        abbr: "v", help: "Describe asynchronous operations.", negatable: false);
    parser.addFlag("yes",
        abbr: "y", help: "Approve the results.", negatable: false);
  
    final options = parser.parse(args);
    if ((options["bot"].isEmpty && !options["list"]) || options["help"]) {
      print("""
  Usage: approve_results.dart [OPTION]...
  List tests whose results are different from the previously approved results, and
  
negative.code:         ? loadResultsMap(path)
          : <String, Map<String, dynamic>>{};
  
  /// Loads a log from logdog.
  Future<String> loadLog(String id, String step) async {
    final logUrl = Uri.parse("https://logs.chromium.org/"
        "logs/dart/buildbucket/cr-buildbucket.appspot.com/"
        "$id/+/steps/$step?format=raw");
    final client = new HttpClient();
    final request =
        await client.getUrl(logUrl).timeout(const Duration(seconds: 60));
    final response = await request.close().timeout(const Duration(seconds: 60));
    if (response.statusCode != HttpStatus.ok) {
      throw new Exception("The log at $logUrl doesn't exist");
    }
    final contents = (await response
            .transform(new Utf8Decoder())
            .timeout(const Duration(seconds: 60))
            .toList())
        .join("");
    client.close();
    return contents;
  }
  
  /// Loads the results from the bot.
  Future<List<Test>> loadResultsFromBot(String bot, ArgResults options,
      Map<String, dynamic> changelistBuild) async {
    if (options["verbose"]) {
      print("Loading $bot...");
    }
  