protected function mergePackages(Package $oldPackage, Package $newPackage) { $oldPackage->setUpdatedAt(new \DateTime()); $oldPackage->setDescription($newPackage->getDescription()); // Remove all versions that do not exist anymore and update the existing versions: foreach ($oldPackage->getVersions() as $version) { $newVersion = $this->findVersion($newPackage, $version); if (!$newVersion) { $oldPackage->removeVersion($version); } else { $version->setReferenceHash($newVersion->getReferenceHash()); $version->setLicense($newVersion->getLicense()); $version->setUpdatedAt(new \DateTime()); $this->mergeDependencies($version, $newVersion); } } // Add the new versions: foreach ($newPackage->getVersions() as $version) { $oldVersion = $this->findVersion($oldPackage, $version); if ($oldVersion === null) { $oldPackage->addVersion($version); } } }