@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'master' into redesign-2015

+3287 -853
+37 -37
resources/celerity/map.php
··· 114 114 'rsrc/css/diviner/diviner-shared.css' => '38813222', 115 115 'rsrc/css/font/font-awesome.css' => 'e2e712fe', 116 116 'rsrc/css/font/font-lato.css' => '5f05d817', 117 - 'rsrc/css/font/font-slabo.css' => '7a85ea13', 117 + 'rsrc/css/font/font-slabo.css' => '1f520937', 118 118 'rsrc/css/font/phui-font-icon-base.css' => '3dad2ae3', 119 119 'rsrc/css/layout/phabricator-filetree-view.css' => 'fccf9f82', 120 120 'rsrc/css/layout/phabricator-hovercard-view.css' => '0d665853', ··· 370 370 'rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js' => 'e5822781', 371 371 'rsrc/js/application/files/behavior-icon-composer.js' => '8ef9ab58', 372 372 'rsrc/js/application/files/behavior-launch-icon-composer.js' => '48086888', 373 - 'rsrc/js/application/herald/HeraldRuleEditor.js' => '271ffdd7', 373 + 'rsrc/js/application/herald/HeraldRuleEditor.js' => 'b2cae298', 374 374 'rsrc/js/application/herald/PathTypeahead.js' => 'f7fc67ec', 375 375 'rsrc/js/application/herald/herald-rule-editor.js' => '7ebaeed3', 376 - 'rsrc/js/application/maniphest/behavior-batch-editor.js' => 'f5d1233b', 376 + 'rsrc/js/application/maniphest/behavior-batch-editor.js' => '782ab6e7', 377 377 'rsrc/js/application/maniphest/behavior-batch-selector.js' => '7b98d7c5', 378 378 'rsrc/js/application/maniphest/behavior-line-chart.js' => '88f0c5b3', 379 379 'rsrc/js/application/maniphest/behavior-list-edit.js' => 'a9f88de2', ··· 390 390 'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '3f5d6dbf', 391 391 'rsrc/js/application/phortune/behavior-test-payment-form.js' => 'fc91ab6c', 392 392 'rsrc/js/application/phortune/phortune-credit-card-form.js' => '2290aeef', 393 - 'rsrc/js/application/policy/behavior-policy-control.js' => '9a340b3d', 393 + 'rsrc/js/application/policy/behavior-policy-control.js' => '7d470398', 394 394 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '5e9f347c', 395 395 'rsrc/js/application/ponder/behavior-votebox.js' => '4e9b766b', 396 396 'rsrc/js/application/projects/behavior-project-boards.js' => 'ba4fa35c', ··· 522 522 'diviner-shared-css' => '38813222', 523 523 'font-fontawesome' => 'e2e712fe', 524 524 'font-lato' => '5f05d817', 525 - 'font-slabo' => '7a85ea13', 525 + 'font-slabo' => '1f520937', 526 526 'global-drag-and-drop-css' => '697324ad', 527 527 'harbormaster-css' => '49d64eb4', 528 528 'herald-css' => '826075fa', 529 - 'herald-rule-editor' => '271ffdd7', 529 + 'herald-rule-editor' => 'b2cae298', 530 530 'herald-test-css' => '778b008e', 531 531 'inline-comment-summary-css' => '51efda3a', 532 532 'javelin-aphlict' => '5359e785', ··· 585 585 'javelin-behavior-lightbox-attachments' => 'f8ba29d7', 586 586 'javelin-behavior-line-chart' => '88f0c5b3', 587 587 'javelin-behavior-load-blame' => '42126667', 588 - 'javelin-behavior-maniphest-batch-editor' => 'f5d1233b', 588 + 'javelin-behavior-maniphest-batch-editor' => '782ab6e7', 589 589 'javelin-behavior-maniphest-batch-selector' => '7b98d7c5', 590 590 'javelin-behavior-maniphest-list-editor' => 'a9f88de2', 591 591 'javelin-behavior-maniphest-subpriority-editor' => '84845b5b', ··· 622 622 'javelin-behavior-pholio-mock-view' => 'fbe497e7', 623 623 'javelin-behavior-phui-dropdown-menu' => '54733475', 624 624 'javelin-behavior-phui-object-box-tabs' => '2bfa2836', 625 - 'javelin-behavior-policy-control' => '9a340b3d', 625 + 'javelin-behavior-policy-control' => '7d470398', 626 626 'javelin-behavior-policy-rule-editor' => '5e9f347c', 627 627 'javelin-behavior-ponder-votebox' => '4e9b766b', 628 628 'javelin-behavior-project-boards' => 'ba4fa35c', ··· 972 972 'javelin-install', 973 973 'javelin-dom', 974 974 'javelin-reactor-dom', 975 + ), 976 + '1f520937' => array( 977 + 'phui-fontkit-css', 975 978 ), 976 979 '2035b9cb' => array( 977 980 'javelin-behavior', ··· 1010 1013 'phabricator-drag-and-drop-file-upload', 1011 1014 'phabricator-draggable-list', 1012 1015 ), 1013 - '271ffdd7' => array( 1014 - 'multirow-row-manager', 1015 - 'javelin-install', 1016 - 'javelin-util', 1017 - 'javelin-dom', 1018 - 'javelin-stratcom', 1019 - 'javelin-json', 1020 - 'phabricator-prefab', 1021 - ), 1022 1016 '2818f5ce' => array( 1023 1017 'javelin-install', 1024 1018 'javelin-util', ··· 1414 1408 'javelin-util', 1415 1409 'phabricator-busy', 1416 1410 ), 1411 + '782ab6e7' => array( 1412 + 'javelin-behavior', 1413 + 'javelin-dom', 1414 + 'javelin-util', 1415 + 'phabricator-prefab', 1416 + 'multirow-row-manager', 1417 + 'javelin-json', 1418 + ), 1417 1419 '7927a7d3' => array( 1418 1420 'javelin-behavior', 1419 1421 'javelin-quicksand', ··· 1422 1424 'owners-path-editor', 1423 1425 'javelin-behavior', 1424 1426 ), 1425 - '7a85ea13' => array( 1426 - 'phui-fontkit-css', 1427 - ), 1428 1427 '7b98d7c5' => array( 1429 1428 'javelin-behavior', 1430 1429 'javelin-dom', ··· 1436 1435 'javelin-util', 1437 1436 'javelin-request', 1438 1437 'javelin-router', 1438 + ), 1439 + '7d470398' => array( 1440 + 'javelin-behavior', 1441 + 'javelin-dom', 1442 + 'javelin-util', 1443 + 'phuix-dropdown-menu', 1444 + 'phuix-action-list-view', 1445 + 'phuix-action-view', 1446 + 'javelin-workflow', 1439 1447 ), 1440 1448 '7e41274a' => array( 1441 1449 'javelin-install', ··· 1582 1590 'javelin-dom', 1583 1591 'javelin-reactor-dom', 1584 1592 ), 1585 - '9a340b3d' => array( 1586 - 'javelin-behavior', 1587 - 'javelin-dom', 1588 - 'javelin-util', 1589 - 'phuix-dropdown-menu', 1590 - 'phuix-action-list-view', 1591 - 'phuix-action-view', 1592 - 'javelin-workflow', 1593 - ), 1594 1593 '9f36c42d' => array( 1595 1594 'javelin-behavior', 1596 1595 'javelin-stratcom', ··· 1706 1705 'javelin-dom', 1707 1706 'javelin-uri', 1708 1707 'javelin-request', 1708 + ), 1709 + 'b2cae298' => array( 1710 + 'multirow-row-manager', 1711 + 'javelin-install', 1712 + 'javelin-util', 1713 + 'javelin-dom', 1714 + 'javelin-stratcom', 1715 + 'javelin-json', 1716 + 'phabricator-prefab', 1709 1717 ), 1710 1718 'b3a4b884' => array( 1711 1719 'javelin-behavior', ··· 1969 1977 'javelin-dom', 1970 1978 'javelin-request', 1971 1979 'phabricator-keyboard-shortcut', 1972 - ), 1973 - 'f5d1233b' => array( 1974 - 'javelin-behavior', 1975 - 'javelin-dom', 1976 - 'javelin-util', 1977 - 'phabricator-prefab', 1978 - 'multirow-row-manager', 1979 - 'javelin-json', 1980 1980 ), 1981 1981 'f6555212' => array( 1982 1982 'javelin-install',
+2
resources/sql/autopatches/20150609.spaces.1.pholio.sql
··· 1 + ALTER TABLE {$NAMESPACE}_pholio.pholio_mock 2 + ADD spacePHID VARBINARY(64);
+2
resources/sql/autopatches/20150609.spaces.2.maniphest.sql
··· 1 + ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task 2 + ADD spacePHID VARBINARY(64);
+2
resources/sql/autopatches/20150610.spaces.1.desc.sql
··· 1 + ALTER TABLE {$NAMESPACE}_spaces.spaces_namespace 2 + ADD description LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL;
+16
resources/sql/autopatches/20150610.spaces.2.edge.sql
··· 1 + CREATE TABLE {$NAMESPACE}_spaces.edge ( 2 + src VARBINARY(64) NOT NULL, 3 + type INT UNSIGNED NOT NULL, 4 + dst VARBINARY(64) NOT NULL, 5 + dateCreated INT UNSIGNED NOT NULL, 6 + seq INT UNSIGNED NOT NULL, 7 + dataID INT UNSIGNED, 8 + PRIMARY KEY (src, type, dst), 9 + KEY `src` (src, type, dateCreated, seq), 10 + UNIQUE KEY `key_dst` (dst, type, src) 11 + ) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; 12 + 13 + CREATE TABLE {$NAMESPACE}_spaces.edgedata ( 14 + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 15 + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} 16 + ) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
+2
resources/sql/autopatches/20150610.spaces.3.archive.sql
··· 1 + ALTER TABLE {$NAMESPACE}_spaces.spaces_namespace 2 + ADD isArchived BOOL NOT NULL;
+19
resources/sql/autopatches/20150611.spaces.1.mailxaction.sql
··· 1 + CREATE TABLE {$NAMESPACE}_metamta.metamta_applicationemailtransaction ( 2 + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 + phid VARBINARY(64) NOT NULL, 4 + authorPHID VARBINARY(64) NOT NULL, 5 + objectPHID VARBINARY(64) NOT NULL, 6 + viewPolicy VARBINARY(64) NOT NULL, 7 + editPolicy VARBINARY(64) NOT NULL, 8 + commentPHID VARBINARY(64) DEFAULT NULL, 9 + commentVersion INT UNSIGNED NOT NULL, 10 + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, 11 + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 12 + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 13 + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 14 + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 15 + dateCreated INT UNSIGNED NOT NULL, 16 + dateModified INT UNSIGNED NOT NULL, 17 + UNIQUE KEY `key_phid` (`phid`), 18 + KEY `key_object` (`objectPHID`) 19 + ) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
+2
resources/sql/autopatches/20150611.spaces.2.appmail.sql
··· 1 + ALTER TABLE {$NAMESPACE}_metamta.metamta_applicationemail 2 + ADD spacePHID VARBINARY(64);
+3 -3
resources/sql/patches/20131121.repocredentials.2.mig.php
··· 26 26 if ($proto == 'http' || $proto == 'https' || $proto == 'svn') { 27 27 $username = $repository->getDetail('http-login'); 28 28 $secret = $repository->getDetail('http-pass'); 29 - $type = PassphraseCredentialTypePassword::CREDENTIAL_TYPE; 29 + $type = PassphrasePasswordCredentialType::CREDENTIAL_TYPE; 30 30 } else { 31 31 $username = $repository->getDetail('ssh-login'); 32 32 if (!$username) { ··· 42 42 $file = $repository->getDetail('ssh-keyfile'); 43 43 if ($file) { 44 44 $secret = $file; 45 - $type = PassphraseCredentialTypeSSHPrivateKeyFile::CREDENTIAL_TYPE; 45 + $type = PassphraseSSHPrivateKeyFileCredentialType::CREDENTIAL_TYPE; 46 46 } else { 47 47 $secret = $repository->getDetail('ssh-key'); 48 - $type = PassphraseCredentialTypeSSHPrivateKeyText::CREDENTIAL_TYPE; 48 + $type = PassphraseSSHPrivateKeyTextCredentialType::CREDENTIAL_TYPE; 49 49 } 50 50 } 51 51
+292 -18
src/__phutil_library_map__.php
··· 92 92 'AlmanacServiceTransaction' => 'applications/almanac/storage/AlmanacServiceTransaction.php', 93 93 'AlmanacServiceTransactionQuery' => 'applications/almanac/query/AlmanacServiceTransactionQuery.php', 94 94 'AlmanacServiceType' => 'applications/almanac/servicetype/AlmanacServiceType.php', 95 + 'AlmanacServiceTypeTestCase' => 'applications/almanac/servicetype/__tests__/AlmanacServiceTypeTestCase.php', 95 96 'AlmanacServiceViewController' => 'applications/almanac/controller/AlmanacServiceViewController.php', 96 97 'AphlictDropdownDataQuery' => 'applications/aphlict/query/AphlictDropdownDataQuery.php', 97 98 'Aphront304Response' => 'aphront/response/Aphront304Response.php', ··· 183 184 'CelerityPhabricatorResourceController' => 'applications/celerity/controller/CelerityPhabricatorResourceController.php', 184 185 'CelerityPhabricatorResources' => 'applications/celerity/resources/CelerityPhabricatorResources.php', 185 186 'CelerityPhysicalResources' => 'applications/celerity/resources/CelerityPhysicalResources.php', 187 + 'CelerityPhysicalResourcesTestCase' => 'applications/celerity/resources/__tests__/CelerityPhysicalResourcesTestCase.php', 186 188 'CelerityResourceController' => 'applications/celerity/controller/CelerityResourceController.php', 187 189 'CelerityResourceGraph' => 'applications/celerity/CelerityResourceGraph.php', 188 190 'CelerityResourceMap' => 'applications/celerity/CelerityResourceMap.php', ··· 197 199 'ChatLogQueryConduitAPIMethod' => 'applications/chatlog/conduit/ChatLogQueryConduitAPIMethod.php', 198 200 'ChatLogRecordConduitAPIMethod' => 'applications/chatlog/conduit/ChatLogRecordConduitAPIMethod.php', 199 201 'ConduitAPIMethod' => 'applications/conduit/method/ConduitAPIMethod.php', 202 + 'ConduitAPIMethodTestCase' => 'applications/conduit/method/__tests__/ConduitAPIMethodTestCase.php', 200 203 'ConduitAPIRequest' => 'applications/conduit/protocol/ConduitAPIRequest.php', 201 204 'ConduitAPIResponse' => 'applications/conduit/protocol/ConduitAPIResponse.php', 202 205 'ConduitApplicationNotInstalledException' => 'applications/conduit/protocol/exception/ConduitApplicationNotInstalledException.php', ··· 255 258 'ConpherenceThreadIndexer' => 'applications/conpherence/search/ConpherenceThreadIndexer.php', 256 259 'ConpherenceThreadListView' => 'applications/conpherence/view/ConpherenceThreadListView.php', 257 260 'ConpherenceThreadMailReceiver' => 'applications/conpherence/mail/ConpherenceThreadMailReceiver.php', 261 + 'ConpherenceThreadMembersPolicyRule' => 'applications/conpherence/policyrule/ConpherenceThreadMembersPolicyRule.php', 258 262 'ConpherenceThreadQuery' => 'applications/conpherence/query/ConpherenceThreadQuery.php', 259 263 'ConpherenceThreadRemarkupRule' => 'applications/conpherence/remarkup/ConpherenceThreadRemarkupRule.php', 260 264 'ConpherenceThreadSearchEngine' => 'applications/conpherence/query/ConpherenceThreadSearchEngine.php', ··· 700 704 'DrydockBlueprintEditController' => 'applications/drydock/controller/DrydockBlueprintEditController.php', 701 705 'DrydockBlueprintEditor' => 'applications/drydock/editor/DrydockBlueprintEditor.php', 702 706 'DrydockBlueprintImplementation' => 'applications/drydock/blueprint/DrydockBlueprintImplementation.php', 707 + 'DrydockBlueprintImplementationTestCase' => 'applications/drydock/blueprint/__tests__/DrydockBlueprintImplementationTestCase.php', 703 708 'DrydockBlueprintListController' => 'applications/drydock/controller/DrydockBlueprintListController.php', 704 709 'DrydockBlueprintPHIDType' => 'applications/drydock/phid/DrydockBlueprintPHIDType.php', 705 710 'DrydockBlueprintQuery' => 'applications/drydock/query/DrydockBlueprintQuery.php', ··· 762 767 'FeedPublisherWorker' => 'applications/feed/worker/FeedPublisherWorker.php', 763 768 'FeedPushWorker' => 'applications/feed/worker/FeedPushWorker.php', 764 769 'FeedQueryConduitAPIMethod' => 'applications/feed/conduit/FeedQueryConduitAPIMethod.php', 770 + 'FeedStoryNotificationGarbageCollector' => 'applications/notification/garbagecollector/FeedStoryNotificationGarbageCollector.php', 765 771 'FileAllocateConduitAPIMethod' => 'applications/files/conduit/FileAllocateConduitAPIMethod.php', 766 772 'FileConduitAPIMethod' => 'applications/files/conduit/FileConduitAPIMethod.php', 767 773 'FileCreateMailReceiver' => 'applications/files/mail/FileCreateMailReceiver.php', ··· 841 847 'HarbormasterBuildStepCustomField' => 'applications/harbormaster/customfield/HarbormasterBuildStepCustomField.php', 842 848 'HarbormasterBuildStepEditor' => 'applications/harbormaster/editor/HarbormasterBuildStepEditor.php', 843 849 'HarbormasterBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterBuildStepImplementation.php', 850 + 'HarbormasterBuildStepImplementationTestCase' => 'applications/harbormaster/step/__tests__/HarbormasterBuildStepImplementationTestCase.php', 844 851 'HarbormasterBuildStepPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildStepPHIDType.php', 845 852 'HarbormasterBuildStepQuery' => 'applications/harbormaster/query/HarbormasterBuildStepQuery.php', 846 853 'HarbormasterBuildStepTransaction' => 'applications/harbormaster/storage/configuration/HarbormasterBuildStepTransaction.php', ··· 1031 1038 'ManiphestEmailCommand' => 'applications/maniphest/command/ManiphestEmailCommand.php', 1032 1039 'ManiphestExcelDefaultFormat' => 'applications/maniphest/export/ManiphestExcelDefaultFormat.php', 1033 1040 'ManiphestExcelFormat' => 'applications/maniphest/export/ManiphestExcelFormat.php', 1041 + 'ManiphestExcelFormatTestCase' => 'applications/maniphest/export/__tests__/ManiphestExcelFormatTestCase.php', 1034 1042 'ManiphestExportController' => 'applications/maniphest/controller/ManiphestExportController.php', 1035 1043 'ManiphestGetTaskTransactionsConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestGetTaskTransactionsConduitAPIMethod.php', 1036 1044 'ManiphestHovercardEventListener' => 'applications/maniphest/event/ManiphestHovercardEventListener.php', ··· 1049 1057 'ManiphestStatusEmailCommand' => 'applications/maniphest/command/ManiphestStatusEmailCommand.php', 1050 1058 'ManiphestSubpriorityController' => 'applications/maniphest/controller/ManiphestSubpriorityController.php', 1051 1059 'ManiphestTask' => 'applications/maniphest/storage/ManiphestTask.php', 1060 + 'ManiphestTaskAuthorPolicyRule' => 'applications/maniphest/policyrule/ManiphestTaskAuthorPolicyRule.php', 1052 1061 'ManiphestTaskClosedStatusDatasource' => 'applications/maniphest/typeahead/ManiphestTaskClosedStatusDatasource.php', 1053 1062 'ManiphestTaskDependedOnByTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskDependedOnByTaskEdgeType.php', 1054 1063 'ManiphestTaskDependsOnTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskDependsOnTaskEdgeType.php', ··· 1082 1091 'ManiphestView' => 'applications/maniphest/view/ManiphestView.php', 1083 1092 'MetaMTAConstants' => 'applications/metamta/constants/MetaMTAConstants.php', 1084 1093 'MetaMTAEmailTransactionCommand' => 'applications/metamta/command/MetaMTAEmailTransactionCommand.php', 1094 + 'MetaMTAEmailTransactionCommandTestCase' => 'applications/metamta/command/__tests__/MetaMTAEmailTransactionCommandTestCase.php', 1085 1095 'MetaMTAMailReceivedGarbageCollector' => 'applications/metamta/garbagecollector/MetaMTAMailReceivedGarbageCollector.php', 1086 1096 'MetaMTAMailSentGarbageCollector' => 'applications/metamta/garbagecollector/MetaMTAMailSentGarbageCollector.php', 1087 1097 'MetaMTAReceivedMailStatus' => 'applications/metamta/constants/MetaMTAReceivedMailStatus.php', ··· 1140 1150 'NuanceSourceDefaultEditCapability' => 'applications/nuance/capability/NuanceSourceDefaultEditCapability.php', 1141 1151 'NuanceSourceDefaultViewCapability' => 'applications/nuance/capability/NuanceSourceDefaultViewCapability.php', 1142 1152 'NuanceSourceDefinition' => 'applications/nuance/source/NuanceSourceDefinition.php', 1153 + 'NuanceSourceDefinitionTestCase' => 'applications/nuance/source/__tests__/NuanceSourceDefinitionTestCase.php', 1143 1154 'NuanceSourceEditController' => 'applications/nuance/controller/NuanceSourceEditController.php', 1144 1155 'NuanceSourceEditor' => 'applications/nuance/editor/NuanceSourceEditor.php', 1145 1156 'NuanceSourceListController' => 'applications/nuance/controller/NuanceSourceListController.php', ··· 1255 1266 'PassphraseCredentialTransactionEditor' => 'applications/passphrase/editor/PassphraseCredentialTransactionEditor.php', 1256 1267 'PassphraseCredentialTransactionQuery' => 'applications/passphrase/query/PassphraseCredentialTransactionQuery.php', 1257 1268 'PassphraseCredentialType' => 'applications/passphrase/credentialtype/PassphraseCredentialType.php', 1258 - 'PassphraseCredentialTypePassword' => 'applications/passphrase/credentialtype/PassphraseCredentialTypePassword.php', 1259 - 'PassphraseCredentialTypeSSHGeneratedKey' => 'applications/passphrase/credentialtype/PassphraseCredentialTypeSSHGeneratedKey.php', 1260 - 'PassphraseCredentialTypeSSHPrivateKey' => 'applications/passphrase/credentialtype/PassphraseCredentialTypeSSHPrivateKey.php', 1261 - 'PassphraseCredentialTypeSSHPrivateKeyFile' => 'applications/passphrase/credentialtype/PassphraseCredentialTypeSSHPrivateKeyFile.php', 1262 - 'PassphraseCredentialTypeSSHPrivateKeyText' => 'applications/passphrase/credentialtype/PassphraseCredentialTypeSSHPrivateKeyText.php', 1269 + 'PassphraseCredentialTypeTestCase' => 'applications/passphrase/credentialtype/__tests__/PassphraseCredentialTypeTestCase.php', 1263 1270 'PassphraseCredentialViewController' => 'applications/passphrase/controller/PassphraseCredentialViewController.php', 1264 1271 'PassphraseDAO' => 'applications/passphrase/storage/PassphraseDAO.php', 1272 + 'PassphrasePasswordCredentialType' => 'applications/passphrase/credentialtype/PassphrasePasswordCredentialType.php', 1265 1273 'PassphrasePasswordKey' => 'applications/passphrase/keys/PassphrasePasswordKey.php', 1266 1274 'PassphraseQueryConduitAPIMethod' => 'applications/passphrase/conduit/PassphraseQueryConduitAPIMethod.php', 1267 1275 'PassphraseRemarkupRule' => 'applications/passphrase/remarkup/PassphraseRemarkupRule.php', 1276 + 'PassphraseSSHGeneratedKeyCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHGeneratedKeyCredentialType.php', 1268 1277 'PassphraseSSHKey' => 'applications/passphrase/keys/PassphraseSSHKey.php', 1278 + 'PassphraseSSHPrivateKeyCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHPrivateKeyCredentialType.php', 1279 + 'PassphraseSSHPrivateKeyFileCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHPrivateKeyFileCredentialType.php', 1280 + 'PassphraseSSHPrivateKeyTextCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHPrivateKeyTextCredentialType.php', 1269 1281 'PassphraseSchemaSpec' => 'applications/passphrase/storage/PassphraseSchemaSpec.php', 1270 1282 'PassphraseSearchIndexer' => 'applications/passphrase/search/PassphraseSearchIndexer.php', 1271 1283 'PassphraseSecret' => 'applications/passphrase/storage/PassphraseSecret.php', ··· 1309 1321 'PhabricatorApplicationApplicationPHIDType' => 'applications/meta/phid/PhabricatorApplicationApplicationPHIDType.php', 1310 1322 'PhabricatorApplicationConfigOptions' => 'applications/config/option/PhabricatorApplicationConfigOptions.php', 1311 1323 'PhabricatorApplicationConfigurationPanel' => 'applications/meta/panel/PhabricatorApplicationConfigurationPanel.php', 1324 + 'PhabricatorApplicationConfigurationPanelTestCase' => 'applications/meta/panel/__tests__/PhabricatorApplicationConfigurationPanelTestCase.php', 1312 1325 'PhabricatorApplicationDatasource' => 'applications/meta/typeahead/PhabricatorApplicationDatasource.php', 1313 1326 'PhabricatorApplicationDetailViewController' => 'applications/meta/controller/PhabricatorApplicationDetailViewController.php', 1314 1327 'PhabricatorApplicationEditController' => 'applications/meta/controller/PhabricatorApplicationEditController.php', ··· 1318 1331 'PhabricatorApplicationQuery' => 'applications/meta/query/PhabricatorApplicationQuery.php', 1319 1332 'PhabricatorApplicationSearchController' => 'applications/search/controller/PhabricatorApplicationSearchController.php', 1320 1333 'PhabricatorApplicationSearchEngine' => 'applications/search/engine/PhabricatorApplicationSearchEngine.php', 1334 + 'PhabricatorApplicationSearchEngineTestCase' => 'applications/search/engine/__tests__/PhabricatorApplicationSearchEngineTestCase.php', 1321 1335 'PhabricatorApplicationSearchResultsControllerInterface' => 'applications/search/interface/PhabricatorApplicationSearchResultsControllerInterface.php', 1322 1336 'PhabricatorApplicationStatusView' => 'applications/meta/view/PhabricatorApplicationStatusView.php', 1337 + 'PhabricatorApplicationTestCase' => 'applications/base/__tests__/PhabricatorApplicationTestCase.php', 1323 1338 'PhabricatorApplicationTransaction' => 'applications/transactions/storage/PhabricatorApplicationTransaction.php', 1324 1339 'PhabricatorApplicationTransactionComment' => 'applications/transactions/storage/PhabricatorApplicationTransactionComment.php', 1325 1340 'PhabricatorApplicationTransactionCommentEditController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php', ··· 1392 1407 'PhabricatorAuthEditController' => 'applications/auth/controller/config/PhabricatorAuthEditController.php', 1393 1408 'PhabricatorAuthFactor' => 'applications/auth/factor/PhabricatorAuthFactor.php', 1394 1409 'PhabricatorAuthFactorConfig' => 'applications/auth/storage/PhabricatorAuthFactorConfig.php', 1410 + 'PhabricatorAuthFactorTestCase' => 'applications/auth/factor/__tests__/PhabricatorAuthFactorTestCase.php', 1395 1411 'PhabricatorAuthFinishController' => 'applications/auth/controller/PhabricatorAuthFinishController.php', 1396 1412 'PhabricatorAuthHighSecurityRequiredException' => 'applications/auth/exception/PhabricatorAuthHighSecurityRequiredException.php', 1397 1413 'PhabricatorAuthHighSecurityToken' => 'applications/auth/data/PhabricatorAuthHighSecurityToken.php', ··· 1781 1797 'PhabricatorEdgeQuery' => 'infrastructure/edges/query/PhabricatorEdgeQuery.php', 1782 1798 'PhabricatorEdgeTestCase' => 'infrastructure/edges/__tests__/PhabricatorEdgeTestCase.php', 1783 1799 'PhabricatorEdgeType' => 'infrastructure/edges/type/PhabricatorEdgeType.php', 1800 + 'PhabricatorEdgeTypeTestCase' => 'infrastructure/edges/type/__tests__/PhabricatorEdgeTypeTestCase.php', 1784 1801 'PhabricatorEditor' => 'infrastructure/PhabricatorEditor.php', 1785 1802 'PhabricatorElasticSearchEngine' => 'applications/search/engine/PhabricatorElasticSearchEngine.php', 1786 1803 'PhabricatorElasticSearchSetupCheck' => 'applications/config/check/PhabricatorElasticSearchSetupCheck.php', ··· 1816 1833 'PhabricatorFactDAO' => 'applications/fact/storage/PhabricatorFactDAO.php', 1817 1834 'PhabricatorFactDaemon' => 'applications/fact/daemon/PhabricatorFactDaemon.php', 1818 1835 'PhabricatorFactEngine' => 'applications/fact/engine/PhabricatorFactEngine.php', 1836 + 'PhabricatorFactEngineTestCase' => 'applications/fact/engine/__tests__/PhabricatorFactEngineTestCase.php', 1819 1837 'PhabricatorFactHomeController' => 'applications/fact/controller/PhabricatorFactHomeController.php', 1820 1838 'PhabricatorFactLastUpdatedEngine' => 'applications/fact/engine/PhabricatorFactLastUpdatedEngine.php', 1821 1839 'PhabricatorFactManagementAnalyzeWorkflow' => 'applications/fact/management/PhabricatorFactManagementAnalyzeWorkflow.php', ··· 1873 1891 'PhabricatorFileStorageBlob' => 'applications/files/storage/PhabricatorFileStorageBlob.php', 1874 1892 'PhabricatorFileStorageConfigurationException' => 'applications/files/exception/PhabricatorFileStorageConfigurationException.php', 1875 1893 'PhabricatorFileStorageEngine' => 'applications/files/engine/PhabricatorFileStorageEngine.php', 1894 + 'PhabricatorFileStorageEngineTestCase' => 'applications/files/engine/__tests__/PhabricatorFileStorageEngineTestCase.php', 1876 1895 'PhabricatorFileTemporaryGarbageCollector' => 'applications/files/garbagecollector/PhabricatorFileTemporaryGarbageCollector.php', 1877 1896 'PhabricatorFileTestCase' => 'applications/files/storage/__tests__/PhabricatorFileTestCase.php', 1878 1897 'PhabricatorFileTestDataGenerator' => 'applications/files/lipsum/PhabricatorFileTestDataGenerator.php', ··· 1883 1902 'PhabricatorFileTransform' => 'applications/files/transform/PhabricatorFileTransform.php', 1884 1903 'PhabricatorFileTransformController' => 'applications/files/controller/PhabricatorFileTransformController.php', 1885 1904 'PhabricatorFileTransformListController' => 'applications/files/controller/PhabricatorFileTransformListController.php', 1905 + 'PhabricatorFileTransformTestCase' => 'applications/files/transform/__tests__/PhabricatorFileTransformTestCase.php', 1886 1906 'PhabricatorFileUploadController' => 'applications/files/controller/PhabricatorFileUploadController.php', 1887 1907 'PhabricatorFileUploadDialogController' => 'applications/files/controller/PhabricatorFileUploadDialogController.php', 1888 1908 'PhabricatorFileUploadException' => 'applications/files/exception/PhabricatorFileUploadException.php', ··· 1960 1980 'PhabricatorInternationalizationManagementWorkflow' => 'infrastructure/internationalization/management/PhabricatorInternationalizationManagementWorkflow.php', 1961 1981 'PhabricatorInvalidConfigSetupCheck' => 'applications/config/check/PhabricatorInvalidConfigSetupCheck.php', 1962 1982 'PhabricatorIteratedMD5PasswordHasher' => 'infrastructure/util/password/PhabricatorIteratedMD5PasswordHasher.php', 1983 + 'PhabricatorIteratedMD5PasswordHasherTestCase' => 'infrastructure/util/password/__tests__/PhabricatorIteratedMD5PasswordHasherTestCase.php', 1963 1984 'PhabricatorJIRAAuthProvider' => 'applications/auth/provider/PhabricatorJIRAAuthProvider.php', 1964 1985 'PhabricatorJavelinLinter' => 'infrastructure/lint/linter/PhabricatorJavelinLinter.php', 1965 1986 'PhabricatorJiraIssueHasObjectEdgeType' => 'applications/doorkeeper/edge/PhabricatorJiraIssueHasObjectEdgeType.php', ··· 2048 2069 'PhabricatorMetaMTAApplication' => 'applications/metamta/application/PhabricatorMetaMTAApplication.php', 2049 2070 'PhabricatorMetaMTAApplicationEmail' => 'applications/metamta/storage/PhabricatorMetaMTAApplicationEmail.php', 2050 2071 'PhabricatorMetaMTAApplicationEmailDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAApplicationEmailDatasource.php', 2072 + 'PhabricatorMetaMTAApplicationEmailEditor' => 'applications/metamta/editor/PhabricatorMetaMTAApplicationEmailEditor.php', 2051 2073 'PhabricatorMetaMTAApplicationEmailPHIDType' => 'applications/phid/PhabricatorMetaMTAApplicationEmailPHIDType.php', 2052 2074 'PhabricatorMetaMTAApplicationEmailPanel' => 'applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php', 2053 2075 'PhabricatorMetaMTAApplicationEmailQuery' => 'applications/metamta/query/PhabricatorMetaMTAApplicationEmailQuery.php', 2076 + 'PhabricatorMetaMTAApplicationEmailTransaction' => 'applications/metamta/storage/PhabricatorMetaMTAApplicationEmailTransaction.php', 2077 + 'PhabricatorMetaMTAApplicationEmailTransactionQuery' => 'applications/metamta/query/PhabricatorMetaMTAApplicationEmailTransactionQuery.php', 2054 2078 'PhabricatorMetaMTAAttachment' => 'applications/metamta/storage/PhabricatorMetaMTAAttachment.php', 2055 2079 'PhabricatorMetaMTAConfigOptions' => 'applications/config/option/PhabricatorMetaMTAConfigOptions.php', 2056 2080 'PhabricatorMetaMTAController' => 'applications/metamta/controller/PhabricatorMetaMTAController.php', ··· 2182 2206 'PhabricatorPHIDConstants' => 'applications/phid/PhabricatorPHIDConstants.php', 2183 2207 'PhabricatorPHIDInterface' => 'applications/phid/interface/PhabricatorPHIDInterface.php', 2184 2208 'PhabricatorPHIDType' => 'applications/phid/type/PhabricatorPHIDType.php', 2209 + 'PhabricatorPHIDTypeTestCase' => 'applications/phid/type/__tests__/PhabricatorPHIDTypeTestCase.php', 2185 2210 'PhabricatorPHPASTApplication' => 'applications/phpast/application/PhabricatorPHPASTApplication.php', 2186 2211 'PhabricatorPHPConfigSetupCheck' => 'applications/config/check/PhabricatorPHPConfigSetupCheck.php', 2187 2212 'PhabricatorPHPMailerConfigOptions' => 'applications/config/option/PhabricatorPHPMailerConfigOptions.php', ··· 2274 2299 'PhabricatorPolicyCanJoinCapability' => 'applications/policy/capability/PhabricatorPolicyCanJoinCapability.php', 2275 2300 'PhabricatorPolicyCanViewCapability' => 'applications/policy/capability/PhabricatorPolicyCanViewCapability.php', 2276 2301 'PhabricatorPolicyCapability' => 'applications/policy/capability/PhabricatorPolicyCapability.php', 2302 + 'PhabricatorPolicyCapabilityTestCase' => 'applications/policy/capability/__tests__/PhabricatorPolicyCapabilityTestCase.php', 2277 2303 'PhabricatorPolicyConfigOptions' => 'applications/policy/config/PhabricatorPolicyConfigOptions.php', 2278 2304 'PhabricatorPolicyConstants' => 'applications/policy/constants/PhabricatorPolicyConstants.php', 2279 2305 'PhabricatorPolicyController' => 'applications/policy/controller/PhabricatorPolicyController.php', ··· 2511 2537 'PhabricatorSearchDocumentTypeDatasource' => 'applications/search/typeahead/PhabricatorSearchDocumentTypeDatasource.php', 2512 2538 'PhabricatorSearchEditController' => 'applications/search/controller/PhabricatorSearchEditController.php', 2513 2539 'PhabricatorSearchEngine' => 'applications/search/engine/PhabricatorSearchEngine.php', 2540 + 'PhabricatorSearchEngineTestCase' => 'applications/search/engine/__tests__/PhabricatorSearchEngineTestCase.php', 2514 2541 'PhabricatorSearchField' => 'applications/search/field/PhabricatorSearchField.php', 2515 2542 'PhabricatorSearchHovercardController' => 'applications/search/controller/PhabricatorSearchHovercardController.php', 2516 2543 'PhabricatorSearchIndexer' => 'applications/search/index/PhabricatorSearchIndexer.php', ··· 2544 2571 'PhabricatorSettingsMainController' => 'applications/settings/controller/PhabricatorSettingsMainController.php', 2545 2572 'PhabricatorSettingsPanel' => 'applications/settings/panel/PhabricatorSettingsPanel.php', 2546 2573 'PhabricatorSetupCheck' => 'applications/config/check/PhabricatorSetupCheck.php', 2574 + 'PhabricatorSetupCheckTestCase' => 'applications/config/check/__tests__/PhabricatorSetupCheckTestCase.php', 2547 2575 'PhabricatorSetupIssue' => 'applications/config/issue/PhabricatorSetupIssue.php', 2548 2576 'PhabricatorSetupIssueUIExample' => 'applications/uiexample/examples/PhabricatorSetupIssueUIExample.php', 2549 2577 'PhabricatorSetupIssueView' => 'applications/config/view/PhabricatorSetupIssueView.php', ··· 2573 2601 'PhabricatorSortTableUIExample' => 'applications/uiexample/examples/PhabricatorSortTableUIExample.php', 2574 2602 'PhabricatorSourceCodeView' => 'view/layout/PhabricatorSourceCodeView.php', 2575 2603 'PhabricatorSpacesApplication' => 'applications/spaces/application/PhabricatorSpacesApplication.php', 2604 + 'PhabricatorSpacesArchiveController' => 'applications/spaces/controller/PhabricatorSpacesArchiveController.php', 2576 2605 'PhabricatorSpacesCapabilityCreateSpaces' => 'applications/spaces/capability/PhabricatorSpacesCapabilityCreateSpaces.php', 2577 2606 'PhabricatorSpacesCapabilityDefaultEdit' => 'applications/spaces/capability/PhabricatorSpacesCapabilityDefaultEdit.php', 2578 2607 'PhabricatorSpacesCapabilityDefaultView' => 'applications/spaces/capability/PhabricatorSpacesCapabilityDefaultView.php', 2579 - 'PhabricatorSpacesControl' => 'applications/spaces/view/PhabricatorSpacesControl.php', 2580 2608 'PhabricatorSpacesController' => 'applications/spaces/controller/PhabricatorSpacesController.php', 2581 2609 'PhabricatorSpacesDAO' => 'applications/spaces/storage/PhabricatorSpacesDAO.php', 2582 2610 'PhabricatorSpacesEditController' => 'applications/spaces/controller/PhabricatorSpacesEditController.php', ··· 2591 2619 'PhabricatorSpacesNamespaceTransaction' => 'applications/spaces/storage/PhabricatorSpacesNamespaceTransaction.php', 2592 2620 'PhabricatorSpacesNamespaceTransactionQuery' => 'applications/spaces/query/PhabricatorSpacesNamespaceTransactionQuery.php', 2593 2621 'PhabricatorSpacesRemarkupRule' => 'applications/spaces/remarkup/PhabricatorSpacesRemarkupRule.php', 2622 + 'PhabricatorSpacesSchemaSpec' => 'applications/spaces/storage/PhabricatorSpacesSchemaSpec.php', 2594 2623 'PhabricatorSpacesTestCase' => 'applications/spaces/__tests__/PhabricatorSpacesTestCase.php', 2595 2624 'PhabricatorSpacesViewController' => 'applications/spaces/controller/PhabricatorSpacesViewController.php', 2596 2625 'PhabricatorStandardCustomField' => 'infrastructure/customfield/standard/PhabricatorStandardCustomField.php', ··· 2635 2664 'PhabricatorSubscriptionsEditor' => 'applications/subscriptions/editor/PhabricatorSubscriptionsEditor.php', 2636 2665 'PhabricatorSubscriptionsListController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsListController.php', 2637 2666 'PhabricatorSubscriptionsSubscribeEmailCommand' => 'applications/subscriptions/command/PhabricatorSubscriptionsSubscribeEmailCommand.php', 2667 + 'PhabricatorSubscriptionsSubscribersPolicyRule' => 'applications/subscriptions/policyrule/PhabricatorSubscriptionsSubscribersPolicyRule.php', 2638 2668 'PhabricatorSubscriptionsTransactionController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsTransactionController.php', 2639 2669 'PhabricatorSubscriptionsUIEventListener' => 'applications/subscriptions/events/PhabricatorSubscriptionsUIEventListener.php', 2640 2670 'PhabricatorSubscriptionsUnsubscribeEmailCommand' => 'applications/subscriptions/command/PhabricatorSubscriptionsUnsubscribeEmailCommand.php', ··· 2959 2989 'PhortunePaymentProviderConfigTransaction' => 'applications/phortune/storage/PhortunePaymentProviderConfigTransaction.php', 2960 2990 'PhortunePaymentProviderConfigTransactionQuery' => 'applications/phortune/query/PhortunePaymentProviderConfigTransactionQuery.php', 2961 2991 'PhortunePaymentProviderPHIDType' => 'applications/phortune/phid/PhortunePaymentProviderPHIDType.php', 2992 + 'PhortunePaymentProviderTestCase' => 'applications/phortune/provider/__tests__/PhortunePaymentProviderTestCase.php', 2962 2993 'PhortuneProduct' => 'applications/phortune/storage/PhortuneProduct.php', 2963 2994 'PhortuneProductImplementation' => 'applications/phortune/product/PhortuneProductImplementation.php', 2964 2995 'PhortuneProductListController' => 'applications/phortune/controller/PhortuneProductListController.php', ··· 3375 3406 'AlmanacServiceTransaction' => 'PhabricatorApplicationTransaction', 3376 3407 'AlmanacServiceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 3377 3408 'AlmanacServiceType' => 'Phobject', 3409 + 'AlmanacServiceTypeTestCase' => 'PhabricatorTestCase', 3378 3410 'AlmanacServiceViewController' => 'AlmanacServiceController', 3411 + 'AphlictDropdownDataQuery' => 'Phobject', 3379 3412 'Aphront304Response' => 'AphrontResponse', 3380 3413 'Aphront400Response' => 'AphrontResponse', 3381 3414 'Aphront403Response' => 'AphrontHTMLResponse', 3382 3415 'Aphront404Response' => 'AphrontHTMLResponse', 3383 3416 'AphrontAjaxResponse' => 'AphrontResponse', 3417 + 'AphrontApplicationConfiguration' => 'Phobject', 3384 3418 'AphrontBarView' => 'AphrontView', 3385 3419 'AphrontCSRFException' => 'AphrontException', 3386 3420 'AphrontCalendarEventView' => 'AphrontView', ··· 3415 3449 'AphrontGlyphBarView' => 'AphrontBarView', 3416 3450 'AphrontHTMLResponse' => 'AphrontResponse', 3417 3451 'AphrontHTTPProxyResponse' => 'AphrontResponse', 3452 + 'AphrontHTTPSink' => 'Phobject', 3418 3453 'AphrontHTTPSinkTestCase' => 'PhabricatorTestCase', 3419 3454 'AphrontIsolatedDatabaseConnectionTestCase' => 'PhabricatorTestCase', 3420 3455 'AphrontIsolatedHTTPSink' => 'AphrontHTTPSink', ··· 3434 3469 'AphrontRedirectResponse' => 'AphrontResponse', 3435 3470 'AphrontRedirectResponseTestCase' => 'PhabricatorTestCase', 3436 3471 'AphrontReloadResponse' => 'AphrontRedirectResponse', 3472 + 'AphrontRequest' => 'Phobject', 3437 3473 'AphrontRequestTestCase' => 'PhabricatorTestCase', 3474 + 'AphrontResponse' => 'Phobject', 3438 3475 'AphrontSideNavFilterView' => 'AphrontView', 3439 3476 'AphrontStackTraceView' => 'AphrontView', 3440 3477 'AphrontStandaloneHTMLResponse' => 'AphrontHTMLResponse', ··· 3443 3480 'AphrontTokenizerTemplateView' => 'AphrontView', 3444 3481 'AphrontTwoColumnView' => 'AphrontView', 3445 3482 'AphrontTypeaheadTemplateView' => 'AphrontView', 3483 + 'AphrontURIMapper' => 'Phobject', 3446 3484 'AphrontUnhandledExceptionResponse' => 'AphrontStandaloneHTMLResponse', 3447 3485 'AphrontUsageException' => 'AphrontException', 3448 3486 'AphrontView' => array( ··· 3455 3493 'AuditConduitAPIMethod' => 'ConduitAPIMethod', 3456 3494 'AuditQueryConduitAPIMethod' => 'AuditConduitAPIMethod', 3457 3495 'AuthManageProvidersCapability' => 'PhabricatorPolicyCapability', 3496 + 'CalendarTimeUtil' => 'Phobject', 3458 3497 'CalendarTimeUtilTestCase' => 'PhabricatorTestCase', 3498 + 'CelerityAPI' => 'Phobject', 3459 3499 'CelerityManagementMapWorkflow' => 'CelerityManagementWorkflow', 3460 3500 'CelerityManagementWorkflow' => 'PhabricatorManagementWorkflow', 3461 3501 'CelerityPhabricatorResourceController' => 'CelerityResourceController', 3462 3502 'CelerityPhabricatorResources' => 'CelerityResourcesOnDisk', 3463 3503 'CelerityPhysicalResources' => 'CelerityResources', 3504 + 'CelerityPhysicalResourcesTestCase' => 'PhabricatorTestCase', 3464 3505 'CelerityResourceController' => 'PhabricatorController', 3465 3506 'CelerityResourceGraph' => 'AbstractDirectedGraph', 3507 + 'CelerityResourceMap' => 'Phobject', 3508 + 'CelerityResourceMapGenerator' => 'Phobject', 3509 + 'CelerityResourceTransformer' => 'Phobject', 3466 3510 'CelerityResourceTransformerTestCase' => 'PhabricatorTestCase', 3511 + 'CelerityResources' => 'Phobject', 3467 3512 'CelerityResourcesOnDisk' => 'CelerityPhysicalResources', 3513 + 'CeleritySpriteGenerator' => 'Phobject', 3514 + 'CelerityStaticResourceResponse' => 'Phobject', 3468 3515 'ChatLogConduitAPIMethod' => 'ConduitAPIMethod', 3469 3516 'ChatLogQueryConduitAPIMethod' => 'ChatLogConduitAPIMethod', 3470 3517 'ChatLogRecordConduitAPIMethod' => 'ChatLogConduitAPIMethod', ··· 3472 3519 'Phobject', 3473 3520 'PhabricatorPolicyInterface', 3474 3521 ), 3522 + 'ConduitAPIMethodTestCase' => 'PhabricatorTestCase', 3523 + 'ConduitAPIRequest' => 'Phobject', 3524 + 'ConduitAPIResponse' => 'Phobject', 3475 3525 'ConduitApplicationNotInstalledException' => 'ConduitMethodNotFoundException', 3526 + 'ConduitCall' => 'Phobject', 3476 3527 'ConduitCallTestCase' => 'PhabricatorTestCase', 3477 3528 'ConduitConnectConduitAPIMethod' => 'ConduitAPIMethod', 3478 3529 'ConduitConnectionGarbageCollector' => 'PhabricatorGarbageCollector', ··· 3490 3541 'ConpherenceColumnViewController' => 'ConpherenceController', 3491 3542 'ConpherenceConduitAPIMethod' => 'ConduitAPIMethod', 3492 3543 'ConpherenceConfigOptions' => 'PhabricatorApplicationConfigOptions', 3544 + 'ConpherenceConstants' => 'Phobject', 3493 3545 'ConpherenceController' => 'PhabricatorController', 3494 3546 'ConpherenceCreateThreadConduitAPIMethod' => 'ConpherenceConduitAPIMethod', 3495 3547 'ConpherenceCreateThreadMailReceiver' => 'PhabricatorMailReceiver', ··· 3532 3584 'ConpherenceThreadIndexer' => 'PhabricatorSearchDocumentIndexer', 3533 3585 'ConpherenceThreadListView' => 'AphrontView', 3534 3586 'ConpherenceThreadMailReceiver' => 'PhabricatorObjectMailReceiver', 3587 + 'ConpherenceThreadMembersPolicyRule' => 'PhabricatorPolicyRule', 3535 3588 'ConpherenceThreadQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 3536 3589 'ConpherenceThreadRemarkupRule' => 'PhabricatorObjectRemarkupRule', 3537 3590 'ConpherenceThreadSearchEngine' => 'PhabricatorApplicationSearchEngine', ··· 3539 3592 'ConpherenceTransaction' => 'PhabricatorApplicationTransaction', 3540 3593 'ConpherenceTransactionComment' => 'PhabricatorApplicationTransactionComment', 3541 3594 'ConpherenceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 3595 + 'ConpherenceTransactionRenderer' => 'Phobject', 3542 3596 'ConpherenceTransactionView' => 'AphrontView', 3543 3597 'ConpherenceUpdateActions' => 'ConpherenceConstants', 3544 3598 'ConpherenceUpdateController' => 'ConpherenceController', ··· 3548 3602 'ConpherenceWidgetController' => 'ConpherenceController', 3549 3603 'ConpherenceWidgetView' => 'AphrontView', 3550 3604 'DarkConsoleController' => 'PhabricatorController', 3605 + 'DarkConsoleCore' => 'Phobject', 3551 3606 'DarkConsoleDataController' => 'PhabricatorController', 3552 3607 'DarkConsoleErrorLogPlugin' => 'DarkConsolePlugin', 3608 + 'DarkConsoleErrorLogPluginAPI' => 'Phobject', 3553 3609 'DarkConsoleEventPlugin' => 'DarkConsolePlugin', 3554 3610 'DarkConsoleEventPluginAPI' => 'PhabricatorEventListener', 3611 + 'DarkConsolePlugin' => 'Phobject', 3555 3612 'DarkConsoleRequestPlugin' => 'DarkConsolePlugin', 3556 3613 'DarkConsoleServicesPlugin' => 'DarkConsolePlugin', 3557 3614 'DarkConsoleXHProfPlugin' => 'DarkConsolePlugin', 3558 - 'DefaultDatabaseConfigurationProvider' => 'DatabaseConfigurationProvider', 3615 + 'DarkConsoleXHProfPluginAPI' => 'Phobject', 3616 + 'DefaultDatabaseConfigurationProvider' => array( 3617 + 'Phobject', 3618 + 'DatabaseConfigurationProvider', 3619 + ), 3620 + 'DifferentialAction' => 'Phobject', 3559 3621 'DifferentialActionEmailCommand' => 'MetaMTAEmailTransactionCommand', 3560 3622 'DifferentialActionMenuEventListener' => 'PhabricatorEventListener', 3561 3623 'DifferentialAddCommentView' => 'AphrontView', ··· 3567 3629 'DifferentialAuthorField' => 'DifferentialCustomField', 3568 3630 'DifferentialBlameRevisionField' => 'DifferentialStoredCustomField', 3569 3631 'DifferentialBranchField' => 'DifferentialCustomField', 3632 + 'DifferentialChangeType' => 'Phobject', 3570 3633 'DifferentialChangesSinceLastUpdateField' => 'DifferentialCustomField', 3571 3634 'DifferentialChangeset' => array( 3572 3635 'DifferentialDAO', 3573 3636 'PhabricatorPolicyInterface', 3574 3637 ), 3575 3638 'DifferentialChangesetDetailView' => 'AphrontView', 3639 + 'DifferentialChangesetFileTreeSideNavBuilder' => 'Phobject', 3576 3640 'DifferentialChangesetHTMLRenderer' => 'DifferentialChangesetRenderer', 3577 3641 'DifferentialChangesetListView' => 'AphrontView', 3578 3642 'DifferentialChangesetOneUpRenderer' => 'DifferentialChangesetHTMLRenderer', 3579 3643 'DifferentialChangesetOneUpTestRenderer' => 'DifferentialChangesetTestRenderer', 3644 + 'DifferentialChangesetParser' => 'Phobject', 3580 3645 'DifferentialChangesetParserTestCase' => 'PhabricatorTestCase', 3581 3646 'DifferentialChangesetQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 3647 + 'DifferentialChangesetRenderer' => 'Phobject', 3582 3648 'DifferentialChangesetTestRenderer' => 'DifferentialChangesetRenderer', 3583 3649 'DifferentialChangesetTwoUpRenderer' => 'DifferentialChangesetHTMLRenderer', 3584 3650 'DifferentialChangesetTwoUpTestRenderer' => 'DifferentialChangesetTestRenderer', ··· 3586 3652 'DifferentialCloseConduitAPIMethod' => 'DifferentialConduitAPIMethod', 3587 3653 'DifferentialCommentPreviewController' => 'DifferentialController', 3588 3654 'DifferentialCommentSaveController' => 'DifferentialController', 3655 + 'DifferentialCommitMessageParser' => 'Phobject', 3589 3656 'DifferentialCommitMessageParserTestCase' => 'PhabricatorTestCase', 3590 3657 'DifferentialCommitsField' => 'DifferentialCustomField', 3591 3658 'DifferentialConduitAPIMethod' => 'ConduitAPIMethod', ··· 3641 3708 'DifferentialGetRawDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod', 3642 3709 'DifferentialGetRevisionCommentsConduitAPIMethod' => 'DifferentialConduitAPIMethod', 3643 3710 'DifferentialGetRevisionConduitAPIMethod' => 'DifferentialConduitAPIMethod', 3711 + 'DifferentialGetWorkingCopy' => 'Phobject', 3644 3712 'DifferentialGitHubLandingStrategy' => 'DifferentialLandingStrategy', 3645 3713 'DifferentialGitSVNIDField' => 'DifferentialCustomField', 3646 3714 'DifferentialHiddenComment' => 'DifferentialDAO', ··· 3652 3720 'DifferentialDAO', 3653 3721 'PhabricatorPolicyInterface', 3654 3722 ), 3723 + 'DifferentialHunkParser' => 'Phobject', 3655 3724 'DifferentialHunkParserTestCase' => 'PhabricatorTestCase', 3656 3725 'DifferentialHunkQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 3657 3726 'DifferentialHunkTestCase' => 'PhutilTestCase', 3658 - 'DifferentialInlineComment' => 'PhabricatorInlineCommentInterface', 3727 + 'DifferentialInlineComment' => array( 3728 + 'Phobject', 3729 + 'PhabricatorInlineCommentInterface', 3730 + ), 3659 3731 'DifferentialInlineCommentEditController' => 'PhabricatorInlineCommentController', 3660 3732 'DifferentialInlineCommentPreviewController' => 'PhabricatorInlineCommentPreviewController', 3661 3733 'DifferentialInlineCommentQuery' => 'PhabricatorOffsetPagedQuery', 3662 3734 'DifferentialJIRAIssuesField' => 'DifferentialStoredCustomField', 3663 3735 'DifferentialLandingActionMenuEventListener' => 'PhabricatorEventListener', 3736 + 'DifferentialLandingStrategy' => 'Phobject', 3664 3737 'DifferentialLegacyHunk' => 'DifferentialHunk', 3665 3738 'DifferentialLineAdjustmentMap' => 'Phobject', 3666 3739 'DifferentialLintField' => 'DifferentialCustomField', 3740 + 'DifferentialLintStatus' => 'Phobject', 3667 3741 'DifferentialLocalCommitsView' => 'AphrontView', 3668 3742 'DifferentialManiphestTasksField' => 'DifferentialCoreCustomField', 3669 3743 'DifferentialModernHunk' => 'DifferentialHunk', ··· 3676 3750 'DifferentialProjectsField' => 'DifferentialCoreCustomField', 3677 3751 'DifferentialQueryConduitAPIMethod' => 'DifferentialConduitAPIMethod', 3678 3752 'DifferentialQueryDiffsConduitAPIMethod' => 'DifferentialConduitAPIMethod', 3753 + 'DifferentialRawDiffRenderer' => 'Phobject', 3754 + 'DifferentialReleephRequestFieldSpecification' => 'Phobject', 3679 3755 'DifferentialRemarkupRule' => 'PhabricatorObjectRemarkupRule', 3680 3756 'DifferentialReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 3681 3757 'DifferentialRepositoryField' => 'DifferentialCoreCustomField', ··· 3684 3760 'DifferentialResultsTableView' => 'AphrontView', 3685 3761 'DifferentialRevertPlanField' => 'DifferentialStoredCustomField', 3686 3762 'DifferentialReviewedByField' => 'DifferentialCoreCustomField', 3763 + 'DifferentialReviewer' => 'Phobject', 3687 3764 'DifferentialReviewerForRevisionEdgeType' => 'PhabricatorEdgeType', 3765 + 'DifferentialReviewerStatus' => 'Phobject', 3688 3766 'DifferentialReviewersField' => 'DifferentialCoreCustomField', 3689 3767 'DifferentialReviewersView' => 'AphrontView', 3690 3768 'DifferentialRevision' => array( ··· 3703 3781 'PhabricatorProjectInterface', 3704 3782 ), 3705 3783 'DifferentialRevisionCloseDetailsController' => 'DifferentialController', 3784 + 'DifferentialRevisionControlSystem' => 'Phobject', 3706 3785 'DifferentialRevisionDependedOnByRevisionEdgeType' => 'PhabricatorEdgeType', 3707 3786 'DifferentialRevisionDependsOnRevisionEdgeType' => 'PhabricatorEdgeType', 3708 3787 'DifferentialRevisionDetailView' => 'AphrontView', ··· 3718 3797 'DifferentialRevisionPHIDType' => 'PhabricatorPHIDType', 3719 3798 'DifferentialRevisionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 3720 3799 'DifferentialRevisionSearchEngine' => 'PhabricatorApplicationSearchEngine', 3800 + 'DifferentialRevisionStatus' => 'Phobject', 3721 3801 'DifferentialRevisionUpdateHistoryView' => 'AphrontView', 3722 3802 'DifferentialRevisionViewController' => 'DifferentialController', 3723 3803 'DifferentialSchemaSpec' => 'PhabricatorConfigSchemaSpec', ··· 3734 3814 'DifferentialTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 3735 3815 'DifferentialTransactionView' => 'PhabricatorApplicationTransactionView', 3736 3816 'DifferentialUnitField' => 'DifferentialCustomField', 3817 + 'DifferentialUnitStatus' => 'Phobject', 3818 + 'DifferentialUnitTestResult' => 'Phobject', 3737 3819 'DifferentialUpdateRevisionConduitAPIMethod' => 'DifferentialConduitAPIMethod', 3738 3820 'DifferentialUpdateUnitResultsConduitAPIMethod' => 'DifferentialConduitAPIMethod', 3739 3821 'DifferentialViewPolicyField' => 'DifferentialCoreCustomField', ··· 3746 3828 'DiffusionBrowseFileController' => 'DiffusionBrowseController', 3747 3829 'DiffusionBrowseMainController' => 'DiffusionBrowseController', 3748 3830 'DiffusionBrowseQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 3831 + 'DiffusionBrowseResultSet' => 'Phobject', 3749 3832 'DiffusionBrowseSearchController' => 'DiffusionBrowseController', 3750 3833 'DiffusionBrowseTableView' => 'DiffusionView', 3751 3834 'DiffusionCachedResolveRefsQuery' => 'DiffusionLowLevelQuery', ··· 3781 3864 'DiffusionEmptyResultView' => 'DiffusionView', 3782 3865 'DiffusionExistsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 3783 3866 'DiffusionExternalController' => 'DiffusionController', 3867 + 'DiffusionExternalSymbolQuery' => 'Phobject', 3868 + 'DiffusionExternalSymbolsSource' => 'Phobject', 3869 + 'DiffusionFileContent' => 'Phobject', 3784 3870 'DiffusionFileContentQuery' => 'DiffusionQuery', 3785 3871 'DiffusionFileContentQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 3786 3872 'DiffusionFindSymbolsConduitAPIMethod' => 'DiffusionConduitAPIMethod', 3787 3873 'DiffusionGetCommitsConduitAPIMethod' => 'DiffusionConduitAPIMethod', 3788 3874 'DiffusionGetLintMessagesConduitAPIMethod' => 'DiffusionConduitAPIMethod', 3789 3875 'DiffusionGetRecentCommitsByPathConduitAPIMethod' => 'DiffusionConduitAPIMethod', 3876 + 'DiffusionGitBranch' => 'Phobject', 3790 3877 'DiffusionGitBranchTestCase' => 'PhabricatorTestCase', 3791 3878 'DiffusionGitFileContentQuery' => 'DiffusionFileContentQuery', 3792 3879 'DiffusionGitFileContentQueryTestCase' => 'PhabricatorTestCase', ··· 3807 3894 'DiffusionLintController' => 'DiffusionController', 3808 3895 'DiffusionLintCountQuery' => 'PhabricatorQuery', 3809 3896 'DiffusionLintDetailsController' => 'DiffusionController', 3897 + 'DiffusionLintSaveRunner' => 'Phobject', 3810 3898 'DiffusionLookSoonConduitAPIMethod' => 'DiffusionConduitAPIMethod', 3811 3899 'DiffusionLowLevelCommitFieldsQuery' => 'DiffusionLowLevelQuery', 3812 3900 'DiffusionLowLevelCommitQuery' => 'DiffusionLowLevelQuery', ··· 3823 3911 'DiffusionMercurialSSHWorkflow' => 'DiffusionSSHWorkflow', 3824 3912 'DiffusionMercurialServeSSHWorkflow' => 'DiffusionMercurialSSHWorkflow', 3825 3913 'DiffusionMercurialWireClientSSHProtocolChannel' => 'PhutilProtocolChannel', 3914 + 'DiffusionMercurialWireProtocol' => 'Phobject', 3826 3915 'DiffusionMercurialWireSSHTestCase' => 'PhabricatorTestCase', 3827 3916 'DiffusionMergedCommitsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 3828 3917 'DiffusionMirrorDeleteController' => 'DiffusionController', 3829 3918 'DiffusionMirrorEditController' => 'DiffusionController', 3919 + 'DiffusionPathChange' => 'Phobject', 3920 + 'DiffusionPathChangeQuery' => 'Phobject', 3830 3921 'DiffusionPathCompleteController' => 'DiffusionController', 3922 + 'DiffusionPathIDQuery' => 'Phobject', 3923 + 'DiffusionPathQuery' => 'Phobject', 3831 3924 'DiffusionPathQueryTestCase' => 'PhabricatorTestCase', 3832 3925 'DiffusionPathTreeController' => 'DiffusionController', 3833 3926 'DiffusionPathValidateController' => 'DiffusionController', ··· 3848 3941 'DiffusionRefNotFoundException' => 'Exception', 3849 3942 'DiffusionRefTableController' => 'DiffusionController', 3850 3943 'DiffusionRefsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 3944 + 'DiffusionRenameHistoryQuery' => 'Phobject', 3851 3945 'DiffusionRepositoryByIDRemarkupRule' => 'PhabricatorObjectRemarkupRule', 3852 3946 'DiffusionRepositoryController' => 'DiffusionController', 3853 3947 'DiffusionRepositoryCreateController' => 'DiffusionRepositoryEditController', ··· 3869 3963 'DiffusionRepositoryEditUpdateController' => 'DiffusionRepositoryEditController', 3870 3964 'DiffusionRepositoryListController' => 'DiffusionController', 3871 3965 'DiffusionRepositoryNewController' => 'DiffusionController', 3966 + 'DiffusionRepositoryPath' => 'Phobject', 3872 3967 'DiffusionRepositoryRef' => 'Phobject', 3873 3968 'DiffusionRepositoryRemarkupRule' => 'PhabricatorObjectRemarkupRule', 3874 3969 'DiffusionRepositorySymbolsController' => 'DiffusionRepositoryEditController', 3970 + 'DiffusionRepositoryTag' => 'Phobject', 3971 + 'DiffusionRequest' => 'Phobject', 3875 3972 'DiffusionResolveRefsConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 3876 3973 'DiffusionResolveUserQuery' => 'Phobject', 3877 3974 'DiffusionSSHWorkflow' => 'PhabricatorSSHWorkflow', ··· 3896 3993 'DiffusionUpdateCoverageConduitAPIMethod' => 'DiffusionConduitAPIMethod', 3897 3994 'DiffusionView' => 'AphrontView', 3898 3995 'DivinerArticleAtomizer' => 'DivinerAtomizer', 3996 + 'DivinerAtom' => 'Phobject', 3899 3997 'DivinerAtomCache' => 'DivinerDiskCache', 3900 3998 'DivinerAtomController' => 'DivinerController', 3901 3999 'DivinerAtomListController' => 'DivinerController', 3902 4000 'DivinerAtomPHIDType' => 'PhabricatorPHIDType', 3903 4001 'DivinerAtomQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4002 + 'DivinerAtomRef' => 'Phobject', 3904 4003 'DivinerAtomSearchEngine' => 'PhabricatorApplicationSearchEngine', 3905 4004 'DivinerAtomSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 3906 4005 'DivinerAtomizeWorkflow' => 'DivinerWorkflow', 4006 + 'DivinerAtomizer' => 'Phobject', 3907 4007 'DivinerBookController' => 'DivinerController', 3908 4008 'DivinerBookItemView' => 'AphrontTagView', 3909 4009 'DivinerBookPHIDType' => 'PhabricatorPHIDType', ··· 3912 4012 'DivinerController' => 'PhabricatorController', 3913 4013 'DivinerDAO' => 'PhabricatorLiskDAO', 3914 4014 'DivinerDefaultRenderer' => 'DivinerRenderer', 4015 + 'DivinerDiskCache' => 'Phobject', 3915 4016 'DivinerFileAtomizer' => 'DivinerAtomizer', 3916 4017 'DivinerFindController' => 'DivinerController', 3917 4018 'DivinerGenerateWorkflow' => 'DivinerWorkflow', ··· 3932 4033 'DivinerPHPAtomizer' => 'DivinerAtomizer', 3933 4034 'DivinerParameterTableView' => 'AphrontTagView', 3934 4035 'DivinerPublishCache' => 'DivinerDiskCache', 4036 + 'DivinerPublisher' => 'Phobject', 4037 + 'DivinerRenderer' => 'Phobject', 3935 4038 'DivinerReturnTableView' => 'AphrontTagView', 3936 4039 'DivinerSectionView' => 'AphrontTagView', 3937 4040 'DivinerStaticPublisher' => 'DivinerPublisher', ··· 3949 4052 'PhabricatorPolicyInterface', 3950 4053 ), 3951 4054 'DoorkeeperExternalObjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4055 + 'DoorkeeperFeedStoryPublisher' => 'Phobject', 3952 4056 'DoorkeeperFeedWorker' => 'FeedPushWorker', 3953 4057 'DoorkeeperImportEngine' => 'Phobject', 3954 4058 'DoorkeeperJIRAFeedWorker' => 'DoorkeeperFeedWorker', ··· 3976 4080 'DrydockBlueprintCustomField' => 'PhabricatorCustomField', 3977 4081 'DrydockBlueprintEditController' => 'DrydockBlueprintController', 3978 4082 'DrydockBlueprintEditor' => 'PhabricatorApplicationTransactionEditor', 4083 + 'DrydockBlueprintImplementation' => 'Phobject', 4084 + 'DrydockBlueprintImplementationTestCase' => 'PhabricatorTestCase', 3979 4085 'DrydockBlueprintListController' => 'DrydockBlueprintController', 3980 4086 'DrydockBlueprintPHIDType' => 'PhabricatorPHIDType', 3981 4087 'DrydockBlueprintQuery' => 'DrydockQuery', 4088 + 'DrydockBlueprintScopeGuard' => 'Phobject', 3982 4089 'DrydockBlueprintSearchEngine' => 'PhabricatorApplicationSearchEngine', 3983 4090 'DrydockBlueprintTransaction' => 'PhabricatorApplicationTransaction', 3984 4091 'DrydockBlueprintTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 3985 4092 'DrydockBlueprintViewController' => 'DrydockBlueprintController', 3986 4093 'DrydockCommandInterface' => 'DrydockInterface', 3987 4094 'DrydockConsoleController' => 'DrydockController', 4095 + 'DrydockConstants' => 'Phobject', 3988 4096 'DrydockController' => 'PhabricatorController', 3989 4097 'DrydockCreateBlueprintsCapability' => 'PhabricatorPolicyCapability', 3990 4098 'DrydockDAO' => 'PhabricatorLiskDAO', 3991 4099 'DrydockDefaultEditCapability' => 'PhabricatorPolicyCapability', 3992 4100 'DrydockDefaultViewCapability' => 'PhabricatorPolicyCapability', 3993 4101 'DrydockFilesystemInterface' => 'DrydockInterface', 4102 + 'DrydockInterface' => 'Phobject', 3994 4103 'DrydockLease' => array( 3995 4104 'DrydockDAO', 3996 4105 'PhabricatorPolicyInterface', ··· 4044 4153 'FeedPublisherWorker' => 'FeedPushWorker', 4045 4154 'FeedPushWorker' => 'PhabricatorWorker', 4046 4155 'FeedQueryConduitAPIMethod' => 'FeedConduitAPIMethod', 4156 + 'FeedStoryNotificationGarbageCollector' => 'PhabricatorGarbageCollector', 4047 4157 'FileAllocateConduitAPIMethod' => 'FileConduitAPIMethod', 4048 4158 'FileConduitAPIMethod' => 'ConduitAPIMethod', 4049 4159 'FileCreateMailReceiver' => 'PhabricatorMailReceiver', ··· 4162 4272 ), 4163 4273 'HarbormasterBuildStepCustomField' => 'PhabricatorCustomField', 4164 4274 'HarbormasterBuildStepEditor' => 'PhabricatorApplicationTransactionEditor', 4275 + 'HarbormasterBuildStepImplementation' => 'Phobject', 4276 + 'HarbormasterBuildStepImplementationTestCase' => 'PhabricatorTestCase', 4165 4277 'HarbormasterBuildStepPHIDType' => 'PhabricatorPHIDType', 4166 4278 'HarbormasterBuildStepQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4167 4279 'HarbormasterBuildStepTransaction' => 'PhabricatorApplicationTransaction', ··· 4227 4339 'HarbormasterWaitForPreviousBuildStepImplementation' => 'HarbormasterBuildStepImplementation', 4228 4340 'HarbormasterWorker' => 'PhabricatorWorker', 4229 4341 'HeraldAction' => 'HeraldDAO', 4342 + 'HeraldAdapter' => 'Phobject', 4230 4343 'HeraldApplyTranscript' => 'Phobject', 4231 4344 'HeraldCommitAdapter' => 'HeraldAdapter', 4232 4345 'HeraldCondition' => 'HeraldDAO', 4346 + 'HeraldConditionTranscript' => 'Phobject', 4233 4347 'HeraldController' => 'PhabricatorController', 4348 + 'HeraldCustomAction' => 'Phobject', 4234 4349 'HeraldDAO' => 'PhabricatorLiskDAO', 4235 4350 'HeraldDifferentialAdapter' => 'HeraldAdapter', 4236 4351 'HeraldDifferentialDiffAdapter' => 'HeraldDifferentialAdapter', 4237 4352 'HeraldDifferentialRevisionAdapter' => 'HeraldDifferentialAdapter', 4238 4353 'HeraldDisableController' => 'HeraldController', 4354 + 'HeraldEffect' => 'Phobject', 4355 + 'HeraldEngine' => 'Phobject', 4239 4356 'HeraldInvalidActionException' => 'Exception', 4240 4357 'HeraldInvalidConditionException' => 'Exception', 4241 4358 'HeraldManageGlobalRulesCapability' => 'PhabricatorPolicyCapability', 4242 4359 'HeraldManiphestTaskAdapter' => 'HeraldAdapter', 4243 4360 'HeraldNewController' => 'HeraldController', 4361 + 'HeraldObjectTranscript' => 'Phobject', 4244 4362 'HeraldPholioMockAdapter' => 'HeraldAdapter', 4245 4363 'HeraldPreCommitAdapter' => 'HeraldAdapter', 4246 4364 'HeraldPreCommitContentAdapter' => 'HeraldPreCommitAdapter', 4247 4365 'HeraldPreCommitRefAdapter' => 'HeraldPreCommitAdapter', 4248 4366 'HeraldRecursiveConditionsException' => 'Exception', 4249 4367 'HeraldRemarkupRule' => 'PhabricatorObjectRemarkupRule', 4368 + 'HeraldRepetitionPolicyConfig' => 'Phobject', 4250 4369 'HeraldRule' => array( 4251 4370 'HeraldDAO', 4252 4371 'PhabricatorApplicationTransactionInterface', ··· 4263 4382 'HeraldRuleTestCase' => 'PhabricatorTestCase', 4264 4383 'HeraldRuleTransaction' => 'PhabricatorApplicationTransaction', 4265 4384 'HeraldRuleTransactionComment' => 'PhabricatorApplicationTransactionComment', 4385 + 'HeraldRuleTranscript' => 'Phobject', 4386 + 'HeraldRuleTypeConfig' => 'Phobject', 4266 4387 'HeraldRuleViewController' => 'HeraldController', 4267 4388 'HeraldSchemaSpec' => 'PhabricatorConfigSchemaSpec', 4268 4389 'HeraldTestConsoleController' => 'HeraldController', ··· 4278 4399 'HeraldTranscriptQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4279 4400 'HeraldTranscriptSearchEngine' => 'PhabricatorApplicationSearchEngine', 4280 4401 'HeraldTranscriptTestCase' => 'PhabricatorTestCase', 4402 + 'Javelin' => 'Phobject', 4281 4403 'JavelinReactorUIExample' => 'PhabricatorUIExample', 4282 4404 'JavelinUIExample' => 'PhabricatorUIExample', 4283 4405 'JavelinViewExampleServerView' => 'AphrontView', ··· 4329 4451 'LegalpadTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 4330 4452 'LegalpadTransactionView' => 'PhabricatorApplicationTransactionView', 4331 4453 'LiskChunkTestCase' => 'PhabricatorTestCase', 4454 + 'LiskDAO' => 'Phobject', 4455 + 'LiskDAOSet' => 'Phobject', 4332 4456 'LiskDAOTestCase' => 'PhabricatorTestCase', 4333 4457 'LiskEphemeralObjectException' => 'Exception', 4334 4458 'LiskFixtureTestCase' => 'PhabricatorTestCase', ··· 4351 4475 'ManiphestCustomField', 4352 4476 'PhabricatorStandardCustomFieldInterface', 4353 4477 ), 4478 + 'ManiphestConstants' => 'Phobject', 4354 4479 'ManiphestController' => 'PhabricatorController', 4355 4480 'ManiphestCreateMailReceiver' => 'PhabricatorMailReceiver', 4356 4481 'ManiphestCreateTaskConduitAPIMethod' => 'ManiphestConduitAPIMethod', ··· 4370 4495 'ManiphestEditStatusCapability' => 'PhabricatorPolicyCapability', 4371 4496 'ManiphestEmailCommand' => 'MetaMTAEmailTransactionCommand', 4372 4497 'ManiphestExcelDefaultFormat' => 'ManiphestExcelFormat', 4498 + 'ManiphestExcelFormat' => 'Phobject', 4499 + 'ManiphestExcelFormatTestCase' => 'PhabricatorTestCase', 4373 4500 'ManiphestExportController' => 'ManiphestController', 4374 4501 'ManiphestGetTaskTransactionsConduitAPIMethod' => 'ManiphestConduitAPIMethod', 4375 4502 'ManiphestHovercardEventListener' => 'PhabricatorEventListener', ··· 4400 4527 'PhabricatorDestructibleInterface', 4401 4528 'PhabricatorApplicationTransactionInterface', 4402 4529 'PhabricatorProjectInterface', 4530 + 'PhabricatorSpacesInterface', 4403 4531 ), 4532 + 'ManiphestTaskAuthorPolicyRule' => 'PhabricatorPolicyRule', 4404 4533 'ManiphestTaskClosedStatusDatasource' => 'PhabricatorTypeaheadDatasource', 4405 4534 'ManiphestTaskDependedOnByTaskEdgeType' => 'PhabricatorEdgeType', 4406 4535 'ManiphestTaskDependsOnTaskEdgeType' => 'PhabricatorEdgeType', ··· 4432 4561 'ManiphestTransactionSaveController' => 'ManiphestController', 4433 4562 'ManiphestUpdateConduitAPIMethod' => 'ManiphestConduitAPIMethod', 4434 4563 'ManiphestView' => 'AphrontView', 4564 + 'MetaMTAConstants' => 'Phobject', 4435 4565 'MetaMTAEmailTransactionCommand' => 'Phobject', 4566 + 'MetaMTAEmailTransactionCommandTestCase' => 'PhabricatorTestCase', 4436 4567 'MetaMTAMailReceivedGarbageCollector' => 'PhabricatorGarbageCollector', 4437 4568 'MetaMTAMailSentGarbageCollector' => 'PhabricatorGarbageCollector', 4438 4569 'MetaMTAReceivedMailStatus' => 'MetaMTAConstants', 4439 4570 'MultimeterContext' => 'MultimeterDimension', 4571 + 'MultimeterControl' => 'Phobject', 4440 4572 'MultimeterController' => 'PhabricatorController', 4441 4573 'MultimeterDAO' => 'PhabricatorLiskDAO', 4442 4574 'MultimeterDimension' => 'MultimeterDAO', ··· 4505 4637 'NuanceSourceDefaultEditCapability' => 'PhabricatorPolicyCapability', 4506 4638 'NuanceSourceDefaultViewCapability' => 'PhabricatorPolicyCapability', 4507 4639 'NuanceSourceDefinition' => 'Phobject', 4640 + 'NuanceSourceDefinitionTestCase' => 'PhabricatorTestCase', 4508 4641 'NuanceSourceEditController' => 'NuanceController', 4509 4642 'NuanceSourceEditor' => 'PhabricatorApplicationTransactionEditor', 4510 4643 'NuanceSourceListController' => 'NuanceController', ··· 4524 4657 'PHIDInfoConduitAPIMethod' => 'PHIDConduitAPIMethod', 4525 4658 'PHIDLookupConduitAPIMethod' => 'PHIDConduitAPIMethod', 4526 4659 'PHIDQueryConduitAPIMethod' => 'PHIDConduitAPIMethod', 4660 + 'PHUI' => 'Phobject', 4527 4661 'PHUIActionPanelExample' => 'PhabricatorUIExample', 4528 4662 'PHUIActionPanelView' => 'AphrontTagView', 4529 4663 'PHUIBoxExample' => 'PhabricatorUIExample', ··· 4624 4758 'PassphraseCredentialTransactionEditor' => 'PhabricatorApplicationTransactionEditor', 4625 4759 'PassphraseCredentialTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 4626 4760 'PassphraseCredentialType' => 'Phobject', 4627 - 'PassphraseCredentialTypePassword' => 'PassphraseCredentialType', 4628 - 'PassphraseCredentialTypeSSHGeneratedKey' => 'PassphraseCredentialTypeSSHPrivateKey', 4629 - 'PassphraseCredentialTypeSSHPrivateKey' => 'PassphraseCredentialType', 4630 - 'PassphraseCredentialTypeSSHPrivateKeyFile' => 'PassphraseCredentialTypeSSHPrivateKey', 4631 - 'PassphraseCredentialTypeSSHPrivateKeyText' => 'PassphraseCredentialTypeSSHPrivateKey', 4761 + 'PassphraseCredentialTypeTestCase' => 'PhabricatorTestCase', 4632 4762 'PassphraseCredentialViewController' => 'PassphraseController', 4633 4763 'PassphraseDAO' => 'PhabricatorLiskDAO', 4764 + 'PassphrasePasswordCredentialType' => 'PassphraseCredentialType', 4634 4765 'PassphrasePasswordKey' => 'PassphraseAbstractKey', 4635 4766 'PassphraseQueryConduitAPIMethod' => 'PassphraseConduitAPIMethod', 4636 4767 'PassphraseRemarkupRule' => 'PhabricatorObjectRemarkupRule', 4768 + 'PassphraseSSHGeneratedKeyCredentialType' => 'PassphraseSSHPrivateKeyCredentialType', 4637 4769 'PassphraseSSHKey' => 'PassphraseAbstractKey', 4770 + 'PassphraseSSHPrivateKeyCredentialType' => 'PassphraseCredentialType', 4771 + 'PassphraseSSHPrivateKeyFileCredentialType' => 'PassphraseSSHPrivateKeyCredentialType', 4772 + 'PassphraseSSHPrivateKeyTextCredentialType' => 'PassphraseSSHPrivateKeyCredentialType', 4638 4773 'PassphraseSchemaSpec' => 'PhabricatorConfigSchemaSpec', 4639 4774 'PassphraseSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 4640 4775 'PassphraseSecret' => 'PassphraseDAO', ··· 4654 4789 'Phabricator404Controller' => 'PhabricatorController', 4655 4790 'PhabricatorAWSConfigOptions' => 'PhabricatorApplicationConfigOptions', 4656 4791 'PhabricatorAccessControlTestCase' => 'PhabricatorTestCase', 4792 + 'PhabricatorAccessLog' => 'Phobject', 4657 4793 'PhabricatorAccessLogConfigOptions' => 'PhabricatorApplicationConfigOptions', 4658 4794 'PhabricatorAccountSettingsPanel' => 'PhabricatorSettingsPanel', 4659 4795 'PhabricatorActionListView' => 'AphrontView', ··· 4673 4809 'PhabricatorAphrontBarUIExample' => 'PhabricatorUIExample', 4674 4810 'PhabricatorAphrontViewTestCase' => 'PhabricatorTestCase', 4675 4811 'PhabricatorAppSearchEngine' => 'PhabricatorApplicationSearchEngine', 4676 - 'PhabricatorApplication' => 'PhabricatorPolicyInterface', 4812 + 'PhabricatorApplication' => array( 4813 + 'Phobject', 4814 + 'PhabricatorPolicyInterface', 4815 + ), 4677 4816 'PhabricatorApplicationApplicationPHIDType' => 'PhabricatorPHIDType', 4678 4817 'PhabricatorApplicationConfigOptions' => 'Phobject', 4679 4818 'PhabricatorApplicationConfigurationPanel' => 'Phobject', 4819 + 'PhabricatorApplicationConfigurationPanelTestCase' => 'PhabricatorTestCase', 4680 4820 'PhabricatorApplicationDatasource' => 'PhabricatorTypeaheadDatasource', 4681 4821 'PhabricatorApplicationDetailViewController' => 'PhabricatorApplicationsController', 4682 4822 'PhabricatorApplicationEditController' => 'PhabricatorApplicationsController', ··· 4686 4826 'PhabricatorApplicationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4687 4827 'PhabricatorApplicationSearchController' => 'PhabricatorSearchBaseController', 4688 4828 'PhabricatorApplicationSearchEngine' => 'Phobject', 4829 + 'PhabricatorApplicationSearchEngineTestCase' => 'PhabricatorTestCase', 4689 4830 'PhabricatorApplicationStatusView' => 'AphrontView', 4831 + 'PhabricatorApplicationTestCase' => 'PhabricatorTestCase', 4690 4832 'PhabricatorApplicationTransaction' => array( 4691 4833 'PhabricatorLiskDAO', 4692 4834 'PhabricatorPolicyInterface', ··· 4734 4876 'PhabricatorAsanaConfigOptions' => 'PhabricatorApplicationConfigOptions', 4735 4877 'PhabricatorAsanaSubtaskHasObjectEdgeType' => 'PhabricatorEdgeType', 4736 4878 'PhabricatorAsanaTaskHasObjectEdgeType' => 'PhabricatorEdgeType', 4879 + 'PhabricatorAuditActionConstants' => 'Phobject', 4737 4880 'PhabricatorAuditAddCommentController' => 'PhabricatorAuditController', 4738 4881 'PhabricatorAuditApplication' => 'PhabricatorApplication', 4739 4882 'PhabricatorAuditCommentEditor' => 'PhabricatorEditor', 4883 + 'PhabricatorAuditCommitStatusConstants' => 'Phobject', 4740 4884 'PhabricatorAuditController' => 'PhabricatorController', 4741 4885 'PhabricatorAuditEditor' => 'PhabricatorApplicationTransactionEditor', 4742 - 'PhabricatorAuditInlineComment' => 'PhabricatorInlineCommentInterface', 4886 + 'PhabricatorAuditInlineComment' => array( 4887 + 'Phobject', 4888 + 'PhabricatorInlineCommentInterface', 4889 + ), 4743 4890 'PhabricatorAuditListController' => 'PhabricatorAuditController', 4744 4891 'PhabricatorAuditListView' => 'AphrontView', 4745 4892 'PhabricatorAuditMailReceiver' => 'PhabricatorObjectMailReceiver', ··· 4747 4894 'PhabricatorAuditManagementWorkflow' => 'PhabricatorManagementWorkflow', 4748 4895 'PhabricatorAuditPreviewController' => 'PhabricatorAuditController', 4749 4896 'PhabricatorAuditReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 4897 + 'PhabricatorAuditStatusConstants' => 'Phobject', 4750 4898 'PhabricatorAuditTransaction' => 'PhabricatorApplicationTransaction', 4751 4899 'PhabricatorAuditTransactionComment' => 'PhabricatorApplicationTransactionComment', 4752 4900 'PhabricatorAuditTransactionQuery' => 'PhabricatorApplicationTransactionQuery', ··· 4764 4912 'PhabricatorAuthEditController' => 'PhabricatorAuthProviderConfigController', 4765 4913 'PhabricatorAuthFactor' => 'Phobject', 4766 4914 'PhabricatorAuthFactorConfig' => 'PhabricatorAuthDAO', 4915 + 'PhabricatorAuthFactorTestCase' => 'PhabricatorTestCase', 4767 4916 'PhabricatorAuthFinishController' => 'PhabricatorAuthController', 4768 4917 'PhabricatorAuthHighSecurityRequiredException' => 'Exception', 4918 + 'PhabricatorAuthHighSecurityToken' => 'Phobject', 4769 4919 'PhabricatorAuthInvite' => array( 4770 4920 'PhabricatorUserDAO', 4771 4921 'PhabricatorPolicyInterface', ··· 4804 4954 'PhabricatorAuthNewController' => 'PhabricatorAuthProviderConfigController', 4805 4955 'PhabricatorAuthOldOAuthRedirectController' => 'PhabricatorAuthController', 4806 4956 'PhabricatorAuthOneTimeLoginController' => 'PhabricatorAuthController', 4957 + 'PhabricatorAuthProvider' => 'Phobject', 4807 4958 'PhabricatorAuthProviderConfig' => array( 4808 4959 'PhabricatorAuthDAO', 4809 4960 'PhabricatorApplicationTransactionInterface', ··· 4860 5011 'PhabricatorBotDebugLogHandler' => 'PhabricatorBotHandler', 4861 5012 'PhabricatorBotFeedNotificationHandler' => 'PhabricatorBotHandler', 4862 5013 'PhabricatorBotFlowdockProtocolAdapter' => 'PhabricatorStreamingProtocolAdapter', 5014 + 'PhabricatorBotHandler' => 'Phobject', 4863 5015 'PhabricatorBotLogHandler' => 'PhabricatorBotHandler', 4864 5016 'PhabricatorBotMacroHandler' => 'PhabricatorBotHandler', 5017 + 'PhabricatorBotMessage' => 'Phobject', 4865 5018 'PhabricatorBotObjectNameHandler' => 'PhabricatorBotHandler', 4866 5019 'PhabricatorBotSymbolHandler' => 'PhabricatorBotHandler', 5020 + 'PhabricatorBotTarget' => 'Phobject', 4867 5021 'PhabricatorBotUser' => 'PhabricatorBotTarget', 4868 5022 'PhabricatorBotWhatsNewHandler' => 'PhabricatorBotHandler', 4869 5023 'PhabricatorBritishEnglishTranslation' => 'PhutilTranslation', ··· 4878 5032 'PhabricatorCacheSetupCheck' => 'PhabricatorSetupCheck', 4879 5033 'PhabricatorCacheSpec' => 'Phobject', 4880 5034 'PhabricatorCacheTTLGarbageCollector' => 'PhabricatorGarbageCollector', 5035 + 'PhabricatorCaches' => 'Phobject', 4881 5036 'PhabricatorCachesTestCase' => 'PhabricatorTestCase', 4882 5037 'PhabricatorCalendarApplication' => 'PhabricatorApplication', 4883 5038 'PhabricatorCalendarController' => 'PhabricatorController', ··· 5009 5164 'PhabricatorConfigIgnoreController' => 'PhabricatorConfigController', 5010 5165 'PhabricatorConfigIssueListController' => 'PhabricatorConfigController', 5011 5166 'PhabricatorConfigIssueViewController' => 'PhabricatorConfigController', 5167 + 'PhabricatorConfigJSON' => 'Phobject', 5012 5168 'PhabricatorConfigJSONOptionType' => 'PhabricatorConfigOptionType', 5013 5169 'PhabricatorConfigKeySchema' => 'PhabricatorConfigStorageSchema', 5014 5170 'PhabricatorConfigListController' => 'PhabricatorConfigController', ··· 5023 5179 'Phobject', 5024 5180 'PhabricatorMarkupInterface', 5025 5181 ), 5182 + 'PhabricatorConfigOptionType' => 'Phobject', 5026 5183 'PhabricatorConfigProxySource' => 'PhabricatorConfigSource', 5027 5184 'PhabricatorConfigResponse' => 'AphrontStandaloneHTMLResponse', 5028 5185 'PhabricatorConfigSchemaQuery' => 'Phobject', 5029 5186 'PhabricatorConfigSchemaSpec' => 'Phobject', 5030 5187 'PhabricatorConfigServerSchema' => 'PhabricatorConfigStorageSchema', 5031 5188 'PhabricatorConfigSiteSource' => 'PhabricatorConfigProxySource', 5189 + 'PhabricatorConfigSource' => 'Phobject', 5032 5190 'PhabricatorConfigStackSource' => 'PhabricatorConfigSource', 5033 5191 'PhabricatorConfigStorageSchema' => 'Phobject', 5034 5192 'PhabricatorConfigTableSchema' => 'PhabricatorConfigStorageSchema', ··· 5040 5198 'PhabricatorConpherencePreferencesSettingsPanel' => 'PhabricatorSettingsPanel', 5041 5199 'PhabricatorConpherenceThreadPHIDType' => 'PhabricatorPHIDType', 5042 5200 'PhabricatorConsoleApplication' => 'PhabricatorApplication', 5201 + 'PhabricatorContentSource' => 'Phobject', 5043 5202 'PhabricatorContentSourceView' => 'AphrontView', 5044 5203 'PhabricatorContributedToObjectEdgeType' => 'PhabricatorEdgeType', 5045 5204 'PhabricatorController' => 'AphrontController', ··· 5064 5223 'PhabricatorCountdownViewController' => 'PhabricatorCountdownController', 5065 5224 'PhabricatorCredentialsUsedByObjectEdgeType' => 'PhabricatorEdgeType', 5066 5225 'PhabricatorCursorPagedPolicyAwareQuery' => 'PhabricatorPolicyAwareQuery', 5226 + 'PhabricatorCustomField' => 'Phobject', 5227 + 'PhabricatorCustomFieldAttachment' => 'Phobject', 5067 5228 'PhabricatorCustomFieldConfigOptionType' => 'PhabricatorConfigOptionType', 5068 5229 'PhabricatorCustomFieldDataNotAvailableException' => 'Exception', 5069 5230 'PhabricatorCustomFieldImplementationIncompleteException' => 'Exception', ··· 5104 5265 'PhabricatorDaemonManagementStatusWorkflow' => 'PhabricatorDaemonManagementWorkflow', 5105 5266 'PhabricatorDaemonManagementStopWorkflow' => 'PhabricatorDaemonManagementWorkflow', 5106 5267 'PhabricatorDaemonManagementWorkflow' => 'PhabricatorManagementWorkflow', 5268 + 'PhabricatorDaemonReference' => 'Phobject', 5107 5269 'PhabricatorDaemonTaskGarbageCollector' => 'PhabricatorGarbageCollector', 5108 5270 'PhabricatorDaemonTasksTableView' => 'AphrontView', 5109 5271 'PhabricatorDaemonsApplication' => 'PhabricatorApplication', ··· 5126 5288 'PhabricatorDashboardHistoryController' => 'PhabricatorDashboardController', 5127 5289 'PhabricatorDashboardInstall' => 'PhabricatorDashboardDAO', 5128 5290 'PhabricatorDashboardInstallController' => 'PhabricatorDashboardController', 5291 + 'PhabricatorDashboardLayoutConfig' => 'Phobject', 5129 5292 'PhabricatorDashboardListController' => 'PhabricatorDashboardController', 5130 5293 'PhabricatorDashboardManageController' => 'PhabricatorDashboardController', 5131 5294 'PhabricatorDashboardMovePanelController' => 'PhabricatorDashboardController', ··· 5182 5345 'PhabricatorDeveloperPreferencesSettingsPanel' => 'PhabricatorSettingsPanel', 5183 5346 'PhabricatorDiffInlineCommentQuery' => 'PhabricatorApplicationTransactionCommentQuery', 5184 5347 'PhabricatorDiffPreferencesSettingsPanel' => 'PhabricatorSettingsPanel', 5348 + 'PhabricatorDifferenceEngine' => 'Phobject', 5185 5349 'PhabricatorDifferentialApplication' => 'PhabricatorApplication', 5186 5350 'PhabricatorDifferentialConfigOptions' => 'PhabricatorApplicationConfigOptions', 5187 5351 'PhabricatorDifferentialRevisionTestDataGenerator' => 'PhabricatorTestDataGenerator', ··· 5197 5361 'PhabricatorDraftDAO' => 'PhabricatorLiskDAO', 5198 5362 'PhabricatorDrydockApplication' => 'PhabricatorApplication', 5199 5363 'PhabricatorEdgeConfig' => 'PhabricatorEdgeConstants', 5364 + 'PhabricatorEdgeConstants' => 'Phobject', 5200 5365 'PhabricatorEdgeCycleException' => 'Exception', 5201 5366 'PhabricatorEdgeEditor' => 'Phobject', 5202 5367 'PhabricatorEdgeGraph' => 'AbstractDirectedGraph', 5203 5368 'PhabricatorEdgeQuery' => 'PhabricatorQuery', 5204 5369 'PhabricatorEdgeTestCase' => 'PhabricatorTestCase', 5205 5370 'PhabricatorEdgeType' => 'Phobject', 5371 + 'PhabricatorEdgeTypeTestCase' => 'PhabricatorTestCase', 5206 5372 'PhabricatorEditor' => 'Phobject', 5207 5373 'PhabricatorElasticSearchEngine' => 'PhabricatorSearchEngine', 5208 5374 'PhabricatorElasticSearchSetupCheck' => 'PhabricatorSetupCheck', ··· 5214 5380 'PhabricatorEmbedFileRemarkupRule' => 'PhabricatorObjectRemarkupRule', 5215 5381 'PhabricatorEmojiRemarkupRule' => 'PhutilRemarkupRule', 5216 5382 'PhabricatorEmptyQueryException' => 'Exception', 5383 + 'PhabricatorEnv' => 'Phobject', 5217 5384 'PhabricatorEnvTestCase' => 'PhabricatorTestCase', 5218 5385 'PhabricatorEvent' => 'PhutilEvent', 5386 + 'PhabricatorEventEngine' => 'Phobject', 5219 5387 'PhabricatorEventListener' => 'PhutilEventListener', 5220 5388 'PhabricatorEventType' => 'PhutilEventType', 5221 5389 'PhabricatorExampleEventListener' => 'PhabricatorEventListener', ··· 5237 5405 'PhabricatorFactCursor' => 'PhabricatorFactDAO', 5238 5406 'PhabricatorFactDAO' => 'PhabricatorLiskDAO', 5239 5407 'PhabricatorFactDaemon' => 'PhabricatorDaemon', 5408 + 'PhabricatorFactEngine' => 'Phobject', 5409 + 'PhabricatorFactEngineTestCase' => 'PhabricatorTestCase', 5240 5410 'PhabricatorFactHomeController' => 'PhabricatorFactController', 5241 5411 'PhabricatorFactLastUpdatedEngine' => 'PhabricatorFactEngine', 5242 5412 'PhabricatorFactManagementAnalyzeWorkflow' => 'PhabricatorFactManagementWorkflow', ··· 5247 5417 'PhabricatorFactManagementWorkflow' => 'PhabricatorManagementWorkflow', 5248 5418 'PhabricatorFactRaw' => 'PhabricatorFactDAO', 5249 5419 'PhabricatorFactSimpleSpec' => 'PhabricatorFactSpec', 5420 + 'PhabricatorFactSpec' => 'Phobject', 5250 5421 'PhabricatorFactUpdateIterator' => 'PhutilBufferedIterator', 5251 5422 'PhabricatorFeedApplication' => 'PhabricatorApplication', 5423 + 'PhabricatorFeedBuilder' => 'Phobject', 5252 5424 'PhabricatorFeedConfigOptions' => 'PhabricatorApplicationConfigOptions', 5253 5425 'PhabricatorFeedController' => 'PhabricatorController', 5254 5426 'PhabricatorFeedDAO' => 'PhabricatorLiskDAO', ··· 5260 5432 'PhabricatorFeedQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 5261 5433 'PhabricatorFeedSearchEngine' => 'PhabricatorApplicationSearchEngine', 5262 5434 'PhabricatorFeedStory' => array( 5435 + 'Phobject', 5263 5436 'PhabricatorPolicyInterface', 5264 5437 'PhabricatorMarkupInterface', 5265 5438 ), 5266 5439 'PhabricatorFeedStoryData' => 'PhabricatorFeedDAO', 5267 5440 'PhabricatorFeedStoryNotification' => 'PhabricatorFeedDAO', 5441 + 'PhabricatorFeedStoryPublisher' => 'Phobject', 5268 5442 'PhabricatorFeedStoryReference' => 'PhabricatorFeedDAO', 5269 5443 'PhabricatorFile' => array( 5270 5444 'PhabricatorFileDAO', ··· 5275 5449 'PhabricatorPolicyInterface', 5276 5450 'PhabricatorDestructibleInterface', 5277 5451 ), 5452 + 'PhabricatorFileBundleLoader' => 'Phobject', 5278 5453 'PhabricatorFileChunk' => array( 5279 5454 'PhabricatorFileDAO', 5280 5455 'PhabricatorPolicyInterface', ··· 5313 5488 'PhabricatorFileSearchEngine' => 'PhabricatorApplicationSearchEngine', 5314 5489 'PhabricatorFileStorageBlob' => 'PhabricatorFileDAO', 5315 5490 'PhabricatorFileStorageConfigurationException' => 'Exception', 5491 + 'PhabricatorFileStorageEngine' => 'Phobject', 5492 + 'PhabricatorFileStorageEngineTestCase' => 'PhabricatorTestCase', 5316 5493 'PhabricatorFileTemporaryGarbageCollector' => 'PhabricatorGarbageCollector', 5317 5494 'PhabricatorFileTestCase' => 'PhabricatorTestCase', 5318 5495 'PhabricatorFileTestDataGenerator' => 'PhabricatorTestDataGenerator', ··· 5323 5500 'PhabricatorFileTransform' => 'Phobject', 5324 5501 'PhabricatorFileTransformController' => 'PhabricatorFileController', 5325 5502 'PhabricatorFileTransformListController' => 'PhabricatorFileController', 5503 + 'PhabricatorFileTransformTestCase' => 'PhabricatorTestCase', 5326 5504 'PhabricatorFileUploadController' => 'PhabricatorFileController', 5327 5505 'PhabricatorFileUploadDialogController' => 'PhabricatorFileController', 5328 5506 'PhabricatorFileUploadException' => 'Exception', ··· 5343 5521 'PhabricatorPolicyInterface', 5344 5522 ), 5345 5523 'PhabricatorFlagColor' => 'PhabricatorFlagConstants', 5524 + 'PhabricatorFlagConstants' => 'Phobject', 5346 5525 'PhabricatorFlagController' => 'PhabricatorController', 5347 5526 'PhabricatorFlagDAO' => 'PhabricatorLiskDAO', 5348 5527 'PhabricatorFlagDeleteController' => 'PhabricatorFlagController', ··· 5370 5549 'ArrayAccess', 5371 5550 'Countable', 5372 5551 ), 5552 + 'PhabricatorHandleObjectSelectorDataView' => 'Phobject', 5373 5553 'PhabricatorHandlePool' => 'Phobject', 5374 5554 'PhabricatorHandlePoolTestCase' => 'PhabricatorTestCase', 5375 5555 'PhabricatorHandleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', ··· 5395 5575 'PhabricatorIRCProtocolAdapter' => 'PhabricatorProtocolAdapter', 5396 5576 'PhabricatorIconRemarkupRule' => 'PhutilRemarkupRule', 5397 5577 'PhabricatorImageMacroRemarkupRule' => 'PhutilRemarkupRule', 5578 + 'PhabricatorImageTransformer' => 'Phobject', 5398 5579 'PhabricatorImagemagickSetupCheck' => 'PhabricatorSetupCheck', 5399 5580 'PhabricatorInfrastructureTestCase' => 'PhabricatorTestCase', 5400 5581 'PhabricatorInlineCommentController' => 'PhabricatorController', ··· 5405 5586 'PhabricatorInternationalizationManagementWorkflow' => 'PhabricatorManagementWorkflow', 5406 5587 'PhabricatorInvalidConfigSetupCheck' => 'PhabricatorSetupCheck', 5407 5588 'PhabricatorIteratedMD5PasswordHasher' => 'PhabricatorPasswordHasher', 5589 + 'PhabricatorIteratedMD5PasswordHasherTestCase' => 'PhabricatorTestCase', 5408 5590 'PhabricatorJIRAAuthProvider' => 'PhabricatorOAuth1AuthProvider', 5409 5591 'PhabricatorJavelinLinter' => 'ArcanistLinter', 5410 5592 'PhabricatorJiraIssueHasObjectEdgeType' => 'PhabricatorEdgeType', 5593 + 'PhabricatorJumpNavHandler' => 'Phobject', 5411 5594 'PhabricatorKeyValueDatabaseCache' => 'PhutilKeyValueCache', 5412 5595 'PhabricatorLDAPAuthProvider' => 'PhabricatorAuthProvider', 5413 5596 'PhabricatorLegalpadApplication' => 'PhabricatorApplication', ··· 5415 5598 'PhabricatorLegalpadDocumentPHIDType' => 'PhabricatorPHIDType', 5416 5599 'PhabricatorLegalpadSignaturePolicyRule' => 'PhabricatorPolicyRule', 5417 5600 'PhabricatorLibraryTestCase' => 'PhutilLibraryTestCase', 5601 + 'PhabricatorLipsumArtist' => 'Phobject', 5418 5602 'PhabricatorLipsumGenerateWorkflow' => 'PhabricatorLipsumManagementWorkflow', 5419 5603 'PhabricatorLipsumManagementWorkflow' => 'PhabricatorManagementWorkflow', 5420 5604 'PhabricatorLipsumMondrianArtist' => 'PhabricatorLipsumArtist', 5421 5605 'PhabricatorLiskDAO' => 'LiskDAO', 5606 + 'PhabricatorLiskSerializer' => 'Phobject', 5422 5607 'PhabricatorListFilterUIExample' => 'PhabricatorUIExample', 5423 5608 'PhabricatorLocalDiskFileStorageEngine' => 'PhabricatorFileStorageEngine', 5424 5609 'PhabricatorLocalTimeTestCase' => 'PhabricatorTestCase', ··· 5449 5634 'PhabricatorMacroTransactionComment' => 'PhabricatorApplicationTransactionComment', 5450 5635 'PhabricatorMacroTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 5451 5636 'PhabricatorMacroViewController' => 'PhabricatorMacroController', 5637 + 'PhabricatorMailImplementationAdapter' => 'Phobject', 5452 5638 'PhabricatorMailImplementationAmazonSESAdapter' => 'PhabricatorMailImplementationPHPMailerLiteAdapter', 5453 5639 'PhabricatorMailImplementationMailgunAdapter' => 'PhabricatorMailImplementationAdapter', 5454 5640 'PhabricatorMailImplementationPHPMailerAdapter' => 'PhabricatorMailImplementationAdapter', ··· 5463 5649 'PhabricatorMailManagementShowInboundWorkflow' => 'PhabricatorMailManagementWorkflow', 5464 5650 'PhabricatorMailManagementShowOutboundWorkflow' => 'PhabricatorMailManagementWorkflow', 5465 5651 'PhabricatorMailManagementWorkflow' => 'PhabricatorManagementWorkflow', 5652 + 'PhabricatorMailReceiver' => 'Phobject', 5466 5653 'PhabricatorMailReceiverTestCase' => 'PhabricatorTestCase', 5654 + 'PhabricatorMailReplyHandler' => 'Phobject', 5467 5655 'PhabricatorMailSetupCheck' => 'PhabricatorSetupCheck', 5468 5656 'PhabricatorMailTarget' => 'Phobject', 5469 5657 'PhabricatorMailgunConfigOptions' => 'PhabricatorApplicationConfigOptions', ··· 5474 5662 'PhabricatorManiphestConfigOptions' => 'PhabricatorApplicationConfigOptions', 5475 5663 'PhabricatorManiphestTaskTestDataGenerator' => 'PhabricatorTestDataGenerator', 5476 5664 'PhabricatorMarkupCache' => 'PhabricatorCacheDAO', 5477 - 'PhabricatorMarkupOneOff' => 'PhabricatorMarkupInterface', 5665 + 'PhabricatorMarkupEngine' => 'Phobject', 5666 + 'PhabricatorMarkupOneOff' => array( 5667 + 'Phobject', 5668 + 'PhabricatorMarkupInterface', 5669 + ), 5478 5670 'PhabricatorMarkupPreviewController' => 'PhabricatorController', 5479 5671 'PhabricatorMemeRemarkupRule' => 'PhutilRemarkupRule', 5480 5672 'PhabricatorMentionRemarkupRule' => 'PhutilRemarkupRule', 5481 5673 'PhabricatorMercurialGraphStream' => 'PhabricatorRepositoryGraphStream', 5674 + 'PhabricatorMetaMTAActor' => 'Phobject', 5482 5675 'PhabricatorMetaMTAActorQuery' => 'PhabricatorQuery', 5483 5676 'PhabricatorMetaMTAApplication' => 'PhabricatorApplication', 5484 5677 'PhabricatorMetaMTAApplicationEmail' => array( 5485 5678 'PhabricatorMetaMTADAO', 5486 5679 'PhabricatorPolicyInterface', 5680 + 'PhabricatorApplicationTransactionInterface', 5681 + 'PhabricatorDestructibleInterface', 5682 + 'PhabricatorSpacesInterface', 5487 5683 ), 5488 5684 'PhabricatorMetaMTAApplicationEmailDatasource' => 'PhabricatorTypeaheadDatasource', 5685 + 'PhabricatorMetaMTAApplicationEmailEditor' => 'PhabricatorApplicationTransactionEditor', 5489 5686 'PhabricatorMetaMTAApplicationEmailPHIDType' => 'PhabricatorPHIDType', 5490 5687 'PhabricatorMetaMTAApplicationEmailPanel' => 'PhabricatorApplicationConfigurationPanel', 5491 5688 'PhabricatorMetaMTAApplicationEmailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 5689 + 'PhabricatorMetaMTAApplicationEmailTransaction' => 'PhabricatorApplicationTransaction', 5690 + 'PhabricatorMetaMTAApplicationEmailTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 5691 + 'PhabricatorMetaMTAAttachment' => 'Phobject', 5492 5692 'PhabricatorMetaMTAConfigOptions' => 'PhabricatorApplicationConfigOptions', 5493 5693 'PhabricatorMetaMTAController' => 'PhabricatorController', 5494 5694 'PhabricatorMetaMTADAO' => 'PhabricatorLiskDAO', 5695 + 'PhabricatorMetaMTAEmailBodyParser' => 'Phobject', 5495 5696 'PhabricatorMetaMTAEmailBodyParserTestCase' => 'PhabricatorTestCase', 5496 5697 'PhabricatorMetaMTAErrorMailAction' => 'PhabricatorSystemAction', 5497 5698 'PhabricatorMetaMTAMail' => 'PhabricatorMetaMTADAO', 5699 + 'PhabricatorMetaMTAMailBody' => 'Phobject', 5498 5700 'PhabricatorMetaMTAMailBodyTestCase' => 'PhabricatorTestCase', 5701 + 'PhabricatorMetaMTAMailSection' => 'Phobject', 5499 5702 'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase', 5500 5703 'PhabricatorMetaMTAMailableDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 5501 5704 'PhabricatorMetaMTAMailableFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', ··· 5526 5729 'PhabricatorNavigationRemarkupRule' => 'PhutilRemarkupRule', 5527 5730 'PhabricatorNeverTriggerClock' => 'PhabricatorTriggerClock', 5528 5731 'PhabricatorNotificationAdHocFeedStory' => 'PhabricatorFeedStory', 5732 + 'PhabricatorNotificationBuilder' => 'Phobject', 5529 5733 'PhabricatorNotificationClearController' => 'PhabricatorNotificationController', 5734 + 'PhabricatorNotificationClient' => 'Phobject', 5530 5735 'PhabricatorNotificationConfigOptions' => 'PhabricatorApplicationConfigOptions', 5531 5736 'PhabricatorNotificationController' => 'PhabricatorController', 5532 5737 'PhabricatorNotificationIndividualController' => 'PhabricatorNotificationController', ··· 5555 5760 'PhabricatorOAuthClientSecretController' => 'PhabricatorOAuthClientController', 5556 5761 'PhabricatorOAuthClientViewController' => 'PhabricatorOAuthClientController', 5557 5762 'PhabricatorOAuthResponse' => 'AphrontResponse', 5763 + 'PhabricatorOAuthServer' => 'Phobject', 5558 5764 'PhabricatorOAuthServerAccessToken' => 'PhabricatorOAuthServerDAO', 5559 5765 'PhabricatorOAuthServerApplication' => 'PhabricatorApplication', 5560 5766 'PhabricatorOAuthServerAuthController' => 'PhabricatorAuthController', ··· 5572 5778 'PhabricatorOAuthServerController' => 'PhabricatorController', 5573 5779 'PhabricatorOAuthServerCreateClientsCapability' => 'PhabricatorPolicyCapability', 5574 5780 'PhabricatorOAuthServerDAO' => 'PhabricatorLiskDAO', 5781 + 'PhabricatorOAuthServerScope' => 'Phobject', 5575 5782 'PhabricatorOAuthServerTestCase' => 'PhabricatorTestCase', 5576 5783 'PhabricatorOAuthServerTestController' => 'PhabricatorOAuthServerController', 5577 5784 'PhabricatorOAuthServerTokenController' => 'PhabricatorAuthController', 5578 - 'PhabricatorObjectHandle' => 'PhabricatorPolicyInterface', 5785 + 'PhabricatorObjectHandle' => array( 5786 + 'Phobject', 5787 + 'PhabricatorPolicyInterface', 5788 + ), 5579 5789 'PhabricatorObjectHasAsanaSubtaskEdgeType' => 'PhabricatorEdgeType', 5580 5790 'PhabricatorObjectHasAsanaTaskEdgeType' => 'PhabricatorEdgeType', 5581 5791 'PhabricatorObjectHasContributorEdgeType' => 'PhabricatorEdgeType', ··· 5584 5794 'PhabricatorObjectHasSubscriberEdgeType' => 'PhabricatorEdgeType', 5585 5795 'PhabricatorObjectHasUnsubscriberEdgeType' => 'PhabricatorEdgeType', 5586 5796 'PhabricatorObjectHasWatcherEdgeType' => 'PhabricatorEdgeType', 5797 + 'PhabricatorObjectListQuery' => 'Phobject', 5587 5798 'PhabricatorObjectListQueryTestCase' => 'PhabricatorTestCase', 5588 5799 'PhabricatorObjectMailReceiver' => 'PhabricatorMailReceiver', 5589 5800 'PhabricatorObjectMailReceiverTestCase' => 'PhabricatorTestCase', ··· 5591 5802 'PhabricatorObjectMentionsObjectEdgeType' => 'PhabricatorEdgeType', 5592 5803 'PhabricatorObjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 5593 5804 'PhabricatorObjectRemarkupRule' => 'PhutilRemarkupRule', 5805 + 'PhabricatorObjectSelectorDialog' => 'Phobject', 5594 5806 'PhabricatorObjectUsesCredentialsEdgeType' => 'PhabricatorEdgeType', 5595 5807 'PhabricatorOffsetPagedQuery' => 'PhabricatorQuery', 5596 5808 'PhabricatorOneTimeTriggerClock' => 'PhabricatorTriggerClock', 5597 5809 'PhabricatorOpcodeCacheSpec' => 'PhabricatorCacheSpec', 5810 + 'PhabricatorOwnerPathQuery' => 'Phobject', 5598 5811 'PhabricatorOwnersApplication' => 'PhabricatorApplication', 5599 5812 'PhabricatorOwnersConfigOptions' => 'PhabricatorApplicationConfigOptions', 5600 5813 'PhabricatorOwnersController' => 'PhabricatorController', ··· 5619 5832 'PhabricatorOwnersPath' => 'PhabricatorOwnersDAO', 5620 5833 'PhabricatorOwnersPathsController' => 'PhabricatorOwnersController', 5621 5834 'PhabricatorPHDConfigOptions' => 'PhabricatorApplicationConfigOptions', 5835 + 'PhabricatorPHID' => 'Phobject', 5836 + 'PhabricatorPHIDConstants' => 'Phobject', 5837 + 'PhabricatorPHIDType' => 'Phobject', 5838 + 'PhabricatorPHIDTypeTestCase' => 'PhutilTestCase', 5622 5839 'PhabricatorPHPASTApplication' => 'PhabricatorApplication', 5623 5840 'PhabricatorPHPConfigSetupCheck' => 'PhabricatorSetupCheck', 5624 5841 'PhabricatorPHPMailerConfigOptions' => 'PhabricatorApplicationConfigOptions', ··· 5726 5943 'PhabricatorPolicyCanJoinCapability' => 'PhabricatorPolicyCapability', 5727 5944 'PhabricatorPolicyCanViewCapability' => 'PhabricatorPolicyCapability', 5728 5945 'PhabricatorPolicyCapability' => 'Phobject', 5946 + 'PhabricatorPolicyCapabilityTestCase' => 'PhabricatorTestCase', 5729 5947 'PhabricatorPolicyConfigOptions' => 'PhabricatorApplicationConfigOptions', 5948 + 'PhabricatorPolicyConstants' => 'Phobject', 5730 5949 'PhabricatorPolicyController' => 'PhabricatorController', 5731 5950 'PhabricatorPolicyDAO' => 'PhabricatorLiskDAO', 5732 5951 'PhabricatorPolicyDataTestCase' => 'PhabricatorTestCase', 5733 5952 'PhabricatorPolicyEditController' => 'PhabricatorPolicyController', 5734 5953 'PhabricatorPolicyException' => 'Exception', 5735 5954 'PhabricatorPolicyExplainController' => 'PhabricatorPolicyController', 5955 + 'PhabricatorPolicyFilter' => 'Phobject', 5736 5956 'PhabricatorPolicyInterface' => 'PhabricatorPHIDInterface', 5737 5957 'PhabricatorPolicyManagementShowWorkflow' => 'PhabricatorPolicyManagementWorkflow', 5738 5958 'PhabricatorPolicyManagementUnlockWorkflow' => 'PhabricatorPolicyManagementWorkflow', 5739 5959 'PhabricatorPolicyManagementWorkflow' => 'PhabricatorManagementWorkflow', 5740 5960 'PhabricatorPolicyPHIDTypePolicy' => 'PhabricatorPHIDType', 5741 5961 'PhabricatorPolicyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 5962 + 'PhabricatorPolicyRule' => 'Phobject', 5742 5963 'PhabricatorPolicyTestCase' => 'PhabricatorTestCase', 5743 5964 'PhabricatorPolicyTestObject' => array( 5965 + 'Phobject', 5744 5966 'PhabricatorPolicyInterface', 5745 5967 'PhabricatorExtendedPolicyInterface', 5746 5968 ), ··· 5826 6048 'PhabricatorProjectCustomField', 5827 6049 'PhabricatorStandardCustomFieldInterface', 5828 6050 ), 6051 + 'PhabricatorProjectStatus' => 'Phobject', 5829 6052 'PhabricatorProjectTestDataGenerator' => 'PhabricatorTestDataGenerator', 5830 6053 'PhabricatorProjectTransaction' => 'PhabricatorApplicationTransaction', 5831 6054 'PhabricatorProjectTransactionEditor' => 'PhabricatorApplicationTransactionEditor', ··· 5835 6058 'PhabricatorProjectViewController' => 'PhabricatorProjectController', 5836 6059 'PhabricatorProjectWatchController' => 'PhabricatorProjectController', 5837 6060 'PhabricatorProjectsPolicyRule' => 'PhabricatorPolicyRule', 6061 + 'PhabricatorProtocolAdapter' => 'Phobject', 5838 6062 'PhabricatorPygmentSetupCheck' => 'PhabricatorSetupCheck', 6063 + 'PhabricatorQuery' => 'Phobject', 5839 6064 'PhabricatorQueryConstraint' => 'Phobject', 5840 6065 'PhabricatorQueryOrderItem' => 'Phobject', 5841 6066 'PhabricatorQueryOrderTestCase' => 'PhabricatorTestCase', ··· 5897 6122 'PhabricatorRepositoryCommitOwnersWorker' => 'PhabricatorRepositoryCommitParserWorker', 5898 6123 'PhabricatorRepositoryCommitPHIDType' => 'PhabricatorPHIDType', 5899 6124 'PhabricatorRepositoryCommitParserWorker' => 'PhabricatorWorker', 6125 + 'PhabricatorRepositoryCommitRef' => 'Phobject', 5900 6126 'PhabricatorRepositoryCommitSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 5901 6127 'PhabricatorRepositoryConfigOptions' => 'PhabricatorApplicationConfigOptions', 5902 6128 'PhabricatorRepositoryDAO' => 'PhabricatorLiskDAO', 5903 6129 'PhabricatorRepositoryDiscoveryEngine' => 'PhabricatorRepositoryEngine', 5904 6130 'PhabricatorRepositoryEditor' => 'PhabricatorApplicationTransactionEditor', 6131 + 'PhabricatorRepositoryEngine' => 'Phobject', 5905 6132 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 5906 6133 'PhabricatorRepositoryGitCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', 6134 + 'PhabricatorRepositoryGraphCache' => 'Phobject', 5907 6135 'PhabricatorRepositoryGraphStream' => 'Phobject', 5908 6136 'PhabricatorRepositoryManagementCacheWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 5909 6137 'PhabricatorRepositoryManagementDiscoverWorkflow' => 'PhabricatorRepositoryManagementWorkflow', ··· 5963 6191 'PhabricatorRepositoryTestCase' => 'PhabricatorTestCase', 5964 6192 'PhabricatorRepositoryTransaction' => 'PhabricatorApplicationTransaction', 5965 6193 'PhabricatorRepositoryTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 6194 + 'PhabricatorRepositoryType' => 'Phobject', 5966 6195 'PhabricatorRepositoryURINormalizer' => 'Phobject', 5967 6196 'PhabricatorRepositoryURINormalizerTestCase' => 'PhabricatorTestCase', 5968 6197 'PhabricatorRepositoryURITestCase' => 'PhabricatorTestCase', ··· 5974 6203 'PhabricatorSMSConfigOptions' => 'PhabricatorApplicationConfigOptions', 5975 6204 'PhabricatorSMSDAO' => 'PhabricatorLiskDAO', 5976 6205 'PhabricatorSMSDemultiplexWorker' => 'PhabricatorSMSWorker', 6206 + 'PhabricatorSMSImplementationAdapter' => 'Phobject', 5977 6207 'PhabricatorSMSImplementationTestBlackholeAdapter' => 'PhabricatorSMSImplementationAdapter', 5978 6208 'PhabricatorSMSImplementationTwilioAdapter' => 'PhabricatorSMSImplementationAdapter', 5979 6209 'PhabricatorSMSManagementListOutboundWorkflow' => 'PhabricatorSMSManagementWorkflow', ··· 5982 6212 'PhabricatorSMSManagementWorkflow' => 'PhabricatorManagementWorkflow', 5983 6213 'PhabricatorSMSSendWorker' => 'PhabricatorSMSWorker', 5984 6214 'PhabricatorSMSWorker' => 'PhabricatorWorker', 6215 + 'PhabricatorSQLPatchList' => 'Phobject', 5985 6216 'PhabricatorSSHKeyGenerator' => 'Phobject', 5986 6217 'PhabricatorSSHKeysSettingsPanel' => 'PhabricatorSettingsPanel', 5987 6218 'PhabricatorSSHLog' => 'Phobject', ··· 5993 6224 ), 5994 6225 'PhabricatorSavedQueryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 5995 6226 'PhabricatorScheduleTaskTriggerAction' => 'PhabricatorTriggerAction', 6227 + 'PhabricatorScopedEnv' => 'Phobject', 6228 + 'PhabricatorSearchAbstractDocument' => 'Phobject', 5996 6229 'PhabricatorSearchApplication' => 'PhabricatorApplication', 5997 6230 'PhabricatorSearchApplicationSearchEngine' => 'PhabricatorApplicationSearchEngine', 5998 6231 'PhabricatorSearchApplicationStorageEnginePanel' => 'PhabricatorApplicationConfigurationPanel', ··· 6015 6248 'PhabricatorSearchDocumentRelationship' => 'PhabricatorSearchDAO', 6016 6249 'PhabricatorSearchDocumentTypeDatasource' => 'PhabricatorTypeaheadDatasource', 6017 6250 'PhabricatorSearchEditController' => 'PhabricatorSearchBaseController', 6251 + 'PhabricatorSearchEngine' => 'Phobject', 6252 + 'PhabricatorSearchEngineTestCase' => 'PhabricatorTestCase', 6018 6253 'PhabricatorSearchField' => 'Phobject', 6019 6254 'PhabricatorSearchHovercardController' => 'PhabricatorSearchBaseController', 6255 + 'PhabricatorSearchIndexer' => 'Phobject', 6020 6256 'PhabricatorSearchManagementIndexWorkflow' => 'PhabricatorSearchManagementWorkflow', 6021 6257 'PhabricatorSearchManagementInitWorkflow' => 'PhabricatorSearchManagementWorkflow', 6022 6258 'PhabricatorSearchManagementWorkflow' => 'PhabricatorManagementWorkflow', ··· 6025 6261 'PhabricatorSearchOwnersField' => 'PhabricatorSearchTokenizerField', 6026 6262 'PhabricatorSearchPreferencesSettingsPanel' => 'PhabricatorSettingsPanel', 6027 6263 'PhabricatorSearchProjectsField' => 'PhabricatorSearchTokenizerField', 6264 + 'PhabricatorSearchRelationship' => 'Phobject', 6028 6265 'PhabricatorSearchResultView' => 'AphrontView', 6029 6266 'PhabricatorSearchSelectController' => 'PhabricatorSearchBaseController', 6030 6267 'PhabricatorSearchSelectField' => 'PhabricatorSearchField', ··· 6044 6281 'PhabricatorSettingsAdjustController' => 'PhabricatorController', 6045 6282 'PhabricatorSettingsApplication' => 'PhabricatorApplication', 6046 6283 'PhabricatorSettingsMainController' => 'PhabricatorController', 6284 + 'PhabricatorSettingsPanel' => 'Phobject', 6285 + 'PhabricatorSetupCheck' => 'Phobject', 6286 + 'PhabricatorSetupCheckTestCase' => 'PhabricatorTestCase', 6287 + 'PhabricatorSetupIssue' => 'Phobject', 6047 6288 'PhabricatorSetupIssueUIExample' => 'PhabricatorUIExample', 6048 6289 'PhabricatorSetupIssueView' => 'AphrontView', 6049 6290 'PhabricatorSlowvoteApplication' => 'PhabricatorApplication', ··· 6076 6317 'PhabricatorSlowvoteTransactionComment' => 'PhabricatorApplicationTransactionComment', 6077 6318 'PhabricatorSlowvoteTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 6078 6319 'PhabricatorSlowvoteVoteController' => 'PhabricatorSlowvoteController', 6320 + 'PhabricatorSlug' => 'Phobject', 6079 6321 'PhabricatorSlugTestCase' => 'PhabricatorTestCase', 6080 6322 'PhabricatorSortTableUIExample' => 'PhabricatorUIExample', 6081 6323 'PhabricatorSourceCodeView' => 'AphrontView', 6082 6324 'PhabricatorSpacesApplication' => 'PhabricatorApplication', 6325 + 'PhabricatorSpacesArchiveController' => 'PhabricatorSpacesController', 6083 6326 'PhabricatorSpacesCapabilityCreateSpaces' => 'PhabricatorPolicyCapability', 6084 6327 'PhabricatorSpacesCapabilityDefaultEdit' => 'PhabricatorPolicyCapability', 6085 6328 'PhabricatorSpacesCapabilityDefaultView' => 'PhabricatorPolicyCapability', 6086 - 'PhabricatorSpacesControl' => 'AphrontFormControl', 6087 6329 'PhabricatorSpacesController' => 'PhabricatorController', 6088 6330 'PhabricatorSpacesDAO' => 'PhabricatorLiskDAO', 6089 6331 'PhabricatorSpacesEditController' => 'PhabricatorSpacesController', ··· 6103 6345 'PhabricatorSpacesNamespaceTransaction' => 'PhabricatorApplicationTransaction', 6104 6346 'PhabricatorSpacesNamespaceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 6105 6347 'PhabricatorSpacesRemarkupRule' => 'PhabricatorObjectRemarkupRule', 6348 + 'PhabricatorSpacesSchemaSpec' => 'PhabricatorConfigSchemaSpec', 6106 6349 'PhabricatorSpacesTestCase' => 'PhabricatorTestCase', 6107 6350 'PhabricatorSpacesViewController' => 'PhabricatorSpacesController', 6108 6351 'PhabricatorStandardCustomField' => 'PhabricatorCustomField', ··· 6120 6363 'PhabricatorStandardPageView' => 'PhabricatorBarePageView', 6121 6364 'PhabricatorStatusController' => 'PhabricatorController', 6122 6365 'PhabricatorStatusUIExample' => 'PhabricatorUIExample', 6366 + 'PhabricatorStorageFixtureScopeGuard' => 'Phobject', 6367 + 'PhabricatorStorageManagementAPI' => 'Phobject', 6123 6368 'PhabricatorStorageManagementAdjustWorkflow' => 'PhabricatorStorageManagementWorkflow', 6124 6369 'PhabricatorStorageManagementDatabasesWorkflow' => 'PhabricatorStorageManagementWorkflow', 6125 6370 'PhabricatorStorageManagementDestroyWorkflow' => 'PhabricatorStorageManagementWorkflow', ··· 6131 6376 'PhabricatorStorageManagementStatusWorkflow' => 'PhabricatorStorageManagementWorkflow', 6132 6377 'PhabricatorStorageManagementUpgradeWorkflow' => 'PhabricatorStorageManagementWorkflow', 6133 6378 'PhabricatorStorageManagementWorkflow' => 'PhabricatorManagementWorkflow', 6379 + 'PhabricatorStoragePatch' => 'Phobject', 6134 6380 'PhabricatorStorageSchemaSpec' => 'PhabricatorConfigSchemaSpec', 6135 6381 'PhabricatorStorageSetupCheck' => 'PhabricatorSetupCheck', 6136 6382 'PhabricatorStreamingProtocolAdapter' => 'PhabricatorProtocolAdapter', ··· 6142 6388 'PhabricatorSubscriptionsEditor' => 'PhabricatorEditor', 6143 6389 'PhabricatorSubscriptionsListController' => 'PhabricatorController', 6144 6390 'PhabricatorSubscriptionsSubscribeEmailCommand' => 'MetaMTAEmailTransactionCommand', 6391 + 'PhabricatorSubscriptionsSubscribersPolicyRule' => 'PhabricatorPolicyRule', 6145 6392 'PhabricatorSubscriptionsTransactionController' => 'PhabricatorController', 6146 6393 'PhabricatorSubscriptionsUIEventListener' => 'PhabricatorEventListener', 6147 6394 'PhabricatorSubscriptionsUnsubscribeEmailCommand' => 'MetaMTAEmailTransactionCommand', 6148 6395 'PhabricatorSupportApplication' => 'PhabricatorApplication', 6396 + 'PhabricatorSyntaxHighlighter' => 'Phobject', 6149 6397 'PhabricatorSyntaxHighlightingConfigOptions' => 'PhabricatorApplicationConfigOptions', 6398 + 'PhabricatorSystemAction' => 'Phobject', 6150 6399 'PhabricatorSystemActionEngine' => 'Phobject', 6151 6400 'PhabricatorSystemActionGarbageCollector' => 'PhabricatorGarbageCollector', 6152 6401 'PhabricatorSystemActionLog' => 'PhabricatorSystemDAO', ··· 6166 6415 'PhabricatorTestApplication' => 'PhabricatorApplication', 6167 6416 'PhabricatorTestCase' => 'PhutilTestCase', 6168 6417 'PhabricatorTestController' => 'PhabricatorController', 6418 + 'PhabricatorTestDataGenerator' => 'Phobject', 6169 6419 'PhabricatorTestNoCycleEdgeType' => 'PhabricatorEdgeType', 6170 6420 'PhabricatorTestStorageEngine' => 'PhabricatorFileStorageEngine', 6171 6421 'PhabricatorTestWorker' => 'PhabricatorWorker', 6422 + 'PhabricatorTime' => 'Phobject', 6423 + 'PhabricatorTimeGuard' => 'Phobject', 6172 6424 'PhabricatorTimeTestCase' => 'PhabricatorTestCase', 6173 6425 'PhabricatorTimezoneSetupCheck' => 'PhabricatorSetupCheck', 6174 6426 'PhabricatorToken' => array( ··· 6196 6448 'PhabricatorTokensApplication' => 'PhabricatorApplication', 6197 6449 'PhabricatorTokensSettingsPanel' => 'PhabricatorSettingsPanel', 6198 6450 'PhabricatorTooltipUIExample' => 'PhabricatorUIExample', 6451 + 'PhabricatorTransactions' => 'Phobject', 6199 6452 'PhabricatorTransactionsApplication' => 'PhabricatorApplication', 6200 6453 'PhabricatorTransformedFile' => 'PhabricatorFileDAO', 6201 6454 'PhabricatorTranslationsConfigOptions' => 'PhabricatorApplicationConfigOptions', ··· 6215 6468 'PhabricatorTypeaheadInvalidTokenException' => 'Exception', 6216 6469 'PhabricatorTypeaheadModularDatasourceController' => 'PhabricatorTypeaheadDatasourceController', 6217 6470 'PhabricatorTypeaheadMonogramDatasource' => 'PhabricatorTypeaheadDatasource', 6471 + 'PhabricatorTypeaheadResult' => 'Phobject', 6218 6472 'PhabricatorTypeaheadRuntimeCompositeDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 6219 6473 'PhabricatorTypeaheadTokenView' => 'AphrontTagView', 6220 6474 'PhabricatorUIConfigOptions' => 'PhabricatorApplicationConfigOptions', 6475 + 'PhabricatorUIExample' => 'Phobject', 6221 6476 'PhabricatorUIExampleRenderController' => 'PhabricatorController', 6222 6477 'PhabricatorUIExamplesApplication' => 'PhabricatorApplication', 6223 6478 'PhabricatorUSEnglishTranslation' => 'PhutilTranslation', ··· 6270 6525 'PhabricatorViewerDatasource' => 'PhabricatorTypeaheadDatasource', 6271 6526 'PhabricatorWatcherHasObjectEdgeType' => 'PhabricatorEdgeType', 6272 6527 'PhabricatorWordPressAuthProvider' => 'PhabricatorOAuth2AuthProvider', 6528 + 'PhabricatorWorker' => 'Phobject', 6273 6529 'PhabricatorWorkerActiveTask' => 'PhabricatorWorkerTask', 6274 6530 'PhabricatorWorkerArchiveTask' => 'PhabricatorWorkerTask', 6275 6531 'PhabricatorWorkerArchiveTaskQuery' => 'PhabricatorQuery', ··· 6369 6625 'PhameQueryPostsConduitAPIMethod' => 'PhameConduitAPIMethod', 6370 6626 'PhameResourceController' => 'CelerityResourceController', 6371 6627 'PhameSchemaSpec' => 'PhabricatorConfigSchemaSpec', 6628 + 'PhameSkinSpecification' => 'Phobject', 6372 6629 'PhluxController' => 'PhabricatorController', 6373 6630 'PhluxDAO' => 'PhabricatorLiskDAO', 6374 6631 'PhluxEditController' => 'PhluxController', ··· 6410 6667 'PhabricatorApplicationTransactionInterface', 6411 6668 'PhabricatorProjectInterface', 6412 6669 'PhabricatorDestructibleInterface', 6670 + 'PhabricatorSpacesInterface', 6413 6671 ), 6414 6672 'PholioMockCommentController' => 'PholioController', 6415 6673 'PholioMockEditController' => 'PholioController', ··· 6459 6717 'PhortuneCartCheckoutController' => 'PhortuneCartController', 6460 6718 'PhortuneCartController' => 'PhortuneController', 6461 6719 'PhortuneCartEditor' => 'PhabricatorApplicationTransactionEditor', 6720 + 'PhortuneCartImplementation' => 'Phobject', 6462 6721 'PhortuneCartListController' => 'PhortuneController', 6463 6722 'PhortuneCartPHIDType' => 'PhabricatorPHIDType', 6464 6723 'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', ··· 6477 6736 'PhortuneChargeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 6478 6737 'PhortuneChargeSearchEngine' => 'PhabricatorApplicationSearchEngine', 6479 6738 'PhortuneChargeTableView' => 'AphrontView', 6739 + 'PhortuneConstants' => 'Phobject', 6480 6740 'PhortuneController' => 'PhabricatorController', 6741 + 'PhortuneCreditCardForm' => 'Phobject', 6481 6742 'PhortuneCurrency' => 'Phobject', 6482 6743 'PhortuneCurrencySerializer' => 'PhabricatorLiskSerializer', 6483 6744 'PhortuneCurrencyTestCase' => 'PhabricatorTestCase', ··· 6517 6778 'PhortunePaymentMethodEditController' => 'PhortuneController', 6518 6779 'PhortunePaymentMethodPHIDType' => 'PhabricatorPHIDType', 6519 6780 'PhortunePaymentMethodQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 6781 + 'PhortunePaymentProvider' => 'Phobject', 6520 6782 'PhortunePaymentProviderConfig' => array( 6521 6783 'PhortuneDAO', 6522 6784 'PhabricatorPolicyInterface', ··· 6526 6788 'PhortunePaymentProviderConfigTransaction' => 'PhabricatorApplicationTransaction', 6527 6789 'PhortunePaymentProviderConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 6528 6790 'PhortunePaymentProviderPHIDType' => 'PhabricatorPHIDType', 6791 + 'PhortunePaymentProviderTestCase' => 'PhabricatorTestCase', 6529 6792 'PhortuneProduct' => array( 6530 6793 'PhortuneDAO', 6531 6794 'PhabricatorPolicyInterface', 6532 6795 ), 6796 + 'PhortuneProductImplementation' => 'Phobject', 6533 6797 'PhortuneProductListController' => 'PhabricatorController', 6534 6798 'PhortuneProductPHIDType' => 'PhabricatorPHIDType', 6535 6799 'PhortuneProductQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', ··· 6551 6815 ), 6552 6816 'PhortuneSubscriptionCart' => 'PhortuneCartImplementation', 6553 6817 'PhortuneSubscriptionEditController' => 'PhortuneController', 6818 + 'PhortuneSubscriptionImplementation' => 'Phobject', 6554 6819 'PhortuneSubscriptionListController' => 'PhortuneController', 6555 6820 'PhortuneSubscriptionPHIDType' => 'PhabricatorPHIDType', 6556 6821 'PhortuneSubscriptionProduct' => 'PhortuneProductImplementation', ··· 6626 6891 'PhrequentUserTimeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 6627 6892 'PhrictionChangeType' => 'PhrictionConstants', 6628 6893 'PhrictionConduitAPIMethod' => 'ConduitAPIMethod', 6894 + 'PhrictionConstants' => 'Phobject', 6629 6895 'PhrictionContent' => array( 6630 6896 'PhrictionDAO', 6631 6897 'PhabricatorMarkupInterface', ··· 6690 6956 'PonderAnswerTransaction' => 'PhabricatorApplicationTransaction', 6691 6957 'PonderAnswerTransactionComment' => 'PhabricatorApplicationTransactionComment', 6692 6958 'PonderAnswerTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 6959 + 'PonderConstants' => 'Phobject', 6693 6960 'PonderController' => 'PhabricatorController', 6694 6961 'PonderDAO' => 'PhabricatorLiskDAO', 6695 6962 'PonderEditor' => 'PhabricatorApplicationTransactionEditor', ··· 6733 7000 'PonderVotingUserHasAnswerEdgeType' => 'PhabricatorEdgeType', 6734 7001 'PonderVotingUserHasQuestionEdgeType' => 'PhabricatorEdgeType', 6735 7002 'ProjectAddProjectsEmailCommand' => 'MetaMTAEmailTransactionCommand', 7003 + 'ProjectBoardTaskCard' => 'Phobject', 6736 7004 'ProjectCanLockProjectsCapability' => 'PhabricatorPolicyCapability', 6737 7005 'ProjectConduitAPIMethod' => 'ConduitAPIMethod', 6738 7006 'ProjectCreateConduitAPIMethod' => 'ProjectConduitAPIMethod', ··· 6763 7031 'ReleephBranchPreviewView' => 'AphrontFormControl', 6764 7032 'ReleephBranchQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 6765 7033 'ReleephBranchSearchEngine' => 'PhabricatorApplicationSearchEngine', 7034 + 'ReleephBranchTemplate' => 'Phobject', 6766 7035 'ReleephBranchTransaction' => 'PhabricatorApplicationTransaction', 6767 7036 'ReleephBranchTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 6768 7037 'ReleephBranchViewController' => array( 6769 7038 'ReleephBranchController', 6770 7039 'PhabricatorApplicationSearchResultsControllerInterface', 6771 7040 ), 7041 + 'ReleephCommitFinder' => 'Phobject', 6772 7042 'ReleephCommitFinderException' => 'Exception', 6773 7043 'ReleephCommitMessageFieldSpecification' => 'ReleephFieldSpecification', 6774 7044 'ReleephConduitAPIMethod' => 'ConduitAPIMethod', ··· 6780 7050 'ReleephDiffMessageFieldSpecification' => 'ReleephFieldSpecification', 6781 7051 'ReleephDiffSizeFieldSpecification' => 'ReleephFieldSpecification', 6782 7052 'ReleephFieldParseException' => 'Exception', 7053 + 'ReleephFieldSelector' => 'Phobject', 6783 7054 'ReleephFieldSpecification' => array( 6784 7055 'PhabricatorCustomField', 6785 7056 'PhabricatorMarkupInterface', ··· 6830 7101 'ReleephRequestQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 6831 7102 'ReleephRequestReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 6832 7103 'ReleephRequestSearchEngine' => 'PhabricatorApplicationSearchEngine', 7104 + 'ReleephRequestStatus' => 'Phobject', 6833 7105 'ReleephRequestTransaction' => 'PhabricatorApplicationTransaction', 6834 7106 'ReleephRequestTransactionComment' => 'PhabricatorApplicationTransactionComment', 6835 7107 'ReleephRequestTransactionQuery' => 'PhabricatorApplicationTransactionQuery', ··· 6859 7131 'SlowvoteEmbedView' => 'AphrontView', 6860 7132 'SlowvoteInfoConduitAPIMethod' => 'SlowvoteConduitAPIMethod', 6861 7133 'SlowvoteRemarkupRule' => 'PhabricatorObjectRemarkupRule', 7134 + 'SubscriptionListDialogBuilder' => 'Phobject', 7135 + 'SubscriptionListStringBuilder' => 'Phobject', 6862 7136 'TokenConduitAPIMethod' => 'ConduitAPIMethod', 6863 7137 'TokenGiveConduitAPIMethod' => 'TokenConduitAPIMethod', 6864 7138 'TokenGivenConduitAPIMethod' => 'TokenConduitAPIMethod',
+2 -1
src/aphront/AphrontRequest.php
··· 5 5 * @task cookie Managing Cookies 6 6 * @task cluster Working With a Phabricator Cluster 7 7 */ 8 - final class AphrontRequest { 8 + final class AphrontRequest extends Phobject { 9 9 10 10 // NOTE: These magic request-type parameters are automatically included in 11 11 // certain requests (e.g., by phabricator_form(), JX.Request, ··· 27 27 private $user; 28 28 private $applicationConfiguration; 29 29 private $uriData; 30 + private $cookiePrefix; 30 31 31 32 public function __construct($host, $path) { 32 33 $this->host = $host;
+1 -1
src/aphront/AphrontURIMapper.php
··· 1 1 <?php 2 2 3 - final class AphrontURIMapper { 3 + final class AphrontURIMapper extends Phobject { 4 4 5 5 private $map; 6 6
+1 -1
src/aphront/configuration/AphrontApplicationConfiguration.php
··· 3 3 /** 4 4 * @task routing URI Routing 5 5 */ 6 - abstract class AphrontApplicationConfiguration { 6 + abstract class AphrontApplicationConfiguration extends Phobject { 7 7 8 8 private $request; 9 9 private $host;
+2
src/aphront/response/AphrontPlainTextResponse.php
··· 2 2 3 3 final class AphrontPlainTextResponse extends AphrontResponse { 4 4 5 + private $content; 6 + 5 7 public function setContent($content) { 6 8 $this->content = $content; 7 9 return $this;
+1 -1
src/aphront/response/AphrontResponse.php
··· 1 1 <?php 2 2 3 - abstract class AphrontResponse { 3 + abstract class AphrontResponse extends Phobject { 4 4 5 5 private $request; 6 6 private $cacheable = false;
+1 -1
src/aphront/sink/AphrontHTTPSink.php
··· 11 11 * @task write Writing Response Components 12 12 * @task emit Emitting the Response 13 13 */ 14 - abstract class AphrontHTTPSink { 14 + abstract class AphrontHTTPSink extends Phobject { 15 15 16 16 17 17 /* -( Writing Response Components )---------------------------------------- */
+10
src/applications/almanac/servicetype/__tests__/AlmanacServiceTypeTestCase.php
··· 1 + <?php 2 + 3 + final class AlmanacServiceTypeTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAllServiceTypes() { 6 + AlmanacServiceType::getAllServiceTypes(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/aphlict/query/AphlictDropdownDataQuery.php
··· 1 1 <?php 2 2 3 - final class AphlictDropdownDataQuery { 3 + final class AphlictDropdownDataQuery extends Phobject { 4 4 5 5 private $viewer; 6 6 private $notificationData;
+1 -1
src/applications/audit/constants/PhabricatorAuditActionConstants.php
··· 1 1 <?php 2 2 3 - final class PhabricatorAuditActionConstants { 3 + final class PhabricatorAuditActionConstants extends Phobject { 4 4 5 5 const CONCERN = 'concern'; 6 6 const ACCEPT = 'accept';
+1 -1
src/applications/audit/constants/PhabricatorAuditCommitStatusConstants.php
··· 1 1 <?php 2 2 3 - final class PhabricatorAuditCommitStatusConstants { 3 + final class PhabricatorAuditCommitStatusConstants extends Phobject { 4 4 5 5 const NONE = 0; 6 6 const NEEDS_AUDIT = 1;
+1 -1
src/applications/audit/constants/PhabricatorAuditStatusConstants.php
··· 1 1 <?php 2 2 3 - final class PhabricatorAuditStatusConstants { 3 + final class PhabricatorAuditStatusConstants extends Phobject { 4 4 5 5 const NONE = ''; 6 6 const AUDIT_NOT_REQUIRED = 'audit-not-required';
+1
src/applications/audit/storage/PhabricatorAuditInlineComment.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorAuditInlineComment 4 + extends Phobject 4 5 implements PhabricatorInlineCommentInterface { 5 6 6 7 private $proxy;
+1 -1
src/applications/auth/controller/PhabricatorAuthStartController.php
··· 71 71 'This Phabricator install is not configured with any enabled '. 72 72 'authentication providers which can be used to log in. If you '. 73 73 'have accidentally locked yourself out by disabling all providers, '. 74 - 'you can use `%s` to recover access to an administrative account.'. 74 + 'you can use `%s` to recover access to an administrative account.', 75 75 'phabricator/bin/auth recover <username>')); 76 76 } 77 77
+1 -1
src/applications/auth/data/PhabricatorAuthHighSecurityToken.php
··· 1 1 <?php 2 2 3 - final class PhabricatorAuthHighSecurityToken {} 3 + final class PhabricatorAuthHighSecurityToken extends Phobject {}
+10
src/applications/auth/factor/__tests__/PhabricatorAuthFactorTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorAuthFactorTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAllFactors() { 6 + PhabricatorAuthFactor::getAllFactors(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/auth/provider/PhabricatorAuthProvider.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorAuthProvider { 3 + abstract class PhabricatorAuthProvider extends Phobject { 4 4 5 5 private $providerConfig; 6 6
+31 -18
src/applications/base/PhabricatorApplication.php
··· 8 8 * @task fact Fact Integration 9 9 * @task meta Application Management 10 10 */ 11 - abstract class PhabricatorApplication implements PhabricatorPolicyInterface { 11 + abstract class PhabricatorApplication 12 + extends Phobject 13 + implements PhabricatorPolicyInterface { 12 14 13 15 const MAX_STATUS_ITEMS = 100; 14 16 ··· 17 19 const GROUP_ADMIN = 'admin'; 18 20 const GROUP_DEVELOPER = 'developer'; 19 21 20 - public static function getApplicationGroups() { 22 + final public static function getApplicationGroups() { 21 23 return array( 22 24 self::GROUP_CORE => pht('Core Applications'), 23 25 self::GROUP_UTILITIES => pht('Utilities'), ··· 35 37 return pht('%s Application', $this->getName()); 36 38 } 37 39 38 - public function isInstalled() { 40 + final public function isInstalled() { 39 41 if (!$this->canUninstall()) { 40 42 return true; 41 43 } ··· 133 135 return true; 134 136 } 135 137 136 - public function getPHID() { 138 + final public function getPHID() { 137 139 return 'PHID-APPS-'.get_class($this); 138 140 } 139 141 ··· 145 147 return null; 146 148 } 147 149 148 - public function getApplicationURI($path = '') { 150 + final public function getApplicationURI($path = '') { 149 151 return $this->getBaseURI().ltrim($path, '/'); 150 152 } 151 153 ··· 169 171 return null; 170 172 } 171 173 172 - public function getHelpMenuItems(PhabricatorUser $viewer) { 174 + final public function getHelpMenuItems(PhabricatorUser $viewer) { 173 175 $items = array(); 174 176 175 177 $articles = $this->getHelpDocumentationArticles($viewer); ··· 249 251 return false; 250 252 } 251 253 252 - protected function getInboundEmailSupportLink() { 254 + final protected function getInboundEmailSupportLink() { 253 255 return PhabricatorEnv::getDocLink('Configuring Inbound Email'); 254 256 } 255 257 ··· 286 288 * @return string 287 289 * @task ui 288 290 */ 289 - public static function formatStatusCount( 291 + final public static function formatStatusCount( 290 292 $count, 291 293 $limit_string = '%s', 292 294 $base_string = '%d') { ··· 359 361 /* -( Application Management )--------------------------------------------- */ 360 362 361 363 362 - public static function getByClass($class_name) { 364 + final public static function getByClass($class_name) { 363 365 $selected = null; 364 366 $applications = self::getAllApplications(); 365 367 ··· 377 379 return $selected; 378 380 } 379 381 380 - public static function getAllApplications() { 382 + final public static function getAllApplications() { 381 383 static $applications; 382 384 383 385 if ($applications === null) { ··· 401 403 return $applications; 402 404 } 403 405 404 - public static function getAllInstalledApplications() { 406 + final public static function getAllInstalledApplications() { 405 407 $all_applications = self::getAllApplications(); 406 408 $apps = array(); 407 409 foreach ($all_applications as $app) { ··· 426 428 * @return bool True if the class is installed. 427 429 * @task meta 428 430 */ 429 - public static function isClassInstalled($class) { 431 + final public static function isClassInstalled($class) { 430 432 return self::getByClass($class)->isInstalled(); 431 433 } 432 434 ··· 443 445 * @return bool True if the class is installed for the viewer. 444 446 * @task meta 445 447 */ 446 - public static function isClassInstalledForViewer( 448 + final public static function isClassInstalledForViewer( 447 449 $class, 448 450 PhabricatorUser $viewer) { 449 451 ··· 502 504 return array(); 503 505 } 504 506 505 - private function getCustomPolicySetting($capability) { 507 + final private function getCustomPolicySetting($capability) { 506 508 if (!$this->isCapabilityEditable($capability)) { 507 509 return null; 508 510 } ··· 528 530 } 529 531 530 532 531 - private function getCustomCapabilitySpecification($capability) { 533 + final private function getCustomCapabilitySpecification($capability) { 532 534 $custom = $this->getCustomCapabilities(); 533 535 if (!isset($custom[$capability])) { 534 536 throw new Exception(pht("Unknown capability '%s'!", $capability)); ··· 536 538 return $custom[$capability]; 537 539 } 538 540 539 - public function getCapabilityLabel($capability) { 541 + final public function getCapabilityLabel($capability) { 540 542 switch ($capability) { 541 543 case PhabricatorPolicyCapability::CAN_VIEW: 542 544 return pht('Can Use Application'); ··· 552 554 return null; 553 555 } 554 556 555 - public function isCapabilityEditable($capability) { 557 + final public function isCapabilityEditable($capability) { 556 558 switch ($capability) { 557 559 case PhabricatorPolicyCapability::CAN_VIEW: 558 560 return $this->canUninstall(); ··· 564 566 } 565 567 } 566 568 567 - public function getCapabilityCaption($capability) { 569 + final public function getCapabilityCaption($capability) { 568 570 switch ($capability) { 569 571 case PhabricatorPolicyCapability::CAN_VIEW: 570 572 if (!$this->canUninstall()) { ··· 580 582 $spec = $this->getCustomCapabilitySpecification($capability); 581 583 return idx($spec, 'caption'); 582 584 } 585 + } 586 + 587 + final public function getCapabilityTemplatePHIDType($capability) { 588 + switch ($capability) { 589 + case PhabricatorPolicyCapability::CAN_VIEW: 590 + case PhabricatorPolicyCapability::CAN_EDIT: 591 + return null; 592 + } 593 + 594 + $spec = $this->getCustomCapabilitySpecification($capability); 595 + return idx($spec, 'template'); 583 596 } 584 597 585 598 public function getApplicationSearchDocumentTypes() {
+10
src/applications/base/__tests__/PhabricatorApplicationTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorApplicationTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAllApplications() { 6 + PhabricatorApplication::getAllApplications(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/cache/PhabricatorCaches.php
··· 7 7 * @task setup Setup Cache 8 8 * @task compress Compression 9 9 */ 10 - final class PhabricatorCaches { 10 + final class PhabricatorCaches extends Phobject { 11 11 12 12 private static $requestCache; 13 13
+2 -3
src/applications/calendar/controller/PhabricatorCalendarEventEditController.php
··· 17 17 $viewer = $request->getViewer(); 18 18 $user_phid = $viewer->getPHID(); 19 19 $error_name = true; 20 - $error_recurrence_end_date = true; 20 + $error_recurrence_end_date = null; 21 21 $error_start_date = true; 22 22 $error_end_date = true; 23 23 $validation_exception = null; ··· 336 336 ->setID($recurrence_end_date_id) 337 337 ->setIsTimeDisabled(true) 338 338 ->setIsDisabled($recurrence_end_date_value->isDisabled()) 339 - ->setAllowNull(true) 340 - ->isRequired(false); 339 + ->setAllowNull(true); 341 340 342 341 $recurrence_frequency_select = id(new AphrontFormSelectControl()) 343 342 ->setName('frequency')
+1 -1
src/applications/calendar/storage/PhabricatorCalendarEvent.php
··· 316 316 case 'monthly': 317 317 return 'month'; 318 318 case 'yearly': 319 - return 'yearly'; 319 + return 'year'; 320 320 default: 321 321 return 'day'; 322 322 }
+1 -1
src/applications/calendar/util/CalendarTimeUtil.php
··· 10 10 * a Sunday -> Saturday list, whilest the profile view shows a more simple 11 11 * seven day rolling list of events. 12 12 */ 13 - final class CalendarTimeUtil { 13 + final class CalendarTimeUtil extends Phobject { 14 14 15 15 public static function getCalendarEventEpochs( 16 16 PhabricatorUser $user,
+1 -1
src/applications/celerity/CelerityAPI.php
··· 4 4 * Indirection layer which provisions for a terrifying future where we need to 5 5 * build multiple resource responses per page. 6 6 */ 7 - final class CelerityAPI { 7 + final class CelerityAPI extends Phobject { 8 8 9 9 private static $response; 10 10
+2 -1
src/applications/celerity/CelerityResourceMap.php
··· 6 6 * not need to invoke it directly; instead, you call higher-level Celerity APIs 7 7 * and it uses the resource map to satisfy your requests. 8 8 */ 9 - final class CelerityResourceMap { 9 + final class CelerityResourceMap extends Phobject { 10 10 11 11 private static $instances = array(); 12 12 ··· 16 16 private $packageMap; 17 17 private $nameMap; 18 18 private $hashMap; 19 + private $componentMap; 19 20 20 21 public function __construct(CelerityResources $resources) { 21 22 $this->resources = $resources;
+1 -1
src/applications/celerity/CelerityResourceMapGenerator.php
··· 1 1 <?php 2 2 3 - final class CelerityResourceMapGenerator { 3 + final class CelerityResourceMapGenerator extends Phobject { 4 4 5 5 private $debug = false; 6 6 private $resources;
+1 -1
src/applications/celerity/CelerityResourceTransformer.php
··· 1 1 <?php 2 2 3 - final class CelerityResourceTransformer { 3 + final class CelerityResourceTransformer extends Phobject { 4 4 5 5 private $minify; 6 6 private $rawURIMap;
+1 -1
src/applications/celerity/CeleritySpriteGenerator.php
··· 1 1 <?php 2 2 3 - final class CeleritySpriteGenerator { 3 + final class CeleritySpriteGenerator extends Phobject { 4 4 5 5 public function buildMenuSheet() { 6 6 $sprites = array();
+1 -1
src/applications/celerity/CelerityStaticResourceResponse.php
··· 5 5 * @{function:require_celerity_resource}, and then builds appropriate HTML or 6 6 * Ajax responses. 7 7 */ 8 - final class CelerityStaticResourceResponse { 8 + final class CelerityStaticResourceResponse extends Phobject { 9 9 10 10 private $symbols = array(); 11 11 private $needsResolve = true;
+1
src/applications/celerity/resources/CelerityPhysicalResources.php
··· 21 21 22 22 public static function getAll() { 23 23 static $resources_map; 24 + 24 25 if ($resources_map === null) { 25 26 $resources_map = array(); 26 27
+1 -1
src/applications/celerity/resources/CelerityResources.php
··· 3 3 /** 4 4 * Defines the location of static resources. 5 5 */ 6 - abstract class CelerityResources { 6 + abstract class CelerityResources extends Phobject { 7 7 8 8 private $map; 9 9
+10
src/applications/celerity/resources/__tests__/CelerityPhysicalResourcesTestCase.php
··· 1 + <?php 2 + 3 + final class CelerityPhysicalResourcesTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAll() { 6 + CelerityPhysicalResources::getAll(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+2 -1
src/applications/conduit/call/ConduitCall.php
··· 8 8 * $result = $call->execute(); 9 9 * 10 10 */ 11 - final class ConduitCall { 11 + final class ConduitCall extends Phobject { 12 12 13 13 private $method; 14 + private $handler; 14 15 private $request; 15 16 private $user; 16 17
+6 -1
src/applications/conduit/method/ConduitAPIMethod.php
··· 115 115 return head(explode('.', $this->getAPIMethodName(), 2)); 116 116 } 117 117 118 - public static function getConduitMethod($method_name) { 118 + public static function loadAllConduitMethods() { 119 119 static $method_map = null; 120 120 121 121 if ($method_map === null) { ··· 143 143 } 144 144 } 145 145 146 + return $method_map; 147 + } 148 + 149 + public static function getConduitMethod($method_name) { 150 + $method_map = self::loadAllConduitMethods(); 146 151 return idx($method_map, $method_name); 147 152 } 148 153
+10
src/applications/conduit/method/__tests__/ConduitAPIMethodTestCase.php
··· 1 + <?php 2 + 3 + final class ConduitAPIMethodTestCase extends PhabricatorTestCase { 4 + 5 + public function testLoadAllConduitMethods() { 6 + ConduitAPIMethod::loadAllConduitMethods(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/conduit/protocol/ConduitAPIRequest.php
··· 1 1 <?php 2 2 3 - final class ConduitAPIRequest { 3 + final class ConduitAPIRequest extends Phobject { 4 4 5 5 protected $params; 6 6 private $user;
+1 -1
src/applications/conduit/protocol/ConduitAPIResponse.php
··· 1 1 <?php 2 2 3 - final class ConduitAPIResponse { 3 + final class ConduitAPIResponse extends Phobject { 4 4 5 5 private $result; 6 6 private $errorCode;
+7 -3
src/applications/config/check/PhabricatorSetupCheck.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorSetupCheck { 3 + abstract class PhabricatorSetupCheck extends Phobject { 4 4 5 5 private $issues; 6 6 ··· 111 111 } 112 112 } 113 113 114 - final public static function runAllChecks() { 114 + final public static function loadAllChecks() { 115 115 $symbols = id(new PhutilSymbolLoader()) 116 116 ->setAncestorClass(__CLASS__) 117 117 ->setConcreteOnly(true) ··· 122 122 $checks[] = newv($symbol['name'], array()); 123 123 } 124 124 125 - $checks = msort($checks, 'getExecutionOrder'); 125 + return msort($checks, 'getExecutionOrder'); 126 + } 127 + 128 + final public static function runAllChecks() { 129 + $checks = self::loadAllChecks(); 126 130 127 131 $issues = array(); 128 132 foreach ($checks as $check) {
+10
src/applications/config/check/__tests__/PhabricatorSetupCheckTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorSetupCheckTestCase extends PhabricatorTestCase { 4 + 5 + public function testLoadAllChecks() { 6 + PhabricatorSetupCheck::loadAllChecks(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/config/custom/PhabricatorConfigOptionType.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorConfigOptionType { 3 + abstract class PhabricatorConfigOptionType extends Phobject { 4 4 5 5 public function validateOption(PhabricatorConfigOption $option, $value) { 6 6 return;
+1 -1
src/applications/config/issue/PhabricatorSetupIssue.php
··· 1 1 <?php 2 2 3 - final class PhabricatorSetupIssue { 3 + final class PhabricatorSetupIssue extends Phobject { 4 4 5 5 private $issueKey; 6 6 private $name;
+1 -1
src/applications/config/json/PhabricatorConfigJSON.php
··· 1 1 <?php 2 2 3 - final class PhabricatorConfigJSON { 3 + final class PhabricatorConfigJSON extends Phobject { 4 4 /** 5 5 * Properly format a JSON value. 6 6 *
+1 -1
src/applications/conpherence/ConpherenceTransactionRenderer.php
··· 1 1 <?php 2 2 3 - final class ConpherenceTransactionRenderer { 3 + final class ConpherenceTransactionRenderer extends Phobject { 4 4 5 5 public static function renderTransactions( 6 6 PhabricatorUser $user,
+1 -1
src/applications/conpherence/constants/ConpherenceConstants.php
··· 1 1 <?php 2 2 3 - abstract class ConpherenceConstants {} 3 + abstract class ConpherenceConstants extends Phobject {}
+42
src/applications/conpherence/policyrule/ConpherenceThreadMembersPolicyRule.php
··· 1 + <?php 2 + 3 + final class ConpherenceThreadMembersPolicyRule 4 + extends PhabricatorPolicyRule { 5 + 6 + public function getObjectPolicyKey() { 7 + return 'conpherence.members'; 8 + } 9 + 10 + public function getObjectPolicyName() { 11 + return pht('Thread Members'); 12 + } 13 + 14 + public function getPolicyExplanation() { 15 + return pht('Members of this thread can take this action.'); 16 + } 17 + 18 + public function getRuleDescription() { 19 + return pht('thread members'); 20 + } 21 + 22 + public function canApplyToObject(PhabricatorPolicyInterface $object) { 23 + return ($object instanceof ConpherenceThread); 24 + } 25 + 26 + public function applyRule( 27 + PhabricatorUser $viewer, 28 + $value, 29 + PhabricatorPolicyInterface $object) { 30 + $viewer_phid = $viewer->getPHID(); 31 + if (!$viewer_phid) { 32 + return false; 33 + } 34 + 35 + return (bool)$object->getParticipantIfExists($viewer_phid); 36 + } 37 + 38 + public function getValueControlType() { 39 + return self::CONTROL_TYPE_NONE; 40 + } 41 + 42 + }
+1 -1
src/applications/console/core/DarkConsoleCore.php
··· 1 1 <?php 2 2 3 - final class DarkConsoleCore { 3 + final class DarkConsoleCore extends Phobject { 4 4 5 5 private $plugins = array(); 6 6 const STORAGE_VERSION = 1;
+1 -1
src/applications/console/plugin/DarkConsolePlugin.php
··· 1 1 <?php 2 2 3 - abstract class DarkConsolePlugin { 3 + abstract class DarkConsolePlugin extends Phobject { 4 4 5 5 private $data; 6 6 private $request;
+1 -1
src/applications/console/plugin/errorlog/DarkConsoleErrorLogPluginAPI.php
··· 1 1 <?php 2 2 3 - final class DarkConsoleErrorLogPluginAPI { 3 + final class DarkConsoleErrorLogPluginAPI extends Phobject { 4 4 5 5 private static $errors = array(); 6 6
+1 -1
src/applications/console/plugin/xhprof/DarkConsoleXHProfPluginAPI.php
··· 4 4 * @phutil-external-symbol function xhprof_enable 5 5 * @phutil-external-symbol function xhprof_disable 6 6 */ 7 - final class DarkConsoleXHProfPluginAPI { 7 + final class DarkConsoleXHProfPluginAPI extends Phobject { 8 8 9 9 private static $profilerStarted; 10 10 private static $profilerRunning;
+1
src/applications/countdown/application/PhabricatorCountdownApplication.php
··· 52 52 return array( 53 53 PhabricatorCountdownDefaultViewCapability::CAPABILITY => array( 54 54 'caption' => pht('Default view policy for new countdowns.'), 55 + 'template' => PhabricatorCountdownCountdownPHIDType::TYPECONST, 55 56 ), 56 57 ); 57 58 }
+1 -1
src/applications/dashboard/layoutconfig/PhabricatorDashboardLayoutConfig.php
··· 1 1 <?php 2 2 3 - final class PhabricatorDashboardLayoutConfig { 3 + final class PhabricatorDashboardLayoutConfig extends Phobject { 4 4 5 5 const MODE_FULL = 'layout-mode-full'; 6 6 const MODE_HALF_AND_HALF = 'layout-mode-half-and-half';
+1 -1
src/applications/differential/DifferentialGetWorkingCopy.php
··· 4 4 * Can't find a good place for this, so I'm putting it in the most notably 5 5 * wrong place. 6 6 */ 7 - final class DifferentialGetWorkingCopy { 7 + final class DifferentialGetWorkingCopy extends Phobject { 8 8 9 9 /** 10 10 * Creates and/or cleans a workspace for the requested repo.
+1
src/applications/differential/application/PhabricatorDifferentialApplication.php
··· 186 186 return array( 187 187 DifferentialDefaultViewCapability::CAPABILITY => array( 188 188 'caption' => pht('Default view policy for newly created revisions.'), 189 + 'template' => DifferentialRevisionPHIDType::TYPECONST, 189 190 ), 190 191 ); 191 192 }
+1 -1
src/applications/differential/constants/DifferentialAction.php
··· 1 1 <?php 2 2 3 - final class DifferentialAction { 3 + final class DifferentialAction extends Phobject { 4 4 5 5 const ACTION_CLOSE = 'commit'; 6 6 const ACTION_COMMENT = 'none';
+1 -1
src/applications/differential/constants/DifferentialChangeType.php
··· 1 1 <?php 2 2 3 - final class DifferentialChangeType { 3 + final class DifferentialChangeType extends Phobject { 4 4 5 5 const TYPE_ADD = 1; 6 6 const TYPE_CHANGE = 2;
+1 -1
src/applications/differential/constants/DifferentialLintStatus.php
··· 1 1 <?php 2 2 3 - final class DifferentialLintStatus { 3 + final class DifferentialLintStatus extends Phobject { 4 4 5 5 const LINT_NONE = 0; 6 6 const LINT_OKAY = 1;
+1 -1
src/applications/differential/constants/DifferentialReviewerStatus.php
··· 1 1 <?php 2 2 3 - final class DifferentialReviewerStatus { 3 + final class DifferentialReviewerStatus extends Phobject { 4 4 5 5 const STATUS_BLOCKING = 'blocking'; 6 6 const STATUS_ADDED = 'added';
+1 -1
src/applications/differential/constants/DifferentialRevisionControlSystem.php
··· 1 1 <?php 2 2 3 3 // TODO: Unify with similar Repository constants 4 - final class DifferentialRevisionControlSystem { 4 + final class DifferentialRevisionControlSystem extends Phobject { 5 5 6 6 const SVN = 'svn'; 7 7 const GIT = 'git';
+1 -1
src/applications/differential/constants/DifferentialRevisionStatus.php
··· 6 6 * application. 7 7 */ 8 8 9 - final class DifferentialRevisionStatus { 9 + final class DifferentialRevisionStatus extends Phobject { 10 10 11 11 const COLOR_STATUS_DEFAULT = 'status'; 12 12 const COLOR_STATUS_DARK = 'status-dark';
+1 -1
src/applications/differential/constants/DifferentialUnitStatus.php
··· 1 1 <?php 2 2 3 - final class DifferentialUnitStatus { 3 + final class DifferentialUnitStatus extends Phobject { 4 4 5 5 const UNIT_NONE = 0; 6 6 const UNIT_OKAY = 1;
+1 -1
src/applications/differential/constants/DifferentialUnitTestResult.php
··· 1 1 <?php 2 2 3 - final class DifferentialUnitTestResult { 3 + final class DifferentialUnitTestResult extends Phobject { 4 4 5 5 const RESULT_PASS = 'pass'; 6 6 const RESULT_FAIL = 'fail';
+1 -1
src/applications/differential/landing/DifferentialLandingStrategy.php
··· 1 1 <?php 2 2 3 - abstract class DifferentialLandingStrategy { 3 + abstract class DifferentialLandingStrategy extends Phobject { 4 4 5 5 abstract public function processLandRequest( 6 6 AphrontRequest $request,
-2
src/applications/differential/management/PhabricatorHunksManagementMigrateWorkflow.php
··· 48 48 new PhutilNumber($diff_len), 49 49 sprintf('%.1f%%', 100 * ($diff_len / $old_len)))); 50 50 } 51 - 52 - break; 53 51 } 54 52 55 53 if ($saw_any_rows) {
+3 -1
src/applications/differential/parser/DifferentialChangesetParser.php
··· 1 1 <?php 2 2 3 - final class DifferentialChangesetParser { 3 + final class DifferentialChangesetParser extends Phobject { 4 4 5 5 const HIGHLIGHT_BYTE_LIMIT = 262144; 6 6 ··· 54 54 private $rangeStart; 55 55 private $rangeEnd; 56 56 private $mask; 57 + 58 + private $highlightEngine; 57 59 58 60 public function setRange($start, $end) { 59 61 $this->rangeStart = $start;
+1 -1
src/applications/differential/parser/DifferentialCommitMessageParser.php
··· 19 19 * @task support Support Methods 20 20 * @task internal Internals 21 21 */ 22 - final class DifferentialCommitMessageParser { 22 + final class DifferentialCommitMessageParser extends Phobject { 23 23 24 24 private $labelMap; 25 25 private $titleKey;
+1 -1
src/applications/differential/parser/DifferentialHunkParser.php
··· 1 1 <?php 2 2 3 - final class DifferentialHunkParser { 3 + final class DifferentialHunkParser extends Phobject { 4 4 5 5 private $oldLines; 6 6 private $newLines;
+1 -1
src/applications/differential/render/DifferentialChangesetRenderer.php
··· 1 1 <?php 2 2 3 - abstract class DifferentialChangesetRenderer { 3 + abstract class DifferentialChangesetRenderer extends Phobject { 4 4 5 5 private $user; 6 6 private $changeset;
+2 -1
src/applications/differential/render/DifferentialRawDiffRenderer.php
··· 1 1 <?php 2 - final class DifferentialRawDiffRenderer { 2 + 3 + final class DifferentialRawDiffRenderer extends Phobject { 3 4 4 5 private $changesets; 5 6 private $format = 'unified';
+1
src/applications/differential/storage/DifferentialInlineComment.php
··· 1 1 <?php 2 2 3 3 final class DifferentialInlineComment 4 + extends Phobject 4 5 implements PhabricatorInlineCommentInterface { 5 6 6 7 private $proxy;
+1 -1
src/applications/differential/storage/DifferentialReviewer.php
··· 1 1 <?php 2 2 3 - final class DifferentialReviewer { 3 + final class DifferentialReviewer extends Phobject { 4 4 5 5 private $reviewerPHID; 6 6 private $status;
+1 -1
src/applications/differential/view/DifferentialChangesetFileTreeSideNavBuilder.php
··· 1 1 <?php 2 2 3 - final class DifferentialChangesetFileTreeSideNavBuilder { 3 + final class DifferentialChangesetFileTreeSideNavBuilder extends Phobject { 4 4 5 5 private $title; 6 6 private $baseURI;
+1 -1
src/applications/diffusion/DiffusionLintSaveRunner.php
··· 1 1 <?php 2 2 3 - final class DiffusionLintSaveRunner { 3 + final class DiffusionLintSaveRunner extends Phobject { 4 4 private $arc = 'arc'; 5 5 private $severity = ArcanistLintSeverity::SEVERITY_ADVICE; 6 6 private $all = false;
+7 -2
src/applications/diffusion/application/PhabricatorDiffusionApplication.php
··· 140 140 141 141 protected function getCustomCapabilities() { 142 142 return array( 143 - DiffusionDefaultViewCapability::CAPABILITY => array(), 143 + DiffusionDefaultViewCapability::CAPABILITY => array( 144 + 'template' => PhabricatorRepositoryRepositoryPHIDType::TYPECONST, 145 + ), 144 146 DiffusionDefaultEditCapability::CAPABILITY => array( 145 147 'default' => PhabricatorPolicies::POLICY_ADMIN, 148 + 'template' => PhabricatorRepositoryRepositoryPHIDType::TYPECONST, 146 149 ), 147 - DiffusionDefaultPushCapability::CAPABILITY => array(), 150 + DiffusionDefaultPushCapability::CAPABILITY => array( 151 + 'template' => PhabricatorRepositoryRepositoryPHIDType::TYPECONST, 152 + ), 148 153 DiffusionCreateRepositoriesCapability::CAPABILITY => array( 149 154 'default' => PhabricatorPolicies::POLICY_ADMIN, 150 155 ),
+6 -6
src/applications/diffusion/controller/DiffusionRepositoryCreateController.php
··· 591 591 if ($this->isSSHProtocol($proto)) { 592 592 $c_credential->setLabel(pht('SSH Key')); 593 593 $c_credential->setCredentialType( 594 - PassphraseCredentialTypeSSHPrivateKeyText::CREDENTIAL_TYPE); 595 - $provides_type = PassphraseCredentialTypeSSHPrivateKey::PROVIDES_TYPE; 594 + PassphraseSSHPrivateKeyTextCredentialType::CREDENTIAL_TYPE); 595 + $provides_type = PassphraseSSHPrivateKeyCredentialType::PROVIDES_TYPE; 596 596 597 597 $page->addRemarkupInstructions( 598 598 pht( ··· 607 607 $c_credential->setLabel(pht('Password')); 608 608 $c_credential->setAllowNull(true); 609 609 $c_credential->setCredentialType( 610 - PassphraseCredentialTypePassword::CREDENTIAL_TYPE); 611 - $provides_type = PassphraseCredentialTypePassword::PROVIDES_TYPE; 610 + PassphrasePasswordCredentialType::CREDENTIAL_TYPE); 611 + $provides_type = PassphrasePasswordCredentialType::PROVIDES_TYPE; 612 612 613 613 $page->addRemarkupInstructions( 614 614 pht( ··· 663 663 pht('You must choose an SSH credential to connect over SSH.')); 664 664 } 665 665 666 - $ssh_type = PassphraseCredentialTypeSSHPrivateKey::PROVIDES_TYPE; 666 + $ssh_type = PassphraseSSHPrivateKeyCredentialType::PROVIDES_TYPE; 667 667 if ($credential->getProvidesType() !== $ssh_type) { 668 668 $c_credential->setError(pht('Invalid')); 669 669 $page->addPageError( ··· 674 674 675 675 } else if ($this->isUsernamePasswordProtocol($proto)) { 676 676 if ($credential) { 677 - $password_type = PassphraseCredentialTypePassword::PROVIDES_TYPE; 677 + $password_type = PassphrasePasswordCredentialType::PROVIDES_TYPE; 678 678 if ($credential->getProvidesType() !== $password_type) { 679 679 $c_credential->setError(pht('Invalid')); 680 680 $page->addPageError(
+1 -1
src/applications/diffusion/data/DiffusionBrowseResultSet.php
··· 1 1 <?php 2 2 3 - final class DiffusionBrowseResultSet { 3 + final class DiffusionBrowseResultSet extends Phobject { 4 4 5 5 const REASON_IS_FILE = 'is-file'; 6 6 const REASON_IS_DELETED = 'is-deleted';
+1 -1
src/applications/diffusion/data/DiffusionFileContent.php
··· 1 1 <?php 2 2 3 - final class DiffusionFileContent { 3 + final class DiffusionFileContent extends Phobject { 4 4 5 5 private $corpus; 6 6 private $blameDict;
+1 -1
src/applications/diffusion/data/DiffusionGitBranch.php
··· 1 1 <?php 2 2 3 - final class DiffusionGitBranch { 3 + final class DiffusionGitBranch extends Phobject { 4 4 5 5 const DEFAULT_GIT_REMOTE = 'origin'; 6 6
+1 -1
src/applications/diffusion/data/DiffusionPathChange.php
··· 1 1 <?php 2 2 3 - final class DiffusionPathChange { 3 + final class DiffusionPathChange extends Phobject { 4 4 5 5 private $path; 6 6 private $commitIdentifier;
+1 -1
src/applications/diffusion/data/DiffusionRepositoryPath.php
··· 1 1 <?php 2 2 3 - final class DiffusionRepositoryPath { 3 + final class DiffusionRepositoryPath extends Phobject { 4 4 5 5 private $fullPath; 6 6 private $path;
+1 -1
src/applications/diffusion/data/DiffusionRepositoryTag.php
··· 1 1 <?php 2 2 3 - final class DiffusionRepositoryTag { 3 + final class DiffusionRepositoryTag extends Phobject { 4 4 5 5 private $author; 6 6 private $epoch;
+1 -1
src/applications/diffusion/protocol/DiffusionMercurialWireProtocol.php
··· 1 1 <?php 2 2 3 - final class DiffusionMercurialWireProtocol { 3 + final class DiffusionMercurialWireProtocol extends Phobject { 4 4 5 5 public static function getCommandArgs($command) { 6 6 // We need to enumerate all of the Mercurial wire commands because the
+1
src/applications/diffusion/query/DiffusionCommitQuery.php
··· 193 193 if ($repo) { 194 194 $commit->attachRepository($repo); 195 195 } else { 196 + $this->didRejectResult($commit); 196 197 unset($commits[$key]); 197 198 continue; 198 199 }
+1 -1
src/applications/diffusion/query/DiffusionPathQuery.php
··· 1 1 <?php 2 2 3 - final class DiffusionPathQuery { 3 + final class DiffusionPathQuery extends Phobject { 4 4 5 5 private $pathIDs; 6 6
+1 -1
src/applications/diffusion/query/DiffusionRenameHistoryQuery.php
··· 1 1 <?php 2 2 3 - final class DiffusionRenameHistoryQuery { 3 + final class DiffusionRenameHistoryQuery extends Phobject { 4 4 5 5 private $oldCommit; 6 6 private $wasCreated;
+1 -1
src/applications/diffusion/query/pathchange/DiffusionPathChangeQuery.php
··· 1 1 <?php 2 2 3 - final class DiffusionPathChangeQuery { 3 + final class DiffusionPathChangeQuery extends Phobject { 4 4 5 5 private $request; 6 6 private $limit;
+3 -1
src/applications/diffusion/query/pathid/DiffusionPathIDQuery.php
··· 3 3 /** 4 4 * @task pathutil Path Utilities 5 5 */ 6 - final class DiffusionPathIDQuery { 6 + final class DiffusionPathIDQuery extends Phobject { 7 + 8 + private $paths = array(); 7 9 8 10 public function __construct(array $paths) { 9 11 $this->paths = $paths;
+1 -1
src/applications/diffusion/request/DiffusionRequest.php
··· 7 7 * @task new Creating Requests 8 8 * @task uri Managing Diffusion URIs 9 9 */ 10 - abstract class DiffusionRequest { 10 + abstract class DiffusionRequest extends Phobject { 11 11 12 12 protected $callsign; 13 13 protected $path;
-1
src/applications/diffusion/ssh/DiffusionSubversionServeSSHWorkflow.php
··· 4 4 * This protocol has a good spec here: 5 5 * 6 6 * http://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_ra_svn/protocol 7 - * 8 7 */ 9 8 final class DiffusionSubversionServeSSHWorkflow 10 9 extends DiffusionSubversionSSHWorkflow {
+1 -1
src/applications/diffusion/symbol/DiffusionExternalSymbolQuery.php
··· 1 1 <?php 2 2 3 - final class DiffusionExternalSymbolQuery { 3 + final class DiffusionExternalSymbolQuery extends Phobject { 4 4 private $languages = array(); 5 5 private $types = array(); 6 6 private $names = array();
+1 -1
src/applications/diffusion/symbol/DiffusionExternalSymbolsSource.php
··· 1 1 <?php 2 2 3 - abstract class DiffusionExternalSymbolsSource { 3 + abstract class DiffusionExternalSymbolsSource extends Phobject { 4 4 5 5 /** 6 6 * @return list of PhabricatorRepositorySymbol
+1 -1
src/applications/diviner/atom/DivinerAtom.php
··· 1 1 <?php 2 2 3 - final class DivinerAtom { 3 + final class DivinerAtom extends Phobject { 4 4 5 5 const TYPE_ARTICLE = 'article'; 6 6 const TYPE_CLASS = 'class';
+1 -1
src/applications/diviner/atom/DivinerAtomRef.php
··· 1 1 <?php 2 2 3 - final class DivinerAtomRef { 3 + final class DivinerAtomRef extends Phobject { 4 4 5 5 private $book; 6 6 private $context;
+1 -1
src/applications/diviner/atomizer/DivinerAtomizer.php
··· 3 3 /** 4 4 * Generate @{class:DivinerAtom}s from source code. 5 5 */ 6 - abstract class DivinerAtomizer { 6 + abstract class DivinerAtomizer extends Phobject { 7 7 8 8 private $book; 9 9 private $fileName;
+1 -1
src/applications/diviner/cache/DivinerDiskCache.php
··· 1 1 <?php 2 2 3 - abstract class DivinerDiskCache { 3 + abstract class DivinerDiskCache extends Phobject { 4 4 5 5 private $cache; 6 6
+1 -1
src/applications/diviner/publisher/DivinerLivePublisher.php
··· 12 12 if (!$book) { 13 13 $book = id(new DivinerLiveBook()) 14 14 ->setName($book_name) 15 - ->setViewPolicy(PhabricatorPolicies::POLICY_USER) 15 + ->setViewPolicy(PhabricatorPolicies::getMostOpenPolicy()) 16 16 ->save(); 17 17 } 18 18
+1 -1
src/applications/diviner/publisher/DivinerPublisher.php
··· 1 1 <?php 2 2 3 - abstract class DivinerPublisher { 3 + abstract class DivinerPublisher extends Phobject { 4 4 5 5 private $atomCache; 6 6 private $atomGraphHashToNodeHashMap;
+1 -1
src/applications/diviner/renderer/DivinerRenderer.php
··· 1 1 <?php 2 2 3 - abstract class DivinerRenderer { 3 + abstract class DivinerRenderer extends Phobject { 4 4 5 5 private $publisher; 6 6 private $atomStack = array();
+1 -1
src/applications/doorkeeper/engine/DoorkeeperFeedStoryPublisher.php
··· 3 3 /** 4 4 * @task config Configuration 5 5 */ 6 - abstract class DoorkeeperFeedStoryPublisher { 6 + abstract class DoorkeeperFeedStoryPublisher extends Phobject { 7 7 8 8 private $feedStory; 9 9 private $viewer;
+4 -1
src/applications/drydock/application/PhabricatorDrydockApplication.php
··· 72 72 73 73 protected function getCustomCapabilities() { 74 74 return array( 75 - DrydockDefaultViewCapability::CAPABILITY => array(), 75 + DrydockDefaultViewCapability::CAPABILITY => array( 76 + 'template' => DrydockBlueprintPHIDType::TYPECONST, 77 + ), 76 78 DrydockDefaultEditCapability::CAPABILITY => array( 77 79 'default' => PhabricatorPolicies::POLICY_ADMIN, 80 + 'template' => DrydockBlueprintPHIDType::TYPECONST, 78 81 ), 79 82 DrydockCreateBlueprintsCapability::CAPABILITY => array( 80 83 'default' => PhabricatorPolicies::POLICY_ADMIN,
+1 -1
src/applications/drydock/blueprint/DrydockBlueprintImplementation.php
··· 5 5 * @task resource Resource Allocation 6 6 * @task log Logging 7 7 */ 8 - abstract class DrydockBlueprintImplementation { 8 + abstract class DrydockBlueprintImplementation extends Phobject { 9 9 10 10 private $activeResource; 11 11 private $activeLease;
+10
src/applications/drydock/blueprint/__tests__/DrydockBlueprintImplementationTestCase.php
··· 1 + <?php 2 + 3 + final class DrydockBlueprintImplementationTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAllBlueprintImplementations() { 6 + DrydockBlueprintImplementation::getAllBlueprintImplementations(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/drydock/constants/DrydockConstants.php
··· 1 1 <?php 2 2 3 - abstract class DrydockConstants {} 3 + abstract class DrydockConstants extends Phobject {}
+1 -1
src/applications/drydock/interface/DrydockInterface.php
··· 1 1 <?php 2 2 3 - abstract class DrydockInterface { 3 + abstract class DrydockInterface extends Phobject { 4 4 5 5 private $config; 6 6
+1 -1
src/applications/drydock/interface/command/DrydockSSHCommandInterface.php
··· 24 24 } 25 25 26 26 if ($credential->getProvidesType() !== 27 - PassphraseCredentialTypeSSHPrivateKey::PROVIDES_TYPE) { 27 + PassphraseSSHPrivateKeyCredentialType::PROVIDES_TYPE) { 28 28 throw new Exception(pht('Only private key credentials are supported.')); 29 29 } 30 30
+1 -1
src/applications/drydock/interface/filesystem/DrydockSFTPFilesystemInterface.php
··· 16 16 ->executeOne(); 17 17 18 18 if ($credential->getProvidesType() !== 19 - PassphraseCredentialTypeSSHPrivateKey::PROVIDES_TYPE) { 19 + PassphraseSSHPrivateKeyCredentialType::PROVIDES_TYPE) { 20 20 throw new Exception(pht('Only private key credentials are supported.')); 21 21 } 22 22
+3 -1
src/applications/drydock/util/DrydockBlueprintScopeGuard.php
··· 1 1 <?php 2 2 3 - final class DrydockBlueprintScopeGuard { 3 + final class DrydockBlueprintScopeGuard extends Phobject { 4 + 5 + private $blueprint; 4 6 5 7 public function __construct(DrydockBlueprintImplementation $blueprint) { 6 8 $this->blueprint = $blueprint;
+1 -1
src/applications/fact/engine/PhabricatorFactEngine.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorFactEngine { 3 + abstract class PhabricatorFactEngine extends Phobject { 4 4 5 5 final public static function loadAllEngines() { 6 6 $classes = id(new PhutilSymbolLoader())
+10
src/applications/fact/engine/__tests__/PhabricatorFactEngineTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorFactEngineTestCase extends PhabricatorTestCase { 4 + 5 + public function testLoadAllEngines() { 6 + PhabricatorFactEngine::loadAllEngines(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/fact/spec/PhabricatorFactSpec.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorFactSpec { 3 + abstract class PhabricatorFactSpec extends Phobject { 4 4 5 5 const UNIT_COUNT = 'unit-count'; 6 6 const UNIT_EPOCH = 'unit-epoch';
+1 -1
src/applications/feed/PhabricatorFeedStoryPublisher.php
··· 1 1 <?php 2 2 3 - final class PhabricatorFeedStoryPublisher { 3 + final class PhabricatorFeedStoryPublisher extends Phobject { 4 4 5 5 private $relatedPHIDs; 6 6 private $storyType;
+2 -1
src/applications/feed/builder/PhabricatorFeedBuilder.php
··· 1 1 <?php 2 2 3 - final class PhabricatorFeedBuilder { 3 + final class PhabricatorFeedBuilder extends Phobject { 4 4 5 + private $user; 5 6 private $stories; 6 7 private $framed; 7 8 private $hovercards = false;
+12 -10
src/applications/feed/config/PhabricatorFeedConfigOptions.php
··· 36 36 "public, and a login is not required to view them! This is ". 37 37 "intended for things like open source projects that want to ". 38 38 "expose an activity feed on the project homepage.\n\n". 39 - "NOTE: You must also set `policy.allow-public` to true for this ". 40 - "setting to work properly.")), 39 + "NOTE: You must also set `%s` to true for this ". 40 + "setting to work properly.", 41 + 'policy.allow-public')), 41 42 $this->newOption('feed.http-hooks', 'list<string>', array()) 42 43 ->setLocked(true) 43 44 ->setSummary(pht('POST notifications of feed events.')) 44 45 ->setDescription( 45 46 pht( 46 - "If you set this to a list of http URIs, when a feed story is ". 47 - "published a task will be created for each uri that posts the ". 48 - "story data to the uri. Daemons automagically retry failures 100 ". 49 - "times, waiting \$fail_count * 60s between each subsequent ". 50 - "failure. Be sure to keep the daemon console (/daemon/) open ". 47 + "If you set this to a list of HTTP URIs, when a feed story is ". 48 + "published a task will be created for each URI that posts the ". 49 + "story data to the URI. Daemons automagically retry failures 100 ". 50 + "times, waiting `\$fail_count * 60s` between each subsequent ". 51 + "failure. Be sure to keep the daemon console (`%s`) open ". 51 52 "while developing and testing your end points. You may need to". 52 - "restart your daemons to start sending http requests.\n\n". 53 - "NOTE: URIs are not validated, the URI must return http status ". 54 - "200 within 30 seconds, and no permission checks are performed.")), 53 + "restart your daemons to start sending HTTP requests.\n\n". 54 + "NOTE: URIs are not validated, the URI must return HTTP status ". 55 + "200 within 30 seconds, and no permission checks are performed.", 56 + '/daemon/')), 55 57 ); 56 58 } 57 59
+1 -1
src/applications/feed/query/PhabricatorFeedQuery.php
··· 101 101 'key' => array( 102 102 'table' => $table, 103 103 'column' => 'chronologicalKey', 104 - 'type' => 'int', 104 + 'type' => 'string', 105 105 'unique' => true, 106 106 ), 107 107 );
+1
src/applications/feed/story/PhabricatorFeedStory.php
··· 9 9 * @task policy Policy Implementation 10 10 */ 11 11 abstract class PhabricatorFeedStory 12 + extends Phobject 12 13 implements 13 14 PhabricatorPolicyInterface, 14 15 PhabricatorMarkupInterface {
+1 -1
src/applications/files/PhabricatorImageTransformer.php
··· 4 4 * @task enormous Detecting Enormous Images 5 5 * @task save Saving Image Data 6 6 */ 7 - final class PhabricatorImageTransformer { 7 + final class PhabricatorImageTransformer extends Phobject { 8 8 9 9 public function executeMemeTransform( 10 10 PhabricatorFile $file,
+1
src/applications/files/application/PhabricatorFilesApplication.php
··· 60 60 return array( 61 61 FilesDefaultViewCapability::CAPABILITY => array( 62 62 'caption' => pht('Default view policy for newly created files.'), 63 + 'template' => PhabricatorFileFilePHIDType::TYPECONST, 63 64 ), 64 65 ); 65 66 }
+1 -1
src/applications/files/engine/PhabricatorFileStorageEngine.php
··· 14 14 * @task file Managing File Data 15 15 * @task load Loading Storage Engines 16 16 */ 17 - abstract class PhabricatorFileStorageEngine { 17 + abstract class PhabricatorFileStorageEngine extends Phobject { 18 18 19 19 /** 20 20 * Construct a new storage engine.
+10
src/applications/files/engine/__tests__/PhabricatorFileStorageEngineTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorFileStorageEngineTestCase extends PhabricatorTestCase { 4 + 5 + public function testLoadAllEngines() { 6 + PhabricatorFileStorageEngine::loadAllEngines(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/files/query/PhabricatorFileBundleLoader.php
··· 4 4 * Callback provider for loading @{class@arcanist:ArcanistBundle} file data 5 5 * stored in the Files application. 6 6 */ 7 - final class PhabricatorFileBundleLoader { 7 + final class PhabricatorFileBundleLoader extends Phobject { 8 8 9 9 private $viewer; 10 10
+10
src/applications/files/transform/__tests__/PhabricatorFileTransformTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorFileTransformTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAllTransforms() { 6 + PhabricatorFileTransform::getAllTransforms(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/flag/constants/PhabricatorFlagConstants.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorFlagConstants {} 3 + abstract class PhabricatorFlagConstants extends Phobject {}
+1
src/applications/fund/application/PhabricatorFundApplication.php
··· 55 55 return array( 56 56 FundDefaultViewCapability::CAPABILITY => array( 57 57 'caption' => pht('Default view policy for newly created initiatives.'), 58 + 'tempate' => FundInitiativePHIDType::TYPECONST, 58 59 ), 59 60 FundCreateInitiativesCapability::CAPABILITY => array( 60 61 'default' => PhabricatorPolicies::POLICY_ADMIN,
+1
src/applications/harbormaster/query/HarbormasterBuildLogQuery.php
··· 6 6 private $ids; 7 7 private $phids; 8 8 private $buildPHIDs; 9 + private $buildTargetPHIDs; 9 10 10 11 public function withIDs(array $ids) { 11 12 $this->ids = $ids;
+1 -1
src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php
··· 1 1 <?php 2 2 3 - abstract class HarbormasterBuildStepImplementation { 3 + abstract class HarbormasterBuildStepImplementation extends Phobject { 4 4 5 5 public static function getImplementations() { 6 6 return id(new PhutilSymbolLoader())
+2 -2
src/applications/harbormaster/step/HarbormasterHTTPRequestBuildStepImplementation.php
··· 95 95 'name' => pht('Credentials'), 96 96 'type' => 'credential', 97 97 'credential.type' 98 - => PassphraseCredentialTypePassword::CREDENTIAL_TYPE, 98 + => PassphrasePasswordCredentialType::CREDENTIAL_TYPE, 99 99 'credential.provides' 100 - => PassphraseCredentialTypePassword::PROVIDES_TYPE, 100 + => PassphrasePasswordCredentialType::PROVIDES_TYPE, 101 101 ), 102 102 ); 103 103 }
+11
src/applications/harbormaster/step/__tests__/HarbormasterBuildStepImplementationTestCase.php
··· 1 + <?php 2 + 3 + final class HarbormasterBuildStepImplementationTestCase 4 + extends PhabricatorTestCase { 5 + 6 + public function testGetImplementations() { 7 + HarbormasterBuildStepImplementation::getImplementations(); 8 + $this->assertTrue(true); 9 + } 10 + 11 + }
+20 -1
src/applications/herald/adapter/HeraldAdapter.php
··· 3 3 /** 4 4 * @task customfield Custom Field Integration 5 5 */ 6 - abstract class HeraldAdapter { 6 + abstract class HeraldAdapter extends Phobject { 7 7 8 8 const FIELD_TITLE = 'title'; 9 9 const FIELD_BODY = 'body'; ··· 44 44 const FIELD_TASK_STATUS = 'taskstatus'; 45 45 const FIELD_PUSHER_IS_COMMITTER = 'pusher-is-committer'; 46 46 const FIELD_PATH = 'path'; 47 + const FIELD_SPACE = 'space'; 47 48 48 49 const CONDITION_CONTAINS = 'contains'; 49 50 const CONDITION_NOT_CONTAINS = '!contains'; ··· 101 102 const VALUE_TASK_STATUS = 'taskstatus'; 102 103 const VALUE_LEGAL_DOCUMENTS = 'legaldocuments'; 103 104 const VALUE_APPLICATION_EMAIL = 'applicationemail'; 105 + const VALUE_SPACE = 'space'; 104 106 105 107 private $contentSource; 106 108 private $isNewObject; ··· 219 221 $value[] = $this->getApplicationEmail()->getPHID(); 220 222 } 221 223 return $value; 224 + case self::FIELD_SPACE: 225 + $object = $this->getObject(); 226 + 227 + if (!($object instanceof PhabricatorSpacesInterface)) { 228 + throw new Exception( 229 + pht( 230 + 'Adapter object (of class "%s") does not implement interface '. 231 + '"%s", so the Space field value can not be determined.', 232 + get_class($object), 233 + 'PhabricatorSpacesInterface')); 234 + } 235 + 236 + return PhabricatorSpacesNamespaceQuery::getObjectSpacePHID($object); 222 237 default: 223 238 if ($this->isHeraldCustomKey($field_name)) { 224 239 return $this->getCustomFieldValue($field_name); ··· 400 415 self::FIELD_TASK_STATUS => pht('Task status'), 401 416 self::FIELD_PUSHER_IS_COMMITTER => pht('Pusher same as committer'), 402 417 self::FIELD_PATH => pht('Path'), 418 + self::FIELD_SPACE => pht('Space'), 403 419 ) + $this->getCustomFieldNameMap(); 404 420 } 405 421 ··· 453 469 case self::FIELD_PUSHER: 454 470 case self::FIELD_TASK_PRIORITY: 455 471 case self::FIELD_TASK_STATUS: 472 + case self::FIELD_SPACE: 456 473 return array( 457 474 self::CONDITION_IS_ANY, 458 475 self::CONDITION_IS_NOT_ANY, ··· 957 974 return self::VALUE_TASK_PRIORITY; 958 975 case self::FIELD_TASK_STATUS: 959 976 return self::VALUE_TASK_STATUS; 977 + case self::FIELD_SPACE: 978 + return self::VALUE_SPACE; 960 979 default: 961 980 return self::VALUE_USER; 962 981 }
+1
src/applications/herald/adapter/HeraldDifferentialRevisionAdapter.php
··· 3 3 final class HeraldDifferentialRevisionAdapter 4 4 extends HeraldDifferentialAdapter { 5 5 6 + protected $diff; 6 7 protected $revision; 7 8 8 9 protected $explicitReviewers;
+1
src/applications/herald/adapter/HeraldManiphestTaskAdapter.php
··· 73 73 self::FIELD_TASK_STATUS, 74 74 self::FIELD_IS_NEW_OBJECT, 75 75 self::FIELD_APPLICATION_EMAIL, 76 + self::FIELD_SPACE, 76 77 ), 77 78 parent::getFields()); 78 79 }
+1
src/applications/herald/adapter/HeraldPholioMockAdapter.php
··· 52 52 self::FIELD_CC, 53 53 self::FIELD_PROJECTS, 54 54 self::FIELD_IS_NEW_OBJECT, 55 + self::FIELD_SPACE, 55 56 ), 56 57 parent::getFields()); 57 58 }
+1 -1
src/applications/herald/config/HeraldRepetitionPolicyConfig.php
··· 1 1 <?php 2 2 3 - final class HeraldRepetitionPolicyConfig { 3 + final class HeraldRepetitionPolicyConfig extends Phobject { 4 4 5 5 const FIRST = 'first'; // only execute the first time (no repeating) 6 6 const EVERY = 'every'; // repeat every time
+1 -1
src/applications/herald/config/HeraldRuleTypeConfig.php
··· 1 1 <?php 2 2 3 - final class HeraldRuleTypeConfig { 3 + final class HeraldRuleTypeConfig extends Phobject { 4 4 5 5 const RULE_TYPE_GLOBAL = 'global'; 6 6 const RULE_TYPE_OBJECT = 'object';
+1
src/applications/herald/controller/HeraldRuleController.php
··· 632 632 'email' => new PhabricatorMetaMTAMailableDatasource(), 633 633 'userorproject' => new PhabricatorProjectOrUserDatasource(), 634 634 'applicationemail' => new PhabricatorMetaMTAApplicationEmailDatasource(), 635 + 'space' => new PhabricatorSpacesNamespaceDatasource(), 635 636 ); 636 637 637 638 foreach ($sources as $key => $source) {
+1 -1
src/applications/herald/engine/HeraldEffect.php
··· 1 1 <?php 2 2 3 - final class HeraldEffect { 3 + final class HeraldEffect extends Phobject { 4 4 5 5 private $objectPHID; 6 6 private $action;
+4 -3
src/applications/herald/engine/HeraldEngine.php
··· 1 1 <?php 2 2 3 - final class HeraldEngine { 3 + final class HeraldEngine extends Phobject { 4 4 5 5 protected $rules = array(); 6 6 protected $results = array(); 7 7 protected $stack = array(); 8 - protected $activeRule = null; 8 + protected $activeRule; 9 + protected $transcript; 9 10 10 11 protected $fieldCache = array(); 11 - protected $object = null; 12 + protected $object; 12 13 private $dryRun; 13 14 14 15 public function setDryRun($dry_run) {
+1 -1
src/applications/herald/extension/HeraldCustomAction.php
··· 1 1 <?php 2 2 3 - abstract class HeraldCustomAction { 3 + abstract class HeraldCustomAction extends Phobject { 4 4 5 5 abstract public function appliesToAdapter(HeraldAdapter $adapter); 6 6
+1 -1
src/applications/herald/garbagecollector/HeraldTranscriptGarbageCollector.php
··· 20 20 conditionTranscripts = "", 21 21 applyTranscripts = "", 22 22 garbageCollected = 1 23 - WHERE garbageCollected = 0 AND `time` < %d 23 + WHERE garbageCollected = 0 AND time < %d 24 24 LIMIT 100', 25 25 $table->getTableName(), 26 26 time() - $ttl);
+1 -1
src/applications/herald/storage/transcript/HeraldConditionTranscript.php
··· 1 1 <?php 2 2 3 - final class HeraldConditionTranscript { 3 + final class HeraldConditionTranscript extends Phobject { 4 4 5 5 protected $ruleID; 6 6 protected $conditionID;
+1 -1
src/applications/herald/storage/transcript/HeraldObjectTranscript.php
··· 1 1 <?php 2 2 3 - final class HeraldObjectTranscript { 3 + final class HeraldObjectTranscript extends Phobject { 4 4 5 5 protected $phid; 6 6 protected $type;
+1 -1
src/applications/herald/storage/transcript/HeraldRuleTranscript.php
··· 1 1 <?php 2 2 3 - final class HeraldRuleTranscript { 3 + final class HeraldRuleTranscript extends Phobject { 4 4 5 5 protected $ruleID; 6 6 protected $result;
+6 -2
src/applications/legalpad/application/PhabricatorLegalpadApplication.php
··· 75 75 protected function getCustomCapabilities() { 76 76 return array( 77 77 LegalpadCreateDocumentsCapability::CAPABILITY => array(), 78 - LegalpadDefaultViewCapability::CAPABILITY => array(), 79 - LegalpadDefaultEditCapability::CAPABILITY => array(), 78 + LegalpadDefaultViewCapability::CAPABILITY => array( 79 + 'template' => PhabricatorLegalpadDocumentPHIDType::TYPECONST, 80 + ), 81 + LegalpadDefaultEditCapability::CAPABILITY => array( 82 + 'template' => PhabricatorLegalpadDocumentPHIDType::TYPECONST, 83 + ), 80 84 ); 81 85 } 82 86
+1 -1
src/applications/lipsum/generator/PhabricatorTestDataGenerator.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorTestDataGenerator { 3 + abstract class PhabricatorTestDataGenerator extends Phobject { 4 4 5 5 public function generate() { 6 6 return;
+1 -1
src/applications/lipsum/image/PhabricatorLipsumArtist.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorLipsumArtist { 3 + abstract class PhabricatorLipsumArtist extends Phobject { 4 4 5 5 protected function getHSBColor($h, $s, $b) { 6 6 if ($s == 0) {
+4 -1
src/applications/macro/query/PhabricatorMacroSearchEngine.php
··· 141 141 foreach ($macros as $macro) { 142 142 $file = $macro->getFile(); 143 143 144 - $item = new PHUIPinboardItemView(); 144 + $item = id(new PHUIPinboardItemView()) 145 + ->setUser($viewer) 146 + ->setObject($macro); 147 + 145 148 if ($file) { 146 149 $item->setImageURI($file->getURIForTransform($xform)); 147 150 list($x, $y) = $xform->getTransformedDimensions($file);
+2
src/applications/maniphest/application/PhabricatorManiphestApplication.php
··· 131 131 return array( 132 132 ManiphestDefaultViewCapability::CAPABILITY => array( 133 133 'caption' => pht('Default view policy for newly created tasks.'), 134 + 'template' => ManiphestTaskPHIDType::TYPECONST, 134 135 ), 135 136 ManiphestDefaultEditCapability::CAPABILITY => array( 136 137 'caption' => pht('Default edit policy for newly created tasks.'), 138 + 'template' => ManiphestTaskPHIDType::TYPECONST, 137 139 ), 138 140 ManiphestEditStatusCapability::CAPABILITY => array(), 139 141 ManiphestEditAssignCapability::CAPABILITY => array(),
+1 -1
src/applications/maniphest/constants/ManiphestConstants.php
··· 1 1 <?php 2 2 3 - abstract class ManiphestConstants {} 3 + abstract class ManiphestConstants extends Phobject {}
+19
src/applications/maniphest/controller/ManiphestBatchEditController.php
··· 88 88 $mailable_source->setViewer($viewer); 89 89 $owner_source = new ManiphestAssigneeDatasource(); 90 90 $owner_source->setViewer($viewer); 91 + $spaces_source = id(new PhabricatorSpacesNamespaceDatasource()) 92 + ->setViewer($viewer); 91 93 92 94 require_celerity_resource('maniphest-batch-editor'); 93 95 Javelin::initBehavior( ··· 111 113 'src' => $mailable_source->getDatasourceURI(), 112 114 'placeholder' => $mailable_source->getPlaceholderText(), 113 115 'browseURI' => $mailable_source->getBrowseURI(), 116 + ), 117 + 'spaces' => array( 118 + 'src' => $spaces_source->getDatasourceURI(), 119 + 'placeholder' => $spaces_source->getPlaceholderText(), 120 + 'browseURI' => $spaces_source->getBrowseURI(), 121 + 'limit' => 1, 114 122 ), 115 123 ), 116 124 'input' => 'batch-form-actions', ··· 201 209 'remove_project' => PhabricatorTransactions::TYPE_EDGE, 202 210 'add_ccs' => PhabricatorTransactions::TYPE_SUBSCRIBERS, 203 211 'remove_ccs' => PhabricatorTransactions::TYPE_SUBSCRIBERS, 212 + 'space' => PhabricatorTransactions::TYPE_SPACE, 204 213 ); 205 214 206 215 $edge_edit_types = array( ··· 246 255 case PhabricatorTransactions::TYPE_SUBSCRIBERS: 247 256 $current = $task->getSubscriberPHIDs(); 248 257 break; 258 + case PhabricatorTransactions::TYPE_SPACE: 259 + $current = PhabricatorSpacesNamespaceQuery::getObjectSpacePHID( 260 + $task); 261 + break; 249 262 } 250 263 } 251 264 ··· 259 272 if (!strlen($value)) { 260 273 continue 2; 261 274 } 275 + break; 276 + case PhabricatorTransactions::TYPE_SPACE: 277 + if (empty($value)) { 278 + continue 2; 279 + } 280 + $value = head($value); 262 281 break; 263 282 case ManiphestTransaction::TYPE_OWNER: 264 283 if (empty($value)) {
+7
src/applications/maniphest/controller/ManiphestTaskEditController.php
··· 155 155 156 156 $aux_fields = $field_list->getFields(); 157 157 158 + $v_space = $task->getSpacePHID(); 159 + 158 160 if ($request->isFormPost()) { 159 161 $changes = array(); 160 162 161 163 $new_title = $request->getStr('title'); 162 164 $new_desc = $request->getStr('description'); 163 165 $new_status = $request->getStr('status'); 166 + $v_space = $request->getStr('spacePHID'); 164 167 165 168 if (!$task->getID()) { 166 169 $workflow = 'create'; ··· 268 271 } 269 272 270 273 if ($can_edit_policies) { 274 + $changes[PhabricatorTransactions::TYPE_SPACE] = $v_space; 271 275 $changes[PhabricatorTransactions::TYPE_VIEW_POLICY] = 272 276 $request->getStr('viewPolicy'); 273 277 $changes[PhabricatorTransactions::TYPE_EDIT_POLICY] = ··· 477 481 $task->setViewPolicy($template_task->getViewPolicy()); 478 482 $task->setEditPolicy($template_task->getEditPolicy()); 479 483 484 + $v_space = $template_task->getSpacePHID(); 485 + 480 486 $template_fields = PhabricatorCustomField::getObjectFields( 481 487 $template_task, 482 488 PhabricatorCustomField::ROLE_EDIT); ··· 643 649 ->setCapability(PhabricatorPolicyCapability::CAN_VIEW) 644 650 ->setPolicyObject($task) 645 651 ->setPolicies($policies) 652 + ->setSpacePHID($v_space) 646 653 ->setName('viewPolicy')) 647 654 ->appendChild( 648 655 id(new AphrontFormPolicyControl())
+1 -1
src/applications/maniphest/export/ManiphestExcelFormat.php
··· 1 1 <?php 2 2 3 - abstract class ManiphestExcelFormat { 3 + abstract class ManiphestExcelFormat extends Phobject { 4 4 5 5 final public static function loadAllFormats() { 6 6 $classes = id(new PhutilSymbolLoader())
+10
src/applications/maniphest/export/__tests__/ManiphestExcelFormatTestCase.php
··· 1 + <?php 2 + 3 + final class ManiphestExcelFormatTestCase extends PhabricatorTestCase { 4 + 5 + public function testLoadAllFormats() { 6 + ManiphestExcelFormat::loadAllFormats(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+43
src/applications/maniphest/policyrule/ManiphestTaskAuthorPolicyRule.php
··· 1 + <?php 2 + 3 + final class ManiphestTaskAuthorPolicyRule 4 + extends PhabricatorPolicyRule { 5 + 6 + public function getObjectPolicyKey() { 7 + return 'maniphest.author'; 8 + } 9 + 10 + public function getObjectPolicyName() { 11 + return pht('Task Author'); 12 + } 13 + 14 + public function getPolicyExplanation() { 15 + return pht('The author of this task can take this action.'); 16 + } 17 + 18 + public function getRuleDescription() { 19 + return pht('task author'); 20 + } 21 + 22 + public function canApplyToObject(PhabricatorPolicyInterface $object) { 23 + return ($object instanceof ManiphestTask); 24 + } 25 + 26 + public function applyRule( 27 + PhabricatorUser $viewer, 28 + $value, 29 + PhabricatorPolicyInterface $object) { 30 + 31 + $viewer_phid = $viewer->getPHID(); 32 + if (!$viewer_phid) { 33 + return false; 34 + } 35 + 36 + return ($object->getAuthorPHID() == $viewer_phid); 37 + } 38 + 39 + public function getValueControlType() { 40 + return self::CONTROL_TYPE_NONE; 41 + } 42 + 43 + }
+6 -1
src/applications/maniphest/query/ManiphestTaskQuery.php
··· 721 721 ), 722 722 'updated' => array( 723 723 'vector' => array('updated', 'id'), 724 - 'name' => pht('Date Updated'), 724 + 'name' => pht('Date Updated (Latest First)'), 725 725 'aliases' => array(self::ORDER_MODIFIED), 726 726 ), 727 + 'outdated' => array( 728 + 'vector' => array('-updated', '-id'), 729 + 'name' => pht('Date Updated (Oldest First)'), 730 + ), 727 731 'title' => array( 728 732 'vector' => array('title', 'id'), 729 733 'name' => pht('Title'), ··· 739 743 array( 740 744 'priority', 741 745 'updated', 746 + 'outdated', 742 747 'newest', 743 748 'oldest', 744 749 'title',
+4 -4
src/applications/maniphest/query/ManiphestTaskSearchEngine.php
··· 43 43 ->needProjectPHIDs(true); 44 44 } 45 45 46 - public function buildCustomSearchFields() { 46 + protected function buildCustomSearchFields() { 47 47 return array( 48 48 id(new PhabricatorSearchOwnersField()) 49 49 ->setLabel(pht('Assigned To')) ··· 105 105 ); 106 106 } 107 107 108 - public function getDefaultFieldOrder() { 108 + protected function getDefaultFieldOrder() { 109 109 return array( 110 110 'assignedPHIDs', 111 111 'projectPHIDs', ··· 128 128 ); 129 129 } 130 130 131 - public function getHiddenFields() { 131 + protected function getHiddenFields() { 132 132 $keys = array(); 133 133 134 134 if ($this->getIsBoardView()) { ··· 140 140 return $keys; 141 141 } 142 142 143 - public function buildQueryFromParameters(array $map) { 143 + protected function buildQueryFromParameters(array $map) { 144 144 $query = id(new ManiphestTaskQuery()) 145 145 ->needProjectPHIDs(true); 146 146
+12 -1
src/applications/maniphest/storage/ManiphestTask.php
··· 12 12 PhabricatorCustomFieldInterface, 13 13 PhabricatorDestructibleInterface, 14 14 PhabricatorApplicationTransactionInterface, 15 - PhabricatorProjectInterface { 15 + PhabricatorProjectInterface, 16 + PhabricatorSpacesInterface { 16 17 17 18 const MARKUP_FIELD_DESCRIPTION = 'markup:desc'; 18 19 ··· 35 36 protected $projectPHIDs = array(); 36 37 37 38 protected $ownerOrdering; 39 + protected $spacePHID; 38 40 39 41 private $subscriberPHIDs = self::ATTACHABLE; 40 42 private $groupByProjectPHID = self::ATTACHABLE; ··· 56 58 ->setAuthorPHID($actor->getPHID()) 57 59 ->setViewPolicy($view_policy) 58 60 ->setEditPolicy($edit_policy) 61 + ->setSpacePHID($actor->getDefaultSpacePHID()) 59 62 ->attachProjectPHIDs(array()) 60 63 ->attachSubscriberPHIDs(array()); 61 64 } ··· 377 380 AphrontRequest $request) { 378 381 379 382 return $timeline; 383 + } 384 + 385 + 386 + /* -( PhabricatorSpacesInterface )----------------------------------------- */ 387 + 388 + 389 + public function getSpacePHID() { 390 + return $this->spacePHID; 380 391 } 381 392 382 393 }
+6 -4
src/applications/maniphest/view/ManiphestTaskListView.php
··· 56 56 } 57 57 58 58 foreach ($this->tasks as $task) { 59 - $item = new PHUIObjectItemView(); 60 - $item->setObjectName('T'.$task->getID()); 61 - $item->setHeader($task->getTitle()); 62 - $item->setHref('/T'.$task->getID()); 59 + $item = id(new PHUIObjectItemView()) 60 + ->setUser($this->getUser()) 61 + ->setObject($task) 62 + ->setObjectName('T'.$task->getID()) 63 + ->setHeader($task->getTitle()) 64 + ->setHref('/T'.$task->getID()); 63 65 64 66 if ($task->getOwnerPHID()) { 65 67 $owner = $handles[$task->getOwnerPHID()];
+23 -3
src/applications/meta/controller/PhabricatorApplicationEditController.php
··· 124 124 ->setValue(idx($descriptions, $capability)) 125 125 ->setCaption($caption)); 126 126 } else { 127 - $form->appendChild( 128 - id(new AphrontFormPolicyControl()) 127 + $control = id(new AphrontFormPolicyControl()) 129 128 ->setUser($user) 130 129 ->setDisabled($locked) 131 130 ->setCapability($capability) ··· 133 132 ->setPolicies($policies) 134 133 ->setLabel($label) 135 134 ->setName('policy:'.$capability) 136 - ->setCaption($caption)); 135 + ->setCaption($caption); 136 + 137 + $template = $application->getCapabilityTemplatePHIDType($capability); 138 + if ($template) { 139 + $phid_types = PhabricatorPHIDType::getAllTypes(); 140 + $phid_type = idx($phid_types, $template); 141 + if ($phid_type) { 142 + $template_object = $phid_type->newObject(); 143 + if ($template_object) { 144 + $template_policies = id(new PhabricatorPolicyQuery()) 145 + ->setViewer($user) 146 + ->setObject($template_object) 147 + ->execute(); 148 + $control->setPolicies($template_policies); 149 + $control->setTemplateObject($template_object); 150 + } 151 + } 152 + 153 + $control->setTemplatePHIDType($template); 154 + } 155 + 156 + $form->appendControl($control); 137 157 } 138 158 139 159 }
+11
src/applications/meta/panel/__tests__/PhabricatorApplicationConfigurationPanelTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorApplicationConfigurationPanelTestCase 4 + extends PhabricatorTestCase { 5 + 6 + public function testLoadAllPanels() { 7 + PhabricatorApplicationConfigurationPanel::loadAllPanels(); 8 + $this->assertTrue(true); 9 + } 10 + 11 + }
+1 -1
src/applications/metamta/adapter/PhabricatorMailImplementationAdapter.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorMailImplementationAdapter { 3 + abstract class PhabricatorMailImplementationAdapter extends Phobject { 4 4 5 5 abstract public function setFrom($email, $name = ''); 6 6 abstract public function addReplyTo($email, $name = '');
+2
src/applications/metamta/adapter/PhabricatorMailImplementationPHPMailerLiteAdapter.php
··· 6 6 class PhabricatorMailImplementationPHPMailerLiteAdapter 7 7 extends PhabricatorMailImplementationAdapter { 8 8 9 + protected $mailer; 10 + 9 11 /** 10 12 * @phutil-external-symbol class PHPMailerLite 11 13 */
+166 -143
src/applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php
··· 16 16 $viewer = $this->getViewer(); 17 17 $application = $this->getApplication(); 18 18 19 - $addresses = id(new PhabricatorMetaMTAApplicationEmailQuery()) 20 - ->setViewer($viewer) 21 - ->withApplicationPHIDs(array($application->getPHID())) 22 - ->execute(); 23 - 24 - $rows = array(); 25 - foreach ($addresses as $address) { 26 - $rows[] = array( 27 - $address->getAddress(), 28 - ); 29 - } 30 - 31 - $table = id(new AphrontTableView($rows)) 32 - ->setNoDataString(pht('No email addresses configured.')) 33 - ->setHeaders( 34 - array( 35 - pht('Address'), 36 - )); 19 + $table = $this->buildEmailTable($is_edit = false, null); 37 20 38 21 $can_edit = PhabricatorPolicyFilter::hasCapability( 39 22 $viewer, ··· 91 74 return $this->returnDeleteAddressResponse($request, $uri, $delete); 92 75 } 93 76 94 - $emails = id(new PhabricatorMetaMTAApplicationEmailQuery()) 95 - ->setViewer($viewer) 96 - ->withApplicationPHIDs(array($application->getPHID())) 97 - ->execute(); 98 - 99 - $highlight = $request->getInt('highlight'); 100 - $rowc = array(); 101 - $rows = array(); 102 - foreach ($emails as $email) { 103 - 104 - $button_edit = javelin_tag( 105 - 'a', 106 - array( 107 - 'class' => 'button small grey', 108 - 'href' => $uri->alter('edit', $email->getID()), 109 - 'sigil' => 'workflow', 110 - ), 111 - pht('Edit')); 112 - 113 - $button_remove = javelin_tag( 114 - 'a', 115 - array( 116 - 'class' => 'button small grey', 117 - 'href' => $uri->alter('delete', $email->getID()), 118 - 'sigil' => 'workflow', 119 - ), 120 - pht('Delete')); 121 - 122 - if ($highlight == $email->getID()) { 123 - $rowc[] = 'highlighted'; 124 - } else { 125 - $rowc[] = null; 126 - } 77 + $table = $this->buildEmailTable( 78 + $is_edit = true, 79 + $request->getInt('id')); 127 80 128 - $rows[] = array( 129 - $email->getAddress(), 130 - $button_edit, 131 - $button_remove, 132 - ); 133 - } 134 - 135 - $table = id(new AphrontTableView($rows)) 136 - ->setNoDataString(pht('No application emails created yet.')); 137 - $table->setHeaders( 138 - array( 139 - pht('Email'), 140 - pht('Edit'), 141 - pht('Delete'), 142 - )); 143 - $table->setColumnClasses( 144 - array( 145 - 'wide', 146 - 'action', 147 - 'action', 148 - )); 149 - $table->setRowClasses($rowc); 150 - $table->setColumnVisibility( 151 - array( 152 - true, 153 - true, 154 - true, 155 - )); 156 81 $form = id(new AphrontFormView()) 157 82 ->setUser($viewer); 158 83 ··· 190 115 )); 191 116 } 192 117 193 - private function validateApplicationEmail($email) { 194 - $errors = array(); 195 - $e_email = true; 196 - 197 - if (!strlen($email)) { 198 - $e_email = pht('Required'); 199 - $errors[] = pht('Email is required.'); 200 - } else if (!PhabricatorUserEmail::isValidAddress($email)) { 201 - $e_email = pht('Invalid'); 202 - $errors[] = PhabricatorUserEmail::describeValidAddresses(); 203 - } else if (!PhabricatorUserEmail::isAllowedAddress($email)) { 204 - $e_email = pht('Disallowed'); 205 - $errors[] = PhabricatorUserEmail::describeAllowedAddresses(); 206 - } 207 - $user_emails = id(new PhabricatorUserEmail()) 208 - ->loadAllWhere('address = %s', $email); 209 - if ($user_emails) { 210 - $e_email = pht('Duplicate'); 211 - $errors[] = pht('A user already has this email.'); 212 - } 213 - 214 - return array($e_email, $errors); 215 - } 216 - 217 118 private function returnNewAddressResponse( 218 119 AphrontRequest $request, 219 120 PhutilURI $uri, ··· 265 166 266 167 $viewer = $request->getUser(); 267 168 169 + $config_default = 170 + PhabricatorMetaMTAApplicationEmail::CONFIG_DEFAULT_AUTHOR; 171 + 268 172 $e_email = true; 269 - $email = null; 270 - $errors = array(); 271 - $default_user_key = 272 - PhabricatorMetaMTAApplicationEmail::CONFIG_DEFAULT_AUTHOR; 173 + $v_email = $email_object->getAddress(); 174 + $e_space = null; 175 + $v_space = $email_object->getSpacePHID(); 176 + $v_default = $email_object->getConfigValue($config_default); 177 + 178 + $validation_exception = null; 273 179 if ($request->isDialogFormPost()) { 274 - $email = trim($request->getStr('email')); 275 - list($e_email, $errors) = $this->validateApplicationEmail($email); 276 - $email_object->setAddress($email); 277 - $default_user = $request->getArr($default_user_key); 278 - $default_user = reset($default_user); 279 - if ($default_user) { 280 - $email_object->setConfigValue($default_user_key, $default_user); 281 - } 180 + $e_email = null; 181 + 182 + $v_email = trim($request->getStr('email')); 183 + $v_space = $request->getStr('spacePHID'); 184 + $v_default = $request->getArr($config_default); 185 + $v_default = nonempty(head($v_default), null); 186 + 187 + $type_address = 188 + PhabricatorMetaMTAApplicationEmailTransaction::TYPE_ADDRESS; 189 + $type_space = PhabricatorTransactions::TYPE_SPACE; 190 + $type_config = 191 + PhabricatorMetaMTAApplicationEmailTransaction::TYPE_CONFIG; 192 + 193 + $key_config = PhabricatorMetaMTAApplicationEmailTransaction::KEY_CONFIG; 194 + 195 + $xactions = array(); 196 + 197 + $xactions[] = id(new PhabricatorMetaMTAApplicationEmailTransaction()) 198 + ->setTransactionType($type_address) 199 + ->setNewValue($v_email); 200 + 201 + $xactions[] = id(new PhabricatorMetaMTAApplicationEmailTransaction()) 202 + ->setTransactionType($type_space) 203 + ->setNewValue($v_space); 204 + 205 + $xactions[] = id(new PhabricatorMetaMTAApplicationEmailTransaction()) 206 + ->setTransactionType($type_config) 207 + ->setMetadataValue($key_config, $config_default) 208 + ->setNewValue($v_default); 209 + 210 + $editor = id(new PhabricatorMetaMTAApplicationEmailEditor()) 211 + ->setActor($viewer) 212 + ->setContentSourceFromRequest($request) 213 + ->setContinueOnNoEffect(true); 214 + 215 + try { 216 + $editor->applyTransactions($email_object, $xactions); 282 217 283 - if (!$errors) { 284 - try { 285 - $email_object->save(); 286 - return id(new AphrontRedirectResponse())->setURI( 287 - $uri->alter('highlight', $email_object->getID())); 288 - } catch (AphrontDuplicateKeyQueryException $ex) { 289 - $e_email = pht('Duplicate'); 290 - $errors[] = pht( 291 - 'Another application is already configured to use this email '. 292 - 'address.'); 293 - } 218 + return id(new AphrontRedirectResponse())->setURI( 219 + $uri->alter('highlight', $email_object->getID())); 220 + } catch (PhabricatorApplicationTransactionValidationException $ex) { 221 + $validation_exception = $ex; 222 + $e_email = $ex->getShortMessage($type_address); 223 + $e_space = $ex->getShortMessage($type_space); 294 224 } 295 225 } 296 226 297 - if ($errors) { 298 - $errors = id(new PHUIInfoView()) 299 - ->setErrors($errors); 300 - } 301 - 302 - $default_user = $email_object->getConfigValue($default_user_key); 303 - if ($default_user) { 304 - $default_user_value = array($default_user); 227 + if ($v_default) { 228 + $v_default = array($v_default); 305 229 } else { 306 - $default_user_value = array(); 230 + $v_default = array(); 307 231 } 308 232 309 233 $form = id(new AphrontFormView()) ··· 312 236 id(new AphrontFormTextControl()) 313 237 ->setLabel(pht('Email')) 314 238 ->setName('email') 315 - ->setValue($email_object->getAddress()) 316 - ->setCaption(PhabricatorUserEmail::describeAllowedAddresses()) 317 - ->setError($e_email)) 239 + ->setValue($v_email) 240 + ->setError($e_email)); 241 + 242 + if (PhabricatorSpacesNamespaceQuery::getViewerSpacesExist($viewer)) { 243 + $form->appendControl( 244 + id(new AphrontFormSelectControl()) 245 + ->setLabel(pht('Space')) 246 + ->setName('spacePHID') 247 + ->setValue($v_space) 248 + ->setError($e_space) 249 + ->setOptions( 250 + PhabricatorSpacesNamespaceQuery::getSpaceOptionsForViewer( 251 + $viewer, 252 + $v_space))); 253 + } 254 + 255 + $form 318 256 ->appendControl( 319 257 id(new AphrontFormTokenizerControl()) 320 258 ->setDatasource(new PhabricatorPeopleDatasource()) 321 259 ->setLabel(pht('Default Author')) 322 - ->setName($default_user_key) 260 + ->setName($config_default) 323 261 ->setLimit(1) 324 - ->setValue($default_user_value) 262 + ->setValue($v_default) 325 263 ->setCaption(pht( 326 264 'Used if the "From:" address does not map to a known account.'))); 265 + 327 266 if ($is_new) { 328 267 $title = pht('New Address'); 329 268 } else { 330 269 $title = pht('Edit Address'); 331 270 } 271 + 332 272 $dialog = id(new AphrontDialogView()) 333 273 ->setUser($viewer) 334 274 ->setWidth(AphrontDialogView::WIDTH_FORM) 335 275 ->setTitle($title) 336 - ->appendChild($errors) 276 + ->setValidationException($validation_exception) 337 277 ->appendForm($form) 338 278 ->addSubmitButton(pht('Save')) 339 279 ->addCancelButton($uri); ··· 350 290 PhutilURI $uri, 351 291 $email_object_id) { 352 292 353 - $viewer = $request->getUser(); 293 + $viewer = $this->getViewer(); 294 + 354 295 $email_object = id(new PhabricatorMetaMTAApplicationEmailQuery()) 355 296 ->setViewer($viewer) 356 297 ->withIDs(array($email_object_id)) ··· 365 306 } 366 307 367 308 if ($request->isDialogFormPost()) { 368 - $email_object->delete(); 309 + $engine = new PhabricatorDestructionEngine(); 310 + $engine->destroyObject($email_object); 369 311 return id(new AphrontRedirectResponse())->setURI($uri); 370 312 } 371 313 ··· 379 321 ->addCancelButton($uri); 380 322 381 323 return id(new AphrontDialogResponse())->setDialog($dialog); 324 + } 325 + 326 + private function buildEmailTable($is_edit, $highlight) { 327 + $viewer = $this->getViewer(); 328 + $application = $this->getApplication(); 329 + $uri = new PhutilURI($this->getPanelURI()); 330 + 331 + $emails = id(new PhabricatorMetaMTAApplicationEmailQuery()) 332 + ->setViewer($viewer) 333 + ->withApplicationPHIDs(array($application->getPHID())) 334 + ->execute(); 335 + 336 + $rowc = array(); 337 + $rows = array(); 338 + foreach ($emails as $email) { 339 + 340 + $button_edit = javelin_tag( 341 + 'a', 342 + array( 343 + 'class' => 'button small grey', 344 + 'href' => $uri->alter('edit', $email->getID()), 345 + 'sigil' => 'workflow', 346 + ), 347 + pht('Edit')); 348 + 349 + $button_remove = javelin_tag( 350 + 'a', 351 + array( 352 + 'class' => 'button small grey', 353 + 'href' => $uri->alter('delete', $email->getID()), 354 + 'sigil' => 'workflow', 355 + ), 356 + pht('Delete')); 357 + 358 + if ($highlight == $email->getID()) { 359 + $rowc[] = 'highlighted'; 360 + } else { 361 + $rowc[] = null; 362 + } 363 + 364 + $space_phid = PhabricatorSpacesNamespaceQuery::getObjectSpacePHID($email); 365 + if ($space_phid) { 366 + $email_space = $viewer->renderHandle($space_phid); 367 + } else { 368 + $email_space = null; 369 + } 370 + 371 + $rows[] = array( 372 + $email_space, 373 + $email->getAddress(), 374 + $button_edit, 375 + $button_remove, 376 + ); 377 + } 378 + 379 + $table = id(new AphrontTableView($rows)) 380 + ->setNoDataString(pht('No application emails created yet.')); 381 + $table->setHeaders( 382 + array( 383 + pht('Space'), 384 + pht('Email'), 385 + pht('Edit'), 386 + pht('Delete'), 387 + )); 388 + $table->setColumnClasses( 389 + array( 390 + '', 391 + 'wide', 392 + 'action', 393 + 'action', 394 + )); 395 + $table->setRowClasses($rowc); 396 + $table->setColumnVisibility( 397 + array( 398 + PhabricatorSpacesNamespaceQuery::getViewerSpacesExist($viewer), 399 + true, 400 + $is_edit, 401 + $is_edit, 402 + )); 403 + 404 + return $table; 382 405 } 383 406 384 407 }
+10
src/applications/metamta/command/__tests__/MetaMTAEmailTransactionCommandTestCase.php
··· 1 + <?php 2 + 3 + final class MetaMTAEmailTransactionCommandTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAllTypes() { 6 + MetaMTAEmailTransactionCommand::getAllCommands(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/metamta/constants/MetaMTAConstants.php
··· 1 1 <?php 2 2 3 - abstract class MetaMTAConstants {} 3 + abstract class MetaMTAConstants extends Phobject {}
+1 -1
src/applications/metamta/contentsource/PhabricatorContentSource.php
··· 1 1 <?php 2 2 3 - final class PhabricatorContentSource { 3 + final class PhabricatorContentSource extends Phobject { 4 4 5 5 const SOURCE_UNKNOWN = 'unknown'; 6 6 const SOURCE_WEB = 'web';
+145
src/applications/metamta/editor/PhabricatorMetaMTAApplicationEmailEditor.php
··· 1 + <?php 2 + 3 + final class PhabricatorMetaMTAApplicationEmailEditor 4 + extends PhabricatorApplicationTransactionEditor { 5 + 6 + public function getEditorApplicationClass() { 7 + return pht('PhabricatorMetaMTAApplication'); 8 + } 9 + 10 + public function getEditorObjectsDescription() { 11 + return pht('Application Emails'); 12 + } 13 + 14 + public function getTransactionTypes() { 15 + $types = parent::getTransactionTypes(); 16 + 17 + $types[] = PhabricatorMetaMTAApplicationEmailTransaction::TYPE_ADDRESS; 18 + $types[] = PhabricatorMetaMTAApplicationEmailTransaction::TYPE_CONFIG; 19 + 20 + return $types; 21 + } 22 + 23 + protected function getCustomTransactionOldValue( 24 + PhabricatorLiskDAO $object, 25 + PhabricatorApplicationTransaction $xaction) { 26 + 27 + switch ($xaction->getTransactionType()) { 28 + case PhabricatorMetaMTAApplicationEmailTransaction::TYPE_ADDRESS: 29 + return $object->getAddress(); 30 + case PhabricatorMetaMTAApplicationEmailTransaction::TYPE_CONFIG: 31 + $key = $xaction->getMetadataValue( 32 + PhabricatorMetaMTAApplicationEmailTransaction::KEY_CONFIG); 33 + return $object->getConfigValue($key); 34 + } 35 + 36 + return parent::getCustomTransactionOldValue($object, $xaction); 37 + } 38 + 39 + protected function getCustomTransactionNewValue( 40 + PhabricatorLiskDAO $object, 41 + PhabricatorApplicationTransaction $xaction) { 42 + 43 + switch ($xaction->getTransactionType()) { 44 + case PhabricatorMetaMTAApplicationEmailTransaction::TYPE_ADDRESS: 45 + case PhabricatorMetaMTAApplicationEmailTransaction::TYPE_CONFIG: 46 + return $xaction->getNewValue(); 47 + } 48 + 49 + return parent::getCustomTransactionNewValue($object, $xaction); 50 + } 51 + 52 + protected function applyCustomInternalTransaction( 53 + PhabricatorLiskDAO $object, 54 + PhabricatorApplicationTransaction $xaction) { 55 + 56 + $new = $xaction->getNewValue(); 57 + 58 + switch ($xaction->getTransactionType()) { 59 + case PhabricatorMetaMTAApplicationEmailTransaction::TYPE_ADDRESS: 60 + $object->setAddress($new); 61 + return; 62 + case PhabricatorMetaMTAApplicationEmailTransaction::TYPE_CONFIG: 63 + $key = $xaction->getMetadataValue( 64 + PhabricatorMetaMTAApplicationEmailTransaction::KEY_CONFIG); 65 + $object->setConfigValue($key, $new); 66 + return; 67 + } 68 + 69 + return parent::applyCustomInternalTransaction($object, $xaction); 70 + } 71 + 72 + protected function applyCustomExternalTransaction( 73 + PhabricatorLiskDAO $object, 74 + PhabricatorApplicationTransaction $xaction) { 75 + 76 + switch ($xaction->getTransactionType()) { 77 + case PhabricatorMetaMTAApplicationEmailTransaction::TYPE_ADDRESS: 78 + case PhabricatorMetaMTAApplicationEmailTransaction::TYPE_CONFIG: 79 + return; 80 + } 81 + 82 + return parent::applyCustomExternalTransaction($object, $xaction); 83 + } 84 + 85 + protected function validateTransaction( 86 + PhabricatorLiskDAO $object, 87 + $type, 88 + array $xactions) { 89 + 90 + $errors = parent::validateTransaction($object, $type, $xactions); 91 + 92 + switch ($type) { 93 + case PhabricatorMetaMTAApplicationEmailTransaction::TYPE_ADDRESS: 94 + foreach ($xactions as $xaction) { 95 + $email = $xaction->getNewValue(); 96 + if (!strlen($email)) { 97 + // We'll deal with this below. 98 + continue; 99 + } 100 + 101 + if (!PhabricatorUserEmail::isValidAddress($email)) { 102 + $errors[] = new PhabricatorApplicationTransactionValidationError( 103 + $type, 104 + pht('Invalid'), 105 + pht('Email address is not formatted properly.')); 106 + } 107 + } 108 + 109 + $missing = $this->validateIsEmptyTextField( 110 + $object->getAddress(), 111 + $xactions); 112 + 113 + if ($missing) { 114 + $error = new PhabricatorApplicationTransactionValidationError( 115 + $type, 116 + pht('Required'), 117 + pht('You must provide an email address.'), 118 + nonempty(last($xactions), null)); 119 + 120 + $error->setIsMissingFieldError(true); 121 + $errors[] = $error; 122 + } 123 + break; 124 + } 125 + 126 + return $errors; 127 + } 128 + 129 + protected function didCatchDuplicateKeyException( 130 + PhabricatorLiskDAO $object, 131 + array $xactions, 132 + Exception $ex) { 133 + 134 + $errors = array(); 135 + $errors[] = new PhabricatorApplicationTransactionValidationError( 136 + PhabricatorMetaMTAApplicationEmailTransaction::TYPE_ADDRESS, 137 + pht('Duplicate'), 138 + pht('This email address is already in use.'), 139 + null); 140 + 141 + throw new PhabricatorApplicationTransactionValidationException($errors); 142 + } 143 + 144 + 145 + }
+1 -1
src/applications/metamta/parser/PhabricatorMetaMTAEmailBodyParser.php
··· 1 1 <?php 2 2 3 - final class PhabricatorMetaMTAEmailBodyParser { 3 + final class PhabricatorMetaMTAEmailBodyParser extends Phobject { 4 4 5 5 /** 6 6 * Mails can have bodies such as
+1 -1
src/applications/metamta/query/PhabricatorMetaMTAActor.php
··· 1 1 <?php 2 2 3 - final class PhabricatorMetaMTAActor { 3 + final class PhabricatorMetaMTAActor extends Phobject { 4 4 5 5 const STATUS_DELIVERABLE = 'deliverable'; 6 6 const STATUS_UNDELIVERABLE = 'undeliverable';
+9 -23
src/applications/metamta/query/PhabricatorMetaMTAApplicationEmailQuery.php
··· 35 35 } 36 36 37 37 protected function loadPage() { 38 - $table = new PhabricatorMetaMTAApplicationEmail(); 39 - $conn_r = $table->establishConnection('r'); 40 - 41 - $data = queryfx_all( 42 - $conn_r, 43 - 'SELECT * FROM %T appemail %Q %Q %Q %Q', 44 - $table->getTableName(), 45 - $this->buildWhereClause($conn_r), 46 - $this->buildApplicationSearchGroupClause($conn_r), 47 - $this->buildOrderClause($conn_r), 48 - $this->buildLimitClause($conn_r)); 49 - 50 - return $table->loadAllFromArray($data); 38 + return $this->loadStandardPage(new PhabricatorMetaMTAApplicationEmail()); 51 39 } 52 40 53 41 protected function willFilterPage(array $app_emails) { ··· 71 59 return $app_emails; 72 60 } 73 61 74 - protected function buildWhereClause(AphrontDatabaseConnection $conn_r) { 75 - $where = array(); 62 + protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) { 63 + $where = parent::buildWhereClauseParts($conn); 76 64 77 65 if ($this->addresses !== null) { 78 66 $where[] = qsprintf( 79 - $conn_r, 67 + $conn, 80 68 'appemail.address IN (%Ls)', 81 69 $this->addresses); 82 70 } 83 71 84 72 if ($this->addressPrefix !== null) { 85 73 $where[] = qsprintf( 86 - $conn_r, 74 + $conn, 87 75 'appemail.address LIKE %>', 88 76 $this->addressPrefix); 89 77 } 90 78 91 79 if ($this->applicationPHIDs !== null) { 92 80 $where[] = qsprintf( 93 - $conn_r, 81 + $conn, 94 82 'appemail.applicationPHID IN (%Ls)', 95 83 $this->applicationPHIDs); 96 84 } 97 85 98 86 if ($this->phids !== null) { 99 87 $where[] = qsprintf( 100 - $conn_r, 88 + $conn, 101 89 'appemail.phid IN (%Ls)', 102 90 $this->phids); 103 91 } 104 92 105 93 if ($this->ids !== null) { 106 94 $where[] = qsprintf( 107 - $conn_r, 95 + $conn, 108 96 'appemail.id IN (%Ld)', 109 97 $this->ids); 110 98 } 111 99 112 - $where[] = $this->buildPagingClause($conn_r); 113 - 114 - return $this->formatWhereClause($where); 100 + return $where; 115 101 } 116 102 117 103 protected function getPrimaryTableAlias() {
+10
src/applications/metamta/query/PhabricatorMetaMTAApplicationEmailTransactionQuery.php
··· 1 + <?php 2 + 3 + final class PhabricatorMetaMTAApplicationEmailTransactionQuery 4 + extends PhabricatorApplicationTransactionQuery { 5 + 6 + public function getTemplateApplicationTransaction() { 7 + return new PhabricatorMetaMTAApplicationEmailTransaction(); 8 + } 9 + 10 + }
+1 -1
src/applications/metamta/receiver/PhabricatorMailReceiver.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorMailReceiver { 3 + abstract class PhabricatorMailReceiver extends Phobject { 4 4 5 5 private $applicationEmail; 6 6
+1 -1
src/applications/metamta/replyhandler/PhabricatorMailReplyHandler.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorMailReplyHandler { 3 + abstract class PhabricatorMailReplyHandler extends Phobject { 4 4 5 5 private $mailReceiver; 6 6 private $applicationEmail;
+46 -1
src/applications/metamta/storage/PhabricatorMetaMTAApplicationEmail.php
··· 2 2 3 3 final class PhabricatorMetaMTAApplicationEmail 4 4 extends PhabricatorMetaMTADAO 5 - implements PhabricatorPolicyInterface { 5 + implements 6 + PhabricatorPolicyInterface, 7 + PhabricatorApplicationTransactionInterface, 8 + PhabricatorDestructibleInterface, 9 + PhabricatorSpacesInterface { 6 10 7 11 protected $applicationPHID; 8 12 protected $address; 9 13 protected $configData; 14 + protected $spacePHID; 10 15 11 16 private $application = self::ATTACHABLE; 12 17 ··· 40 45 41 46 public static function initializeNewAppEmail(PhabricatorUser $actor) { 42 47 return id(new PhabricatorMetaMTAApplicationEmail()) 48 + ->setSpacePHID($actor->getDefaultSpacePHID()) 43 49 ->setConfigData(array()); 44 50 } 45 51 ··· 107 113 108 114 public function describeAutomaticCapability($capability) { 109 115 return $this->getApplication()->describeAutomaticCapability($capability); 116 + } 117 + 118 + 119 + /* -( PhabricatorApplicationTransactionInterface )------------------------- */ 120 + 121 + 122 + public function getApplicationTransactionEditor() { 123 + return new PhabricatorMetaMTAApplicationEmailEditor(); 124 + } 125 + 126 + public function getApplicationTransactionObject() { 127 + return $this; 128 + } 129 + 130 + public function getApplicationTransactionTemplate() { 131 + return new PhabricatorMetaMTAApplicationEmailTransaction(); 132 + } 133 + 134 + public function willRenderTimeline( 135 + PhabricatorApplicationTransactionView $timeline, 136 + AphrontRequest $request) { 137 + return $timeline; 138 + } 139 + 140 + 141 + /* -( PhabricatorDestructibleInterface )----------------------------------- */ 142 + 143 + 144 + public function destroyObjectPermanently( 145 + PhabricatorDestructionEngine $engine) { 146 + $this->delete(); 147 + } 148 + 149 + 150 + /* -( PhabricatorSpacesInterface )----------------------------------------- */ 151 + 152 + 153 + public function getSpacePHID() { 154 + return $this->spacePHID; 110 155 } 111 156 112 157 }
+23
src/applications/metamta/storage/PhabricatorMetaMTAApplicationEmailTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorMetaMTAApplicationEmailTransaction 4 + extends PhabricatorApplicationTransaction { 5 + 6 + const KEY_CONFIG = 'appemail.config.key'; 7 + 8 + const TYPE_ADDRESS = 'appemail.address'; 9 + const TYPE_CONFIG = 'appemail.config'; 10 + 11 + public function getApplicationName() { 12 + return 'metamta'; 13 + } 14 + 15 + public function getApplicationTransactionType() { 16 + return PhabricatorMetaMTAApplicationEmailPHIDType::TYPECONST; 17 + } 18 + 19 + public function getApplicationTransactionCommentObject() { 20 + return null; 21 + } 22 + 23 + }
+1 -1
src/applications/metamta/storage/PhabricatorMetaMTAAttachment.php
··· 1 1 <?php 2 2 3 - final class PhabricatorMetaMTAAttachment { 3 + final class PhabricatorMetaMTAAttachment extends Phobject { 4 4 protected $data; 5 5 protected $filename; 6 6 protected $mimetype;
+1 -1
src/applications/metamta/view/PhabricatorMetaMTAMailBody.php
··· 6 6 * @task compose Composition 7 7 * @task render Rendering 8 8 */ 9 - final class PhabricatorMetaMTAMailBody { 9 + final class PhabricatorMetaMTAMailBody extends Phobject { 10 10 11 11 private $sections = array(); 12 12 private $htmlSections = array();
+2 -2
src/applications/metamta/view/PhabricatorMetaMTAMailSection.php
··· 1 1 <?php 2 + 2 3 /** 3 4 * Helper for building a rendered section. 4 5 * ··· 6 7 * @task render Rendering 7 8 * @group metamta 8 9 */ 9 - 10 - final class PhabricatorMetaMTAMailSection { 10 + final class PhabricatorMetaMTAMailSection extends Phobject { 11 11 private $plaintextFragments = array(); 12 12 private $htmlFragments = array(); 13 13
+1 -1
src/applications/multimeter/data/MultimeterControl.php
··· 1 1 <?php 2 2 3 - final class MultimeterControl { 3 + final class MultimeterControl extends Phobject { 4 4 5 5 private static $instance; 6 6
+1 -1
src/applications/notification/builder/PhabricatorNotificationBuilder.php
··· 1 1 <?php 2 2 3 - final class PhabricatorNotificationBuilder { 3 + final class PhabricatorNotificationBuilder extends Phobject { 4 4 5 5 private $stories; 6 6 private $user = null;
+1 -1
src/applications/notification/client/PhabricatorNotificationClient.php
··· 1 1 <?php 2 2 3 - final class PhabricatorNotificationClient { 3 + final class PhabricatorNotificationClient extends Phobject { 4 4 5 5 const EXPECT_VERSION = 7; 6 6
+22
src/applications/notification/garbagecollector/FeedStoryNotificationGarbageCollector.php
··· 1 + <?php 2 + 3 + final class FeedStoryNotificationGarbageCollector 4 + extends PhabricatorGarbageCollector { 5 + 6 + public function collectGarbage() { 7 + $ttl = 90 * 24 * 60 * 60; 8 + 9 + $table = new PhabricatorFeedStoryNotification(); 10 + $conn_w = $table->establishConnection('w'); 11 + 12 + queryfx( 13 + $conn_w, 14 + 'DELETE FROM %T WHERE chronologicalKey < (%d << 32) 15 + ORDER BY chronologicalKey ASC LIMIT 100', 16 + $table->getTableName(), 17 + time() - $ttl); 18 + 19 + return ($conn_w->getAffectedRows() == 100); 20 + } 21 + 22 + }
+3
src/applications/notification/storage/PhabricatorFeedStoryNotification.php
··· 28 28 'key_object' => array( 29 29 'columns' => array('primaryObjectPHID'), 30 30 ), 31 + 'key_chronological' => array( 32 + 'columns' => array('chronologicalKey'), 33 + ), 31 34 ), 32 35 ) + parent::getConfiguration(); 33 36 }
+2
src/applications/nuance/application/PhabricatorNuanceApplication.php
··· 72 72 return array( 73 73 NuanceSourceDefaultViewCapability::CAPABILITY => array( 74 74 'caption' => pht('Default view policy for newly created sources.'), 75 + 'template' => NuanceSourcePHIDType::TYPECONST, 75 76 ), 76 77 NuanceSourceDefaultEditCapability::CAPABILITY => array( 77 78 'caption' => pht('Default edit policy for newly created sources.'), 79 + 'template' => NuanceSourcePHIDType::TYPECONST, 78 80 ), 79 81 NuanceSourceManageCapability::CAPABILITY => array(), 80 82 );
+10
src/applications/nuance/source/__tests__/NuanceSourceDefinitionTestCase.php
··· 1 + <?php 2 + 3 + final class NuanceSourceDefinitionTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAllTypes() { 6 + NuanceSourceDefinition::getAllDefinitions(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/oauthserver/PhabricatorOAuthServer.php
··· 26 26 * and generating @{class:PhabricatorOAuthServerAccessToken}s 27 27 * @task internal Internals 28 28 */ 29 - final class PhabricatorOAuthServer { 29 + final class PhabricatorOAuthServer extends Phobject { 30 30 31 31 const AUTHORIZATION_CODE_TIMEOUT = 300; 32 32 const ACCESS_TOKEN_TIMEOUT = 3600;
+1 -1
src/applications/oauthserver/PhabricatorOAuthServerScope.php
··· 1 1 <?php 2 2 3 - final class PhabricatorOAuthServerScope { 3 + final class PhabricatorOAuthServerScope extends Phobject { 4 4 5 5 const SCOPE_OFFLINE_ACCESS = 'offline_access'; 6 6 const SCOPE_WHOAMI = 'whoami';
+1 -1
src/applications/owners/query/PhabricatorOwnerPathQuery.php
··· 1 1 <?php 2 2 3 - final class PhabricatorOwnerPathQuery { 3 + final class PhabricatorOwnerPathQuery extends Phobject { 4 4 5 5 public static function loadAffectedPaths( 6 6 PhabricatorRepository $repository,
+4 -4
src/applications/passphrase/conduit/PassphraseQueryConduitAPIMethod.php
··· 78 78 } 79 79 80 80 switch ($credential->getCredentialType()) { 81 - case PassphraseCredentialTypeSSHPrivateKeyFile::CREDENTIAL_TYPE: 81 + case PassphraseSSHPrivateKeyFileCredentialType::CREDENTIAL_TYPE: 82 82 if ($secret) { 83 83 $material['file'] = $secret; 84 84 } ··· 86 86 $material['publicKey'] = $public_key; 87 87 } 88 88 break; 89 - case PassphraseCredentialTypeSSHGeneratedKey::CREDENTIAL_TYPE: 90 - case PassphraseCredentialTypeSSHPrivateKeyText::CREDENTIAL_TYPE: 89 + case PassphraseSSHGeneratedKeyCredentialType::CREDENTIAL_TYPE: 90 + case PassphraseSSHPrivateKeyTextCredentialType::CREDENTIAL_TYPE: 91 91 if ($secret) { 92 92 $material['privateKey'] = $secret; 93 93 } ··· 95 95 $material['publicKey'] = $public_key; 96 96 } 97 97 break; 98 - case PassphraseCredentialTypePassword::CREDENTIAL_TYPE: 98 + case PassphrasePasswordCredentialType::CREDENTIAL_TYPE: 99 99 if ($secret) { 100 100 $material['password'] = $secret; 101 101 }
+1 -1
src/applications/passphrase/credentialtype/PassphraseCredentialTypePassword.php src/applications/passphrase/credentialtype/PassphrasePasswordCredentialType.php
··· 1 1 <?php 2 2 3 - final class PassphraseCredentialTypePassword 3 + final class PassphrasePasswordCredentialType 4 4 extends PassphraseCredentialType { 5 5 6 6 const CREDENTIAL_TYPE = 'password';
+2 -2
src/applications/passphrase/credentialtype/PassphraseCredentialTypeSSHGeneratedKey.php src/applications/passphrase/credentialtype/PassphraseSSHGeneratedKeyCredentialType.php
··· 1 1 <?php 2 2 3 - final class PassphraseCredentialTypeSSHGeneratedKey 4 - extends PassphraseCredentialTypeSSHPrivateKey { 3 + final class PassphraseSSHGeneratedKeyCredentialType 4 + extends PassphraseSSHPrivateKeyCredentialType { 5 5 6 6 const CREDENTIAL_TYPE = 'ssh-generated-key'; 7 7
+1 -1
src/applications/passphrase/credentialtype/PassphraseCredentialTypeSSHPrivateKey.php src/applications/passphrase/credentialtype/PassphraseSSHPrivateKeyCredentialType.php
··· 1 1 <?php 2 2 3 - abstract class PassphraseCredentialTypeSSHPrivateKey 3 + abstract class PassphraseSSHPrivateKeyCredentialType 4 4 extends PassphraseCredentialType { 5 5 6 6 const PROVIDES_TYPE = 'provides/ssh-key-file';
+2 -2
src/applications/passphrase/credentialtype/PassphraseCredentialTypeSSHPrivateKeyFile.php src/applications/passphrase/credentialtype/PassphraseSSHPrivateKeyFileCredentialType.php
··· 1 1 <?php 2 2 3 - final class PassphraseCredentialTypeSSHPrivateKeyFile 4 - extends PassphraseCredentialTypeSSHPrivateKey { 3 + final class PassphraseSSHPrivateKeyFileCredentialType 4 + extends PassphraseSSHPrivateKeyCredentialType { 5 5 6 6 const CREDENTIAL_TYPE = 'ssh-key-file'; 7 7
+2 -2
src/applications/passphrase/credentialtype/PassphraseCredentialTypeSSHPrivateKeyText.php src/applications/passphrase/credentialtype/PassphraseSSHPrivateKeyTextCredentialType.php
··· 1 1 <?php 2 2 3 - final class PassphraseCredentialTypeSSHPrivateKeyText 4 - extends PassphraseCredentialTypeSSHPrivateKey { 3 + final class PassphraseSSHPrivateKeyTextCredentialType 4 + extends PassphraseSSHPrivateKeyCredentialType { 5 5 6 6 const CREDENTIAL_TYPE = 'ssh-key-text'; 7 7
+10
src/applications/passphrase/credentialtype/__tests__/PassphraseCredentialTypeTestCase.php
··· 1 + <?php 2 + 3 + final class PassphraseCredentialTypeTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAllTypes() { 6 + PassphraseCredentialType::getAllTypes(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/passphrase/keys/PassphrasePasswordKey.php
··· 7 7 return $key->loadAndValidateFromPHID( 8 8 $phid, 9 9 $viewer, 10 - PassphraseCredentialTypePassword::PROVIDES_TYPE); 10 + PassphrasePasswordCredentialType::PROVIDES_TYPE); 11 11 } 12 12 13 13 public function getPasswordEnvelope() {
+2 -2
src/applications/passphrase/keys/PassphraseSSHKey.php
··· 9 9 return $key->loadAndValidateFromPHID( 10 10 $phid, 11 11 $viewer, 12 - PassphraseCredentialTypeSSHPrivateKey::PROVIDES_TYPE); 12 + PassphraseSSHPrivateKeyCredentialType::PROVIDES_TYPE); 13 13 } 14 14 15 15 public function getKeyfileEnvelope() { 16 16 $credential = $this->requireCredential(); 17 17 18 - $file_type = PassphraseCredentialTypeSSHPrivateKeyFile::CREDENTIAL_TYPE; 18 + $file_type = PassphraseSSHPrivateKeyFileCredentialType::CREDENTIAL_TYPE; 19 19 if ($credential->getCredentialType() != $file_type) { 20 20 // If the credential does not store a file, write the key text out to a 21 21 // temporary file so we can pass it to `ssh`.
+2
src/applications/paste/application/PhabricatorPasteApplication.php
··· 64 64 return array( 65 65 PasteDefaultViewCapability::CAPABILITY => array( 66 66 'caption' => pht('Default view policy for newly created pastes.'), 67 + 'template' => PhabricatorPastePastePHIDType::TYPECONST, 67 68 ), 68 69 PasteDefaultEditCapability::CAPABILITY => array( 69 70 'caption' => pht('Default edit policy for newly created pastes.'), 71 + 'template' => PhabricatorPastePastePHIDType::TYPECONST, 70 72 ), 71 73 ); 72 74 }
+1 -6
src/applications/paste/controller/PhabricatorPasteEditController.php
··· 167 167 ->setObject($paste) 168 168 ->execute(); 169 169 170 - $form->appendControl( 171 - id(new PhabricatorSpacesControl()) 172 - ->setObject($paste) 173 - ->setValue($v_space) 174 - ->setName('spacePHID')); 175 - 176 170 $form->appendChild( 177 171 id(new AphrontFormPolicyControl()) 178 172 ->setUser($user) ··· 180 174 ->setPolicyObject($paste) 181 175 ->setPolicies($policies) 182 176 ->setValue($v_view_policy) 177 + ->setSpacePHID($v_space) 183 178 ->setName('can_view')); 184 179 185 180 $form->appendChild(
+2 -1
src/applications/paste/storage/PhabricatorPaste.php
··· 38 38 ->setTitle('') 39 39 ->setAuthorPHID($actor->getPHID()) 40 40 ->setViewPolicy($view_policy) 41 - ->setEditPolicy($edit_policy); 41 + ->setEditPolicy($edit_policy) 42 + ->setSpacePHID($actor->getDefaultSpacePHID()); 42 43 } 43 44 44 45 public function getURI() {
+10 -5
src/applications/people/storage/PhabricatorUser.php
··· 118 118 } 119 119 120 120 public function canEstablishWebSessions() { 121 - if (!$this->isUserActivated()) { 122 - return false; 123 - } 124 - 125 121 if ($this->getIsMailingList()) { 126 122 return false; 127 123 } ··· 762 758 // TODO: We might let the user switch which space they're "in" later on; 763 759 // for now just use the global space if one exists. 764 760 765 - $spaces = PhabricatorSpacesNamespaceQuery::getViewerSpaces($this); 761 + // If the viewer has access to the default space, use that. 762 + $spaces = PhabricatorSpacesNamespaceQuery::getViewerActiveSpaces($this); 766 763 foreach ($spaces as $space) { 767 764 if ($space->getIsDefaultNamespace()) { 768 765 return $space->getPHID(); 769 766 } 767 + } 768 + 769 + // Otherwise, use the space with the lowest ID that they have access to. 770 + // This just tends to keep the default stable and predictable over time, 771 + // so adding a new space won't change behavior for users. 772 + if ($spaces) { 773 + $spaces = msort($spaces, 'getID'); 774 + return head($spaces)->getPHID(); 770 775 } 771 776 772 777 return null;
+1 -1
src/applications/phame/skins/PhameSkinSpecification.php
··· 1 1 <?php 2 2 3 - final class PhameSkinSpecification { 3 + final class PhameSkinSpecification extends Phobject { 4 4 5 5 const TYPE_ADVANCED = 'advanced'; 6 6 const TYPE_BASIC = 'basic';
+1
src/applications/phid/PhabricatorObjectHandle.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorObjectHandle 4 + extends Phobject 4 5 implements PhabricatorPolicyInterface { 5 6 6 7 const AVAILABILITY_FULL = 'full';
+1 -1
src/applications/phid/PhabricatorPHIDConstants.php
··· 1 1 <?php 2 2 3 - final class PhabricatorPHIDConstants { 3 + final class PhabricatorPHIDConstants extends Phobject { 4 4 5 5 const PHID_TYPE_UNKNOWN = '????'; 6 6 const PHID_TYPE_MAGIC = '!!!!';
+1 -1
src/applications/phid/handle/view/PhabricatorHandleObjectSelectorDataView.php
··· 1 1 <?php 2 2 3 - final class PhabricatorHandleObjectSelectorDataView { 3 + final class PhabricatorHandleObjectSelectorDataView extends Phobject { 4 4 5 5 private $handle; 6 6
+1 -1
src/applications/phid/query/PhabricatorObjectListQuery.php
··· 1 1 <?php 2 2 3 - final class PhabricatorObjectListQuery { 3 + final class PhabricatorObjectListQuery extends Phobject { 4 4 5 5 private $viewer; 6 6 private $objectList;
+1 -1
src/applications/phid/storage/PhabricatorPHID.php
··· 1 1 <?php 2 2 3 - final class PhabricatorPHID { 3 + final class PhabricatorPHID extends Phobject { 4 4 5 5 protected $phid; 6 6 protected $phidType;
+2 -2
src/applications/phid/type/PhabricatorPHIDType.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorPHIDType { 3 + abstract class PhabricatorPHIDType extends Phobject { 4 4 5 5 final public function getTypeConstant() { 6 6 $class = new ReflectionClass($this); ··· 158 158 * 159 159 * @return dict<string, PhabricatorPHIDType> Map of type constants to types. 160 160 */ 161 - public static function getAllTypes() { 161 + final public static function getAllTypes() { 162 162 static $types; 163 163 if ($types === null) { 164 164 $objects = id(new PhutilSymbolLoader())
+10
src/applications/phid/type/__tests__/PhabricatorPHIDTypeTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorPHIDTypeTestCase extends PhutilTestCase { 4 + 5 + public function testGetAllTypes() { 6 + PhabricatorPHIDType::getAllTypes(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+11 -1
src/applications/phid/view/PHUIHandleView.php
··· 14 14 private $handleList; 15 15 private $handlePHID; 16 16 private $asTag; 17 + private $useShortName; 17 18 18 19 public function setHandleList(PhabricatorHandleList $list) { 19 20 $this->handleList = $list; ··· 30 31 return $this; 31 32 } 32 33 34 + public function setUseShortName($short) { 35 + $this->useShortName = $short; 36 + return $this; 37 + } 38 + 33 39 public function render() { 34 40 $handle = $this->handleList[$this->handlePHID]; 35 41 if ($this->asTag) { 36 42 return $handle->renderTag(); 37 43 } else { 38 - return $handle->renderLink(); 44 + if ($this->useShortName) { 45 + return $handle->renderLink($handle->getName()); 46 + } else { 47 + return $handle->renderLink(); 48 + } 39 49 } 40 50 } 41 51
+6 -2
src/applications/pholio/application/PhabricatorPholioApplication.php
··· 71 71 72 72 protected function getCustomCapabilities() { 73 73 return array( 74 - PholioDefaultViewCapability::CAPABILITY => array(), 75 - PholioDefaultEditCapability::CAPABILITY => array(), 74 + PholioDefaultViewCapability::CAPABILITY => array( 75 + 'template' => PholioMockPHIDType::TYPECONST, 76 + ), 77 + PholioDefaultEditCapability::CAPABILITY => array( 78 + 'template' => PholioMockPHIDType::TYPECONST, 79 + ), 76 80 ); 77 81 } 78 82
+5
src/applications/pholio/controller/PholioMockEditController.php
··· 65 65 $v_edit = $mock->getEditPolicy(); 66 66 $v_cc = PhabricatorSubscribersQuery::loadSubscribersForPHID( 67 67 $mock->getPHID()); 68 + $v_space = $mock->getSpacePHID(); 68 69 69 70 if ($request->isFormPost()) { 70 71 $xactions = array(); ··· 75 76 $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; 76 77 $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; 77 78 $type_cc = PhabricatorTransactions::TYPE_SUBSCRIBERS; 79 + $type_space = PhabricatorTransactions::TYPE_SPACE; 78 80 79 81 $v_name = $request->getStr('name'); 80 82 $v_desc = $request->getStr('description'); ··· 83 85 $v_edit = $request->getStr('can_edit'); 84 86 $v_cc = $request->getArr('cc'); 85 87 $v_projects = $request->getArr('projects'); 88 + $v_space = $request->getStr('spacePHID'); 86 89 87 90 $mock_xactions = array(); 88 91 $mock_xactions[$type_name] = $v_name; ··· 91 94 $mock_xactions[$type_view] = $v_view; 92 95 $mock_xactions[$type_edit] = $v_edit; 93 96 $mock_xactions[$type_cc] = array('=' => $v_cc); 97 + $mock_xactions[$type_space] = $v_space; 94 98 95 99 if (!strlen($request->getStr('name'))) { 96 100 $e_name = pht('Required'); ··· 350 354 ->setCapability(PhabricatorPolicyCapability::CAN_VIEW) 351 355 ->setPolicyObject($mock) 352 356 ->setPolicies($policies) 357 + ->setSpacePHID($v_space) 353 358 ->setName('can_view')) 354 359 ->appendChild( 355 360 id(new AphrontFormPolicyControl())
+3 -6
src/applications/pholio/query/PholioMockSearchEngine.php
··· 83 83 return parent::buildSavedQueryFromBuiltin($query_key); 84 84 } 85 85 86 - protected function getRequiredHandlePHIDsForResultList( 87 - array $mocks, 88 - PhabricatorSavedQuery $query) { 89 - return mpull($mocks, 'getAuthorPHID'); 90 - } 91 - 92 86 protected function renderResultList( 93 87 array $mocks, 94 88 PhabricatorSavedQuery $query, ··· 96 90 assert_instances_of($mocks, 'PholioMock'); 97 91 98 92 $viewer = $this->requireViewer(); 93 + $handles = $viewer->loadHandles(mpull($mocks, 'getAuthorPHID')); 99 94 100 95 $xform = PhabricatorFileTransform::getTransformByKey( 101 96 PhabricatorFileThumbnailTransform::TRANSFORM_PINBOARD); ··· 109 104 110 105 $header = 'M'.$mock->getID().' '.$mock->getName(); 111 106 $item = id(new PHUIPinboardItemView()) 107 + ->setUser($viewer) 112 108 ->setHeader($header) 109 + ->setObject($mock) 113 110 ->setURI('/M'.$mock->getID()) 114 111 ->setImageURI($image_uri) 115 112 ->setImageSize($x, $y)
+3
src/applications/pholio/remarkup/PholioRemarkupRule.php
··· 64 64 PhabricatorObjectHandle $handle, 65 65 $options) { 66 66 67 + $viewer = $this->getEngine()->getConfig('viewer'); 68 + 67 69 $embed_mock = id(new PholioMockEmbedView()) 70 + ->setUser($viewer) 68 71 ->setMock($object); 69 72 70 73 if (strlen($options)) {
+14 -2
src/applications/pholio/storage/PholioMock.php
··· 9 9 PhabricatorFlaggableInterface, 10 10 PhabricatorApplicationTransactionInterface, 11 11 PhabricatorProjectInterface, 12 - PhabricatorDestructibleInterface { 12 + PhabricatorDestructibleInterface, 13 + PhabricatorSpacesInterface { 13 14 14 15 const MARKUP_FIELD_DESCRIPTION = 'markup:description'; 15 16 ··· 26 27 protected $coverPHID; 27 28 protected $mailKey; 28 29 protected $status; 30 + protected $spacePHID; 29 31 30 32 private $images = self::ATTACHABLE; 31 33 private $allImages = self::ATTACHABLE; ··· 46 48 ->attachImages(array()) 47 49 ->setStatus(self::STATUS_OPEN) 48 50 ->setViewPolicy($view_policy) 49 - ->setEditPolicy($edit_policy); 51 + ->setEditPolicy($edit_policy) 52 + ->setSpacePHID($actor->getDefaultSpacePHID()); 50 53 } 51 54 52 55 public function getMonogram() { ··· 307 310 $this->delete(); 308 311 $this->saveTransaction(); 309 312 } 313 + 314 + 315 + /* -( PhabricatorSpacesInterface )----------------------------------------- */ 316 + 317 + 318 + public function getSpacePHID() { 319 + return $this->spacePHID; 320 + } 321 + 310 322 311 323 }
+2
src/applications/pholio/view/PholioMockEmbedView.php
··· 47 47 list($x, $y) = $xform->getTransformedDimensions($thumbfile); 48 48 49 49 $item = id(new PHUIPinboardItemView()) 50 + ->setUser($this->getUser()) 51 + ->setObject($mock) 50 52 ->setHeader($header) 51 53 ->setURI($uri) 52 54 ->setImageURI($thumbnail)
+1 -1
src/applications/phortune/cart/PhortuneCartImplementation.php
··· 1 1 <?php 2 2 3 - abstract class PhortuneCartImplementation { 3 + abstract class PhortuneCartImplementation extends Phobject { 4 4 5 5 /** 6 6 * Load implementations for a given set of carts.
+1 -1
src/applications/phortune/constants/PhortuneConstants.php
··· 1 1 <?php 2 2 3 - abstract class PhortuneConstants {} 3 + abstract class PhortuneConstants extends Phobject {}
+1 -1
src/applications/phortune/product/PhortuneProductImplementation.php
··· 1 1 <?php 2 2 3 - abstract class PhortuneProductImplementation { 3 + abstract class PhortuneProductImplementation extends Phobject { 4 4 5 5 abstract public function loadImplementationsForRefs( 6 6 PhabricatorUser $viewer,
+1 -1
src/applications/phortune/provider/PhortunePaymentProvider.php
··· 3 3 /** 4 4 * @task addmethod Adding Payment Methods 5 5 */ 6 - abstract class PhortunePaymentProvider { 6 + abstract class PhortunePaymentProvider extends Phobject { 7 7 8 8 private $providerConfig; 9 9
+10
src/applications/phortune/provider/__tests__/PhortunePaymentProviderTestCase.php
··· 1 + <?php 2 + 3 + final class PhortunePaymentProviderTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAllProviders() { 6 + PhortunePaymentProvider::getAllProviders(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/phortune/subscription/PhortuneSubscriptionImplementation.php
··· 1 1 <?php 2 2 3 - abstract class PhortuneSubscriptionImplementation { 3 + abstract class PhortuneSubscriptionImplementation extends Phobject { 4 4 5 5 abstract public function loadImplementationsForRefs( 6 6 PhabricatorUser $viewer,
+1 -1
src/applications/phortune/view/PhortuneCreditCardForm.php
··· 1 1 <?php 2 2 3 - final class PhortuneCreditCardForm { 3 + final class PhortuneCreditCardForm extends Phobject { 4 4 5 5 private $formID; 6 6 private $scripts = array();
+1 -1
src/applications/phriction/constants/PhrictionConstants.php
··· 1 1 <?php 2 2 3 - abstract class PhrictionConstants {} 3 + abstract class PhrictionConstants extends Phobject {}
+86
src/applications/policy/__tests__/PhabricatorPolicyDataTestCase.php
··· 150 150 unset($time_b); 151 151 } 152 152 153 + public function testObjectPolicyRuleTaskAuthor() { 154 + $author = $this->generateNewTestUser(); 155 + $viewer = $this->generateNewTestUser(); 156 + 157 + $rule = new ManiphestTaskAuthorPolicyRule(); 158 + 159 + $task = ManiphestTask::initializeNewTask($author); 160 + $task->setViewPolicy($rule->getObjectPolicyFullKey()); 161 + $task->save(); 162 + 163 + $this->assertTrue( 164 + PhabricatorPolicyFilter::hasCapability( 165 + $author, 166 + $task, 167 + PhabricatorPolicyCapability::CAN_VIEW)); 168 + 169 + $this->assertFalse( 170 + PhabricatorPolicyFilter::hasCapability( 171 + $viewer, 172 + $task, 173 + PhabricatorPolicyCapability::CAN_VIEW)); 174 + } 175 + 176 + public function testObjectPolicyRuleThreadMembers() { 177 + $author = $this->generateNewTestUser(); 178 + $viewer = $this->generateNewTestUser(); 179 + 180 + $rule = new ConpherenceThreadMembersPolicyRule(); 181 + 182 + $thread = ConpherenceThread::initializeNewRoom($author); 183 + $thread->setViewPolicy($rule->getObjectPolicyFullKey()); 184 + $thread->save(); 185 + 186 + $this->assertFalse( 187 + PhabricatorPolicyFilter::hasCapability( 188 + $author, 189 + $thread, 190 + PhabricatorPolicyCapability::CAN_VIEW)); 191 + 192 + $this->assertFalse( 193 + PhabricatorPolicyFilter::hasCapability( 194 + $viewer, 195 + $thread, 196 + PhabricatorPolicyCapability::CAN_VIEW)); 197 + 198 + $participant = id(new ConpherenceParticipant()) 199 + ->setParticipantPHID($viewer->getPHID()) 200 + ->setConpherencePHID($thread->getPHID()); 201 + 202 + $thread->attachParticipants(array($viewer->getPHID() => $participant)); 203 + 204 + $this->assertTrue( 205 + PhabricatorPolicyFilter::hasCapability( 206 + $viewer, 207 + $thread, 208 + PhabricatorPolicyCapability::CAN_VIEW)); 209 + } 210 + 211 + public function testObjectPolicyRuleSubscribers() { 212 + $author = $this->generateNewTestUser(); 213 + 214 + $rule = new PhabricatorSubscriptionsSubscribersPolicyRule(); 215 + 216 + $task = ManiphestTask::initializeNewTask($author); 217 + $task->setViewPolicy($rule->getObjectPolicyFullKey()); 218 + $task->save(); 219 + 220 + $this->assertFalse( 221 + PhabricatorPolicyFilter::hasCapability( 222 + $author, 223 + $task, 224 + PhabricatorPolicyCapability::CAN_VIEW)); 225 + 226 + id(new PhabricatorSubscriptionsEditor()) 227 + ->setActor($author) 228 + ->setObject($task) 229 + ->subscribeExplicit(array($author->getPHID())) 230 + ->save(); 231 + 232 + $this->assertTrue( 233 + PhabricatorPolicyFilter::hasCapability( 234 + $author, 235 + $task, 236 + PhabricatorPolicyCapability::CAN_VIEW)); 237 + } 238 + 153 239 }
+1
src/applications/policy/__tests__/PhabricatorPolicyTestObject.php
··· 4 4 * Configurable test object for implementing Policy unit tests. 5 5 */ 6 6 final class PhabricatorPolicyTestObject 7 + extends Phobject 7 8 implements 8 9 PhabricatorPolicyInterface, 9 10 PhabricatorExtendedPolicyInterface {
+9 -1
src/applications/policy/application/PhabricatorPolicyApplication.php
··· 19 19 '/policy/' => array( 20 20 'explain/(?P<phid>[^/]+)/(?P<capability>[^/]+)/' 21 21 => 'PhabricatorPolicyExplainController', 22 - 'edit/(?:(?P<phid>[^/]+)/)?' => 'PhabricatorPolicyEditController', 22 + 'edit/'. 23 + '(?:'. 24 + 'object/(?P<objectPHID>[^/]+)'. 25 + '|'. 26 + 'type/(?P<objectType>[^/]+)'. 27 + '|'. 28 + 'template/(?P<templateType>[^/]+)'. 29 + ')/'. 30 + '(?:(?P<phid>[^/]+)/)?' => 'PhabricatorPolicyEditController', 23 31 ), 24 32 ); 25 33 }
+11
src/applications/policy/capability/__tests__/PhabricatorPolicyCapabilityTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorPolicyCapabilityTestCase 4 + extends PhabricatorTestCase { 5 + 6 + public function testGetCapabilityMap() { 7 + PhabricatorPolicyCapability::getCapabilityMap(); 8 + $this->assertTrue(true); 9 + } 10 + 11 + }
+1 -1
src/applications/policy/constants/PhabricatorPolicyConstants.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorPolicyConstants {} 3 + abstract class PhabricatorPolicyConstants extends Phobject {}
+7 -3
src/applications/policy/constants/PhabricatorPolicyType.php
··· 3 3 final class PhabricatorPolicyType extends PhabricatorPolicyConstants { 4 4 5 5 const TYPE_GLOBAL = 'global'; 6 + const TYPE_OBJECT = 'object'; 6 7 const TYPE_USER = 'user'; 7 8 const TYPE_CUSTOM = 'custom'; 8 9 const TYPE_PROJECT = 'project'; ··· 11 12 public static function getPolicyTypeOrder($type) { 12 13 static $map = array( 13 14 self::TYPE_GLOBAL => 0, 14 - self::TYPE_USER => 1, 15 - self::TYPE_CUSTOM => 2, 16 - self::TYPE_PROJECT => 3, 15 + self::TYPE_OBJECT => 1, 16 + self::TYPE_USER => 2, 17 + self::TYPE_CUSTOM => 3, 18 + self::TYPE_PROJECT => 4, 17 19 self::TYPE_MASKED => 9, 18 20 ); 19 21 return idx($map, $type, 9); ··· 23 25 switch ($type) { 24 26 case self::TYPE_GLOBAL: 25 27 return pht('Basic Policies'); 28 + case self::TYPE_OBJECT: 29 + return pht('Object Policies'); 26 30 case self::TYPE_USER: 27 31 return pht('User Policies'); 28 32 case self::TYPE_CUSTOM:
+38 -2
src/applications/policy/controller/PhabricatorPolicyEditController.php
··· 4 4 extends PhabricatorPolicyController { 5 5 6 6 public function handleRequest(AphrontRequest $request) { 7 - $request = $this->getRequest(); 8 - $viewer = $request->getUser(); 7 + $viewer = $this->getViewer(); 8 + 9 + // TODO: This doesn't do anything yet, but sets up template policies; see 10 + // T6860. 11 + $is_template = false; 12 + 13 + $object_phid = $request->getURIData('objectPHID'); 14 + if ($object_phid) { 15 + $object = id(new PhabricatorObjectQuery()) 16 + ->setViewer($viewer) 17 + ->withPHIDs(array($object_phid)) 18 + ->executeOne(); 19 + if (!$object) { 20 + return new Aphront404Response(); 21 + } 22 + } else { 23 + $object_type = $request->getURIData('objectType'); 24 + if (!$object_type) { 25 + $object_type = $request->getURIData('templateType'); 26 + $is_template = true; 27 + } 28 + 29 + $phid_types = PhabricatorPHIDType::getAllInstalledTypes($viewer); 30 + if (empty($phid_types[$object_type])) { 31 + return new Aphront404Response(); 32 + } 33 + $object = $phid_types[$object_type]->newObject(); 34 + if (!$object) { 35 + return new Aphront404Response(); 36 + } 37 + } 9 38 10 39 $action_options = array( 11 40 PhabricatorPolicy::ACTION_ALLOW => pht('Allow'), ··· 15 44 $rules = id(new PhutilSymbolLoader()) 16 45 ->setAncestorClass('PhabricatorPolicyRule') 17 46 ->loadObjects(); 47 + 48 + foreach ($rules as $key => $rule) { 49 + if (!$rule->canApplyToObject($object)) { 50 + unset($rules[$key]); 51 + } 52 + } 53 + 18 54 $rules = msort($rules, 'getRuleOrder'); 19 55 20 56 $default_rule = array(
+107 -15
src/applications/policy/filter/PhabricatorPolicyFilter.php
··· 1 1 <?php 2 2 3 - final class PhabricatorPolicyFilter { 3 + final class PhabricatorPolicyFilter extends Phobject { 4 4 5 5 private $viewer; 6 6 private $objects; ··· 8 8 private $raisePolicyExceptions; 9 9 private $userProjects; 10 10 private $customPolicies = array(); 11 + private $objectPolicies = array(); 11 12 private $forcedPolicy; 12 13 13 14 public static function mustRetainCapability( ··· 131 132 132 133 $need_projects = array(); 133 134 $need_policies = array(); 135 + $need_objpolicies = array(); 134 136 foreach ($objects as $key => $object) { 135 137 $object_capabilities = $object->getCapabilities(); 136 138 foreach ($capabilities as $capability) { ··· 143 145 } 144 146 145 147 $policy = $this->getObjectPolicy($object, $capability); 148 + 149 + if (PhabricatorPolicyQuery::isObjectPolicy($policy)) { 150 + $need_objpolicies[$policy][] = $object; 151 + continue; 152 + } 153 + 146 154 $type = phid_get_type($policy); 147 155 if ($type == PhabricatorProjectProjectPHIDType::TYPECONST) { 148 156 $need_projects[$policy] = $policy; 157 + continue; 149 158 } 150 159 151 160 if ($type == PhabricatorPolicyPHIDTypePolicy::TYPECONST) { 152 - $need_policies[$policy] = $policy; 161 + $need_policies[$policy][] = $object; 162 + continue; 153 163 } 154 164 } 155 165 } 156 166 167 + if ($need_objpolicies) { 168 + $this->loadObjectPolicies($need_objpolicies); 169 + } 170 + 157 171 if ($need_policies) { 158 - $this->loadCustomPolicies(array_keys($need_policies)); 172 + $this->loadCustomPolicies($need_policies); 159 173 } 160 174 161 175 // If we need projects, check if any of the projects we need are also the ··· 486 500 $this->rejectObject($object, $policy, $capability); 487 501 break; 488 502 default: 503 + if (PhabricatorPolicyQuery::isObjectPolicy($policy)) { 504 + if ($this->checkObjectPolicy($policy, $object)) { 505 + return true; 506 + } else { 507 + $this->rejectObject($object, $policy, $capability); 508 + break; 509 + } 510 + } 511 + 489 512 $type = phid_get_type($policy); 490 513 if ($type == PhabricatorProjectProjectPHIDType::TYPECONST) { 491 514 if (!empty($this->userProjects[$viewer->getPHID()][$policy])) { ··· 500 523 $this->rejectObject($object, $policy, $capability); 501 524 } 502 525 } else if ($type == PhabricatorPolicyPHIDTypePolicy::TYPECONST) { 503 - if ($this->checkCustomPolicy($policy)) { 526 + if ($this->checkCustomPolicy($policy, $object)) { 504 527 return true; 505 528 } else { 506 529 $this->rejectObject($object, $policy, $capability); ··· 573 596 throw $exception; 574 597 } 575 598 576 - private function loadCustomPolicies(array $phids) { 599 + private function loadObjectPolicies(array $map) { 600 + $viewer = $this->viewer; 601 + $viewer_phid = $viewer->getPHID(); 602 + 603 + $rules = PhabricatorPolicyQuery::getObjectPolicyRules(null); 604 + 605 + $results = array(); 606 + foreach ($map as $key => $object_list) { 607 + $rule = idx($rules, $key); 608 + if (!$rule) { 609 + continue; 610 + } 611 + 612 + foreach ($object_list as $object_key => $object) { 613 + if (!$rule->canApplyToObject($object)) { 614 + unset($object_list[$object_key]); 615 + } 616 + } 617 + 618 + $rule->willApplyRules($viewer, array(), $object_list); 619 + $results[$key] = $rule; 620 + } 621 + 622 + $this->objectPolicies[$viewer_phid] = $results; 623 + } 624 + 625 + private function loadCustomPolicies(array $map) { 577 626 $viewer = $this->viewer; 578 627 $viewer_phid = $viewer->getPHID(); 579 628 580 629 $custom_policies = id(new PhabricatorPolicyQuery()) 581 630 ->setViewer($viewer) 582 - ->withPHIDs($phids) 631 + ->withPHIDs(array_keys($map)) 583 632 ->execute(); 584 633 $custom_policies = mpull($custom_policies, null, 'getPHID'); 585 634 586 - 587 635 $classes = array(); 588 636 $values = array(); 589 - foreach ($custom_policies as $policy) { 637 + $objects = array(); 638 + foreach ($custom_policies as $policy_phid => $policy) { 590 639 foreach ($policy->getCustomRuleClasses() as $class) { 591 640 $classes[$class] = $class; 592 641 $values[$class][] = $policy->getCustomRuleValues($class); 642 + 643 + foreach (idx($map, $policy_phid, array()) as $object) { 644 + $objects[$class][] = $object; 645 + } 593 646 } 594 647 } 595 648 596 649 foreach ($classes as $class => $ignored) { 597 - $object = newv($class, array()); 598 - $object->willApplyRules($viewer, array_mergev($values[$class])); 599 - $classes[$class] = $object; 650 + $rule_object = newv($class, array()); 651 + 652 + // Filter out any objects which the rule can't apply to. 653 + $target_objects = idx($objects, $class, array()); 654 + foreach ($target_objects as $key => $target_object) { 655 + if (!$rule_object->canApplyToObject($target_object)) { 656 + unset($target_objects[$key]); 657 + } 658 + } 659 + 660 + $rule_object->willApplyRules( 661 + $viewer, 662 + array_mergev($values[$class]), 663 + $target_objects); 664 + 665 + $classes[$class] = $rule_object; 600 666 } 601 667 602 668 foreach ($custom_policies as $policy) { ··· 610 676 $this->customPolicies[$viewer->getPHID()] += $custom_policies; 611 677 } 612 678 613 - private function checkCustomPolicy($policy_phid) { 679 + private function checkObjectPolicy( 680 + $policy_phid, 681 + PhabricatorPolicyInterface $object) { 682 + $viewer = $this->viewer; 683 + $viewer_phid = $viewer->getPHID(); 684 + 685 + $rule = idx($this->objectPolicies[$viewer_phid], $policy_phid); 686 + if (!$rule) { 687 + return false; 688 + } 689 + 690 + if (!$rule->canApplyToObject($object)) { 691 + return false; 692 + } 693 + 694 + return $rule->applyRule($viewer, null, $object); 695 + } 696 + 697 + private function checkCustomPolicy( 698 + $policy_phid, 699 + PhabricatorPolicyInterface $object) { 700 + 614 701 $viewer = $this->viewer; 615 702 $viewer_phid = $viewer->getPHID(); 616 703 ··· 623 710 $objects = $policy->getRuleObjects(); 624 711 $action = null; 625 712 foreach ($policy->getRules() as $rule) { 626 - $object = idx($objects, idx($rule, 'rule')); 627 - if (!$object) { 713 + $rule_object = idx($objects, idx($rule, 'rule')); 714 + if (!$rule_object) { 628 715 // Reject, this policy has a bogus rule. 629 716 return false; 630 717 } 631 718 719 + if (!$rule_object->canApplyToObject($object)) { 720 + // Reject, this policy rule can't be applied to the given object. 721 + return false; 722 + } 723 + 632 724 // If the user matches this rule, use this action. 633 - if ($object->applyRule($viewer, idx($rule, 'value'))) { 725 + if ($rule_object->applyRule($viewer, idx($rule, 'value'), $object)) { 634 726 $action = idx($rule, 'action'); 635 727 break; 636 728 }
+111 -2
src/applications/policy/query/PhabricatorPolicyQuery.php
··· 6 6 private $object; 7 7 private $phids; 8 8 9 + const OBJECT_POLICY_PREFIX = 'obj.'; 10 + 9 11 public function setObject(PhabricatorPolicyInterface $object) { 10 12 $this->object = $object; 11 13 return $this; ··· 71 73 $results = array(); 72 74 73 75 // First, load global policies. 74 - foreach ($this->getGlobalPolicies() as $phid => $policy) { 76 + foreach (self::getGlobalPolicies() as $phid => $policy) { 77 + if (isset($phids[$phid])) { 78 + $results[$phid] = $policy; 79 + unset($phids[$phid]); 80 + } 81 + } 82 + 83 + // Now, load object policies. 84 + foreach (self::getObjectPolicies($this->object) as $phid => $policy) { 75 85 if (isset($phids[$phid])) { 76 86 $results[$phid] = $policy; 77 87 unset($phids[$phid]); ··· 212 222 // option unless the object already has a "Public" policy. In this case we 213 223 // retain the policy but enforce it as though it was "All Users". 214 224 $show_public = PhabricatorEnv::getEnvConfig('policy.allow-public'); 215 - foreach ($this->getGlobalPolicies() as $phid => $policy) { 225 + foreach (self::getGlobalPolicies() as $phid => $policy) { 216 226 if ($phid == PhabricatorPolicies::POLICY_PUBLIC) { 217 227 if (!$show_public) { 218 228 continue; 219 229 } 220 230 } 231 + $phids[] = $phid; 232 + } 233 + 234 + foreach (self::getObjectPolicies($this->object) as $phid => $policy) { 221 235 $phids[] = $phid; 222 236 } 223 237 ··· 233 247 public function getQueryApplicationClass() { 234 248 return 'PhabricatorPolicyApplication'; 235 249 } 250 + 251 + public static function isSpecialPolicy($identifier) { 252 + if (self::isObjectPolicy($identifier)) { 253 + return true; 254 + } 255 + 256 + if (self::isGlobalPolicy($identifier)) { 257 + return true; 258 + } 259 + 260 + return false; 261 + } 262 + 263 + 264 + /* -( Object Policies )---------------------------------------------------- */ 265 + 266 + 267 + public static function isObjectPolicy($identifier) { 268 + $prefix = self::OBJECT_POLICY_PREFIX; 269 + return !strncmp($identifier, $prefix, strlen($prefix)); 270 + } 271 + 272 + public static function getObjectPolicy($identifier) { 273 + if (!self::isObjectPolicy($identifier)) { 274 + return null; 275 + } 276 + 277 + $policies = self::getObjectPolicies(null); 278 + return idx($policies, $identifier); 279 + } 280 + 281 + public static function getObjectPolicyRule($identifier) { 282 + if (!self::isObjectPolicy($identifier)) { 283 + return null; 284 + } 285 + 286 + $rules = self::getObjectPolicyRules(null); 287 + return idx($rules, $identifier); 288 + } 289 + 290 + public static function getObjectPolicies($object) { 291 + $rule_map = self::getObjectPolicyRules($object); 292 + 293 + $results = array(); 294 + foreach ($rule_map as $key => $rule) { 295 + $results[$key] = id(new PhabricatorPolicy()) 296 + ->setType(PhabricatorPolicyType::TYPE_OBJECT) 297 + ->setPHID($key) 298 + ->setIcon($rule->getObjectPolicyIcon()) 299 + ->setName($rule->getObjectPolicyName()) 300 + ->setShortName($rule->getObjectPolicyShortName()) 301 + ->makeEphemeral(); 302 + } 303 + 304 + return $results; 305 + } 306 + 307 + public static function getObjectPolicyRules($object) { 308 + $rules = id(new PhutilSymbolLoader()) 309 + ->setAncestorClass('PhabricatorPolicyRule') 310 + ->loadObjects(); 311 + 312 + $results = array(); 313 + foreach ($rules as $rule) { 314 + $key = $rule->getObjectPolicyKey(); 315 + if (!$key) { 316 + continue; 317 + } 318 + 319 + $full_key = $rule->getObjectPolicyFullKey(); 320 + if (isset($results[$full_key])) { 321 + throw new Exception( 322 + pht( 323 + 'Two policy rules (of classes "%s" and "%s") define the same '. 324 + 'object policy key ("%s"), but each object policy rule must use '. 325 + 'a unique key.', 326 + get_class($rule), 327 + get_class($results[$full_key]), 328 + $key)); 329 + } 330 + 331 + $results[$full_key] = $rule; 332 + } 333 + 334 + if ($object !== null) { 335 + foreach ($results as $key => $rule) { 336 + if (!$rule->canApplyToObject($object)) { 337 + unset($results[$key]); 338 + } 339 + } 340 + } 341 + 342 + return $results; 343 + } 344 + 236 345 237 346 }
+4 -1
src/applications/policy/rule/PhabricatorAdministratorsPolicyRule.php
··· 6 6 return pht('administrators'); 7 7 } 8 8 9 - public function applyRule(PhabricatorUser $viewer, $value) { 9 + public function applyRule( 10 + PhabricatorUser $viewer, 11 + $value, 12 + PhabricatorPolicyInterface $object) { 10 13 return $viewer->getIsAdmin(); 11 14 } 12 15
+11 -2
src/applications/policy/rule/PhabricatorLegalpadSignaturePolicyRule.php
··· 9 9 return pht('signers of legalpad documents'); 10 10 } 11 11 12 - public function willApplyRules(PhabricatorUser $viewer, array $values) { 12 + public function willApplyRules( 13 + PhabricatorUser $viewer, 14 + array $values, 15 + array $objects) { 16 + 13 17 $values = array_unique(array_filter(array_mergev($values))); 14 18 if (!$values) { 15 19 return; ··· 26 30 $this->signatures = mpull($documents, 'getPHID', 'getPHID'); 27 31 } 28 32 29 - public function applyRule(PhabricatorUser $viewer, $value) { 33 + public function applyRule( 34 + PhabricatorUser $viewer, 35 + $value, 36 + PhabricatorPolicyInterface $object) { 37 + 30 38 foreach ($value as $document_phid) { 31 39 if (!isset($this->signatures[$document_phid])) { 32 40 return false; 33 41 } 34 42 } 43 + 35 44 return true; 36 45 } 37 46
+5 -1
src/applications/policy/rule/PhabricatorLunarPhasePolicyRule.php
··· 11 11 return pht('when the moon'); 12 12 } 13 13 14 - public function applyRule(PhabricatorUser $viewer, $value) { 14 + public function applyRule( 15 + PhabricatorUser $viewer, 16 + $value, 17 + PhabricatorPolicyInterface $object) { 18 + 15 19 $moon = new PhutilLunarPhase(PhabricatorTime::getNow()); 16 20 17 21 switch ($value) {
+120 -3
src/applications/policy/rule/PhabricatorPolicyRule.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorPolicyRule { 3 + /** 4 + * @task objectpolicy Implementing Object Policies 5 + */ 6 + abstract class PhabricatorPolicyRule extends Phobject { 4 7 5 8 const CONTROL_TYPE_TEXT = 'text'; 6 9 const CONTROL_TYPE_SELECT = 'select'; ··· 8 11 const CONTROL_TYPE_NONE = 'none'; 9 12 10 13 abstract public function getRuleDescription(); 11 - abstract public function applyRule(PhabricatorUser $viewer, $value); 14 + abstract public function applyRule( 15 + PhabricatorUser $viewer, 16 + $value, 17 + PhabricatorPolicyInterface $object); 12 18 13 - public function willApplyRules(PhabricatorUser $viewer, array $values) { 19 + public function willApplyRules( 20 + PhabricatorUser $viewer, 21 + array $values, 22 + array $objects) { 14 23 return; 15 24 } 16 25 ··· 20 29 21 30 public function getValueControlTemplate() { 22 31 return null; 32 + } 33 + 34 + /** 35 + * Return `true` if this rule can be applied to the given object. 36 + * 37 + * Some policy rules may only operation on certain kinds of objects. For 38 + * example, a "task author" rule 39 + */ 40 + public function canApplyToObject(PhabricatorPolicyInterface $object) { 41 + return true; 23 42 } 24 43 25 44 protected function getDatasourceTemplate( ··· 75 94 */ 76 95 public function ruleHasEffect($value) { 77 96 return true; 97 + } 98 + 99 + 100 + /* -( Transaction Hints )-------------------------------------------------- */ 101 + 102 + 103 + /** 104 + * Tell policy rules about upcoming transaction effects. 105 + * 106 + * Before transaction effects are applied, we try to stop users from making 107 + * edits which will lock them out of objects. We can't do this perfectly, 108 + * since they can set a policy to "the moon is full" moments before it wanes, 109 + * but we try to prevent as many mistakes as possible. 110 + * 111 + * Some policy rules depend on complex checks against object state which 112 + * we can't set up ahead of time. For example, subscriptions require database 113 + * writes. 114 + * 115 + * In cases like this, instead of doing writes, you can pass a hint about an 116 + * object to a policy rule. The rule can then look for hints and use them in 117 + * rendering a verdict about whether the user will be able to see the object 118 + * or not after applying the policy change. 119 + * 120 + * @param PhabricatorPolicyInterface Object to pass a hint about. 121 + * @param PhabricatorPolicyRule Rule to pass hint to. 122 + * @param wild Hint. 123 + * @return void 124 + */ 125 + public static function passTransactionHintToRule( 126 + PhabricatorPolicyInterface $object, 127 + PhabricatorPolicyRule $rule, 128 + $hint) { 129 + 130 + $cache = PhabricatorCaches::getRequestCache(); 131 + $cache->setKey(self::getObjectPolicyCacheKey($object, $rule), $hint); 132 + } 133 + 134 + protected function getTransactionHint( 135 + PhabricatorPolicyInterface $object) { 136 + 137 + $cache = PhabricatorCaches::getRequestCache(); 138 + return $cache->getKey(self::getObjectPolicyCacheKey($object, $this)); 139 + } 140 + 141 + private static function getObjectPolicyCacheKey( 142 + PhabricatorPolicyInterface $object, 143 + PhabricatorPolicyRule $rule) { 144 + $hash = spl_object_hash($object); 145 + $rule = get_class($rule); 146 + return 'policycache.'.$hash.'.'.$rule; 147 + } 148 + 149 + 150 + /* -( Implementing Object Policies )--------------------------------------- */ 151 + 152 + 153 + /** 154 + * Return a unique string like "maniphest.author" to expose this rule as an 155 + * object policy. 156 + * 157 + * Object policy rules, like "Task Author", are more advanced than basic 158 + * policy rules (like "All Users") but not as powerful as custom rules. 159 + * 160 + * @return string Unique identifier for this rule. 161 + * @task objectpolicy 162 + */ 163 + public function getObjectPolicyKey() { 164 + return null; 165 + } 166 + 167 + public function getObjectPolicyFullKey() { 168 + $key = $this->getObjectPolicyKey(); 169 + 170 + if (!$key) { 171 + throw new Exception( 172 + pht( 173 + 'This policy rule (of class "%s") does not have an associated '. 174 + 'object policy key.', 175 + get_class($this))); 176 + } 177 + 178 + return PhabricatorPolicyQuery::OBJECT_POLICY_PREFIX.$key; 179 + } 180 + 181 + public function getObjectPolicyName() { 182 + throw new PhutilMethodNotImplementedException(); 183 + } 184 + 185 + public function getObjectPolicyShortName() { 186 + return $this->getObjectPolicyName(); 187 + } 188 + 189 + public function getObjectPolicyIcon() { 190 + return 'fa-cube'; 191 + } 192 + 193 + public function getPolicyExplanation() { 194 + throw new PhutilMethodNotImplementedException(); 78 195 } 79 196 80 197 }
+11 -2
src/applications/policy/rule/PhabricatorProjectsPolicyRule.php
··· 8 8 return pht('members of projects'); 9 9 } 10 10 11 - public function willApplyRules(PhabricatorUser $viewer, array $values) { 11 + public function willApplyRules( 12 + PhabricatorUser $viewer, 13 + array $values, 14 + array $objects) { 15 + 12 16 $values = array_unique(array_filter(array_mergev($values))); 13 17 if (!$values) { 14 18 return; ··· 24 28 } 25 29 } 26 30 27 - public function applyRule(PhabricatorUser $viewer, $value) { 31 + public function applyRule( 32 + PhabricatorUser $viewer, 33 + $value, 34 + PhabricatorPolicyInterface $object) { 35 + 28 36 foreach ($value as $project_phid) { 29 37 if (isset($this->memberships[$viewer->getPHID()][$project_phid])) { 30 38 return true; 31 39 } 32 40 } 41 + 33 42 return false; 34 43 } 35 44
+6 -1
src/applications/policy/rule/PhabricatorUsersPolicyRule.php
··· 6 6 return pht('users'); 7 7 } 8 8 9 - public function applyRule(PhabricatorUser $viewer, $value) { 9 + public function applyRule( 10 + PhabricatorUser $viewer, 11 + $value, 12 + PhabricatorPolicyInterface $object) { 13 + 10 14 foreach ($value as $phid) { 11 15 if ($phid == $viewer->getPHID()) { 12 16 return true; 13 17 } 14 18 } 19 + 15 20 return false; 16 21 } 17 22
+19
src/applications/policy/storage/PhabricatorPolicy.php
··· 54 54 return PhabricatorPolicyQuery::getGlobalPolicy($policy_identifier); 55 55 } 56 56 57 + $policy = PhabricatorPolicyQuery::getObjectPolicy($policy_identifier); 58 + if ($policy) { 59 + return $policy; 60 + } 61 + 57 62 if (!$handle) { 58 63 throw new Exception( 59 64 pht( ··· 158 163 return $this->workflow; 159 164 } 160 165 166 + public function setIcon($icon) { 167 + $this->icon = $icon; 168 + return $this; 169 + } 170 + 161 171 public function getIcon() { 172 + if ($this->icon) { 173 + return $this->icon; 174 + } 175 + 162 176 switch ($this->getType()) { 163 177 case PhabricatorPolicyType::TYPE_GLOBAL: 164 178 static $map = array( ··· 203 217 public static function getPolicyExplanation( 204 218 PhabricatorUser $viewer, 205 219 $policy) { 220 + 221 + $rule = PhabricatorPolicyQuery::getObjectPolicyRule($policy); 222 + if ($rule) { 223 + return $rule->getPolicyExplanation(); 224 + } 206 225 207 226 switch ($policy) { 208 227 case PhabricatorPolicies::POLICY_PUBLIC:
+1 -1
src/applications/ponder/constants/PonderConstants.php
··· 1 1 <?php 2 2 3 - abstract class PonderConstants {} 3 + abstract class PonderConstants extends Phobject {}
+3 -3
src/applications/ponder/editor/PonderVoteEditor.php
··· 25 25 public function saveVote() { 26 26 $actor = $this->requireActor(); 27 27 if (!$this->votable) { 28 - throw new Exception(pht('Must set votable before saving vote.')); 28 + throw new PhutilInvalidStateException('setVotable'); 29 29 } 30 30 31 31 $votable = $this->votable; ··· 63 63 64 64 queryfx($conn, 65 65 'UPDATE %T as t 66 - SET t.`voteCount` = t.`voteCount` + %d 67 - WHERE t.`PHID` = %s', 66 + SET t.voteCount = t.voteCount + %d 67 + WHERE t.PHID = %s', 68 68 $votable->getTableName(), 69 69 $delta, 70 70 $votable->getVotablePHID());
+6 -6
src/applications/project/application/PhabricatorProjectApplication.php
··· 119 119 'default' => PhabricatorPolicies::POLICY_ADMIN, 120 120 ), 121 121 ProjectDefaultViewCapability::CAPABILITY => array( 122 - 'caption' => pht( 123 - 'Default view policy for newly created projects.'), 122 + 'caption' => pht('Default view policy for newly created projects.'), 123 + 'template' => PhabricatorProjectProjectPHIDType::TYPECONST, 124 124 ), 125 125 ProjectDefaultEditCapability::CAPABILITY => array( 126 - 'caption' => pht( 127 - 'Default edit policy for newly created projects.'), 126 + 'caption' => pht('Default edit policy for newly created projects.'), 127 + 'template' => PhabricatorProjectProjectPHIDType::TYPECONST, 128 128 ), 129 129 ProjectDefaultJoinCapability::CAPABILITY => array( 130 - 'caption' => pht( 131 - 'Default join policy for newly created projects.'), 130 + 'caption' => pht('Default join policy for newly created projects.'), 131 + 'template' => PhabricatorProjectProjectPHIDType::TYPECONST, 132 132 ), 133 133 ); 134 134 }
+1 -1
src/applications/project/constants/PhabricatorProjectStatus.php
··· 1 1 <?php 2 2 3 - final class PhabricatorProjectStatus { 3 + final class PhabricatorProjectStatus extends Phobject { 4 4 5 5 const STATUS_ACTIVE = 0; 6 6 const STATUS_ARCHIVED = 100;
+2 -1
src/applications/project/controller/PhabricatorProjectProfileController.php
··· 91 91 id(new PhabricatorActionView()) 92 92 ->setName(pht('Edit Details')) 93 93 ->setIcon('fa-pencil') 94 - ->setHref($this->getApplicationURI("details/{$id}/"))); 94 + ->setHref($this->getApplicationURI("details/{$id}/")) 95 + ->setDisabled(!$can_edit)); 95 96 96 97 $view->addAction( 97 98 id(new PhabricatorActionView())
+3 -1
src/applications/project/view/ProjectBoardTaskCard.php
··· 1 1 <?php 2 2 3 - final class ProjectBoardTaskCard { 3 + final class ProjectBoardTaskCard extends Phobject { 4 4 5 5 private $viewer; 6 6 private $task; ··· 49 49 $bar_color = idx($color_map, $task->getPriority(), 'grey'); 50 50 51 51 $card = id(new PHUIObjectItemView()) 52 + ->setObject($task) 53 + ->setUser($this->getViewer()) 52 54 ->setObjectName('T'.$task->getID()) 53 55 ->setHeader($task->getTitle()) 54 56 ->setGrippable($can_edit)
+1 -1
src/applications/releeph/commitfinder/ReleephCommitFinder.php
··· 1 1 <?php 2 2 3 - final class ReleephCommitFinder { 3 + final class ReleephCommitFinder extends Phobject { 4 4 5 5 private $releephProject; 6 6 private $user;
+1 -1
src/applications/releeph/constants/ReleephRequestStatus.php
··· 1 1 <?php 2 2 3 - final class ReleephRequestStatus { 3 + final class ReleephRequestStatus extends Phobject { 4 4 5 5 const STATUS_REQUESTED = 1; 6 6 const STATUS_NEEDS_PICK = 2; // aka approved
+1 -1
src/applications/releeph/differential/DifferentialReleephRequestFieldSpecification.php
··· 16 16 * button.) 17 17 * 18 18 */ 19 - final class DifferentialReleephRequestFieldSpecification { 19 + final class DifferentialReleephRequestFieldSpecification extends Phobject { 20 20 21 21 // TODO: This class is essentially dead right now, see T2222. 22 22
+1 -1
src/applications/releeph/field/selector/ReleephFieldSelector.php
··· 1 1 <?php 2 2 3 - abstract class ReleephFieldSelector { 3 + abstract class ReleephFieldSelector extends Phobject { 4 4 5 5 final public function __construct() { 6 6 // <empty>
+6 -6
src/applications/releeph/view/branch/ReleephBranchTemplate.php
··· 1 1 <?php 2 2 3 - final class ReleephBranchTemplate { 3 + final class ReleephBranchTemplate extends Phobject { 4 4 5 5 const KEY = 'releeph.default-branch-template'; 6 + 7 + private $commitHandle; 8 + private $branchDate = null; 9 + private $projectName; 10 + private $isSymbolic; 6 11 7 12 public static function getDefaultTemplate() { 8 13 return PhabricatorEnv::getEnvConfig(self::KEY); ··· 35 40 } 36 41 return $fake_handle; 37 42 } 38 - 39 - private $commitHandle; 40 - private $branchDate = null; 41 - private $projectName; 42 - private $isSymbolic; 43 43 44 44 public function setCommitHandle(PhabricatorObjectHandle $handle) { 45 45 $this->commitHandle = $handle;
+1 -1
src/applications/repository/constants/PhabricatorRepositoryType.php
··· 1 1 <?php 2 2 3 - final class PhabricatorRepositoryType { 3 + final class PhabricatorRepositoryType extends Phobject { 4 4 5 5 const REPOSITORY_TYPE_GIT = 'git'; 6 6 const REPOSITORY_TYPE_SVN = 'svn';
+1 -1
src/applications/repository/engine/PhabricatorRepositoryCommitRef.php
··· 1 1 <?php 2 2 3 - final class PhabricatorRepositoryCommitRef { 3 + final class PhabricatorRepositoryCommitRef extends Phobject { 4 4 5 5 private $identifier; 6 6 private $epoch;
+1 -1
src/applications/repository/engine/PhabricatorRepositoryEngine.php
··· 4 4 * @task config Configuring Repository Engines 5 5 * @task internal Internals 6 6 */ 7 - abstract class PhabricatorRepositoryEngine { 7 + abstract class PhabricatorRepositoryEngine extends Phobject { 8 8 9 9 private $repository; 10 10 private $verbose;
+1 -1
src/applications/repository/graphcache/PhabricatorRepositoryGraphCache.php
··· 53 53 * @task query Querying the Graph Cache 54 54 * @task cache Cache Internals 55 55 */ 56 - final class PhabricatorRepositoryGraphCache { 56 + final class PhabricatorRepositoryGraphCache extends Phobject { 57 57 58 58 private $rebuiltKeys = array(); 59 59
+2 -2
src/applications/repository/storage/__tests__/PhabricatorRepositoryURITestCase.php
··· 19 19 $http_secret = id(new PassphraseSecret())->setSecretData('quack')->save(); 20 20 21 21 $http_credential = PassphraseCredential::initializeNewCredential($user) 22 - ->setCredentialType(PassphraseCredentialTypePassword::CREDENTIAL_TYPE) 23 - ->setProvidesType(PassphraseCredentialTypePassword::PROVIDES_TYPE) 22 + ->setCredentialType(PassphrasePasswordCredentialType::CREDENTIAL_TYPE) 23 + ->setProvidesType(PassphrasePasswordCredentialType::PROVIDES_TYPE) 24 24 ->setUsername('duck') 25 25 ->setSecretID($http_secret->getID()) 26 26 ->save();
+1 -1
src/applications/search/constants/PhabricatorSearchRelationship.php
··· 1 1 <?php 2 2 3 - final class PhabricatorSearchRelationship { 3 + final class PhabricatorSearchRelationship extends Phobject { 4 4 5 5 const RELATIONSHIP_AUTHOR = 'auth'; 6 6 const RELATIONSHIP_BOOK = 'book';
+4
src/applications/search/engine/PhabricatorApplicationSearchEngine.php
··· 149 149 if ($object instanceof PhabricatorSpacesInterface) { 150 150 if (!empty($map['spacePHIDs'])) { 151 151 $query->withSpacePHIDs($map['spacePHIDs']); 152 + } else { 153 + // If the user doesn't search for objects in specific spaces, we 154 + // default to "all active spaces you have permission to view". 155 + $query->withSpaceIsArchived(false); 152 156 } 153 157 } 154 158
+1 -1
src/applications/search/engine/PhabricatorJumpNavHandler.php
··· 1 1 <?php 2 2 3 - final class PhabricatorJumpNavHandler { 3 + final class PhabricatorJumpNavHandler extends Phobject { 4 4 5 5 public static function getJumpResponse(PhabricatorUser $viewer, $jump) { 6 6 $jump = trim($jump);
+1 -1
src/applications/search/engine/PhabricatorSearchEngine.php
··· 5 5 * three capabilities: indexing, searching, and reconstruction (this can be 6 6 * stubbed out if an engine can't reasonably do it, it is used for debugging). 7 7 */ 8 - abstract class PhabricatorSearchEngine { 8 + abstract class PhabricatorSearchEngine extends Phobject { 9 9 10 10 /* -( Engine Metadata )---------------------------------------------------- */ 11 11
+11
src/applications/search/engine/__tests__/PhabricatorApplicationSearchEngineTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorApplicationSearchEngineTestCase 4 + extends PhabricatorTestCase { 5 + 6 + public function testGetAllEngines() { 7 + PhabricatorApplicationSearchEngine::getAllEngines(); 8 + $this->assertTrue(true); 9 + } 10 + 11 + }
+10
src/applications/search/engine/__tests__/PhabricatorSearchEngineTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorSearchEngineTestCase extends PhabricatorTestCase { 4 + 5 + public function testLoadAllEngines() { 6 + PhabricatorSearchEngine::loadAllEngines(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/applications/search/index/PhabricatorSearchAbstractDocument.php
··· 1 1 <?php 2 2 3 - final class PhabricatorSearchAbstractDocument { 3 + final class PhabricatorSearchAbstractDocument extends Phobject { 4 4 5 5 private $phid; 6 6 private $documentType;
+1 -1
src/applications/search/index/PhabricatorSearchIndexer.php
··· 1 1 <?php 2 2 3 - final class PhabricatorSearchIndexer { 3 + final class PhabricatorSearchIndexer extends Phobject { 4 4 5 5 public function queueDocumentForIndexing($phid, $context = null) { 6 6 PhabricatorWorker::scheduleTask(
+5 -14
src/applications/settings/panel/PhabricatorDateTimeSettingsPanel.php
··· 58 58 ->setName('timezone') 59 59 ->setOptions($timezone_id_map) 60 60 ->setValue($user->getTimezoneIdentifier())) 61 - ->appendRemarkupInstructions( 62 - pht( 63 - "**Custom Date and Time Formats**\n\n". 64 - "You can specify custom formats which will be used when ". 65 - "rendering dates and times of day. Examples:\n\n". 66 - "| Format | Example | Notes |\n". 67 - "| ------ | -------- | ----- |\n". 68 - "| `g:i A` | 2:34 PM | Default 12-hour time. |\n". 69 - "| `G.i a` | 02.34 pm | Alternate 12-hour time. |\n". 70 - "| `H:i` | 14:34 | 24-hour time. |\n". 71 - "\n\n". 72 - "You can find a [[%s | full reference in the PHP manual]].", 73 - 'http://www.php.net/manual/en/function.date.php')) 74 61 ->appendChild( 75 - id(new AphrontFormTextControl()) 62 + id(new AphrontFormSelectControl()) 76 63 ->setLabel(pht('Time-of-Day Format')) 77 64 ->setName($pref_time) 65 + ->setOptions(array( 66 + 'g:i A' => pht('12-hour (2:34 PM)'), 67 + 'H:i' => pht('24-hour (14:34)'), 68 + )) 78 69 ->setCaption( 79 70 pht('Format used when rendering a time of day.')) 80 71 ->setValue($preferences->getPreference($pref_time)))
+1 -1
src/applications/settings/panel/PhabricatorSettingsPanel.php
··· 13 13 * @task panel Panel Implementation 14 14 * @task internal Internals 15 15 */ 16 - abstract class PhabricatorSettingsPanel { 16 + abstract class PhabricatorSettingsPanel extends Phobject { 17 17 18 18 private $user; 19 19 private $viewer;
+1
src/applications/slowvote/application/PhabricatorSlowvoteApplication.php
··· 64 64 return array( 65 65 PhabricatorSlowvoteDefaultViewCapability::CAPABILITY => array( 66 66 'caption' => pht('Default view policy for new polls.'), 67 + 'template' => PhabricatorSlowvotePollPHIDType::TYPECONST, 67 68 ), 68 69 ); 69 70 }
+13
src/applications/spaces/application/PhabricatorSpacesApplication.php
··· 38 38 return true; 39 39 } 40 40 41 + public function getHelpDocumentationArticles(PhabricatorUser $viewer) { 42 + return array( 43 + array( 44 + 'name' => pht('Spaces User Guide'), 45 + 'href' => PhabricatorEnv::getDoclink('Spaces User Guide'), 46 + ), 47 + ); 48 + } 49 + 41 50 public function getRemarkupRules() { 42 51 return array( 43 52 new PhabricatorSpacesRemarkupRule(), ··· 51 60 '(?:query/(?P<queryKey>[^/]+)/)?' => 'PhabricatorSpacesListController', 52 61 'create/' => 'PhabricatorSpacesEditController', 53 62 'edit/(?:(?P<id>\d+)/)?' => 'PhabricatorSpacesEditController', 63 + '(?P<action>activate|archive)/(?P<id>\d+)/' 64 + => 'PhabricatorSpacesArchiveController', 54 65 ), 55 66 ); 56 67 } ··· 62 73 ), 63 74 PhabricatorSpacesCapabilityDefaultView::CAPABILITY => array( 64 75 'caption' => pht('Default view policy for newly created spaces.'), 76 + 'template' => PhabricatorSpacesNamespacePHIDType::TYPECONST, 65 77 ), 66 78 PhabricatorSpacesCapabilityDefaultEdit::CAPABILITY => array( 67 79 'caption' => pht('Default edit policy for newly created spaces.'), 68 80 'default' => PhabricatorPolicies::POLICY_ADMIN, 81 + 'template' => PhabricatorSpacesNamespacePHIDType::TYPECONST, 69 82 ), 70 83 ); 71 84 }
+76
src/applications/spaces/controller/PhabricatorSpacesArchiveController.php
··· 1 + <?php 2 + 3 + final class PhabricatorSpacesArchiveController 4 + extends PhabricatorSpacesController { 5 + 6 + public function handleRequest(AphrontRequest $request) { 7 + $viewer = $request->getUser(); 8 + 9 + $space = id(new PhabricatorSpacesNamespaceQuery()) 10 + ->setViewer($viewer) 11 + ->withIDs(array($request->getURIData('id'))) 12 + ->requireCapabilities( 13 + array( 14 + PhabricatorPolicyCapability::CAN_VIEW, 15 + PhabricatorPolicyCapability::CAN_EDIT, 16 + )) 17 + ->executeOne(); 18 + if (!$space) { 19 + return new Aphront404Response(); 20 + } 21 + 22 + $is_archive = ($request->getURIData('action') == 'archive'); 23 + $cancel_uri = '/'.$space->getMonogram(); 24 + 25 + if ($request->isFormPost()) { 26 + $type_archive = PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE; 27 + 28 + $xactions = array(); 29 + $xactions[] = id(new PhabricatorSpacesNamespaceTransaction()) 30 + ->setTransactionType($type_archive) 31 + ->setNewValue($is_archive ? 1 : 0); 32 + 33 + $editor = id(new PhabricatorSpacesNamespaceEditor()) 34 + ->setActor($viewer) 35 + ->setContinueOnNoEffect(true) 36 + ->setContinueOnMissingFields(true) 37 + ->setContentSourceFromRequest($request); 38 + 39 + $editor->applyTransactions($space, $xactions); 40 + 41 + return id(new AphrontRedirectResponse())->setURI($cancel_uri); 42 + } 43 + 44 + $body = array(); 45 + if ($is_archive) { 46 + $title = pht('Archive Space: %s', $space->getNamespaceName()); 47 + $body[] = pht( 48 + 'If you archive this Space, you will no longer be able to create '. 49 + 'new objects inside it.'); 50 + $body[] = pht( 51 + 'Existing objects in this Space will be hidden from query results '. 52 + 'by default.'); 53 + $button = pht('Archive Space'); 54 + } else { 55 + $title = pht('Activate Space: %s', $space->getNamespaceName()); 56 + $body[] = pht( 57 + 'If you activate this space, you will be able to create objects '. 58 + 'inside it again.'); 59 + $body[] = pht( 60 + 'Existing objects will no longer be hidden from query results.'); 61 + $button = pht('Activate Space'); 62 + } 63 + 64 + 65 + $dialog = $this->newDialog() 66 + ->setTitle($title) 67 + ->addCancelButton($cancel_uri) 68 + ->addSubmitButton($button); 69 + 70 + foreach ($body as $paragraph) { 71 + $dialog->appendParagraph($paragraph); 72 + } 73 + 74 + return $dialog; 75 + } 76 + }
+12
src/applications/spaces/controller/PhabricatorSpacesEditController.php
··· 54 54 $validation_exception = null; 55 55 $e_name = true; 56 56 $v_name = $space->getNamespaceName(); 57 + $v_desc = $space->getDescription(); 57 58 $v_view = $space->getViewPolicy(); 58 59 $v_edit = $space->getEditPolicy(); 59 60 ··· 62 63 $e_name = null; 63 64 64 65 $v_name = $request->getStr('name'); 66 + $v_desc = $request->getStr('description'); 65 67 $v_view = $request->getStr('viewPolicy'); 66 68 $v_edit = $request->getStr('editPolicy'); 67 69 68 70 $type_name = PhabricatorSpacesNamespaceTransaction::TYPE_NAME; 71 + $type_desc = PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION; 69 72 $type_default = PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT; 70 73 $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; 71 74 $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; ··· 73 76 $xactions[] = id(new PhabricatorSpacesNamespaceTransaction()) 74 77 ->setTransactionType($type_name) 75 78 ->setNewValue($v_name); 79 + 80 + $xactions[] = id(new PhabricatorSpacesNamespaceTransaction()) 81 + ->setTransactionType($type_desc) 82 + ->setNewValue($v_desc); 76 83 77 84 $xactions[] = id(new PhabricatorSpacesNamespaceTransaction()) 78 85 ->setTransactionType($type_view) ··· 128 135 ->setName('name') 129 136 ->setValue($v_name) 130 137 ->setError($e_name)) 138 + ->appendControl( 139 + id(new PhabricatorRemarkupControl()) 140 + ->setLabel(pht('Description')) 141 + ->setName('description') 142 + ->setValue($v_desc)) 131 143 ->appendChild( 132 144 id(new AphrontFormPolicyControl()) 133 145 ->setUser($viewer)
+40
src/applications/spaces/controller/PhabricatorSpacesViewController.php
··· 37 37 ->setHeader($space->getNamespaceName()) 38 38 ->setPolicyObject($space); 39 39 40 + if ($space->getIsArchived()) { 41 + $header->setStatus('fa-ban', 'red', pht('Archived')); 42 + } else { 43 + $header->setStatus('fa-check', 'bluegrey', pht('Active')); 44 + } 45 + 40 46 $box = id(new PHUIObjectBoxView()) 41 47 ->setHeader($header) 42 48 ->addPropertyList($property_list); ··· 74 80 $list->addProperty( 75 81 pht('Editable By'), 76 82 $descriptions[PhabricatorPolicyCapability::CAN_EDIT]); 83 + 84 + $description = $space->getDescription(); 85 + if (strlen($description)) { 86 + $description = PhabricatorMarkupEngine::renderOneObject( 87 + id(new PhabricatorMarkupOneOff())->setContent($description), 88 + 'default', 89 + $viewer); 90 + 91 + $list->addSectionHeader( 92 + pht('Description'), 93 + PHUIPropertyListView::ICON_SUMMARY); 94 + 95 + $list->addTextContent($description); 96 + } 77 97 78 98 return $list; 79 99 } ··· 97 117 ->setHref($this->getApplicationURI('edit/'.$space->getID().'/')) 98 118 ->setWorkflow(!$can_edit) 99 119 ->setDisabled(!$can_edit)); 120 + 121 + $id = $space->getID(); 122 + 123 + if ($space->getIsArchived()) { 124 + $list->addAction( 125 + id(new PhabricatorActionView()) 126 + ->setName(pht('Activate Space')) 127 + ->setIcon('fa-check') 128 + ->setHref($this->getApplicationURI("activate/{$id}/")) 129 + ->setDisabled(!$can_edit) 130 + ->setWorkflow(true)); 131 + } else { 132 + $list->addAction( 133 + id(new PhabricatorActionView()) 134 + ->setName(pht('Archive Space')) 135 + ->setIcon('fa-ban') 136 + ->setHref($this->getApplicationURI("archive/{$id}/")) 137 + ->setDisabled(!$can_edit) 138 + ->setWorkflow(true)); 139 + } 100 140 101 141 return $list; 102 142 }
+35 -1
src/applications/spaces/editor/PhabricatorSpacesNamespaceEditor.php
··· 15 15 $types = parent::getTransactionTypes(); 16 16 17 17 $types[] = PhabricatorSpacesNamespaceTransaction::TYPE_NAME; 18 + $types[] = PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION; 18 19 $types[] = PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT; 20 + $types[] = PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE; 19 21 20 22 $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 21 23 $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; ··· 34 36 return null; 35 37 } 36 38 return $name; 39 + case PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION: 40 + if ($this->getIsNewObject()) { 41 + return null; 42 + } 43 + return $object->getDescription(); 44 + case PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE: 45 + return $object->getIsArchived(); 37 46 case PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT: 38 47 return $object->getIsDefaultNamespace() ? 1 : null; 39 48 case PhabricatorTransactions::TYPE_VIEW_POLICY: ··· 51 60 52 61 switch ($xaction->getTransactionType()) { 53 62 case PhabricatorSpacesNamespaceTransaction::TYPE_NAME: 63 + case PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION: 54 64 case PhabricatorTransactions::TYPE_VIEW_POLICY: 55 65 case PhabricatorTransactions::TYPE_EDIT_POLICY: 56 66 return $xaction->getNewValue(); 67 + case PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE: 68 + return $xaction->getNewValue() ? 1 : 0; 57 69 case PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT: 58 70 return $xaction->getNewValue() ? 1 : null; 59 71 } ··· 71 83 case PhabricatorSpacesNamespaceTransaction::TYPE_NAME: 72 84 $object->setNamespaceName($new); 73 85 return; 86 + case PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION: 87 + $object->setDescription($new); 88 + return; 74 89 case PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT: 75 90 $object->setIsDefaultNamespace($new ? 1 : null); 91 + return; 92 + case PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE: 93 + $object->setIsArchived($new ? 1 : 0); 76 94 return; 77 95 case PhabricatorTransactions::TYPE_VIEW_POLICY: 78 96 $object->setViewPolicy($new); ··· 91 109 92 110 switch ($xaction->getTransactionType()) { 93 111 case PhabricatorSpacesNamespaceTransaction::TYPE_NAME: 112 + case PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION: 94 113 case PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT: 114 + case PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE: 95 115 case PhabricatorTransactions::TYPE_VIEW_POLICY: 96 116 case PhabricatorTransactions::TYPE_EDIT_POLICY: 97 117 return; ··· 117 137 $error = new PhabricatorApplicationTransactionValidationError( 118 138 $type, 119 139 pht('Required'), 120 - pht('Spaces must have a name.'), 140 + pht('Spaces must have a name.'), 121 141 nonempty(last($xactions), null)); 122 142 123 143 $error->setIsMissingFieldError(true); 124 144 $errors[] = $error; 125 145 } 126 146 break; 147 + case PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT: 148 + if (!$this->getIsNewObject()) { 149 + foreach ($xactions as $xaction) { 150 + $errors[] = new PhabricatorApplicationTransactionValidationError( 151 + $type, 152 + pht('Invalid'), 153 + pht( 154 + 'Only the first space created can be the default space, and '. 155 + 'it must remain the default space evermore.'), 156 + $xaction); 157 + } 158 + } 159 + break; 160 + 127 161 } 128 162 129 163 return $errors;
+8 -1
src/applications/spaces/phid/PhabricatorSpacesNamespacePHIDType.php
··· 32 32 33 33 foreach ($handles as $phid => $handle) { 34 34 $namespace = $objects[$phid]; 35 + 35 36 $monogram = $namespace->getMonogram(); 37 + $name = $namespace->getNamespaceName(); 36 38 37 - $handle->setName($namespace->getNamespaceName()); 39 + $handle->setName($name); 40 + $handle->setFullName(pht('%s %s', $monogram, $name)); 38 41 $handle->setURI('/'.$monogram); 42 + 43 + if ($namespace->getIsArchived()) { 44 + $handle->setStatus(PhabricatorObjectHandle::STATUS_CLOSED); 45 + } 39 46 } 40 47 } 41 48
+72 -20
src/applications/spaces/query/PhabricatorSpacesNamespaceQuery.php
··· 9 9 private $ids; 10 10 private $phids; 11 11 private $isDefaultNamespace; 12 + private $isArchived; 12 13 13 14 public function withIDs(array $ids) { 14 15 $this->ids = $ids; ··· 25 26 return $this; 26 27 } 27 28 29 + public function withIsArchived($archived) { 30 + $this->isArchived = $archived; 31 + return $this; 32 + } 33 + 28 34 public function getQueryApplicationClass() { 29 35 return 'PhabricatorSpacesApplication'; 30 36 } 31 37 32 38 protected function loadPage() { 33 - $table = new PhabricatorSpacesNamespace(); 34 - $conn_r = $table->establishConnection('r'); 35 - 36 - $rows = queryfx_all( 37 - $conn_r, 38 - 'SELECT * FROM %T %Q %Q %Q', 39 - $table->getTableName(), 40 - $this->buildWhereClause($conn_r), 41 - $this->buildOrderClause($conn_r), 42 - $this->buildLimitClause($conn_r)); 43 - 44 - return $table->loadAllFromArray($rows); 39 + return $this->loadStandardPage(new PhabricatorSpacesNamespace()); 45 40 } 46 41 47 - protected function buildWhereClause(AphrontDatabaseConnection $conn_r) { 48 - $where = array(); 42 + protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) { 43 + $where = parent::buildWhereClauseParts($conn); 49 44 50 45 if ($this->ids !== null) { 51 46 $where[] = qsprintf( 52 - $conn_r, 47 + $conn, 53 48 'id IN (%Ld)', 54 49 $this->ids); 55 50 } 56 51 57 52 if ($this->phids !== null) { 58 53 $where[] = qsprintf( 59 - $conn_r, 54 + $conn, 60 55 'phid IN (%Ls)', 61 56 $this->phids); 62 57 } ··· 64 59 if ($this->isDefaultNamespace !== null) { 65 60 if ($this->isDefaultNamespace) { 66 61 $where[] = qsprintf( 67 - $conn_r, 62 + $conn, 68 63 'isDefaultNamespace = 1'); 69 64 } else { 70 65 $where[] = qsprintf( 71 - $conn_r, 66 + $conn, 72 67 'isDefaultNamespace IS NULL'); 73 68 } 74 69 } 75 70 76 - $where[] = $this->buildPagingClause($conn_r); 77 - return $this->formatWhereClause($where); 71 + if ($this->isArchived !== null) { 72 + $where[] = qsprintf( 73 + $conn, 74 + 'isArchived = %d', 75 + (int)$this->isArchived); 76 + } 77 + 78 + return $where; 78 79 } 79 80 80 81 public static function destroySpacesCache() { ··· 90 91 return (bool)self::getAllSpaces(); 91 92 } 92 93 94 + public static function getViewerSpacesExist(PhabricatorUser $viewer) { 95 + if (!self::getSpacesExist()) { 96 + return false; 97 + } 98 + 99 + // If the viewer has access to only one space, pretend spaces simply don't 100 + // exist. 101 + $spaces = self::getViewerSpaces($viewer); 102 + return (count($spaces) > 1); 103 + } 104 + 93 105 public static function getAllSpaces() { 94 106 $cache = PhabricatorCaches::getRequestCache(); 95 107 $cache_key = self::KEY_ALL; ··· 144 156 145 157 return $result; 146 158 } 159 + 160 + 161 + public static function getViewerActiveSpaces(PhabricatorUser $viewer) { 162 + $spaces = self::getViewerSpaces($viewer); 163 + 164 + foreach ($spaces as $key => $space) { 165 + if ($space->getIsArchived()) { 166 + unset($spaces[$key]); 167 + } 168 + } 169 + 170 + return $spaces; 171 + } 172 + 173 + public static function getSpaceOptionsForViewer( 174 + PhabricatorUser $viewer, 175 + $space_phid) { 176 + 177 + $viewer_spaces = self::getViewerSpaces($viewer); 178 + 179 + $map = array(); 180 + foreach ($viewer_spaces as $space) { 181 + 182 + // Skip archived spaces, unless the object is already in that space. 183 + if ($space->getIsArchived()) { 184 + if ($space->getPHID() != $space_phid) { 185 + continue; 186 + } 187 + } 188 + 189 + $map[$space->getPHID()] = pht( 190 + 'Space %s: %s', 191 + $space->getMonogram(), 192 + $space->getNamespaceName()); 193 + } 194 + asort($map); 195 + 196 + return $map; 197 + } 198 + 147 199 148 200 /** 149 201 * Get the Space PHID for an object, if one exists.
+26 -10
src/applications/spaces/query/PhabricatorSpacesNamespaceSearchEngine.php
··· 11 11 return pht('Spaces'); 12 12 } 13 13 14 - public function buildSavedQueryFromRequest(AphrontRequest $request) { 15 - $saved = new PhabricatorSavedQuery(); 14 + public function newQuery() { 15 + return new PhabricatorSpacesNamespaceQuery(); 16 + } 16 17 17 - return $saved; 18 + protected function buildCustomSearchFields() { 19 + return array( 20 + id(new PhabricatorSearchThreeStateField()) 21 + ->setLabel(pht('Active')) 22 + ->setKey('active') 23 + ->setOptions( 24 + pht('(Show All)'), 25 + pht('Show Only Active Spaces'), 26 + pht('Hide Active Spaces')), 27 + ); 18 28 } 19 29 20 - public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 21 - $query = id(new PhabricatorSpacesNamespaceQuery()); 30 + protected function buildQueryFromParameters(array $map) { 31 + $query = $this->newQuery(); 32 + 33 + if ($map['active']) { 34 + $query->withIsArchived(!$map['active']); 35 + } 22 36 23 37 return $query; 24 38 } 25 39 26 - public function buildSearchForm( 27 - AphrontFormView $form, 28 - PhabricatorSavedQuery $saved_query) {} 29 - 30 40 protected function getURI($path) { 31 41 return '/spaces/'.$path; 32 42 } 33 43 34 44 protected function getBuiltinQueryNames() { 35 45 $names = array( 46 + 'active' => pht('Active Spaces'), 36 47 'all' => pht('All Spaces'), 37 48 ); 38 49 ··· 40 51 } 41 52 42 53 public function buildSavedQueryFromBuiltin($query_key) { 43 - 44 54 $query = $this->newSavedQuery(); 45 55 $query->setQueryKey($query_key); 46 56 47 57 switch ($query_key) { 58 + case 'active': 59 + return $query->setParameter('active', true); 48 60 case 'all': 49 61 return $query; 50 62 } ··· 70 82 71 83 if ($space->getIsDefaultNamespace()) { 72 84 $item->addIcon('fa-certificate', pht('Default Space')); 85 + } 86 + 87 + if ($space->getIsArchived()) { 88 + $item->setDisabled(true); 73 89 } 74 90 75 91 $list->addItem($item);
+7 -1
src/applications/spaces/storage/PhabricatorSpacesNamespace.php
··· 11 11 protected $viewPolicy; 12 12 protected $editPolicy; 13 13 protected $isDefaultNamespace; 14 + protected $description; 15 + protected $isArchived; 14 16 15 17 public static function initializeNewNamespace(PhabricatorUser $actor) { 16 18 $app = id(new PhabricatorApplicationQuery()) ··· 26 28 return id(new PhabricatorSpacesNamespace()) 27 29 ->setIsDefaultNamespace(null) 28 30 ->setViewPolicy($view_policy) 29 - ->setEditPolicy($edit_policy); 31 + ->setEditPolicy($edit_policy) 32 + ->setDescription('') 33 + ->setIsArchived(0); 30 34 } 31 35 32 36 protected function getConfiguration() { ··· 35 39 self::CONFIG_COLUMN_SCHEMA => array( 36 40 'namespaceName' => 'text255', 37 41 'isDefaultNamespace' => 'bool?', 42 + 'description' => 'text', 43 + 'isArchived' => 'bool', 38 44 ), 39 45 self::CONFIG_KEY_SCHEMA => array( 40 46 'key_default' => array(
+48
src/applications/spaces/storage/PhabricatorSpacesNamespaceTransaction.php
··· 5 5 6 6 const TYPE_NAME = 'spaces:name'; 7 7 const TYPE_DEFAULT = 'spaces:default'; 8 + const TYPE_DESCRIPTION = 'spaces:description'; 9 + const TYPE_ARCHIVE = 'spaces:archive'; 8 10 9 11 public function getApplicationName() { 10 12 return 'spaces'; ··· 18 20 return null; 19 21 } 20 22 23 + public function shouldHide() { 24 + $old = $this->getOldValue(); 25 + 26 + switch ($this->getTransactionType()) { 27 + case self::TYPE_DESCRIPTION: 28 + return ($old === null); 29 + } 30 + 31 + return parent::shouldHide(); 32 + } 33 + 34 + public function hasChangeDetails() { 35 + switch ($this->getTransactionType()) { 36 + case self::TYPE_DESCRIPTION: 37 + return true; 38 + } 39 + 40 + return parent::hasChangeDetails(); 41 + } 42 + 43 + public function getRemarkupBlocks() { 44 + $blocks = parent::getRemarkupBlocks(); 45 + 46 + switch ($this->getTransactionType()) { 47 + case self::TYPE_DESCRIPTION: 48 + $blocks[] = $this->getNewValue(); 49 + break; 50 + } 51 + 52 + return $blocks; 53 + } 54 + 21 55 public function getTitle() { 22 56 $old = $this->getOldValue(); 23 57 $new = $this->getNewValue(); ··· 37 71 $old, 38 72 $new); 39 73 } 74 + case self::TYPE_DESCRIPTION: 75 + return pht( 76 + '%s updated the description for this space.', 77 + $this->renderHandleLink($author_phid)); 40 78 case self::TYPE_DEFAULT: 41 79 return pht( 42 80 '%s made this the default space.', 43 81 $this->renderHandleLink($author_phid)); 82 + case self::TYPE_ARCHIVE: 83 + if ($new) { 84 + return pht( 85 + '%s archived this space.', 86 + $this->renderHandleLink($author_phid)); 87 + } else { 88 + return pht( 89 + '%s activated this space.', 90 + $this->renderHandleLink($author_phid)); 91 + } 44 92 } 45 93 46 94 return parent::getTitle();
+10
src/applications/spaces/storage/PhabricatorSpacesSchemaSpec.php
··· 1 + <?php 2 + 3 + final class PhabricatorSpacesSchemaSpec 4 + extends PhabricatorConfigSchemaSpec { 5 + 6 + public function buildSchemata() { 7 + $this->buildEdgeSchemata(new PhabricatorSpacesNamespace()); 8 + } 9 + 10 + }
+13 -2
src/applications/spaces/typeahead/PhabricatorSpacesNamespaceDatasource.php
··· 21 21 $spaces = $this->executeQuery($query); 22 22 $results = array(); 23 23 foreach ($spaces as $space) { 24 - $results[] = id(new PhabricatorTypeaheadResult()) 25 - ->setName($space->getNamespaceName()) 24 + $full_name = pht( 25 + '%s %s', 26 + $space->getMonogram(), 27 + $space->getNamespaceName()); 28 + 29 + $result = id(new PhabricatorTypeaheadResult()) 30 + ->setName($full_name) 26 31 ->setPHID($space->getPHID()); 32 + 33 + if ($space->getIsArchived()) { 34 + $result->setClosed(pht('Archived')); 35 + } 36 + 37 + $results[] = $result; 27 38 } 28 39 29 40 return $this->filterResultsAgainstTokens($results);
+14 -1
src/applications/spaces/view/PHUISpacesNamespaceContextView.php
··· 21 21 return null; 22 22 } 23 23 24 + // If the viewer can't see spaces, pretend they don't exist. 24 25 $viewer = $this->getUser(); 26 + if (!PhabricatorSpacesNamespaceQuery::getViewerSpacesExist($viewer)) { 27 + return null; 28 + } 29 + 30 + // If this is the default space, don't show a space label. 31 + $default = PhabricatorSpacesNamespaceQuery::getDefaultSpace(); 32 + if ($default) { 33 + if ($default->getPHID() == $space_phid) { 34 + return null; 35 + } 36 + } 37 + 25 38 return phutil_tag( 26 39 'span', 27 40 array( 28 41 'class' => 'spaces-name', 29 42 ), 30 43 array( 31 - $viewer->renderHandle($space_phid), 44 + $viewer->renderHandle($space_phid)->setUseShortName(true), 32 45 ' | ', 33 46 )); 34 47 }
-49
src/applications/spaces/view/PhabricatorSpacesControl.php
··· 1 - <?php 2 - 3 - final class PhabricatorSpacesControl extends AphrontFormControl { 4 - 5 - private $object; 6 - 7 - protected function shouldRender() { 8 - // Render this control only if some Spaces exist. 9 - return PhabricatorSpacesNamespaceQuery::getAllSpaces(); 10 - } 11 - 12 - public function setObject(PhabricatorSpacesInterface $object) { 13 - $this->object = $object; 14 - return $this; 15 - } 16 - 17 - protected function getCustomControlClass() { 18 - return ''; 19 - } 20 - 21 - protected function getOptions() { 22 - $viewer = $this->getUser(); 23 - $viewer_spaces = PhabricatorSpacesNamespaceQuery::getViewerSpaces($viewer); 24 - 25 - $map = mpull($viewer_spaces, 'getNamespaceName', 'getPHID'); 26 - asort($map); 27 - 28 - return $map; 29 - } 30 - 31 - protected function renderInput() { 32 - $viewer = $this->getUser(); 33 - 34 - $this->setLabel(pht('Space')); 35 - 36 - $value = $this->getValue(); 37 - if ($value === null) { 38 - $value = $viewer->getDefaultSpacePHID(); 39 - } 40 - 41 - return AphrontFormSelectControl::renderSelectTag( 42 - $value, 43 - $this->getOptions(), 44 - array( 45 - 'name' => $this->getName(), 46 - )); 47 - } 48 - 49 - }
+121
src/applications/subscriptions/policyrule/PhabricatorSubscriptionsSubscribersPolicyRule.php
··· 1 + <?php 2 + 3 + final class PhabricatorSubscriptionsSubscribersPolicyRule 4 + extends PhabricatorPolicyRule { 5 + 6 + private $subscribed = array(); 7 + private $sourcePHIDs = array(); 8 + 9 + public function getObjectPolicyKey() { 10 + return 'subscriptions.subscribers'; 11 + } 12 + 13 + public function getObjectPolicyName() { 14 + return pht('Subscribers'); 15 + } 16 + 17 + public function getPolicyExplanation() { 18 + return pht('Subscribers can take this action.'); 19 + } 20 + 21 + public function getRuleDescription() { 22 + return pht('subscribers'); 23 + } 24 + 25 + public function canApplyToObject(PhabricatorPolicyInterface $object) { 26 + return ($object instanceof PhabricatorSubscribableInterface); 27 + } 28 + 29 + public function willApplyRules( 30 + PhabricatorUser $viewer, 31 + array $values, 32 + array $objects) { 33 + 34 + // We want to let the user see the object if they're a subscriber or 35 + // a member of any project which is a subscriber. Additionally, because 36 + // subscriber state is complex, we need to read hints passed from 37 + // the TransactionEditor to predict policy state after transactions apply. 38 + 39 + $viewer_phid = $viewer->getPHID(); 40 + if (!$viewer_phid) { 41 + return; 42 + } 43 + 44 + if (empty($this->subscribed[$viewer_phid])) { 45 + $this->subscribed[$viewer_phid] = array(); 46 + } 47 + 48 + // Load the project PHIDs the user is a member of. 49 + if (!isset($this->sourcePHIDs[$viewer_phid])) { 50 + $source_phids = PhabricatorEdgeQuery::loadDestinationPHIDs( 51 + $viewer_phid, 52 + PhabricatorProjectMemberOfProjectEdgeType::EDGECONST); 53 + $source_phids[] = $viewer_phid; 54 + $this->sourcePHIDs[$viewer_phid] = $source_phids; 55 + } 56 + 57 + // Look for transaction hints. 58 + foreach ($objects as $key => $object) { 59 + $cache = $this->getTransactionHint($object); 60 + if ($cache === null) { 61 + // We don't have a hint for this object, so we'll deal with it below. 62 + continue; 63 + } 64 + 65 + // We have a hint, so use that as the source of truth. 66 + unset($objects[$key]); 67 + 68 + foreach ($this->sourcePHIDs[$viewer_phid] as $source_phid) { 69 + if (isset($cache[$source_phid])) { 70 + $this->subscribed[$viewer_phid][$object->getPHID()] = true; 71 + break; 72 + } 73 + } 74 + } 75 + 76 + $phids = mpull($objects, 'getPHID'); 77 + if (!$phids) { 78 + return; 79 + } 80 + 81 + $edge_query = id(new PhabricatorEdgeQuery()) 82 + ->withSourcePHIDs($this->sourcePHIDs[$viewer_phid]) 83 + ->withEdgeTypes( 84 + array( 85 + PhabricatorSubscribedToObjectEdgeType::EDGECONST, 86 + )) 87 + ->withDestinationPHIDs($phids); 88 + 89 + $edge_query->execute(); 90 + 91 + $subscribed = $edge_query->getDestinationPHIDs(); 92 + if (!$subscribed) { 93 + return; 94 + } 95 + 96 + $this->subscribed[$viewer_phid] += array_fill_keys($subscribed, true); 97 + } 98 + 99 + public function applyRule( 100 + PhabricatorUser $viewer, 101 + $value, 102 + PhabricatorPolicyInterface $object) { 103 + 104 + $viewer_phid = $viewer->getPHID(); 105 + if (!$viewer_phid) { 106 + return false; 107 + } 108 + 109 + if ($object->isAutomaticallySubscribed($viewer_phid)) { 110 + return true; 111 + } 112 + 113 + $subscribed = idx($this->subscribed, $viewer_phid); 114 + return isset($subscribed[$object->getPHID()]); 115 + } 116 + 117 + public function getValueControlType() { 118 + return self::CONTROL_TYPE_NONE; 119 + } 120 + 121 + }
+1 -1
src/applications/subscriptions/view/SubscriptionListDialogBuilder.php
··· 1 1 <?php 2 2 3 - final class SubscriptionListDialogBuilder { 3 + final class SubscriptionListDialogBuilder extends Phobject { 4 4 5 5 private $viewer; 6 6 private $handles;
+1 -1
src/applications/subscriptions/view/SubscriptionListStringBuilder.php
··· 1 1 <?php 2 2 3 - final class SubscriptionListStringBuilder { 3 + final class SubscriptionListStringBuilder extends Phobject { 4 4 5 5 private $handles; 6 6 private $objectPHID;
+1 -1
src/applications/system/action/PhabricatorSystemAction.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorSystemAction { 3 + abstract class PhabricatorSystemAction extends Phobject { 4 4 5 5 abstract public function getActionConstant(); 6 6 abstract public function getScoreThreshold();
+1 -1
src/applications/transactions/constants/PhabricatorTransactions.php
··· 1 1 <?php 2 2 3 - final class PhabricatorTransactions { 3 + final class PhabricatorTransactions extends Phobject { 4 4 5 5 const TYPE_COMMENT = 'core:comment'; 6 6 const TYPE_SUBSCRIBERS = 'core:subscribers';
+76 -14
src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
··· 310 310 $space_phid = $default_space->getPHID(); 311 311 } 312 312 } 313 + 313 314 return $space_phid; 314 315 case PhabricatorTransactions::TYPE_EDGE: 315 316 $edge_type = $xaction->getMetadataValue('edge:type'); ··· 360 361 case PhabricatorTransactions::TYPE_SPACE: 361 362 $space_phid = $xaction->getNewValue(); 362 363 if (!strlen($space_phid)) { 363 - // If an install has no Spaces, we might end up with the empty string 364 - // here instead of a strict `null`. Just make this work like callers 365 - // might reasonably expect. 366 - return null; 364 + // If an install has no Spaces or the Spaces controls are not visible 365 + // to the viewer, we might end up with the empty string here instead 366 + // of a strict `null`, because some controller just used `getStr()` 367 + // to read the space PHID from the request. 368 + // Just make this work like callers might reasonably expect so we 369 + // don't need to handle this specially in every EditController. 370 + return $this->getActor()->getDefaultSpacePHID(); 367 371 } else { 368 372 return $space_phid; 369 373 } ··· 840 844 $object->save(); 841 845 } catch (AphrontDuplicateKeyQueryException $ex) { 842 846 $object->killTransaction(); 847 + 848 + // This callback has an opportunity to throw a better exception, 849 + // so execution may end here. 850 + $this->didCatchDuplicateKeyException($object, $xactions, $ex); 851 + 843 852 throw $ex; 844 853 } 845 854 ··· 933 942 $object, 934 943 $herald_xactions); 935 944 936 - $adapter = $this->getHeraldAdapter(); 937 - $this->heraldEmailPHIDs = $adapter->getEmailPHIDs(); 938 - $this->heraldForcedEmailPHIDs = $adapter->getForcedEmailPHIDs(); 939 - 940 945 // Merge the new transactions into the transaction list: we want to 941 946 // send email and publish feed stories about them, too. 942 947 $xactions = array_merge($xactions, $herald_xactions); 943 948 } 949 + 950 + // If Herald did not generate transactions, we may still need to handle 951 + // "Send an Email" rules. 952 + $adapter = $this->getHeraldAdapter(); 953 + $this->heraldEmailPHIDs = $adapter->getEmailPHIDs(); 954 + $this->heraldForcedEmailPHIDs = $adapter->getForcedEmailPHIDs(); 944 955 } 945 956 946 957 $this->didApplyTransactions($xactions); ··· 1013 1024 )); 1014 1025 1015 1026 return $xactions; 1027 + } 1028 + 1029 + protected function didCatchDuplicateKeyException( 1030 + PhabricatorLiskDAO $object, 1031 + array $xactions, 1032 + Exception $ex) { 1033 + return; 1016 1034 } 1017 1035 1018 1036 public function publishTransactions( ··· 2002 2020 $transaction_type) { 2003 2021 $errors = array(); 2004 2022 2005 - $all_spaces = PhabricatorSpacesNamespaceQuery::getAllSpaces(); 2006 - $viewer_spaces = PhabricatorSpacesNamespaceQuery::getViewerSpaces( 2007 - $this->getActor()); 2023 + $actor = $this->getActor(); 2024 + 2025 + $has_spaces = PhabricatorSpacesNamespaceQuery::getViewerSpacesExist($actor); 2026 + $actor_spaces = PhabricatorSpacesNamespaceQuery::getViewerSpaces($actor); 2027 + $active_spaces = PhabricatorSpacesNamespaceQuery::getViewerActiveSpaces( 2028 + $actor); 2008 2029 foreach ($xactions as $xaction) { 2009 2030 $space_phid = $xaction->getNewValue(); 2010 2031 2011 2032 if ($space_phid === null) { 2012 - if (!$all_spaces) { 2033 + if (!$has_spaces) { 2013 2034 // The install doesn't have any spaces, so this is fine. 2014 2035 continue; 2015 2036 } ··· 2026 2047 2027 2048 // If the PHID isn't `null`, it needs to be a valid space that the 2028 2049 // viewer can see. 2029 - if (empty($viewer_spaces[$space_phid])) { 2050 + if (empty($actor_spaces[$space_phid])) { 2030 2051 $errors[] = new PhabricatorApplicationTransactionValidationError( 2031 2052 $transaction_type, 2032 2053 pht('Invalid'), ··· 2034 2055 'You can not shift this object in the selected space, because '. 2035 2056 'the space does not exist or you do not have access to it.'), 2036 2057 $xaction); 2058 + } else if (empty($active_spaces[$space_phid])) { 2059 + 2060 + // It's OK to edit objects in an archived space, so just move on if 2061 + // we aren't adjusting the value. 2062 + $old_space_phid = $this->getTransactionOldValue($object, $xaction); 2063 + if ($space_phid == $old_space_phid) { 2064 + continue; 2065 + } 2066 + 2067 + $errors[] = new PhabricatorApplicationTransactionValidationError( 2068 + $transaction_type, 2069 + pht('Archived'), 2070 + pht( 2071 + 'You can not shift this object into the selected space, because '. 2072 + 'the space is archived. Objects can not be created inside (or '. 2073 + 'moved into) archived spaces.'), 2074 + $xaction); 2037 2075 } 2038 2076 } 2039 2077 ··· 2045 2083 PhabricatorLiskDAO $object, 2046 2084 array $xactions) { 2047 2085 2048 - return clone $object; 2086 + $copy = clone $object; 2087 + 2088 + foreach ($xactions as $xaction) { 2089 + switch ($xaction->getTransactionType()) { 2090 + case PhabricatorTransactions::TYPE_SUBSCRIBERS: 2091 + $clone_xaction = clone $xaction; 2092 + $clone_xaction->setOldValue(array_values($this->subscribers)); 2093 + $clone_xaction->setNewValue( 2094 + $this->getPHIDTransactionNewValue( 2095 + $clone_xaction)); 2096 + 2097 + PhabricatorPolicyRule::passTransactionHintToRule( 2098 + $copy, 2099 + new PhabricatorSubscriptionsSubscribersPolicyRule(), 2100 + array_fuse($clone_xaction->getNewValue())); 2101 + 2102 + break; 2103 + case PhabricatorTransactions::TYPE_SPACE: 2104 + $space_phid = $this->getTransactionNewValue($object, $xaction); 2105 + $copy->setSpacePHID($space_phid); 2106 + break; 2107 + } 2108 + } 2109 + 2110 + return $copy; 2049 2111 } 2050 2112 2051 2113 protected function validateAllTransactions(
+16
src/applications/transactions/replyhandler/PhabricatorApplicationTransactionReplyHandler.php
··· 56 56 final protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 57 57 $viewer = $this->getActor(); 58 58 $object = $this->getMailReceiver(); 59 + $app_email = $this->getApplicationEmail(); 60 + 61 + $is_new = !$object->getID(); 62 + 63 + // If this is a new object which implements the Spaces interface and was 64 + // created by sending mail to an ApplicationEmail address, put the object 65 + // in the same Space the address is in. 66 + if ($is_new) { 67 + if ($object instanceof PhabricatorSpacesInterface) { 68 + if ($app_email) { 69 + $space_phid = PhabricatorSpacesNamespaceQuery::getObjectSpacePHID( 70 + $app_email); 71 + $object->setSpacePHID($space_phid); 72 + } 73 + } 74 + } 59 75 60 76 $body_data = $mail->parseBody(); 61 77 $body = $body_data['body'];
+2 -2
src/applications/transactions/storage/PhabricatorApplicationTransaction.php
··· 243 243 case PhabricatorTransactions::TYPE_EDIT_POLICY: 244 244 case PhabricatorTransactions::TYPE_VIEW_POLICY: 245 245 case PhabricatorTransactions::TYPE_JOIN_POLICY: 246 - if (!PhabricatorPolicyQuery::isGlobalPolicy($old)) { 246 + if (!PhabricatorPolicyQuery::isSpecialPolicy($old)) { 247 247 $phids[] = array($old); 248 248 } 249 - if (!PhabricatorPolicyQuery::isGlobalPolicy($new)) { 249 + if (!PhabricatorPolicyQuery::isSpecialPolicy($new)) { 250 250 $phids[] = array($new); 251 251 } 252 252 break;
+1 -1
src/applications/typeahead/storage/PhabricatorTypeaheadResult.php
··· 1 1 <?php 2 2 3 - final class PhabricatorTypeaheadResult { 3 + final class PhabricatorTypeaheadResult extends Phobject { 4 4 5 5 private $name; 6 6 private $uri;
+1 -1
src/applications/uiexample/examples/PhabricatorUIExample.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorUIExample { 3 + abstract class PhabricatorUIExample extends Phobject { 4 4 5 5 private $request; 6 6
+3 -3
src/applications/xhprof/controller/PhabricatorXHProfSampleListController.php
··· 18 18 19 19 switch ($this->view) { 20 20 case 'sampled': 21 - $clause = '`sampleRate` > 0'; 21 + $clause = 'sampleRate > 0'; 22 22 $show_type = false; 23 23 break; 24 24 case 'my-runs': 25 25 $clause = qsprintf( 26 26 id(new PhabricatorXHProfSample())->establishConnection('r'), 27 - '`sampleRate` = 0 AND `userPHID` = %s', 27 + 'sampleRate = 0 AND userPHID = %s', 28 28 $request->getUser()->getPHID()); 29 29 $show_type = false; 30 30 break; 31 31 case 'manual': 32 - $clause = '`sampleRate` = 0'; 32 + $clause = 'sampleRate = 0'; 33 33 $show_type = false; 34 34 break; 35 35 case 'all':
+2
src/docs/contributor/css_coding_standards.diviner
··· 22 22 Phabricator's preprocessor provides some standard color variables. You can 23 23 reference these with `{$color}`. For example: 24 24 25 + lang=css 25 26 span.critical { 26 27 color: {$red}; 27 28 } ··· 78 79 Since many rules are specific to handheld devices, the `.device` class selects 79 80 either tablets or phones: 80 81 82 + lang=css 81 83 .device { 82 84 /* Phone or tablet (not desktop). */ 83 85 }
+9
src/docs/contributor/php_coding_standards.diviner
··· 67 67 68 68 **if/else:** 69 69 70 + lang=php 70 71 if ($some_variable > 3) { 71 72 // ... 72 73 } else if ($some_variable === null) { ··· 81 82 82 83 **for:** 83 84 85 + lang=php 84 86 for ($ii = 0; $ii < 10; $ii++) { 85 87 // ... 86 88 } ··· 90 92 91 93 **foreach:** 92 94 95 + lang=php 93 96 foreach ($map as $key => $value) { 94 97 // ... 95 98 } 96 99 97 100 **switch:** 98 101 102 + lang=php 99 103 switch ($value) { 100 104 case 1: 101 105 // ... ··· 115 119 116 120 **array literals:** 117 121 122 + lang=php 118 123 $junk = array( 119 124 'nuts', 120 125 'bolts', ··· 126 131 127 132 **operators:** 128 133 134 + lang=php 129 135 $a + $b; // Put spaces around operators. 130 136 $omg.$lol; // Exception: no spaces around string concatenation. 131 137 $arr[] = $element; // Couple [] with the array when appending. ··· 133 139 134 140 **function/method calls:** 135 141 142 + lang=php 136 143 // One line 137 144 eject($cargo); 138 145 ··· 143 150 144 151 **function/method definitions:** 145 152 153 + lang=php 146 154 function example_function($base_value, $additional_value) { 147 155 return $base_value + $additional_value; 148 156 } ··· 157 165 158 166 **class:** 159 167 168 + lang=php 160 169 class Dog extends Animal { 161 170 162 171 const CIRCLES_REQUIRED_TO_LIE_DOWN = 3;
+4 -4
src/docs/contributor/using_oauthserver.diviner
··· 35 35 36 36 = Setup - Creating a Client = 37 37 38 - # Visit https://phabricator.example.com/oauthserver/client/create/ 38 + # Visit {nav Your Local Install > OAuth Server > Create Application} 39 39 # Fill out the form 40 40 # Profit 41 41 42 42 = Obtaining an Authorization Code = 43 43 44 - POST or GET https://phabricator.example.com/oauthserver/auth/ with the 44 + POST or GET `https://phabricator.example.com/oauthserver/auth/` with the 45 45 following parameters: 46 46 47 47 - Required - **client_id** - the id of the newly registered client. ··· 76 76 77 77 = Obtaining an Access Token = 78 78 79 - POST or GET https://phabricator.example.com/oauthserver/token/ 79 + POST or GET `https://phabricator.example.com/oauthserver/token/` 80 80 with the following parameters: 81 81 82 82 - Required - **client_id** - the id of the client ··· 101 101 Simply include a query param with the key of "access_token" and the value 102 102 as the earlier obtained access token. For example: 103 103 104 - https://phabricator.example.com/api/user.whoami?access_token=ykc7ly7vtibj334oga4fnfbuvnwz4ocp 104 + ```https://phabricator.example.com/api/user.whoami?access_token=ykc7ly7vtibj334oga4fnfbuvnwz4ocp``` 105 105 106 106 If the token has expired or is otherwise invalid, the client will receive 107 107 an error indicating as such. In these cases, the client should re-initiate
+163 -135
src/docs/flavor/php_pitfalls.diviner
··· 4 4 This document discusses difficult traps and pitfalls in PHP, and how to avoid, 5 5 work around, or at least understand them. 6 6 7 - = array_merge() in Incredibly Slow When Merging A List of Arrays = 7 + = `array_merge()` in Incredibly Slow When Merging A List of Arrays = 8 8 9 9 If you merge a list of arrays like this: 10 10 11 - COUNTEREXAMPLE 11 + COUNTEREXAMPLE, lang=php 12 12 $result = array(); 13 13 foreach ($list_of_lists as $one_list) { 14 14 $result = array_merge($result, $one_list); ··· 21 21 In a libphutil environment, you can use @{function@libphutil:array_mergev} 22 22 instead. 23 23 24 - = var_export() Hates Baby Animals = 24 + = `var_export()` Hates Baby Animals = 25 25 26 - If you try to var_export() an object that contains recursive references, your 26 + If you try to `var_export()` an object that contains recursive references, your 27 27 program will terminate. You have no chance to intercept or react to this or 28 - otherwise stop it from happening. Avoid var_export() unless you are certain 29 - you have only simple data. You can use print_r() or var_dump() to display 28 + otherwise stop it from happening. Avoid `var_export()` unless you are certain 29 + you have only simple data. You can use `print_r()` or `var_dump()` to display 30 30 complex variables safely. 31 31 32 - = isset(), empty() and Truthiness = 32 + = `isset()`, `empty()` and Truthiness = 33 33 34 34 A value is "truthy" if it evaluates to true in an `if` clause: 35 35 36 + lang=php 36 37 $value = something(); 37 38 if ($value) { 38 39 // Value is truthy. ··· 59 60 60 61 This is wrong because it prevents users from making the comment "0". //THIS 61 62 COMMENT IS TOTALLY AWESOME AND I MAKE IT ALL THE TIME SO YOU HAD BETTER NOT 62 - BREAK IT!!!// A better test is probably strlen(). 63 + BREAK IT!!!// A better test is probably `strlen()`. 63 64 64 65 In addition to truth tests with `if`, PHP has two special truthiness operators 65 - which look like functions but aren't: empty() and isset(). These operators help 66 - deal with undeclared variables. 66 + which look like functions but aren't: `empty()` and `isset()`. These operators 67 + help deal with undeclared variables. 67 68 68 69 In PHP, there are two major cases where you get undeclared variables -- either 69 70 you directly use a variable without declaring it: 70 71 71 - COUNTEREXAMPLE 72 + COUNTEREXAMPLE, lang=php 72 73 function f() { 73 74 if ($not_declared) { 74 75 // ... ··· 84 85 } 85 86 } 86 87 87 - When you do either of these, PHP issues a warning. Avoid these warnings by using 88 - empty() and isset() to do tests that are safe to apply to undeclared variables. 88 + When you do either of these, PHP issues a warning. Avoid these warnings by 89 + using `empty()` and `isset()` to do tests that are safe to apply to undeclared 90 + variables. 89 91 90 - empty() evaluates truthiness exactly opposite of if(). isset() returns true for 91 - everything except null. This is the truth table: 92 + `empty()` evaluates truthiness exactly opposite of `if()`. `isset()` returns 93 + `true` for everything except `null`. This is the truth table: 92 94 93 - VALUE if() empty() isset() 95 + | Value | `if()` | `empty()` | `isset()` | 96 + |-------|--------|-----------|-----------| 97 + | `null` | `false` | `true` | `false` | 98 + | `0` | `false` | `true` | `true` | 99 + | `0.0` | `false` | `true` | `true` | 100 + | `"0"` | `false` | `true` | `true` | 101 + | `""` | `false` | `true` | `true` | 102 + | `false` | `false` | `true` | `true` | 103 + | `array()` | `false` | `true` | `true` | 104 + | Everything else | `true` | `false` | `true` | 94 105 95 - null false true false 96 - 0 false true true 97 - 0.0 false true true 98 - "0" false true true 99 - "" false true true 100 - false false true true 101 - array() false true true 102 - EVERYTHING ELSE true false true 106 + The value of these operators is that they accept undeclared variables and do 107 + not issue a warning. Specifically, if you try to do this you get a warning: 103 108 104 - The value of these operators is that they accept undeclared variables and do not 105 - issue a warning. Specifically, if you try to do this you get a warning: 106 - 107 - COUNTEREXAMPLE 108 - if ($not_previously_declared) { // PHP Notice: Undefined variable! 109 - // ... 110 - } 109 + ```lang=php, COUNTEREXAMPLE 110 + if ($not_previously_declared) { // PHP Notice: Undefined variable! 111 + // ... 112 + } 113 + ``` 111 114 112 115 But these are fine: 113 116 114 - if (empty($not_previously_declared)) { // No notice, returns true. 115 - // ... 116 - } 117 - if (isset($not_previously_declared)) { // No notice, returns false. 118 - // ... 119 - } 117 + ```lang=php 118 + if (empty($not_previously_declared)) { // No notice, returns true. 119 + // ... 120 + } 121 + if (isset($not_previously_declared)) { // No notice, returns false. 122 + // ... 123 + } 124 + ``` 120 125 121 - So, isset() really means is_declared_and_is_set_to_something_other_than_null(). 122 - empty() really means is_falsey_or_is_not_declared(). Thus: 126 + So, `isset()` really means 127 + `is_declared_and_is_set_to_something_other_than_null()`. `empty()` really means 128 + `is_falsey_or_is_not_declared()`. Thus: 123 129 124 - - If a variable is known to exist, test falsiness with if (!$v), not empty(). 125 - In particular, test for empty arrays with if (!$array). There is no reason 126 - to ever use empty() on a declared variable. 127 - - When you use isset() on an array key, like isset($array['key']), it will 128 - evaluate to "false" if the key exists but has the value null! Test for index 129 - existence with array_key_exists(). 130 + - If a variable is known to exist, test falsiness with `if (!$v)`, not 131 + `empty()`. In particular, test for empty arrays with `if (!$array)`. There 132 + is no reason to ever use `empty()` on a declared variable. 133 + - When you use `isset()` on an array key, like `isset($array['key'])`, it 134 + will evaluate to "false" if the key exists but has the value `null`! Test 135 + for index existence with `array_key_exists()`. 130 136 131 - Put another way, use isset() if you want to type "if ($value !== null)" but are 132 - testing something that may not be declared. Use empty() if you want to type 133 - "if (!$value)" but you are testing something that may not be declared. 137 + Put another way, use `isset()` if you want to type `if ($value !== null)` but 138 + are testing something that may not be declared. Use `empty()` if you want to 139 + type `if (!$value)` but you are testing something that may not be declared. 134 140 135 141 = usort(), uksort(), and uasort() are Slow = 136 142 137 143 This family of functions is often extremely slow for large datasets. You should 138 144 avoid them if at all possible. Instead, build an array which contains surrogate 139 145 keys that are naturally sortable with a function that uses native comparison 140 - (e.g., sort(), asort(), ksort(), or natcasesort()). Sort this array instead, and 141 - use it to reorder the original array. 146 + (e.g., `sort()`, `asort()`, `ksort()`, or `natcasesort()`). Sort this array 147 + instead, and use it to reorder the original array. 142 148 143 149 In a libphutil environment, you can often do this easily with 144 150 @{function@libphutil:isort} or @{function@libphutil:msort}. 145 151 146 - = array_intersect() and array_diff() are Also Slow = 152 + = `array_intersect()` and `array_diff()` are Also Slow = 147 153 148 154 These functions are much slower for even moderately large inputs than 149 - array_intersect_key() and array_diff_key(), because they can not make the 155 + `array_intersect_key()` and `array_diff_key()`, because they can not make the 150 156 assumption that their inputs are unique scalars as the `key` varieties can. 151 157 Strongly prefer the `key` varieties. 152 158 153 - = array_uintersect() and array_udiff() are Definitely Slow Too = 159 + = `array_uintersect()` and `array_udiff()` are Definitely Slow Too = 154 160 155 161 These functions have the problems of both the `usort()` family and the 156 162 `array_diff()` family. Avoid them. 157 163 158 - = foreach() Does Not Create Scope = 164 + = `foreach()` Does Not Create Scope = 159 165 160 - Variables survive outside of the scope of foreach(). More problematically, 161 - references survive outside of the scope of foreach(). This code mutates 166 + Variables survive outside of the scope of `foreach()`. More problematically, 167 + references survive outside of the scope of `foreach()`. This code mutates 162 168 `$array` because the reference leaks from the first loop to the second: 163 169 164 - COUNTEREXAMPLE 165 - $array = range(1, 3); 166 - echo implode(',', $array); // Outputs '1,2,3' 167 - foreach ($array as &$value) {} 168 - echo implode(',', $array); // Outputs '1,2,3' 169 - foreach ($array as $value) {} 170 - echo implode(',', $array); // Outputs '1,2,2' 170 + ```lang=php, COUNTEREXAMPLE 171 + $array = range(1, 3); 172 + echo implode(',', $array); // Outputs '1,2,3' 173 + foreach ($array as &$value) {} 174 + echo implode(',', $array); // Outputs '1,2,3' 175 + foreach ($array as $value) {} 176 + echo implode(',', $array); // Outputs '1,2,2' 177 + ``` 171 178 172 179 The easiest way to avoid this is to avoid using foreach-by-reference. If you do 173 180 use it, unset the reference after the loop: 174 181 175 - foreach ($array as &$value) { 176 - // ... 177 - } 178 - unset($value); 179 - 180 - = unserialize() is Incredibly Slow on Large Datasets = 182 + ```lang=php 183 + foreach ($array as &$value) { 184 + // ... 185 + } 186 + unset($value); 187 + ``` 181 188 182 - The performance of unserialize() is nonlinear in the number of zvals you 183 - unserialize, roughly O(N^2). 189 + = `unserialize()` is Incredibly Slow on Large Datasets = 184 190 185 - zvals approximate time 186 - 10000 5ms 187 - 100000 85ms 188 - 1000000 8,000ms 189 - 10000000 72 billion years 191 + The performance of `unserialize()` is nonlinear in the number of zvals you 192 + unserialize, roughly `O(N^2)`. 190 193 194 + | zvals | Approximate time | 195 + |-------|------------------| 196 + | 10000 |5ms | 197 + | 100000 | 85ms | 198 + | 1000000 | 8,000ms | 199 + | 10000000 | 72 billion years | 191 200 192 - = call_user_func() Breaks References = 201 + = `call_user_func()` Breaks References = 193 202 194 - If you use call_use_func() to invoke a function which takes parameters by 203 + If you use `call_use_func()` to invoke a function which takes parameters by 195 204 reference, the variables you pass in will have their references broken and will 196 205 emerge unmodified. That is, if you have a function that takes references: 197 206 198 - function add_one(&$v) { 199 - $v++; 200 - } 207 + ```lang=php 208 + function add_one(&$v) { 209 + $v++; 210 + } 211 + ``` 201 212 202 - ...and you call it with call_user_func(): 213 + ...and you call it with `call_user_func()`: 203 214 204 - COUNTEREXAMPLE 205 - $x = 41; 206 - call_user_func('add_one', $x); 215 + ```lang=php, COUNTEREXAMPLE 216 + $x = 41; 217 + call_user_func('add_one', $x); 218 + ``` 207 219 208 - ...`$x` will not be modified. The solution is to use call_user_func_array() 220 + ...`$x` will not be modified. The solution is to use `call_user_func_array()` 209 221 and wrap the reference in an array: 210 222 211 - $x = 41; 212 - call_user_func_array( 213 - 'add_one', 214 - array(&$x)); // Note '&$x'! 223 + ```lang=php 224 + $x = 41; 225 + call_user_func_array( 226 + 'add_one', 227 + array(&$x)); // Note '&$x'! 228 + ``` 215 229 216 230 This will work as expected. 217 231 218 - = You Can't Throw From __toString() = 232 + = You Can't Throw From `__toString()` = 219 233 220 - If you throw from __toString(), your program will terminate uselessly and you 234 + If you throw from `__toString()`, your program will terminate uselessly and you 221 235 won't get the exception. 222 236 223 237 = An Object Can Have Any Scalar as a Property = 224 238 225 239 Object properties are not limited to legal variable names: 226 240 227 - $property = '!@#$%^&*()'; 228 - $obj->$property = 'zebra'; 229 - echo $obj->$property; // Outputs 'zebra'. 241 + ```lang=php 242 + $property = '!@#$%^&*()'; 243 + $obj->$property = 'zebra'; 244 + echo $obj->$property; // Outputs 'zebra'. 245 + ``` 230 246 231 247 So, don't make assumptions about property names. 232 248 233 - = There is an (object) Cast = 249 + = There is an `(object)` Cast = 234 250 235 251 You can cast a dictionary into an object. 236 252 237 - $obj = (object)array('flavor' => 'coconut'); 238 - echo $obj->flavor; // Outputs 'coconut'. 239 - echo get_class($obj); // Outputs 'stdClass'. 253 + ```lang=php 254 + $obj = (object)array('flavor' => 'coconut'); 255 + echo $obj->flavor; // Outputs 'coconut'. 256 + echo get_class($obj); // Outputs 'stdClass'. 257 + ``` 240 258 241 259 This is occasionally useful, mostly to force an object to become a Javascript 242 - dictionary (vs a list) when passed to json_encode(). 260 + dictionary (vs a list) when passed to `json_encode()`. 243 261 244 - = Invoking "new" With an Argument Vector is Really Hard = 262 + = Invoking `new` With an Argument Vector is Really Hard = 245 263 246 - If you have some `$class_name` and some `$argv` of constructor 247 - arguments and you want to do this: 264 + If you have some `$class_name` and some `$argv` of constructor arguments 265 + and you want to do this: 248 266 249 - new $class_name($argv[0], $argv[1], ...); 267 + ```lang=php 268 + new $class_name($argv[0], $argv[1], ...); 269 + ``` 250 270 251 271 ...you'll probably invent a very interesting, very novel solution that is very 252 272 wrong. In a libphutil environment, solve this problem with 253 - @{function@libphutil:newv}. Elsewhere, copy newv()'s implementation. 273 + @{function@libphutil:newv}. Elsewhere, copy `newv()`'s implementation. 254 274 255 275 = Equality is not Transitive = 256 276 257 277 This isn't terribly surprising since equality isn't transitive in a lot of 258 - languages, but the == operator is not transitive: 278 + languages, but the `==` operator is not transitive: 259 279 260 - $a = ''; $b = 0; $c = '0a'; 261 - $a == $b; // true 262 - $b == $c; // true 263 - $c == $a; // false! 280 + ```lang=php 281 + $a = ''; $b = 0; $c = '0a'; 282 + $a == $b; // true 283 + $b == $c; // true 284 + $c == $a; // false! 285 + ``` 264 286 265 287 When either operand is an integer, the other operand is cast to an integer 266 - before comparison. Avoid this and similar pitfalls by using the === operator, 288 + before comparison. Avoid this and similar pitfalls by using the `===` operator, 267 289 which is transitive. 268 290 269 291 = All 676 Letters in the Alphabet = 270 292 271 293 This doesn't do what you'd expect it to do in C: 272 294 273 - for ($c = 'a'; $c <= 'z'; $c++) { 274 - // ... 275 - } 295 + ```lang=php 296 + for ($c = 'a'; $c <= 'z'; $c++) { 297 + // ... 298 + } 299 + ``` 276 300 277 - This is because the successor to 'z' is 'aa', which is "less than" 'z'. The 278 - loop will run for ~700 iterations until it reaches 'zz' and terminates. That is, 279 - `$c` will take on these values: 301 + This is because the successor to `z` is `aa`, which is "less than" `z`. 302 + The loop will run for ~700 iterations until it reaches `zz` and terminates. 303 + That is, `$c` will take on these values: 280 304 281 - a 282 - b 283 - ... 284 - y 285 - z 286 - aa // loop continues because 'aa' <= 'z' 287 - ab 288 - ... 289 - mf 290 - mg 291 - ... 292 - zw 293 - zx 294 - zy 295 - zz // loop now terminates because 'zz' > 'z' 305 + ``` 306 + a 307 + b 308 + ... 309 + y 310 + z 311 + aa // loop continues because 'aa' <= 'z' 312 + ab 313 + ... 314 + mf 315 + mg 316 + ... 317 + zw 318 + zx 319 + zy 320 + zz // loop now terminates because 'zz' > 'z' 321 + ``` 296 322 297 323 Instead, use this loop: 298 324 299 - foreach (range('a', 'z') as $c) { 300 - // ... 301 - } 325 + ```lang=php 326 + foreach (range('a', 'z') as $c) { 327 + // ... 328 + } 329 + ```
+169
src/docs/user/userguide/spaces.diviner
··· 1 + @title Spaces User Guide 2 + @group userguide 3 + 4 + Guide to the Spaces application. 5 + 6 + Overview 7 + ======== 8 + 9 + IMPORTANT: Spaces is a prototype application. 10 + 11 + The Spaces application makes it easier to manage large groups of objects which 12 + share the same access policy. For example: 13 + 14 + - An organization might make a Space for a project in order to satisfy a 15 + contractual obligation to limit access, even internally. 16 + - An open source organization might make a Space for work related to 17 + internal governance, to separate private and public discussions. 18 + - A contracting company might make Spaces for clients, to separate them from 19 + one another. 20 + - A company might create a Space for consultants, to give them limited 21 + access to only the resources they need to do their work. 22 + - An ambitious manager might create a Space to hide her team's work from her 23 + enemies at the company, that she might use the element of surprise to later 24 + expand her domain. 25 + 26 + Phabricator's access control policies are generally powerful enough to handle 27 + these use cases on their own, but applying the same policy to a large group 28 + of objects requires a lot of effort and is error-prone. 29 + 30 + Spaces build on top of policies and make it easier and more reliable to 31 + configure, review, and manage groups of objects with similar policies. 32 + 33 + 34 + Creating Spaces 35 + ================= 36 + 37 + Spaces are optional, and are inactive by default. You don't need to configure 38 + them if you don't plan to use them. You can always set them up later. 39 + 40 + To activate Spaces, you need to create at least two spaces. Create spaces from 41 + the web UI, by navigating to {nav Spaces > Create Space}. By default, only 42 + administrators can create new Spaces, but you can configure this in the 43 + {nav Applications} application. 44 + 45 + The first Space you create will be a special "default" Space, and all existing 46 + objects will be shifted into this space as soon as you create it. Spaces you 47 + create later will be normal spaces, and begin with no objects inside them. 48 + 49 + Create the first space (you may want to name it something like "Default" or 50 + "Global" or "Public", depending on the nature of your organization), then 51 + create a second Space. Usually, the second space will be something like 52 + "Secret Plans" and have a more restrictive "Visible To" policy. 53 + 54 + 55 + Using Spaces 56 + ============ 57 + 58 + Once you've created at least two spaces, you can begin using them. 59 + 60 + Application UIs will change for users who can see at least two Spaces, opening 61 + up new controls which let them work with spaces. They will now be able to 62 + choose which space to create new objects into, be able to move objects between 63 + spaces, and be able to search for objects in a specific space or set of spaces. 64 + 65 + In list and detail views, objects will show which space they're in if they're 66 + in a non-default space. 67 + 68 + Users with access to only one space won't see these controls, even if many 69 + spaces exist. This simplifies the UI for users with limited access. 70 + 71 + 72 + Space Policies 73 + ============== 74 + 75 + Briefly, Spaces affect policies like this: 76 + 77 + - Spaces apply their view policy to all objects inside the space. 78 + - Space policies are absolute, and stronger than all other policies. A 79 + user who can not see a Space can **never** see objects inside the space. 80 + - Normal policies are still checked: spaces can only reduce access. 81 + 82 + When you create a Space, you choose a view policy for that space by using the 83 + **Visible To** control. This policy controls both who can see the space, and 84 + who can see objects inside the space. 85 + 86 + Spaces apply their view policy to all objects inside the space: if you can't 87 + see a space, you can never see objects inside it. This policy check is absolute 88 + and stronger than all other policy rules, including policy exceptions. 89 + 90 + For example, a user can never see a task in a space they can't see, even if 91 + they are an admin and the author and owner of the task, and subscribed to the 92 + task and the view and edit policies are set to "All Users", and they created 93 + the Space originally and the moon is full and they are pure of heart and 94 + possessed of the noblest purpose. Spaces are impenetrable. 95 + 96 + Even if a user satisfies the view policy for a space, they must still pass the 97 + view policy on the object: the space check is a new check in addition to any 98 + check on the object, and can only limit access. 99 + 100 + The edit policy for a space only affects the Space itself, and is not applied 101 + to objects inside the space. 102 + 103 + 104 + Archiving Spaces 105 + ================ 106 + 107 + If you no longer need a Space, you can archive it by choosing 108 + {nav Archive Space} from the detail view. This hides the space and all the 109 + objects in it without deleting any data. 110 + 111 + New objects can't be created into archived spaces, and existing objects can't 112 + be shifted into archived spaces. The UI won't give you options to choose 113 + these spaces when creating or editing objects. 114 + 115 + Additionally, objects (like tasks) in archived spaces won't be shown in most 116 + search result lists by default. If you need to find objects in an archived 117 + space, use the `Spaces` constraint to specifically search for objects in that 118 + space. 119 + 120 + You can reactivate a space later by choosing {nav Activate Space}. 121 + 122 + 123 + Application Email 124 + ================= 125 + 126 + After activating Spaces, you can choose a Space when configuring inbound email 127 + addresses in {nav Applications}. 128 + 129 + Spaces affect policies for application email just like they do for other 130 + objects: to see or use the address, you must be able to see the space which 131 + contains it. 132 + 133 + Objects created from inbound email will be created in the Space the email is 134 + associated with. 135 + 136 + 137 + Limitations and Caveats 138 + ======================= 139 + 140 + Some information is shared between spaces, so they do not completely isolate 141 + users from other activity on the install. This section discusses limitations 142 + of the isolation model. Most of these limitations are intrinsic to the policy 143 + model Phabricator uses. 144 + 145 + **Shared IDs**: Spaces do not have unique object IDs: there is only one `T1`, 146 + not a separate one in each space. It can be moved between spaces, but `T1` 147 + always refers to the same object. In most cases, this makes working with 148 + spaces simpler and easier. 149 + 150 + However, because IDs are shared, users in any space can look at object IDs to 151 + determine how many objects exist in other spaces, even if they can't see those 152 + objects. If a user creates a new task and sees that it is `T5000`, they can 153 + know that there are 4,999 other tasks they don't have permission to see. 154 + 155 + **Globally Unique Values**: Some values (like usernames, email addresses, 156 + project hashtags, repository callsigns, and application emails) must be 157 + globally unique. 158 + 159 + As with normal policies, users may be able to determine that a `#yolo` project 160 + exists, even if they can't see it: they can try to create a project using the 161 + `#yolo` hashtag, and will receive an error if it is a duplicate. 162 + 163 + **User Accounts**: Spaces do not apply to users, and can not hide the existence 164 + of user accounts. 165 + 166 + For example, if you are a contracting company and have Coke and Pepsi as 167 + clients, the CEO of Coke and the CEO of Pepsi will each be able to see that the 168 + other has an account on the install, even if all the work you are doing for 169 + them is separated into "Coke" and "Pepsi" spaces.
+1 -1
src/infrastructure/customfield/field/PhabricatorCustomField.php
··· 16 16 * @task globalsearch Integration with Global Search 17 17 * @task herald Integration with Herald 18 18 */ 19 - abstract class PhabricatorCustomField { 19 + abstract class PhabricatorCustomField extends Phobject { 20 20 21 21 private $viewer; 22 22 private $object;
+1 -1
src/infrastructure/customfield/field/PhabricatorCustomFieldAttachment.php
··· 8 8 * Generally, you should not use this class directly. It is used by 9 9 * @{class:PhabricatorCustomField} to manage field storage on objects. 10 10 */ 11 - final class PhabricatorCustomFieldAttachment { 11 + final class PhabricatorCustomFieldAttachment extends Phobject { 12 12 13 13 private $lists = array(); 14 14
+1 -1
src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldCredential.php
··· 24 24 25 25 $all_types = PassphraseCredentialType::getAllProvidesTypes(); 26 26 if (!in_array($provides_type, $all_types)) { 27 - $provides_type = PassphraseCredentialTypePassword::PROVIDES_TYPE; 27 + $provides_type = PassphrasePasswordCredentialType::PROVIDES_TYPE; 28 28 } 29 29 30 30 $credentials = id(new PassphraseCredentialQuery())
+1 -1
src/infrastructure/daemon/bot/PhabricatorBotMessage.php
··· 1 1 <?php 2 2 3 - final class PhabricatorBotMessage { 3 + final class PhabricatorBotMessage extends Phobject { 4 4 5 5 private $sender; 6 6 private $command;
+1 -1
src/infrastructure/daemon/bot/adapter/PhabricatorProtocolAdapter.php
··· 3 3 /** 4 4 * Defines the api for protocol adapters for @{class:PhabricatorBot} 5 5 */ 6 - abstract class PhabricatorProtocolAdapter { 6 + abstract class PhabricatorProtocolAdapter extends Phobject { 7 7 8 8 private $config; 9 9
+1 -1
src/infrastructure/daemon/bot/handler/PhabricatorBotHandler.php
··· 4 4 * Responds to IRC messages. You plug a bunch of these into a 5 5 * @{class:PhabricatorBot} to give it special behavior. 6 6 */ 7 - abstract class PhabricatorBotHandler { 7 + abstract class PhabricatorBotHandler extends Phobject { 8 8 9 9 private $bot; 10 10
+1 -1
src/infrastructure/daemon/bot/target/PhabricatorBotTarget.php
··· 4 4 * Represents something which can be the target of messages, like a user or 5 5 * channel. 6 6 */ 7 - abstract class PhabricatorBotTarget { 7 + abstract class PhabricatorBotTarget extends Phobject { 8 8 9 9 private $name; 10 10
+1 -1
src/infrastructure/daemon/control/PhabricatorDaemonReference.php
··· 1 1 <?php 2 2 3 - final class PhabricatorDaemonReference { 3 + final class PhabricatorDaemonReference extends Phobject { 4 4 5 5 private $name; 6 6 private $argv;
+1 -1
src/infrastructure/daemon/workers/PhabricatorWorker.php
··· 3 3 /** 4 4 * @task config Configuring Retries and Failures 5 5 */ 6 - abstract class PhabricatorWorker { 6 + abstract class PhabricatorWorker extends Phobject { 7 7 8 8 private $data; 9 9 private static $runAllTasksInProcess = false;
+1 -1
src/infrastructure/diff/PhabricatorDifferenceEngine.php
··· 7 7 * @task config Configuring the Engine 8 8 * @task diff Generating Diffs 9 9 */ 10 - final class PhabricatorDifferenceEngine { 10 + final class PhabricatorDifferenceEngine extends Phobject { 11 11 12 12 13 13 private $ignoreWhitespace;
+1 -1
src/infrastructure/edges/constants/PhabricatorEdgeConstants.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorEdgeConstants {} 3 + abstract class PhabricatorEdgeConstants extends Phobject {}
+10
src/infrastructure/edges/type/__tests__/PhabricatorEdgeTypeTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorEdgeTypeTestCase extends PhabricatorTestCase { 4 + 5 + public function testGetAllTypes() { 6 + PhabricatorEdgeType::getAllTypes(); 7 + $this->assertTrue(true); 8 + } 9 + 10 + }
+1 -1
src/infrastructure/env/PhabricatorConfigSource.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorConfigSource { 3 + abstract class PhabricatorConfigSource extends Phobject { 4 4 5 5 private $name; 6 6
+1 -1
src/infrastructure/env/PhabricatorEnv.php
··· 48 48 * @task test Unit Test Support 49 49 * @task internal Internals 50 50 */ 51 - final class PhabricatorEnv { 51 + final class PhabricatorEnv extends Phobject { 52 52 53 53 private static $sourceStack; 54 54 private static $repairSource;
+1 -1
src/infrastructure/env/PhabricatorScopedEnv.php
··· 7 7 * @task internal Internals 8 8 * @task override Overriding Environment Configuration 9 9 */ 10 - final class PhabricatorScopedEnv { 10 + final class PhabricatorScopedEnv extends Phobject { 11 11 12 12 private $key; 13 13 private $isPopped = false;
+1 -1
src/infrastructure/events/PhabricatorEventEngine.php
··· 1 1 <?php 2 2 3 - final class PhabricatorEventEngine { 3 + final class PhabricatorEventEngine extends Phobject { 4 4 5 5 public static function initialize() { 6 6 // NOTE: If any of this fails, we just log it and move on. It's important
+1 -1
src/infrastructure/javelin/Javelin.php
··· 1 1 <?php 2 2 3 - final class Javelin { 3 + final class Javelin extends Phobject { 4 4 5 5 public static function initBehavior( 6 6 $behavior,
+2 -2
src/infrastructure/lint/linter/PhabricatorJavelinLinter.php
··· 20 20 public function getInfoDescription() { 21 21 return pht( 22 22 'This linter is intended for use with the Javelin JS library and '. 23 - 'extensions. Use `javelinsymbols` to run Javelin rules on Javascript '. 24 - 'source files.'); 23 + 'extensions. Use `%s` to run Javelin rules on Javascript source files.', 24 + 'javelinsymbols'); 25 25 } 26 26 27 27 private function getBinaryPath() {
+1 -1
src/infrastructure/log/PhabricatorAccessLog.php
··· 1 1 <?php 2 2 3 - final class PhabricatorAccessLog { 3 + final class PhabricatorAccessLog extends Phobject { 4 4 5 5 private static $log; 6 6
+2 -1
src/infrastructure/markup/PhabricatorMarkupEngine.php
··· 37 37 * @task markup Markup Pipeline 38 38 * @task engine Engine Construction 39 39 */ 40 - final class PhabricatorMarkupEngine { 40 + final class PhabricatorMarkupEngine extends Phobject { 41 41 42 42 private $objects = array(); 43 43 private $viewer; 44 44 private $contextObject; 45 45 private $version = 15; 46 + private $engineCaches = array(); 46 47 47 48 48 49 /* -( Markup Pipeline )---------------------------------------------------- */
+3 -1
src/infrastructure/markup/PhabricatorMarkupOneOff.php
··· 12 12 * This is less efficient than batching rendering, but appropriate for small 13 13 * amounts of one-off text in form instructions. 14 14 */ 15 - final class PhabricatorMarkupOneOff implements PhabricatorMarkupInterface { 15 + final class PhabricatorMarkupOneOff 16 + extends Phobject 17 + implements PhabricatorMarkupInterface { 16 18 17 19 private $content; 18 20 private $preserveLinebreaks;
+1 -1
src/infrastructure/markup/PhabricatorSyntaxHighlighter.php
··· 1 1 <?php 2 2 3 - final class PhabricatorSyntaxHighlighter { 3 + final class PhabricatorSyntaxHighlighter extends Phobject { 4 4 5 5 public static function newEngine() { 6 6 $engine = PhabricatorEnv::newObjectFromConfig('syntax-highlighter.engine');
+3 -1
src/infrastructure/markup/interpreter/PhabricatorRemarkupFigletBlockInterpreter.php
··· 10 10 public function markupContent($content, array $argv) { 11 11 if (!Filesystem::binaryExists('figlet')) { 12 12 return $this->markupError( 13 - pht('Unable to locate the `figlet` binary. Install figlet.')); 13 + pht( 14 + 'Unable to locate the `%s` binary. Install figlet.', 15 + 'figlet')); 14 16 } 15 17 16 18 $font = idx($argv, 'font', 'standard');
+5 -2
src/infrastructure/markup/interpreter/PhabricatorRemarkupGraphvizBlockInterpreter.php
··· 10 10 public function markupContent($content, array $argv) { 11 11 if (!Filesystem::binaryExists('dot')) { 12 12 return $this->markupError( 13 - pht('Unable to locate the `dot` binary. Install Graphviz.')); 13 + pht( 14 + 'Unable to locate the `%s` binary. Install Graphviz.', 15 + 'dot')); 14 16 } 15 17 16 18 $width = $this->parseDimension(idx($argv, 'width')); ··· 24 26 if ($err) { 25 27 return $this->markupError( 26 28 pht( 27 - 'Execution of `dot` failed (#%d), check your syntax: %s', 29 + 'Execution of `%s` failed (#%d), check your syntax: %s', 30 + 'dot', 28 31 $err, 29 32 $stderr)); 30 33 }
+2
src/infrastructure/markup/rule/PhabricatorYoutubeRemarkupRule.php
··· 2 2 3 3 final class PhabricatorYoutubeRemarkupRule extends PhutilRemarkupRule { 4 4 5 + private $uri; 6 + 5 7 public function getPriority() { 6 8 return 350.0; 7 9 }
+1 -1
src/infrastructure/query/PhabricatorQuery.php
··· 3 3 /** 4 4 * @task format Formatting Query Clauses 5 5 */ 6 - abstract class PhabricatorQuery { 6 + abstract class PhabricatorQuery extends Phobject { 7 7 8 8 9 9 abstract public function execute();
+11
src/infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php
··· 25 25 private $edgeLogicConstraints = array(); 26 26 private $edgeLogicConstraintsAreValid = false; 27 27 private $spacePHIDs; 28 + private $spaceIsArchived; 28 29 29 30 protected function getPageCursors(array $page) { 30 31 return array( ··· 1722 1723 return $this; 1723 1724 } 1724 1725 1726 + public function withSpaceIsArchived($archived) { 1727 + $this->spaceIsArchived = $archived; 1728 + return $this; 1729 + } 1730 + 1725 1731 1726 1732 /** 1727 1733 * Constrain the query to include only results in valid Spaces. ··· 1760 1766 $viewer_spaces = PhabricatorSpacesNamespaceQuery::getViewerSpaces( 1761 1767 $viewer); 1762 1768 foreach ($viewer_spaces as $viewer_space) { 1769 + if ($this->spaceIsArchived !== null) { 1770 + if ($viewer_space->getIsArchived() != $this->spaceIsArchived) { 1771 + continue; 1772 + } 1773 + } 1763 1774 $phid = $viewer_space->getPHID(); 1764 1775 $space_phids[$phid] = $phid; 1765 1776 if ($viewer_space->getIsDefaultNamespace()) {
+17 -1
src/infrastructure/query/policy/PhabricatorPolicyAwareQuery.php
··· 338 338 } 339 339 340 340 protected function didRejectResult(PhabricatorPolicyInterface $object) { 341 + // Some objects (like commits) may be rejected because related objects 342 + // (like repositories) can not be loaded. In some cases, we may need these 343 + // related objects to determine the object policy, so it's expected that 344 + // we may occasionally be unable to determine the policy. 345 + 346 + try { 347 + $policy = $object->getPolicy(PhabricatorPolicyCapability::CAN_VIEW); 348 + } catch (Exception $ex) { 349 + $policy = null; 350 + } 351 + 352 + // Mark this object as filtered so handles can render "Restricted" instead 353 + // of "Unknown". 354 + $phid = $object->getPHID(); 355 + $this->addPolicyFilteredPHIDs(array($phid => $phid)); 356 + 341 357 $this->getPolicyFilter()->rejectObject( 342 358 $object, 343 - $object->getPolicy(PhabricatorPolicyCapability::CAN_VIEW), 359 + $policy, 344 360 PhabricatorPolicyCapability::CAN_VIEW); 345 361 } 346 362
+1 -1
src/infrastructure/sms/adapter/PhabricatorSMSImplementationAdapter.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorSMSImplementationAdapter { 3 + abstract class PhabricatorSMSImplementationAdapter extends Phobject { 4 4 5 5 private $fromNumber; 6 6 private $toNumber;
-3
src/infrastructure/storage/configuration/DatabaseConfigurationProvider.php
··· 1 1 <?php 2 2 3 - /** 4 - * @stable 5 - */ 6 3 interface DatabaseConfigurationProvider { 7 4 8 5 public function __construct(
+1
src/infrastructure/storage/configuration/DefaultDatabaseConfigurationProvider.php
··· 1 1 <?php 2 2 3 3 final class DefaultDatabaseConfigurationProvider 4 + extends Phobject 4 5 implements DatabaseConfigurationProvider { 5 6 6 7 private $dao;
+1 -1
src/infrastructure/storage/lisk/LiskDAO.php
··· 162 162 * @task xaction Managing Transactions 163 163 * @task isolate Isolation for Unit Testing 164 164 */ 165 - abstract class LiskDAO { 165 + abstract class LiskDAO extends Phobject { 166 166 167 167 const CONFIG_IDS = 'id-mechanism'; 168 168 const CONFIG_TIMESTAMPS = 'timestamps';
+1 -1
src/infrastructure/storage/lisk/LiskDAOSet.php
··· 20 20 * 'userPHID', 21 21 * 'getPHID'); 22 22 */ 23 - final class LiskDAOSet { 23 + final class LiskDAOSet extends Phobject { 24 24 private $daos = array(); 25 25 private $relatives = array(); 26 26 private $subsets = array();
+1 -1
src/infrastructure/storage/lisk/PhabricatorLiskSerializer.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorLiskSerializer { 3 + abstract class PhabricatorLiskSerializer extends Phobject { 4 4 5 5 abstract public function willReadValue($value); 6 6 abstract public function willWriteValue($value);
+1 -1
src/infrastructure/storage/management/PhabricatorStorageManagementAPI.php
··· 1 1 <?php 2 2 3 - final class PhabricatorStorageManagementAPI { 3 + final class PhabricatorStorageManagementAPI extends Phobject { 4 4 5 5 private $host; 6 6 private $user;
+1 -1
src/infrastructure/storage/management/PhabricatorStoragePatch.php
··· 1 1 <?php 2 2 3 - final class PhabricatorStoragePatch { 3 + final class PhabricatorStoragePatch extends Phobject { 4 4 5 5 private $key; 6 6 private $fullKey;
+1 -1
src/infrastructure/storage/patch/PhabricatorSQLPatchList.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorSQLPatchList { 3 + abstract class PhabricatorSQLPatchList extends Phobject { 4 4 5 5 abstract public function getNamespace(); 6 6 abstract public function getPatches();
+1 -1
src/infrastructure/testing/fixture/PhabricatorStorageFixtureScopeGuard.php
··· 3 3 /** 4 4 * Used by unit tests to build storage fixtures. 5 5 */ 6 - final class PhabricatorStorageFixtureScopeGuard { 6 + final class PhabricatorStorageFixtureScopeGuard extends Phobject { 7 7 8 8 private $name; 9 9
+1 -1
src/infrastructure/time/PhabricatorTime.php
··· 1 1 <?php 2 2 3 - final class PhabricatorTime { 3 + final class PhabricatorTime extends Phobject { 4 4 5 5 private static $stack = array(); 6 6 private static $originalZone;
+1 -1
src/infrastructure/time/PhabricatorTimeGuard.php
··· 1 1 <?php 2 2 3 - final class PhabricatorTimeGuard { 3 + final class PhabricatorTimeGuard extends Phobject { 4 4 5 5 private $frameKey; 6 6
+1 -1
src/infrastructure/util/PhabricatorSlug.php
··· 1 1 <?php 2 2 3 - final class PhabricatorSlug { 3 + final class PhabricatorSlug extends Phobject { 4 4 5 5 public static function normalize($slug) { 6 6 $slug = preg_replace('@/+@', '/', $slug);
+15
src/infrastructure/util/password/__tests__/PhabricatorIteratedMD5PasswordHasherTestCase.php
··· 1 + <?php 2 + 3 + final class PhabricatorIteratedMD5PasswordHasherTestCase 4 + extends PhabricatorTestCase { 5 + 6 + public function testHasher() { 7 + $hasher = new PhabricatorIteratedMD5PasswordHasher(); 8 + 9 + $this->assertEqual( 10 + 'md5:4824a35493d8b5dceab36f017d68425f', 11 + $hasher->getPasswordHashForStorage( 12 + new PhutilOpaqueEnvelope('quack'))->openEnvelope()); 13 + } 14 + 15 + }
+3 -7
src/infrastructure/util/password/__tests__/PhabricatorPasswordHasherTestCase.php
··· 28 28 pht('Fictional hasher unavailable.')); 29 29 } 30 30 31 - public function testMD5Hasher() { 32 - $hasher = new PhabricatorIteratedMD5PasswordHasher(); 33 - 34 - $this->assertEqual( 35 - 'md5:4824a35493d8b5dceab36f017d68425f', 36 - $hasher->getPasswordHashForStorage( 37 - new PhutilOpaqueEnvelope('quack'))->openEnvelope()); 31 + public function testGetAllHashers() { 32 + PhabricatorPasswordHasher::getAllHashers(); 33 + $this->assertTrue(true); 38 34 } 39 35 40 36 }
+1 -1
src/view/control/PhabricatorObjectSelectorDialog.php
··· 1 1 <?php 2 2 3 - final class PhabricatorObjectSelectorDialog { 3 + final class PhabricatorObjectSelectorDialog extends Phobject { 4 4 5 5 private $user; 6 6 private $filters = array();
+94 -1
src/view/form/control/AphrontFormPolicyControl.php
··· 5 5 private $object; 6 6 private $capability; 7 7 private $policies; 8 + private $spacePHID; 9 + private $templatePHIDType; 10 + private $templateObject; 8 11 9 12 public function setPolicyObject(PhabricatorPolicyInterface $object) { 10 13 $this->object = $object; ··· 14 17 public function setPolicies(array $policies) { 15 18 assert_instances_of($policies, 'PhabricatorPolicy'); 16 19 $this->policies = $policies; 20 + return $this; 21 + } 22 + 23 + public function setSpacePHID($space_phid) { 24 + $this->spacePHID = $space_phid; 25 + return $this; 26 + } 27 + 28 + public function getSpacePHID() { 29 + return $this->spacePHID; 30 + } 31 + 32 + public function setTemplatePHIDType($type) { 33 + $this->templatePHIDType = $type; 34 + return $this; 35 + } 36 + 37 + public function setTemplateObject($object) { 38 + $this->templateObject = $object; 17 39 return $this; 18 40 } 19 41 ··· 48 70 49 71 protected function getOptions() { 50 72 $capability = $this->capability; 73 + $policies = $this->policies; 74 + 75 + // Exclude object policies which don't make sense here. This primarily 76 + // filters object policies associated from template capabilities (like 77 + // "Default Task View Policy" being set to "Task Author") so they aren't 78 + // made available on non-template capabilities (like "Can Bulk Edit"). 79 + foreach ($policies as $key => $policy) { 80 + if ($policy->getType() != PhabricatorPolicyType::TYPE_OBJECT) { 81 + continue; 82 + } 83 + 84 + $rule = PhabricatorPolicyQuery::getObjectPolicyRule($policy->getPHID()); 85 + if (!$rule) { 86 + continue; 87 + } 88 + 89 + $target = nonempty($this->templateObject, $this->object); 90 + if (!$rule->canApplyToObject($target)) { 91 + unset($policies[$key]); 92 + continue; 93 + } 94 + } 51 95 52 96 $options = array(); 53 - foreach ($this->policies as $policy) { 97 + foreach ($policies as $policy) { 54 98 if ($policy->getPHID() == PhabricatorPolicies::POLICY_PUBLIC) { 55 99 // Never expose "Public" for capabilities which don't support it. 56 100 $capobj = PhabricatorPolicyCapability::getCapabilityByKey($capability); ··· 58 102 continue; 59 103 } 60 104 } 105 + 61 106 $policy_short_name = id(new PhutilUTF8StringTruncator()) 62 107 ->setMaximumGlyphs(28) 63 108 ->truncateString($policy->getName()); ··· 106 151 $options, 107 152 array( 108 153 PhabricatorPolicyType::TYPE_GLOBAL, 154 + PhabricatorPolicyType::TYPE_OBJECT, 109 155 PhabricatorPolicyType::TYPE_USER, 110 156 PhabricatorPolicyType::TYPE_CUSTOM, 111 157 PhabricatorPolicyType::TYPE_PROJECT, ··· 168 214 } 169 215 170 216 217 + if ($this->templatePHIDType) { 218 + $context_path = 'template/'.$this->templatePHIDType.'/'; 219 + } else { 220 + $object_phid = $this->object->getPHID(); 221 + if ($object_phid) { 222 + $context_path = 'object/'.$object_phid.'/'; 223 + } else { 224 + $object_type = phid_get_type($this->object->generatePHID()); 225 + $context_path = 'type/'.$object_type.'/'; 226 + } 227 + } 228 + 171 229 Javelin::initBehavior( 172 230 'policy-control', 173 231 array( ··· 180 238 'labels' => $labels, 181 239 'value' => $this->getValue(), 182 240 'capability' => $this->capability, 241 + 'editURI' => '/policy/edit/'.$context_path, 183 242 'customPlaceholder' => $this->getCustomPolicyPlaceholder(), 184 243 )); 185 244 ··· 187 246 $selected_icon = idx($selected, 'icon'); 188 247 $selected_name = idx($selected, 'name'); 189 248 249 + $spaces_control = $this->buildSpacesControl(); 250 + 190 251 return phutil_tag( 191 252 'div', 192 253 array( 193 254 ), 194 255 array( 256 + $spaces_control, 195 257 javelin_tag( 196 258 'a', 197 259 array( ··· 229 291 230 292 private function getCustomPolicyPlaceholder() { 231 293 return 'custom:placeholder'; 294 + } 295 + 296 + private function buildSpacesControl() { 297 + if ($this->capability != PhabricatorPolicyCapability::CAN_VIEW) { 298 + return null; 299 + } 300 + 301 + if (!($this->object instanceof PhabricatorSpacesInterface)) { 302 + return null; 303 + } 304 + 305 + $viewer = $this->getUser(); 306 + if (!PhabricatorSpacesNamespaceQuery::getViewerSpacesExist($viewer)) { 307 + return null; 308 + } 309 + 310 + $space_phid = $this->getSpacePHID(); 311 + if ($space_phid === null) { 312 + $space_phid = $viewer->getDefaultSpacePHID(); 313 + } 314 + 315 + $select = AphrontFormSelectControl::renderSelectTag( 316 + $space_phid, 317 + PhabricatorSpacesNamespaceQuery::getSpaceOptionsForViewer( 318 + $viewer, 319 + $space_phid), 320 + array( 321 + 'name' => 'spacePHID', 322 + )); 323 + 324 + return $select; 232 325 } 233 326 234 327 }
+1 -1
src/view/phui/PHUI.php
··· 1 1 <?php 2 2 3 - final class PHUI { 3 + final class PHUI extends Phobject { 4 4 5 5 const MARGIN_SMALL = 'ms'; 6 6 const MARGIN_MEDIUM = 'mm';
+17 -2
src/view/phui/PHUIPinboardItemView.php
··· 7 7 private $header; 8 8 private $iconBlock = array(); 9 9 private $disabled; 10 - 10 + private $object; 11 11 private $imageWidth; 12 12 private $imageHeight; 13 13 ··· 42 42 return $this; 43 43 } 44 44 45 + public function setObject($object) { 46 + $this->object = $object; 47 + return $this; 48 + } 49 + 45 50 public function render() { 46 51 require_celerity_resource('phui-pinboard-view-css'); 47 52 $header = null; ··· 55 60 array( 56 61 'class' => 'phui-pinboard-item-header '.$header_color, 57 62 ), 58 - phutil_tag('a', array('href' => $this->uri), $this->header)); 63 + array( 64 + id(new PHUISpacesNamespaceContextView()) 65 + ->setUser($this->getUser()) 66 + ->setObject($this->object), 67 + phutil_tag( 68 + 'a', 69 + array( 70 + 'href' => $this->uri, 71 + ), 72 + $this->header), 73 + )); 59 74 } 60 75 61 76 $image = null;
+1
webroot/rsrc/js/application/herald/HeraldRuleEditor.js
··· 222 222 case 'taskstatus': 223 223 case 'legaldocuments': 224 224 case 'applicationemail': 225 + case 'space': 225 226 var tokenizer = this._newTokenizer(type); 226 227 input = tokenizer[0]; 227 228 get_fn = tokenizer[1];
+9 -1
webroot/rsrc/js/application/maniphest/behavior-batch-editor.js
··· 24 24 'add_comment': 'Comment', 25 25 'assign': 'Assign', 26 26 'add_ccs' : 'Add CCs', 27 - 'remove_ccs' : 'Remove CCs' 27 + 'remove_ccs' : 'Remove CCs', 28 + 'space': 'Shift to Space' 28 29 }); 29 30 30 31 var proj_tokenizer = build_tokenizer(config.sources.project); 31 32 var owner_tokenizer = build_tokenizer(config.sources.owner); 32 33 var cc_tokenizer = build_tokenizer(config.sources.cc); 34 + var space_tokenizer = build_tokenizer(config.sources.spaces); 33 35 34 36 var priority_select = JX.Prefab.renderSelect(config.priorityMap); 35 37 var status_select = JX.Prefab.renderSelect(config.statusMap); ··· 58 60 JX.DOM.setContent(cell, owner_tokenizer.template); 59 61 vfunc = function() { 60 62 return JX.keys(owner_tokenizer.object.getTokens()); 63 + }; 64 + break; 65 + case 'space': 66 + JX.DOM.setContent(cell, space_tokenizer.template); 67 + vfunc = function() { 68 + return JX.keys(space_tokenizer.object.getTokens()); 61 69 }; 62 70 break; 63 71 case 'add_comment':
+1 -1
webroot/rsrc/js/application/policy/behavior-policy-control.js
··· 101 101 * Get the workflow URI to create or edit a policy with a given PHID. 102 102 */ 103 103 var get_custom_uri = function(phid, capability) { 104 - var uri = '/policy/edit/'; 104 + var uri = config.editURI; 105 105 if (phid != config.customPlaceholder) { 106 106 uri += phid + '/'; 107 107 }