Skip to content

Commit 9e59a68

Browse files
[flutter_tools] Fix legacy version file not being ensured (flutter#133097)
Fixes flutter#133093 When I introduced the new, more robust version file `//flutter/bin/cache/version.json` in flutter#124558, I changed `class FlutterVersion` into an abstract interface, implemented by `_FlutterVersionFromGit` (which is essentially the previous behavior) and `_FlutterVersionFromFile`, which merely reads the data it would have computed via git from `//flutter/bin/cache/version.json`. While doing this, I made `_FlutterVersionFromGit.ensureVersionFile()` to be a no-op, since I assumed this would not be necessary since we already had a version file in the cache. However, this method was what was previously responsible for ensuring `//flutter/version` existed on disk. This means that if, for whatever reason, the user had `//flutter/bin/cache/flutter.version.json` present but NOT `//flutter/version`, the tool would have never created that file, and they would hit the tool crash seen in flutter#133093. This fixes the tool by ensuring `//flutter/version` exists regardless of if we're hydrating `FlutterVersion` from `//flutter/bin/cache/flutter.version.json` or not.
1 parent ad78cf3 commit 9e59a68

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

packages/flutter_tools/lib/src/version.dart

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,13 @@ class _FlutterVersionFromFile extends FlutterVersion {
532532
final String devToolsVersion;
533533

534534
@override
535-
void ensureVersionFile() {}
535+
void ensureVersionFile() {
536+
_ensureLegacyVersionFile(
537+
fs: fs,
538+
flutterRoot: flutterRoot,
539+
frameworkVersion: frameworkVersion,
540+
);
541+
}
536542
}
537543

538544
class _FlutterVersionGit extends FlutterVersion {
@@ -599,10 +605,11 @@ class _FlutterVersionGit extends FlutterVersion {
599605

600606
@override
601607
void ensureVersionFile() {
602-
final File legacyVersionFile = fs.file(fs.path.join(flutterRoot, 'version'));
603-
if (!legacyVersionFile.existsSync()) {
604-
legacyVersionFile.writeAsStringSync(frameworkVersion);
605-
}
608+
_ensureLegacyVersionFile(
609+
fs: fs,
610+
flutterRoot: flutterRoot,
611+
frameworkVersion: frameworkVersion,
612+
);
606613

607614
const JsonEncoder encoder = JsonEncoder.withIndent(' ');
608615
final File newVersionFile = FlutterVersion.getVersionFile(fs, flutterRoot);
@@ -612,6 +619,17 @@ class _FlutterVersionGit extends FlutterVersion {
612619
}
613620
}
614621

622+
void _ensureLegacyVersionFile({
623+
required FileSystem fs,
624+
required String flutterRoot,
625+
required String frameworkVersion,
626+
}) {
627+
final File legacyVersionFile = fs.file(fs.path.join(flutterRoot, 'version'));
628+
if (!legacyVersionFile.existsSync()) {
629+
legacyVersionFile.writeAsStringSync(frameworkVersion);
630+
}
631+
}
632+
615633
/// Checks if the provided [version] is tracking a standard remote.
616634
///
617635
/// A "standard remote" is one having the same url as(in order of precedence):

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,43 @@ void main() {
554554
Cache: () => cache,
555555
});
556556

557+
testUsingContext('_FlutterVersionFromFile.ensureVersionFile ensures legacy version file exists', () async {
558+
final MemoryFileSystem fs = MemoryFileSystem.test();
559+
final Directory flutterRoot = fs.directory('/path/to/flutter');
560+
final Directory cacheDir = flutterRoot
561+
.childDirectory('bin')
562+
.childDirectory('cache')
563+
..createSync(recursive: true);
564+
const String devToolsVersion = '0000000';
565+
final File legacyVersionFile = flutterRoot.childFile('version');
566+
const Map<String, Object> versionJson = <String, Object>{
567+
'channel': 'stable',
568+
'frameworkVersion': '1.2.3',
569+
'repositoryUrl': 'https://github.com/flutter/flutter.git',
570+
'frameworkRevision': '1234abcd',
571+
'frameworkCommitDate': '2023-04-28 12:34:56 -0400',
572+
'engineRevision': 'deadbeef',
573+
'dartSdkVersion': 'deadbeef2',
574+
'devToolsVersion': devToolsVersion,
575+
'flutterVersion': 'foo',
576+
};
577+
cacheDir.childFile('flutter.version.json').writeAsStringSync(
578+
jsonEncode(versionJson),
579+
);
580+
expect(legacyVersionFile.existsSync(), isFalse);
581+
final FlutterVersion flutterVersion = FlutterVersion(
582+
clock: _testClock,
583+
fs: fs,
584+
flutterRoot: flutterRoot.path,
585+
);
586+
flutterVersion.ensureVersionFile();
587+
expect(legacyVersionFile.existsSync(), isTrue);
588+
expect(legacyVersionFile.readAsStringSync(), '1.2.3');
589+
}, overrides: <Type, Generator>{
590+
ProcessManager: () => processManager,
591+
Cache: () => cache,
592+
});
593+
557594
testUsingContext('FlutterVersion() falls back to git if .version.json is malformed', () async {
558595
final MemoryFileSystem fs = MemoryFileSystem.test();
559596
final Directory flutterRoot = fs.directory(fs.path.join('path', 'to', 'flutter'));

0 commit comments

Comments
 (0)