Merge "Transaction coverage fix for doDeleteArticleReal"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 5 Jun 2014 17:13:36 +0000 (17:13 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 5 Jun 2014 17:13:36 +0000 (17:13 +0000)
1  2 
includes/WikiPage.php

diff --combined includes/WikiPage.php
@@@ -1387,8 -1387,6 +1387,8 @@@ class WikiPage implements Page, IDBAcce
         * If the given revision is newer than the currently set page_latest,
         * update the page record. Otherwise, do nothing.
         *
 +       * @deprecated since 1.24, use updateRevisionOn instead
 +       *
         * @param DatabaseBase $dbw
         * @param Revision $revision
         * @return bool
         * @return Content New complete article content, or null if error.
         *
         * @since 1.21
 +       * @deprecated since 1.24, use replaceSectionAtRev instead
         */
        public function replaceSectionContent( $section, Content $sectionContent, $sectionTitle = '',
                $edittime = null ) {
                wfProfileIn( __METHOD__ );
  
 +              $baseRevId = null;
 +              if ( $edittime && $section !== 'new' ) {
 +                      $dbw = wfGetDB( DB_MASTER );
 +                      $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
 +                      if ( !$rev ) {
 +                              wfDebug( __METHOD__ . " given bad revision time for page " .
 +                                      $this->getId() . "; edittime: $edittime)\n" );
 +                              wfProfileOut( __METHOD__ );
 +                              return null;
 +                      }
 +                      $baseRevId = $rev->getId();
 +              }
 +
 +              wfProfileOut( __METHOD__ );
 +              return $this->replaceSectionAtRev( $section, $sectionContent, $sectionTitle, $baseRevId );
 +      }
 +
 +      /**
 +       * @param string|null|bool $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
 +       * @param Content $sectionContent New content of the section.
 +       * @param string $sectionTitle New section's subject, only if $section is "new".
 +       * @param string $baseRevId integer|null
 +       *
 +       * @throws MWException
 +       * @return Content New complete article content, or null if error.
 +       *
 +       * @since 1.24
 +       */
 +      public function replaceSectionAtRev( $section, Content $sectionContent,
 +              $sectionTitle = '', $baseRevId = null
 +      ) {
 +              wfProfileIn( __METHOD__ );
 +
                if ( strval( $section ) == '' ) {
                        // Whole-page edit; let the whole text through
                        $newContent = $sectionContent;
                        }
  
                        // Bug 30711: always use current version when adding a new section
 -                      if ( is_null( $edittime ) || $section == 'new' ) {
 +                      if ( is_null( $baseRevId ) || $section == 'new' ) {
                                $oldContent = $this->getContent();
                        } else {
 +                              // TODO: try DB_READ first
                                $dbw = wfGetDB( DB_MASTER );
 -                              $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
 +                              $rev = Revision::loadFromId( $dbw, $baseRevId );
  
                                if ( !$rev ) {
                                        wfDebug( "WikiPage::replaceSection asked for bogus section (page: " .
                        return $status;
                }
  
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin( __METHOD__ );
                if ( $id == 0 ) {
                        $this->loadPageData( 'forupdate' );
                        $id = $this->getID();
                        if ( $id == 0 ) {
+                               $dbw->rollback( __METHOD__ );
                                $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
                                return $status;
                        }
                }
  
+               // we need to remember the old content so we can use it to generate all deletion updates.
+               $content = $this->getContent( Revision::RAW );
                // Bitfields to further suppress the content
                if ( $suppress ) {
                        $bitfield = 0;
                        $bitfield = 'rev_deleted';
                }
  
-               // we need to remember the old content so we can use it to generate all deletion updates.
-               $content = $this->getContent( Revision::RAW );
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
                // For now, shunt the revision data into the archive table.
                // Text is *not* removed from the text table; bulk storage
                // is left intact to avoid breaking block-compression or