diff --git a/administrator/components/com_patchtester/config.xml b/administrator/components/com_patchtester/config.xml index 639244b..385e18e 100644 --- a/administrator/components/com_patchtester/config.xml +++ b/administrator/components/com_patchtester/config.xml @@ -29,7 +29,7 @@ - diff --git a/administrator/components/com_patchtester/controller.php b/administrator/components/com_patchtester/controller.php index 441d499..135a189 100644 --- a/administrator/components/com_patchtester/controller.php +++ b/administrator/components/com_patchtester/controller.php @@ -23,4 +23,32 @@ class PatchTesterController extends JControllerLegacy * @since 1.0 */ protected $default_view = 'pulls'; + + /** + * Method to purge the cache + * + * @return void + * + * @since 2.0 + */ + public function purge() + { + // Check for request forgeries + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + jimport('joomla.filesystem.file'); + + if (file_exists(JPATH_CACHE . '/patchtester.json') && !JFile::delete(JPATH_CACHE . '/patchtester.json')) + { + $msg = JText::_('COM_PATCHTESTER_PURGE_FAIL'); + $msgType = 'error'; + } + else + { + $msg = JText::_('COM_PATCHTESTER_PURGE_SUCCESS'); + $msgType = 'message'; + } + + $this->setRedirect('index.php?option=com_patchtester&view=pulls', $msg, $msgType); + } } diff --git a/administrator/components/com_patchtester/language/en-GB/en-GB.com_patchtester.ini b/administrator/components/com_patchtester/language/en-GB/en-GB.com_patchtester.ini index 5b1e77b..8313d96 100644 --- a/administrator/components/com_patchtester/language/en-GB/en-GB.com_patchtester.ini +++ b/administrator/components/com_patchtester/language/en-GB/en-GB.com_patchtester.ini @@ -33,6 +33,9 @@ COM_PATCHTESTER_NO_CREDENTIALS="No user credentials are saved, this will allow o COM_PATCHTESTER_NOT_APPLIED="Not Applied" COM_PATCHTESTER_OPEN_IN_GITHUB="Open in GitHub" COM_PATCHTESTER_OPEN_IN_JOOMLACODE="Open in JoomlaCode" +COM_PATCHTESTER_PURGE_CACHE="Purge Cache" +COM_PATCHTESTER_PURGE_FAIL="Could not purge the cache" +COM_PATCHTESTER_PURGE_SUCCESS="Cache purged successfully" COM_PATCHTESTER_REPO_IS_GONE="The patch could not be applied because the repository is missing" COM_PATCHTESTER_REVERT_OK="Patch successfully reverted" COM_PATCHTESTER_REVERT_PATCH="Revert Patch" diff --git a/administrator/components/com_patchtester/models/pulls.php b/administrator/components/com_patchtester/models/pulls.php index 52c56d6..925eeda 100644 --- a/administrator/components/com_patchtester/models/pulls.php +++ b/administrator/components/com_patchtester/models/pulls.php @@ -164,64 +164,35 @@ class PatchtesterModelPulls extends JModelList $this->ordering = $this->getState('list.ordering', 'title'); $this->orderDir = $this->getState('list.direction', 'asc'); - $search = $this->getState('filter.search'); - $searchId = $this->getState('filter.searchid'); - - $page = $this->getPagination()->pagesCurrent; try { - // If over the API limit, we can't build this list - // TODO - Cache the request data in case of API limiting - if ($this->rate->remaining > 0) + $cacheFile = JPATH_CACHE . '/patchtester.json'; + $params = $this->getState('params'); + + // Check if caching is enabled + if ($params->get('cache', 1) == 1) { - $pulls = $this->github->pulls->getList($this->getState('github_user'), $this->getState('github_repo'), 'open', $page); - usort($pulls, array($this, 'sortItems')); + // Fetch cache time from component parameters and convert to seconds + $cacheTime = $params->get('cache_lifetime', 60); + $cacheTime = $cacheTime * 60; - foreach ($pulls as $i => &$pull) + // Cache files expired? + if (!file_exists($cacheFile) || (time() - @filemtime($cacheFile) > $cacheTime)) { - if ($search && false === strpos($pull->title, $search)) - { - unset($pulls[$i]); - continue; - } - - if ($searchId && $pull->number != $searchId) - { - unset($pulls[$i]); - continue; - } - - // Try to find a Joomlacode issue number - $pulls[$i]->joomlacode_issue = 0; - - $matches = array(); - - preg_match('#\[\#([0-9]+)\]#', $pull->title, $matches); - - if (isset($matches[1])) - { - $pulls[$i]->joomlacode_issue = (int) $matches[1]; - } - else - { - preg_match('#(http://joomlacode[-\w\./\?\S]+)#', $pull->body, $matches); - - if (isset($matches[1])) - { - preg_match('#tracker_item_id=([0-9]+)#', $matches[1], $matches); - - if (isset($matches[1])) - { - $pulls[$i]->joomlacode_issue = (int) $matches[1]; - } - } - } + // Do a request to the GitHub API for new data + $pulls = $this->requestFromGithub(); + } + else + { + // Render from the cached data + $pulls = json_decode(file_get_contents($cacheFile)); } } else { - $pulls = array(); + // No caching, request from GitHub + $pulls = $this->requestFromGithub(); } return $pulls; @@ -234,6 +205,83 @@ class PatchtesterModelPulls extends JModelList } } + /** + * Method to request new data from GitHub + * + * @return array Pull request data + * + * @since 2.0 + */ + protected function requestFromGithub() + { + // If over the API limit, we can't build this list + if ($this->rate->remaining > 0) + { + $page = $this->getPagination()->pagesCurrent; + $search = $this->getState('filter.search'); + $searchId = $this->getState('filter.searchid'); + + $pulls = $this->github->pulls->getList($this->getState('github_user'), $this->getState('github_repo'), 'open', $page); + usort($pulls, array($this, 'sortItems')); + + foreach ($pulls as $i => &$pull) + { + if ($search && false === strpos($pull->title, $search)) + { + unset($pulls[$i]); + continue; + } + + if ($searchId && $pull->number != $searchId) + { + unset($pulls[$i]); + continue; + } + + // Try to find a Joomlacode issue number + $pulls[$i]->joomlacode_issue = 0; + + $matches = array(); + + preg_match('#\[\#([0-9]+)\]#', $pull->title, $matches); + + if (isset($matches[1])) + { + $pulls[$i]->joomlacode_issue = (int) $matches[1]; + } + else + { + preg_match('#(http://joomlacode[-\w\./\?\S]+)#', $pull->body, $matches); + + if (isset($matches[1])) + { + preg_match('#tracker_item_id=([0-9]+)#', $matches[1], $matches); + + if (isset($matches[1])) + { + $pulls[$i]->joomlacode_issue = (int) $matches[1]; + } + } + } + } + + // If caching is enabled, save the request data + $params = $this->getState('params'); + + if ($params->get('cache') == 1) + { + $data = json_encode($pulls); + file_put_contents(JPATH_CACHE . '/patchtester.json', $data); + } + } + else + { + $pulls = array(); + } + + return $pulls; + } + /** * Method to sort the items array * diff --git a/administrator/components/com_patchtester/views/pulls/view.html.php b/administrator/components/com_patchtester/views/pulls/view.html.php index 5332555..cf74c5e 100644 --- a/administrator/components/com_patchtester/views/pulls/view.html.php +++ b/administrator/components/com_patchtester/views/pulls/view.html.php @@ -117,6 +117,7 @@ class PatchtesterViewPulls extends JViewLegacy protected function addToolbar() { JToolBarHelper::title(JText::_('COM_PATCHTESTER'), 'patchtester'); + JToolbarHelper::custom('purge', 'delete.png', 'delete_f2.png', 'COM_PATCHTESTER_PURGE_CACHE', false); JToolBarHelper::preferences('com_patchtester'); JFactory::getDocument()->addStyleDeclaration(