From 222b01f5169f1c7e69762e0e8904c24f78f71882 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Wed, 28 Jul 2010 11:52:48 +0200 Subject: update to MediaWiki 1.16.0 --- includes/specials/SpecialVersion.php | 312 ++++++++++++++++++++++++----------- 1 file changed, 217 insertions(+), 95 deletions(-) (limited to 'includes/specials/SpecialVersion.php') diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php index 95e06f4b..7da6023e 100644 --- a/includes/specials/SpecialVersion.php +++ b/includes/specials/SpecialVersion.php @@ -12,21 +12,29 @@ class SpecialVersion extends SpecialPage { private $firstExtOpened = true; + static $viewvcUrls = array( + 'svn+ssh://svn.wikimedia.org/svnroot/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki', + 'http://svn.wikimedia.org/svnroot/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki', + # Doesn't work at the time of writing but maybe some day: + 'https://svn.wikimedia.org/viewvc/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki', + ); + function __construct(){ - parent::__construct( 'Version' ); + parent::__construct( 'Version' ); } /** * main() */ function execute( $par ) { - global $wgOut, $wgMessageCache, $wgSpecialVersionShowHooks; + global $wgOut, $wgMessageCache, $wgSpecialVersionShowHooks, $wgContLang; $wgMessageCache->loadAllMessages(); $this->setHeaders(); $this->outputHeader(); - $wgOut->addHTML( '
' ); + $wgOut->addHTML( Xml::openElement( 'div', + array( 'dir' => $wgContLang->getDir() ) ) ); $text = $this->MediaWikiCredits() . $this->softwareInformation() . @@ -47,13 +55,19 @@ class SpecialVersion extends SpecialPage { * @return wiki text showing the license information */ static function MediaWikiCredits() { - $ret = Xml::element( 'h2', array( 'id' => 'mw-version-license' ), wfMsg( 'version-license' ) ) . - "__NOTOC__ + global $wgContLang; + + $ret = Xml::element( 'h2', array( 'id' => 'mw-version-license' ), wfMsg( 'version-license' ) ); + + // This text is always left-to-right. + $ret .= '
'; + $ret .= "__NOTOC__ This wiki is powered by '''[http://www.mediawiki.org/ MediaWiki]''', - copyright (C) 2001-2009 Magnus Manske, Brion Vibber, Lee Daniel Crocker, + copyright © 2001-2010 Magnus Manske, Brion Vibber, Lee Daniel Crocker, Tim Starling, Erik Möller, Gabriel Wicke, Ævar Arnfjörð Bjarmason, Niklas Laxström, Domas Mituzas, Rob Church, Yuri Astrakhan, Aryeh Gregor, - Aaron Schulz and others. + Aaron Schulz, Andrew Garrett, Raimond Spekking, Alexandre Emsenhuber, + Siebrand Mazeland, Chad Horohoe and others. MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -70,6 +84,7 @@ class SpecialVersion extends SpecialPage { Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online]. "; + $ret .= '
'; return str_replace( "\t\t", '', $ret ) . "\n"; } @@ -80,25 +95,30 @@ class SpecialVersion extends SpecialPage { static function softwareInformation() { $dbr = wfGetDB( DB_SLAVE ); - return Xml::element( 'h2', array( 'id' => 'mw-version-software' ), wfMsg( 'version-software' ) ) . - Xml::openElement( 'table', array( 'id' => 'sv-software' ) ) . + // Put the software in an array of form 'name' => 'version'. All messages should + // be loaded here, so feel free to use wfMsg*() in the 'name'. Raw HTML or wikimarkup + // can be used + $software = array(); + $software['[http://www.mediawiki.org/ MediaWiki]'] = self::getVersionLinked(); + $software['[http://www.php.net/ PHP]'] = phpversion() . " (" . php_sapi_name() . ")"; + $software[$dbr->getSoftwareLink()] = $dbr->getServerVersion(); + + // Allow a hook to add/remove items + wfRunHooks( 'SoftwareInfo', array( &$software ) ); + + $out = Xml::element( 'h2', array( 'id' => 'mw-version-software' ), wfMsg( 'version-software' ) ) . + Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-software' ) ) . " " . wfMsg( 'version-software-product' ) . " " . wfMsg( 'version-software-version' ) . " - \n - - [http://www.mediawiki.org/ MediaWiki] - " . self::getVersionLinked() . " - \n - - [http://www.php.net/ PHP] - " . phpversion() . " (" . php_sapi_name() . ") - \n - - " . $dbr->getSoftwareLink() . " - " . $dbr->getServerVersion() . " - \n" . - Xml::closeElement( 'table' ); + \n"; + foreach( $software as $name => $version ) { + $out .= " + " . $name . " + " . $version . " + \n"; + } + return $out . Xml::closeElement( 'table' ); } /** @@ -106,27 +126,52 @@ class SpecialVersion extends SpecialPage { * * @return mixed */ - public static function getVersion() { + public static function getVersion( $flags = '' ) { global $wgVersion, $IP; wfProfileIn( __METHOD__ ); - $svn = self::getSvnRevision( $IP ); - $version = $svn ? "$wgVersion (r$svn)" : $wgVersion; + + $info = self::getSvnInfo( $IP ); + if ( !$info ) { + $version = $wgVersion; + } elseif( $flags === 'nodb' ) { + $version = "$wgVersion (r{$info['checkout-rev']})"; + } else { + $version = $wgVersion . ' ' . + wfMsg( + 'version-svn-revision', + isset( $info['directory-rev'] ) ? $info['directory-rev'] : '', + $info['checkout-rev'] + ); + } + wfProfileOut( __METHOD__ ); return $version; } /** - * Return a string of the MediaWiki version with a link to SVN revision if - * available + * Return a wikitext-formatted string of the MediaWiki version with a link to + * the SVN revision if available * * @return mixed */ public static function getVersionLinked() { global $wgVersion, $IP; wfProfileIn( __METHOD__ ); - $svn = self::getSvnRevision( $IP ); - $viewvc = 'http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/?pathrev='; - $version = $svn ? "$wgVersion ([{$viewvc}{$svn} r$svn])" : $wgVersion; + $info = self::getSvnInfo( $IP ); + if ( isset( $info['checkout-rev'] ) ) { + $linkText = wfMsg( + 'version-svn-revision', + isset( $info['directory-rev'] ) ? $info['directory-rev'] : '', + $info['checkout-rev'] + ); + if ( isset( $info['viewvc-url'] ) ) { + $version = "$wgVersion [{$info['viewvc-url']} $linkText]"; + } else { + $version = "$wgVersion $linkText"; + } + } else { + $version = $wgVersion; + } wfProfileOut( __METHOD__ ); return $version; } @@ -148,64 +193,40 @@ class SpecialVersion extends SpecialPage { wfRunHooks( 'SpecialVersionExtensionTypes', array( &$this, &$extensionTypes ) ); $out = Xml::element( 'h2', array( 'id' => 'mw-version-ext' ), wfMsg( 'version-extensions' ) ) . - Xml::openElement( 'table', array( 'id' => 'sv-ext' ) ); + Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-ext' ) ); foreach ( $extensionTypes as $type => $text ) { if ( isset ( $wgExtensionCredits[$type] ) && count ( $wgExtensionCredits[$type] ) ) { - $out .= $this->openExtType( $text ); + $out .= $this->openExtType( $text, 'credits-' . $type ); usort( $wgExtensionCredits[$type], array( $this, 'compare' ) ); foreach ( $wgExtensionCredits[$type] as $extension ) { - $version = null; - $subVersion = ''; - if ( isset( $extension['version'] ) ) { - $version = $extension['version']; - } - if ( isset( $extension['svn-revision'] ) && - preg_match( '/\$(?:Rev|LastChangedRevision|Revision): *(\d+)/', - $extension['svn-revision'], $m ) ) { - $subVersion = 'r' . $m[1]; - } - - if( $version && $subVersion ) { - $version = $version . ' [' . $subVersion . ']'; - } elseif ( !$version && $subVersion ) { - $version = $subVersion; - } - - $out .= $this->formatCredits( - isset ( $extension['name'] ) ? $extension['name'] : '', - $version, - isset ( $extension['author'] ) ? $extension['author'] : '', - isset ( $extension['url'] ) ? $extension['url'] : null, - isset ( $extension['description'] ) ? $extension['description'] : '', - isset ( $extension['descriptionmsg'] ) ? $extension['descriptionmsg'] : '' - ); + $out .= $this->formatCredits( $extension ); } } } if ( count( $wgExtensionFunctions ) ) { - $out .= $this->openExtType( wfMsg( 'version-extension-functions' ) ); - $out .= '' . $this->listToText( $wgExtensionFunctions ) . "\n"; + $out .= $this->openExtType( wfMsg( 'version-extension-functions' ), 'extension-functions' ); + $out .= '' . $this->listToText( $wgExtensionFunctions ) . "\n"; } if ( $cnt = count( $tags = $wgParser->getTags() ) ) { for ( $i = 0; $i < $cnt; ++$i ) $tags[$i] = "<{$tags[$i]}>"; - $out .= $this->openExtType( wfMsg( 'version-parser-extensiontags' ) ); - $out .= '' . $this->listToText( $tags ). "\n"; + $out .= $this->openExtType( wfMsg( 'version-parser-extensiontags' ), 'parser-tags' ); + $out .= '' . $this->listToText( $tags ). "\n"; } if( $cnt = count( $fhooks = $wgParser->getFunctionHooks() ) ) { - $out .= $this->openExtType( wfMsg( 'version-parser-function-hooks' ) ); - $out .= '' . $this->listToText( $fhooks ) . "\n"; + $out .= $this->openExtType( wfMsg( 'version-parser-function-hooks' ), 'parser-function-hooks' ); + $out .= '' . $this->listToText( $fhooks ) . "\n"; } if ( count( $wgSkinExtensionFunctions ) ) { - $out .= $this->openExtType( wfMsg( 'version-skin-extension-functions' ) ); - $out .= '' . $this->listToText( $wgSkinExtensionFunctions ) . "\n"; + $out .= $this->openExtType( wfMsg( 'version-skin-extension-functions' ), 'skin-extension-functions' ); + $out .= '' . $this->listToText( $wgSkinExtensionFunctions ) . "\n"; } $out .= Xml::closeElement( 'table' ); return $out; @@ -223,23 +244,72 @@ class SpecialVersion extends SpecialPage { } } - function formatCredits( $name, $version = null, $author = null, $url = null, $description = null, $descriptionMsg = null ) { - $extension = isset( $url ) ? "[$url $name]" : $name; - $version = isset( $version ) ? "(" . wfMsg( 'version-version' ) . " $version)" : ''; + function formatCredits( $extension ) { + $name = isset( $extension['name'] ) ? $extension['name'] : '[no name]'; + if ( isset( $extension['path'] ) ) { + $svnInfo = self::getSvnInfo( dirname($extension['path']) ); + $directoryRev = isset( $svnInfo['directory-rev'] ) ? $svnInfo['directory-rev'] : null; + $checkoutRev = isset( $svnInfo['checkout-rev'] ) ? $svnInfo['checkout-rev'] : null; + $viewvcUrl = isset( $svnInfo['viewvc-url'] ) ? $svnInfo['viewvc-url'] : null; + } else { + $directoryRev = null; + $checkoutRev = null; + $viewvcUrl = null; + } + + # Make main link (or just the name if there is no URL) + if ( isset( $extension['url'] ) ) { + $mainLink = "[{$extension['url']} $name]"; + } else { + $mainLink = $name; + } + if ( isset( $extension['version'] ) ) { + $versionText = '' . + wfMsg( 'version-version', $extension['version'] ) . + ''; + } else { + $versionText = ''; + } - # Look for a localized description - if( isset( $descriptionMsg ) ) { - $msg = wfMsg( $descriptionMsg ); - if ( !wfEmptyMsg( $descriptionMsg, $msg ) && $msg != '' ) { - $description = $msg; + # Make subversion text/link + if ( $checkoutRev ) { + $svnText = wfMsg( 'version-svn-revision', $directoryRev, $checkoutRev ); + $svnText = isset( $viewvcUrl ) ? "[$viewvcUrl $svnText]" : $svnText; + } else { + $svnText = false; + } + + # Make description text + $description = isset ( $extension['description'] ) ? $extension['description'] : ''; + if( isset ( $extension['descriptionmsg'] ) ) { + # Look for a localized description + $descriptionMsg = $extension['descriptionmsg']; + if( is_array( $descriptionMsg ) ) { + $descriptionMsgKey = $descriptionMsg[0]; // Get the message key + array_shift( $descriptionMsg ); // Shift out the message key to get the parameters only + array_map( "htmlspecialchars", $descriptionMsg ); // For sanity + $msg = wfMsg( $descriptionMsgKey, $descriptionMsg ); + } else { + $msg = wfMsg( $descriptionMsg ); } + if ( !wfEmptyMsg( $descriptionMsg, $msg ) && $msg != '' ) { + $description = $msg; + } } - return " - $extension $version - $description - " . $this->listToText( (array)$author ) . " + if ( $svnText !== false ) { + $extNameVer = " + $mainLink $versionText + $svnText"; + } else { + $extNameVer = " + $mainLink $versionText"; + } + $author = isset ( $extension['author'] ) ? $extension['author'] : array(); + $extDescAuthor = "$description + " . $this->listToText( (array)$author, false ) . " \n"; + return $extNameVer . $extDescAuthor; } /** @@ -253,7 +323,7 @@ class SpecialVersion extends SpecialPage { ksort( $myWgHooks ); $ret = Xml::element( 'h2', array( 'id' => 'mw-version-hooks' ), wfMsg( 'version-hooks' ) ) . - Xml::openElement( 'table', array( 'id' => 'sv-hooks' ) ) . + Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-hooks' ) ) . " " . wfMsg( 'version-hook-name' ) . " " . wfMsg( 'version-hook-subscribedby' ) . " @@ -271,19 +341,20 @@ class SpecialVersion extends SpecialPage { return ''; } - private function openExtType($text, $name = null) { - $opt = array( 'colspan' => 3 ); + private function openExtType( $text, $name = null ) { + $opt = array( 'colspan' => 4 ); $out = ''; - if(!$this->firstExtOpened) { + if( !$this->firstExtOpened ) { // Insert a spacing line $out .= '' . Xml::element( 'td', $opt ) . "\n"; } $this->firstExtOpened = false; - if($name) { $opt['id'] = "sv-$name"; } + if( $name ) + $opt['id'] = "sv-$name"; - $out .= "" . Xml::element( 'th', $opt, $text) . "\n"; + $out .= "" . Xml::element( 'th', $opt, $text ) . "\n"; return $out; } @@ -298,9 +369,10 @@ class SpecialVersion extends SpecialPage { /** * @param array $list + * @param bool $sort * @return string */ - function listToText( $list ) { + function listToText( $list, $sort = true ) { $cnt = count( $list ); if ( $cnt == 1 ) { @@ -310,7 +382,9 @@ class SpecialVersion extends SpecialPage { return ''; } else { global $wgLang; - sort( $list ); + if ( $sort ) { + sort( $list ); + } return $wgLang->listToText( array_map( array( __CLASS__, 'arrayToString' ), $list ) ); } } @@ -338,12 +412,20 @@ class SpecialVersion extends SpecialPage { } /** - * Retrieve the revision number of a Subversion working directory. + * Get an associative array of information about a given path, from its .svn + * subdirectory. Returns false on error, such as if the directory was not + * checked out with subversion. * - * @param string $dir - * @return mixed revision number as int, or false if not a SVN checkout + * Returned keys are: + * Required: + * checkout-rev The revision which was checked out + * Optional: + * directory-rev The revision when the directory was last modified + * url The subversion URL of the directory + * repo-url The base URL of the repository + * viewvc-url A ViewVC URL pointing to the checked-out revision */ - public static function getSvnRevision( $dir ) { + public static function getSvnInfo( $dir ) { // http://svnbook.red-bean.com/nightly/en/svn.developer.insidewc.html $entries = $dir . '/.svn/entries'; @@ -351,10 +433,13 @@ class SpecialVersion extends SpecialPage { return false; } - $content = file( $entries ); + $lines = file( $entries ); + if ( !count( $lines ) ) { + return false; + } // check if file is xml (subversion release <= 1.3) or not (subversion release = 1.4) - if( preg_match( '/^<\?xml/', $content[0] ) ) { + if( preg_match( '/^<\?xml/', $lines[0] ) ) { // subversion is release <= 1.3 if( !function_exists( 'simplexml_load_file' ) ) { // We could fall back to expat... YUCK @@ -371,15 +456,52 @@ class SpecialVersion extends SpecialPage { if( $xml->entry[0]['name'] == '' ) { // The directory entry should always have a revision marker. if( $entry['revision'] ) { - return intval( $entry['revision'] ); + return array( 'checkout-rev' => intval( $entry['revision'] ) ); } } } } return false; + } + + // subversion is release 1.4 or above + if ( count( $lines ) < 11 ) { + return false; + } + $info = array( + 'checkout-rev' => intval( trim( $lines[3] ) ), + 'url' => trim( $lines[4] ), + 'repo-url' => trim( $lines[5] ), + 'directory-rev' => intval( trim( $lines[10] ) ) + ); + if ( isset( self::$viewvcUrls[$info['repo-url']] ) ) { + $viewvc = str_replace( + $info['repo-url'], + self::$viewvcUrls[$info['repo-url']], + $info['url'] + ); + $pathRelativeToRepo = substr( $info['url'], strlen( $info['repo-url'] ) ); + $viewvc .= '/?pathrev='; + $viewvc .= urlencode( $info['checkout-rev'] ); + $info['viewvc-url'] = $viewvc; + } + return $info; + } + + /** + * Retrieve the revision number of a Subversion working directory. + * + * @param String $dir Directory of the svn checkout + * @return int revision number as int + */ + public static function getSvnRevision( $dir ) { + $info = self::getSvnInfo( $dir ); + if ( $info === false ) { + return false; + } elseif ( isset( $info['checkout-rev'] ) ) { + return $info['checkout-rev']; } else { - // subversion is release 1.4 - return intval( $content[3] ); + return false; } } -- cgit v1.2.2