فهرست منبع

Process all jobs in one method and remove lock jobs which are not used

Nils Adermann 13 سال پیش
والد
کامیت
70e306f055
2فایلهای تغییر یافته به همراه33 افزوده شده و 57 حذف شده
  1. 0 4
      src/Composer/DependencyResolver/Rule.php
  2. 33 53
      src/Composer/DependencyResolver/Solver.php

+ 0 - 4
src/Composer/DependencyResolver/Rule.php

@@ -20,7 +20,6 @@ class Rule
     const RULE_INTERNAL_ALLOW_UPDATE = 1;
     const RULE_JOB_INSTALL = 2;
     const RULE_JOB_REMOVE = 3;
-    const RULE_JOB_LOCK = 4;
     const RULE_PACKAGE_CONFLICT = 6;
     const RULE_PACKAGE_REQUIRES = 7;
     const RULE_PACKAGE_OBSOLETES = 8;
@@ -196,9 +195,6 @@ class Rule
             case self::RULE_JOB_REMOVE:
                 return "Remove command rule ($ruleText)";
 
-            case self::RULE_JOB_LOCK:
-                return "Lock command rule ($ruleText)";
-
             case self::RULE_PACKAGE_CONFLICT:
                 $package1 = $this->literals[0]->getPackage();
                 $package2 = $this->literals[1]->getPackage();

+ 33 - 53
src/Composer/DependencyResolver/Solver.php

@@ -481,91 +481,71 @@ class Solver
         }
     }
 
-    public function solve(Request $request)
+    protected function addRulesForJobs()
     {
-        $this->jobs = $request->getJobs();
-
-        $this->setupInstalledMap();
-
-        if (version_compare(PHP_VERSION, '5.3.4', '>=')) {
-            $this->decisionMap = new \SplFixedArray($this->pool->getMaxId() + 1);
-        } else {
-            $this->decisionMap = array_fill(0, $this->pool->getMaxId() + 1, 0);
-        }
-
         foreach ($this->jobs as $job) {
-            foreach ($job['packages'] as $package) {
-                switch ($job['cmd']) {
-                    case 'update':
+            switch ($job['cmd']) {
+                case 'update':
+                    foreach ($job['packages'] as $package) {
                         if (isset($this->installedMap[$package->getId()])) {
                             $this->updateMap[$package->getId()] = true;
                         }
-                        break;
-                }
-            }
+                    }
+                break;
 
-            switch ($job['cmd']) {
                 case 'update-all':
                     foreach ($this->installedMap as $package) {
                         $this->updateMap[$package->getId()] = true;
                     }
                 break;
-            }
-        }
-
-        foreach ($this->installedMap as $package) {
-            $this->addRulesForPackage($package);
-            $this->addRulesForUpdatePackages($package);
-        }
-
-        foreach ($this->jobs as $job) {
-            foreach ($job['packages'] as $package) {
-                switch ($job['cmd']) {
-                    case 'install':
-                        $this->installCandidateMap[$package->getId()] = true;
-                        $this->addRulesForPackage($package);
-                    break;
-                }
-            }
-        }
-
-        foreach ($this->jobs as $job) {
-            switch ($job['cmd']) {
                 case 'install':
                     if (empty($job['packages'])) {
                         $problem = new Problem();
                         $problem->addJobRule($job);
                         $this->problems[] = $problem;
                     } else {
+                        foreach ($job['packages'] as $package) {
+                            if (!isset($this->installedMap[$package->getId()])) {
+                                $this->addRulesForPackage($package);
+                            }
+                        }
+
                         $rule = $this->createInstallOneOfRule($job['packages'], Rule::RULE_JOB_INSTALL, $job['packageName']);
                         $this->addRule(RuleSet::TYPE_JOB, $rule);
                         $this->ruleToJob[$rule->getId()] = $job;
                     }
-                    break;
+                break;
                 case 'remove':
                     // remove all packages with this name including uninstalled
                     // ones to make sure none of them are picked as replacements
-
-                    // todo: cleandeps
                     foreach ($job['packages'] as $package) {
                         $rule = $this->createRemoveRule($package, Rule::RULE_JOB_REMOVE);
                         $this->addRule(RuleSet::TYPE_JOB, $rule);
                         $this->ruleToJob[$rule->getId()] = $job;
                     }
-                    break;
-                case 'lock':
-                    foreach ($job['packages'] as $package) {
-                        if (isset($this->installedMap[$package->getId()])) {
-                            $rule = $this->createInstallRule($package, Rule::RULE_JOB_LOCK);
-                        } else {
-                            $rule = $this->createRemoveRule($package, Rule::RULE_JOB_LOCK);
-                        }
-                        $this->addRule(RuleSet::TYPE_JOB, $rule);
-                        $this->ruleToJob[$rule->getId()] = $job;
-                    }
                 break;
             }
         }
+    }
+
+    public function solve(Request $request)
+    {
+        $this->jobs = $request->getJobs();
+
+        $this->setupInstalledMap();
+
+        if (version_compare(PHP_VERSION, '5.3.4', '>=')) {
+            $this->decisionMap = new \SplFixedArray($this->pool->getMaxId() + 1);
+        } else {
+            $this->decisionMap = array_fill(0, $this->pool->getMaxId() + 1, 0);
+        }
+
+        foreach ($this->installedMap as $package) {
+            $this->addRulesForPackage($package);
+            $this->addRulesForUpdatePackages($package);
+        }
+
+        $this->addRulesForJobs();
 
         foreach ($this->rules as $rule) {
             $this->addWatchesToRule($rule);