Handle missing pubspec.lock in dependency_services list (#3439)
diff --git a/lib/src/command/dependency_services.dart b/lib/src/command/dependency_services.dart
index 19cc867..5b252ae 100644
--- a/lib/src/command/dependency_services.dart
+++ b/lib/src/command/dependency_services.dart
@@ -281,7 +281,7 @@
final dependencies = <Object>[];
final result = <String, Object>{'dependencies': dependencies};
- for (final package in currentPackages) {
+ for (final package in currentPackages.where((p) => !p.isRoot)) {
dependencies.add({
'name': package.name,
'version': package.versionOrHash(),
diff --git a/test/dependency_services/dependency_services_test.dart b/test/dependency_services/dependency_services_test.dart
index b007a6b..08542ea 100644
--- a/test/dependency_services/dependency_services_test.dart
+++ b/test/dependency_services/dependency_services_test.dart
@@ -17,12 +17,18 @@
void manifestAndLockfile(GoldenTestContext context) {
String catFile(String filename) {
- final contents = filterUnstableLines(
- File(p.join(d.sandbox, appPath, filename)).readAsLinesSync());
+ final path = p.join(d.sandbox, appPath, filename);
+ if (File(path).existsSync()) {
+ final contents = filterUnstableLines(File(path).readAsLinesSync());
- return '''
+ return '''
\$ cat $filename
${contents.join('\n')}''';
+ } else {
+ return '''
+\$ cat $filename
+No such file $filename.''';
+ }
}
context.expectNextSection('''
@@ -141,6 +147,36 @@
});
});
+ testWithGolden('No pubspec.lock', (context) async {
+ final server = (await servePackages())
+ ..serve('foo', '1.2.3', deps: {'transitive': '^1.0.0'})
+ ..serve('foo', '2.2.3')
+ ..serve('transitive', '1.0.0');
+
+ await d.git('bar.git', [d.libPubspec('bar', '1.0.0')]).create();
+
+ await d.dir(appPath, [
+ d.pubspec({
+ 'name': 'app',
+ 'dependencies': {
+ 'foo': '^1.0.0',
+ 'bar': {
+ 'git': {'url': '../bar.git'},
+ },
+ },
+ })
+ ]).create();
+
+ server.dontAllowDownloads();
+ await listReportApply(
+ context,
+ [
+ _PackageVersion('foo', '2.2.3'),
+ _PackageVersion('transitive', null),
+ ],
+ );
+ });
+
testWithGolden('Compatible', (context) async {
final server = (await servePackages())
..serve('foo', '1.2.3')
diff --git a/test/testdata/goldens/dependency_services/dependency_services_test/No pubspec.lock.txt b/test/testdata/goldens/dependency_services/dependency_services_test/No pubspec.lock.txt
new file mode 100644
index 0000000..ca80a34
--- /dev/null
+++ b/test/testdata/goldens/dependency_services/dependency_services_test/No pubspec.lock.txt
@@ -0,0 +1,205 @@
+# GENERATED BY: test/dependency_services/dependency_services_test.dart
+
+$ cat pubspec.yaml
+{"name":"app","dependencies":{"foo":"^1.0.0","bar":{"git":{"url":"../bar.git"}}},"environment":{"sdk":">=0.1.2 <1.0.0"}}
+$ cat pubspec.lock
+No such file pubspec.lock.
+-------------------------------- END OF OUTPUT ---------------------------------
+
+## Section list
+$ dependency_services list
+{
+ "dependencies": [
+ {
+ "name": "bar",
+ "version": "92cdd4ac724a6da0db2a69ac149820aa220e8518",
+ "kind": "direct",
+ "constraint": "any",
+ "source": {
+ "type": "git",
+ "description": {
+ "url": "../bar.git",
+ "ref": "HEAD",
+ "resolved-ref": "92cdd4ac724a6da0db2a69ac149820aa220e8518",
+ "path": "."
+ }
+ }
+ },
+ {
+ "name": "foo",
+ "version": "1.2.3",
+ "kind": "direct",
+ "constraint": "^1.0.0",
+ "source": {
+ "type": "hosted",
+ "description": {
+ "name": "foo",
+ "url": "http://localhost:$PORT"
+ }
+ }
+ },
+ {
+ "name": "transitive",
+ "version": "1.0.0",
+ "kind": "transitive",
+ "constraint": "null",
+ "source": {
+ "type": "hosted",
+ "description": {
+ "name": "transitive",
+ "url": "http://localhost:$PORT"
+ }
+ }
+ }
+ ]
+}
+
+-------------------------------- END OF OUTPUT ---------------------------------
+
+## Section report
+$ dependency_services report
+{
+ "dependencies": [
+ {
+ "name": "bar",
+ "version": "92cdd4ac724a6da0db2a69ac149820aa220e8518",
+ "kind": "direct",
+ "source": {
+ "type": "git",
+ "description": {
+ "url": "../bar.git",
+ "ref": "HEAD",
+ "resolved-ref": "92cdd4ac724a6da0db2a69ac149820aa220e8518",
+ "path": "."
+ }
+ },
+ "latest": "92cdd4ac724a6da0db2a69ac149820aa220e8518",
+ "constraint": "any",
+ "compatible": [],
+ "singleBreaking": [],
+ "multiBreaking": [
+ {
+ "name": "foo",
+ "version": "2.2.3",
+ "kind": "direct",
+ "source": {
+ "type": "hosted",
+ "description": {
+ "name": "foo",
+ "url": "http://localhost:$PORT"
+ }
+ },
+ "constraintBumped": "^2.2.3",
+ "constraintWidened": ">=1.0.0 <3.0.0",
+ "constraintBumpedIfNeeded": "^2.2.3",
+ "previousVersion": "1.2.3",
+ "previousConstraint": "^1.0.0",
+ "previousSource": {
+ "type": "hosted",
+ "description": {
+ "name": "foo",
+ "url": "http://localhost:$PORT"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "foo",
+ "version": "1.2.3",
+ "kind": "direct",
+ "source": {
+ "type": "hosted",
+ "description": {
+ "name": "foo",
+ "url": "http://localhost:$PORT"
+ }
+ },
+ "latest": "2.2.3",
+ "constraint": "^1.0.0",
+ "compatible": [],
+ "singleBreaking": [
+ {
+ "name": "foo",
+ "version": "2.2.3",
+ "kind": "direct",
+ "source": {
+ "type": "hosted",
+ "description": {
+ "name": "foo",
+ "url": "http://localhost:$PORT"
+ }
+ },
+ "constraintBumped": "^2.2.3",
+ "constraintWidened": ">=1.0.0 <3.0.0",
+ "constraintBumpedIfNeeded": "^2.2.3",
+ "previousVersion": "1.2.3",
+ "previousConstraint": "^1.0.0",
+ "previousSource": {
+ "type": "hosted",
+ "description": {
+ "name": "foo",
+ "url": "http://localhost:$PORT"
+ }
+ }
+ }
+ ],
+ "multiBreaking": [
+ {
+ "name": "foo",
+ "version": "2.2.3",
+ "kind": "direct",
+ "source": {
+ "type": "hosted",
+ "description": {
+ "name": "foo",
+ "url": "http://localhost:$PORT"
+ }
+ },
+ "constraintBumped": "^2.2.3",
+ "constraintWidened": ">=1.0.0 <3.0.0",
+ "constraintBumpedIfNeeded": "^2.2.3",
+ "previousVersion": "1.2.3",
+ "previousConstraint": "^1.0.0",
+ "previousSource": {
+ "type": "hosted",
+ "description": {
+ "name": "foo",
+ "url": "http://localhost:$PORT"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "transitive",
+ "version": "1.0.0",
+ "kind": "transitive",
+ "source": {
+ "type": "hosted",
+ "description": {
+ "name": "transitive",
+ "url": "http://localhost:$PORT"
+ }
+ },
+ "latest": "1.0.0",
+ "constraint": null,
+ "compatible": [],
+ "singleBreaking": [],
+ "multiBreaking": []
+ }
+ ]
+}
+
+-------------------------------- END OF OUTPUT ---------------------------------
+
+## Section apply
+$ echo '{"dependencyChanges":[{"name":"foo","version":"2.2.3"},{"name":"transitive","version":null}]}' | dependency_services apply
+{"dependencies":[]}
+
+-------------------------------- END OF OUTPUT ---------------------------------
+
+$ cat pubspec.yaml
+{"name":"app","dependencies":{"foo":^2.2.3,"bar":{"git":{"url":"../bar.git"}}},"environment":{"sdk":">=0.1.2 <1.0.0"}}
+$ cat pubspec.lock
+No such file pubspec.lock.