Skip to content

Commit 89ed67d

Browse files
authored
Add flutter config --enable-omit-legacy-version-file (#171903)
Towards flutter/flutter#171900. We can decide how quickly to move here, but a feature flag will make it easier to try out/rollback.
1 parent 953b6e4 commit 89ed67d

5 files changed

Lines changed: 85 additions & 1 deletion

File tree

packages/flutter_tools/lib/src/features.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ abstract class FeatureFlags {
5353
/// Whether Swift Package Manager dependency management is enabled.
5454
bool get isSwiftPackageManagerEnabled => false;
5555

56+
/// Whether to stop writing the `{FLUTTER_ROOT}/version` file.
57+
///
58+
/// Tracking removal: <https://github.com/flutter/flutter/issues/171900>.
59+
bool get isOmitLegacyVersionFileEnabled => false;
60+
5661
/// Whether a particular feature is enabled for the current channel.
5762
///
5863
/// Prefer using one of the specific getters above instead of this API.
@@ -71,6 +76,7 @@ abstract class FeatureFlags {
7176
cliAnimation,
7277
nativeAssets,
7378
swiftPackageManager,
79+
omitLegacyVersionFile,
7480
];
7581

7682
/// All current Flutter feature flags that can be configured.
@@ -176,6 +182,21 @@ const Feature swiftPackageManager = Feature(
176182
stable: FeatureChannelSetting(available: true),
177183
);
178184

185+
/// Whether to continue writing the `{FLUTTER_ROOT}/version` legacy file.
186+
///
187+
/// Tracking removal: <https://github.com/flutter/flutter/issues/171900>.
188+
const Feature omitLegacyVersionFile = Feature(
189+
name: 'stops writing the legacy version file',
190+
configSetting: 'omit-legacy-version-file',
191+
extraHelpText:
192+
'If set, the file {FLUTTER_ROOT}/version is no longer written as part of '
193+
'the flutter tool execution; a newer file format has existed for some '
194+
'time in {FLUTTER_ROOT}/bin/cache/flutter.version.json.',
195+
master: FeatureChannelSetting(available: true),
196+
beta: FeatureChannelSetting(available: true),
197+
stable: FeatureChannelSetting(available: true),
198+
);
199+
179200
/// A [Feature] is a process for conditionally enabling tool features.
180201
///
181202
/// All settings are optional, and if not provided will generally default to

packages/flutter_tools/lib/src/flutter_features.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ mixin FlutterFeatureFlagsIsEnabled implements FeatureFlags {
5151

5252
@override
5353
bool get isSwiftPackageManagerEnabled => isEnabled(swiftPackageManager);
54+
55+
@override
56+
bool get isOmitLegacyVersionFileEnabled => isEnabled(omitLegacyVersionFile);
5457
}
5558

5659
interface class FlutterFeatureFlags extends FeatureFlags with FlutterFeatureFlagsIsEnabled {

packages/flutter_tools/lib/src/version.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'base/time.dart';
1414
import 'base/utils.dart';
1515
import 'cache.dart';
1616
import 'convert.dart';
17+
import 'features.dart';
1718
import 'globals.dart' as globals;
1819

1920
/// The default version when a version could not be determined.
@@ -689,6 +690,10 @@ void _ensureLegacyVersionFile({
689690
required String flutterRoot,
690691
required String frameworkVersion,
691692
}) {
693+
// TODO(matanlurey): https://github.com/flutter/flutter/issues/171900.
694+
if (featureFlags.isOmitLegacyVersionFileEnabled) {
695+
return;
696+
}
692697
final File legacyVersionFile = fs.file(fs.path.join(flutterRoot, 'version'));
693698
if (!legacyVersionFile.existsSync()) {
694699
legacyVersionFile.writeAsStringSync(frameworkVersion);

packages/flutter_tools/test/general.shard/version_test.dart

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ import 'package:flutter_tools/src/base/platform.dart';
1212
import 'package:flutter_tools/src/base/process.dart';
1313
import 'package:flutter_tools/src/base/time.dart';
1414
import 'package:flutter_tools/src/cache.dart';
15+
import 'package:flutter_tools/src/features.dart';
1516
import 'package:flutter_tools/src/version.dart';
1617
import 'package:test/fake.dart';
1718

1819
import '../src/common.dart';
1920
import '../src/context.dart';
2021
import '../src/fake_process_manager.dart';
21-
import '../src/fakes.dart' show FakeFlutterVersion;
22+
import '../src/fakes.dart' show FakeFlutterVersion, TestFeatureFlags;
2223

2324
final SystemClock _testClock = SystemClock.fixed(DateTime.utc(2015));
2425
final DateTime _stampUpToDate = _testClock.ago(
@@ -1187,6 +1188,54 @@ void main() {
11871188
overrides: <Type, Generator>{ProcessManager: () => processManager, Cache: () => cache},
11881189
);
11891190

1191+
testUsingContext(
1192+
'legacy version file is still supported',
1193+
() {
1194+
final MemoryFileSystem fs = MemoryFileSystem.test();
1195+
final Directory flutterRoot = fs.directory(fs.path.join('path', 'to', 'flutter'));
1196+
flutterRoot.childDirectory('bin').childDirectory('cache').createSync(recursive: true);
1197+
final File legacyVersionFile = flutterRoot.childFile('version');
1198+
1199+
final FlutterVersion flutterVersion = FlutterVersion(
1200+
clock: _testClock,
1201+
fs: fs,
1202+
flutterRoot: flutterRoot.path,
1203+
);
1204+
flutterVersion.ensureVersionFile();
1205+
1206+
expect(legacyVersionFile, exists);
1207+
},
1208+
overrides: <Type, Generator>{
1209+
ProcessManager: () => FakeProcessManager.any(),
1210+
// ignore: avoid_redundant_argument_values
1211+
FeatureFlags: () => TestFeatureFlags(isOmitLegacyVersionFileEnabled: false),
1212+
},
1213+
);
1214+
1215+
testUsingContext(
1216+
'legacy version file is no longer supported',
1217+
() {
1218+
final MemoryFileSystem fs = MemoryFileSystem.test();
1219+
final Directory flutterRoot = fs.directory(fs.path.join('path', 'to', 'flutter'));
1220+
flutterRoot.childDirectory('bin').childDirectory('cache').createSync(recursive: true);
1221+
final File legacyVersionFile = flutterRoot.childFile('version');
1222+
1223+
final FlutterVersion flutterVersion = FlutterVersion(
1224+
clock: _testClock,
1225+
fs: fs,
1226+
flutterRoot: flutterRoot.path,
1227+
);
1228+
flutterVersion.ensureVersionFile();
1229+
1230+
expect(legacyVersionFile, isNot(exists));
1231+
},
1232+
overrides: <Type, Generator>{
1233+
ProcessManager: () => FakeProcessManager.any(),
1234+
// ignore: avoid_redundant_argument_values
1235+
FeatureFlags: () => TestFeatureFlags(isOmitLegacyVersionFileEnabled: true),
1236+
},
1237+
);
1238+
11901239
testUsingContext('GitTagVersion', () {
11911240
const String hash = 'abcdef';
11921241
GitTagVersion gitTagVersion;

packages/flutter_tools/test/src/fakes.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@ class TestFeatureFlags implements FeatureFlags {
501501
this.isCliAnimationEnabled = true,
502502
this.isNativeAssetsEnabled = false,
503503
this.isSwiftPackageManagerEnabled = false,
504+
this.isOmitLegacyVersionFileEnabled = false,
504505
});
505506

506507
@override
@@ -536,6 +537,9 @@ class TestFeatureFlags implements FeatureFlags {
536537
@override
537538
final bool isSwiftPackageManagerEnabled;
538539

540+
@override
541+
final bool isOmitLegacyVersionFileEnabled;
542+
539543
@override
540544
bool isEnabled(Feature feature) {
541545
return switch (feature) {
@@ -549,6 +553,7 @@ class TestFeatureFlags implements FeatureFlags {
549553
flutterCustomDevicesFeature => areCustomDevicesEnabled,
550554
cliAnimation => isCliAnimationEnabled,
551555
nativeAssets => isNativeAssetsEnabled,
556+
omitLegacyVersionFile => isOmitLegacyVersionFileEnabled,
552557
_ => false,
553558
};
554559
}
@@ -566,6 +571,7 @@ class TestFeatureFlags implements FeatureFlags {
566571
cliAnimation,
567572
nativeAssets,
568573
swiftPackageManager,
574+
omitLegacyVersionFile,
569575
];
570576

571577
@override

0 commit comments

Comments
 (0)