http://www.mediawiki.org/wiki/Special:Code/MediaWiki/99635

Revision: 99635
Author:   nikerabbit
Date:     2011-10-12 16:23:54 +0000 (Wed, 12 Oct 2011)
Log Message:
-----------
* Fixed bug 31630: Renaming page translation page creates multiple log entries
** Replaced the old racy system with $objectcache->decr() which in theory can 
be atomic
** Replaced $wgMemc with wfGetCache( CACHE_ANYTHING );
* Added target page as parameter to log moveok log entry
* Fixed the parameter in edit summaries of individual page moves to refer to 
the base bage
* Fixed a fatal in TranslateEditAddons.php when editing a translation which is 
in the process of being moved

Modified Paths:
--------------
    trunk/extensions/Translate/PageTranslation.i18n.php
    trunk/extensions/Translate/README
    trunk/extensions/Translate/TranslateEditAddons.php
    trunk/extensions/Translate/tag/MoveJob.php
    trunk/extensions/Translate/tag/PageTranslationHooks.php
    trunk/extensions/Translate/tag/SpecialPageTranslationMovePage.php

Modified: trunk/extensions/Translate/PageTranslation.i18n.php
===================================================================
--- trunk/extensions/Translate/PageTranslation.i18n.php 2011-10-12 15:42:42 UTC 
(rev 99634)
+++ trunk/extensions/Translate/PageTranslation.i18n.php 2011-10-12 16:23:54 UTC 
(rev 99635)
@@ -99,7 +99,7 @@
        'pt-log-name' => 'Page translation log',
        'pt-log-mark' => '{{GENDER:$2|marked}} revision $3 of page "[[:$1]]" 
for translation',
        'pt-log-unmark' => '{{GENDER:$2|removed}} page "[[:$1]]" from 
translation',
-       'pt-log-moveok' => '{{GENDER:$2|completed}} renaming of translatable 
page $1 to a new name',
+       'pt-log-moveok' => '{{GENDER:$2|completed}} renaming of translatable 
page $1 to $3',
        'pt-log-movenok' => '{{GENDER:$2|encountered}} a problem while moving 
[[:$1]] to [[:$3]]',
        'pt-log-delete-full-ok' => '{{GENDER:$2|completed}} deletion of 
translatable page $1',
        'pt-log-delete-full-nok' => '{{GENDER:$2|encountered}} a problem while 
deleting translatable page [[:$1]]',

Modified: trunk/extensions/Translate/README
===================================================================
--- trunk/extensions/Translate/README   2011-10-12 15:42:42 UTC (rev 99634)
+++ trunk/extensions/Translate/README   2011-10-12 16:23:54 UTC (rev 99635)
@@ -29,6 +29,8 @@
  http://translatewiki.net/docs/Translate/html/
 
 == Change log ==
+* 2011-10-12
+- Multiple bug fixes and improvements to translatable page moving feature
 * 2011-10-07
 - $wgTranslateNewsletterPreference was introduced (default: false). Setting 
this
   to true, will once again add the "Do not send me e-mail newsletters"

Modified: trunk/extensions/Translate/TranslateEditAddons.php
===================================================================
--- trunk/extensions/Translate/TranslateEditAddons.php  2011-10-12 15:42:42 UTC 
(rev 99634)
+++ trunk/extensions/Translate/TranslateEditAddons.php  2011-10-12 16:23:54 UTC 
(rev 99635)
@@ -31,6 +31,11 @@
                }
 
                $group = $handle->getGroup();
+               // Happens when translation page move is in progress
+               if ( !$group ) {
+                       return true;
+               }
+
                $key = $handle->getKey();
                $code = $handle->getCode();
                $collection = $group->initCollection( 
$group->getSourceLanguage() );

Modified: trunk/extensions/Translate/tag/MoveJob.php
===================================================================
--- trunk/extensions/Translate/tag/MoveJob.php  2011-10-12 15:42:42 UTC (rev 
99634)
+++ trunk/extensions/Translate/tag/MoveJob.php  2011-10-12 16:23:54 UTC (rev 
99635)
@@ -9,28 +9,27 @@
  */
 
 /**
- * Contains class with job for moving translation pages.
+ * Contains class with job for moving translation pages. Used together with 
PageTranslationMovePage class.
  *
  * @ingroup PageTranslation JobQueue
- * @todo Get rid of direct reference to $wgMemc.
  */
 class MoveJob extends Job {
 
        /**
         * @param $source Title
         * @param $target Title
-        * @param $base
+        * @param $params array, should include base-source and base-target
         * @param $performer
         * @return MoveJob
         */
-       public static function newJob( Title $source, Title $target, $base, 
/*User*/ $performer ) {
+       public static function newJob( Title $source, Title $target, array 
$params, /*User*/ $performer ) {
                global $wgTranslateFuzzyBotName;
 
                $job = new self( $source );
                $job->setUser( $wgTranslateFuzzyBotName );
                $job->setTarget( $target->getPrefixedText() );
-               $job->setSummary( wfMsgForContent( 'pt-movepage-logreason', 
$target->getPrefixedText() ) );
-               $job->setBase( $base );
+               $job->setSummary( wfMsgForContent( 'pt-movepage-logreason', 
$params['base-source'] ) );
+               $job->setParams( $params );
                $job->setPerformer( $performer );
                $job->lock();
                return $job;
@@ -49,7 +48,7 @@
                $user    = $this->getUser();
                $summary = $this->getSummary();
                $target  = $this->getTarget();
-               $base    = $this->getBase();
+               $base    = $this->params['base-source'];
 
                PageTranslationHooks::$allowTargetEdit = true;
                $oldUser = $wgUser;
@@ -74,21 +73,20 @@
 
                $this->unlock();
 
-               global $wgMemc;
-               $pages = (array) $wgMemc->get( wfMemcKey( 'pt-base', $base ) );
-               $last = true;
+               
+               $cache = wfGetCache( CACHE_ANYTHING );
+               $key = wfMemcKey( 'translate-pt-move', $base );
+               
+               $count = $cache->decr( $key );
+               $last = strval($count) === "0";
 
-               foreach ( $pages as $page ) {
-                       if ( $wgMemc->get( wfMemcKey( 'pt-lock', $page ) ) === 
true ) {
-                               $last = false;
-                               break;
-                       }
-               }
-
                if ( $last )  {
-                       $wgMemc->delete( wfMemcKey( 'pt-base', $base ) );
+                       $cache->delete( $key );
                        $logger = new LogPage( 'pagetranslation' );
-                       $params = array( 'user' => $this->getPerformer() );
+                       $params = array(
+                               'user' => $this->getPerformer(),
+                               'target' => $this->params['base-target'],
+                       );
                        $doer = User::newFromName( $this->getPerformer() );
                        $logger->addEntry( 'moveok', Title::newFromText( $base 
), null, array( serialize( $params ) ), $doer );
                }
@@ -106,14 +104,6 @@
                return $this->params['summary'];
        }
 
-       public function setBase( $base ) {
-               $this->params['base'] = $base;
-       }
-
-       public function getBase() {
-               return $this->params['base'];
-       }
-
        public function setPerformer( $performer ) {
                if ( is_object( $performer ) ) {
                        $this->params['performer'] = $performer->getName();
@@ -154,16 +144,22 @@
                return User::newFromName( $this->params['user'], false );
        }
 
+       public function setParams( array $params ) {
+               foreach ( $params as $k => $v ) {
+                       $this->params[$k] = $v;
+               }
+       }
+
        public function lock() {
-               global $wgMemc;
-               $wgMemc->set( wfMemcKey( 'pt-lock', 
$this->title->getPrefixedText() ), true, 60 * 60 * 6 );
-               $wgMemc->set( wfMemcKey( 'pt-lock', 
$this->getTarget()->getPrefixedText() ), true, 60 * 60 * 6 );
+               $cache = wfGetCache( CACHE_ANYTHING );
+               $cache->set( wfMemcKey( 'pt-lock', 
$this->title->getPrefixedText() ), true );
+               $cache->set( wfMemcKey( 'pt-lock', 
$this->getTarget()->getPrefixedText() ), true );
        }
 
        public function unlock() {
-               global $wgMemc;
-               $wgMemc->delete( wfMemcKey( 'pt-lock', 
$this->title->getPrefixedText() ) );
-               $wgMemc->delete( wfMemcKey( 'pt-lock', 
$this->getTarget()->getPrefixedText() ) );
+               $cache = wfGetCache( CACHE_ANYTHING );
+               $cache->delete( wfMemcKey( 'pt-lock', 
$this->title->getPrefixedText() ) );
+               $cache->delete( wfMemcKey( 'pt-lock', 
$this->getTarget()->getPrefixedText() ) );
        }
 
        /**

Modified: trunk/extensions/Translate/tag/PageTranslationHooks.php
===================================================================
--- trunk/extensions/Translate/tag/PageTranslationHooks.php     2011-10-12 
15:42:42 UTC (rev 99634)
+++ trunk/extensions/Translate/tag/PageTranslationHooks.php     2011-10-12 
16:23:54 UTC (rev 99635)
@@ -519,7 +519,9 @@
                } elseif ( $action === 'unmark' ) {
                        return wfMsgExt( 'pt-log-unmark', $opts, 
$title->getPrefixedText(), $user );
                } elseif ( $action === 'moveok' ) {
-                       return wfMsgExt( 'pt-log-moveok', $opts, 
$title->getPrefixedText(), $user );
+                       // Old entries are missing the target
+                       $target = isset( $_['target'] ) ? $_['target'] : '[[]]';
+                       return wfMsgExt( 'pt-log-moveok', $opts, 
$title->getPrefixedText(), $user, $target );
                } elseif ( $action === 'movenok' ) {
                        return wfMsgExt( 'pt-log-movenok', $opts, 
$title->getPrefixedText(), $user, $_['target'] );
                } elseif ( $action === 'deletefnok' ) {
@@ -543,9 +545,10 @@
 
        /// Hook: getUserPermissionsErrorsExpensive
        public static function lockedPagesCheck( Title $title, User $user, 
$action, &$result ) {
-               global $wgMemc;
+               $cache = wfGetCache( CACHE_ANYTHING );
                $key = wfMemcKey( 'pt-lock', $title->getPrefixedText() );
-               if ( $wgMemc->get( $key ) === true ) {
+               // At least memcached mangles true to "1"
+               if ( $cache->get( $key ) == true ) {
                        $result = array( 'pt-locked-page' );
                        return false;
                }

Modified: trunk/extensions/Translate/tag/SpecialPageTranslationMovePage.php
===================================================================
--- trunk/extensions/Translate/tag/SpecialPageTranslationMovePage.php   
2011-10-12 15:42:42 UTC (rev 99634)
+++ trunk/extensions/Translate/tag/SpecialPageTranslationMovePage.php   
2011-10-12 16:23:54 UTC (rev 99635)
@@ -353,16 +353,21 @@
                $base = $this->oldTitle->getPrefixedText();
                $oldLatest = $this->oldTitle->getLatestRevId();
 
+               $params = array(
+                       'base-source' => $this->oldTitle->getPrefixedText(),
+                       'base-target' => $this->newTitle->getPrefixedText(),
+               );
+
                $translationPages = $this->getTranslationPages();
                foreach ( $translationPages as $old ) {
                        $to = $this->newPageTitle( $base, $old, $target );
-                       $jobs[$old->getPrefixedText()] = MoveJob::newJob( $old, 
$to, $base, $this->user );
+                       $jobs[$old->getPrefixedText()] = MoveJob::newJob( $old, 
$to, $params, $this->user );
                }
 
                $sectionPages = $this->getSectionPages();
                foreach ( $sectionPages as $old ) {
                        $to = $this->newPageTitle( $base, $old, $target );
-                       $jobs[$old->getPrefixedText()] = MoveJob::newJob( $old, 
$to, $base, $this->user );
+                       $jobs[$old->getPrefixedText()] = MoveJob::newJob( $old, 
$to, $params, $this->user );
                }
 
                if ( $this->moveSubpages ) {
@@ -373,15 +378,14 @@
                                }
 
                                $to = $this->newPageTitle( $base, $old, $target 
);
-                               $jobs[$old->getPrefixedText()] = 
MoveJob::newJob( $old, $to, $base, $this->user );
+                               $jobs[$old->getPrefixedText()] = 
MoveJob::newJob( $old, $to, $params, $this->user );
                        }
                }
 
+               // This is used by MoveJob
+               wfGetCache( CACHE_ANYTHING )->set( wfMemcKey( 
'translate-pt-move', $base ), count( $jobs ) );
                Job::batchInsert( $jobs );
 
-               global $wgMemc;
-               $wgMemc->set( wfMemcKey( 'pt-base', $base ), array_keys( $jobs 
), 60 * 60 * 6 );
-
                MoveJob::forceRedirects( false );
 
                $errors = $this->oldTitle->moveTo( $this->newTitle, true, 
$this->reason, false );


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to