Exemple #1
0
 public function checkFiles(Releases $release)
 {
     if (!$release->id) {
         throw new \LogicException('Unexpected empty release identifier in BleedingEdge::checkFiles()');
     }
     // Make sure we are given a release which exists
     if (empty($release->category_id)) {
         return;
     }
     // Set the category from the release if the model's category doesn't match
     if ($this->category_id != $release->category_id || empty($this->folder)) {
         $this->setCategory($release->category_id);
     }
     // Make sure the category was indeed set
     if (empty($this->category) || empty($this->category_id) || empty($this->folder)) {
         return;
     }
     // Can't proceed if it's not a bleedingedge category
     if ($this->category->type != 'bleedingedge') {
         return;
     }
     $potentialPrefix = substr($this->folder, 0, 5);
     $potentialPrefix = strtolower($potentialPrefix);
     $useS3 = $potentialPrefix == 's3://';
     // Safe fallback
     $folderName = $release->version;
     if ($useS3) {
         // On S3 it's always the version-as-folder, otherwise it'd take FOREVER to scan S3
         $folder = $this->folder . '/' . $release->version;
         $known_folders[] = $release->version;
     } else {
         $folderName = $this->getReleaseFolder($this->folder, $release->version, $release->alias, $release->maturity);
         if ($folderName === false) {
             // Normally this shouldn't happen!
             return;
         } else {
             $known_folders[] = $folderName;
             $folder = $this->folder . '/' . $folderName;
         }
     }
     // Do we have a changelog?
     if (empty($release->notes)) {
         $changelog = $folder . '/CHANGELOG';
         $hasChangelog = false;
         $this_changelog = '';
         if ($useS3) {
             $s3 = AmazonS3::getInstance();
             $response = $s3->getObject(substr($changelog, 5));
             $hasChangelog = $response !== false;
             if ($hasChangelog) {
                 $this_changelog = $response;
             }
         } else {
             if (\JFile::exists($changelog)) {
                 $hasChangelog = true;
                 $this_changelog = @file_get_contents($changelog);
             }
         }
         if ($hasChangelog) {
             $first_changelog = array();
             $notes = $this->coloriseChangelog($this_changelog, $first_changelog);
             $release->notes = $notes;
             $release->save();
         }
     }
     $release->getRelations()->rebase($release);
     $known_items = array();
     if ($useS3) {
         $files = array();
         $everything = $this->_listS3Contents($folder);
         $dirLength = strlen($folder) - 5;
         if (count($everything)) {
             foreach ($everything as $path => $info) {
                 if (array_key_exists('size', $info) && substr($path, -1) != '/') {
                     if (substr($path, 0, $dirLength) == substr($folder, 5)) {
                         $path = substr($path, $dirLength);
                     }
                     $path = trim($path, '/');
                     $files[] = $path;
                 }
             }
         }
     } else {
         $files = \JFolder::files($folder);
     }
     if ($release->items->count()) {
         /** @var Items $item */
         foreach ($release->items as $item) {
             $known_items[] = basename($item->filename);
             if ($item->published && !in_array(basename($item->filename), $files)) {
                 $item->unpublish();
             }
             if (!$item->published && in_array(basename($item->filename), $files)) {
                 $item->publish();
             }
         }
     }
     if (!empty($files)) {
         foreach ($files as $file) {
             if (basename($file) == 'CHANGELOG') {
                 continue;
             }
             if (in_array($file, $known_items)) {
                 continue;
             }
             \JLoader::import('joomla.utilities.date');
             $jNow = new \JDate();
             $data = array('id' => 0, 'release_id' => $release->id, 'description' => '', 'type' => 'file', 'filename' => $folderName . '/' . $file, 'url' => '', 'groups' => $release->groups, 'hits' => '0', 'published' => '1', 'created' => $jNow->toSql(), 'access' => '1');
             // Before saving the item, call the onNewARSBleedingEdgeItem()
             // event of ars plugins so that they have the chance to modify
             // this information.
             // -- Load plugins
             \JLoader::import('joomla.plugin.helper');
             \JPluginHelper::importPlugin('ars');
             // -- Setup information data
             $infoData = array('folder' => $folder, 'file' => $file, 'release_id' => $release->id, 'release' => $release);
             // -- Trigger the plugin event
             $app = \JFactory::getApplication();
             $jResponse = $app->triggerEvent('onNewARSBleedingEdgeItem', array($infoData, $data));
             // -- Merge response
             if (is_array($jResponse)) {
                 foreach ($jResponse as $response) {
                     if (is_array($response)) {
                         $data = array_merge($data, $response);
                     }
                 }
             }
             if (isset($data['ignore'])) {
                 if ($data['ignore']) {
                     continue;
                 }
             }
             /** @var Items $table */
             $table = $this->container->factory->model('Items')->tmpInstance();
             $table->create($data);
         }
     }
     if (isset($table) && is_object($table) && method_exists($table, 'reorder')) {
         $db = $table->getDbo();
         $table->reorder($db->qn('release_id') . ' = ' . $db->q($release->id));
     }
 }