/**
  * Imports versions from GitHub repository.
  *
  * @param \NetteAddons\Model\Addon
  * @return \NetteAddons\Model\AddonVersion[]
  * @throws \NetteAddons\IOException
  */
 public function importVersions(Addon $addon)
 {
     $versions = array();
     foreach ($this->getVersions() as $v => $hash) {
         $composer = $this->getComposerJson($hash);
         $version = new AddonVersion();
         $version->addon = $addon;
         // version
         if ($composer && isset($composer->version)) {
             $version->version = $composer->version;
             // warning: multiple tags may have the same composer version
         } else {
             $version->version = $v;
         }
         // license
         if ($composer && isset($composer->license)) {
             $version->license = implode(', ', (array) $composer->license);
         } else {
             $version->license = $addon->defaultLicense;
         }
         // package links
         if ($composer) {
             foreach (AddonVersion::getLinkTypes() as $key => $type) {
                 if (!empty($composer->{$type})) {
                     $version->{$key} = get_object_vars($composer->{$type});
                 }
             }
         }
         // time
         if ($composer && isset($composer->time)) {
             $version->updatedAt = new \DateTime($composer->time);
         } else {
             $version->updatedAt = new \DateTime($this->repository->getCommit($hash)->commit->author->date);
         }
         // dist
         $version->distType = 'zip';
         $version->distUrl = $this->repository->getArchiveLink('zip', $hash);
         // source
         $version->sourceType = 'git';
         $version->sourceUrl = $addon->repository;
         $version->sourceReference = $hash;
         // composer.json
         $version->composerJson = Utils\Composer::createComposerJson($version, $composer);
         $versions[$version->version] = $version;
         // ensures that versions are unique
     }
     return array_values($versions);
 }
 /**
  * Creates new addon version from values and adds it to addon.
  *
  * @param \NetteAddons\Model\Addon
  * @param array
  * @param \Nette\Security\IIdentity
  * @param \NetteAddons\Model\Utils\VersionParser
  * @return \NetteAddons\Model\AddonVersion
  * @throws \NetteAddons\InvalidArgumentException
  * @throws \NetteAddons\IOException
  */
 public function addVersionFromValues(Addon $addon, $values, IIdentity $owner, VersionParser $versionParser)
 {
     if (!$values->license) {
         throw new \NetteAddons\InvalidArgumentException("License is mandatory.");
     }
     if (!$values->version) {
         throw new \NetteAddons\InvalidArgumentException("Version is mandatory.");
     }
     $version = new AddonVersion();
     $version->addon = $addon;
     $version->version = $versionParser->parseTag($values->version);
     $version->license = is_array($values->license) ? implode(', ', $values->license) : $values->license;
     $version->distType = 'zip';
     $version->distUrl = $values->archiveLink;
     $version->composerJson = Composer::createComposerJson($version);
     $version->composerJson->authors = array((object) array('name' => $owner->realname, 'email' => $owner->email));
     $addon->versions[] = $version;
     return $version;
 }