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

This commit is contained in:
Zachary Anderson 2020-12-09 08:51:10 -08:00 committed by GitHub
parent a56e616c0b
commit 52ea6c2a31
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 1 deletions

View file

@ -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.

View file

@ -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');