Merge "Select "move subpages" by default when moving a page"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 19 Aug 2019 07:51:46 +0000 (07:51 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 19 Aug 2019 07:51:46 +0000 (07:51 +0000)
1  2 
includes/specials/SpecialMovepage.php

@@@ -147,19 -147,13 +147,19 @@@ class MovePageForm extends UnlistedSpec
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'move-page', $this->oldTitle->getPrefixedText() ) );
                $out->addModuleStyles( 'mediawiki.special' );
 -              $out->addModules( 'mediawiki.special.movePage' );
 +              $out->addModules( 'mediawiki.misc-authed-ooui' );
                $this->addHelpLink( 'Help:Moving a page' );
  
 -              $out->addWikiMsg( $this->getConfig()->get( 'FixDoubleRedirects' ) ?
 -                      'movepagetext' :
 -                      'movepagetext-noredirectfixer'
 -              );
 +              $handlerSupportsRedirects = ContentHandler::getForTitle( $this->oldTitle )
 +                      ->supportsRedirects();
 +
 +              if ( $this->getConfig()->get( 'FixDoubleRedirects' ) ) {
 +                      $out->addWikiMsg( 'movepagetext' );
 +              } else {
 +                      $out->addWikiMsg( $handlerSupportsRedirects ?
 +                              'movepagetext-noredirectfixer' :
 +                              'movepagetext-noredirectsupport' );
 +              }
  
                if ( $this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
                        $out->wrapWikiMsg(
                $deleteAndMove = false;
                $moveOverShared = false;
  
 +              $user = $this->getUser();
 +
                $newTitle = $this->newTitle;
  
                if ( !$newTitle ) {
                        # If a title was supplied, probably from the move log revert
                        # link, check for validity. We can then show some diagnostic
                        # information and save a click.
 -                      $newerr = $this->oldTitle->isValidMoveOperation( $newTitle );
 -                      if ( is_array( $newerr ) ) {
 -                              $err = $newerr;
 +                      $mp = new MovePage( $this->oldTitle, $newTitle );
 +                      $status = $mp->isValidMove();
 +                      $status->merge( $mp->checkPermissions( $user, null ) );
 +                      if ( $status->getErrors() ) {
 +                              $err = $status->getErrorsArray();
                        }
                }
  
 -              $user = $this->getUser();
 -
                if ( count( $err ) == 1 && isset( $err[0][0] ) && $err[0][0] == 'articleexists'
                        && $newTitle->quickUserCan( 'delete', $user )
                ) {
                        }
                }
  
 -              $handler = ContentHandler::getForTitle( $this->oldTitle );
 -
                $out->enableOOUI();
                $fields = [];
  
                }
  
                if ( $user->isAllowed( 'suppressredirect' ) ) {
 -                      if ( $handler->supportsRedirects() ) {
 +                      if ( $handlerSupportsRedirects ) {
                                $isChecked = $this->leaveRedirect;
                                $isDisabled = false;
                        } else {
                                        'name' => 'wpMovesubpages',
                                        'id' => 'wpMovesubpages',
                                        'value' => '1',
-                                       # Don't check the box if we only have talk subpages to
-                                       # move and we aren't moving the talk page.
-                                       'selected' => $this->moveSubpages && ( $this->oldTitle->hasSubpages() || $this->moveTalk ),
+                                       'selected' => true, // T222953 Always check the box
                                ] ),
                                [
                                        'label' => new OOUI\HtmlSnippet(
                if ( $nt->getNamespace() == NS_FILE
                        && !( $this->moveOverShared && $user->isAllowed( 'reupload-shared' ) )
                        && !RepoGroup::singleton()->getLocalRepo()->findFile( $nt )
 -                      && wfFindFile( $nt )
 +                      && MediaWikiServices::getInstance()->getRepoGroup()->findFile( $nt )
                ) {
                        $this->showForm( [ [ 'file-exists-sharedrepo' ] ] );
  
  
                        // Delete an associated image if there is
                        if ( $nt->getNamespace() == NS_FILE ) {
 -                              $file = wfLocalFile( $nt );
 +                              $file = MediaWikiServices::getInstance()->getRepoGroup()->getLocalRepo()
 +                                      ->newFile( $nt );
                                $file->load( File::READ_LATEST );
                                if ( $file->exists() ) {
                                        $file->delete( $reason, false, $user );
                # Do the actual move.
                $mp = new MovePage( $ot, $nt );
  
 +              # check whether the requested actions are permitted / possible
                $userPermitted = $mp->checkPermissions( $user, $this->reason )->isOK();
 +              if ( $ot->isTalkPage() || $nt->isTalkPage() ) {
 +                      $this->moveTalk = false;
 +              }
 +              if ( $this->moveSubpages ) {
 +                      $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 +                      $this->moveSubpages = $permissionManager->userCan( 'move-subpages', $user, $ot );
 +              }
  
                $status = $mp->moveIfAllowed( $user, $this->reason, $createRedirect );
                if ( !$status->isOK() ) {
                $movePage = $this;
                Hooks::run( 'SpecialMovepageAfterMove', [ &$movePage, &$ot, &$nt ] );
  
 -              # Now we move extra pages we've been asked to move: subpages and talk
 -              # pages.  First, if the old page or the new page is a talk page, we
 -              # can't move any talk pages: cancel that.
 -              if ( $ot->isTalkPage() || $nt->isTalkPage() ) {
 -                      $this->moveTalk = false;
 -              }
 -
 -              if ( count( $ot->getUserPermissionsErrors( 'move-subpages', $user ) ) ) {
 -                      $this->moveSubpages = false;
 -              }
 -
 -              /**
 -               * Next make a list of id's.  This might be marginally less efficient
 +              /*
 +               * Now we move extra pages we've been asked to move: subpages and talk
 +               * pages.
 +               *
 +               * First, make a list of id's.  This might be marginally less efficient
                 * than a more direct method, but this is not a highly performance-cri-
                 * tical code path and readable code is more important here.
                 *
                                continue;
                        }
  
 +                      $mp = new MovePage( $oldSubpage, $newSubpage );
                        # This was copy-pasted from Renameuser, bleh.
 -                      if ( $newSubpage->exists() && !$oldSubpage->isValidMoveTarget( $newSubpage ) ) {
 +                      if ( $newSubpage->exists() && !$mp->isValidMove()->isOk() ) {
                                $link = $linkRenderer->makeKnownLink( $newSubpage );
                                $extraOutput[] = $this->msg( 'movepage-page-exists' )->rawParams( $link )->escaped();
                        } else {
 -                              $success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect );
 +                              $status = $mp->moveIfAllowed( $user, $this->reason, $createRedirect );
  
 -                              if ( $success === true ) {
 +                              if ( $status->isOK() ) {
                                        if ( $this->fixRedirects ) {
                                                DoubleRedirectJob::fixRedirects( 'move', $oldSubpage, $newSubpage );
                                        }