* John N
* Karun Dambietz
* Kim Hyun-Joon
+* Krenair
* Lee Worden
* Lejonel
* liangent
* (bug 35705) QUnit upgraded from 1.2.0 to 1.5.0
* (bug 35749) Updated maintenance/checkSyntax.php to use Git instead of
Subversion when invoked with the --modified option.
+* (bug 35069) On history pages, the " . . " separator after the number of
+ characters changed in a revision is now suppressed if no text would follow.
=== API changes in 1.20 ===
* (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
the format parameter.
* (bug 32384) Allow descending order for list=watchlistraw.
* (bug 31883) Limit of bkusers of list=blocks and titles of action=query is not documented in API help.
+* (bug 32492) API now allows editing using pageid
+* (bug 32497) API now allows changing of protection level using pageid
+* (bug 32498) API now allows comparing pages using pageids
=== Languages updated in 1.20 ===
*
* @param $user User: the user to check, or null to use the context user
* @throws ErrorPageError
+ * @return bool True on success
*/
protected function checkCanExecute( User $user ) {
$right = $this->getRestriction();
if ( $this->requiresWrite() && wfReadOnly() ) {
throw new ReadOnlyError();
}
+ return true;
}
/**
function report() {
global $wgOut;
-
$wgOut->showErrorPage( $this->title, $this->msg, $this->params );
$wgOut->output();
}
public function report(){
global $wgOut;
$wgOut->setStatusCode( 503 );
- return parent::report();
+ parent::report();
}
}
* the most recent version.
*/
public function allPages() {
- return $this->dumpFrom( '' );
+ $this->dumpFrom( '' );
}
/**
if ( $end ) {
$condition .= ' AND page_id < ' . intval( $end );
}
- return $this->dumpFrom( $condition );
+ $this->dumpFrom( $condition );
}
/**
if ( $end ) {
$condition .= ' AND rev_id < ' . intval( $end );
}
- return $this->dumpFrom( $condition );
+ $this->dumpFrom( $condition );
}
/**
* @param $title Title
*/
public function pageByTitle( $title ) {
- return $this->dumpFrom(
+ $this->dumpFrom(
'page_namespace=' . $title->getNamespace() .
' AND page_title=' . $this->db->addQuotes( $title->getDBkey() ) );
}
if ( is_null( $title ) ) {
throw new MWException( "Can't export invalid title" );
} else {
- return $this->pageByTitle( $title );
+ $this->pageByTitle( $title );
}
}
}
public function allLogs() {
- return $this->dumpFrom( '' );
+ $this->dumpFrom( '' );
}
public function logsByRange( $start, $end ) {
if ( $end ) {
$condition .= ' AND log_id < ' . intval( $end );
}
- return $this->dumpFrom( $condition );
+ $this->dumpFrom( $condition );
}
# Generates the distinct list of authors of an article
*/
class DumpPipeOutput extends DumpFileOutput {
protected $command, $filename;
- private $procOpenResource = false;
+ protected $procOpenResource = false;
function __construct( $command, $file = null ) {
if ( !is_null( $file ) ) {
* Returns a valid placeholder object if the file does not exist.
*
* @param $title Title|String
- * @return File|null A File, or null if passed an invalid Title
+ * @return LocalFile|null A File, or null if passed an invalid Title
*/
function wfLocalFile( $title ) {
return RepoGroup::singleton()->getLocalRepo()->newFile( $title );
/**
* Add a new path pattern to the path router
*
- * @param $path string The path pattern to add
+ * @param $path string|array The path pattern to add
* @param $params array The params for this path pattern
* @param $options array The options for this path pattern
*/
}
}
-}
\ No newline at end of file
+}
*
* @param $page Mixed: SpecialPage or string
* @param $group String
- * @return null
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function setGroup( $page, $group ) {
wfDeprecated( __METHOD__, '1.18' );
- return SpecialPageFactory::setGroup( $page, $group );
+ SpecialPageFactory::setGroup( $page, $group );
}
/**
* Get the group that the special page belongs in on Special:SpecialPage
*
* @param $page SpecialPage
- * @return null
+ * @return string
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getGroup( &$page ) {
* @param $callback Callback: function to call on each match
* @param $subject String
* @param $flags String: regular expression flags
+ * @throws MWException
* @return string
*/
static function delimiterReplaceCallback( $startDelim, $endDelim, $callback, $subject, $flags = '' ) {
* StringUtils::delimiterReplaceCallback()
*/
class Replacer {
+
+ /**
+ * @return array
+ */
function cb() {
return array( &$this, 'replace' );
}
*/
class RegexlikeReplacer extends Replacer {
var $r;
+
+ /**
+ * @param $r string
+ */
function __construct( $r ) {
$this->r = $r;
}
+ /**
+ * @param $matches array
+ * @return string
+ */
function replace( $matches ) {
$pairs = array();
foreach ( $matches as $i => $match ) {
* Class to perform secondary replacement within each replacement string
*/
class DoubleReplacer extends Replacer {
+
+ /**
+ * @param $from
+ * @param $to
+ * @param $index int
+ */
function __construct( $from, $to, $index = 0 ) {
$this->from = $from;
$this->to = $to;
$this->index = $index;
}
+ /**
+ * @param $matches array
+ * @return mixed
+ */
function replace( $matches ) {
return str_replace( $this->from, $this->to, $matches[$this->index] );
}
class HashtableReplacer extends Replacer {
var $table, $index;
+ /**
+ * @param $table
+ * @param $index int
+ */
function __construct( $table, $index = 0 ) {
$this->table = $table;
$this->index = $index;
}
+ /**
+ * @param $matches array
+ * @return mixed
+ */
function replace( $matches ) {
return $this->table[$matches[$this->index]];
}
/**
* Create an object with the specified replacement array
* The array should have the same form as the replacement array for strtr()
+ * @param array $data
*/
function __construct( $data = array() ) {
$this->data = $data;
}
+ /**
+ * @return array
+ */
function __sleep() {
return array( 'data' );
}
$this->fss = false;
}
+ /**
+ * @return array|bool
+ */
function getArray() {
return $this->data;
}
/**
* Set an element of the replacement array
+ * @param $from string
+ * @param $to stromg
*/
function setPair( $from, $to ) {
$this->data[$from] = $to;
$this->fss = false;
}
+ /**
+ * @param $data array
+ */
function mergeArray( $data ) {
$this->data = array_merge( $this->data, $data );
$this->fss = false;
}
+ /**
+ * @param $other
+ */
function merge( $other ) {
$this->data = array_merge( $this->data, $other->data );
$this->fss = false;
}
+ /**
+ * @param $from string
+ */
function removePair( $from ) {
unset($this->data[$from]);
$this->fss = false;
}
+ /**
+ * @param $data array
+ */
function removeArray( $data ) {
- foreach( $data as $from => $to )
+ foreach( $data as $from => $to ) {
$this->removePair( $from );
+ }
$this->fss = false;
}
+ /**
+ * @param $subject string
+ * @return string
+ */
function replace( $subject ) {
if ( function_exists( 'fss_prep_replace' ) ) {
wfProfileIn( __METHOD__.'-fss' );
// The current token
var $current;
- /**
+ /**
* Construct a DelimIterator
+ * @param $delim string
+ * @param $s string
*/
function __construct( $delim, $s ) {
$this->subject = $s;
$this->refreshCurrent();
}
-
function refreshCurrent() {
if ( $this->curPos === false ) {
$this->current = false;
return $this->curPos;
}
+ /**
+ * @return string
+ */
function next() {
if ( $this->endPos === false ) {
$this->curPos = false;
return $this->current;
}
+ /**
+ * @return bool
+ */
function valid() {
return $this->curPos !== false;
}
}
-
}
public function setSessionData( $key, $data ) {
- return $this->base->setSessionData( $key, $data );
+ $this->base->setSessionData( $key, $data );
}
public function getAcceptLang() {
: 0;
$sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
$fSize = Linker::formatRevisionSize($rev->getSize());
- $s .= " . . $fSize $sDiff . . ";
+ $s .= " . . $fSize $sDiff";
- $s .= Linker::revComment( $rev, false, true );
+ # Text following the character difference is added just before running hooks
+ $s2 = Linker::revComment( $rev, false, true );
if ( $notificationtimestamp && ( $row->rev_timestamp >= $notificationtimestamp ) ) {
- $s .= ' <span class="updatedmarker">' . $this->msg( 'updatedmarker' )->escaped() . '</span>';
+ $s2 .= ' <span class="updatedmarker">' . $this->msg( 'updatedmarker' )->escaped() . '</span>';
}
$tools = array();
}
if ( $tools ) {
- $s .= ' '. $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
+ $s2 .= ' '. $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
}
# Tags
list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'history' );
$classes = array_merge( $classes, $newClasses );
- $s .= " $tagSummary";
+ if ( $tagSummary !== '' ) {
+ $s2 .= " $tagSummary";
+ }
+
+ # Include separator between character difference and following text
+ if ( $s2 !== '' ) {
+ $s .= " . . $s2";
+ }
wfRunHooks( 'PageHistoryLineEnding', array( $this, &$row , &$s, &$classes ) );
public function execute() {
$params = $this->extractRequestParams();
- $rev1 = $this->revisionOrTitle( $params['fromrev'], $params['fromtitle'] );
- $rev2 = $this->revisionOrTitle( $params['torev'], $params['totitle'] );
+ $rev1 = $this->revisionOrTitleOrId( $params['fromrev'], $params['fromtitle'], $params['fromid'] );
+ $rev2 = $this->revisionOrTitleOrId( $params['torev'], $params['totitle'], $params['toid'] );
$de = new DifferenceEngine( $this->getContext(),
$rev1,
if ( isset( $params['fromtitle'] ) ) {
$vals['fromtitle'] = $params['fromtitle'];
}
+ if ( isset( $params['fromid'] ) ) {
+ $vals['fromid'] = $params['fromid'];
+ }
$vals['fromrevid'] = $rev1;
if ( isset( $params['totitle'] ) ) {
$vals['totitle'] = $params['totitle'];
}
+ if ( isset( $params['toid'] ) ) {
+ $vals['toid'] = $params['toid'];
+ }
$vals['torevid'] = $rev2;
$difftext = $de->getDiffBody();
/**
* @param $revision int
* @param $titleText string
+ * @param $titleId int
* @return int
*/
- private function revisionOrTitle( $revision, $titleText ) {
+ private function revisionOrTitleOrId( $revision, $titleText, $titleId ) {
if( $revision ){
return $revision;
} elseif( $titleText ) {
$this->dieUsageMsg( array( 'invalidtitle', $titleText ) );
}
return $title->getLatestRevID();
+ } elseif ( $titleId ) {
+ $title = Title::newFromID( $titleId );
+ if( !$title ) {
+ $this->dieUsageMsg( array( 'nosuchpageid', $titleId ) );
+ }
+ return $title->getLatestRevID();
}
- $this->dieUsage( 'inputneeded', 'A title or a revision number is needed for both the from and the to parameters' );
+ $this->dieUsage( 'inputneeded', 'A title, a page ID, or a revision number is needed for both the from and the to parameters' );
}
public function getAllowedParams() {
return array(
'fromtitle' => null,
+ 'fromid' => array(
+ ApiBase::PARAM_TYPE => 'integer'
+ ),
'fromrev' => array(
ApiBase::PARAM_TYPE => 'integer'
),
'totitle' => null,
+ 'toid' => array(
+ ApiBase::PARAM_TYPE => 'integer'
+ ),
'torev' => array(
ApiBase::PARAM_TYPE => 'integer'
),
public function getParamDescription() {
return array(
'fromtitle' => 'First title to compare',
+ 'fromid' => 'First page ID to compare',
'fromrev' => 'First revision to compare',
'totitle' => 'Second title to compare',
+ 'toid' => 'Second page ID to compare',
'torev' => 'Second revision to compare',
);
}
public function getDescription() {
return array(
'Get the difference between 2 pages',
- 'You must pass a revision number or a page title for each part (1 and 2)'
+ 'You must pass a revision number or a page title or a page ID id for each part (1 and 2)'
);
}
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'inputneeded', 'info' => 'A title or a revision is needed' ),
array( 'invalidtitle', 'title' ),
+ array( 'nosuchpageid', 'pageid' ),
array( 'code' => 'baddiff', 'info' => 'The diff cannot be retrieved. Maybe one or both revisions do not exist or you do not have permission to view them.' ),
) );
}
$this->dieUsageMsg( 'missingtext' );
}
- $titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj || $titleObj->isExternal() ) {
- $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
+
+ if ( isset( $params['title'] ) ) {
+ $titleObj = Title::newFromText( $params['title'] );
+ if ( !$titleObj || $titleObj->isExternal() ) {
+ $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ }
+ } elseif ( isset( $params['pageid'] ) ) {
+ $titleObj = Title::newFromID( $params['pageid'] );
+ if ( !$titleObj ) {
+ $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
+ }
}
$apiResult = $this->getResult();
public function getPossibleErrors() {
global $wgMaxArticleSize;
- return array_merge( parent::getPossibleErrors(), array(
- array( 'missingtext' ),
- array( 'invalidtitle', 'title' ),
- array( 'createonly-exists' ),
- array( 'nocreate-missing' ),
- array( 'nosuchrevid', 'undo' ),
- array( 'nosuchrevid', 'undoafter' ),
- array( 'revwrongpage', 'id', 'text' ),
- array( 'undo-failure' ),
- array( 'hashcheckfailed' ),
- array( 'hookaborted' ),
- array( 'noimageredirect-anon' ),
- array( 'noimageredirect-logged' ),
- array( 'spamdetected', 'spam' ),
- array( 'summaryrequired' ),
- array( 'filtered' ),
- array( 'blockedtext' ),
- array( 'contenttoobig', $wgMaxArticleSize ),
- array( 'noedit-anon' ),
- array( 'noedit' ),
- array( 'actionthrottledtext' ),
- array( 'wasdeleted' ),
- array( 'nocreate-loggedin' ),
- array( 'blankpage' ),
- array( 'editconflict' ),
- array( 'emptynewsection' ),
- array( 'unknownerror', 'retval' ),
- array( 'code' => 'nosuchsection', 'info' => 'There is no section section.' ),
- array( 'code' => 'invalidsection', 'info' => 'The section parameter must be set to an integer or \'new\'' ),
- array( 'customcssprotected' ),
- array( 'customjsprotected' ),
- ) );
+ return array_merge( parent::getPossibleErrors(),
+ $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+ array(
+ array( 'nosuchpageid', 'pageid' ),
+ array( 'missingtext' ),
+ array( 'invalidtitle', 'title' ),
+ array( 'createonly-exists' ),
+ array( 'nocreate-missing' ),
+ array( 'nosuchrevid', 'undo' ),
+ array( 'nosuchrevid', 'undoafter' ),
+ array( 'revwrongpage', 'id', 'text' ),
+ array( 'undo-failure' ),
+ array( 'hashcheckfailed' ),
+ array( 'hookaborted' ),
+ array( 'noimageredirect-anon' ),
+ array( 'noimageredirect-logged' ),
+ array( 'spamdetected', 'spam' ),
+ array( 'summaryrequired' ),
+ array( 'filtered' ),
+ array( 'blockedtext' ),
+ array( 'contenttoobig', $wgMaxArticleSize ),
+ array( 'noedit-anon' ),
+ array( 'noedit' ),
+ array( 'actionthrottledtext' ),
+ array( 'wasdeleted' ),
+ array( 'nocreate-loggedin' ),
+ array( 'blankpage' ),
+ array( 'editconflict' ),
+ array( 'emptynewsection' ),
+ array( 'unknownerror', 'retval' ),
+ array( 'code' => 'nosuchsection', 'info' => 'There is no section section.' ),
+ array( 'code' => 'invalidsection', 'info' => 'The section parameter must be set to an integer or \'new\'' ),
+ array( 'customcssprotected' ),
+ array( 'customjsprotected' ),
+ )
+ );
}
public function getAllowedParams() {
return array(
'title' => array(
ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => true
+ ),
+ 'pageid' => array(
+ ApiBase::PARAM_TYPE => 'integer',
),
'section' => null,
'sectiontitle' => array(
public function getParamDescription() {
$p = $this->getModulePrefix();
return array(
- 'title' => 'Page title',
+ 'title' => "Title of the page you want to edit. Cannot be used together with {$p}pageid",
+ 'pageid' => "Page ID of the page you want to edit. Cannot be used together with {$p}title",
'section' => 'Section number. 0 for the top section, \'new\' for a new section',
'sectiontitle' => 'The title for a new section',
'text' => 'Page content',
global $wgRestrictionLevels;
$params = $this->extractRequestParams();
- $titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj ) {
- $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
+
+ if ( isset( $params['title'] ) ) {
+ $titleObj = Title::newFromText( $params['title'] );
+ if ( !$titleObj ) {
+ $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ }
+ } elseif ( isset( $params['pageid'] ) ) {
+ $titleObj = Title::newFromID( $params['pageid'] );
+ if ( !$titleObj ) {
+ $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
+ }
}
$errors = $titleObj->getUserPermissionsErrors( 'protect', $this->getUser() );
return array(
'title' => array(
ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => true
+ ),
+ 'pageid' => array(
+ ApiBase::PARAM_TYPE => 'integer',
),
'token' => null,
'protections' => array(
}
public function getParamDescription() {
+ $p = $this->getModulePrefix();
return array(
- 'title' => 'Title of the page you want to (un)protect',
+ 'title' => "Title of the page you want to (un)protect. Cannot be used together with {$p}pageid",
+ 'pageid' => "ID of the page you want to (un)protect. Cannot be used together with {$p}title",
'token' => 'A protect token previously retrieved through prop=info',
'protections' => 'Pipe-separated list of protection levels, formatted action=group (e.g. edit=sysop)',
'expiry' => array( 'Expiry timestamps. If only one timestamp is set, it\'ll be used for all protections.',
}
public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'invalidtitle', 'title' ),
- array( 'toofewexpiries', 'noofexpiries', 'noofprotections' ),
- array( 'create-titleexists' ),
- array( 'missingtitle-createonly' ),
- array( 'protect-invalidaction', 'action' ),
- array( 'protect-invalidlevel', 'level' ),
- array( 'invalidexpiry', 'expiry' ),
- array( 'pastexpiry', 'expiry' ),
- ) );
+ return array_merge( parent::getPossibleErrors(),
+ $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+ array(
+ array( 'invalidtitle', 'title' ),
+ array( 'nosuchpageid', 'pageid' ),
+ array( 'toofewexpiries', 'noofexpiries', 'noofprotections' ),
+ array( 'create-titleexists' ),
+ array( 'missingtitle-createonly' ),
+ array( 'protect-invalidaction', 'action' ),
+ array( 'protect-invalidlevel', 'level' ),
+ array( 'invalidexpiry', 'expiry' ),
+ array( 'pastexpiry', 'expiry' ),
+ )
+ );
}
public function needsToken() {
$this->dieUsage( $status->getWikiText(), 'stashfailed' );
return ;
}
- $result['filekey'] = $this->mParams['filekey'];
+
// Check we added the last chunk:
if( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
$status = $this->mUpload->concatenateChunks();
+
if ( !$status->isGood() ) {
$this->dieUsage( $status->getWikiText(), 'stashfailed' );
return ;
}
+
+ // We have a new filekey for the fully concatenated file.
+ $result['filekey'] = $this->mUpload->getLocalFile()->getFileKey();
+
+ // Remove chunk from stash. (Checks against user ownership of chunks.)
+ $this->mUpload->stash->removeFile( $this->mParams['filekey'] );
+
$result['result'] = 'Success';
+
+ } else {
+
+ // Continue passing through the filekey for adding further chunks.
+ $result['filekey'] = $this->mParams['filekey'];
}
}
$result['offset'] = $this->mParams['offset'] + $chunkSize;
/**#@-*/
+ /**
+ * @var LocalRepo
+ */
+ var $repo;
+
protected $repoClass = 'LocalRepo';
/**
'fa_deleted_user' => $encUserId,
'fa_deleted_timestamp' => $encTimestamp,
'fa_deleted_reason' => $encReason,
- 'fa_deleted' => $this->suppress ? $bitfield : 'oi_deleted',
+ 'fa_deleted' => $this->suppress ? $bitfield : 'oi_deleted',
'fa_name' => 'oi_name',
'fa_archive_name' => 'oi_archive_name',
'fa_user' => 'oi_user',
'fa_user_text' => 'oi_user_text',
'fa_timestamp' => 'oi_timestamp',
- 'fa_deleted' => $bitfield
), $where, __METHOD__ );
}
}
/**
* Helper function to convert charset for iptc values.
- * @param $data Mixed String or Array: The iptc string
+ * @param $data string|array The iptc string
* @param $charset String: The charset
*
- * @return string
+ * @return string|array
*/
private static function convIPTC ( $data, $charset ) {
if ( is_array( $data ) ) {
* @return array
*/
protected function getPages( ResourceLoaderContext $context ) {
- if ( $context->getUser() ) {
- // Get the normalized title of the user's user page
- $username = $context->getUser();
- $userpageTitle = Title::makeTitleSafe( NS_USER, $username );
- $userpage = $userpageTitle->getPrefixedDBkey(); // Needed so $excludepages works
+ $username = $context->getUser();
- $pages = array(
- "$userpage/common.js" => array( 'type' => 'script' ),
- "$userpage/" . $context->getSkin() . '.js' =>
- array( 'type' => 'script' ),
- "$userpage/common.css" => array( 'type' => 'style' ),
- "$userpage/" . $context->getSkin() . '.css' =>
- array( 'type' => 'style' ),
- );
+ if ( !$username ) {
+ return array();
+ }
+
+ // Get the normalized title of the user's user page
+ $userpageTitle = Title::makeTitleSafe( NS_USER, $username );
+
+ if ( !$userpageTitle instanceof Title ) {
+ return array();
+ }
+
+ $userpage = $userpageTitle->getPrefixedDBkey(); // Needed so $excludepages works
+
+ $pages = array(
+ "$userpage/common.js" => array( 'type' => 'script' ),
+ "$userpage/" . $context->getSkin() . '.js' =>
+ array( 'type' => 'script' ),
+ "$userpage/common.css" => array( 'type' => 'style' ),
+ "$userpage/" . $context->getSkin() . '.css' =>
+ array( 'type' => 'style' ),
+ );
- // Hack for bug 26283: if we're on a preview page for a CSS/JS page,
- // we need to exclude that page from this module. In that case, the excludepage
- // parameter will be set to the name of the page we need to exclude.
- $excludepage = $context->getRequest()->getVal( 'excludepage' );
- if ( isset( $pages[$excludepage] ) ) {
- // This works because $excludepage is generated with getPrefixedDBkey(),
- // just like the keys in $pages[] above
- unset( $pages[$excludepage] );
- }
- return $pages;
+ // Hack for bug 26283: if we're on a preview page for a CSS/JS page,
+ // we need to exclude that page from this module. In that case, the excludepage
+ // parameter will be set to the name of the page we need to exclude.
+ $excludepage = $context->getRequest()->getVal( 'excludepage' );
+ if ( isset( $pages[$excludepage] ) ) {
+ // This works because $excludepage is generated with getPrefixedDBkey(),
+ // just like the keys in $pages[] above
+ unset( $pages[$excludepage] );
}
- return array();
+ return $pages;
}
/* Methods */
if ($row->user_id == 0) #Bug 16487
return '';
+ $userName = $row->user_name;
+
+ $ulinks = Linker::userLink( $row->user_id, $userName );
+ $ulinks .= Linker::userToolLinks( $row->user_id, $userName );
+
$userPage = Title::makeTitle( NS_USER, $row->user_name );
$name = Linker::link( $userPage, htmlspecialchars( $userPage->getText() ) );
if( count( $groups_list ) > 0 ) {
$list = array();
foreach( $groups_list as $group )
- $list[] = self::buildGroupLink( $group, $userPage->getText() );
+ $list[] = self::buildGroupLink( $group, $userName );
$groups = $lang->commaList( $list );
} else {
$groups = '';
}
- $item = $lang->specialList( $name, $groups );
+ $item = $lang->specialList( $ulinks, $groups );
if( $row->ipb_deleted ) {
$item = "<span class=\"deleted\">$item</span>";
}
$edits = '';
}
- $userTalkPage = $userPage->getTalkPage();
- $talk = Linker::link( $userTalkPage, $this->msg( 'talkpagelinktext' )->escaped() );
- $talk = ' ' . $this->msg( 'parentheses' )->rawParams( $talk )->escaped();
-
$created = '';
# Some rows may be NULL
if( $row->creation ) {
}
wfRunHooks( 'SpecialListusersFormatRow', array( &$item, $row ) );
- return "<li>{$item}{$edits}{$talk}{$created}</li>";
+ return "<li>{$item}{$edits}{$created}</li>";
}
- function getBody() {
- if( !$this->mQueryDone ) {
- $this->doQuery();
- }
- $this->mResult->rewind();
- $batch = new LinkBatch;
+ function doBatchLookups() {
+ $batch = new LinkBatch();
+ # Give some pointers to make user links
foreach ( $this->mResult as $row ) {
- $batch->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) );
+ $batch->add( NS_USER, $row->user_name );
+ $batch->add( NS_USER_TALK, $row->user_name );
}
$batch->execute();
$this->mResult->rewind();
- return parent::getBody();
}
function getPageHeader( ) {
global $wgVersion;
wfProfileIn( __METHOD__ );
- if( $gitVersion = self::getVersionLinkedGit() ) {
+ $gitVersion = self::getVersionLinkedGit();
+ if( $gitVersion ) {
$v = $gitVersion;
- } elseif( $svnVersion = self::getVersionLinkedSvn() ) {
- $v = $svnVersion;
} else {
- $v = $wgVersion; // fallback
+ $svnVersion = self::getVersionLinkedSvn();
+ if( $svnVersion ) {
+ $v = $svnVersion;
+ } else {
+ $v = $wgVersion; // fallback
+ }
}
wfProfileOut( __METHOD__ );
}
/**
- * @return string wgVersion + a link to subversion revision of svn BASE
+ * @return string wgVersion + a link to subversion revision of svn BASE
*/
private static function getVersionLinkedSvn() {
global $wgVersion, $IP;
*/
function getVariantname( $code, $usemsg = true ) {
$msg = "variantname-$code";
- list( $rootCode ) = explode( '-', $code );
if ( $usemsg && wfMessage( $msg )->exists() ) {
return $this->getMessageFromDB( $msg );
}
# # Punctuation
'/#|No\./' => '№',
# # Şç
- '/ŞÇʹ/u' => 'ЩЬ', '/Şçʹ/u' => 'Щь', '/Şçʹ/u' => 'Щь',
+ '/ŞÇʹ/u' => 'ЩЬ', '/Şçʹ/u' => 'Щь',
'/Ş[Çç]/u' => 'Щ', '/şç/u' => 'щ',
# # soft and hard signs
'/([' . KK_L_UC . '])ʺ([' . KK_L_UC . '])/u' => '$1Ъ$2',
'h' => 'ه', 'j' => 'ژ', 'k' => 'ک', 'l' => 'ل',
'm' => 'م', 'n' => 'ن', 'p' => 'پ', 'q' => 'ق', 'r' => 'ر', 's' => 'س', 'ş' => 'ش',
't' => 'ت', 'v' => 'ڤ',
- 'x' => 'خ', 'y' => 'ی', 'z' => 'ز',
-
+ 'x' => 'خ', 'y' => 'ی', 'z' => 'ز',
'B' => 'ب', 'C' => 'ج', 'Ç' => 'چ', 'D' => 'د', 'F' => 'ف', 'G' => 'گ', 'H' => 'ھ',
'H' => 'ہ', 'H' => 'ه', 'H' => 'ح', 'J' => 'ژ', 'K' => 'ك', 'K' => 'ک', 'L' => 'ل',
'ns-specialprotected' => 'Special pages cannot be edited.',
'titleprotected' => 'This title has been protected from creation by [[User:$1|$1]].
The reason given is "\'\'$2\'\'".',
-'filereadonlyerror' => 'Unable to modify the file "$1" because the file repository "$2" is in read-only mode.
-
-The reason given is "\'\'$3\'\'".',
# Virus scanner
'virus-badscanner' => "Bad configuration: Unknown virus scanner: ''$1''",
'$1_تالقىلاۋى' => NS_PROJECT_TALK,
'سۋرەت' => NS_FILE,
'سۋرەت_تالقىلاۋى' => NS_FILE_TALK,
- 'مەدياۋيكي' => NS_MEDIAWIKI,
- 'مەدياۋيكي_تالقىلاۋى' => NS_MEDIAWIKI_TALK,
- 'ٷلگٸ' => NS_TEMPLATE,
- 'ٷلگٸ_تالقىلاۋى' => NS_TEMPLATE_TALK,
'انىقتاما' => NS_HELP,
'انىقتاما_تالقىلاۋى' => NS_HELP_TALK,
'سانات' => NS_CATEGORY,
'$1_تالقىلاۋى' => NS_PROJECT_TALK,
'سۋرەت' => NS_FILE,
'سۋرەت_تالقىلاۋى' => NS_FILE_TALK,
- 'مەدياۋيكي' => NS_MEDIAWIKI,
- 'مەدياۋيكي_تالقىلاۋى' => NS_MEDIAWIKI_TALK,
- 'ٷلگٸ' => NS_TEMPLATE,
- 'ٷلگٸ_تالقىلاۋى' => NS_TEMPLATE_TALK,
'انىقتاما' => NS_HELP,
'انىقتاما_تالقىلاۋى' => NS_HELP_TALK,
'سانات' => NS_CATEGORY,
'Cows_Restren' => NS_FILE_TALK,
'Keskows_Restren' => NS_FILE_TALK,
'Cows_MediaWiki' => NS_MEDIAWIKI_TALK,
- 'Cows_MediaWiki' => NS_MEDIAWIKI_TALK,
'Keskows_MediaWiki' => NS_MEDIAWIKI_TALK,
'Cows_Scantlyn' => NS_TEMPLATE_TALK,
'Skantlyn' => NS_TEMPLATE,
'Diskussión_de_Xabblón' => NS_MEDIAWIKI_TALK,
'Xabblón' => NS_TEMPLATE,
'Diskusyón_de_Xabblón' => NS_TEMPLATE_TALK,
- 'Plantilla_Discusión' => NS_TEMPLATE_TALK,
'Diskussión_de_Ayudo' => NS_HELP_TALK,
'Kateggoría' => NS_CATEGORY,
'Diskussión_de_Kateggoría' => NS_CATEGORY_TALK,
'$1_Discussão' => NS_PROJECT_TALK,
'Ficheiro' => NS_FILE,
'Ficheiro_Discussão' => NS_FILE_TALK,
- 'Imagem_Discussão' => NS_FILE,
+ 'Imagem' => NS_FILE,
'Imagem_Discussão' => NS_FILE_TALK,
'MediaWiki_Discussão' => NS_MEDIAWIKI_TALK,
'Predefinição' => NS_TEMPLATE,
'Categorie' => NS_CATEGORY,
'Overleg_categorie' => NS_CATEGORY_TALK,
'Kattegerie' => NS_CATEGORY,
- 'Overleg_categorie' => NS_CATEGORY_TALK,
'Overleg_kattegerie' => NS_HELP_TALK,
);
'బొమ్మపై_చర్చ' => NS_FILE_TALK,
'ఫైలు' => NS_FILE,
'ఫైలుపై_చర్చ' => NS_FILE_TALK,
- 'బొమ్మపై_చర్చ' => NS_FILE_TALK,
'సహాయము' => NS_HELP,
'సహాయము_చర్చ' => NS_HELP_TALK,
);
// Generic options which might or not be supported by the script
private $mDependantParameters = array();
- // Used by getDD() / setDB()
+ /**
+ * Used by getDD() / setDB()
+ * @var DatabaseBase
+ */
private $mDb = null;
/**
* @ingroup Dump Maintenance
*/
class DumpDBZip2Output extends DumpPipeOutput {
- function DumpDBZip2Output( $file ) {
+ function __construct( $file ) {
parent::__construct( "dbzip2", $file );
}
}
var $php = "php";
var $spawn = false;
+
+ /**
+ * @var bool|resource
+ */
var $spawnProc = false;
+
+ /**
+ * @var bool|resource
+ */
var $spawnWrite = false;
+
+ /**
+ * @var bool|resource
+ */
var $spawnRead = false;
+
+ /**
+ * @var bool|resource
+ */
var $spawnErr = false;
var $xmlwriterobj = false;
$extDb->freeResult( $res );
// Print errors for missing blobs rows
- foreach ( $oldIds as $blobId => $oldIds ) {
- $this->error( 'restore text', "Error: missing target $cluster/$blobId for two-part ES URL", $oldIds );
+ foreach ( $oldIds as $blobId => $oldIds2 ) {
+ $this->error( 'restore text', "Error: missing target $cluster/$blobId for two-part ES URL", $oldIds2 );
}
}
}