Skip to content

Commit c4824c6

Browse files
committed
Add hasReference to check if an installed package has the right sourceReference.
Modify add function to also update installed packages, remove exception, it is only called if a package is added or updated. Update InstalledPackage and InstalledPackageDumper to save and load new sourceReference variable. Check and send source reference for installed/updated packages. Fix tests for above changes.
1 parent 05a4a6d commit c4824c6

File tree

6 files changed

+75
-20
lines changed

6 files changed

+75
-20
lines changed

src/MagentoHackathon/Composer/Magento/InstalledPackage.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ class InstalledPackage
1919
*/
2020
protected $version;
2121

22+
/**
23+
* @var string
24+
*/
25+
protected $sourceReference;
26+
2227
/**
2328
* @var array
2429
*/
@@ -28,12 +33,14 @@ class InstalledPackage
2833
* @param string $name
2934
* @param string $version
3035
* @param array $files
36+
* @param string $reference
3137
*/
32-
public function __construct($name, $version, array $files)
38+
public function __construct($name, $version, array $files, $reference = null)
3339
{
3440
$this->name = $name;
3541
$this->installedFiles = $files;
3642
$this->version = $version;
43+
$this->sourceReference = $reference;
3744
}
3845

3946
/**
@@ -52,6 +59,14 @@ public function getVersion()
5259
return $this->version;
5360
}
5461

62+
/**
63+
* @return string
64+
*/
65+
public function getSourceReference()
66+
{
67+
return $this->sourceReference;
68+
}
69+
5570
/**
5671
* @return string
5772
*/

src/MagentoHackathon/Composer/Magento/InstalledPackageDumper.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ class InstalledPackageDumper
1515
public function dump(InstalledPackage $installedPackage)
1616
{
1717
return array(
18-
'packageName' => $installedPackage->getName(),
19-
'version' => $installedPackage->getVersion(),
20-
'installedFiles' => $installedPackage->getInstalledFiles(),
18+
'packageName' => $installedPackage->getName(),
19+
'version' => $installedPackage->getVersion(),
20+
'installedFiles' => $installedPackage->getInstalledFiles(),
21+
'sourceReference' => $installedPackage->getSourceReference(),
2122
);
2223
}
2324

@@ -27,6 +28,12 @@ public function dump(InstalledPackage $installedPackage)
2728
*/
2829
public function restore(array $data)
2930
{
30-
return new InstalledPackage($data['packageName'], $data['version'], $data['installedFiles']);
31+
$data['sourceReference'] = isset($data['sourceReference']) ? $data['sourceReference'] : null;
32+
return new InstalledPackage(
33+
$data['packageName'],
34+
$data['version'],
35+
$data['installedFiles'],
36+
$data['sourceReference']
37+
);
3138
}
3239
}

src/MagentoHackathon/Composer/Magento/ModuleManager.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ public function updateInstalledPackages(array $currentComposerInstalledPackages)
102102
$this->installedPackageRepository->add(new InstalledPackage(
103103
$install->getName(),
104104
$install->getVersion(),
105-
$files
105+
$files,
106+
$install->getSourceReference()
106107
));
107108
}
108109

@@ -169,9 +170,12 @@ public function getInstalls(array $currentComposerInstalledPackages)
169170
{
170171
$repo = $this->installedPackageRepository;
171172
$packages = array_filter($currentComposerInstalledPackages, function(PackageInterface $package) use ($repo) {
172-
return !$repo->has($package->getName(), $package->getVersion());
173+
return (
174+
!$repo->has($package->getName(), $package->getVersion())
175+
|| !$repo->hasReference($package->getName(),$package->getSourceReference())
176+
);
173177
});
174-
178+
175179
$config = $this->config;
176180
usort($packages, function(PackageInterface $aObject, PackageInterface $bObject) use ($config) {
177181
$a = $config->getModuleSpecificSortValue($aObject->getName());
@@ -186,7 +190,7 @@ public function getInstalls(array $currentComposerInstalledPackages)
186190
}
187191
return ($a < $b) ? -1 : 1;
188192
});
189-
193+
190194
return $packages;
191195
}
192196

src/MagentoHackathon/Composer/Magento/Repository/InstalledPackageFileSystemRepository.php

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,30 @@ public function has($packageName, $version = null)
113113
}
114114
}
115115

116+
/**
117+
* If source reference specified, perform a strict check,
118+
* which only returns true if repository has the package in the specified source reference
119+
*
120+
* @param string $packageName
121+
* @param string $reference
122+
* @return bool
123+
*/
124+
public function hasReference($packageName, $reference = null)
125+
{
126+
$this->load();
127+
try {
128+
$package = $this->findByPackageName($packageName);
129+
130+
if (null === $reference) {
131+
return true;
132+
}
133+
134+
return $package->getSourceReference() === $reference;
135+
} catch (\Exception $e) {
136+
return false;
137+
}
138+
}
139+
116140
/**
117141
* @param InstalledPackage $package
118142
* @throws \Exception
@@ -121,15 +145,20 @@ public function add(InstalledPackage $package)
121145
{
122146
$this->load();
123147

148+
$this->hasChanges = true;
149+
124150
try {
125151
$this->findByPackageName($package->getName());
152+
foreach ($this->packages as &$installedPackage) {
153+
if ($installedPackage->getName() === $package->getName()) {
154+
$installedPackage = $package;
155+
}
156+
}
126157
} catch (\Exception $e) {
127158
$this->packages[] = $package;
128-
$this->hasChanges = true;
129159
return;
130160
}
131161

132-
throw new \Exception(sprintf('Package: "%s" is already installed', $package->getName()));
133162
}
134163

135164
/**

src/MagentoHackathon/Composer/Magento/Repository/InstalledPackageRepositoryInterface.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,12 @@ public function add(InstalledPackage $package);
4040
* @return bool
4141
*/
4242
public function has($packageName, $version = null);
43+
44+
/**
45+
* @param string $packageName
46+
* @param string $reference
47+
* @return bool
48+
*/
49+
50+
public function hasReference($packageName, $reference = null);
4351
}

tests/MagentoHackathon/Composer/Magento/Repository/InstalledFilesFilesystemRepositoryTest.php

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,6 @@ public function testGetInstalledMappingsReturnsMappingsCorrectly()
8282
$this->assertInstanceOf('MagentoHackathon\Composer\Magento\InstalledPackage', $package);
8383
}
8484

85-
public function testExceptionIsThrownIfDuplicatePackageIsAdded()
86-
{
87-
$this->setExpectedException('Exception', 'Package: "some-package" is already installed');
88-
89-
$package = new InstalledPackage('some-package', '1.0.0', array());
90-
$this->repository->add($package);
91-
$this->repository->add($package);
92-
}
93-
9485
public function testAddInstalledMappings()
9586
{
9687
$files = array(
@@ -103,6 +94,7 @@ public function testAddInstalledMappings()
10394
'packageName' => 'some-package',
10495
'version' => '1.0.0',
10596
'installedFiles' => $files,
97+
'sourceReference' => null
10698
));
10799
$package = new InstalledPackage('some-package', '1.0.0', $files);
108100
$this->repository->add($package);

0 commit comments

Comments
 (0)