Break the cyclic dependency between SearchEngine and SearchResult
[lhc/web/wiklou.git] / includes / MovePage.php
index f48d92e..a63eeae 100644 (file)
@@ -70,6 +70,11 @@ class MovePage {
         */
        protected $permMgr;
 
+       /**
+        * @var RepoGroup
+        */
+       protected $repoGroup;
+
        /**
         * Calling this directly is deprecated in 1.34. Use MovePageFactory instead.
         *
@@ -88,7 +93,8 @@ class MovePage {
                LoadBalancer $loadBalancer = null,
                NamespaceInfo $nsInfo = null,
                WatchedItemStore $watchedItems = null,
-               PermissionManager $permMgr = null
+               PermissionManager $permMgr = null,
+               RepoGroup $repoGroup = null
        ) {
                $this->oldTitle = $oldTitle;
                $this->newTitle = $newTitle;
@@ -101,6 +107,7 @@ class MovePage {
                $this->watchedItems =
                        $watchedItems ?? MediaWikiServices::getInstance()->getWatchedItemStore();
                $this->permMgr = $permMgr ?? MediaWikiServices::getInstance()->getPermissionManager();
+               $this->repoGroup = $repoGroup ?? MediaWikiServices::getInstance()->getRepoGroup();
        }
 
        /**
@@ -157,35 +164,33 @@ class MovePage {
 
                if ( $this->oldTitle->equals( $this->newTitle ) ) {
                        $status->fatal( 'selfmove' );
+               } elseif ( $this->newTitle->getArticleID() && !$this->isValidMoveTarget() ) {
+                       // The move is allowed only if (1) the target doesn't exist, or (2) the target is a
+                       // redirect to the source, and has no history (so we can undo bad moves right after
+                       // they're done).
+                       $status->fatal( 'articleexists' );
                }
-               if ( !$this->oldTitle->isMovable() ) {
+
+               // @todo If the old title is invalid, maybe we should check if it somehow exists in the
+               // database and allow moving it to a valid name? Why prohibit the move from an empty name
+               // without checking in the database?
+               if ( $this->oldTitle->getDBkey() == '' ) {
+                       $status->fatal( 'badarticleerror' );
+               } elseif ( $this->oldTitle->isExternal() ) {
+                       $status->fatal( 'immobile-source-namespace-iw' );
+               } elseif ( !$this->oldTitle->isMovable() ) {
                        $status->fatal( 'immobile-source-namespace', $this->oldTitle->getNsText() );
+               } elseif ( !$this->oldTitle->exists() ) {
+                       $status->fatal( 'movepage-source-doesnt-exist' );
                }
+
                if ( $this->newTitle->isExternal() ) {
                        $status->fatal( 'immobile-target-namespace-iw' );
-               }
-               if ( !$this->newTitle->isMovable() ) {
+               } elseif ( !$this->newTitle->isMovable() ) {
                        $status->fatal( 'immobile-target-namespace', $this->newTitle->getNsText() );
                }
-
-               $oldid = $this->oldTitle->getArticleID();
-
-               if ( $this->newTitle->getDBkey() === '' ) {
-                       $status->fatal( 'articleexists' );
-               }
-               if (
-                       ( $this->oldTitle->getDBkey() == '' ) ||
-                       ( !$oldid ) ||
-                       ( $this->newTitle->getDBkey() == '' )
-               ) {
-                       $status->fatal( 'badarticleerror' );
-               }
-
-               # The move is allowed only if (1) the target doesn't exist, or
-               # (2) the target is a redirect to the source, and has no history
-               # (so we can undo bad moves right after they're done).
-               if ( $this->newTitle->getArticleID() && !$this->isValidMoveTarget() ) {
-                       $status->fatal( 'articleexists' );
+               if ( !$this->newTitle->isValid() ) {
+                       $status->fatal( 'movepage-invalid-target-title' );
                }
 
                // Content model checks
@@ -230,7 +235,14 @@ class MovePage {
         */
        protected function isValidFileMove() {
                $status = new Status();
-               $file = wfLocalFile( $this->oldTitle );
+
+               if ( !$this->newTitle->inNamespace( NS_FILE ) ) {
+                       $status->fatal( 'imagenocrossnamespace' );
+                       // No need for further errors about the target filename being wrong
+                       return $status;
+               }
+
+               $file = $this->repoGroup->getLocalRepo()->newFile( $this->oldTitle );
                $file->load( File::READ_LATEST );
                if ( $file->exists() ) {
                        if ( $this->newTitle->getText() != wfStripIllegalFilenameChars( $this->newTitle->getText() ) ) {
@@ -241,10 +253,6 @@ class MovePage {
                        }
                }
 
-               if ( !$this->newTitle->inNamespace( NS_FILE ) ) {
-                       $status->fatal( 'imagenocrossnamespace' );
-               }
-
                return $status;
        }
 
@@ -258,7 +266,7 @@ class MovePage {
        protected function isValidMoveTarget() {
                # Is it an existing file?
                if ( $this->newTitle->inNamespace( NS_FILE ) ) {
-                       $file = wfLocalFile( $this->newTitle );
+                       $file = $this->repoGroup->getLocalRepo()->newFile( $this->newTitle );
                        $file->load( File::READ_LATEST );
                        if ( $file->exists() ) {
                                wfDebug( __METHOD__ . ": file exists\n" );
@@ -679,15 +687,15 @@ class MovePage {
                        $oldTitle->getPrefixedText()
                );
 
-               $file = wfLocalFile( $oldTitle );
+               $file = $this->repoGroup->getLocalRepo()->newFile( $oldTitle );
                $file->load( File::READ_LATEST );
                if ( $file->exists() ) {
                        $status = $file->move( $newTitle );
                }
 
                // Clear RepoGroup process cache
-               RepoGroup::singleton()->clearCache( $oldTitle );
-               RepoGroup::singleton()->clearCache( $newTitle ); # clear false negative cache
+               $this->repoGroup->clearCache( $oldTitle );
+               $this->repoGroup->clearCache( $newTitle ); # clear false negative cache
                return $status;
        }