diff --git a/resources/sql/autopatches/20170301.subtype.01.col.sql b/resources/sql/autopatches/20170301.subtype.01.col.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20170301.subtype.01.col.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_search.search_editengineconfiguration + ADD subtype VARCHAR(64) COLLATE {$COLLATE_TEXT} NOT NULL; diff --git a/resources/sql/autopatches/20170301.subtype.02.default.sql b/resources/sql/autopatches/20170301.subtype.02.default.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20170301.subtype.02.default.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_search.search_editengineconfiguration + SET subtype = 'default' WHERE subtype = ''; diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2624,6 +2624,8 @@ 'PhabricatorEditEngineSelectCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineSelectCommentAction.php', 'PhabricatorEditEngineSettingsPanel' => 'applications/settings/panel/PhabricatorEditEngineSettingsPanel.php', 'PhabricatorEditEngineStaticCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineStaticCommentAction.php', + 'PhabricatorEditEngineSubtype' => 'applications/transactions/editengine/PhabricatorEditEngineSubtype.php', + 'PhabricatorEditEngineSubtypeTestCase' => 'applications/transactions/editengine/__tests__/PhabricatorEditEngineSubtypeTestCase.php', 'PhabricatorEditEngineTokenizerCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineTokenizerCommentAction.php', 'PhabricatorEditField' => 'applications/transactions/editfield/PhabricatorEditField.php', 'PhabricatorEditPage' => 'applications/transactions/editengine/PhabricatorEditPage.php', @@ -7678,6 +7680,8 @@ 'PhabricatorEditEngineSelectCommentAction' => 'PhabricatorEditEngineCommentAction', 'PhabricatorEditEngineSettingsPanel' => 'PhabricatorSettingsPanel', 'PhabricatorEditEngineStaticCommentAction' => 'PhabricatorEditEngineCommentAction', + 'PhabricatorEditEngineSubtype' => 'Phobject', + 'PhabricatorEditEngineSubtypeTestCase' => 'PhabricatorTestCase', 'PhabricatorEditEngineTokenizerCommentAction' => 'PhabricatorEditEngineCommentAction', 'PhabricatorEditField' => 'Phobject', 'PhabricatorEditPage' => 'Phobject', diff --git a/src/applications/transactions/editengine/PhabricatorEditEngine.php b/src/applications/transactions/editengine/PhabricatorEditEngine.php --- a/src/applications/transactions/editengine/PhabricatorEditEngine.php +++ b/src/applications/transactions/editengine/PhabricatorEditEngine.php @@ -18,6 +18,8 @@ const EDITENGINECONFIG_DEFAULT = 'default'; + const SUBTYPE_DEFAULT = 'default'; + private $viewer; private $controller; private $isCreate; diff --git a/src/applications/transactions/editengine/PhabricatorEditEngineSubtype.php b/src/applications/transactions/editengine/PhabricatorEditEngineSubtype.php new file mode 100644 --- /dev/null +++ b/src/applications/transactions/editengine/PhabricatorEditEngineSubtype.php @@ -0,0 +1,36 @@ + 64) { + throw new Exception( + pht( + 'Subtype "%s" is not valid: subtype keys must be no longer than '. + '64 bytes.', + $subtype)); + } + + if (strlen($subtype) < 3) { + throw new Exception( + pht( + 'Subtype "%s" is not valid: subtype keys must have a minimum '. + 'length of 3 bytes.', + $subtype)); + } + + if (!preg_match('/^[a-z]+\z/', $subtype)) { + throw new Exception( + pht( + 'Subtype "%s" is not valid: subtype keys may only contain '. + 'lowercase latin letters ("a" through "z").', + $subtype)); + } + } + + +} diff --git a/src/applications/transactions/editengine/__tests__/PhabricatorEditEngineSubtypeTestCase.php b/src/applications/transactions/editengine/__tests__/PhabricatorEditEngineSubtypeTestCase.php new file mode 100644 --- /dev/null +++ b/src/applications/transactions/editengine/__tests__/PhabricatorEditEngineSubtypeTestCase.php @@ -0,0 +1,38 @@ + false, + 'ab' => false, + + // Too long. + 'mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm'. + 'mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm' => false, + + // Junk. + '!_(#(31 1~' => false, + + // These are reasonable and valid. + 'default' => true, + 'bug' => true, + 'feature' => true, + 'risk' => true, + 'security' => true, + ); + + foreach ($map as $input => $expect) { + try { + PhabricatorEditEngineSubtype::validateSubtypeKey($input); + $actual = true; + } catch (Exception $ex) { + $actual = false; + } + + $this->assertEqual($expect, $actual, pht('Subtype Key "%s"', $input)); + } + } +} diff --git a/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php b/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php --- a/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php +++ b/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php @@ -16,6 +16,7 @@ protected $isEdit = 0; protected $createOrder = 0; protected $editOrder = 0; + protected $subtype; private $engine = self::ATTACHABLE; @@ -32,6 +33,7 @@ PhabricatorEditEngine $engine) { return id(new PhabricatorEditEngineConfiguration()) + ->setSubtype(PhabricatorEditEngine::SUBTYPE_DEFAULT) ->setEngineKey($engine->getEngineKey()) ->attachEngine($engine) ->setViewPolicy(PhabricatorPolicies::getMostOpenPolicy()); @@ -84,6 +86,7 @@ 'isEdit' => 'bool', 'createOrder' => 'uint32', 'editOrder' => 'uint32', + 'subtype' => 'text64', ), self::CONFIG_KEY_SCHEMA => array( 'key_engine' => array(