(bug 35728) Git revisions are now linked on Special:Version
Change-Id: I5b02aa914916f64492c85ce6dcc3272b6406551a
This commit is contained in:
parent
9decb76ae3
commit
5734eac351
3 changed files with 74 additions and 3 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in a new issue