Unverified Commit 861fe0a2 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

Ensure precache --web works on dev branch (#42289)

parent 3ff51c74
......@@ -16,21 +16,25 @@ import 'base/net.dart';
import 'base/os.dart';
import 'base/platform.dart';
import 'base/process.dart';
import 'features.dart';
import 'globals.dart';
/// A tag for a set of development artifacts that need to be cached.
class DevelopmentArtifact {
const DevelopmentArtifact._(this.name, {this.unstable = false});
const DevelopmentArtifact._(this.name, {this.unstable = false, this.feature});
/// The name of the artifact.
///
/// This should match the flag name in precache.dart
final String name;
/// Whether this artifact should be unavailable on stable branches.
/// Whether this artifact should be unavailable on master branch only.
final bool unstable;
/// A feature to control the visibility of this artifact.
final Feature feature;
/// Artifacts required for Android development.
static const DevelopmentArtifact androidGenSnapshot = DevelopmentArtifact._('android_gen_snapshot');
static const DevelopmentArtifact androidMaven = DevelopmentArtifact._('android_maven');
......@@ -41,7 +45,7 @@ class DevelopmentArtifact {
static const DevelopmentArtifact iOS = DevelopmentArtifact._('ios');
/// Artifacts required for web development.
static const DevelopmentArtifact web = DevelopmentArtifact._('web', unstable: true);
static const DevelopmentArtifact web = DevelopmentArtifact._('web', feature: flutterWebFeature);
/// Artifacts required for desktop macOS.
static const DevelopmentArtifact macOS = DevelopmentArtifact._('macos', unstable: true);
......@@ -75,6 +79,9 @@ class DevelopmentArtifact {
universal,
flutterRunner,
];
@override
String toString() => 'Artifact($name, $unstable)';
}
/// A wrapper around the `bin/cache/` directory.
......
......@@ -5,6 +5,7 @@
import 'dart:async';
import '../cache.dart';
import '../features.dart';
import '../globals.dart';
import '../runner/flutter_command.dart';
import '../version.dart';
......@@ -65,6 +66,9 @@ class PrecacheCommand extends FlutterCommand {
if (!FlutterVersion.instance.isMaster && artifact.unstable) {
continue;
}
if (artifact.feature != null && !featureFlags.isEnabled(artifact.feature)) {
continue;
}
if (argResults[artifact.name]) {
requiredArtifacts.add(artifact);
}
......
......@@ -17,7 +17,7 @@ FeatureFlags get featureFlags => context.get<FeatureFlags>();
/// The interface used to determine if a particular [Feature] is enabled.
///
/// The rest of the tools code should use this class instead of looking up
/// features directly. To faciliate rolls to google3 and other clients, all
/// features directly. To facilitate rolls to google3 and other clients, all
/// flags should be provided with a default implementation here. Clients that
/// use this class should extent instead of implement, so that new flags are
/// picked up automatically.
......@@ -25,22 +25,24 @@ class FeatureFlags {
const FeatureFlags();
/// Whether flutter desktop for linux is enabled.
bool get isLinuxEnabled => _isEnabled(flutterLinuxDesktopFeature);
bool get isLinuxEnabled => isEnabled(flutterLinuxDesktopFeature);
/// Whether flutter desktop for macOS is enabled.
bool get isMacOSEnabled => _isEnabled(flutterMacOSDesktopFeature);
bool get isMacOSEnabled => isEnabled(flutterMacOSDesktopFeature);
/// Whether flutter web is enabled.
bool get isWebEnabled => _isEnabled(flutterWebFeature);
bool get isWebEnabled => isEnabled(flutterWebFeature);
/// Whether flutter desktop for Windows is enabled.
bool get isWindowsEnabled => _isEnabled(flutterWindowsDesktopFeature);
bool get isWindowsEnabled => isEnabled(flutterWindowsDesktopFeature);
/// Whether the new Android embedding is enabled.
bool get isNewAndroidEmbeddingEnabled => _isEnabled(flutterNewAndroidEmbeddingFeature);
bool get isNewAndroidEmbeddingEnabled => isEnabled(flutterNewAndroidEmbeddingFeature);
// Calculate whether a particular feature is enabled for the current channel.
static bool _isEnabled(Feature feature) {
/// Whether a particular feature is enabled for the current channel.
///
/// Prefer using one of the specific getters above instead of this API.
bool isEnabled(Feature feature) {
final String currentChannel = FlutterVersion.instance.channel;
final FeatureChannelSetting featureSetting = feature.getSettingForChannel(currentChannel);
if (!featureSetting.available) {
......
......@@ -209,7 +209,7 @@ void main() {
});
test('Unstable artifacts', () {
expect(DevelopmentArtifact.web.unstable, true);
expect(DevelopmentArtifact.web.unstable, false);
expect(DevelopmentArtifact.linux.unstable, true);
expect(DevelopmentArtifact.macOS.unstable, true);
expect(DevelopmentArtifact.windows.unstable, true);
......
......@@ -712,6 +712,23 @@ class TestFeatureFlags implements FeatureFlags {
@override
final bool isNewAndroidEmbeddingEnabled;
@override
bool isEnabled(Feature feature) {
switch (feature) {
case flutterWebFeature:
return isWebEnabled;
case flutterLinuxDesktopFeature:
return isLinuxEnabled;
case flutterMacOSDesktopFeature:
return isMacOSEnabled;
case flutterWindowsDesktopFeature:
return isWindowsEnabled;
case flutterNewAndroidEmbeddingFeature:
return isNewAndroidEmbeddingEnabled;
}
return false;
}
}
class ThrowingPub implements Pub {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment