(bug 18834) Commit Patch from User Joshua C. Lerner <jlerner@gmail.com> for include...
authorJan Luca Naumann <jan@users.mediawiki.org>
Mon, 18 May 2009 14:20:46 +0000 (14:20 +0000)
committerJan Luca Naumann <jan@users.mediawiki.org>
Mon, 18 May 2009 14:20:46 +0000 (14:20 +0000)
includes/Linker.php

index f3fdb54..e93598e 100644 (file)
@@ -1621,7 +1621,56 @@ class Linker {
                }
                $query['token'] = $wgUser->editToken( array( $title->getPrefixedText(),
                        $rev->getUserText() ) );
-               return $this->link( $title, wfMsgHtml( 'rollbacklink' ),
+
+               $dbr = wfGetDB( DB_MASTER );
+
+               // Latest edits by this user, up to 10; if too expensive, use only on smaller wikis
+               $res = $dbr->select( 'revision',
+                       array( 'rev_id' ),
+                       array(  'rev_page' => $rev->getPage(), 
+                               'rev_user_text' => $rev->getUserText()
+                       ), __METHOD__, 
+                       array(  'USE INDEX' => 'page_timestamp',
+                               'ORDER BY' => 'rev_timestamp DESC',
+                               'LIMIT' => 10 ) 
+                       );
+
+               // Swiped from Article::commitRollback()
+               $user = intval( $rev->getUser() );
+               $user_text = $dbr->addQuotes( $rev->getUserText() );
+
+               // Get the last edit not by this guy
+               $s = $dbr->selectRow( 'revision',
+                       array( 'rev_id', 'rev_timestamp', 'rev_deleted' ),
+                       array(  'rev_page' => $rev->getPage(),
+                               "rev_user != {$user} OR rev_user_text != {$user_text}"
+                       ), __METHOD__,
+                       array(  'USE INDEX' => 'page_timestamp',
+                               'ORDER BY'  => 'rev_timestamp DESC' )
+                       );
+
+               if( $s === false ) {
+                       // No one else ever edited this page
+                       return false;
+               } 
+               elseif( $s->rev_deleted & REVISION::DELETED_TEXT || $s->rev_deleted & REVISION::DELETED_USER ) {
+                       // Only admins can see this text
+                       return false;
+               }
+
+               $editCount = 0;
+               while( $row = $dbr->fetchObject( $res ) ) {
+                       $editCount++;
+                       if( $s->rev_id > $row->rev_id ) {
+                               break;
+                       }
+               }
+
+               // We only bother to count up to 10
+               if( $editCount == 10 )
+                       $editCount = '10+';
+
+               return $this->link( $title, wfMsgHtml( 'rollbacklink', $editCount ),
                        array( 'title' => wfMsg( 'tooltip-rollback' ) ),
                        $query, array( 'known', 'noclasses' ) );
        }