1
0
Fork 0

Merge pull request #3985 from Seldaek/update-urls

Check if package URLs are up to date after composer update is done
pull/3130/merge
Nils Adermann 2015-04-30 17:48:43 +02:00
commit cb44f209f8
2 changed files with 139 additions and 1 deletions

View File

@ -610,6 +610,12 @@ class Installer
}
}
if (!$this->dryRun) {
// force source/dist urls to be updated for all packages
$operations = $this->processPackageUrls($pool, $policy, $localRepo, $repositories);
$localRepo->write();
}
return 0;
}
@ -860,7 +866,7 @@ class Installer
}
if ($task === 'force-updates') {
// force installed package to update to referenced version if it does not match the installed version
// force installed package to update to referenced version in root package if it does not match the installed version
$references = $this->package->getReferences();
if (isset($references[$package->getName()]) && $references[$package->getName()] !== $package->getSourceReference()) {
@ -894,6 +900,42 @@ class Installer
return $normalizedAliases;
}
private function processPackageUrls($pool, $policy, $localRepo, $repositories)
{
if (!$this->update) {
return;
}
foreach ($localRepo->getCanonicalPackages() as $package) {
// find similar packages (name/version) in all repositories
$matches = $pool->whatProvides($package->getName(), new VersionConstraint('=', $package->getVersion()));
foreach ($matches as $index => $match) {
// skip local packages
if (!in_array($match->getRepository(), $repositories, true)) {
unset($matches[$index]);
continue;
}
// skip providers/replacers
if ($match->getName() !== $package->getName()) {
unset($matches[$index]);
continue;
}
$matches[$index] = $match->getId();
}
// select preferred package according to policy rules
if ($matches && $matches = $policy->selectPreferredPackages($pool, array(), $matches)) {
$newPackage = $pool->literalToPackage($matches[0]);
// update the dist and source URLs
$package->setSourceUrl($newPackage->getSourceUrl());
$package->setDistUrl($newPackage->getDistUrl());
}
}
}
private function aliasPlatformPackages(PlatformRepository $platformRepo, $aliases)
{
foreach ($aliases as $package => $versions) {

View File

@ -0,0 +1,96 @@
--TEST--
Updating dev packages where no reference change happened triggers a repo url change
--COMPOSER--
{
"repositories": [
{
"type": "package",
"package": [
{
"name": "a/a", "version": "dev-master",
"extra": { "branch-alias": { "dev-master": "2.1.x-dev" } },
"source": { "reference": "newmaster", "type": "git", "url": "newurl" }
},
{
"name": "b/b", "version": "dev-master",
"extra": { "branch-alias": { "dev-master": "2.1.x-dev" } },
"source": { "reference": "master", "type": "git", "url": "newurl" }
}
]
}
],
"require": {
"a/a": "~2.1",
"b/b": "~2.1"
},
"minimum-stability": "dev"
}
--INSTALLED--
[
{
"name": "a/a", "version": "dev-master", "version_normalized": "9999999-dev",
"extra": { "branch-alias": { "dev-master": "2.1.x-dev" } },
"source": { "reference": "oldmaster", "type": "git", "url": "oldurl" },
"type": "library"
},
{
"name": "b/b", "version": "dev-master", "version_normalized": "9999999-dev",
"extra": { "branch-alias": { "dev-master": "2.1.x-dev" } },
"source": { "reference": "master", "type": "git", "url": "oldurl" },
"type": "library"
}
]
--LOCK--
{
"packages": [
{
"name": "a/a", "version": "dev-master",
"extra": { "branch-alias": { "dev-master": "2.1.x-dev" } },
"source": { "reference": "newmaster", "type": "git", "url": "oldurl" },
"type": "library"
},
{
"name": "b/b", "version": "dev-master",
"extra": { "branch-alias": { "dev-master": "2.1.x-dev" } },
"source": { "reference": "master", "type": "git", "url": "oldurl" },
"type": "library"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "dev",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": []
}
--RUN--
update
--EXPECT-LOCK--
{
"packages": [
{
"name": "a/a", "version": "dev-master",
"extra": { "branch-alias": { "dev-master": "2.1.x-dev" } },
"source": { "reference": "newmaster", "type": "git", "url": "newurl" },
"type": "library"
},
{
"name": "b/b", "version": "dev-master",
"extra": { "branch-alias": { "dev-master": "2.1.x-dev" } },
"source": { "reference": "master", "type": "git", "url": "newurl" },
"type": "library"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "dev",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": []
}
--EXPECT--
Updating a/a (dev-master oldmaster) to a/a (dev-master newmaster)