Unverified Commit 52ea6c2a authored by Zachary Anderson's avatar Zachary Anderson Committed by GitHub

[flutter_tool] Fix crash in update-packages (#71950)

parent a56e616c
...@@ -320,6 +320,7 @@ class UpdatePackagesCommand extends FlutterCommand { ...@@ -320,6 +320,7 @@ class UpdatePackagesCommand extends FlutterCommand {
Directory temporaryFlutterSdk; Directory temporaryFlutterSdk;
if (upgrade) { if (upgrade) {
temporaryFlutterSdk = createTemporaryFlutterSdk( temporaryFlutterSdk = createTemporaryFlutterSdk(
globals.logger,
globals.fs, globals.fs,
globals.fs.directory(Cache.flutterRoot), globals.fs.directory(Cache.flutterRoot),
pubspecs, pubspecs,
...@@ -1417,7 +1418,13 @@ String _computeChecksum(Iterable<String> names, String getVersion(String name)) ...@@ -1417,7 +1418,13 @@ String _computeChecksum(Iterable<String> names, String getVersion(String name))
/// Create a synthetic Flutter SDK so that pub version solving does not get /// Create a synthetic Flutter SDK so that pub version solving does not get
/// stuck on the old versions. /// stuck on the old versions.
Directory createTemporaryFlutterSdk(FileSystem fileSystem, Directory realFlutter, List<PubspecYaml> pubspecs) { @visibleForTesting
Directory createTemporaryFlutterSdk(
Logger logger,
FileSystem fileSystem,
Directory realFlutter,
List<PubspecYaml> pubspecs,
) {
final Set<String> currentPackages = realFlutter final Set<String> currentPackages = realFlutter
.childDirectory('packages') .childDirectory('packages')
.listSync() .listSync()
...@@ -1445,6 +1452,12 @@ Directory createTemporaryFlutterSdk(FileSystem fileSystem, Directory realFlutter ...@@ -1445,6 +1452,12 @@ Directory createTemporaryFlutterSdk(FileSystem fileSystem, Directory realFlutter
.childFile('pubspec.yaml') .childFile('pubspec.yaml')
..createSync(recursive: true); ..createSync(recursive: true);
final PubspecYaml pubspecYaml = pubspecsByName[flutterPackage]; 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'); final StringBuffer output = StringBuffer('name: $flutterPackage\n');
// Fill in SDK dependency constraint. // Fill in SDK dependency constraint.
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:file_testing/file_testing.dart'; import 'package:file_testing/file_testing.dart';
import 'package:flutter_tools/src/base/file_system.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 'package:flutter_tools/src/commands/update_packages.dart';
import '../src/common.dart'; import '../src/common.dart';
...@@ -47,6 +48,17 @@ dev_dependencies: ...@@ -47,6 +48,17 @@ dev_dependencies:
# PUBSPEC CHECKSUM: 1437 # PUBSPEC CHECKSUM: 1437
'''; ''';
const String kExtraPubspecYaml = r'''
name: nodeps
author: Flutter Authors <flutter-dev@googlegroups.com>
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 = ''' const String kInvalidGitPubspec = '''
name: flutter name: flutter
author: Flutter Authors <flutter-dev@googlegroups.com> author: Flutter Authors <flutter-dev@googlegroups.com>
...@@ -89,6 +101,15 @@ void main() { ...@@ -89,6 +101,15 @@ void main() {
.childFile('pubspec.yaml') .childFile('pubspec.yaml')
.writeAsStringSync(kFlutterPubspecYaml); .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. // Create already parsed pubspecs.
final PubspecYaml flutterPubspec = PubspecYaml(flutter); final PubspecYaml flutterPubspec = PubspecYaml(flutter);
...@@ -101,7 +122,9 @@ void main() { ...@@ -101,7 +122,9 @@ void main() {
ref: d00362e6bdd0f9b30bba337c358b9e4a6e4ca950 ref: d00362e6bdd0f9b30bba337c358b9e4a6e4ca950
''', ''',
); );
final BufferLogger bufferLogger = BufferLogger.test();
final Directory result = createTemporaryFlutterSdk( final Directory result = createTemporaryFlutterSdk(
bufferLogger,
fileSystem, fileSystem,
flutterSdk, flutterSdk,
<PubspecYaml>[flutterPubspec], <PubspecYaml>[flutterPubspec],
...@@ -109,6 +132,12 @@ void main() { ...@@ -109,6 +132,12 @@ void main() {
expect(result, exists); 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. // The version file exists.
expect(result.childFile('version'), exists); expect(result.childFile('version'), exists);
expect(result.childFile('version').readAsStringSync(), '1.2.3'); expect(result.childFile('version').readAsStringSync(), '1.2.3');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment