diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart index cd3d54de71..f50e1c0d47 100644 --- a/packages/flutter_tools/lib/src/commands/update_packages.dart +++ b/packages/flutter_tools/lib/src/commands/update_packages.dart @@ -662,6 +662,9 @@ class PubspecYaml { lastDependency._lockIsOverride = section == Section.dependencyOverrides; do { index += 1; + if (index == lines.length) { + throw StateError('Invalid pubspec.yaml: a "git" dependency section terminated early.'); + } line = lines[index]; lastDependency._lockLine += '\n$line'; } while (line.startsWith(' ')); 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 8bf33a91b1..88651626c0 100644 --- a/packages/flutter_tools/test/general.shard/update_packages_test.dart +++ b/packages/flutter_tools/test/general.shard/update_packages_test.dart @@ -30,6 +30,11 @@ dependencies: sky_engine: sdk: flutter + gallery: + git: + url: https://github.com/flutter/gallery.git + ref: d00362e6bdd0f9b30bba337c358b9e4a6e4ca950 + dev_dependencies: flutter_test: sdk: flutter @@ -42,11 +47,35 @@ dev_dependencies: # PUBSPEC CHECKSUM: 1437 '''; +const String kInvalidGitPubspec = ''' +name: flutter +author: Flutter Authors +description: A framework for writing Flutter applications +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" + +dependencies: + # To update these, use "flutter update-packages --force-upgrade". + collection: 1.14.11 + meta: 1.1.8 + typed_data: 1.1.6 + vector_math: 2.0.8 + + sky_engine: + sdk: flutter + + gallery: + git: +'''; + void main() { testWithoutContext('createTemporaryFlutterSdk creates an unpinned flutter SDK', () { final FileSystem fileSystem = MemoryFileSystem.test(); - // Setup simplified FLutter SDK. + // Setup simplified Flutter SDK. final Directory flutterSdk = fileSystem.directory('flutter') ..createSync(); // Create version file @@ -63,6 +92,15 @@ void main() { // Create already parsed pubspecs. final PubspecYaml flutterPubspec = PubspecYaml(flutter); + final PubspecDependency gitDependency = flutterPubspec.dependencies.whereType().firstWhere((PubspecDependency dep) => dep.kind == DependencyKind.git); + expect( + gitDependency.lockLine, + ''' + git: + url: https://github.com/flutter/gallery.git + ref: d00362e6bdd0f9b30bba337c358b9e4a6e4ca950 +''', + ); final Directory result = createTemporaryFlutterSdk( fileSystem, flutterSdk, @@ -88,4 +126,27 @@ void main() { expect(outputPubspec.dependencies.first.name, 'collection'); expect(outputPubspec.dependencies.first.version, 'any'); }); + + testWithoutContext('Throws a StateError on a malformed git: reference', () { + final FileSystem fileSystem = MemoryFileSystem.test(); + + // Setup simplified Flutter SDK. + final Directory flutterSdk = fileSystem.directory('flutter') + ..createSync(); + // Create version file + flutterSdk.childFile('version').writeAsStringSync('1.2.3'); + // Create a pubspec file + final Directory flutter = flutterSdk + .childDirectory('packages') + .childDirectory('flutter') + ..createSync(recursive: true); + flutter + .childFile('pubspec.yaml') + .writeAsStringSync(kInvalidGitPubspec); + + expect( + () => PubspecYaml(flutter), + throwsStateError, + ); + }); }