From 5734eac351dcd72f493bfd7547a5f638f582b048 Mon Sep 17 00:00:00 2001 From: Alexandre Emsenhuber Date: Thu, 5 Apr 2012 18:09:59 +0200 Subject: [PATCH] (bug 35728) Git revisions are now linked on Special:Version Change-Id: I5b02aa914916f64492c85ce6dcc3272b6406551a --- RELEASE-NOTES-1.20 | 1 + includes/GitInfo.php | 59 ++++++++++++++++++++++++++++ includes/specials/SpecialVersion.php | 17 ++++++-- 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/RELEASE-NOTES-1.20 b/RELEASE-NOTES-1.20 index 7dd6b882fd..3f6a79f653 100644 --- a/RELEASE-NOTES-1.20 +++ b/RELEASE-NOTES-1.20 @@ -33,6 +33,7 @@ production. * (bug 17615) nosummary option should be reassigned on preview/captcha. * (bug 34355) add a variable and parser function for the namespace number. * (bug 35649) Special:Version now shows hashes of extensions checked out from git. +* (bug 35728) Git revisions are now linked on Special:Version. === Bug fixes in 1.20 === * (bug 30245) Use the correct way to construct a log page title. diff --git a/includes/GitInfo.php b/includes/GitInfo.php index 618ae94721..82c01f7b10 100644 --- a/includes/GitInfo.php +++ b/includes/GitInfo.php @@ -20,6 +20,19 @@ class GitInfo { */ protected $basedir; + /** + * Map of repo URLs to viewer URLs. + * Key is a pattern passed to preg_match() and preg_replace(), + * without the delimiters (which are #) and must match the whole URL. + * The value is the replacement for the key (it can contain $1, etc.) + * %h will be replaced by the short SHA-1 (7 first chars) and %H by the + * full SHA-1 of the HEAD revision. + */ + protected $viewers = array( + 'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%h', + 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%h', + ); + /** * @param $dir The root directory of the repo where the .git dir can be found */ @@ -105,6 +118,52 @@ class GitInfo { } } + /** + * Get an URL to a web viewer link to the HEAD revision. + * + * @return string|false string if an URL is available or false otherwise. + */ + public function getHeadViewUrl() { + $config = "{$this->basedir}/config"; + if ( !is_readable( $config ) ) { + return false; + } + + $configArray = parse_ini_file( $config, true ); + $remote = false; + + // Use the "origin" remote repo if available or any other repo if not. + if ( isset( $configArray['remote origin'] ) ) { + $remote = $configArray['remote origin']; + } else { + foreach( $configArray as $sectionName => $sectionConf ) { + if ( substr( $sectionName, 0, 6 ) == 'remote' ) { + $remote = $sectionConf; + } + } + } + + if ( $remote === false || !isset( $remote['url'] ) ) { + return false; + } + + $url = $remote['url']; + foreach( $this->viewers as $repo => $viewer ) { + $m = array(); + $pattern = '#^' . $repo . '$#'; + if ( preg_match( $pattern, $url ) ) { + $viewerUrl = preg_replace( $pattern, $viewer, $url ); + $headSHA1 = $this->getHeadSHA1(); + $replacements = array( + '%h' => substr( $headSHA1, 0, 7 ), + '%H' => $headSHA1 + ); + return strtr( $viewerUrl, $replacements ); + } + } + return false; + } + /** * @see self::getHeadSHA1 */ diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php index 76d60c787f..5965714800 100644 --- a/includes/specials/SpecialVersion.php +++ b/includes/specials/SpecialVersion.php @@ -237,12 +237,19 @@ class SpecialVersion extends SpecialPage { */ private static function getVersionLinkedGit() { global $wgVersion, $IP; - if( ! $sha1 = self::getGitHeadSha1( $IP) ) { + + $gitInfo = new GitInfo( $IP ); + $headSHA1 = $gitInfo->getHeadSHA1(); + if( !$headSHA1 ) { return false; } - $short_sha1 = substr( $sha1, 0, 7 ); - return "$wgVersion ($short_sha1)"; + $shortSHA1 = '(' . substr( $headSHA1, 0, 7 ) . ')'; + $viewerUrl = $gitInfo->getHeadViewUrl(); + if ( $viewerUrl !== false ) { + $shortSHA1 = "[$viewerUrl $shortSHA1]"; + } + return "$wgVersion $shortSHA1"; } /** @@ -422,6 +429,10 @@ class SpecialVersion extends SpecialPage { $gitHeadSHA1 = $gitInfo->getHeadSHA1(); if ( $gitHeadSHA1 !== false ) { $vcsText = substr( $gitHeadSHA1, 0, 7 ); + $gitViewerUrl = $gitInfo->getHeadViewUrl(); + if ( $gitViewerUrl !== false ) { + $vcsText = "[$gitViewerUrl $vcsText]"; + } } else { $svnInfo = self::getSvnInfo( dirname( $extension['path'] ) ); # Make subversion text/link. -- 2.20.1