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)); } }