diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart index e3b66ffd94..0debc4482a 100644 --- a/packages/flutter_tools/lib/src/version.dart +++ b/packages/flutter_tools/lib/src/version.dart @@ -532,7 +532,13 @@ class _FlutterVersionFromFile extends FlutterVersion { final String devToolsVersion; @override - void ensureVersionFile() {} + void ensureVersionFile() { + _ensureLegacyVersionFile( + fs: fs, + flutterRoot: flutterRoot, + frameworkVersion: frameworkVersion, + ); + } } class _FlutterVersionGit extends FlutterVersion { @@ -599,10 +605,11 @@ class _FlutterVersionGit extends FlutterVersion { @override void ensureVersionFile() { - final File legacyVersionFile = fs.file(fs.path.join(flutterRoot, 'version')); - if (!legacyVersionFile.existsSync()) { - legacyVersionFile.writeAsStringSync(frameworkVersion); - } + _ensureLegacyVersionFile( + fs: fs, + flutterRoot: flutterRoot, + frameworkVersion: frameworkVersion, + ); const JsonEncoder encoder = JsonEncoder.withIndent(' '); final File newVersionFile = FlutterVersion.getVersionFile(fs, flutterRoot); @@ -612,6 +619,17 @@ class _FlutterVersionGit extends FlutterVersion { } } +void _ensureLegacyVersionFile({ + required FileSystem fs, + required String flutterRoot, + required String frameworkVersion, +}) { + final File legacyVersionFile = fs.file(fs.path.join(flutterRoot, 'version')); + if (!legacyVersionFile.existsSync()) { + legacyVersionFile.writeAsStringSync(frameworkVersion); + } +} + /// Checks if the provided [version] is tracking a standard remote. /// /// A "standard remote" is one having the same url as(in order of precedence): diff --git a/packages/flutter_tools/test/general.shard/version_test.dart b/packages/flutter_tools/test/general.shard/version_test.dart index 0d82dedc5b..7a0b182402 100644 --- a/packages/flutter_tools/test/general.shard/version_test.dart +++ b/packages/flutter_tools/test/general.shard/version_test.dart @@ -554,6 +554,43 @@ void main() { Cache: () => cache, }); + testUsingContext('_FlutterVersionFromFile.ensureVersionFile ensures legacy version file exists', () async { + final MemoryFileSystem fs = MemoryFileSystem.test(); + final Directory flutterRoot = fs.directory('/path/to/flutter'); + final Directory cacheDir = flutterRoot + .childDirectory('bin') + .childDirectory('cache') + ..createSync(recursive: true); + const String devToolsVersion = '0000000'; + final File legacyVersionFile = flutterRoot.childFile('version'); + const Map versionJson = { + 'channel': 'stable', + 'frameworkVersion': '1.2.3', + 'repositoryUrl': 'https://github.com/flutter/flutter.git', + 'frameworkRevision': '1234abcd', + 'frameworkCommitDate': '2023-04-28 12:34:56 -0400', + 'engineRevision': 'deadbeef', + 'dartSdkVersion': 'deadbeef2', + 'devToolsVersion': devToolsVersion, + 'flutterVersion': 'foo', + }; + cacheDir.childFile('flutter.version.json').writeAsStringSync( + jsonEncode(versionJson), + ); + expect(legacyVersionFile.existsSync(), isFalse); + final FlutterVersion flutterVersion = FlutterVersion( + clock: _testClock, + fs: fs, + flutterRoot: flutterRoot.path, + ); + flutterVersion.ensureVersionFile(); + expect(legacyVersionFile.existsSync(), isTrue); + expect(legacyVersionFile.readAsStringSync(), '1.2.3'); + }, overrides: { + ProcessManager: () => processManager, + Cache: () => cache, + }); + testUsingContext('FlutterVersion() falls back to git if .version.json is malformed', () async { final MemoryFileSystem fs = MemoryFileSystem.test(); final Directory flutterRoot = fs.directory(fs.path.join('path', 'to', 'flutter'));