Sbisson has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/404988 )

Change subject: Trying to make Opt in/out atomic
......................................................................

Trying to make Opt in/out atomic

Opting in or out of the Flow beta feature requires
several page moves and edits. When one of them fails,
it can leave the user talk page in an inconsistent state.

This patch executes the OptInController enable() or
disable() function in an AtomicSectionUpdate instead
of a regular DeferredUpdate (was encapsulated in OptInUpdate.php,
which has been removed).

Bug: T184670
Change-Id: Icbea8194121606cd36fd7f2ab31373b703246459
---
M Hooks.php
M extension.json
D includes/Import/OptInUpdate.php
3 files changed, 15 insertions(+), 64 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Flow 
refs/changes/88/404988/1

diff --git a/Hooks.php b/Hooks.php
index de887c1..20ebf98 100644
--- a/Hooks.php
+++ b/Hooks.php
@@ -1752,22 +1752,32 @@
                $userClone = User::newFromId( $user->getId() );
                $before = BetaFeatures::isFeatureEnabled( $userClone, 
BETA_FEATURE_FLOW_USER_TALK_PAGE );
                $after = $user->getBoolOption( BETA_FEATURE_FLOW_USER_TALK_PAGE 
);
+               $controller = new Flow\Import\OptInController();
                $action = null;
 
                if ( !$before && $after ) {
-                       $action = OptInUpdate::$ENABLE;
+                       $action = 'enable';
                        // Check if the user had a flow board
-                       $c = new Flow\Import\OptInController();
-                       if ( !$c->hasFlowBoardArchive( $user ) ) {
+                       if ( !$controller->hasFlowBoardArchive( $user ) ) {
                                // Enable the guided tour by setting the cookie
                                
RequestContext::getMain()->getRequest()->response()->setCookie( 
'Flow_optIn_guidedTour', '1' );
                        }
                } elseif ( $before && !$after ) {
-                       $action = OptInUpdate::$DISABLE;
+                       $action = 'disable';
                }
 
                if ( $action ) {
-                       DeferredUpdates::addUpdate( new OptInUpdate( $action, 
$user->getTalkPage(), $user ) );
+                       DeferredUpdates::addUpdate( new AtomicSectionUpdate(
+                               wfGetDB( DB_MASTER ),
+                               __METHOD__,
+                               function () use ( $controller, $action, $user ) 
{
+                                       if ( $action === 'enable' ) {
+                                               $controller->enable( 
$user->getTalkPage(), $user );
+                                       } elseif ( $action === 'disable' ) {
+                                               $controller->disable( 
$user->getTalkPage() );
+                                       }
+                               }
+                       ) );
                }
 
                return true;
diff --git a/extension.json b/extension.json
index ce0ab2d..e766273 100644
--- a/extension.json
+++ b/extension.json
@@ -1109,7 +1109,6 @@
                "Flow\\Import\\LiquidThreadsApi\\ScriptedImportRevision": 
"includes/Import/LiquidThreadsApi/Objects.php",
                "Flow\\Import\\LiquidThreadsApi\\TopicIterator": 
"includes/Import/LiquidThreadsApi/Iterators.php",
                "Flow\\Import\\OptInController": 
"includes/Import/OptInController.php",
-               "Flow\\Import\\OptInUpdate": "includes/Import/OptInUpdate.php",
                "Flow\\Import\\PageImportState": "includes/Import/Importer.php",
                "Flow\\Import\\Plain\\ImportHeader": 
"includes/Import/Plain/ImportHeader.php",
                "Flow\\Import\\Plain\\ObjectRevision": 
"includes/Import/Plain/ObjectRevision.php",
diff --git a/includes/Import/OptInUpdate.php b/includes/Import/OptInUpdate.php
deleted file mode 100644
index 3c1a0f7..0000000
--- a/includes/Import/OptInUpdate.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-namespace Flow\Import;
-
-use DeferrableUpdate;
-use MWExceptionHandler;
-use Title;
-use User;
-
-class OptInUpdate implements DeferrableUpdate {
-
-       public static $ENABLE = 'enable';
-       public static $DISABLE = 'disable';
-
-       /**
-        * @var string
-        */
-       protected $action;
-
-       /**
-        * @var Title
-        */
-       protected $talkpage;
-
-       /**
-        * @var User
-        */
-       protected $user;
-
-       /**
-        * @param string $action
-        * @param Title $talkpage
-        * @param User $user
-        */
-       public function __construct( $action, Title $talkpage, User $user ) {
-               $this->action = $action;
-               $this->talkpage = $talkpage;
-               $this->user = $user;
-       }
-
-       /**
-        * Enable or disable Flow on a talk page
-        */
-       function doUpdate() {
-               $c = new OptInController();
-               try {
-                       if ( $this->action === self::$ENABLE ) {
-                               $c->enable( $this->talkpage, $this->user );
-                       } elseif ( $this->action === self::$DISABLE ) {
-                               $c->disable( $this->talkpage );
-                       } else {
-                               wfLogWarning( 'OptInUpdate: unrecognized 
action: ' . $this->action );
-                       }
-               } catch ( \Exception $e ) {
-                       MWExceptionHandler::logException( $e );
-               }
-       }
-}

-- 
To view, visit https://gerrit.wikimedia.org/r/404988
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Icbea8194121606cd36fd7f2ab31373b703246459
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Flow
Gerrit-Branch: master
Gerrit-Owner: Sbisson <sbis...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to