From: Brion Vibber Date: Tue, 10 May 2011 01:11:52 +0000 (+0000) Subject: * (bug 21279) Special:RevisionDelete now uses revision ID for deleted-page revisions... X-Git-Tag: 1.31.0-rc.0~30301 X-Git-Url: http://git.cyclocoop.org/%24image?a=commitdiff_plain;h=0344ea9ffff1bf21eb74625c5e2aa8de4b5e3004;p=lhc%2Fweb%2Fwiklou.git * (bug 21279) Special:RevisionDelete now uses revision ID for deleted-page revisions when ar_rev_id is available. - saved Special:RevisionDelete links from before page deletion still work as-is after deletion - old log entries for rev-delete adjustments no longer magically switch to linking to Special:RevisionDelete with archive & ar_timestamp (they remain the same, as the links continue to work) If you call Special:RevisionDelete using the older-style &type=archive links (using ar_timestamp as id) it will still save the same form to log for now; this may be fixed later for cases where the ar_rev_id is available. Requires FakeResultWrapper fixes from r87803. --- diff --git a/includes/revisiondelete/RevisionDelete.php b/includes/revisiondelete/RevisionDelete.php index c331ec6162..5831996969 100644 --- a/includes/revisiondelete/RevisionDelete.php +++ b/includes/revisiondelete/RevisionDelete.php @@ -1,6 +1,12 @@ ids ); - return $db->select( array('revision','page'), '*', + $live = $db->select( array('revision','page'), '*', array( 'rev_page' => $this->title->getArticleID(), 'rev_id' => $ids, @@ -25,10 +31,49 @@ class RevDel_RevisionList extends RevDel_List { __METHOD__, array( 'ORDER BY' => 'rev_id DESC' ) ); + + if ( $live->numRows() >= count( $ids ) ) { + // All requested revisions are live, keeps things simple! + return $live; + } + + // Check if any requested revisions are available fully deleted. + $archived = $db->select( array( 'archive' ), '*', + array( + 'ar_rev_id' => $ids + ), + __METHOD__, + array( 'ORDER BY' => 'ar_rev_id DESC' ) + ); + + if ( $archived->numRows() == 0 ) { + return $live; + } else if ( $live->numRows() == 0 ) { + return $archived; + } else { + // Combine the two! Whee + $rows = array(); + while ( $row = $live->fetchObject() ) { + $rows[$row->rev_id] = $row; + } + while ( $row = $archived->fetchObject() ) { + $rows[$row->ar_rev_id] = $row; + } + krsort( $rows ); + return new FakeResultWrapper( array_values( $rows ) ); + } } public function newItem( $row ) { - return new RevDel_RevisionItem( $this, $row ); + if ( isset( $row->rev_id ) ) { + return new RevDel_RevisionItem( $this, $row ); + } elseif ( isset( $row->ar_rev_id ) ) { + return new RevDel_ArchivedRevisionItem( $this, $row ); + } else { + // This shouldn't happen. :) + var_dump( $row ); + throw new MWException( 'Invalid row type in RevDel_RevisionList' ); + } } public function getCurrent() { @@ -58,7 +103,7 @@ class RevDel_RevisionList extends RevDel_List { } /** - * Item class for a revision table row + * Item class for a live revision table row */ class RevDel_RevisionItem extends RevDel_Item { var $revision; @@ -281,6 +326,35 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem { } } + +/** + * Item class for a archive table row by ar_rev_id -- actually + * used via RevDel_RevisionList. + */ +class RevDel_ArchivedRevisionItem extends RevDel_ArchiveItem { + public function __construct( $list, $row ) { + RevDel_Item::__construct( $list, $row ); + + $this->revision = Revision::newFromArchiveRow( $row, + array( 'page' => $this->list->title->getArticleId() ) ); + } + + public function getId() { + return $this->revision->getId(); + } + + public function setBits( $bits ) { + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( 'archive', + array( 'ar_deleted' => $bits ), + array( 'ar_rev_id' => $this->row->ar_rev_id, + 'ar_deleted' => $this->getBits() + ), + __METHOD__ ); + return (bool)$dbw->affectedRows(); + } +} + /** * List for oldimage table items */ diff --git a/includes/revisiondelete/RevisionDeleteAbstracts.php b/includes/revisiondelete/RevisionDeleteAbstracts.php index d57b87960e..1240f6eb2a 100644 --- a/includes/revisiondelete/RevisionDeleteAbstracts.php +++ b/includes/revisiondelete/RevisionDeleteAbstracts.php @@ -1,7 +1,10 @@ $id ) { - $existResult = - self::checkRevisionExistence( $title, $id ); - - if ($existResult !== true) { - $key = 'archive'; - $Ids[$k] = $existResult; - } else { - // Undeleted revision amidst deleted ones - unset($Ids[$k]); - $undeletedRevisions[] = $id; - } - } - - if ( $key == $originalKey ) { - $Ids = $undeletedRevisions; - $undeletedRevisions = array(); - } + // Nothing to do; deleted revisions can still be looked up by ID. } // Diff link for single rev deletions