| // Copyright 2019 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 'commit.dart'; |
| import 'task.dart'; |
| |
| /// Class that holds the status for all tasks corresponding to a particular |
| /// commit. |
| /// |
| /// Tasks may still be running, and thus their status is subject to change. |
| /// Put another way, this class holds information that is a snapshot in time. |
| class CommitTasksStatus { |
| /// Creates a new [CommitTasksStatus]. |
| const CommitTasksStatus(this.commit, this.tasks); |
| |
| /// The commit against which all the tasks are run. |
| final Commit commit; |
| |
| /// Tasks running against the commit. |
| final List<Task> tasks; |
| |
| /// Refactors task list to fullTask list. |
| /// |
| /// After migrated to Firestore, we are tracking each rerun as a separate Task entry. |
| /// But from Frontend side, it is expecting a build list for all retries. |
| /// |
| /// Instead of adding burden to the frondend loading, a proactive preparation is |
| /// added here to provide build list explicitly. |
| /// |
| /// Note we use the lastest run as the `task`, surfacing on the dashboard. |
| List<FullTask> toFullTasks(List<Task> tasks) { |
| final Map<String, FullTask> fullTasksMap = <String, FullTask>{}; |
| for (Task task in tasks) { |
| if (!fullTasksMap.containsKey(task.taskName)) { |
| if (task.buildNumber == null) { |
| fullTasksMap[task.taskName!] = FullTask(task, <int>[]); |
| } else { |
| fullTasksMap[task.taskName!] = FullTask(task, <int>[task.buildNumber!]); |
| } |
| } else if (fullTasksMap.containsKey(task.taskName)) { |
| fullTasksMap[task.taskName]!.buildList.add(task.buildNumber!); |
| } |
| } |
| return fullTasksMap.entries.map((entry) => entry.value).toList(); |
| } |
| |
| Map<String, dynamic> toJson() { |
| return <String, dynamic>{ |
| 'Commit': commit.facade, |
| 'Tasks': toFullTasks(tasks).map((e) => e.toJson()).toList(), |
| }; |
| } |
| } |
| |
| /// Latest task entry and its rerun build list. |
| class FullTask { |
| const FullTask(this.task, this.buildList); |
| |
| final Task task; |
| final List<int> buildList; |
| |
| Map<String, dynamic> toJson() { |
| return <String, dynamic>{ |
| 'Task': task.facade, |
| 'BuildList': buildList.join(','), |
| }; |
| } |
| } |