Future _updateStatus()

in app_dart/lib/src/request_handlers/refresh_chromebot_status.dart [90:143]


  Future<void> _updateStatus(
    LuciBuilder builder,
    String? branch,
    DatastoreService datastore,
    Map<String, List<LuciTask>>? luciTasksMap,
    RepositorySlug slug,
  ) async {
    final List<FullTask> datastoreTasks = await datastore
        .queryRecentTasks(
          taskName: builder.taskName,
          branch: branch,
          slug: slug,
        )
        .toList();

    /// Update [devicelabTask] when first [luciTask] run finishes. There may be
    /// reruns for the same commit and same builder. Update [devicelabTask]
    /// [builderNumberList] when luci rerun happens, and update [devicelabTask]
    /// status when the status of latest luci run changes.
    for (FullTask datastoreTask in datastoreTasks) {
      final String commitSha = datastoreTask.commit.sha!;
      if (!luciTasksMap!.containsKey(commitSha)) {
        continue;
      }
      final List<LuciTask> luciTasks = luciTasksMap[commitSha]!;
      final String buildNumberList =
          luciTasks.reversed.map((LuciTask luciTask) => luciTask.buildNumber.toString()).toList().join(',');
      final LuciTask latestLuciTask = luciTasks.first;
      if (buildNumberList != datastoreTask.task.buildNumberList || latestLuciTask.status != datastoreTask.task.status) {
        final Task update = datastoreTask.task;
        update.status = latestLuciTask.status;

        /// Use `update.attempts - 1` as the `retries` to skip the initial run.
        if (await luciBuildService.checkRerunBuilder(
            commit: datastoreTask.commit,
            luciTask: latestLuciTask,
            retries: update.attempts! - 1,
            datastore: datastore,
            isFlaky: datastoreTask.task.isFlaky)) {
          update.status = Task.statusNew;
          update.attempts = (update.attempts ?? 0) + 1;
        }

        update.buildNumberList = buildNumberList;
        update.builderName = builder.name;
        update.luciBucket = builder.flaky ?? false ? 'luci.flutter.staging' : 'luci.flutter.prod';
        await datastore.insert(<Task>[update]);
        // Save luci task record to BigQuery only when task finishes.
        if (update.status == Task.statusFailed || update.status == Task.statusSucceeded) {
          await _insertBigquery(update);
        }
      }
    }
  }