blob: 0a40b7db6fe79ff9d084fadcc0b1816ae42fb4ae [file] [log] [blame]
// 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 'package:flutter/foundation.dart';
import 'package:flutter_dashboard/model/branch.pb.dart';
import '../model/build_status_response.pb.dart';
import '../model/commit_status.pb.dart';
import '../model/task.pb.dart';
import 'appengine_cocoon.dart';
import 'dev_cocoon.dart';
/// Service class for interacting with flutter/flutter build data.
///
/// This service exists as a common interface for getting build data from a data source.
abstract class CocoonService {
/// Creates a new [CocoonService] based on if the Flutter app is in production.
///
/// If `useProductionService` is true, then use the production Cocoon backend
/// running on AppEngine, otherwise use fake data populated from a fake
/// service. Defaults to production data on a release build, and fake data on
/// a debug build.
factory CocoonService({bool useProductionService = kReleaseMode}) {
if (useProductionService) {
return AppEngineCocoonService();
}
return DevelopmentCocoonService(DateTime.now(), simulateLoadingDelays: true);
}
/// Gets build information on the most recent commits.
///
/// If [lastCommitStatus] is given, it will return the next page of
/// [List<CommitStatus>] after [lastCommitStatus], not including it.
Future<CocoonResponse<List<CommitStatus>>> fetchCommitStatuses({
CommitStatus? lastCommitStatus,
String? branch,
required String repo,
});
/// Gets the current build status of flutter/flutter.
Future<CocoonResponse<BuildStatusResponse>> fetchTreeBuildStatus({
String? branch,
required String repo,
});
/// Get the current list of version branches in flutter/flutter.
Future<CocoonResponse<List<Branch>>> fetchFlutterBranches();
/// Get the current list of version branches in flutter/flutter.
Future<CocoonResponse<List<String>>> fetchRepos();
/// Send rerun [Task] command to devicelab.
///
/// Will not rerun tasks that are outside of devicelab.
Future<CocoonResponse<bool>> rerunTask(Task task, String? idToken, String repo);
/// Force update Cocoon to get the latest commits.
Future<bool> vacuumGitHubCommits(String idToken);
}
/// Wrapper class for data this state serves.
///
/// Holds [data] and possible error information.
@immutable
class CocoonResponse<T> {
const CocoonResponse.data(this.data) : error = null;
const CocoonResponse.error(this.error) : data = null;
/// The data that gets used from [CocoonService].
final T? data;
/// Error information that can be used for debugging.
final String? error;
}
/// This must be kept up to date with what's in app_dart/lib/src/service/config.dart.
final Map<String, String> defaultBranches = <String, String>{
'cocoon': 'main',
'engine': 'main',
'flutter': 'master',
'packages': 'main',
};