diff options
author | Brian Evans <grknight@gentoo.org> | 2020-10-02 15:24:06 -0400 |
---|---|---|
committer | Brian Evans <grknight@gentoo.org> | 2020-10-02 15:24:06 -0400 |
commit | 60dd5fd95847643eab04ce173f0774c9c584e795 (patch) | |
tree | 52299ac4e3c5c69df75997bfd7d62b71ef9e0089 /MLEB/LocalisationUpdate/includes/Fetcher/GitHubFetcher.php | |
parent | Update Widgets to 1.35 (diff) | |
download | extensions-60dd5fd95847643eab04ce173f0774c9c584e795.tar.gz extensions-60dd5fd95847643eab04ce173f0774c9c584e795.tar.bz2 extensions-60dd5fd95847643eab04ce173f0774c9c584e795.zip |
Update MLEB to 2020.07
Signed-off-by: Brian Evans <grknight@gentoo.org>
Diffstat (limited to 'MLEB/LocalisationUpdate/includes/Fetcher/GitHubFetcher.php')
-rw-r--r-- | MLEB/LocalisationUpdate/includes/Fetcher/GitHubFetcher.php | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/MLEB/LocalisationUpdate/includes/Fetcher/GitHubFetcher.php b/MLEB/LocalisationUpdate/includes/Fetcher/GitHubFetcher.php new file mode 100644 index 00000000..eba89a9e --- /dev/null +++ b/MLEB/LocalisationUpdate/includes/Fetcher/GitHubFetcher.php @@ -0,0 +1,49 @@ +<?php +/** + * @file + * @author Niklas Laxström + * @license GPL-2.0-or-later + */ + +namespace LocalisationUpdate\Fetcher; + +/** + * This class uses GitHub api to obtain a list of files present in a directory + * to avoid fetching files that don't exist. + * + * @todo Could use file hashes to 1) avoid fetching files with same hash as + * the source. 2) avoid fetching files which haven't changed since last check + * if we store them. + */ +class GitHubFetcher extends HttpFetcher { + /** + * @param string $pattern + * + * @return array + * @throws \Exception + */ + public function fetchDirectory( $pattern ) { + global $wgLocalisationUpdateHttpRequestOptions; + + $domain = preg_quote( 'https://raw.github.com/', '~' ); + $p = "~^$domain(?P<org>[^/]+)/(?P<repo>[^/]+)/(?P<branch>[^/]+)/(?P<path>.+)/.+$~"; + preg_match( $p, $pattern, $m ); + + $apiURL = "https://api.github.com/repos/{$m['org']}/{$m['repo']}/contents/{$m['path']}"; + $json = \Http::get( $apiURL, $wgLocalisationUpdateHttpRequestOptions, __METHOD__ ); + if ( !$json ) { + throw new \Exception( "Unable to get directory listing for {$m['org']}/{$m['repo']}" ); + } + + $files = []; + $json = \FormatJson::decode( $json, true ); + foreach ( $json as $fileinfo ) { + $fileurl = dirname( $pattern ) . '/' . $fileinfo['name']; + $file = $this->fetchFile( $fileurl ); + if ( $file ) { + $files[$fileurl] = $file; + } + } + return $files; + } +} |