diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart index d232e821677..95ef04b2921 100644 --- a/packages/flutter_tools/lib/src/commands/update_packages.dart +++ b/packages/flutter_tools/lib/src/commands/update_packages.dart @@ -320,6 +320,7 @@ class UpdatePackagesCommand extends FlutterCommand { Directory temporaryFlutterSdk; if (upgrade) { temporaryFlutterSdk = createTemporaryFlutterSdk( + globals.logger, globals.fs, globals.fs.directory(Cache.flutterRoot), pubspecs, @@ -1417,7 +1418,13 @@ String _computeChecksum(Iterable names, String getVersion(String name)) /// Create a synthetic Flutter SDK so that pub version solving does not get /// stuck on the old versions. -Directory createTemporaryFlutterSdk(FileSystem fileSystem, Directory realFlutter, List pubspecs) { +@visibleForTesting +Directory createTemporaryFlutterSdk( + Logger logger, + FileSystem fileSystem, + Directory realFlutter, + List pubspecs, +) { final Set currentPackages = realFlutter .childDirectory('packages') .listSync() @@ -1445,6 +1452,12 @@ Directory createTemporaryFlutterSdk(FileSystem fileSystem, Directory realFlutter .childFile('pubspec.yaml') ..createSync(recursive: true); final PubspecYaml pubspecYaml = pubspecsByName[flutterPackage]; + if (pubspecYaml == null) { + logger.printError( + "Unexpected package '$flutterPackage' found in packages directory", + ); + continue; + } final StringBuffer output = StringBuffer('name: $flutterPackage\n'); // Fill in SDK dependency constraint. diff --git a/packages/flutter_tools/test/general.shard/update_packages_test.dart b/packages/flutter_tools/test/general.shard/update_packages_test.dart index 88651626c05..cb7c1b36e21 100644 --- a/packages/flutter_tools/test/general.shard/update_packages_test.dart +++ b/packages/flutter_tools/test/general.shard/update_packages_test.dart @@ -5,6 +5,7 @@ import 'package:file/memory.dart'; import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/commands/update_packages.dart'; import '../src/common.dart'; @@ -47,6 +48,17 @@ dev_dependencies: # PUBSPEC CHECKSUM: 1437 '''; +const String kExtraPubspecYaml = r''' +name: nodeps +author: Flutter Authors +description: A dummy pubspec with no dependencies +homepage: http://flutter.dev + +environment: + # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite. + sdk: ">=2.2.2 <3.0.0" +'''; + const String kInvalidGitPubspec = ''' name: flutter author: Flutter Authors @@ -89,6 +101,15 @@ void main() { .childFile('pubspec.yaml') .writeAsStringSync(kFlutterPubspecYaml); + // A stray extra package should not cause a crash. + final Directory extra = flutterSdk + .childDirectory('packages') + .childDirectory('extra') + ..createSync(recursive: true); + extra + .childFile('pubspec.yaml') + .writeAsStringSync(kExtraPubspecYaml); + // Create already parsed pubspecs. final PubspecYaml flutterPubspec = PubspecYaml(flutter); @@ -101,7 +122,9 @@ void main() { ref: d00362e6bdd0f9b30bba337c358b9e4a6e4ca950 ''', ); + final BufferLogger bufferLogger = BufferLogger.test(); final Directory result = createTemporaryFlutterSdk( + bufferLogger, fileSystem, flutterSdk, [flutterPubspec], @@ -109,6 +132,12 @@ void main() { expect(result, exists); + // We get a warning about the unexpected package. + expect( + bufferLogger.errorText, + contains("Unexpected package 'extra' found in packages directory"), + ); + // The version file exists. expect(result.childFile('version'), exists); expect(result.childFile('version').readAsStringSync(), '1.2.3');