@@ -6,6 +6,7 @@ import 'dart:io';
66
77import 'package:io/io.dart' ;
88import 'package:path/path.dart' as p;
9+ import 'package:pubspec_parse/pubspec_parse.dart' ;
910import 'package:test_common/utilities.dart' ;
1011
1112enum IndexBaseMode { noBase, base }
@@ -17,7 +18,6 @@ class TestProject {
1718 final String webAssetsPath;
1819 final String dartEntryFileName;
1920 final String htmlEntryFileName;
20- final List <TestProject > dependencies;
2121 final bool editable;
2222
2323 late Directory _fixturesCopy;
@@ -74,7 +74,6 @@ class TestProject {
7474 dartEntryFileName: 'main.dart' ,
7575 htmlEntryFileName:
7676 baseMode == IndexBaseMode .base ? 'base_index.html' : 'index.html' ,
77- dependencies: [TestProject .test],
7877 );
7978
8079 static final testCircular1 = TestProject ._(
@@ -83,7 +82,6 @@ class TestProject {
8382 webAssetsPath: 'web' ,
8483 dartEntryFileName: 'main.dart' ,
8584 htmlEntryFileName: 'index.html' ,
86- dependencies: [TestProject .testCircular2 ()],
8785 );
8886
8987 TestProject .testCircular2 ({IndexBaseMode baseMode = IndexBaseMode .noBase})
@@ -94,7 +92,6 @@ class TestProject {
9492 dartEntryFileName: 'main.dart' ,
9593 htmlEntryFileName:
9694 baseMode == IndexBaseMode .base ? 'base_index.html' : 'index.html' ,
97- dependencies: [TestProject .testCircular1],
9895 );
9996
10097 static final test = TestProject ._(
@@ -147,7 +144,6 @@ class TestProject {
147144 webAssetsPath: 'web' ,
148145 dartEntryFileName: 'main.dart' ,
149146 htmlEntryFileName: 'index.html' ,
150- dependencies: [TestProject .testHotRestart1],
151147 editable: true ,
152148 );
153149
@@ -184,18 +180,45 @@ class TestProject {
184180 required this .webAssetsPath,
185181 required this .dartEntryFileName,
186182 required this .htmlEntryFileName,
187- this .dependencies = const < TestProject > [],
188183 this .editable = false ,
189184 });
190185
191- static void _copyPackageIntoTempDirectory (
186+ static void _copyPackageAndPathDependenciesIntoTempDirectory (
192187 Directory tempDirectory,
193188 String packageDirectory,
189+ Set <String > copiedPackageDirectories,
194190 ) {
191+ // There may be cycles in dependencies, so check that we already copied this
192+ // package.
193+ if (copiedPackageDirectories.contains (packageDirectory)) return ;
195194 final currentPath = absolutePath (pathFromFixtures: packageDirectory);
196195 final newPath = p.join (tempDirectory.absolute.path, packageDirectory);
197196 Directory (newPath).createSync ();
198197 copyPathSync (currentPath, newPath);
198+ copiedPackageDirectories.add (packageDirectory);
199+ final pubspec = Pubspec .parse (
200+ File (p.join (currentPath, 'pubspec.yaml' )).readAsStringSync (),
201+ );
202+ for (final package in pubspec.dependencies.keys) {
203+ final dependency = pubspec.dependencies[package]! ;
204+ if (dependency is PathDependency ) {
205+ final dependencyDirectory = Directory (dependency.path);
206+ // It may be okay to do some more complicated copying here for path
207+ // dependencies that aren't immediately under `fixtures`, but for now,
208+ // only support those that are.
209+ assert (
210+ dependencyDirectory.parent == Directory (currentPath).parent,
211+ 'Path dependency of $packageDirectory : '
212+ '${dependencyDirectory .absolute .path } is not an immediate directory '
213+ 'in `fixtures`.' ,
214+ );
215+ _copyPackageAndPathDependenciesIntoTempDirectory (
216+ tempDirectory,
217+ p.dirname (dependencyDirectory.path),
218+ copiedPackageDirectories,
219+ );
220+ }
221+ }
199222 }
200223
201224 Future <void > setUp () async {
@@ -210,19 +233,11 @@ class TestProject {
210233 Directory .systemTemp.resolveSymbolicLinksSync (),
211234 );
212235 _fixturesCopy = systemTempDir.createTempSync ();
213- _copyPackageIntoTempDirectory (_fixturesCopy, packageDirectory);
214- // Also copy any of its dependencies, recursively.
215- final copiedPackages = < TestProject > {this };
216- final dependencyQueue = List <TestProject >.from (dependencies);
217- while (dependencyQueue.isNotEmpty) {
218- final dependency = dependencyQueue.removeAt (0 );
219- if (copiedPackages.contains (dependency)) continue ;
220- _copyPackageIntoTempDirectory (
221- _fixturesCopy,
222- dependency.packageDirectory,
223- );
224- dependencyQueue.addAll (dependency.dependencies);
225- }
236+ _copyPackageAndPathDependenciesIntoTempDirectory (
237+ _fixturesCopy,
238+ packageDirectory,
239+ {},
240+ );
226241 }
227242
228243 // Clean up the project.
0 commit comments