From 94e9a2ca8d1737ec9b79c00b9f2c003bb6926a4e Mon Sep 17 00:00:00 2001 From: Ben Konyi Date: Wed, 4 Jun 2025 16:17:27 -0400 Subject: [PATCH] [ Tool ] Fix failed VSCode version lookup on Linux (#169949) VSCode installations on Linux appear to place the packages.json file at `$VSCODE_INSTALL/resources/app/package.json` rather than at the expected `$VSCODE_INSTALL/Resources/app/package.json`, causing the VSCode version to not be reported correctly on Linux. Fixes https://github.com/flutter/flutter/issues/169812 --- .../flutter_tools/lib/src/vscode/vscode.dart | 4 ++- .../commands.shard/hermetic/doctor_test.dart | 1 + .../application/resources/app/package.json | 4 +++ .../general.shard/vscode/vscode_test.dart | 27 ++++++++++++++++++- 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 packages/flutter_tools/test/data/vscode/application/resources/app/package.json diff --git a/packages/flutter_tools/lib/src/vscode/vscode.dart b/packages/flutter_tools/lib/src/vscode/vscode.dart index c4e7125a754..a920682cc1c 100644 --- a/packages/flutter_tools/lib/src/vscode/vscode.dart +++ b/packages/flutter_tools/lib/src/vscode/vscode.dart @@ -68,10 +68,11 @@ class VsCode { String extensionDirectory, { String? edition, required FileSystem fileSystem, + required Platform platform, }) { final String packageJsonPath = fileSystem.path.join( installPath, - 'Resources', + platform.isLinux ? 'resources' : 'Resources', 'app', 'package.json', ); @@ -311,6 +312,7 @@ class VsCode { extensionDirectory, edition: searchLocation.edition, fileSystem: fileSystem, + platform: platform, ), ); } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart index 1b54e40560a..9e8174e6a8d 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart @@ -1428,6 +1428,7 @@ class VsCodeValidatorTestTargets extends VsCodeValidator { extensionDirectory, edition: edition, fileSystem: globals.fs, + platform: globals.platform, ), ); diff --git a/packages/flutter_tools/test/data/vscode/application/resources/app/package.json b/packages/flutter_tools/test/data/vscode/application/resources/app/package.json new file mode 100644 index 00000000000..e4e72b6e0ba --- /dev/null +++ b/packages/flutter_tools/test/data/vscode/application/resources/app/package.json @@ -0,0 +1,4 @@ +{ + "name": "fake-vs-code-install-for-tests", + "version": "1.2.3" +} diff --git a/packages/flutter_tools/test/general.shard/vscode/vscode_test.dart b/packages/flutter_tools/test/general.shard/vscode/vscode_test.dart index 8fc2891fd4a..5385cc4d5a2 100644 --- a/packages/flutter_tools/test/general.shard/vscode/vscode_test.dart +++ b/packages/flutter_tools/test/general.shard/vscode/vscode_test.dart @@ -5,6 +5,7 @@ import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/version.dart'; import 'package:flutter_tools/src/vscode/vscode.dart'; import '../../src/common.dart'; @@ -55,11 +56,35 @@ void main() { ..createSync(recursive: true) ..writeAsStringSync('{'); - final VsCode vsCode = VsCode.fromDirectory('', '', fileSystem: fileSystem); + final VsCode vsCode = VsCode.fromDirectory( + '', + '', + fileSystem: fileSystem, + platform: const LocalPlatform(), + ); expect(vsCode.version, null); }); + testWithoutContext('VsCode.fromDirectory finds packages.json on Linux', () { + // Regression test for https://github.com/flutter/flutter/issues/169812 + final MemoryFileSystem fileSystem = MemoryFileSystem.test(); + // Installations on Linux appear to use $VSCODE_INSTALL/resources/app/package.json rather than + // $VSCODE_INSTALL/Resources/app/package.json. + fileSystem.file(fileSystem.path.join('', 'resources', 'app', 'package.json')) + ..createSync(recursive: true) + ..writeAsStringSync('{"version":"1.2.3"}'); + + final VsCode vsCode = VsCode.fromDirectory( + '', + '', + fileSystem: fileSystem, + platform: FakePlatform(), + ); + + expect(vsCode.version, Version(1, 2, 3)); + }); + testWithoutContext('can locate VS Code installed via Snap', () { final FileSystem fileSystem = MemoryFileSystem.test(); const String home = '/home/me';