diff --git a/resources/sql/patches/20130201.revisionunsubscribed.php b/resources/sql/patches/20130201.revisionunsubscribed.php new file mode 100644 index 0000000000..b15379893b --- /dev/null +++ b/resources/sql/patches/20130201.revisionunsubscribed.php @@ -0,0 +1,33 @@ +openTransaction(); + +// We couldn't use new LiskMigrationIterator($table) because the $unsubscribed +// property gets deleted. +$revs = queryfx_all( + $table->establishConnection('w'), + 'SELECT id, phid, unsubscribed FROM differential_revision'); + +foreach ($revs as $rev) { + echo "."; + + $unsubscribed = json_decode($rev['unsubscribed']); + if (!$unsubscribed) { + continue; + } + + $editor = new PhabricatorEdgeEditor(); + $editor->setSuppressEvents(true); + foreach ($unsubscribed as $user_phid => $_) { + $editor->addEdge( + $rev['phid'], + PhabricatorEdgeConfig::TYPE_OBJECT_HAS_UNSUBSCRIBER, + $user_phid); + } + $editor->save(); +} + +$table->saveTransaction(); +echo "Done.\n"; diff --git a/resources/sql/patches/20130201.revisionunsubscribed.sql b/resources/sql/patches/20130201.revisionunsubscribed.sql new file mode 100644 index 0000000000..51f09cc104 --- /dev/null +++ b/resources/sql/patches/20130201.revisionunsubscribed.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_revision + DROP unsubscribed; diff --git a/src/applications/differential/editor/DifferentialRevisionEditor.php b/src/applications/differential/editor/DifferentialRevisionEditor.php index f347cd3b1c..d7c035637a 100644 --- a/src/applications/differential/editor/DifferentialRevisionEditor.php +++ b/src/applications/differential/editor/DifferentialRevisionEditor.php @@ -238,7 +238,7 @@ final class DifferentialRevisionEditor extends PhabricatorEditor { $diff); $adapter->setExplicitCCs($new['ccs']); $adapter->setExplicitReviewers($new['rev']); - $adapter->setForbiddenCCs($revision->getUnsubscribedPHIDs()); + $adapter->setForbiddenCCs($revision->loadUnsubscribedPHIDs()); $xscript = HeraldEngine::loadAndApplyRules($adapter); $xscript_uri = '/herald/transcript/'.$xscript->getID().'/'; @@ -500,12 +500,10 @@ final class DifferentialRevisionEditor extends PhabricatorEditor { self::addCC($revision, $phid, $reason); - $unsubscribed = $revision->getUnsubscribed(); - if (isset($unsubscribed[$phid])) { - unset($unsubscribed[$phid]); - $revision->setUnsubscribed($unsubscribed); - $revision->save(); - } + $type = PhabricatorEdgeConfig::TYPE_OBJECT_HAS_UNSUBSCRIBER; + id(new PhabricatorEdgeEditor()) + ->removeEdge($revision->getPHID(), $type, $phid) + ->save(); } public static function removeCCAndUpdateRevision( @@ -515,12 +513,10 @@ final class DifferentialRevisionEditor extends PhabricatorEditor { self::removeCC($revision, $phid, $reason); - $unsubscribed = $revision->getUnsubscribed(); - if (empty($unsubscribed[$phid])) { - $unsubscribed[$phid] = true; - $revision->setUnsubscribed($unsubscribed); - $revision->save(); - } + $type = PhabricatorEdgeConfig::TYPE_OBJECT_HAS_UNSUBSCRIBER; + id(new PhabricatorEdgeEditor()) + ->addEdge($revision->getPHID(), $type, $phid) + ->save(); } public static function addCC( diff --git a/src/applications/differential/storage/DifferentialRevision.php b/src/applications/differential/storage/DifferentialRevision.php index b34e5d8afe..b07f1beb29 100644 --- a/src/applications/differential/storage/DifferentialRevision.php +++ b/src/applications/differential/storage/DifferentialRevision.php @@ -17,7 +17,6 @@ final class DifferentialRevision extends DifferentialDAO { protected $lineCount; protected $attached = array(); - protected $unsubscribed = array(); protected $mailKey; protected $branchName; @@ -264,8 +263,10 @@ final class DifferentialRevision extends DifferentialDAO { return idx($this->relationships, $relation, array()); } - public function getUnsubscribedPHIDs() { - return array_keys($this->getUnsubscribed()); + public function loadUnsubscribedPHIDs() { + return PhabricatorEdgeQuery::loadDestinationPHIDs( + $this->phid, + PhabricatorEdgeConfig::TYPE_OBJECT_HAS_UNSUBSCRIBER); } public function getPrimaryReviewer() { diff --git a/src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php b/src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php index 9c1dee01f2..71dbe66291 100644 --- a/src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php +++ b/src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php @@ -1097,6 +1097,14 @@ final class PhabricatorBuiltinPatchList extends PhabricatorSQLPatchList { 'type' => 'sql', 'name' => $this->getPatchPath('20130127.altheraldtranscript.sql'), ), + '20130201.revisionunsubscribed.php' => array( + 'type' => 'php', + 'name' => $this->getPatchPath('20130201.revisionunsubscribed.php'), + ), + '20130201.revisionunsubscribed.sql' => array( + 'type' => 'sql', + 'name' => $this->getPatchPath('20130201.revisionunsubscribed.sql'), + ), ); }