Jack Phoenix has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/404273 )
Change subject: Update our forked version of Special:Undelete from MW 1.24.1
version to 1.30.0 version
......................................................................
Update our forked version of Special:Undelete from MW 1.24.1 version to 1.30.0
version
The fact that we even *have* to copy this much code just to add support
for a new namespace to Special:Undelete is absurd and ridiculous.
Mostly copypasted from core, the changes specific to the Video extension
are appropriately marked as such with the "CORE HACK" tags to easily
identify them.
Untested.
Change-Id: Ic6b7b494ec8bbd416d0488ed52f54dd49348c241
---
M includes/specials/SpecialUndeleteWithVideoSupport.php
1 file changed, 187 insertions(+), 113 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Video
refs/changes/73/404273/1
diff --git a/includes/specials/SpecialUndeleteWithVideoSupport.php
b/includes/specials/SpecialUndeleteWithVideoSupport.php
index 83ab994..0a8d2ba 100644
--- a/includes/specials/SpecialUndeleteWithVideoSupport.php
+++ b/includes/specials/SpecialUndeleteWithVideoSupport.php
@@ -3,7 +3,7 @@
* A hacked version of MediaWiki's standard Special:Undelete for supporting the
* undeletion of videos without changing core MediaWiki code.
*
- * Based on MediaWiki 1.24.1's /includes/specials/SpecialUndelete.php.
+ * Based on MediaWiki 1.30.0's /includes/specials/SpecialUndelete.php.
*
* Check the code comments to see what's changed.
* The four major chunks of code which have been added are marked with "CORE
HACK",
@@ -13,8 +13,11 @@
*
* @file
* @ingroup SpecialPage
- * @date 4 May 2015
+ * @date 15 January 2017
*/
+
+// Not sure if we even need this, but better safe than sorry...
+use Wikimedia\Rdbms\ResultWrapper;
class SpecialUndeleteWithVideoSupport extends SpecialUndelete {
/** @var Title */
@@ -49,6 +52,7 @@
$posted = $request->wasPosted() &&
$user->matchEditToken( $request->getVal( 'wpEditToken'
) );
$this->mRestore = $request->getCheck( 'restore' ) && $posted;
+ $this->mRevdel = $request->getCheck( 'revdel' ) && $posted;
$this->mInvert = $request->getCheck( 'invert' ) && $posted;
$this->mPreview = $request->getCheck( 'preview' ) && $posted;
$this->mDiff = $request->getCheck( 'diff' );
@@ -72,10 +76,10 @@
}
if ( $this->mRestore || $this->mInvert ) {
- $timestamps = array();
- $this->mFileVersions = array();
+ $timestamps = [];
+ $this->mFileVersions = [];
foreach ( $request->getValues() as $key => $val ) {
- $matches = array();
+ $matches = [];
if ( preg_match( '/^ts(\d{14})$/', $key,
$matches ) ) {
array_push( $timestamps, $matches[1] );
}
@@ -107,6 +111,8 @@
}
function execute( $par ) {
+ $this->useTransactionalTimeLimit();
+
$user = $this->getUser();
$this->setHeaders();
@@ -128,9 +134,7 @@
return;
}
- if ( method_exists( $out, 'addHelpLink' ) ) { // MW 1.25 or
1.26+ thing
- $out->addHelpLink( 'Help:Undelete' );
- }
+ $this->addHelpLink( 'Help:Undelete' );
if ( $this->mAllowed ) {
$out->setPageTitle( $this->msg( 'undeletepage' ) );
} else {
@@ -178,32 +182,62 @@
}
}
// END CORE HACK
- elseif ( $this->mRestore && $this->mAction == 'submit' ) {
- $this->undelete();
+ elseif ( $this->mAction == 'submit' ) {
+ if ( $this->mRestore ) {
+ $this->undelete();
+ } elseif ( $this->mRevdel ) {
+ $this->redirectToRevDel();
+ }
} else {
$this->showHistory();
}
}
+ /**
+ * Convert submitted form data to format expected by RevisionDelete and
+ * redirect the request
+ */
+ private function redirectToRevDel() {
+ // CORE HACK
+ if ( $this->mTargetObj->inNamespace( NS_VIDEO ) ) {
+ $archive = new VideoPageArchive( $this->mTargetObj );
+ } else {
+ $archive = new PageArchive( $this->mTargetObj );
+ }
+ // CORE HACK END
+
+ $revisions = [];
+
+ foreach ( $this->getRequest()->getValues() as $key => $val ) {
+ $matches = [];
+ if ( preg_match( "/^ts(\d{14})$/", $key, $matches ) ) {
+ $revisions[$archive->getRevision( $matches[1]
)->getId()] = 1;
+ }
+ }
+ $query = [
+ 'type' => 'revision',
+ 'ids' => $revisions,
+ 'target' => $this->mTargetObj->getPrefixedText()
+ ];
+ $url = SpecialPage::getTitleFor( 'Revisiondelete'
)->getFullURL( $query );
+ $this->getOutput()->redirect( $url );
+ }
+
function showHistory() {
+ $this->checkReadOnly();
+
$out = $this->getOutput();
if ( $this->mAllowed ) {
$out->addModules( 'mediawiki.special.undelete' );
}
$out->wrapWikiMsg(
"<div class='mw-undelete-pagetitle'>\n$1\n</div>\n",
- array( 'undeletepagetitle', wfEscapeWikiText(
$this->mTargetObj->getPrefixedText() ) )
+ [ 'undeletepagetitle', wfEscapeWikiText(
$this->mTargetObj->getPrefixedText() ) ]
);
$archive = new PageArchive( $this->mTargetObj,
$this->getConfig() );
- Hooks::run( 'UndeleteForm::showHistory', array( &$archive,
$this->mTargetObj ) );
- /*
- $text = $archive->getLastRevisionText();
- if( is_null( $text ) ) {
- $out->addWikiMsg( 'nohistory' );
- return;
- }
- */
+ Hooks::run( 'UndeleteForm::showHistory', [ &$archive,
$this->mTargetObj ] );
+
$out->addHTML( '<div class="mw-undelete-history">' );
if ( $this->mAllowed ) {
$out->addWikiMsg( 'undeletehistory' );
@@ -248,13 +282,15 @@
}
if ( $this->mAllowed ) {
- $action = $this->getPageTitle()->getLocalURL( array(
'action' => 'submit' ) );
+ $out->enableOOUI();
+
+ $action = $this->getPageTitle()->getLocalURL( [
'action' => 'submit' ] );
# Start the form here
- $top = Xml::openElement(
- 'form',
- array( 'method' => 'post', 'action' => $action,
'id' => 'undelete' )
- );
- $out->addHTML( $top );
+ $form = new OOUI\FormLayout( [
+ 'method' => 'post',
+ 'action' => $action,
+ 'id' => 'undelete',
+ ] );
}
# Show relevant lines from the deletion log:
@@ -269,95 +305,133 @@
}
if ( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
- # Format the user-visible controls (comment field,
submission button)
- # in a nice little table
+ $fields[] = new OOUI\Layout( [
+ 'content' => new OOUI\HtmlSnippet( $this->msg(
'undeleteextrahelp' )->parseAsBlock() )
+ ] );
+
+ $fields[] = new OOUI\FieldLayout(
+ new OOUI\TextInputWidget( [
+ 'name' => 'wpComment',
+ 'inputId' => 'wpComment',
+ 'infusable' => true,
+ 'value' => $this->mComment,
+ 'autofocus' => true,
+ ] ),
+ [
+ 'label' => $this->msg(
'undeletecomment' )->text(),
+ 'align' => 'top',
+ ]
+ );
+
+ $fields[] = new OOUI\FieldLayout(
+ new OOUI\Widget( [
+ 'content' => new OOUI\HorizontalLayout(
[
+ 'items' => [
+ new
OOUI\ButtonInputWidget( [
+ 'name' =>
'restore',
+ 'inputId' =>
'mw-undelete-submit',
+ 'value' => '1',
+ 'label' =>
$this->msg( 'undeletebtn' )->text(),
+ 'flags' => [
'primary', 'progressive' ],
+ 'type' =>
'submit',
+ ] ),
+ new
OOUI\ButtonInputWidget( [
+ 'name' =>
'invert',
+ 'inputId' =>
'mw-undelete-invert',
+ 'value' => '1',
+ 'label' =>
$this->msg( 'undeleteinvert' )->text()
+ ] ),
+ ]
+ ] )
+ ] )
+ );
+
if ( $this->getUser()->isAllowed( 'suppressrevision' )
) {
- $unsuppressBox =
- "<tr>
- <td> </td>
- <td class='mw-input'>" .
- Xml::checkLabel( $this->msg(
'revdelete-unsuppress' )->text(),
- 'wpUnsuppress',
'mw-undelete-unsuppress', $this->mUnsuppress ) .
- "</td>
- </tr>";
- } else {
- $unsuppressBox = '';
+ $fields[] = new OOUI\FieldLayout(
+ new OOUI\CheckboxInputWidget( [
+ 'name' => 'wpUnsuppress',
+ 'inputId' =>
'mw-undelete-unsuppress',
+ 'value' => '1',
+ ] ),
+ [
+ 'label' => $this->msg(
'revdelete-unsuppress' )->text(),
+ 'align' => 'inline',
+ ]
+ );
}
- $table = Xml::fieldset( $this->msg(
'undelete-fieldset-title' )->text() ) .
- Xml::openElement( 'table', array( 'id' =>
'mw-undelete-table' ) ) .
- "<tr>
- <td colspan='2'
class='mw-undelete-extrahelp'>" .
- $this->msg( 'undeleteextrahelp'
)->parseAsBlock() .
- "</td>
- </tr>
- <tr>
- <td class='mw-label'>" .
- Xml::label( $this->msg( 'undeletecomment'
)->text(), 'wpComment' ) .
- "</td>
- <td class='mw-input'>" .
- Xml::input(
- 'wpComment',
- 50,
- $this->mComment,
- array( 'id' => 'wpComment', 'autofocus'
=> '' )
- ) .
- "</td>
- </tr>
- <tr>
- <td> </td>
- <td class='mw-submit'>" .
- Xml::submitButton(
- $this->msg( 'undeletebtn' )->text(),
- array( 'name' => 'restore', 'id' =>
'mw-undelete-submit' )
- ) . ' ' .
- Xml::submitButton(
- $this->msg( 'undeleteinvert' )->text(),
- array( 'name' => 'invert', 'id' =>
'mw-undelete-invert' )
- ) .
- "</td>
- </tr>" .
- $unsuppressBox .
- Xml::closeElement( 'table' ) .
- Xml::closeElement( 'fieldset' );
+ $fieldset = new OOUI\FieldsetLayout( [
+ 'label' => $this->msg(
'undelete-fieldset-title' )->text(),
+ 'id' => 'mw-undelete-table',
+ 'items' => $fields,
+ ] );
- $out->addHTML( $table );
+ $form->appendContent(
+ new OOUI\PanelLayout( [
+ 'expanded' => false,
+ 'padded' => true,
+ 'framed' => true,
+ 'content' => $fieldset,
+ ] ),
+ new OOUI\HtmlSnippet(
+ Html::hidden( 'target', $this->mTarget
) .
+ Html::hidden( 'wpEditToken',
$this->getUser()->getEditToken() )
+ )
+ );
}
- $out->addHTML( Xml::element( 'h2', null, $this->msg( 'history'
)->text() ) . "\n" );
+ $history = '';
+ $history .= Xml::element( 'h2', null, $this->msg( 'history'
)->text() ) . "\n";
if ( $haveRevisions ) {
- # The page's stored (deleted) history:
- $out->addHTML( '<ul>' );
+ # Show the page's stored (deleted) history
+
+ if ( $this->getUser()->isAllowed( 'deleterevision' ) ) {
+ $history .= Html::element(
+ 'button',
+ [
+ 'name' => 'revdel',
+ 'type' => 'submit',
+ 'class' =>
'deleterevision-log-submit mw-log-deleterevision-button'
+ ],
+ $this->msg( 'showhideselectedversions'
)->text()
+ ) . "\n";
+ }
+
+ $history .= '<ul class="mw-undelete-revlist">';
$remaining = $revisions->numRows();
$earliestLiveTime =
$this->mTargetObj->getEarliestRevTime();
foreach ( $revisions as $row ) {
$remaining--;
- $out->addHTML( $this->formatRevisionRow( $row,
$earliestLiveTime, $remaining ) );
+ $history .= $this->formatRevisionRow( $row,
$earliestLiveTime, $remaining );
}
$revisions->free();
- $out->addHTML( '</ul>' );
+ $history .= '</ul>';
} else {
$out->addWikiMsg( 'nohistory' );
}
if ( $haveFiles ) {
- $out->addHTML( Xml::element( 'h2', null, $this->msg(
'filehist' )->text() ) . "\n" );
- $out->addHTML( '<ul>' );
+ $history .= Xml::element( 'h2', null, $this->msg(
'filehist' )->text() ) . "\n";
+ $history .= '<ul class="mw-undelete-revlist">';
foreach ( $files as $row ) {
- $out->addHTML( $this->formatFileRow( $row ) );
+ $history .= $this->formatFileRow( $row );
}
$files->free();
- $out->addHTML( '</ul>' );
+ $history .= '</ul>';
}
if ( $this->mAllowed ) {
# Slip in the hidden controls here
$misc = Html::hidden( 'target', $this->mTarget );
$misc .= Html::hidden( 'wpEditToken',
$this->getUser()->getEditToken() );
- $misc .= Xml::closeElement( 'form' );
- $out->addHTML( $misc );
+ $history .= $misc;
+
+ $form->appendContent( new OOUI\HtmlSnippet( $history )
);
+ $out->addHTML( $form );
+ } else {
+ $out->addHTML( $history );
}
return true;
@@ -406,14 +480,14 @@
return '<span class="history-deleted">' . $time .
'</span>';
}
- $link = Linker::linkKnown(
+ $link = $this->getLinkRenderer()->makeKnownLink(
$titleObj,
- htmlspecialchars( $time ),
- array(),
- array(
+ $time,
+ [],
+ [
'target' =>
$this->mTargetObj->getPrefixedText(),
'timestamp' => $ts
- )
+ ]
);
if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
@@ -445,18 +519,18 @@
if ( $file instanceof ArchivedVideo ) {
$link = Linker::makeExternalLink(
$file->getURL(), $time, /* $escape */ true, /*
$linktype */ '',
- /* $attribs */ array(), $titleObj
+ /* $attribs */ [], $titleObj
);
} else {
- $link = Linker::linkKnown(
+ $link = $this->getLinkRenderer()->makeKnownLink(
$titleObj,
- htmlspecialchars( $time ),
- array(),
- array(
+ $time,
+ [],
+ [
'target' =>
$this->mTargetObj->getPrefixedText(),
'file' => $key,
'token' => $user->getEditToken( $key )
- )
+ ]
);
}
// END CORE HACK
@@ -470,9 +544,9 @@
function formatRevisionRow( $row, $earliestLiveTime, $remaining ) {
$rev = Revision::newFromArchiveRow( $row,
- array(
+ [
'title' => $this->mTargetObj
- ) );
+ ] );
$revTextSize = '';
$ts = wfTimestamp( TS_MW, $row->ar_timestamp );
@@ -501,15 +575,15 @@
$last = $this->msg( 'diff' )->escaped();
} elseif ( $remaining > 0 || ( $earliestLiveTime && $ts
> $earliestLiveTime ) ) {
$pageLink = $this->getPageLink( $rev,
$titleObj, $ts );
- $last = Linker::linkKnown(
+ $last = $this->getLinkRenderer()->makeKnownLink(
$titleObj,
- $this->msg( 'diff' )->escaped(),
- array(),
- array(
+ $this->msg( 'diff' )->text(),
+ [],
+ [
'target' =>
$this->mTargetObj->getPrefixedText(),
'timestamp' => $ts,
'diff' => 'prev'
- )
+ ]
);
} else {
$pageLink = $this->getPageLink( $rev,
$titleObj, $ts );
@@ -536,7 +610,7 @@
$comment = Linker::revComment( $rev );
// Tags
- $attribs = array();
+ $attribs = [];
list( $tagSummary, $classes ) = ChangeTags::formatSummaryRow(
$row->ts_tags,
'deletedhistory',
@@ -566,17 +640,17 @@
// undeletion will be impossible because PageArchive (sic) is passed a
null
// Title when trying to undelete a Video. Fuck this is so fucking
awesome...not.
function undelete() {
- if ( $this->getConfig()->get( 'UploadMaintenance' ) &&
$this->mTargetObj->getNamespace() == NS_FILE ) {
+ if ( $this->getConfig()->get( 'UploadMaintenance' )
+ && $this->mTargetObj->getNamespace() == NS_FILE
+ ) {
throw new ErrorPageError( 'undelete-error',
'filedelete-maintenance' );
}
- if ( wfReadOnly() ) {
- throw new ReadOnlyError;
- }
+ $this->checkReadOnly();
$out = $this->getOutput();
$archive = new PageArchive( $this->mTargetObj,
$this->getConfig() );
- Hooks::run( 'UndeleteForm::undelete', array( &$archive,
$this->mTargetObj ) );
+ Hooks::run( 'UndeleteForm::undelete', [ &$archive,
$this->mTargetObj ] );
$ok = $archive->undelete(
$this->mTargetTimestamp,
$this->mComment,
@@ -587,12 +661,12 @@
if ( is_array( $ok ) ) {
if ( $ok[1] ) { // Undeleted file count
- Hooks::run( 'FileUndeleteComplete', array(
+ Hooks::run( 'FileUndeleteComplete', [
$this->mTargetObj, $this->mFileVersions,
- $this->getUser(), $this->mComment ) );
+ $this->getUser(), $this->mComment ] );
}
- $link = Linker::linkKnown( $this->mTargetObj );
+ $link = $this->getLinkRenderer()->makeKnownLink(
$this->mTargetObj );
$out->addHTML( $this->msg( 'undeletedpage'
)->rawParams( $link )->parse() );
} else {
$out->setPageTitle( $this->msg( 'undelete-error' ) );
@@ -601,7 +675,7 @@
// Show revision undeletion warnings and errors
$status = $archive->getRevisionStatus();
if ( $status && !$status->isGood() ) {
- $out->addWikiText( '<div class="error">' .
+ $out->addWikiText( '<div class="error"
id="mw-error-cannotundelete">' .
$status->getWikiText(
'cannotundelete',
'cannotundelete'
--
To view, visit https://gerrit.wikimedia.org/r/404273
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic6b7b494ec8bbd416d0488ed52f54dd49348c241
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Video
Gerrit-Branch: master
Gerrit-Owner: Jack Phoenix <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits