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);
         }
     }
 }
 private function parsePackageJson($json)
 {
     $package = new Package();
     $package->setCreatedAt(new \DateTime());
     $package->setUpdatedAt(new \DateTime());
     if (isset($json->name)) {
         list($vendorName, $packageName) = explode('/', $json->name, 2);
         $vendor = new Vendor();
         $vendor->setName($vendorName);
         $package->setName($packageName);
         $package->setVendor($vendor);
         $package->setFullname($json->name);
     }
     if (isset($json->description)) {
         $package->setDescription($json->description);
     }
     return $package;
 }