14
14
use Composer \Composer ;
15
15
use Composer \DependencyResolver \Pool ;
16
16
use Composer \Factory ;
17
- use Composer \Json \JsonFile ;
18
17
use Composer \Json \JsonManipulator ;
19
18
use Composer \Package \Version \VersionSelector ;
20
19
use Composer \Repository \CompositeRepository ;
@@ -26,18 +25,25 @@ class Unpacker
26
25
{
27
26
private $ composer ;
28
27
private $ resolver ;
28
+ private $ dryRun ;
29
+ private $ jsonPath ;
30
+ private $ manipulator ;
29
31
30
- public function __construct (Composer $ composer , PackageResolver $ resolver )
32
+ public function __construct (Composer $ composer , PackageResolver $ resolver, bool $ dryRun )
31
33
{
32
34
$ this ->composer = $ composer ;
33
35
$ this ->resolver = $ resolver ;
36
+ $ this ->dryRun = $ dryRun ;
34
37
}
35
38
36
- public function unpack (Operation $ op ): Result
39
+ public function unpack (Operation $ op, Result $ result = null ): Result
37
40
{
38
- $ result = new Result ();
39
- $ json = new JsonFile (Factory::getComposerFile ());
40
- $ manipulator = new JsonManipulator (file_get_contents ($ json ->getPath ()));
41
+ if (null === $ result ) {
42
+ $ result = new Result ();
43
+ $ this ->jsonPath = Factory::getComposerFile ();
44
+ $ this ->manipulator = new JsonManipulator (file_get_contents ($ this ->jsonPath ));
45
+ }
46
+
41
47
$ localRepo = $ this ->composer ->getRepositoryManager ()->getLocalRepository ();
42
48
foreach ($ op ->getPackages () as $ package ) {
43
49
$ pkg = $ localRepo ->findPackage ($ package ['name ' ], $ package ['version ' ] ?: '* ' );
@@ -55,8 +61,11 @@ public function unpack(Operation $op): Result
55
61
continue ;
56
62
}
57
63
64
+ if (!$ result ->addUnpacked ($ pkg )) {
65
+ continue ;
66
+ }
67
+
58
68
$ versionSelector = null ;
59
- $ result ->addUnpacked ($ pkg );
60
69
foreach ($ pkg ->getRequires () as $ link ) {
61
70
if ('php ' === $ link ->getTarget ()) {
62
71
continue ;
@@ -65,24 +74,35 @@ public function unpack(Operation $op): Result
65
74
$ constraint = $ link ->getPrettyConstraint ();
66
75
$ constraint = substr ($ this ->resolver ->parseVersion ($ link ->getTarget (), $ constraint , !$ package ['dev ' ]), 1 ) ?: $ constraint ;
67
76
68
- if (' * ' === $ constraint && $ subPkg = $ localRepo ->findPackage ($ link ->getTarget (), '* ' )) {
69
- if (null === $ versionSelector ) {
70
- $ pool = class_exists (RepositorySet::class) ? RepositorySet::class : Pool::class ;
71
- $ pool = new $ pool ( $ this -> composer -> getPackage ()-> getMinimumStability (), $ this -> composer -> getPackage ()-> getStabilityFlags () );
72
- $ pool -> addRepository ( new CompositeRepository ( $ this ->composer -> getRepositoryManager ()-> getRepositories ()) );
73
- $ versionSelector = new VersionSelector ( $ pool ) ;
77
+ if ($ subPkg = $ localRepo ->findPackage ($ link ->getTarget (), '* ' )) {
78
+ if (' symfony-pack ' === $ subPkg -> getType () ) {
79
+ $ subOp = new Operation ( true , $ op -> shouldSort ()) ;
80
+ $ subOp -> addPackage ( $ subPkg -> getName (), $ constraint , $ package [ ' dev ' ] );
81
+ $ result = $ this ->unpack ( $ subOp , $ result );
82
+ continue ;
74
83
}
75
84
76
- $ constraint = $ versionSelector ->findRecommendedRequireVersion ($ subPkg );
85
+ if ('* ' === $ constraint ) {
86
+ if (null === $ versionSelector ) {
87
+ $ pool = class_exists (RepositorySet::class) ? RepositorySet::class : Pool::class;
88
+ $ pool = new $ pool ($ this ->composer ->getPackage ()->getMinimumStability (), $ this ->composer ->getPackage ()->getStabilityFlags ());
89
+ $ pool ->addRepository (new CompositeRepository ($ this ->composer ->getRepositoryManager ()->getRepositories ()));
90
+ $ versionSelector = new VersionSelector ($ pool );
91
+ }
92
+
93
+ $ constraint = $ versionSelector ->findRecommendedRequireVersion ($ subPkg );
94
+ }
77
95
}
78
96
79
- if (!$ manipulator ->addLink ($ package ['dev ' ] ? 'require-dev ' : 'require ' , $ link ->getTarget (), $ constraint , $ op ->shouldSort ())) {
97
+ if (!$ this -> manipulator ->addLink ($ package ['dev ' ] ? 'require-dev ' : 'require ' , $ link ->getTarget (), $ constraint , $ op ->shouldSort ())) {
80
98
throw new \RuntimeException (sprintf ('Unable to unpack package "%s". ' , $ link ->getTarget ()));
81
99
}
82
100
}
83
101
}
84
102
85
- file_put_contents ($ json ->getPath (), $ manipulator ->getContents ());
103
+ if (!$ this ->dryRun && 1 === \func_num_args ()) {
104
+ file_put_contents ($ this ->jsonPath , $ this ->manipulator ->getContents ());
105
+ }
86
106
87
107
return $ result ;
88
108
}
0 commit comments