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 {
Directory temporaryFlutterSdk;
if (upgrade) {
temporaryFlutterSdk = createTemporaryFlutterSdk(
globals.logger,
globals.fs,
globals.fs.directory(Cache.flutterRoot),
pubspecs,
......@@ -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
/// 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
.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.
......
......@@ -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 <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 = '''
name: flutter
author: Flutter Authors <flutter-dev@googlegroups.com>
......@@ -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,
<PubspecYaml>[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');
......
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