From d94d29a920f742de40c5b995e9b79f0f710b1ad6 Mon Sep 17 00:00:00 2001 From: Mark Holmquist Date: Fri, 20 Sep 2013 14:52:10 -0700 Subject: [PATCH] Add meta=filerepoinfo for getting file repo info We currently only return the image repository name for imageinfo, which is not particularly useful, especially since image repositories aren't accessible via the API. This patch adds meta=filerepoinfo, which will return a list of repositories and relevant information (like the API URL for ForeignAPIRepo ones) Also returns the local repo now, and defaults to "all" in a more useful fashion. Change-Id: I1aaed0895d2a0bc224c82e93975ecf6afd8cb6b8 --- RELEASE-NOTES-1.22 | 2 + includes/AutoLoader.php | 1 + includes/api/ApiQuery.php | 1 + includes/api/ApiQueryFileRepoInfo.php | 115 ++++++++++++++++++++++++++ includes/filerepo/FileRepo.php | 16 ++++ includes/filerepo/ForeignAPIRepo.php | 20 +++++ 6 files changed, 155 insertions(+) create mode 100644 includes/api/ApiQueryFileRepoInfo.php diff --git a/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22 index 4fb948a8ee..ef205becbe 100644 --- a/RELEASE-NOTES-1.22 +++ b/RELEASE-NOTES-1.22 @@ -232,6 +232,8 @@ production. for more details regarding custom functions. ** $wgResourceLoaderLESSImportPaths is an array of file system paths. Files referenced in LESS '@import' statements are looked up here first. +* Added meta=filerepoinfo API module for getting information about foreign + image repositories, and related ForeignAPIRepo methods getInfo and getApiUrl. === Bug fixes in 1.22 === * Disable Special:PasswordReset when $wgEnableEmail is false. Previously one diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 54bffabd3a..6281d5c740 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -414,6 +414,7 @@ $wgAutoloadLocalClasses = array( 'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php', 'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php', 'ApiQueryRecentChanges' => 'includes/api/ApiQueryRecentChanges.php', + 'ApiQueryFileRepoInfo' => 'includes/api/ApiQueryFileRepoInfo.php', 'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php', 'ApiQuerySearch' => 'includes/api/ApiQuerySearch.php', 'ApiQuerySiteinfo' => 'includes/api/ApiQuerySiteinfo.php', diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index aafd5827ed..ce591184a7 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -102,6 +102,7 @@ class ApiQuery extends ApiBase { 'allmessages' => 'ApiQueryAllMessages', 'siteinfo' => 'ApiQuerySiteinfo', 'userinfo' => 'ApiQueryUserInfo', + 'filerepoinfo' => 'ApiQueryFileRepoInfo', ); /** diff --git a/includes/api/ApiQueryFileRepoInfo.php b/includes/api/ApiQueryFileRepoInfo.php new file mode 100644 index 0000000000..3a353533b0 --- /dev/null +++ b/includes/api/ApiQueryFileRepoInfo.php @@ -0,0 +1,115 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @since 1.22 + */ + +/** + * A query action to return meta information about the foreign file repos + * configured on the wiki. + * + * @ingroup API + */ +class ApiQueryFileRepoInfo extends ApiQueryBase { + + public function __construct( $query, $moduleName ) { + parent::__construct( $query, $moduleName, 'fri' ); + } + + protected function getInitialisedRepoGroup() { + $repoGroup = RepoGroup::singleton(); + + if ( !$repoGroup->reposInitialised ) { + $repoGroup->initialiseRepos(); + } + + return $repoGroup; + } + + public function execute() { + $params = $this->extractRequestParams(); + $props = array_flip( $params['prop'] ); + + $repos = array(); + + $repoGroup = $this->getInitialisedRepoGroup(); + + $repoGroup->forEachForeignRepo( function ( $repo ) use ( &$repos, $props ) { + $repos[] = array_intersect_key( $repo->getInfo(), $props ); + } ); + + $repos[] = array_intersect_key( $repoGroup->localRepo->getInfo(), $props ); + + $result = $this->getResult(); + $result->setIndexedTagName( $repos, 'repo' ); + $result->addValue( array( 'query' ), 'repos', $repos ); + } + + public function getCacheMode( $params ) { + return 'public'; + } + + public function getAllowedParams() { + $props = $this->getProps(); + + return array( + 'prop' => array( + ApiBase::PARAM_DFLT => join( '|', $props ), + ApiBase::PARAM_ISMULTI => true, + ApiBase::PARAM_TYPE => $props, + ), + ); + } + + public function getProps() { + $props = array(); + $repoGroup = $this->getInitialisedRepoGroup(); + + $repoGroup->forEachForeignRepo( function ( $repo ) use ( &$props ) { + $props = array_merge( $props, array_keys( $repo->getInfo() ) ); + } ); + + return array_values( array_unique( array_merge( $props, array_keys( $repoGroup->localRepo->getInfo() ) ) ) ); + } + + public function getParamDescription() { + $p = $this->getModulePrefix(); + return array( + 'prop' => array( + 'Which repository properties to get (there may be more available on some wikis):', + ' apiurl - URL to the repository API - helpful for getting image info from the host.', + ' name - The key of the repository - used in e.g. $wgForeignFileRepos and imageinfo return values.', + ' displayname - The human-readable name of the repository wiki.', + ' rooturl - Root URL for image paths.', + ' local - Whether that repository is the local one or not.', + ), + ); + } + + public function getDescription() { + return 'Return meta information about image repositories configured on the wiki.'; + } + + public function getExamples() { + return array( + 'api.php?action=query&meta=filerepoinfo&friprop=apiurl|name|displayname', + ); + } +} diff --git a/includes/filerepo/FileRepo.php b/includes/filerepo/FileRepo.php index bc1ad914e0..1195d5f876 100644 --- a/includes/filerepo/FileRepo.php +++ b/includes/filerepo/FileRepo.php @@ -1716,6 +1716,22 @@ class FileRepo { * @throws MWException */ protected function assertWritableRepo() {} + + + /** + * Return information about the repository. + * + * @return array + * @since 1.22 + */ + public function getInfo() { + return array( + 'name' => $this->getName(), + 'displayname' => $this->getDisplayName(), + 'rootUrl' => $this->getRootUrl(), + 'local' => $this->isLocal(), + ); + } } /** diff --git a/includes/filerepo/ForeignAPIRepo.php b/includes/filerepo/ForeignAPIRepo.php index 128412c1fd..02d83bb892 100644 --- a/includes/filerepo/ForeignAPIRepo.php +++ b/includes/filerepo/ForeignAPIRepo.php @@ -80,6 +80,14 @@ class ForeignAPIRepo extends FileRepo { } } + /** + * @return string + * @since 1.22 + */ + function getApiUrl() { + return $this->mApiBase; + } + /** * Per docs in FileRepo, this needs to return false if we don't support versioned * files. Well, we don't. @@ -416,6 +424,18 @@ class ForeignAPIRepo extends FileRepo { return Http::userAgent() . " ForeignAPIRepo/" . self::VERSION; } + /** + * Get information about the repo - overrides/extends the parent + * class's information. + * @return array + * @since 1.22 + */ + function getInfo() { + $info = parent::getInfo(); + $info['apiurl'] = $this->getApiUrl(); + return $info; + } + /** * Like a Http:get request, but with custom User-Agent. * @see Http:get -- 2.20.1