Skip to content

Commit b0297ef

Browse files
committedApr 2, 2013
Add prefer-stable flag to pick stable package over unstable ones when possible
1 parent fc54a48 commit b0297ef

File tree

6 files changed

+76
-2
lines changed

6 files changed

+76
-2
lines changed
 

‎res/composer-schema.json

+4
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,10 @@
221221
"type": ["string"],
222222
"description": "The minimum stability the packages must have to be install-able. Possible values are: dev, alpha, beta, RC, stable."
223223
},
224+
"prefer-stable": {
225+
"type": ["boolean"],
226+
"description": "If set to true, stable packages will be prefered to dev packages when possible, even if the minimum-stability allows unstable packages."
227+
},
224228
"bin": {
225229
"type": ["array"],
226230
"description": "A set of files that should be treated as binaries and symlinked into bin-dir (from config).",

‎src/Composer/DependencyResolver/DefaultPolicy.php

+13
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,28 @@
1414

1515
use Composer\Package\PackageInterface;
1616
use Composer\Package\AliasPackage;
17+
use Composer\Package\BasePackage;
1718
use Composer\Package\LinkConstraint\VersionConstraint;
1819

1920
/**
2021
* @author Nils Adermann <naderman@naderman.de>
22+
* @author Jordi Boggiano <j.boggiano@seld.be>
2123
*/
2224
class DefaultPolicy implements PolicyInterface
2325
{
26+
private $preferStable;
27+
28+
public function __construct($preferStable = false)
29+
{
30+
$this->preferStable = $preferStable;
31+
}
32+
2433
public function versionCompare(PackageInterface $a, PackageInterface $b, $operator)
2534
{
35+
if ($this->preferStable && ($stabA = $a->getStability()) !== ($stabB = $b->getStability())) {
36+
return BasePackage::$stabilities[$stabA] < BasePackage::$stabilities[$stabB];
37+
}
38+
2639
$constraint = new VersionConstraint($operator, $b->getVersion());
2740
$version = new VersionConstraint('==', $a->getVersion());
2841

‎src/Composer/Installer.php

+7-2
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ public function run()
234234

235235
// split dev and non-dev requirements by checking what would be removed if we update without the dev requirements
236236
if ($this->devMode && $this->package->getDevRequires()) {
237-
$policy = new DefaultPolicy();
237+
$policy = $this->createPolicy();
238238
$pool = $this->createPool();
239239
$pool->addRepository($installedRepo, $aliases);
240240

@@ -308,7 +308,7 @@ protected function doInstall($localRepo, $installedRepo, $platformRepo, $aliases
308308
$this->io->write('<info>Loading composer repositories with package information</info>');
309309

310310
// creating repository pool
311-
$policy = new DefaultPolicy();
311+
$policy = $this->createPolicy();
312312
$pool = $this->createPool();
313313
$pool->addRepository($installedRepo, $aliases);
314314
if ($installFromLock) {
@@ -513,6 +513,11 @@ private function createPool()
513513
return new Pool($minimumStability, $stabilityFlags);
514514
}
515515

516+
private function createPolicy()
517+
{
518+
return new DefaultPolicy($this->package->getPreferStable());
519+
}
520+
516521
private function createRequest(Pool $pool, RootPackageInterface $rootPackage, PlatformRepository $platformRepo)
517522
{
518523
$request = new Request($pool);

‎src/Composer/Package/Loader/RootPackageLoader.php

+4
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ public function load(array $config, $class = 'Composer\Package\RootPackage')
9191
$package->setMinimumStability(VersionParser::normalizeStability($config['minimum-stability']));
9292
}
9393

94+
if (isset($config['prefer-stable'])) {
95+
$package->setPreferStable((bool) $config['prefer-stable']);
96+
}
97+
9498
$repos = Factory::createDefaultRepositories(null, $this->config, $this->manager);
9599
foreach ($repos as $repo) {
96100
$this->manager->addRepository($repo);

‎src/Composer/Package/RootPackage.php

+19
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
class RootPackage extends CompletePackage implements RootPackageInterface
2121
{
2222
protected $minimumStability = 'stable';
23+
protected $preferStable = false;
2324
protected $stabilityFlags = array();
2425
protected $references = array();
2526

@@ -59,6 +60,24 @@ public function getStabilityFlags()
5960
return $this->stabilityFlags;
6061
}
6162

63+
/**
64+
* Set the preferStable
65+
*
66+
* @param bool $preferStable
67+
*/
68+
public function setPreferStable($preferStable)
69+
{
70+
$this->preferStable = $preferStable;
71+
}
72+
73+
/**
74+
* {@inheritDoc}
75+
*/
76+
public function getPreferStable()
77+
{
78+
return $this->preferStable;
79+
}
80+
6281
/**
6382
* Set the references
6483
*

‎tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php

+29
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,35 @@ public function testSelectNewest()
6565
$this->assertEquals($expected, $selected);
6666
}
6767

68+
public function testSelectNewestPicksLatest()
69+
{
70+
$this->repo->addPackage($packageA1 = $this->getPackage('A', '1.0.0'));
71+
$this->repo->addPackage($packageA2 = $this->getPackage('A', '1.0.1-alpha'));
72+
$this->pool->addRepository($this->repo);
73+
74+
$literals = array($packageA1->getId(), $packageA2->getId());
75+
$expected = array($packageA2->getId());
76+
77+
$selected = $this->policy->selectPreferedPackages($this->pool, array(), $literals);
78+
79+
$this->assertEquals($expected, $selected);
80+
}
81+
82+
public function testSelectNewestPicksLatestStableWithPreferStable()
83+
{
84+
$this->repo->addPackage($packageA1 = $this->getPackage('A', '1.0.0'));
85+
$this->repo->addPackage($packageA2 = $this->getPackage('A', '1.0.1-alpha'));
86+
$this->pool->addRepository($this->repo);
87+
88+
$literals = array($packageA1->getId(), $packageA2->getId());
89+
$expected = array($packageA1->getId());
90+
91+
$policy = new DefaultPolicy(true);
92+
$selected = $policy->selectPreferedPackages($this->pool, array(), $literals);
93+
94+
$this->assertEquals($expected, $selected);
95+
}
96+
6897
public function testSelectNewestOverInstalled()
6998
{
7099
$this->repo->addPackage($packageA = $this->getPackage('A', '2.0'));

0 commit comments

Comments
 (0)
Please sign in to comment.