Merge "Prevent page moved to different content model." into Wikidata
authordaniel <daniel.kinzler@wikimedia.de>
Mon, 8 Oct 2012 11:11:33 +0000 (11:11 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 8 Oct 2012 11:11:33 +0000 (11:11 +0000)
1  2 
includes/Title.php

diff --combined includes/Title.php
@@@ -3375,7 -3375,7 +3375,7 @@@ class Title 
         * @return Mixed True on success, getUserPermissionsErrors()-like array on failure
         */
        public function isValidMoveOperation( &$nt, $auth = true, $reason = '' ) {
-               global $wgUser;
+               global $wgUser, $wgContentHandlerUseDB;
  
                $errors = array();
                if ( !$nt ) {
                        $errors[] = array( 'badarticleerror' );
                }
  
+               // Content model checks
+               if ( !$wgContentHandlerUseDB &&
+                               $this->getContentModel() !== $nt->getContentModel() ) {
+                       // can't move a page if that would change the page's content model
+                       $errors[] = array( 'bad-target-model',
+                                                       ContentHandler::getLocalizedName( $this->getContentModel() ),
+                                                       ContentHandler::getLocalizedName( $nt->getContentModel() ) );
+               }
                // Image-specific checks
                if ( $this->getNamespace() == NS_FILE ) {
                        $errors = array_merge( $errors, $this->validateFileMoveOperation( $nt ) );
                        $logType = 'move';
                }
  
 -              $redirectSuppressed = !$createRedirect;
 +              if ( $createRedirect ) {
 +                      $contentHandler = ContentHandler::getForTitle( $this );
 +                      $redirectContent = $contentHandler->makeRedirectContent( $nt );
 +
 +                      // NOTE: If this page's content model does not support redirects, $redirectContent will be null.
 +              } else {
 +                      $redirectContent = null;
 +              }
  
                $logEntry = new ManualLogEntry( 'move', $logType );
                $logEntry->setPerformer( $wgUser );
                $logEntry->setComment( $reason );
                $logEntry->setParameters( array(
                        '4::target' => $nt->getPrefixedText(),
 -                      '5::noredir' => $redirectSuppressed ? '1': '0',
 +                      '5::noredir' => $redirectContent ? '0': '1',
                ) );
  
                $formatter = LogFormatter::newFromEntry( $logEntry );
                }
  
                # Recreate the redirect, this time in the other direction.
 -              if ( $redirectSuppressed ) {
 +              if ( !$redirectContent ) {
                        WikiPage::onArticleDelete( $this );
                } else {
 -                      $mwRedir = MagicWord::get( 'redirect' );
 -                      $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $nt->getPrefixedText() . "]]\n";
                        $redirectArticle = WikiPage::factory( $this );
                        $newid = $redirectArticle->insertOn( $dbw );
                        if ( $newid ) { // sanity
                                $redirectRevision = new Revision( array(
                                        'page'    => $newid,
                                        'comment' => $comment,
 -                                      'text'    => $redirectText ) );
 +                                      'content'    => $redirectContent ) );
                                $redirectRevision->insertOn( $dbw );
                                $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );