Error reporting for bad workspace paths (#4201)
diff --git a/lib/src/pubspec.dart b/lib/src/pubspec.dart
index 3bb2e0a..a67a894 100644
--- a/lib/src/pubspec.dart
+++ b/lib/src/pubspec.dart
@@ -84,6 +84,12 @@
if (value is! String) {
_error('"workspace" must be a list of strings', t.span);
}
+ if (!p.isRelative(value)) {
+ _error('"workspace" members must be relative paths', t.span);
+ }
+ if (p.equals(value, '.') || !p.isWithin('.', value)) {
+ _error('"workspace" members must be subdirectories', t.span);
+ }
result.add(value);
}
return result;
diff --git a/test/workspace_test.dart b/test/workspace_test.dart
index cfa4079..0ff5d4b 100644
--- a/test/workspace_test.dart
+++ b/test/workspace_test.dart
@@ -686,4 +686,61 @@
expect(unmanagedLockFile.statSync().type, FileSystemEntityType.file);
expect(unmanagedPackageConfig.statSync().type, FileSystemEntityType.file);
});
+
+ test(
+ 'Reports a failure if a workspace pubspec is not nested inside the parent dir',
+ () async {
+ await dir(appPath, [
+ libPubspec(
+ 'myapp',
+ '1.2.3',
+ sdk: '^3.7.0',
+ extras: {
+ 'workspace': ['../'],
+ },
+ ),
+ ]).create();
+ await pubGet(
+ environment: {'_PUB_TEST_SDK_VERSION': '3.7.0'},
+ error: contains('"workspace" members must be subdirectories'),
+ exitCode: DATA,
+ );
+ });
+
+ test('Reports a failure if a workspace includes "."', () async {
+ await dir(appPath, [
+ libPubspec(
+ 'myapp',
+ '1.2.3',
+ sdk: '^3.7.0',
+ extras: {
+ 'workspace': ['.'],
+ },
+ ),
+ ]).create();
+ await pubGet(
+ environment: {'_PUB_TEST_SDK_VERSION': '3.7.0'},
+ error: contains('"workspace" members must be subdirectories'),
+ exitCode: DATA,
+ );
+ });
+
+ test('Reports a failure if a workspace pubspec is not a relative path',
+ () async {
+ await dir(appPath, [
+ libPubspec(
+ 'myapp',
+ '1.2.3',
+ sdk: '^3.7.0',
+ extras: {
+ 'workspace': [p.join(sandbox, appPath, 'a')],
+ },
+ ),
+ ]).create();
+ await pubGet(
+ environment: {'_PUB_TEST_SDK_VERSION': '3.7.0'},
+ error: contains('"workspace" members must be relative paths'),
+ exitCode: DATA,
+ );
+ });
}