2011-01-16 22:51:39 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
2012-05-30 23:26:29 +02:00
|
|
|
* This file is automatically generated. Use 'arc liberate' to rebuild it.
|
2014-07-17 23:48:54 +02:00
|
|
|
*
|
2011-01-16 22:51:39 +01:00
|
|
|
* @generated
|
2012-05-30 23:26:29 +02:00
|
|
|
* @phutil-library-version 2
|
2011-01-16 22:51:39 +01:00
|
|
|
*/
|
|
|
|
phutil_register_library_map(array(
|
2012-05-30 23:26:29 +02:00
|
|
|
'__library_version__' => 2,
|
2014-07-17 23:48:54 +02:00
|
|
|
'class' => array(
|
2014-10-17 14:04:24 +02:00
|
|
|
'AlmanacAddress' => 'applications/almanac/util/AlmanacAddress.php',
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
'AlmanacBinding' => 'applications/almanac/storage/AlmanacBinding.php',
|
2016-02-25 12:52:41 +01:00
|
|
|
'AlmanacBindingDisableController' => 'applications/almanac/controller/AlmanacBindingDisableController.php',
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
'AlmanacBindingEditController' => 'applications/almanac/controller/AlmanacBindingEditController.php',
|
|
|
|
'AlmanacBindingEditor' => 'applications/almanac/editor/AlmanacBindingEditor.php',
|
|
|
|
'AlmanacBindingPHIDType' => 'applications/almanac/phid/AlmanacBindingPHIDType.php',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacBindingPropertyEditEngine' => 'applications/almanac/editor/AlmanacBindingPropertyEditEngine.php',
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
'AlmanacBindingQuery' => 'applications/almanac/query/AlmanacBindingQuery.php',
|
|
|
|
'AlmanacBindingTableView' => 'applications/almanac/view/AlmanacBindingTableView.php',
|
|
|
|
'AlmanacBindingTransaction' => 'applications/almanac/storage/AlmanacBindingTransaction.php',
|
|
|
|
'AlmanacBindingTransactionQuery' => 'applications/almanac/query/AlmanacBindingTransactionQuery.php',
|
|
|
|
'AlmanacBindingViewController' => 'applications/almanac/controller/AlmanacBindingViewController.php',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacBindingsSearchEngineAttachment' => 'applications/almanac/engineextension/AlmanacBindingsSearchEngineAttachment.php',
|
2015-01-13 20:59:23 +01:00
|
|
|
'AlmanacClusterDatabaseServiceType' => 'applications/almanac/servicetype/AlmanacClusterDatabaseServiceType.php',
|
2014-12-17 20:10:27 +01:00
|
|
|
'AlmanacClusterRepositoryServiceType' => 'applications/almanac/servicetype/AlmanacClusterRepositoryServiceType.php',
|
|
|
|
'AlmanacClusterServiceType' => 'applications/almanac/servicetype/AlmanacClusterServiceType.php',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacConsoleController' => 'applications/almanac/controller/AlmanacConsoleController.php',
|
|
|
|
'AlmanacController' => 'applications/almanac/controller/AlmanacController.php',
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacCreateDevicesCapability' => 'applications/almanac/capability/AlmanacCreateDevicesCapability.php',
|
2016-02-21 21:15:57 +01:00
|
|
|
'AlmanacCreateNamespacesCapability' => 'applications/almanac/capability/AlmanacCreateNamespacesCapability.php',
|
2014-10-17 14:04:02 +02:00
|
|
|
'AlmanacCreateNetworksCapability' => 'applications/almanac/capability/AlmanacCreateNetworksCapability.php',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacCreateServicesCapability' => 'applications/almanac/capability/AlmanacCreateServicesCapability.php',
|
2014-12-17 20:10:27 +01:00
|
|
|
'AlmanacCustomServiceType' => 'applications/almanac/servicetype/AlmanacCustomServiceType.php',
|
2014-10-03 14:52:41 +02:00
|
|
|
'AlmanacDAO' => 'applications/almanac/storage/AlmanacDAO.php',
|
|
|
|
'AlmanacDevice' => 'applications/almanac/storage/AlmanacDevice.php',
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacDeviceController' => 'applications/almanac/controller/AlmanacDeviceController.php',
|
|
|
|
'AlmanacDeviceEditController' => 'applications/almanac/controller/AlmanacDeviceEditController.php',
|
2016-03-05 01:14:27 +01:00
|
|
|
'AlmanacDeviceEditEngine' => 'applications/almanac/editor/AlmanacDeviceEditEngine.php',
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacDeviceEditor' => 'applications/almanac/editor/AlmanacDeviceEditor.php',
|
|
|
|
'AlmanacDeviceListController' => 'applications/almanac/controller/AlmanacDeviceListController.php',
|
2016-02-21 11:48:10 +01:00
|
|
|
'AlmanacDeviceNameNgrams' => 'applications/almanac/storage/AlmanacDeviceNameNgrams.php',
|
2014-10-03 14:52:41 +02:00
|
|
|
'AlmanacDevicePHIDType' => 'applications/almanac/phid/AlmanacDevicePHIDType.php',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacDevicePropertyEditEngine' => 'applications/almanac/editor/AlmanacDevicePropertyEditEngine.php',
|
2014-10-03 14:52:41 +02:00
|
|
|
'AlmanacDeviceQuery' => 'applications/almanac/query/AlmanacDeviceQuery.php',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacDeviceSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacDeviceSearchConduitAPIMethod.php',
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacDeviceSearchEngine' => 'applications/almanac/query/AlmanacDeviceSearchEngine.php',
|
|
|
|
'AlmanacDeviceTransaction' => 'applications/almanac/storage/AlmanacDeviceTransaction.php',
|
|
|
|
'AlmanacDeviceTransactionQuery' => 'applications/almanac/query/AlmanacDeviceTransactionQuery.php',
|
|
|
|
'AlmanacDeviceViewController' => 'applications/almanac/controller/AlmanacDeviceViewController.php',
|
2015-09-21 13:41:23 +02:00
|
|
|
'AlmanacDrydockPoolServiceType' => 'applications/almanac/servicetype/AlmanacDrydockPoolServiceType.php',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacEditor' => 'applications/almanac/editor/AlmanacEditor.php',
|
2014-10-17 14:04:24 +02:00
|
|
|
'AlmanacInterface' => 'applications/almanac/storage/AlmanacInterface.php',
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
'AlmanacInterfaceDatasource' => 'applications/almanac/typeahead/AlmanacInterfaceDatasource.php',
|
2016-02-25 12:52:41 +01:00
|
|
|
'AlmanacInterfaceDeleteController' => 'applications/almanac/controller/AlmanacInterfaceDeleteController.php',
|
2014-10-17 14:04:24 +02:00
|
|
|
'AlmanacInterfaceEditController' => 'applications/almanac/controller/AlmanacInterfaceEditController.php',
|
|
|
|
'AlmanacInterfacePHIDType' => 'applications/almanac/phid/AlmanacInterfacePHIDType.php',
|
|
|
|
'AlmanacInterfaceQuery' => 'applications/almanac/query/AlmanacInterfaceQuery.php',
|
|
|
|
'AlmanacInterfaceTableView' => 'applications/almanac/view/AlmanacInterfaceTableView.php',
|
2015-01-03 00:13:30 +01:00
|
|
|
'AlmanacKeys' => 'applications/almanac/util/AlmanacKeys.php',
|
2016-02-26 18:42:23 +01:00
|
|
|
'AlmanacManageClusterServicesCapability' => 'applications/almanac/capability/AlmanacManageClusterServicesCapability.php',
|
2015-01-03 00:13:30 +01:00
|
|
|
'AlmanacManagementRegisterWorkflow' => 'applications/almanac/management/AlmanacManagementRegisterWorkflow.php',
|
2014-11-21 02:33:30 +01:00
|
|
|
'AlmanacManagementTrustKeyWorkflow' => 'applications/almanac/management/AlmanacManagementTrustKeyWorkflow.php',
|
|
|
|
'AlmanacManagementUntrustKeyWorkflow' => 'applications/almanac/management/AlmanacManagementUntrustKeyWorkflow.php',
|
2014-10-03 14:52:41 +02:00
|
|
|
'AlmanacManagementWorkflow' => 'applications/almanac/management/AlmanacManagementWorkflow.php',
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacNames' => 'applications/almanac/util/AlmanacNames.php',
|
|
|
|
'AlmanacNamesTestCase' => 'applications/almanac/util/__tests__/AlmanacNamesTestCase.php',
|
2016-02-21 21:15:57 +01:00
|
|
|
'AlmanacNamespace' => 'applications/almanac/storage/AlmanacNamespace.php',
|
|
|
|
'AlmanacNamespaceController' => 'applications/almanac/controller/AlmanacNamespaceController.php',
|
|
|
|
'AlmanacNamespaceEditController' => 'applications/almanac/controller/AlmanacNamespaceEditController.php',
|
|
|
|
'AlmanacNamespaceEditEngine' => 'applications/almanac/editor/AlmanacNamespaceEditEngine.php',
|
|
|
|
'AlmanacNamespaceEditor' => 'applications/almanac/editor/AlmanacNamespaceEditor.php',
|
|
|
|
'AlmanacNamespaceListController' => 'applications/almanac/controller/AlmanacNamespaceListController.php',
|
|
|
|
'AlmanacNamespaceNameNgrams' => 'applications/almanac/storage/AlmanacNamespaceNameNgrams.php',
|
|
|
|
'AlmanacNamespacePHIDType' => 'applications/almanac/phid/AlmanacNamespacePHIDType.php',
|
|
|
|
'AlmanacNamespaceQuery' => 'applications/almanac/query/AlmanacNamespaceQuery.php',
|
|
|
|
'AlmanacNamespaceSearchEngine' => 'applications/almanac/query/AlmanacNamespaceSearchEngine.php',
|
|
|
|
'AlmanacNamespaceTransaction' => 'applications/almanac/storage/AlmanacNamespaceTransaction.php',
|
|
|
|
'AlmanacNamespaceTransactionQuery' => 'applications/almanac/query/AlmanacNamespaceTransactionQuery.php',
|
|
|
|
'AlmanacNamespaceViewController' => 'applications/almanac/controller/AlmanacNamespaceViewController.php',
|
2014-10-17 14:04:02 +02:00
|
|
|
'AlmanacNetwork' => 'applications/almanac/storage/AlmanacNetwork.php',
|
|
|
|
'AlmanacNetworkController' => 'applications/almanac/controller/AlmanacNetworkController.php',
|
|
|
|
'AlmanacNetworkEditController' => 'applications/almanac/controller/AlmanacNetworkEditController.php',
|
2016-02-22 14:11:02 +01:00
|
|
|
'AlmanacNetworkEditEngine' => 'applications/almanac/editor/AlmanacNetworkEditEngine.php',
|
2014-10-17 14:04:02 +02:00
|
|
|
'AlmanacNetworkEditor' => 'applications/almanac/editor/AlmanacNetworkEditor.php',
|
|
|
|
'AlmanacNetworkListController' => 'applications/almanac/controller/AlmanacNetworkListController.php',
|
2016-02-21 20:13:08 +01:00
|
|
|
'AlmanacNetworkNameNgrams' => 'applications/almanac/storage/AlmanacNetworkNameNgrams.php',
|
2014-10-17 14:04:02 +02:00
|
|
|
'AlmanacNetworkPHIDType' => 'applications/almanac/phid/AlmanacNetworkPHIDType.php',
|
|
|
|
'AlmanacNetworkQuery' => 'applications/almanac/query/AlmanacNetworkQuery.php',
|
|
|
|
'AlmanacNetworkSearchEngine' => 'applications/almanac/query/AlmanacNetworkSearchEngine.php',
|
|
|
|
'AlmanacNetworkTransaction' => 'applications/almanac/storage/AlmanacNetworkTransaction.php',
|
|
|
|
'AlmanacNetworkTransactionQuery' => 'applications/almanac/query/AlmanacNetworkTransactionQuery.php',
|
|
|
|
'AlmanacNetworkViewController' => 'applications/almanac/controller/AlmanacNetworkViewController.php',
|
2015-12-20 16:44:03 +01:00
|
|
|
'AlmanacPropertiesDestructionEngineExtension' => 'applications/almanac/engineextension/AlmanacPropertiesDestructionEngineExtension.php',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacPropertiesSearchEngineAttachment' => 'applications/almanac/engineextension/AlmanacPropertiesSearchEngineAttachment.php',
|
Give Almanac generic, custom-field-based properties
Summary:
Ref T5833. Currently, we have an `AlmanacDeviceProperty`, but it doesn't use CustomFields and is specific to devices. Make this more generic:
- Reuse most of the CustomField infrastructure (so we can eventually get easy support for nice editor UIs, etc).
- Make properties more generic so Services, Bindings and Devices can all have them.
The major difference between this implementation and existing CustomField implementations is that all other implementations are application-authoritative: the application code determines what the available list of fields is.
I want Almanac to be a bit more freeform (basically: you can write whatever properties you want, and we'll put nice UIs on them if we have a nice UI available). For example, we might have some sort of "ServiceTemplate" that says "a database binding should usually have the fields 'writable', 'active', 'credential'", which would do things like offer these as options and put a nice UI on them, but you should also be able to write whatever other properties you want and add services without building a specific service template for them.
This involves a little bit of rule bending, but ends up pretty clean. We can adjust CustomField to accommodate this a bit more gracefully later on if it makes sense.
Test Plan: {F229172}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10777
2014-11-06 00:27:16 +01:00
|
|
|
'AlmanacProperty' => 'applications/almanac/storage/AlmanacProperty.php',
|
|
|
|
'AlmanacPropertyController' => 'applications/almanac/controller/AlmanacPropertyController.php',
|
2014-12-17 20:10:50 +01:00
|
|
|
'AlmanacPropertyDeleteController' => 'applications/almanac/controller/AlmanacPropertyDeleteController.php',
|
Give Almanac generic, custom-field-based properties
Summary:
Ref T5833. Currently, we have an `AlmanacDeviceProperty`, but it doesn't use CustomFields and is specific to devices. Make this more generic:
- Reuse most of the CustomField infrastructure (so we can eventually get easy support for nice editor UIs, etc).
- Make properties more generic so Services, Bindings and Devices can all have them.
The major difference between this implementation and existing CustomField implementations is that all other implementations are application-authoritative: the application code determines what the available list of fields is.
I want Almanac to be a bit more freeform (basically: you can write whatever properties you want, and we'll put nice UIs on them if we have a nice UI available). For example, we might have some sort of "ServiceTemplate" that says "a database binding should usually have the fields 'writable', 'active', 'credential'", which would do things like offer these as options and put a nice UI on them, but you should also be able to write whatever other properties you want and add services without building a specific service template for them.
This involves a little bit of rule bending, but ends up pretty clean. We can adjust CustomField to accommodate this a bit more gracefully later on if it makes sense.
Test Plan: {F229172}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10777
2014-11-06 00:27:16 +01:00
|
|
|
'AlmanacPropertyEditController' => 'applications/almanac/controller/AlmanacPropertyEditController.php',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacPropertyEditEngine' => 'applications/almanac/editor/AlmanacPropertyEditEngine.php',
|
Give Almanac generic, custom-field-based properties
Summary:
Ref T5833. Currently, we have an `AlmanacDeviceProperty`, but it doesn't use CustomFields and is specific to devices. Make this more generic:
- Reuse most of the CustomField infrastructure (so we can eventually get easy support for nice editor UIs, etc).
- Make properties more generic so Services, Bindings and Devices can all have them.
The major difference between this implementation and existing CustomField implementations is that all other implementations are application-authoritative: the application code determines what the available list of fields is.
I want Almanac to be a bit more freeform (basically: you can write whatever properties you want, and we'll put nice UIs on them if we have a nice UI available). For example, we might have some sort of "ServiceTemplate" that says "a database binding should usually have the fields 'writable', 'active', 'credential'", which would do things like offer these as options and put a nice UI on them, but you should also be able to write whatever other properties you want and add services without building a specific service template for them.
This involves a little bit of rule bending, but ends up pretty clean. We can adjust CustomField to accommodate this a bit more gracefully later on if it makes sense.
Test Plan: {F229172}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10777
2014-11-06 00:27:16 +01:00
|
|
|
'AlmanacPropertyInterface' => 'applications/almanac/property/AlmanacPropertyInterface.php',
|
|
|
|
'AlmanacPropertyQuery' => 'applications/almanac/query/AlmanacPropertyQuery.php',
|
2014-11-06 00:28:36 +01:00
|
|
|
'AlmanacQuery' => 'applications/almanac/query/AlmanacQuery.php',
|
2014-11-06 00:30:00 +01:00
|
|
|
'AlmanacSchemaSpec' => 'applications/almanac/storage/AlmanacSchemaSpec.php',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacSearchEngineAttachment' => 'applications/almanac/engineextension/AlmanacSearchEngineAttachment.php',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacService' => 'applications/almanac/storage/AlmanacService.php',
|
|
|
|
'AlmanacServiceController' => 'applications/almanac/controller/AlmanacServiceController.php',
|
2014-12-19 21:36:14 +01:00
|
|
|
'AlmanacServiceDatasource' => 'applications/almanac/typeahead/AlmanacServiceDatasource.php',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServiceEditController' => 'applications/almanac/controller/AlmanacServiceEditController.php',
|
2016-03-05 01:08:38 +01:00
|
|
|
'AlmanacServiceEditEngine' => 'applications/almanac/editor/AlmanacServiceEditEngine.php',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServiceEditor' => 'applications/almanac/editor/AlmanacServiceEditor.php',
|
|
|
|
'AlmanacServiceListController' => 'applications/almanac/controller/AlmanacServiceListController.php',
|
2016-02-21 19:52:19 +01:00
|
|
|
'AlmanacServiceNameNgrams' => 'applications/almanac/storage/AlmanacServiceNameNgrams.php',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServicePHIDType' => 'applications/almanac/phid/AlmanacServicePHIDType.php',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacServicePropertyEditEngine' => 'applications/almanac/editor/AlmanacServicePropertyEditEngine.php',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServiceQuery' => 'applications/almanac/query/AlmanacServiceQuery.php',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacServiceSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacServiceSearchConduitAPIMethod.php',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServiceSearchEngine' => 'applications/almanac/query/AlmanacServiceSearchEngine.php',
|
|
|
|
'AlmanacServiceTransaction' => 'applications/almanac/storage/AlmanacServiceTransaction.php',
|
|
|
|
'AlmanacServiceTransactionQuery' => 'applications/almanac/query/AlmanacServiceTransactionQuery.php',
|
2014-12-17 20:10:27 +01:00
|
|
|
'AlmanacServiceType' => 'applications/almanac/servicetype/AlmanacServiceType.php',
|
Store Almanac "service types" instead of "service classes"
Summary:
Ref T10449. Currently, we store classes (like "AlmanacClusterRepositoryServiceType") in the database.
Instead, store types (like "cluster.repository").
This is a small change, but types are a little more flexible (they let us freely reanme classes), a little cleaner (fewer magic strings in the codebase), and a little better for API usage (they're more human readable).
Make this minor usability change now, before we unprototype.
Also make services searchable by type.
Also remove old Almanac API endpoints.
Test Plan:
- Ran migration, verified all data migrated properly.
- Created, edited, rebound, and changed properties of services.
- Searched for services by service type.
- Reviewed available Conduit methods.
Reviewers: chad
Reviewed By: chad
Subscribers: yelirekim
Maniphest Tasks: T10449
Differential Revision: https://secure.phabricator.com/D15346
2016-02-25 14:05:36 +01:00
|
|
|
'AlmanacServiceTypeDatasource' => 'applications/almanac/typeahead/AlmanacServiceTypeDatasource.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'AlmanacServiceTypeTestCase' => 'applications/almanac/servicetype/__tests__/AlmanacServiceTypeTestCase.php',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServiceViewController' => 'applications/almanac/controller/AlmanacServiceViewController.php',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacTransaction' => 'applications/almanac/storage/AlmanacTransaction.php',
|
2015-04-22 00:46:36 +02:00
|
|
|
'AphlictDropdownDataQuery' => 'applications/aphlict/query/AphlictDropdownDataQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'Aphront304Response' => 'aphront/response/Aphront304Response.php',
|
|
|
|
'Aphront400Response' => 'aphront/response/Aphront400Response.php',
|
|
|
|
'Aphront403Response' => 'aphront/response/Aphront403Response.php',
|
|
|
|
'Aphront404Response' => 'aphront/response/Aphront404Response.php',
|
|
|
|
'AphrontAjaxResponse' => 'aphront/response/AphrontAjaxResponse.php',
|
2012-06-01 21:46:28 +02:00
|
|
|
'AphrontApplicationConfiguration' => 'aphront/configuration/AphrontApplicationConfiguration.php',
|
2013-03-05 17:46:09 +01:00
|
|
|
'AphrontBarView' => 'view/widget/bars/AphrontBarView.php',
|
2015-12-02 14:55:31 +01:00
|
|
|
'AphrontBoolHTTPParameterType' => 'aphront/httpparametertype/AphrontBoolHTTPParameterType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontCSRFException' => 'aphront/exception/AphrontCSRFException.php',
|
|
|
|
'AphrontCalendarEventView' => 'applications/calendar/view/AphrontCalendarEventView.php',
|
|
|
|
'AphrontController' => 'aphront/AphrontController.php',
|
Rename "IDPaged" to "CursorPaged", "executeWithPager" to "executeWith[Cursor|Offset]Pager"
Summary:
I'm trying to make progress on the policy/visibility stuff since it's a blocker for Wikimedia.
First, I want to improve Projects so they can serve as policy groups (e.g., an object can have a visibility policy like "Visible to: members of project 'security'"). However, doing this without breaking anything or snowballing into a bigger change is a bit awkward because Projects are name-ordered and we have a Conduit API which does offset paging. Rather than breaking or rewriting this stuff, I want to just continue offset paging them for now.
So I'm going to make PhabricatorPolicyQuery extend PhabricatorOffsetPagedQuery, but can't currently since the `executeWithPager` methods would clash. These methods do different things anyway and are probably better with different names.
This also generally improves the names of these classes, since cursors are not necessarily IDs (in the feed case, they're "chronlogicalKeys", for example). I did leave some of the interals as "ID" since calling them "Cursor"s (e.g., `setAfterCursor()`) seemed a little wrong -- it should maybe be `setAfterCursorPosition()`. These APIs have very limited use and can easily be made more consistent later.
Test Plan: Browsed around various affected tools; any issues here should throw/fail in a loud/obvious way.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran
Maniphest Tasks: T603
Differential Revision: https://secure.phabricator.com/D3177
2012-08-07 20:54:06 +02:00
|
|
|
'AphrontCursorPagerView' => 'view/control/AphrontCursorPagerView.php',
|
2012-06-01 21:46:28 +02:00
|
|
|
'AphrontDefaultApplicationConfiguration' => 'aphront/configuration/AphrontDefaultApplicationConfiguration.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontDialogResponse' => 'aphront/response/AphrontDialogResponse.php',
|
|
|
|
'AphrontDialogView' => 'view/AphrontDialogView.php',
|
2016-04-07 20:06:26 +02:00
|
|
|
'AphrontEpochHTTPParameterType' => 'aphront/httpparametertype/AphrontEpochHTTPParameterType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontException' => 'aphront/exception/AphrontException.php',
|
|
|
|
'AphrontFileResponse' => 'aphront/response/AphrontFileResponse.php',
|
|
|
|
'AphrontFormCheckboxControl' => 'view/form/control/AphrontFormCheckboxControl.php',
|
|
|
|
'AphrontFormControl' => 'view/form/control/AphrontFormControl.php',
|
|
|
|
'AphrontFormDateControl' => 'view/form/control/AphrontFormDateControl.php',
|
2015-05-02 01:07:57 +02:00
|
|
|
'AphrontFormDateControlValue' => 'view/form/control/AphrontFormDateControlValue.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontFormDividerControl' => 'view/form/control/AphrontFormDividerControl.php',
|
|
|
|
'AphrontFormFileControl' => 'view/form/control/AphrontFormFileControl.php',
|
2015-12-08 16:54:01 +01:00
|
|
|
'AphrontFormHandlesControl' => 'view/form/control/AphrontFormHandlesControl.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontFormMarkupControl' => 'view/form/control/AphrontFormMarkupControl.php',
|
|
|
|
'AphrontFormPasswordControl' => 'view/form/control/AphrontFormPasswordControl.php',
|
|
|
|
'AphrontFormPolicyControl' => 'view/form/control/AphrontFormPolicyControl.php',
|
|
|
|
'AphrontFormRadioButtonControl' => 'view/form/control/AphrontFormRadioButtonControl.php',
|
|
|
|
'AphrontFormRecaptchaControl' => 'view/form/control/AphrontFormRecaptchaControl.php',
|
|
|
|
'AphrontFormSelectControl' => 'view/form/control/AphrontFormSelectControl.php',
|
|
|
|
'AphrontFormStaticControl' => 'view/form/control/AphrontFormStaticControl.php',
|
|
|
|
'AphrontFormSubmitControl' => 'view/form/control/AphrontFormSubmitControl.php',
|
|
|
|
'AphrontFormTextAreaControl' => 'view/form/control/AphrontFormTextAreaControl.php',
|
|
|
|
'AphrontFormTextControl' => 'view/form/control/AphrontFormTextControl.php',
|
2014-02-01 20:48:28 +01:00
|
|
|
'AphrontFormTextWithSubmitControl' => 'view/form/control/AphrontFormTextWithSubmitControl.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontFormTokenizerControl' => 'view/form/control/AphrontFormTokenizerControl.php',
|
2014-05-13 23:08:21 +02:00
|
|
|
'AphrontFormTypeaheadControl' => 'view/form/control/AphrontFormTypeaheadControl.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontFormView' => 'view/form/AphrontFormView.php',
|
2013-03-05 17:46:09 +01:00
|
|
|
'AphrontGlyphBarView' => 'view/widget/bars/AphrontGlyphBarView.php',
|
2012-11-29 08:57:13 +01:00
|
|
|
'AphrontHTMLResponse' => 'aphront/response/AphrontHTMLResponse.php',
|
2015-11-04 14:05:10 +01:00
|
|
|
'AphrontHTTPParameterType' => 'aphront/httpparametertype/AphrontHTTPParameterType.php',
|
2015-01-27 23:50:52 +01:00
|
|
|
'AphrontHTTPProxyResponse' => 'aphront/response/AphrontHTTPProxyResponse.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontHTTPSink' => 'aphront/sink/AphrontHTTPSink.php',
|
|
|
|
'AphrontHTTPSinkTestCase' => 'aphront/sink/__tests__/AphrontHTTPSinkTestCase.php',
|
2015-12-02 14:55:31 +01:00
|
|
|
'AphrontIntHTTPParameterType' => 'aphront/httpparametertype/AphrontIntHTTPParameterType.php',
|
2012-07-26 21:01:47 +02:00
|
|
|
'AphrontIsolatedDatabaseConnectionTestCase' => 'infrastructure/storage/__tests__/AphrontIsolatedDatabaseConnectionTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontIsolatedHTTPSink' => 'aphront/sink/AphrontIsolatedHTTPSink.php',
|
|
|
|
'AphrontJSONResponse' => 'aphront/response/AphrontJSONResponse.php',
|
|
|
|
'AphrontJavelinView' => 'view/AphrontJavelinView.php',
|
|
|
|
'AphrontKeyboardShortcutsAvailableView' => 'view/widget/AphrontKeyboardShortcutsAvailableView.php',
|
|
|
|
'AphrontListFilterView' => 'view/layout/AphrontListFilterView.php',
|
2015-11-29 22:24:47 +01:00
|
|
|
'AphrontListHTTPParameterType' => 'aphront/httpparametertype/AphrontListHTTPParameterType.php',
|
2015-09-03 19:04:17 +02:00
|
|
|
'AphrontMalformedRequestException' => 'aphront/exception/AphrontMalformedRequestException.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontMoreView' => 'view/layout/AphrontMoreView.php',
|
2013-04-02 20:23:24 +02:00
|
|
|
'AphrontMultiColumnView' => 'view/layout/AphrontMultiColumnView.php',
|
2012-07-26 21:01:47 +02:00
|
|
|
'AphrontMySQLDatabaseConnectionTestCase' => 'infrastructure/storage/__tests__/AphrontMySQLDatabaseConnectionTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontNullView' => 'view/AphrontNullView.php',
|
2015-11-04 14:05:10 +01:00
|
|
|
'AphrontPHIDHTTPParameterType' => 'aphront/httpparametertype/AphrontPHIDHTTPParameterType.php',
|
|
|
|
'AphrontPHIDListHTTPParameterType' => 'aphront/httpparametertype/AphrontPHIDListHTTPParameterType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontPHPHTTPSink' => 'aphront/sink/AphrontPHPHTTPSink.php',
|
|
|
|
'AphrontPageView' => 'view/page/AphrontPageView.php',
|
|
|
|
'AphrontPlainTextResponse' => 'aphront/response/AphrontPlainTextResponse.php',
|
2013-03-05 17:46:09 +01:00
|
|
|
'AphrontProgressBarView' => 'view/widget/bars/AphrontProgressBarView.php',
|
2015-11-04 19:20:38 +01:00
|
|
|
'AphrontProjectListHTTPParameterType' => 'aphront/httpparametertype/AphrontProjectListHTTPParameterType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontProxyResponse' => 'aphront/response/AphrontProxyResponse.php',
|
|
|
|
'AphrontRedirectResponse' => 'aphront/response/AphrontRedirectResponse.php',
|
2014-08-18 23:11:06 +02:00
|
|
|
'AphrontRedirectResponseTestCase' => 'aphront/response/__tests__/AphrontRedirectResponseTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontReloadResponse' => 'aphront/response/AphrontReloadResponse.php',
|
|
|
|
'AphrontRequest' => 'aphront/AphrontRequest.php',
|
2015-09-03 19:04:42 +02:00
|
|
|
'AphrontRequestExceptionHandler' => 'aphront/handler/AphrontRequestExceptionHandler.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontRequestTestCase' => 'aphront/__tests__/AphrontRequestTestCase.php',
|
|
|
|
'AphrontResponse' => 'aphront/response/AphrontResponse.php',
|
2015-09-02 00:52:52 +02:00
|
|
|
'AphrontResponseProducerInterface' => 'aphront/interface/AphrontResponseProducerInterface.php',
|
2015-08-31 13:01:01 +02:00
|
|
|
'AphrontRoutingMap' => 'aphront/site/AphrontRoutingMap.php',
|
|
|
|
'AphrontRoutingResult' => 'aphront/site/AphrontRoutingResult.php',
|
2015-11-04 14:05:10 +01:00
|
|
|
'AphrontSelectHTTPParameterType' => 'aphront/httpparametertype/AphrontSelectHTTPParameterType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontSideNavFilterView' => 'view/layout/AphrontSideNavFilterView.php',
|
2015-06-29 23:04:48 +02:00
|
|
|
'AphrontSite' => 'aphront/site/AphrontSite.php',
|
2013-11-21 23:38:29 +01:00
|
|
|
'AphrontStackTraceView' => 'view/widget/AphrontStackTraceView.php',
|
Improve top-level exception handling
Summary:
Fixes T6692. Addresses two main issues:
- The write guard would sometimes not get disposed of on exception pathways, generating an unnecessary secondary error which was just a symptom of the original root error.
- This was generally confusing and reduced the quality of reports we received because users would report the symptomatic error sometimes instead of the real error.
- Instead, reflow the handling so that we always dispose of the write guard if we create one.
- If we missed the Controller-level error page generation (normally, a nice page with full CSS, etc), we'd jump straight to Startup-level error page generation (very basic plain text).
- A large class of errors occur too early or too late to be handled by Controller-level pages, but many of these errors are not fundamental, and the plain text page is excessively severe.
- Provide a mid-level simple HTML error page for errors which can't get full CSS, but also aren't so fundamental that we have no recourse but plain text.
Test Plan:
Mid-level errors now produce an intentional-looking error page:
{F259885}
Verified that setup errors still render properly.
@chad, feel free to tweak the exception page -- I just did a rough pass on it. Like the setup error stuff, it doesn't have Celerity, so we can't use `{$colors}` and no other CSS will be loaded.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley, chad
Maniphest Tasks: T6692
Differential Revision: https://secure.phabricator.com/D11126
2015-01-02 19:49:27 +01:00
|
|
|
'AphrontStandaloneHTMLResponse' => 'aphront/response/AphrontStandaloneHTMLResponse.php',
|
2015-11-04 14:05:10 +01:00
|
|
|
'AphrontStringHTTPParameterType' => 'aphront/httpparametertype/AphrontStringHTTPParameterType.php',
|
|
|
|
'AphrontStringListHTTPParameterType' => 'aphront/httpparametertype/AphrontStringListHTTPParameterType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontTableView' => 'view/control/AphrontTableView.php',
|
2013-01-16 19:50:41 +01:00
|
|
|
'AphrontTagView' => 'view/AphrontTagView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontTokenizerTemplateView' => 'view/control/AphrontTokenizerTemplateView.php',
|
|
|
|
'AphrontTypeaheadTemplateView' => 'view/control/AphrontTypeaheadTemplateView.php',
|
Improve top-level exception handling
Summary:
Fixes T6692. Addresses two main issues:
- The write guard would sometimes not get disposed of on exception pathways, generating an unnecessary secondary error which was just a symptom of the original root error.
- This was generally confusing and reduced the quality of reports we received because users would report the symptomatic error sometimes instead of the real error.
- Instead, reflow the handling so that we always dispose of the write guard if we create one.
- If we missed the Controller-level error page generation (normally, a nice page with full CSS, etc), we'd jump straight to Startup-level error page generation (very basic plain text).
- A large class of errors occur too early or too late to be handled by Controller-level pages, but many of these errors are not fundamental, and the plain text page is excessively severe.
- Provide a mid-level simple HTML error page for errors which can't get full CSS, but also aren't so fundamental that we have no recourse but plain text.
Test Plan:
Mid-level errors now produce an intentional-looking error page:
{F259885}
Verified that setup errors still render properly.
@chad, feel free to tweak the exception page -- I just did a rough pass on it. Like the setup error stuff, it doesn't have Celerity, so we can't use `{$colors}` and no other CSS will be loaded.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley, chad
Maniphest Tasks: T6692
Differential Revision: https://secure.phabricator.com/D11126
2015-01-02 19:49:27 +01:00
|
|
|
'AphrontUnhandledExceptionResponse' => 'aphront/response/AphrontUnhandledExceptionResponse.php',
|
2015-11-04 19:20:38 +01:00
|
|
|
'AphrontUserListHTTPParameterType' => 'aphront/httpparametertype/AphrontUserListHTTPParameterType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontView' => 'view/AphrontView.php',
|
|
|
|
'AphrontWebpageResponse' => 'aphront/response/AphrontWebpageResponse.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ArcanistConduitAPIMethod' => 'applications/arcanist/conduit/ArcanistConduitAPIMethod.php',
|
|
|
|
'AuditConduitAPIMethod' => 'applications/audit/conduit/AuditConduitAPIMethod.php',
|
|
|
|
'AuditQueryConduitAPIMethod' => 'applications/audit/conduit/AuditQueryConduitAPIMethod.php',
|
2015-01-12 23:37:58 +01:00
|
|
|
'AuthManageProvidersCapability' => 'applications/auth/capability/AuthManageProvidersCapability.php',
|
2014-02-25 22:43:31 +01:00
|
|
|
'CalendarTimeUtil' => 'applications/calendar/util/CalendarTimeUtil.php',
|
|
|
|
'CalendarTimeUtilTestCase' => 'applications/calendar/__tests__/CalendarTimeUtilTestCase.php',
|
2014-10-13 20:17:23 +02:00
|
|
|
'CelerityAPI' => 'applications/celerity/CelerityAPI.php',
|
2015-06-20 15:10:42 +02:00
|
|
|
'CelerityDefaultPostprocessor' => 'applications/celerity/postprocessor/CelerityDefaultPostprocessor.php',
|
|
|
|
'CelerityHighContrastPostprocessor' => 'applications/celerity/postprocessor/CelerityHighContrastPostprocessor.php',
|
2015-06-26 18:33:03 +02:00
|
|
|
'CelerityLargeFontPostprocessor' => 'applications/celerity/postprocessor/CelerityLargeFontPostprocessor.php',
|
2014-10-13 20:17:23 +02:00
|
|
|
'CelerityManagementMapWorkflow' => 'applications/celerity/management/CelerityManagementMapWorkflow.php',
|
2016-05-05 03:24:59 +02:00
|
|
|
'CelerityManagementSyntaxWorkflow' => 'applications/celerity/management/CelerityManagementSyntaxWorkflow.php',
|
2014-10-13 20:17:23 +02:00
|
|
|
'CelerityManagementWorkflow' => 'applications/celerity/management/CelerityManagementWorkflow.php',
|
|
|
|
'CelerityPhabricatorResourceController' => 'applications/celerity/controller/CelerityPhabricatorResourceController.php',
|
|
|
|
'CelerityPhabricatorResources' => 'applications/celerity/resources/CelerityPhabricatorResources.php',
|
|
|
|
'CelerityPhysicalResources' => 'applications/celerity/resources/CelerityPhysicalResources.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'CelerityPhysicalResourcesTestCase' => 'applications/celerity/resources/__tests__/CelerityPhysicalResourcesTestCase.php',
|
2015-06-20 15:10:42 +02:00
|
|
|
'CelerityPostprocessor' => 'applications/celerity/postprocessor/CelerityPostprocessor.php',
|
|
|
|
'CelerityPostprocessorTestCase' => 'applications/celerity/__tests__/CelerityPostprocessorTestCase.php',
|
2014-10-13 20:17:23 +02:00
|
|
|
'CelerityResourceController' => 'applications/celerity/controller/CelerityResourceController.php',
|
|
|
|
'CelerityResourceGraph' => 'applications/celerity/CelerityResourceGraph.php',
|
|
|
|
'CelerityResourceMap' => 'applications/celerity/CelerityResourceMap.php',
|
|
|
|
'CelerityResourceMapGenerator' => 'applications/celerity/CelerityResourceMapGenerator.php',
|
|
|
|
'CelerityResourceTransformer' => 'applications/celerity/CelerityResourceTransformer.php',
|
|
|
|
'CelerityResourceTransformerTestCase' => 'applications/celerity/__tests__/CelerityResourceTransformerTestCase.php',
|
|
|
|
'CelerityResources' => 'applications/celerity/resources/CelerityResources.php',
|
|
|
|
'CelerityResourcesOnDisk' => 'applications/celerity/resources/CelerityResourcesOnDisk.php',
|
|
|
|
'CeleritySpriteGenerator' => 'applications/celerity/CeleritySpriteGenerator.php',
|
|
|
|
'CelerityStaticResourceResponse' => 'applications/celerity/CelerityStaticResourceResponse.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ChatLogConduitAPIMethod' => 'applications/chatlog/conduit/ChatLogConduitAPIMethod.php',
|
|
|
|
'ChatLogQueryConduitAPIMethod' => 'applications/chatlog/conduit/ChatLogQueryConduitAPIMethod.php',
|
|
|
|
'ChatLogRecordConduitAPIMethod' => 'applications/chatlog/conduit/ChatLogRecordConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ConduitAPIMethod' => 'applications/conduit/method/ConduitAPIMethod.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'ConduitAPIMethodTestCase' => 'applications/conduit/method/__tests__/ConduitAPIMethodTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ConduitAPIRequest' => 'applications/conduit/protocol/ConduitAPIRequest.php',
|
|
|
|
'ConduitAPIResponse' => 'applications/conduit/protocol/ConduitAPIResponse.php',
|
2014-07-25 03:24:31 +02:00
|
|
|
'ConduitApplicationNotInstalledException' => 'applications/conduit/protocol/exception/ConduitApplicationNotInstalledException.php',
|
2015-12-13 16:29:05 +01:00
|
|
|
'ConduitBoolParameterType' => 'applications/conduit/parametertype/ConduitBoolParameterType.php',
|
Allow applications to call Conduit directly
Summary:
Sorry this took so long, had a bunch of stuff going on today.
Separate the actual core part of making conduit calls from the controller, so the application can make conduit calls without needing to invoke HTTP or redo auth. Generally, this lets us build more parts of the application on top of Conduit, as appropriate.
This diff can be simplified, but I wanted to unblock you guys first. I'll followup with a cleanup patch once I have a chance.
Test Plan: Ran unit tests, ran calls from the conduit API console, and ran calls over arc.
Reviewers: nodren, 20after4, btrahan, vrana
Reviewed By: 20after4
CC: aran, svemir
Maniphest Tasks: T945
Differential Revision: https://secure.phabricator.com/D2718
2012-06-17 17:47:09 +02:00
|
|
|
'ConduitCall' => 'applications/conduit/call/ConduitCall.php',
|
|
|
|
'ConduitCallTestCase' => 'applications/conduit/call/__tests__/ConduitCallTestCase.php',
|
2016-04-06 13:37:01 +02:00
|
|
|
'ConduitColumnsParameterType' => 'applications/conduit/parametertype/ConduitColumnsParameterType.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConduitConnectConduitAPIMethod' => 'applications/conduit/method/ConduitConnectConduitAPIMethod.php',
|
2015-12-13 15:52:37 +01:00
|
|
|
'ConduitEpochParameterType' => 'applications/conduit/parametertype/ConduitEpochParameterType.php',
|
2014-07-25 03:24:31 +02:00
|
|
|
'ConduitException' => 'applications/conduit/protocol/exception/ConduitException.php',
|
2014-12-15 20:14:53 +01:00
|
|
|
'ConduitGetCapabilitiesConduitAPIMethod' => 'applications/conduit/method/ConduitGetCapabilitiesConduitAPIMethod.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConduitGetCertificateConduitAPIMethod' => 'applications/conduit/method/ConduitGetCertificateConduitAPIMethod.php',
|
2015-12-13 16:43:02 +01:00
|
|
|
'ConduitIntListParameterType' => 'applications/conduit/parametertype/ConduitIntListParameterType.php',
|
2015-12-13 16:29:05 +01:00
|
|
|
'ConduitIntParameterType' => 'applications/conduit/parametertype/ConduitIntParameterType.php',
|
2015-12-13 12:53:15 +01:00
|
|
|
'ConduitListParameterType' => 'applications/conduit/parametertype/ConduitListParameterType.php',
|
2014-01-15 19:02:31 +01:00
|
|
|
'ConduitLogGarbageCollector' => 'applications/conduit/garbagecollector/ConduitLogGarbageCollector.php',
|
2014-08-11 21:08:06 +02:00
|
|
|
'ConduitMethodDoesNotExistException' => 'applications/conduit/protocol/exception/ConduitMethodDoesNotExistException.php',
|
2014-07-25 03:24:31 +02:00
|
|
|
'ConduitMethodNotFoundException' => 'applications/conduit/protocol/exception/ConduitMethodNotFoundException.php',
|
2015-12-13 15:52:37 +01:00
|
|
|
'ConduitPHIDListParameterType' => 'applications/conduit/parametertype/ConduitPHIDListParameterType.php',
|
2015-12-16 14:09:21 +01:00
|
|
|
'ConduitPHIDParameterType' => 'applications/conduit/parametertype/ConduitPHIDParameterType.php',
|
2015-12-13 12:53:15 +01:00
|
|
|
'ConduitParameterType' => 'applications/conduit/parametertype/ConduitParameterType.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConduitPingConduitAPIMethod' => 'applications/conduit/method/ConduitPingConduitAPIMethod.php',
|
2016-02-09 00:24:52 +01:00
|
|
|
'ConduitPointsParameterType' => 'applications/conduit/parametertype/ConduitPointsParameterType.php',
|
2015-12-13 15:52:37 +01:00
|
|
|
'ConduitProjectListParameterType' => 'applications/conduit/parametertype/ConduitProjectListParameterType.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConduitQueryConduitAPIMethod' => 'applications/conduit/method/ConduitQueryConduitAPIMethod.php',
|
2015-12-11 17:45:56 +01:00
|
|
|
'ConduitResultSearchEngineExtension' => 'applications/conduit/query/ConduitResultSearchEngineExtension.php',
|
Implement SSHD glue and Conduit SSH endpoint
Summary:
- Build "sshd-auth" (for authentication) and "sshd-exec" (for command execution) binaries. These are callable by "sshd-vcs", located [[https://github.com/epriestley/sshd-vcs | in my account on GitHub]]. They are based on precursors [[https://github.com/epriestley/sshd-vcs-glue | here on GitHub]] which I deployed for TenXer about a year ago, so I have some confidence they at least basically work.
- The problem this solves is that normally every user would need an account on a machine to connect to it, and/or their public keys would all need to be listed in `~/.authorized_keys`. This is a big pain in most installs. Software like Gitosis/Gitolite solve this problem by giving you an easy way to add public keys to `~/.authorized_keys`, but this is pretty gross.
- Roughly, instead of looking in `~/.authorized_keys` when a user connects, the patched sshd instead runs `echo <public key> | sshd-auth`. The `sshd-auth` script looks up the public key and authorizes the matching user, if they exist. It also forces sshd to run `sshd-exec` instead of a normal shell.
- `sshd-exec` receives the authenticated user and any command which was passed to ssh (like `git receive-pack`) and can route them appropriately.
- Overall, this permits a single account to be set up on a server which all Phabricator users can connect to without any extra work, and which can safely execute commands and apply appropriate permissions, and disable users when they are disabled in Phabricator and all that stuff.
- Build out "sshd-exec" to do more thorough checks and setup, and delegate command execution to Workflows (they now exist, and did not when I originally built this stuff).
- Convert @btrahan's conduit API script into a workflow and slightly simplify it (ConduitCall did not exist at the time it was written).
The next steps here on the Repository side are to implement Workflows for Git, SVN and HG wire protocols. These will mostly just proxy the protocols, but also need to enforce permissions. So the approach will basically be:
- Implement workflows for stuff like `git receive-pack`.
- These workflows will implement enough of the underlying protocol to determine what resource the user is trying to access, and whether they want to read or write it.
- They'll then do a permissons check, and kick the user out if they don't have permission to do whatever they are trying to do.
- If the user does have permission, we just proxy the rest of the transaction.
Next steps on the Conduit side are more simple:
- Make ConduitClient understand "ssh://" URLs.
Test Plan: Ran `sshd-exec --phabricator-ssh-user epriestley conduit differential.query`, etc. This will get a more comprehensive test once I set up sshd-vcs.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T603, T550
Differential Revision: https://secure.phabricator.com/D4229
2012-12-19 20:08:07 +01:00
|
|
|
'ConduitSSHWorkflow' => 'applications/conduit/ssh/ConduitSSHWorkflow.php',
|
2015-12-13 12:53:15 +01:00
|
|
|
'ConduitStringListParameterType' => 'applications/conduit/parametertype/ConduitStringListParameterType.php',
|
2015-12-13 16:29:05 +01:00
|
|
|
'ConduitStringParameterType' => 'applications/conduit/parametertype/ConduitStringParameterType.php',
|
Add Conduit Tokens to make authentication in Conduit somewhat more sane
Summary:
Ref T5955. Summary of intended changes:
**Improve Granularity of Authorization**: Currently, users have one Conduit Certificate. This isn't very flexible, and means that you can't ever generate an API token with limited permissions or IP block controls (see T6706). This moves toward a world where you can generate multiple tokens, revoke them individually, and assign disparate privileges to them.
**Standardize Token Management**: This moves Conduit to work the same way that sessions, OAuth authorizations, and temporary tokens already work, instead of being this crazy bizarre mess.
**Make Authentication Faster**: Authentication currently requires a handshake (conduit.connect) to establish a session, like the web UI. This is unnecessary from a security point of view and puts an extra round trip in front of all Conduit activity. Essentially no other API anywhere works like this.
**Make Authentication Simpler**: The handshake is complex, and involves deriving hashes. The session is also complex, and creates issues like T4377. Handshake and session management require different inputs.
**Make Token Management Simpler**: The certificate is this huge long thing right now, which is not necessary from a security perspective. There are separate Arcanist handshake tokens, but they have a different set of issues. We can move forward to a token management world where neither of these problems exist.
**Lower Protocol Barrier**: The simplest possible API client is very complex right now. It should be `curl`. Simplifying authentication is a necessary step toward this.
**Unblock T2783**: T2783 is blocked on nodes in the cluster making authenticated API calls to other nodes. This provides a simpler way forward than the handshake mess (or enormous-hack-mess) which would currently be required.
Test Plan:
- Generated tokens.
- Generated tokens for a bot account.
- Terminated tokens (and for a bot account).
- Terminated all tokens (and for a bot account).
- Ran GC and saw it reap all the expired tokens.
NOTE: These tokens can not actually be used to authenticate yet!
{F249658}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5955
Differential Revision: https://secure.phabricator.com/D10985
2014-12-15 20:14:23 +01:00
|
|
|
'ConduitTokenGarbageCollector' => 'applications/conduit/garbagecollector/ConduitTokenGarbageCollector.php',
|
2015-12-13 12:53:15 +01:00
|
|
|
'ConduitUserListParameterType' => 'applications/conduit/parametertype/ConduitUserListParameterType.php',
|
2016-01-11 12:24:03 +01:00
|
|
|
'ConduitUserParameterType' => 'applications/conduit/parametertype/ConduitUserParameterType.php',
|
2015-12-16 14:09:21 +01:00
|
|
|
'ConduitWildParameterType' => 'applications/conduit/parametertype/ConduitWildParameterType.php',
|
Conpherence - make the durable column kind of work and stuff
Summary:
Ref T7014. This hooks up the durable column such that when you open it up it loads your most recent Conpherence. You can then switch amongst the various widgets and stuff and everything works nicely.
Except...
- scroll bar does not work
- also doesn't work at HEAD when I add a ton of text to the UI with no changes? (wrapped $copy in array_fill(0, 1000, $copy))
- "widget selector" does not collapse when you select something else
- this part wasn't really specified so I used the aphlict dropdown stuff. didn't want to keep working on that if this was the wrong UI choice
- can not edit title
- do we still want that to be done by clicking on the title, which pops a dialogue?
- can not add participants or calendar events
- what should this UI be? maybe just a button on the top for "participants" and a button on the bottom for calendar? both on top?
- this is not pixel perfect to the mock or two I've seen around. Aside from generally being bad at that, I definitely didn't get the name + timestamps formatting correctly, because the standard DOM of that has timestamp FIRST which appears second due to a "float right". Seemed like a lot of special-casing for what might not even be that important in the UI so I punted. (And again, there's likely many unknown ways in which this isn't pixel perfect)
There's also code quality issues
- `ConpherenceWidgetConfigConstants` is hopefully temporary or at least gets more sleek as we keep progressing here
- copied some CSS from main Conpherence app
- DOM structure is pretty different
- there's some minor CSS tweaks too given the different width (not to mention the DOM structure being different)
- copied some JS from behavior-pontificate.js to sync threads relative to aphlict updates
- JS in general is like a better version of existing JS; these should collapse I'd hope?
- maybe the aphlict-behavior-dropdown change was badsauce?
...but all that said, this definitely feels really nice and I feel like adding stuff is going to be really easy compared to how normal Conpherence is.
Also includes a bonus bug fix - we now correctly update participation. The user would encounter this issue if they were in a conpherence that got some updates and then they went to a different page; they would have unread status for the messages that were ajax'd in. This patch fixes that by making sure we mark participation up to date with the proper transaction in all cases.
Test Plan: hit "\" to invoke the column and saw nice loading UI and my latest conpherence load. sent messages and verified they received A-OK by looking in DOM console. toggled various widges and verified they rendered correctly. opened up a second browser with a second user on the thread, sent a message, and it was received in a nice asynchronous fashion
Reviewers: chad, epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T7014
Differential Revision: https://secure.phabricator.com/D11968
2015-03-05 19:33:39 +01:00
|
|
|
'ConpherenceColumnViewController' => 'applications/conpherence/controller/ConpherenceColumnViewController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConpherenceConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceConduitAPIMethod.php',
|
2013-01-26 01:03:54 +01:00
|
|
|
'ConpherenceConfigOptions' => 'applications/conpherence/config/ConpherenceConfigOptions.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceConstants' => 'applications/conpherence/constants/ConpherenceConstants.php',
|
|
|
|
'ConpherenceController' => 'applications/conpherence/controller/ConpherenceController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConpherenceCreateThreadConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceCreateThreadConduitAPIMethod.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceDAO' => 'applications/conpherence/storage/ConpherenceDAO.php',
|
2015-02-27 20:38:33 +01:00
|
|
|
'ConpherenceDurableColumnView' => 'applications/conpherence/view/ConpherenceDurableColumnView.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceEditor' => 'applications/conpherence/editor/ConpherenceEditor.php',
|
2015-05-04 22:52:22 +02:00
|
|
|
'ConpherenceFormDragAndDropUploadControl' => 'applications/conpherence/view/ConpherenceFormDragAndDropUploadControl.php',
|
2015-01-06 19:24:30 +01:00
|
|
|
'ConpherenceFulltextQuery' => 'applications/conpherence/query/ConpherenceFulltextQuery.php',
|
2015-05-04 22:52:22 +02:00
|
|
|
'ConpherenceImageData' => 'applications/conpherence/constants/ConpherenceImageData.php',
|
2015-01-06 19:24:30 +01:00
|
|
|
'ConpherenceIndex' => 'applications/conpherence/storage/ConpherenceIndex.php',
|
2013-04-01 21:43:07 +02:00
|
|
|
'ConpherenceLayoutView' => 'applications/conpherence/view/ConpherenceLayoutView.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceListController' => 'applications/conpherence/controller/ConpherenceListController.php',
|
|
|
|
'ConpherenceMenuItemView' => 'applications/conpherence/view/ConpherenceMenuItemView.php',
|
2015-03-24 21:04:33 +01:00
|
|
|
'ConpherenceNewRoomController' => 'applications/conpherence/controller/ConpherenceNewRoomController.php',
|
2013-08-08 22:43:33 +02:00
|
|
|
'ConpherenceNotificationPanelController' => 'applications/conpherence/controller/ConpherenceNotificationPanelController.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceParticipant' => 'applications/conpherence/storage/ConpherenceParticipant.php',
|
2013-04-26 19:30:41 +02:00
|
|
|
'ConpherenceParticipantCountQuery' => 'applications/conpherence/query/ConpherenceParticipantCountQuery.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceParticipantQuery' => 'applications/conpherence/query/ConpherenceParticipantQuery.php',
|
|
|
|
'ConpherenceParticipationStatus' => 'applications/conpherence/constants/ConpherenceParticipationStatus.php',
|
2013-04-02 18:32:40 +02:00
|
|
|
'ConpherencePeopleWidgetView' => 'applications/conpherence/view/ConpherencePeopleWidgetView.php',
|
2015-05-04 22:52:22 +02:00
|
|
|
'ConpherencePicCropControl' => 'applications/conpherence/view/ConpherencePicCropControl.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConpherenceQueryThreadConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceQueryThreadConduitAPIMethod.php',
|
|
|
|
'ConpherenceQueryTransactionConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceQueryTransactionConduitAPIMethod.php',
|
2013-01-26 01:03:54 +01:00
|
|
|
'ConpherenceReplyHandler' => 'applications/conpherence/mail/ConpherenceReplyHandler.php',
|
2015-03-24 21:04:33 +01:00
|
|
|
'ConpherenceRoomListController' => 'applications/conpherence/controller/ConpherenceRoomListController.php',
|
2015-03-26 20:24:29 +01:00
|
|
|
'ConpherenceRoomTestCase' => 'applications/conpherence/__tests__/ConpherenceRoomTestCase.php',
|
2014-09-18 20:15:38 +02:00
|
|
|
'ConpherenceSchemaSpec' => 'applications/conpherence/storage/ConpherenceSchemaSpec.php',
|
2013-03-26 21:30:35 +01:00
|
|
|
'ConpherenceSettings' => 'applications/conpherence/constants/ConpherenceSettings.php',
|
2015-03-26 20:24:29 +01:00
|
|
|
'ConpherenceTestCase' => 'applications/conpherence/__tests__/ConpherenceTestCase.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceThread' => 'applications/conpherence/storage/ConpherenceThread.php',
|
2015-12-21 15:07:41 +01:00
|
|
|
'ConpherenceThreadIndexEngineExtension' => 'applications/conpherence/engineextension/ConpherenceThreadIndexEngineExtension.php',
|
2013-04-01 21:50:39 +02:00
|
|
|
'ConpherenceThreadListView' => 'applications/conpherence/view/ConpherenceThreadListView.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ConpherenceThreadMailReceiver' => 'applications/conpherence/mail/ConpherenceThreadMailReceiver.php',
|
2015-06-14 00:44:56 +02:00
|
|
|
'ConpherenceThreadMembersPolicyRule' => 'applications/conpherence/policyrule/ConpherenceThreadMembersPolicyRule.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceThreadQuery' => 'applications/conpherence/query/ConpherenceThreadQuery.php',
|
2015-04-13 21:45:55 +02:00
|
|
|
'ConpherenceThreadRemarkupRule' => 'applications/conpherence/remarkup/ConpherenceThreadRemarkupRule.php',
|
2015-03-24 21:04:33 +01:00
|
|
|
'ConpherenceThreadSearchEngine' => 'applications/conpherence/query/ConpherenceThreadSearchEngine.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceTransaction' => 'applications/conpherence/storage/ConpherenceTransaction.php',
|
|
|
|
'ConpherenceTransactionComment' => 'applications/conpherence/storage/ConpherenceTransactionComment.php',
|
|
|
|
'ConpherenceTransactionQuery' => 'applications/conpherence/query/ConpherenceTransactionQuery.php',
|
2015-04-14 21:25:35 +02:00
|
|
|
'ConpherenceTransactionRenderer' => 'applications/conpherence/ConpherenceTransactionRenderer.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceTransactionView' => 'applications/conpherence/view/ConpherenceTransactionView.php',
|
2013-04-10 20:37:04 +02:00
|
|
|
'ConpherenceUpdateActions' => 'applications/conpherence/constants/ConpherenceUpdateActions.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceUpdateController' => 'applications/conpherence/controller/ConpherenceUpdateController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConpherenceUpdateThreadConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceUpdateThreadConduitAPIMethod.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceViewController' => 'applications/conpherence/controller/ConpherenceViewController.php',
|
Conpherence - make the durable column kind of work and stuff
Summary:
Ref T7014. This hooks up the durable column such that when you open it up it loads your most recent Conpherence. You can then switch amongst the various widgets and stuff and everything works nicely.
Except...
- scroll bar does not work
- also doesn't work at HEAD when I add a ton of text to the UI with no changes? (wrapped $copy in array_fill(0, 1000, $copy))
- "widget selector" does not collapse when you select something else
- this part wasn't really specified so I used the aphlict dropdown stuff. didn't want to keep working on that if this was the wrong UI choice
- can not edit title
- do we still want that to be done by clicking on the title, which pops a dialogue?
- can not add participants or calendar events
- what should this UI be? maybe just a button on the top for "participants" and a button on the bottom for calendar? both on top?
- this is not pixel perfect to the mock or two I've seen around. Aside from generally being bad at that, I definitely didn't get the name + timestamps formatting correctly, because the standard DOM of that has timestamp FIRST which appears second due to a "float right". Seemed like a lot of special-casing for what might not even be that important in the UI so I punted. (And again, there's likely many unknown ways in which this isn't pixel perfect)
There's also code quality issues
- `ConpherenceWidgetConfigConstants` is hopefully temporary or at least gets more sleek as we keep progressing here
- copied some CSS from main Conpherence app
- DOM structure is pretty different
- there's some minor CSS tweaks too given the different width (not to mention the DOM structure being different)
- copied some JS from behavior-pontificate.js to sync threads relative to aphlict updates
- JS in general is like a better version of existing JS; these should collapse I'd hope?
- maybe the aphlict-behavior-dropdown change was badsauce?
...but all that said, this definitely feels really nice and I feel like adding stuff is going to be really easy compared to how normal Conpherence is.
Also includes a bonus bug fix - we now correctly update participation. The user would encounter this issue if they were in a conpherence that got some updates and then they went to a different page; they would have unread status for the messages that were ajax'd in. This patch fixes that by making sure we mark participation up to date with the proper transaction in all cases.
Test Plan: hit "\" to invoke the column and saw nice loading UI and my latest conpherence load. sent messages and verified they received A-OK by looking in DOM console. toggled various widges and verified they rendered correctly. opened up a second browser with a second user on the thread, sent a message, and it was received in a nice asynchronous fashion
Reviewers: chad, epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T7014
Differential Revision: https://secure.phabricator.com/D11968
2015-03-05 19:33:39 +01:00
|
|
|
'ConpherenceWidgetConfigConstants' => 'applications/conpherence/constants/ConpherenceWidgetConfigConstants.php',
|
2013-02-15 23:01:27 +01:00
|
|
|
'ConpherenceWidgetController' => 'applications/conpherence/controller/ConpherenceWidgetController.php',
|
2013-04-02 18:32:40 +02:00
|
|
|
'ConpherenceWidgetView' => 'applications/conpherence/view/ConpherenceWidgetView.php',
|
2014-10-13 20:17:09 +02:00
|
|
|
'DarkConsoleController' => 'applications/console/controller/DarkConsoleController.php',
|
|
|
|
'DarkConsoleCore' => 'applications/console/core/DarkConsoleCore.php',
|
|
|
|
'DarkConsoleDataController' => 'applications/console/controller/DarkConsoleDataController.php',
|
|
|
|
'DarkConsoleErrorLogPlugin' => 'applications/console/plugin/DarkConsoleErrorLogPlugin.php',
|
|
|
|
'DarkConsoleErrorLogPluginAPI' => 'applications/console/plugin/errorlog/DarkConsoleErrorLogPluginAPI.php',
|
|
|
|
'DarkConsoleEventPlugin' => 'applications/console/plugin/DarkConsoleEventPlugin.php',
|
|
|
|
'DarkConsoleEventPluginAPI' => 'applications/console/plugin/event/DarkConsoleEventPluginAPI.php',
|
|
|
|
'DarkConsolePlugin' => 'applications/console/plugin/DarkConsolePlugin.php',
|
|
|
|
'DarkConsoleRequestPlugin' => 'applications/console/plugin/DarkConsoleRequestPlugin.php',
|
|
|
|
'DarkConsoleServicesPlugin' => 'applications/console/plugin/DarkConsoleServicesPlugin.php',
|
2015-08-21 23:53:29 +02:00
|
|
|
'DarkConsoleStartupPlugin' => 'applications/console/plugin/DarkConsoleStartupPlugin.php',
|
2014-10-13 20:17:09 +02:00
|
|
|
'DarkConsoleXHProfPlugin' => 'applications/console/plugin/DarkConsoleXHProfPlugin.php',
|
|
|
|
'DarkConsoleXHProfPluginAPI' => 'applications/console/plugin/xhprof/DarkConsoleXHProfPluginAPI.php',
|
2012-07-02 19:49:00 +02:00
|
|
|
'DatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DatabaseConfigurationProvider.php',
|
|
|
|
'DefaultDatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DefaultDatabaseConfigurationProvider.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialAction' => 'applications/differential/constants/DifferentialAction.php',
|
2015-04-01 17:40:12 +02:00
|
|
|
'DifferentialActionEmailCommand' => 'applications/differential/command/DifferentialActionEmailCommand.php',
|
2013-10-22 02:00:50 +02:00
|
|
|
'DifferentialActionMenuEventListener' => 'applications/differential/event/DifferentialActionMenuEventListener.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialAddCommentView' => 'applications/differential/view/DifferentialAddCommentView.php',
|
2015-05-07 23:09:41 +02:00
|
|
|
'DifferentialAdjustmentMapTestCase' => 'applications/differential/storage/__tests__/DifferentialAdjustmentMapTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialAffectedPath' => 'applications/differential/storage/DifferentialAffectedPath.php',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialApplyPatchField' => 'applications/differential/customfield/DifferentialApplyPatchField.php',
|
|
|
|
'DifferentialAsanaRepresentationField' => 'applications/differential/customfield/DifferentialAsanaRepresentationField.php',
|
2014-03-08 02:05:00 +01:00
|
|
|
'DifferentialAuditorsField' => 'applications/differential/customfield/DifferentialAuditorsField.php',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialAuthorField' => 'applications/differential/customfield/DifferentialAuthorField.php',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialBlameRevisionField' => 'applications/differential/customfield/DifferentialBlameRevisionField.php',
|
2015-08-03 21:54:40 +02:00
|
|
|
'DifferentialBlockHeraldAction' => 'applications/differential/herald/DifferentialBlockHeraldAction.php',
|
2014-02-27 20:05:48 +01:00
|
|
|
'DifferentialBranchField' => 'applications/differential/customfield/DifferentialBranchField.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DifferentialChangeHeraldFieldGroup' => 'applications/differential/herald/DifferentialChangeHeraldFieldGroup.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialChangeType' => 'applications/differential/constants/DifferentialChangeType.php',
|
2014-04-01 17:23:34 +02:00
|
|
|
'DifferentialChangesSinceLastUpdateField' => 'applications/differential/customfield/DifferentialChangesSinceLastUpdateField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialChangeset' => 'applications/differential/storage/DifferentialChangeset.php',
|
|
|
|
'DifferentialChangesetDetailView' => 'applications/differential/view/DifferentialChangesetDetailView.php',
|
upgrade diffusion to use modern header UI and fix a few quirks
Summary:
upgrades are CrumbsView, HeaderView, PropertyListView, and ActionListView. I had to modify CrumbsView stuff a bit to handle the "advanced" diffusion crumbs.
Quirks fixed include making file tree view show up in diffusion, the page not have extra space when the file tree is hidden, links no longer breaking once you visit files (since without the change the files always got "/" appended and thus 404'd), and a differential quirk where it read "next step:" and that colon is a no no,
Test Plan: played around in diffusion and differential
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin, chad
Maniphest Tasks: T2048, T2178
Differential Revision: https://secure.phabricator.com/D4169
2012-12-13 02:50:42 +01:00
|
|
|
'DifferentialChangesetFileTreeSideNavBuilder' => 'applications/differential/view/DifferentialChangesetFileTreeSideNavBuilder.php',
|
Implement basic one-up and test renderers
Summary:
This is a half-step toward one-up and test renderers. This is mostly a structural change, and has no user-facing impact. It splits the rendering hierarchy like this:
- Renderer (more methods are abstract than before)
- HTML Renderer (most HTML stuff has moved down from the base to here)
- HTML 1-up (placeholder only -- not yet a functional implementation)
- HTML 2-up (minimal changes, uses mostly old code)
- Test Renderer (unit-testable renderer base, implements text versions of the HTML stuff)
- Test 1-up (selects 1-up mode for test rendering)
- Test 2-up (selects 2-up mode for test rendering)
Broadly, I'm trying to share as much code as possible by splitting rendering into more, smaller stages. Specifically, we do this:
- Combine the various sorts of inputs (changes, context, inlines, etc.) into a single, relatively homogenous list of "primitives". This happens in the base class.
- The primitive types are: old (diff left side), new (diff right side), context ("show more context"), no-context ("context not available") and inline (inline comment).
- Possibly, apply a filtering/reordering step to the primitives to get them ready for 1-up rendering. This mostly removes information, and does a small amount of reordering. This also happens in the base class.
- Pass the primitives to the actual renderer, to convert them into HTML, text, or whatever else. This happens in the leaf class.
The primitive implementation is not yet complete (it doesn't attach as much information to the primitives as it should -- stuff like coverage and copies), but covers the basics.
The existing HTMLTwoUp renderer does not use the primitive path; instead, it still goes down the old path.
Test Plan: Ran unit tests, looked at a bunch of diffs.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2009
Differential Revision: https://secure.phabricator.com/D4421
2013-01-14 23:20:06 +01:00
|
|
|
'DifferentialChangesetHTMLRenderer' => 'applications/differential/render/DifferentialChangesetHTMLRenderer.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialChangesetListView' => 'applications/differential/view/DifferentialChangesetListView.php',
|
2016-05-05 18:46:44 +02:00
|
|
|
'DifferentialChangesetOneUpMailRenderer' => 'applications/differential/render/DifferentialChangesetOneUpMailRenderer.php',
|
Implement basic one-up and test renderers
Summary:
This is a half-step toward one-up and test renderers. This is mostly a structural change, and has no user-facing impact. It splits the rendering hierarchy like this:
- Renderer (more methods are abstract than before)
- HTML Renderer (most HTML stuff has moved down from the base to here)
- HTML 1-up (placeholder only -- not yet a functional implementation)
- HTML 2-up (minimal changes, uses mostly old code)
- Test Renderer (unit-testable renderer base, implements text versions of the HTML stuff)
- Test 1-up (selects 1-up mode for test rendering)
- Test 2-up (selects 2-up mode for test rendering)
Broadly, I'm trying to share as much code as possible by splitting rendering into more, smaller stages. Specifically, we do this:
- Combine the various sorts of inputs (changes, context, inlines, etc.) into a single, relatively homogenous list of "primitives". This happens in the base class.
- The primitive types are: old (diff left side), new (diff right side), context ("show more context"), no-context ("context not available") and inline (inline comment).
- Possibly, apply a filtering/reordering step to the primitives to get them ready for 1-up rendering. This mostly removes information, and does a small amount of reordering. This also happens in the base class.
- Pass the primitives to the actual renderer, to convert them into HTML, text, or whatever else. This happens in the leaf class.
The primitive implementation is not yet complete (it doesn't attach as much information to the primitives as it should -- stuff like coverage and copies), but covers the basics.
The existing HTMLTwoUp renderer does not use the primitive path; instead, it still goes down the old path.
Test Plan: Ran unit tests, looked at a bunch of diffs.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2009
Differential Revision: https://secure.phabricator.com/D4421
2013-01-14 23:20:06 +01:00
|
|
|
'DifferentialChangesetOneUpRenderer' => 'applications/differential/render/DifferentialChangesetOneUpRenderer.php',
|
|
|
|
'DifferentialChangesetOneUpTestRenderer' => 'applications/differential/render/DifferentialChangesetOneUpTestRenderer.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialChangesetParser' => 'applications/differential/parser/DifferentialChangesetParser.php',
|
2012-06-15 09:53:26 +02:00
|
|
|
'DifferentialChangesetParserTestCase' => 'applications/differential/parser/__tests__/DifferentialChangesetParserTestCase.php',
|
2014-05-25 17:59:31 +02:00
|
|
|
'DifferentialChangesetQuery' => 'applications/differential/query/DifferentialChangesetQuery.php',
|
2012-12-08 01:19:57 +01:00
|
|
|
'DifferentialChangesetRenderer' => 'applications/differential/render/DifferentialChangesetRenderer.php',
|
Implement basic one-up and test renderers
Summary:
This is a half-step toward one-up and test renderers. This is mostly a structural change, and has no user-facing impact. It splits the rendering hierarchy like this:
- Renderer (more methods are abstract than before)
- HTML Renderer (most HTML stuff has moved down from the base to here)
- HTML 1-up (placeholder only -- not yet a functional implementation)
- HTML 2-up (minimal changes, uses mostly old code)
- Test Renderer (unit-testable renderer base, implements text versions of the HTML stuff)
- Test 1-up (selects 1-up mode for test rendering)
- Test 2-up (selects 2-up mode for test rendering)
Broadly, I'm trying to share as much code as possible by splitting rendering into more, smaller stages. Specifically, we do this:
- Combine the various sorts of inputs (changes, context, inlines, etc.) into a single, relatively homogenous list of "primitives". This happens in the base class.
- The primitive types are: old (diff left side), new (diff right side), context ("show more context"), no-context ("context not available") and inline (inline comment).
- Possibly, apply a filtering/reordering step to the primitives to get them ready for 1-up rendering. This mostly removes information, and does a small amount of reordering. This also happens in the base class.
- Pass the primitives to the actual renderer, to convert them into HTML, text, or whatever else. This happens in the leaf class.
The primitive implementation is not yet complete (it doesn't attach as much information to the primitives as it should -- stuff like coverage and copies), but covers the basics.
The existing HTMLTwoUp renderer does not use the primitive path; instead, it still goes down the old path.
Test Plan: Ran unit tests, looked at a bunch of diffs.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2009
Differential Revision: https://secure.phabricator.com/D4421
2013-01-14 23:20:06 +01:00
|
|
|
'DifferentialChangesetTestRenderer' => 'applications/differential/render/DifferentialChangesetTestRenderer.php',
|
2012-12-08 01:19:57 +01:00
|
|
|
'DifferentialChangesetTwoUpRenderer' => 'applications/differential/render/DifferentialChangesetTwoUpRenderer.php',
|
Implement basic one-up and test renderers
Summary:
This is a half-step toward one-up and test renderers. This is mostly a structural change, and has no user-facing impact. It splits the rendering hierarchy like this:
- Renderer (more methods are abstract than before)
- HTML Renderer (most HTML stuff has moved down from the base to here)
- HTML 1-up (placeholder only -- not yet a functional implementation)
- HTML 2-up (minimal changes, uses mostly old code)
- Test Renderer (unit-testable renderer base, implements text versions of the HTML stuff)
- Test 1-up (selects 1-up mode for test rendering)
- Test 2-up (selects 2-up mode for test rendering)
Broadly, I'm trying to share as much code as possible by splitting rendering into more, smaller stages. Specifically, we do this:
- Combine the various sorts of inputs (changes, context, inlines, etc.) into a single, relatively homogenous list of "primitives". This happens in the base class.
- The primitive types are: old (diff left side), new (diff right side), context ("show more context"), no-context ("context not available") and inline (inline comment).
- Possibly, apply a filtering/reordering step to the primitives to get them ready for 1-up rendering. This mostly removes information, and does a small amount of reordering. This also happens in the base class.
- Pass the primitives to the actual renderer, to convert them into HTML, text, or whatever else. This happens in the leaf class.
The primitive implementation is not yet complete (it doesn't attach as much information to the primitives as it should -- stuff like coverage and copies), but covers the basics.
The existing HTMLTwoUp renderer does not use the primitive path; instead, it still goes down the old path.
Test Plan: Ran unit tests, looked at a bunch of diffs.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2009
Differential Revision: https://secure.phabricator.com/D4421
2013-01-14 23:20:06 +01:00
|
|
|
'DifferentialChangesetTwoUpTestRenderer' => 'applications/differential/render/DifferentialChangesetTwoUpTestRenderer.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialChangesetViewController' => 'applications/differential/controller/DifferentialChangesetViewController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialCloseConduitAPIMethod' => 'applications/differential/conduit/DifferentialCloseConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialCommentPreviewController' => 'applications/differential/controller/DifferentialCommentPreviewController.php',
|
|
|
|
'DifferentialCommentSaveController' => 'applications/differential/controller/DifferentialCommentSaveController.php',
|
2014-03-08 02:44:35 +01:00
|
|
|
'DifferentialCommitMessageParser' => 'applications/differential/parser/DifferentialCommitMessageParser.php',
|
|
|
|
'DifferentialCommitMessageParserTestCase' => 'applications/differential/parser/__tests__/DifferentialCommitMessageParserTestCase.php',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialCommitsField' => 'applications/differential/customfield/DifferentialCommitsField.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialConduitAPIMethod' => 'applications/differential/conduit/DifferentialConduitAPIMethod.php',
|
2014-03-08 02:05:00 +01:00
|
|
|
'DifferentialConflictsField' => 'applications/differential/customfield/DifferentialConflictsField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialController' => 'applications/differential/controller/DifferentialController.php',
|
2014-02-21 20:52:52 +01:00
|
|
|
'DifferentialCoreCustomField' => 'applications/differential/customfield/DifferentialCoreCustomField.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialCreateCommentConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateCommentConduitAPIMethod.php',
|
|
|
|
'DifferentialCreateDiffConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateDiffConduitAPIMethod.php',
|
|
|
|
'DifferentialCreateInlineConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateInlineConduitAPIMethod.php',
|
2015-01-30 19:31:39 +01:00
|
|
|
'DifferentialCreateMailReceiver' => 'applications/differential/mail/DifferentialCreateMailReceiver.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialCreateRawDiffConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateRawDiffConduitAPIMethod.php',
|
|
|
|
'DifferentialCreateRevisionConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateRevisionConduitAPIMethod.php',
|
2014-02-19 01:32:55 +01:00
|
|
|
'DifferentialCustomField' => 'applications/differential/customfield/DifferentialCustomField.php',
|
2014-03-09 21:44:54 +01:00
|
|
|
'DifferentialCustomFieldDependsOnParser' => 'applications/differential/parser/DifferentialCustomFieldDependsOnParser.php',
|
|
|
|
'DifferentialCustomFieldDependsOnParserTestCase' => 'applications/differential/parser/__tests__/DifferentialCustomFieldDependsOnParserTestCase.php',
|
2013-09-26 22:48:36 +02:00
|
|
|
'DifferentialCustomFieldNumericIndex' => 'applications/differential/storage/DifferentialCustomFieldNumericIndex.php',
|
2014-03-09 21:44:54 +01:00
|
|
|
'DifferentialCustomFieldRevertsParser' => 'applications/differential/parser/DifferentialCustomFieldRevertsParser.php',
|
|
|
|
'DifferentialCustomFieldRevertsParserTestCase' => 'applications/differential/parser/__tests__/DifferentialCustomFieldRevertsParserTestCase.php',
|
2013-09-26 22:48:36 +02:00
|
|
|
'DifferentialCustomFieldStorage' => 'applications/differential/storage/DifferentialCustomFieldStorage.php',
|
|
|
|
'DifferentialCustomFieldStringIndex' => 'applications/differential/storage/DifferentialCustomFieldStringIndex.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialDAO' => 'applications/differential/storage/DifferentialDAO.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'DifferentialDefaultViewCapability' => 'applications/differential/capability/DifferentialDefaultViewCapability.php',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialDependenciesField' => 'applications/differential/customfield/DifferentialDependenciesField.php',
|
|
|
|
'DifferentialDependsOnField' => 'applications/differential/customfield/DifferentialDependsOnField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialDiff' => 'applications/differential/storage/DifferentialDiff.php',
|
2015-07-08 21:25:38 +02:00
|
|
|
'DifferentialDiffAffectedFilesHeraldField' => 'applications/differential/herald/DifferentialDiffAffectedFilesHeraldField.php',
|
|
|
|
'DifferentialDiffAuthorHeraldField' => 'applications/differential/herald/DifferentialDiffAuthorHeraldField.php',
|
|
|
|
'DifferentialDiffAuthorProjectsHeraldField' => 'applications/differential/herald/DifferentialDiffAuthorProjectsHeraldField.php',
|
|
|
|
'DifferentialDiffContentAddedHeraldField' => 'applications/differential/herald/DifferentialDiffContentAddedHeraldField.php',
|
|
|
|
'DifferentialDiffContentHeraldField' => 'applications/differential/herald/DifferentialDiffContentHeraldField.php',
|
|
|
|
'DifferentialDiffContentRemovedHeraldField' => 'applications/differential/herald/DifferentialDiffContentRemovedHeraldField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialDiffCreateController' => 'applications/differential/controller/DifferentialDiffCreateController.php',
|
2014-08-20 23:26:29 +02:00
|
|
|
'DifferentialDiffEditor' => 'applications/differential/editor/DifferentialDiffEditor.php',
|
2016-01-08 13:35:17 +01:00
|
|
|
'DifferentialDiffExtractionEngine' => 'applications/differential/engine/DifferentialDiffExtractionEngine.php',
|
2015-07-08 21:25:38 +02:00
|
|
|
'DifferentialDiffHeraldField' => 'applications/differential/herald/DifferentialDiffHeraldField.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DifferentialDiffHeraldFieldGroup' => 'applications/differential/herald/DifferentialDiffHeraldFieldGroup.php',
|
2015-03-09 20:40:29 +01:00
|
|
|
'DifferentialDiffInlineCommentQuery' => 'applications/differential/query/DifferentialDiffInlineCommentQuery.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DifferentialDiffPHIDType' => 'applications/differential/phid/DifferentialDiffPHIDType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialDiffProperty' => 'applications/differential/storage/DifferentialDiffProperty.php',
|
2013-07-01 21:38:42 +02:00
|
|
|
'DifferentialDiffQuery' => 'applications/differential/query/DifferentialDiffQuery.php',
|
2015-07-08 21:25:38 +02:00
|
|
|
'DifferentialDiffRepositoryHeraldField' => 'applications/differential/herald/DifferentialDiffRepositoryHeraldField.php',
|
|
|
|
'DifferentialDiffRepositoryProjectsHeraldField' => 'applications/differential/herald/DifferentialDiffRepositoryProjectsHeraldField.php',
|
2012-11-21 21:30:38 +01:00
|
|
|
'DifferentialDiffTestCase' => 'applications/differential/storage/__tests__/DifferentialDiffTestCase.php',
|
2014-11-19 00:32:23 +01:00
|
|
|
'DifferentialDiffTransaction' => 'applications/differential/storage/DifferentialDiffTransaction.php',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'DifferentialDiffTransactionQuery' => 'applications/differential/query/DifferentialDiffTransactionQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialDiffViewController' => 'applications/differential/controller/DifferentialDiffViewController.php',
|
2013-07-26 17:56:35 +02:00
|
|
|
'DifferentialDoorkeeperRevisionFeedStoryPublisher' => 'applications/differential/doorkeeper/DifferentialDoorkeeperRevisionFeedStoryPublisher.php',
|
2014-02-19 01:25:16 +01:00
|
|
|
'DifferentialDraft' => 'applications/differential/storage/DifferentialDraft.php',
|
2014-02-21 20:53:48 +01:00
|
|
|
'DifferentialEditPolicyField' => 'applications/differential/customfield/DifferentialEditPolicyField.php',
|
2014-03-09 21:44:54 +01:00
|
|
|
'DifferentialFieldParseException' => 'applications/differential/exception/DifferentialFieldParseException.php',
|
|
|
|
'DifferentialFieldValidationException' => 'applications/differential/exception/DifferentialFieldValidationException.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialFindConduitAPIMethod' => 'applications/differential/conduit/DifferentialFindConduitAPIMethod.php',
|
|
|
|
'DifferentialGetAllDiffsConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetAllDiffsConduitAPIMethod.php',
|
|
|
|
'DifferentialGetCommitMessageConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetCommitMessageConduitAPIMethod.php',
|
|
|
|
'DifferentialGetCommitPathsConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetCommitPathsConduitAPIMethod.php',
|
|
|
|
'DifferentialGetDiffConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetDiffConduitAPIMethod.php',
|
|
|
|
'DifferentialGetRawDiffConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetRawDiffConduitAPIMethod.php',
|
|
|
|
'DifferentialGetRevisionCommentsConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetRevisionCommentsConduitAPIMethod.php',
|
|
|
|
'DifferentialGetRevisionConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetRevisionConduitAPIMethod.php',
|
Land Revision button for hosted git repos
Summary:
ref T182.
Simple approach of clone, patch, push. While waiting for drydock, implement a hackish mutex
setup for the workspace, which should work ok as long as there's only one committer who is
carefull about theses things.
Less obvious note: This is taking the both author and commiter's 'primary email' for the commit -
which might rub some people wrong.
Test Plan:
With a hosted repo, created some diffs and landed them.
Also clicked button for some error cases, got the right error message.
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley
CC: hach-que, Korvin, epriestley, aran
Maniphest Tasks: T182
Differential Revision: https://secure.phabricator.com/D7486
2013-11-05 22:00:12 +01:00
|
|
|
'DifferentialGetWorkingCopy' => 'applications/differential/DifferentialGetWorkingCopy.php',
|
2015-01-04 20:33:42 +01:00
|
|
|
'DifferentialGitHubLandingStrategy' => 'applications/differential/landing/DifferentialGitHubLandingStrategy.php',
|
2014-03-08 02:05:00 +01:00
|
|
|
'DifferentialGitSVNIDField' => 'applications/differential/customfield/DifferentialGitSVNIDField.php',
|
2015-06-23 22:33:09 +02:00
|
|
|
'DifferentialHarbormasterField' => 'applications/differential/customfield/DifferentialHarbormasterField.php',
|
Allow inline comments to be individually hidden
Summary:
Ref T7447. Implements per-viewer comment hiding. Once a comment is obsolete or uninteresting, you can hide it completely.
This is sticky per-user.
My hope is that this will strike a better balance between concerns than some of the other approaches (conservative porting, summarization, hide-all).
Specifically, this adds a new action here:
{F435621}
Clicking it completely collapses the comment into a small icon on the previous line, and saves the comment state as hidden for you:
{F435626}
You can click the icon to reveal all hidden comments below the line.
Test Plan:
- Hid comments.
- Showed comments.
- Created, edited, deleted and submitted comments.
- Used Diffusion comments (hiding is not implemented there yet, but I'd plan to bring it there eventually if it works out in Differential).
Reviewers: btrahan, chad
Reviewed By: btrahan
Subscribers: jparise, yelirekim, epriestley
Maniphest Tasks: T7447
Differential Revision: https://secure.phabricator.com/D13009
2015-05-27 19:28:38 +02:00
|
|
|
'DifferentialHiddenComment' => 'applications/differential/storage/DifferentialHiddenComment.php',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialHostField' => 'applications/differential/customfield/DifferentialHostField.php',
|
2015-01-04 20:33:42 +01:00
|
|
|
'DifferentialHostedGitLandingStrategy' => 'applications/differential/landing/DifferentialHostedGitLandingStrategy.php',
|
|
|
|
'DifferentialHostedMercurialLandingStrategy' => 'applications/differential/landing/DifferentialHostedMercurialLandingStrategy.php',
|
2015-12-24 20:20:18 +01:00
|
|
|
'DifferentialHovercardEngineExtension' => 'applications/differential/engineextension/DifferentialHovercardEngineExtension.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialHunk' => 'applications/differential/storage/DifferentialHunk.php',
|
2013-01-09 22:11:17 +01:00
|
|
|
'DifferentialHunkParser' => 'applications/differential/parser/DifferentialHunkParser.php',
|
|
|
|
'DifferentialHunkParserTestCase' => 'applications/differential/parser/__tests__/DifferentialHunkParserTestCase.php',
|
2014-04-14 21:06:26 +02:00
|
|
|
'DifferentialHunkQuery' => 'applications/differential/query/DifferentialHunkQuery.php',
|
2012-06-27 19:44:29 +02:00
|
|
|
'DifferentialHunkTestCase' => 'applications/differential/storage/__tests__/DifferentialHunkTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialInlineComment' => 'applications/differential/storage/DifferentialInlineComment.php',
|
|
|
|
'DifferentialInlineCommentEditController' => 'applications/differential/controller/DifferentialInlineCommentEditController.php',
|
Rough cut of inline comment context
Summary:
Ref T10694. This is still missing some pieces, but seems to get most of the data into the mail in a plausible format:
- When an inline remarks on code, show the patch inline in the mail body.
- When an inline replies to another inline, show that other inline in the mail body.
- Apply remarkup rendering to inline content.
- Apply basic styling to mail body blocks.
Not covered yet:
- Syntax highlighting.
- Diff highlighting.
- Maybe clearer style/layout hints to connect comments to what they reply to? Current approach might get messy with inlines that have blockquotes and code blocks inside them, for example.
- I probably want to cap the amount of diff context we ever show to ~7 lines, even if you drag over 200 lines of code.
- CSS is a generally a bit rough still.
- The `unified-comment-context` option is effectively always on now, and should be removed.
- Text section is getting indented right now but probably shouldn't be.
- Spacing, etc., might be a bit off.
Test Plan:
Rigged Home to render these things, got a plausible-looking render (top is text, bottom is HTML):
{F1259052}
Sent myself some inline comment mail, got a plausible result.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10694
Differential Revision: https://secure.phabricator.com/D15850
2016-05-05 13:42:29 +02:00
|
|
|
'DifferentialInlineCommentMailView' => 'applications/differential/mail/DifferentialInlineCommentMailView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialInlineCommentPreviewController' => 'applications/differential/controller/DifferentialInlineCommentPreviewController.php',
|
2013-06-21 21:54:56 +02:00
|
|
|
'DifferentialInlineCommentQuery' => 'applications/differential/query/DifferentialInlineCommentQuery.php',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialJIRAIssuesField' => 'applications/differential/customfield/DifferentialJIRAIssuesField.php',
|
Land Revision button for hosted git repos
Summary:
ref T182.
Simple approach of clone, patch, push. While waiting for drydock, implement a hackish mutex
setup for the workspace, which should work ok as long as there's only one committer who is
carefull about theses things.
Less obvious note: This is taking the both author and commiter's 'primary email' for the commit -
which might rub some people wrong.
Test Plan:
With a hosted repo, created some diffs and landed them.
Also clicked button for some error cases, got the right error message.
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley
CC: hach-que, Korvin, epriestley, aran
Maniphest Tasks: T182
Differential Revision: https://secure.phabricator.com/D7486
2013-11-05 22:00:12 +01:00
|
|
|
'DifferentialLandingActionMenuEventListener' => 'applications/differential/landing/DifferentialLandingActionMenuEventListener.php',
|
|
|
|
'DifferentialLandingStrategy' => 'applications/differential/landing/DifferentialLandingStrategy.php',
|
2015-01-22 21:17:04 +01:00
|
|
|
'DifferentialLegacyHunk' => 'applications/differential/storage/DifferentialLegacyHunk.php',
|
2015-05-07 23:09:41 +02:00
|
|
|
'DifferentialLineAdjustmentMap' => 'applications/differential/parser/DifferentialLineAdjustmentMap.php',
|
2014-02-27 20:06:37 +01:00
|
|
|
'DifferentialLintField' => 'applications/differential/customfield/DifferentialLintField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialLintStatus' => 'applications/differential/constants/DifferentialLintStatus.php',
|
|
|
|
'DifferentialLocalCommitsView' => 'applications/differential/view/DifferentialLocalCommitsView.php',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialManiphestTasksField' => 'applications/differential/customfield/DifferentialManiphestTasksField.php',
|
2015-01-22 21:17:04 +01:00
|
|
|
'DifferentialModernHunk' => 'applications/differential/storage/DifferentialModernHunk.php',
|
2015-10-30 17:00:53 +01:00
|
|
|
'DifferentialNextStepField' => 'applications/differential/customfield/DifferentialNextStepField.php',
|
2014-01-15 19:02:31 +01:00
|
|
|
'DifferentialParseCacheGarbageCollector' => 'applications/differential/garbagecollector/DifferentialParseCacheGarbageCollector.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialParseCommitMessageConduitAPIMethod' => 'applications/differential/conduit/DifferentialParseCommitMessageConduitAPIMethod.php',
|
Implement basic one-up and test renderers
Summary:
This is a half-step toward one-up and test renderers. This is mostly a structural change, and has no user-facing impact. It splits the rendering hierarchy like this:
- Renderer (more methods are abstract than before)
- HTML Renderer (most HTML stuff has moved down from the base to here)
- HTML 1-up (placeholder only -- not yet a functional implementation)
- HTML 2-up (minimal changes, uses mostly old code)
- Test Renderer (unit-testable renderer base, implements text versions of the HTML stuff)
- Test 1-up (selects 1-up mode for test rendering)
- Test 2-up (selects 2-up mode for test rendering)
Broadly, I'm trying to share as much code as possible by splitting rendering into more, smaller stages. Specifically, we do this:
- Combine the various sorts of inputs (changes, context, inlines, etc.) into a single, relatively homogenous list of "primitives". This happens in the base class.
- The primitive types are: old (diff left side), new (diff right side), context ("show more context"), no-context ("context not available") and inline (inline comment).
- Possibly, apply a filtering/reordering step to the primitives to get them ready for 1-up rendering. This mostly removes information, and does a small amount of reordering. This also happens in the base class.
- Pass the primitives to the actual renderer, to convert them into HTML, text, or whatever else. This happens in the leaf class.
The primitive implementation is not yet complete (it doesn't attach as much information to the primitives as it should -- stuff like coverage and copies), but covers the basics.
The existing HTMLTwoUp renderer does not use the primitive path; instead, it still goes down the old path.
Test Plan: Ran unit tests, looked at a bunch of diffs.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2009
Differential Revision: https://secure.phabricator.com/D4421
2013-01-14 23:20:06 +01:00
|
|
|
'DifferentialParseRenderTestCase' => 'applications/differential/__tests__/DifferentialParseRenderTestCase.php',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialPathField' => 'applications/differential/customfield/DifferentialPathField.php',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialProjectReviewersField' => 'applications/differential/customfield/DifferentialProjectReviewersField.php',
|
2014-06-23 18:49:52 +02:00
|
|
|
'DifferentialProjectsField' => 'applications/differential/customfield/DifferentialProjectsField.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialQueryConduitAPIMethod' => 'applications/differential/conduit/DifferentialQueryConduitAPIMethod.php',
|
|
|
|
'DifferentialQueryDiffsConduitAPIMethod' => 'applications/differential/conduit/DifferentialQueryDiffsConduitAPIMethod.php',
|
2013-10-03 01:28:03 +02:00
|
|
|
'DifferentialRawDiffRenderer' => 'applications/differential/render/DifferentialRawDiffRenderer.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'DifferentialReleephRequestFieldSpecification' => 'applications/releeph/differential/DifferentialReleephRequestFieldSpecification.php',
|
2013-02-26 23:57:41 +01:00
|
|
|
'DifferentialRemarkupRule' => 'applications/differential/remarkup/DifferentialRemarkupRule.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'DifferentialReplyHandler' => 'applications/differential/mail/DifferentialReplyHandler.php',
|
2014-02-21 20:53:37 +01:00
|
|
|
'DifferentialRepositoryField' => 'applications/differential/customfield/DifferentialRepositoryField.php',
|
2013-09-27 00:28:42 +02:00
|
|
|
'DifferentialRepositoryLookup' => 'applications/differential/query/DifferentialRepositoryLookup.php',
|
Allow Herald to "Require legal signatures" for reviews
Summary:
Ref T3116. Add a Herald action "Require legal signatures" which requires revision authors to accept legal agreements before their revisions can be accepted.
- Herald will check which documents the author has signed, and trigger a "you have to sign X, Y, Z" for other documents.
- If the author has already signed everything, we don't spam the revision -- basically, this only triggers when signatures are missing.
- The UI will show which documents must be signed and warn that the revision can't be accepted until they're completed.
- Users aren't allowed to "Accept" the revision until documents are cleared.
Fixes T1157. The original install making the request (Hive) no longer uses Phabricator, and this satisfies our requirements.
Test Plan:
- Added a Herald rule.
- Created a revision, saw the rule trigger.
- Viewed as author and non-author, saw field UI (generic for non-author, specific for author), transaction UI, and accept-warning UI.
- Tried to accept revision.
- Signed document, saw UI update. Note that signatures don't currently //push// an update to the revision, but could eventually (like blocking tasks work).
- Accepted revision.
- Created another revision, saw rules not add the document (since it's already signed, this is the "no spam" case).
Reviewers: btrahan, chad
Reviewed By: chad
Subscribers: asherkin, epriestley
Maniphest Tasks: T1157, T3116
Differential Revision: https://secure.phabricator.com/D9771
2014-06-29 16:53:53 +02:00
|
|
|
'DifferentialRequiredSignaturesField' => 'applications/differential/customfield/DifferentialRequiredSignaturesField.php',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialRevertPlanField' => 'applications/differential/customfield/DifferentialRevertPlanField.php',
|
2014-03-08 02:05:00 +01:00
|
|
|
'DifferentialReviewedByField' => 'applications/differential/customfield/DifferentialReviewedByField.php',
|
2013-07-15 04:18:55 +02:00
|
|
|
'DifferentialReviewer' => 'applications/differential/storage/DifferentialReviewer.php',
|
2015-01-01 04:43:26 +01:00
|
|
|
'DifferentialReviewerForRevisionEdgeType' => 'applications/differential/edge/DifferentialReviewerForRevisionEdgeType.php',
|
2013-07-10 22:45:14 +02:00
|
|
|
'DifferentialReviewerStatus' => 'applications/differential/constants/DifferentialReviewerStatus.php',
|
2015-07-30 20:39:35 +02:00
|
|
|
'DifferentialReviewersAddBlockingReviewersHeraldAction' => 'applications/differential/herald/DifferentialReviewersAddBlockingReviewersHeraldAction.php',
|
|
|
|
'DifferentialReviewersAddBlockingSelfHeraldAction' => 'applications/differential/herald/DifferentialReviewersAddBlockingSelfHeraldAction.php',
|
|
|
|
'DifferentialReviewersAddReviewersHeraldAction' => 'applications/differential/herald/DifferentialReviewersAddReviewersHeraldAction.php',
|
|
|
|
'DifferentialReviewersAddSelfHeraldAction' => 'applications/differential/herald/DifferentialReviewersAddSelfHeraldAction.php',
|
2014-02-21 20:54:32 +01:00
|
|
|
'DifferentialReviewersField' => 'applications/differential/customfield/DifferentialReviewersField.php',
|
2015-07-30 20:39:35 +02:00
|
|
|
'DifferentialReviewersHeraldAction' => 'applications/differential/herald/DifferentialReviewersHeraldAction.php',
|
2013-10-05 16:54:42 +02:00
|
|
|
'DifferentialReviewersView' => 'applications/differential/view/DifferentialReviewersView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialRevision' => 'applications/differential/storage/DifferentialRevision.php',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionAffectedFilesHeraldField' => 'applications/differential/herald/DifferentialRevisionAffectedFilesHeraldField.php',
|
|
|
|
'DifferentialRevisionAuthorHeraldField' => 'applications/differential/herald/DifferentialRevisionAuthorHeraldField.php',
|
|
|
|
'DifferentialRevisionAuthorProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionAuthorProjectsHeraldField.php',
|
2014-10-14 01:55:26 +02:00
|
|
|
'DifferentialRevisionCloseDetailsController' => 'applications/differential/controller/DifferentialRevisionCloseDetailsController.php',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionContentAddedHeraldField' => 'applications/differential/herald/DifferentialRevisionContentAddedHeraldField.php',
|
|
|
|
'DifferentialRevisionContentHeraldField' => 'applications/differential/herald/DifferentialRevisionContentHeraldField.php',
|
|
|
|
'DifferentialRevisionContentRemovedHeraldField' => 'applications/differential/herald/DifferentialRevisionContentRemovedHeraldField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialRevisionControlSystem' => 'applications/differential/constants/DifferentialRevisionControlSystem.php',
|
2015-01-01 04:43:26 +01:00
|
|
|
'DifferentialRevisionDependedOnByRevisionEdgeType' => 'applications/differential/edge/DifferentialRevisionDependedOnByRevisionEdgeType.php',
|
|
|
|
'DifferentialRevisionDependsOnRevisionEdgeType' => 'applications/differential/edge/DifferentialRevisionDependsOnRevisionEdgeType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialRevisionEditController' => 'applications/differential/controller/DifferentialRevisionEditController.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'DifferentialRevisionFulltextEngine' => 'applications/differential/search/DifferentialRevisionFulltextEngine.php',
|
2015-01-01 04:43:26 +01:00
|
|
|
'DifferentialRevisionHasCommitEdgeType' => 'applications/differential/edge/DifferentialRevisionHasCommitEdgeType.php',
|
|
|
|
'DifferentialRevisionHasReviewerEdgeType' => 'applications/differential/edge/DifferentialRevisionHasReviewerEdgeType.php',
|
2014-07-18 00:41:08 +02:00
|
|
|
'DifferentialRevisionHasTaskEdgeType' => 'applications/differential/edge/DifferentialRevisionHasTaskEdgeType.php',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionHeraldField' => 'applications/differential/herald/DifferentialRevisionHeraldField.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DifferentialRevisionHeraldFieldGroup' => 'applications/differential/herald/DifferentialRevisionHeraldFieldGroup.php',
|
2014-03-08 02:05:00 +01:00
|
|
|
'DifferentialRevisionIDField' => 'applications/differential/customfield/DifferentialRevisionIDField.php',
|
Land Revision button for hosted git repos
Summary:
ref T182.
Simple approach of clone, patch, push. While waiting for drydock, implement a hackish mutex
setup for the workspace, which should work ok as long as there's only one committer who is
carefull about theses things.
Less obvious note: This is taking the both author and commiter's 'primary email' for the commit -
which might rub some people wrong.
Test Plan:
With a hosted repo, created some diffs and landed them.
Also clicked button for some error cases, got the right error message.
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley
CC: hach-que, Korvin, epriestley, aran
Maniphest Tasks: T182
Differential Revision: https://secure.phabricator.com/D7486
2013-11-05 22:00:12 +01:00
|
|
|
'DifferentialRevisionLandController' => 'applications/differential/controller/DifferentialRevisionLandController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialRevisionListController' => 'applications/differential/controller/DifferentialRevisionListController.php',
|
|
|
|
'DifferentialRevisionListView' => 'applications/differential/view/DifferentialRevisionListView.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'DifferentialRevisionMailReceiver' => 'applications/differential/mail/DifferentialRevisionMailReceiver.php',
|
2015-10-14 00:46:12 +02:00
|
|
|
'DifferentialRevisionOperationController' => 'applications/differential/controller/DifferentialRevisionOperationController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DifferentialRevisionPHIDType' => 'applications/differential/phid/DifferentialRevisionPHIDType.php',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionPackageHeraldField' => 'applications/differential/herald/DifferentialRevisionPackageHeraldField.php',
|
|
|
|
'DifferentialRevisionPackageOwnerHeraldField' => 'applications/differential/herald/DifferentialRevisionPackageOwnerHeraldField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialRevisionQuery' => 'applications/differential/query/DifferentialRevisionQuery.php',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionRepositoryHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryHeraldField.php',
|
|
|
|
'DifferentialRevisionRepositoryProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryProjectsHeraldField.php',
|
|
|
|
'DifferentialRevisionReviewersHeraldField' => 'applications/differential/herald/DifferentialRevisionReviewersHeraldField.php',
|
Use ApplicationSearch in Differential
Summary:
Ref T603. Ref T2625. Fixes T3241. Depends on D5451. Depends on D6346.
@wez, this changes the Differential revision list UI substantially and may generate a lot of bikeshedding / who-moved-my-cheese churn. See T3417 for context, for example. The motivations for this change are:
- The list now works on devices, like phones and tablets. This is a requirement to make the rest of Differential work on devices.
- Although ApplicationSearch intentionally presents a simpler interface initially and some options which were one click away before aren't now, it is much more powerful than the search it replaces and allows users to build, save, share, fork, edit, and customize a much wider range of queries. Users who used the old filters frequently can use Advanced Search -> Save Custom Query to create new versions of them, and of any other query. "Edit Queries.." allows users to remove and reorder queries, including builtin queries. Basically, there are like three things which have gone from "1-click" to "a few clicks", and ten trillion things which have gone from "hard/impossible" to "relatively easy".
The local screenshots look a bit iffy, but I think a lot of this is the fakenesss of my test data. If they still feel iffy in production we can tweak them until they feel good, like we did for Maniphest.
Test Plan:
{F48477}
{F48478}
Reviewers: btrahan, chad, wez
Reviewed By: btrahan
CC: aran, s
Maniphest Tasks: T603, T2625, T3241
Differential Revision: https://secure.phabricator.com/D6347
2013-07-03 15:11:07 +02:00
|
|
|
'DifferentialRevisionSearchEngine' => 'applications/differential/query/DifferentialRevisionSearchEngine.php',
|
2012-12-11 23:59:27 +01:00
|
|
|
'DifferentialRevisionStatus' => 'applications/differential/constants/DifferentialRevisionStatus.php',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionSummaryHeraldField' => 'applications/differential/herald/DifferentialRevisionSummaryHeraldField.php',
|
|
|
|
'DifferentialRevisionTitleHeraldField' => 'applications/differential/herald/DifferentialRevisionTitleHeraldField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/DifferentialRevisionUpdateHistoryView.php',
|
|
|
|
'DifferentialRevisionViewController' => 'applications/differential/controller/DifferentialRevisionViewController.php',
|
2014-09-18 17:25:34 +02:00
|
|
|
'DifferentialSchemaSpec' => 'applications/differential/storage/DifferentialSchemaSpec.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialSetDiffPropertyConduitAPIMethod' => 'applications/differential/conduit/DifferentialSetDiffPropertyConduitAPIMethod.php',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialStoredCustomField' => 'applications/differential/customfield/DifferentialStoredCustomField.php',
|
2014-02-21 20:54:08 +01:00
|
|
|
'DifferentialSubscribersField' => 'applications/differential/customfield/DifferentialSubscribersField.php',
|
2014-02-21 20:52:52 +01:00
|
|
|
'DifferentialSummaryField' => 'applications/differential/customfield/DifferentialSummaryField.php',
|
2014-02-21 20:53:27 +01:00
|
|
|
'DifferentialTestPlanField' => 'applications/differential/customfield/DifferentialTestPlanField.php',
|
2014-02-19 01:32:55 +01:00
|
|
|
'DifferentialTitleField' => 'applications/differential/customfield/DifferentialTitleField.php',
|
2013-06-21 21:54:29 +02:00
|
|
|
'DifferentialTransaction' => 'applications/differential/storage/DifferentialTransaction.php',
|
|
|
|
'DifferentialTransactionComment' => 'applications/differential/storage/DifferentialTransactionComment.php',
|
2014-02-19 01:32:55 +01:00
|
|
|
'DifferentialTransactionEditor' => 'applications/differential/editor/DifferentialTransactionEditor.php',
|
Migrate Differential comments to ApplicationTransactions
Summary:
Ref T2222. This is the big one.
This migrates each `DifferentialComment` to one or more ApplicationTransactions (action, cc, reviewers, update, comment, inlines), and makes `DifferentialComment` a double-reader for ApplicationTransactions.
The migration is pretty straightforward:
- If a comment took an action not otherwise covered, it gets an "action" transaction. This is something like "epriestley abandoned this revision.".
- If a comment updated the diff, it gets an "updated diff" transaction. Very old transactions of this type may not have a diff ID (probably only at Facebook).
- If a comment added or removed reviewers, it gets a "changed reviewers" transaction.
- If a comment added CCs, it gets a "subscribers" transaction.
- If a comment added comment text, it gets a "comment" transaction.
- For each inline attached to a comment, we generate an "inline" transaction.
Most comments generate a small number of transactions, but a few generate a significant number.
At HEAD, the code is basically already doing this, so comments in the last day or two already obey these rules, roughly, and will all generate only one transaction (except inlines).
Because we've already preallocated PHIDs in the comment text table, we only need to write to the transaction table.
NOTE: This significantly degrades Differential, making inline comments pretty much useless (they each get their own transaction, and don't show line numbers or files). The data is all fine, but the UI is garbage now. This needs to be fixed before we can deploy this to users, but it's easily separable since it's all just display code.
Specifically, they look like this:
{F112270}
Test Plan:
I've migrated locally and put things through their paces, but it's hard to catch sketchy stuff locally because most of my test data is nonsense and bad migrations wouldn't necessarily look out of place.
IMPORTANT: I'm planning to push this to a branch and then shift production over to the branch, and run it for a day or two before bringing it to master.
I generally feel good about this change: it's not that big since we were able to separate a lot of pieces out of it, and it's pretty straightforward. That said, it's still one of the most scary/dangerous changes we've ever made.
Reviewers: btrahan
CC: chad, aran
Maniphest Tasks: T2222
Differential Revision: https://secure.phabricator.com/D8210
2014-02-12 00:36:58 +01:00
|
|
|
'DifferentialTransactionQuery' => 'applications/differential/query/DifferentialTransactionQuery.php',
|
2014-02-12 23:05:40 +01:00
|
|
|
'DifferentialTransactionView' => 'applications/differential/view/DifferentialTransactionView.php',
|
2014-02-27 20:06:37 +01:00
|
|
|
'DifferentialUnitField' => 'applications/differential/customfield/DifferentialUnitField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialUnitStatus' => 'applications/differential/constants/DifferentialUnitStatus.php',
|
|
|
|
'DifferentialUnitTestResult' => 'applications/differential/constants/DifferentialUnitTestResult.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialUpdateRevisionConduitAPIMethod' => 'applications/differential/conduit/DifferentialUpdateRevisionConduitAPIMethod.php',
|
2014-02-21 20:53:48 +01:00
|
|
|
'DifferentialViewPolicyField' => 'applications/differential/customfield/DifferentialViewPolicyField.php',
|
2014-07-18 00:45:21 +02:00
|
|
|
'DiffusionAuditorDatasource' => 'applications/diffusion/typeahead/DiffusionAuditorDatasource.php',
|
2015-08-31 19:17:54 +02:00
|
|
|
'DiffusionAuditorFunctionDatasource' => 'applications/diffusion/typeahead/DiffusionAuditorFunctionDatasource.php',
|
2015-08-03 15:01:24 +02:00
|
|
|
'DiffusionAuditorsAddAuditorsHeraldAction' => 'applications/diffusion/herald/DiffusionAuditorsAddAuditorsHeraldAction.php',
|
|
|
|
'DiffusionAuditorsAddSelfHeraldAction' => 'applications/diffusion/herald/DiffusionAuditorsAddSelfHeraldAction.php',
|
|
|
|
'DiffusionAuditorsHeraldAction' => 'applications/diffusion/herald/DiffusionAuditorsHeraldAction.php',
|
2016-01-06 13:56:27 +01:00
|
|
|
'DiffusionBlameConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionBlameConduitAPIMethod.php',
|
|
|
|
'DiffusionBlameQuery' => 'applications/diffusion/query/blame/DiffusionBlameQuery.php',
|
2015-08-03 21:54:40 +02:00
|
|
|
'DiffusionBlockHeraldAction' => 'applications/diffusion/herald/DiffusionBlockHeraldAction.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionBranchQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionBranchQueryConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionBranchTableController' => 'applications/diffusion/controller/DiffusionBranchTableController.php',
|
|
|
|
'DiffusionBranchTableView' => 'applications/diffusion/view/DiffusionBranchTableView.php',
|
|
|
|
'DiffusionBrowseController' => 'applications/diffusion/controller/DiffusionBrowseController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionBrowseQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionBrowseQueryConduitAPIMethod.php',
|
Diffusion - move DiffusionBrowseQuery => Conduit
Summary: see title. Ref T2784.
Test Plan:
In diffusion, for each of SVN, Mercurial, and Git, I loaded up /diffusion/CALLSIGN/. I verified the README was displayed and things looked good. Next I clicked on "browse" on the top-most commit and verified things looked correct. Also clicked through to a file for a good measure and things looked good.
In owners, for each of SVN, Mercurial, and Git, I played around with the path typeahead / validator. It worked correctly!
Reviewers: epriestley
Reviewed By: epriestley
CC: chad, aran, Korvin
Maniphest Tasks: T2784
Differential Revision: https://secure.phabricator.com/D5883
2013-05-10 20:02:58 +02:00
|
|
|
'DiffusionBrowseResultSet' => 'applications/diffusion/data/DiffusionBrowseResultSet.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionBrowseTableView' => 'applications/diffusion/view/DiffusionBrowseTableView.php',
|
2015-01-23 22:31:17 +01:00
|
|
|
'DiffusionCachedResolveRefsQuery' => 'applications/diffusion/query/DiffusionCachedResolveRefsQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionChangeController' => 'applications/diffusion/controller/DiffusionChangeController.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DiffusionChangeHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionChangeHeraldFieldGroup.php',
|
2016-04-19 00:22:52 +02:00
|
|
|
'DiffusionCommandEngine' => 'applications/diffusion/protocol/DiffusionCommandEngine.php',
|
|
|
|
'DiffusionCommandEngineTestCase' => 'applications/diffusion/protocol/__tests__/DiffusionCommandEngineTestCase.php',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitAffectedFilesHeraldField' => 'applications/diffusion/herald/DiffusionCommitAffectedFilesHeraldField.php',
|
|
|
|
'DiffusionCommitAuthorHeraldField' => 'applications/diffusion/herald/DiffusionCommitAuthorHeraldField.php',
|
|
|
|
'DiffusionCommitAutocloseHeraldField' => 'applications/diffusion/herald/DiffusionCommitAutocloseHeraldField.php',
|
2012-08-01 01:27:48 +02:00
|
|
|
'DiffusionCommitBranchesController' => 'applications/diffusion/controller/DiffusionCommitBranchesController.php',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitBranchesHeraldField' => 'applications/diffusion/herald/DiffusionCommitBranchesHeraldField.php',
|
|
|
|
'DiffusionCommitCommitterHeraldField' => 'applications/diffusion/herald/DiffusionCommitCommitterHeraldField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionCommitController' => 'applications/diffusion/controller/DiffusionCommitController.php',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitDiffContentAddedHeraldField' => 'applications/diffusion/herald/DiffusionCommitDiffContentAddedHeraldField.php',
|
|
|
|
'DiffusionCommitDiffContentHeraldField' => 'applications/diffusion/herald/DiffusionCommitDiffContentHeraldField.php',
|
|
|
|
'DiffusionCommitDiffContentRemovedHeraldField' => 'applications/diffusion/herald/DiffusionCommitDiffContentRemovedHeraldField.php',
|
|
|
|
'DiffusionCommitDiffEnormousHeraldField' => 'applications/diffusion/herald/DiffusionCommitDiffEnormousHeraldField.php',
|
2012-08-08 19:03:41 +02:00
|
|
|
'DiffusionCommitEditController' => 'applications/diffusion/controller/DiffusionCommitEditController.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'DiffusionCommitFulltextEngine' => 'applications/repository/search/DiffusionCommitFulltextEngine.php',
|
2015-01-01 04:43:26 +01:00
|
|
|
'DiffusionCommitHasRevisionEdgeType' => 'applications/diffusion/edge/DiffusionCommitHasRevisionEdgeType.php',
|
2014-07-18 00:42:06 +02:00
|
|
|
'DiffusionCommitHasTaskEdgeType' => 'applications/diffusion/edge/DiffusionCommitHasTaskEdgeType.php',
|
2013-12-20 21:38:15 +01:00
|
|
|
'DiffusionCommitHash' => 'applications/diffusion/data/DiffusionCommitHash.php',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitHeraldField' => 'applications/diffusion/herald/DiffusionCommitHeraldField.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DiffusionCommitHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionCommitHeraldFieldGroup.php',
|
2013-12-03 00:45:36 +01:00
|
|
|
'DiffusionCommitHookEngine' => 'applications/diffusion/engine/DiffusionCommitHookEngine.php',
|
2013-12-03 19:28:39 +01:00
|
|
|
'DiffusionCommitHookRejectException' => 'applications/diffusion/exception/DiffusionCommitHookRejectException.php',
|
2015-12-05 21:54:51 +01:00
|
|
|
'DiffusionCommitMergeHeraldField' => 'applications/diffusion/herald/DiffusionCommitMergeHeraldField.php',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitMessageHeraldField' => 'applications/diffusion/herald/DiffusionCommitMessageHeraldField.php',
|
|
|
|
'DiffusionCommitPackageAuditHeraldField' => 'applications/diffusion/herald/DiffusionCommitPackageAuditHeraldField.php',
|
|
|
|
'DiffusionCommitPackageHeraldField' => 'applications/diffusion/herald/DiffusionCommitPackageHeraldField.php',
|
|
|
|
'DiffusionCommitPackageOwnerHeraldField' => 'applications/diffusion/herald/DiffusionCommitPackageOwnerHeraldField.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionCommitParentsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionCommitParentsQueryConduitAPIMethod.php',
|
2013-02-27 17:04:54 +01:00
|
|
|
'DiffusionCommitQuery' => 'applications/diffusion/query/DiffusionCommitQuery.php',
|
2013-12-19 02:48:06 +01:00
|
|
|
'DiffusionCommitRef' => 'applications/diffusion/data/DiffusionCommitRef.php',
|
2013-12-31 20:08:08 +01:00
|
|
|
'DiffusionCommitRemarkupRule' => 'applications/diffusion/remarkup/DiffusionCommitRemarkupRule.php',
|
2014-12-02 03:48:20 +01:00
|
|
|
'DiffusionCommitRemarkupRuleTestCase' => 'applications/diffusion/remarkup/__tests__/DiffusionCommitRemarkupRuleTestCase.php',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitRepositoryHeraldField' => 'applications/diffusion/herald/DiffusionCommitRepositoryHeraldField.php',
|
|
|
|
'DiffusionCommitRepositoryProjectsHeraldField' => 'applications/diffusion/herald/DiffusionCommitRepositoryProjectsHeraldField.php',
|
Write edges for commit reverts
Summary:
Ref T1751. When a commit reverts another commit:
- Add an edge linking them;
- Show the edge in Diffusion.
Next steps are:
- If the reverted commit is associated with a Differential revision, leave a comment;
- Also leave a comment on the commit (no API yet);
- Also trigger an audit by the original commit's author.
Test Plan: Used `scripts/repository/reparse.php --message ...` to parse commits with revert language. Verified they appear correctly in Diffusion, and update Differential.
Reviewers: btrahan, epriestley
Reviewed By: btrahan, epriestley
Subscribers: Korvin, epriestley, cburroughs, joshuaspence, sascha-egerer, aran
Maniphest Tasks: T4896, T1751
Differential Revision: https://secure.phabricator.com/D5846
2015-01-04 20:52:38 +01:00
|
|
|
'DiffusionCommitRevertedByCommitEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertedByCommitEdgeType.php',
|
|
|
|
'DiffusionCommitRevertsCommitEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertsCommitEdgeType.php',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitReviewerHeraldField' => 'applications/diffusion/herald/DiffusionCommitReviewerHeraldField.php',
|
|
|
|
'DiffusionCommitRevisionAcceptedHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionAcceptedHeraldField.php',
|
|
|
|
'DiffusionCommitRevisionHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionHeraldField.php',
|
|
|
|
'DiffusionCommitRevisionReviewersHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionReviewersHeraldField.php',
|
|
|
|
'DiffusionCommitRevisionSubscribersHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionSubscribersHeraldField.php',
|
2012-08-01 01:27:48 +02:00
|
|
|
'DiffusionCommitTagsController' => 'applications/diffusion/controller/DiffusionCommitTagsController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionController' => 'applications/diffusion/controller/DiffusionController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionCreateCommentConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionCreateCommentConduitAPIMethod.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'DiffusionCreateRepositoriesCapability' => 'applications/diffusion/capability/DiffusionCreateRepositoriesCapability.php',
|
|
|
|
'DiffusionDefaultEditCapability' => 'applications/diffusion/capability/DiffusionDefaultEditCapability.php',
|
|
|
|
'DiffusionDefaultPushCapability' => 'applications/diffusion/capability/DiffusionDefaultPushCapability.php',
|
|
|
|
'DiffusionDefaultViewCapability' => 'applications/diffusion/capability/DiffusionDefaultViewCapability.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionDiffController' => 'applications/diffusion/controller/DiffusionDiffController.php',
|
2015-03-09 20:50:33 +01:00
|
|
|
'DiffusionDiffInlineCommentQuery' => 'applications/diffusion/query/DiffusionDiffInlineCommentQuery.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionDiffQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionDiffQueryConduitAPIMethod.php',
|
2013-07-26 19:31:35 +02:00
|
|
|
'DiffusionDoorkeeperCommitFeedStoryPublisher' => 'applications/diffusion/doorkeeper/DiffusionDoorkeeperCommitFeedStoryPublisher.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionEmptyResultView' => 'applications/diffusion/view/DiffusionEmptyResultView.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionExistsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionExistsQueryConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionExternalController' => 'applications/diffusion/controller/DiffusionExternalController.php',
|
2015-05-31 16:36:54 +02:00
|
|
|
'DiffusionExternalSymbolQuery' => 'applications/diffusion/symbol/DiffusionExternalSymbolQuery.php',
|
|
|
|
'DiffusionExternalSymbolsSource' => 'applications/diffusion/symbol/DiffusionExternalSymbolsSource.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionFileContentQuery.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionFileContentQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionFileContentQueryConduitAPIMethod.php',
|
|
|
|
'DiffusionFindSymbolsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionFindSymbolsConduitAPIMethod.php',
|
|
|
|
'DiffusionGetLintMessagesConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionGetLintMessagesConduitAPIMethod.php',
|
|
|
|
'DiffusionGetRecentCommitsByPathConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionGetRecentCommitsByPathConduitAPIMethod.php',
|
2016-01-06 13:56:27 +01:00
|
|
|
'DiffusionGitBlameQuery' => 'applications/diffusion/query/blame/DiffusionGitBlameQuery.php',
|
2013-05-01 23:56:36 +02:00
|
|
|
'DiffusionGitBranch' => 'applications/diffusion/data/DiffusionGitBranch.php',
|
|
|
|
'DiffusionGitBranchTestCase' => 'applications/diffusion/data/__tests__/DiffusionGitBranchTestCase.php',
|
2016-04-19 00:22:52 +02:00
|
|
|
'DiffusionGitCommandEngine' => 'applications/diffusion/protocol/DiffusionGitCommandEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionGitFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionGitFileContentQuery.php',
|
2016-03-16 15:44:25 +01:00
|
|
|
'DiffusionGitLFSAuthenticateWorkflow' => 'applications/diffusion/gitlfs/DiffusionGitLFSAuthenticateWorkflow.php',
|
2016-03-16 20:42:21 +01:00
|
|
|
'DiffusionGitLFSResponse' => 'applications/diffusion/response/DiffusionGitLFSResponse.php',
|
2016-03-16 15:44:25 +01:00
|
|
|
'DiffusionGitLFSTemporaryTokenType' => 'applications/diffusion/gitlfs/DiffusionGitLFSTemporaryTokenType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionGitRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionGitRawDiffQuery.php',
|
2015-01-04 20:33:18 +01:00
|
|
|
'DiffusionGitReceivePackSSHWorkflow' => 'applications/diffusion/ssh/DiffusionGitReceivePackSSHWorkflow.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionGitRequest' => 'applications/diffusion/request/DiffusionGitRequest.php',
|
2013-10-26 21:10:52 +02:00
|
|
|
'DiffusionGitResponse' => 'applications/diffusion/response/DiffusionGitResponse.php',
|
2015-01-04 20:33:18 +01:00
|
|
|
'DiffusionGitSSHWorkflow' => 'applications/diffusion/ssh/DiffusionGitSSHWorkflow.php',
|
|
|
|
'DiffusionGitUploadPackSSHWorkflow' => 'applications/diffusion/ssh/DiffusionGitUploadPackSSHWorkflow.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionHistoryController' => 'applications/diffusion/controller/DiffusionHistoryController.php',
|
2014-08-02 09:05:49 +02:00
|
|
|
'DiffusionHistoryQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionHistoryQueryConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionHistoryTableView' => 'applications/diffusion/view/DiffusionHistoryTableView.php',
|
2015-12-24 20:20:18 +01:00
|
|
|
'DiffusionHovercardEngineExtension' => 'applications/diffusion/engineextension/DiffusionHovercardEngineExtension.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionInlineCommentController' => 'applications/diffusion/controller/DiffusionInlineCommentController.php',
|
2012-07-23 20:01:28 +02:00
|
|
|
'DiffusionInlineCommentPreviewController' => 'applications/diffusion/controller/DiffusionInlineCommentPreviewController.php',
|
2016-04-08 22:08:56 +02:00
|
|
|
'DiffusionInternalGitRawDiffQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionInternalGitRawDiffQueryConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionLastModifiedController' => 'applications/diffusion/controller/DiffusionLastModifiedController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionLastModifiedQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionLastModifiedQueryConduitAPIMethod.php',
|
2012-11-08 20:11:44 +01:00
|
|
|
'DiffusionLintController' => 'applications/diffusion/controller/DiffusionLintController.php',
|
2014-05-11 00:21:05 +02:00
|
|
|
'DiffusionLintCountQuery' => 'applications/diffusion/query/DiffusionLintCountQuery.php',
|
2012-11-09 03:37:15 +01:00
|
|
|
'DiffusionLintSaveRunner' => 'applications/diffusion/DiffusionLintSaveRunner.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionLookSoonConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionLookSoonConduitAPIMethod.php',
|
2013-12-20 21:38:44 +01:00
|
|
|
'DiffusionLowLevelCommitFieldsQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelCommitFieldsQuery.php',
|
2013-12-19 20:05:06 +01:00
|
|
|
'DiffusionLowLevelCommitQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelCommitQuery.php',
|
2013-10-30 21:06:09 +01:00
|
|
|
'DiffusionLowLevelGitRefQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelGitRefQuery.php',
|
2013-11-04 21:15:32 +01:00
|
|
|
'DiffusionLowLevelMercurialBranchesQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelMercurialBranchesQuery.php',
|
2014-08-28 22:08:42 +02:00
|
|
|
'DiffusionLowLevelMercurialPathsQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelMercurialPathsQuery.php',
|
2015-10-13 02:50:26 +02:00
|
|
|
'DiffusionLowLevelMercurialPathsQueryTests' => 'applications/diffusion/query/lowlevel/__tests__/DiffusionLowLevelMercurialPathsQueryTests.php',
|
2013-12-20 21:39:21 +01:00
|
|
|
'DiffusionLowLevelParentsQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelParentsQuery.php',
|
2013-10-30 21:06:09 +01:00
|
|
|
'DiffusionLowLevelQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelQuery.php',
|
2013-11-04 23:13:07 +01:00
|
|
|
'DiffusionLowLevelResolveRefsQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelResolveRefsQuery.php',
|
2016-01-06 13:56:27 +01:00
|
|
|
'DiffusionMercurialBlameQuery' => 'applications/diffusion/query/blame/DiffusionMercurialBlameQuery.php',
|
2016-04-19 00:22:52 +02:00
|
|
|
'DiffusionMercurialCommandEngine' => 'applications/diffusion/protocol/DiffusionMercurialCommandEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionMercurialFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionMercurialFileContentQuery.php',
|
|
|
|
'DiffusionMercurialRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionMercurialRawDiffQuery.php',
|
|
|
|
'DiffusionMercurialRequest' => 'applications/diffusion/request/DiffusionMercurialRequest.php',
|
2013-11-07 03:00:42 +01:00
|
|
|
'DiffusionMercurialResponse' => 'applications/diffusion/response/DiffusionMercurialResponse.php',
|
2015-01-04 20:33:18 +01:00
|
|
|
'DiffusionMercurialSSHWorkflow' => 'applications/diffusion/ssh/DiffusionMercurialSSHWorkflow.php',
|
|
|
|
'DiffusionMercurialServeSSHWorkflow' => 'applications/diffusion/ssh/DiffusionMercurialServeSSHWorkflow.php',
|
2015-01-13 21:03:32 +01:00
|
|
|
'DiffusionMercurialWireClientSSHProtocolChannel' => 'applications/diffusion/ssh/DiffusionMercurialWireClientSSHProtocolChannel.php',
|
2013-11-07 03:00:42 +01:00
|
|
|
'DiffusionMercurialWireProtocol' => 'applications/diffusion/protocol/DiffusionMercurialWireProtocol.php',
|
2015-10-10 16:14:48 +02:00
|
|
|
'DiffusionMercurialWireProtocolTests' => 'applications/diffusion/protocol/__tests__/DiffusionMercurialWireProtocolTests.php',
|
2015-01-04 20:33:18 +01:00
|
|
|
'DiffusionMercurialWireSSHTestCase' => 'applications/diffusion/ssh/__tests__/DiffusionMercurialWireSSHTestCase.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionMergedCommitsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionMergedCommitsQueryConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionPathChange' => 'applications/diffusion/data/DiffusionPathChange.php',
|
|
|
|
'DiffusionPathChangeQuery' => 'applications/diffusion/query/pathchange/DiffusionPathChangeQuery.php',
|
|
|
|
'DiffusionPathCompleteController' => 'applications/diffusion/controller/DiffusionPathCompleteController.php',
|
|
|
|
'DiffusionPathIDQuery' => 'applications/diffusion/query/pathid/DiffusionPathIDQuery.php',
|
|
|
|
'DiffusionPathQuery' => 'applications/diffusion/query/DiffusionPathQuery.php',
|
|
|
|
'DiffusionPathQueryTestCase' => 'applications/diffusion/query/pathid/__tests__/DiffusionPathQueryTestCase.php',
|
2014-05-13 23:08:21 +02:00
|
|
|
'DiffusionPathTreeController' => 'applications/diffusion/controller/DiffusionPathTreeController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionPathValidateController' => 'applications/diffusion/controller/DiffusionPathValidateController.php',
|
2015-05-31 16:36:54 +02:00
|
|
|
'DiffusionPhpExternalSymbolsSource' => 'applications/diffusion/symbol/DiffusionPhpExternalSymbolsSource.php',
|
2015-07-08 21:26:57 +02:00
|
|
|
'DiffusionPreCommitContentAffectedFilesHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAffectedFilesHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentAuthorHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAuthorHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentAuthorRawHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAuthorRawHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentBranchesHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentBranchesHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentCommitterHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentCommitterHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentCommitterRawHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentCommitterRawHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentDiffContentAddedHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentDiffContentAddedHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentDiffContentHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentDiffContentHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentDiffContentRemovedHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentDiffContentRemovedHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentDiffEnormousHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentDiffEnormousHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentMergeHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentMergeHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentMessageHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentMessageHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentPusherHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentPusherHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentPusherIsCommitterHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentPusherIsCommitterHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentPusherProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentPusherProjectsHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentRepositoryHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRepositoryHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentRepositoryProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRepositoryProjectsHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentRevisionAcceptedHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionAcceptedHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentRevisionHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentRevisionReviewersHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionReviewersHeraldField.php',
|
|
|
|
'DiffusionPreCommitContentRevisionSubscribersHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionSubscribersHeraldField.php',
|
2015-07-08 21:26:00 +02:00
|
|
|
'DiffusionPreCommitRefChangeHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefChangeHeraldField.php',
|
|
|
|
'DiffusionPreCommitRefHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefHeraldField.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DiffusionPreCommitRefHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionPreCommitRefHeraldFieldGroup.php',
|
2015-07-08 21:26:00 +02:00
|
|
|
'DiffusionPreCommitRefNameHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefNameHeraldField.php',
|
|
|
|
'DiffusionPreCommitRefPusherHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefPusherHeraldField.php',
|
|
|
|
'DiffusionPreCommitRefPusherProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefPusherProjectsHeraldField.php',
|
|
|
|
'DiffusionPreCommitRefRepositoryHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefRepositoryHeraldField.php',
|
|
|
|
'DiffusionPreCommitRefRepositoryProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefRepositoryProjectsHeraldField.php',
|
|
|
|
'DiffusionPreCommitRefTypeHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefTypeHeraldField.php',
|
2016-02-18 13:06:13 +01:00
|
|
|
'DiffusionPullEventGarbageCollector' => 'applications/diffusion/garbagecollector/DiffusionPullEventGarbageCollector.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'DiffusionPushCapability' => 'applications/diffusion/capability/DiffusionPushCapability.php',
|
2014-03-26 15:42:30 +01:00
|
|
|
'DiffusionPushEventViewController' => 'applications/diffusion/controller/DiffusionPushEventViewController.php',
|
|
|
|
'DiffusionPushLogController' => 'applications/diffusion/controller/DiffusionPushLogController.php',
|
2013-12-05 20:56:14 +01:00
|
|
|
'DiffusionPushLogListController' => 'applications/diffusion/controller/DiffusionPushLogListController.php',
|
2014-05-13 23:00:24 +02:00
|
|
|
'DiffusionPushLogListView' => 'applications/diffusion/view/DiffusionPushLogListView.php',
|
2015-05-31 16:36:54 +02:00
|
|
|
'DiffusionPythonExternalSymbolsSource' => 'applications/diffusion/symbol/DiffusionPythonExternalSymbolsSource.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionQuery' => 'applications/diffusion/query/DiffusionQuery.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionQueryCommitsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionQueryCommitsConduitAPIMethod.php',
|
|
|
|
'DiffusionQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionQueryConduitAPIMethod.php',
|
|
|
|
'DiffusionQueryPathsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionQueryPathsConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionRawDiffQuery.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionRawDiffQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRawDiffQueryConduitAPIMethod.php',
|
2014-12-31 20:54:52 +01:00
|
|
|
'DiffusionReadmeView' => 'applications/diffusion/view/DiffusionReadmeView.php',
|
2015-12-10 22:17:11 +01:00
|
|
|
'DiffusionRefDatasource' => 'applications/diffusion/typeahead/DiffusionRefDatasource.php',
|
2014-05-13 22:52:33 +02:00
|
|
|
'DiffusionRefNotFoundException' => 'applications/diffusion/exception/DiffusionRefNotFoundException.php',
|
2015-04-27 12:49:57 +02:00
|
|
|
'DiffusionRefTableController' => 'applications/diffusion/controller/DiffusionRefTableController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionRefsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRefsQueryConduitAPIMethod.php',
|
2012-09-28 23:36:47 +02:00
|
|
|
'DiffusionRenameHistoryQuery' => 'applications/diffusion/query/DiffusionRenameHistoryQuery.php',
|
2016-04-28 00:40:35 +02:00
|
|
|
'DiffusionRepositoryActionsManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryActionsManagementPanel.php',
|
2016-04-27 00:54:01 +02:00
|
|
|
'DiffusionRepositoryAutomationManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryAutomationManagementPanel.php',
|
2016-04-17 02:33:27 +02:00
|
|
|
'DiffusionRepositoryBasicsManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryBasicsManagementPanel.php',
|
2016-04-27 19:51:13 +02:00
|
|
|
'DiffusionRepositoryBranchesManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryBranchesManagementPanel.php',
|
2015-01-01 17:07:26 +01:00
|
|
|
'DiffusionRepositoryByIDRemarkupRule' => 'applications/diffusion/remarkup/DiffusionRepositoryByIDRemarkupRule.php',
|
2016-04-24 18:04:27 +02:00
|
|
|
'DiffusionRepositoryClusterEngine' => 'applications/diffusion/protocol/DiffusionRepositoryClusterEngine.php',
|
Make cluster repositories more chatty
Summary:
Ref T10860. At least in Git over SSH, we can freely echo a bunch of stuff to stderr and Git will print it to the console, so we can tell users what's going on.
This should make debugging, etc., easier. We could tone this down a little bit once things are more stable if it's a little too chatty.
Test Plan:
```
$ echo D >> record && git commit -am D && git push
[master ca5efff] D
1 file changed, 1 insertion(+)
# Push received by "local001.phacility.net", forwarding to cluster host.
# Waiting up to 120 second(s) for a cluster write lock...
# Acquired write lock immediately.
# Waiting up to 120 second(s) for a cluster read lock on "local001.phacility.net"...
# Acquired read lock immediately.
# Device "local001.phacility.net" is already a cluster leader and does not need to be synchronized.
# Ready to receive on cluster host "local001.phacility.net".
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 256 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To ssh://local@localvault.phacility.com/diffusion/26/locktopia.git
8616189..ca5efff master -> master
```
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10860
Differential Revision: https://secure.phabricator.com/D15791
2016-04-24 18:49:18 +02:00
|
|
|
'DiffusionRepositoryClusterEngineLogInterface' => 'applications/diffusion/protocol/DiffusionRepositoryClusterEngineLogInterface.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionRepositoryController' => 'applications/diffusion/controller/DiffusionRepositoryController.php',
|
2014-07-11 01:18:04 +02:00
|
|
|
'DiffusionRepositoryDatasource' => 'applications/diffusion/typeahead/DiffusionRepositoryDatasource.php',
|
Accept and route VCS HTTP requests
Summary:
Mostly ripped from D7391, with some changes:
- Serve repositories at `/diffusion/X/`, with no special `/git/` or `/serve/` URI component.
- This requires a little bit of magic, but I got the magic working for Git, Mercurial and SVN, and it seems reasonable.
- I think having one URI for everything will make it easier for users to understand.
- One downside is that git will clone into `X` by default, but I think that's not a big deal, and we can work around that in the future easily enough.
- Accept HTTP requests for Git, SVN and Mercurial repositories.
- Auth logic is a little different in order to be more consistent with how other things work.
- Instead of AphrontBasicAuthResponse, added "VCSResponse". Mercurial can print strings we send it on the CLI if we're careful, so support that. I did a fair amount of digging and didn't have any luck with git or svn.
- Commands we don't know about are assumed to require "Push" capability by default.
No actual VCS data going over the wire yet.
Test Plan:
Ran a bunch of stuff like this:
$ hg clone http://local.aphront.com:8080/diffusion/P/
abort: HTTP Error 403: This repository is not available over HTTP.
...and got pretty reasonable-seeming errors in all cases. All this can do is produce errors for now.
Reviewers: hach-que, btrahan
Reviewed By: hach-que
CC: aran
Maniphest Tasks: T2230
Differential Revision: https://secure.phabricator.com/D7417
2013-10-26 16:56:17 +02:00
|
|
|
'DiffusionRepositoryDefaultController' => 'applications/diffusion/controller/DiffusionRepositoryDefaultController.php',
|
2016-05-09 17:10:21 +02:00
|
|
|
'DiffusionRepositoryDocumentationManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryDocumentationManagementPanel.php',
|
2013-09-22 01:23:35 +02:00
|
|
|
'DiffusionRepositoryEditActivateController' => 'applications/diffusion/controller/DiffusionRepositoryEditActivateController.php',
|
2016-04-17 01:45:19 +02:00
|
|
|
'DiffusionRepositoryEditConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRepositoryEditConduitAPIMethod.php',
|
2013-05-24 21:37:42 +02:00
|
|
|
'DiffusionRepositoryEditController' => 'applications/diffusion/controller/DiffusionRepositoryEditController.php',
|
2013-12-03 19:28:39 +01:00
|
|
|
'DiffusionRepositoryEditDangerousController' => 'applications/diffusion/controller/DiffusionRepositoryEditDangerousController.php',
|
2013-10-29 22:23:30 +01:00
|
|
|
'DiffusionRepositoryEditDeleteController' => 'applications/diffusion/controller/DiffusionRepositoryEditDeleteController.php',
|
2016-04-17 01:45:19 +02:00
|
|
|
'DiffusionRepositoryEditEngine' => 'applications/diffusion/editor/DiffusionRepositoryEditEngine.php',
|
2014-08-21 20:30:12 +02:00
|
|
|
'DiffusionRepositoryEditUpdateController' => 'applications/diffusion/controller/DiffusionRepositoryEditUpdateController.php',
|
2016-04-17 02:33:27 +02:00
|
|
|
'DiffusionRepositoryHistoryManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryHistoryManagementPanel.php',
|
2013-09-11 00:24:44 +02:00
|
|
|
'DiffusionRepositoryListController' => 'applications/diffusion/controller/DiffusionRepositoryListController.php',
|
2016-04-11 19:17:46 +02:00
|
|
|
'DiffusionRepositoryManageController' => 'applications/diffusion/controller/DiffusionRepositoryManageController.php',
|
2016-05-09 23:24:21 +02:00
|
|
|
'DiffusionRepositoryManagePanelsController' => 'applications/diffusion/controller/DiffusionRepositoryManagePanelsController.php',
|
2016-04-11 19:17:46 +02:00
|
|
|
'DiffusionRepositoryManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryManagementPanel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionRepositoryPath' => 'applications/diffusion/data/DiffusionRepositoryPath.php',
|
2016-04-17 02:33:27 +02:00
|
|
|
'DiffusionRepositoryPoliciesManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryPoliciesManagementPanel.php',
|
2013-10-30 21:06:09 +01:00
|
|
|
'DiffusionRepositoryRef' => 'applications/diffusion/data/DiffusionRepositoryRef.php',
|
2013-12-31 20:08:08 +01:00
|
|
|
'DiffusionRepositoryRemarkupRule' => 'applications/diffusion/remarkup/DiffusionRepositoryRemarkupRule.php',
|
2016-04-17 01:45:19 +02:00
|
|
|
'DiffusionRepositorySearchConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRepositorySearchConduitAPIMethod.php',
|
2016-04-26 14:54:51 +02:00
|
|
|
'DiffusionRepositoryStagingManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryStagingManagementPanel.php',
|
2016-04-17 14:10:18 +02:00
|
|
|
'DiffusionRepositoryStatusManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryStatusManagementPanel.php',
|
2016-04-26 14:43:35 +02:00
|
|
|
'DiffusionRepositoryStorageManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryStorageManagementPanel.php',
|
2016-05-11 02:13:11 +02:00
|
|
|
'DiffusionRepositorySubversionManagementPanel' => 'applications/diffusion/management/DiffusionRepositorySubversionManagementPanel.php',
|
2016-04-27 19:32:43 +02:00
|
|
|
'DiffusionRepositorySymbolsManagementPanel' => 'applications/diffusion/management/DiffusionRepositorySymbolsManagementPanel.php',
|
2013-05-01 23:56:36 +02:00
|
|
|
'DiffusionRepositoryTag' => 'applications/diffusion/data/DiffusionRepositoryTag.php',
|
2015-10-27 19:04:02 +01:00
|
|
|
'DiffusionRepositoryTestAutomationController' => 'applications/diffusion/controller/DiffusionRepositoryTestAutomationController.php',
|
2016-05-01 15:59:22 +02:00
|
|
|
'DiffusionRepositoryURICredentialController' => 'applications/diffusion/controller/DiffusionRepositoryURICredentialController.php',
|
2016-04-30 01:51:05 +02:00
|
|
|
'DiffusionRepositoryURIDisableController' => 'applications/diffusion/controller/DiffusionRepositoryURIDisableController.php',
|
2016-04-28 17:33:44 +02:00
|
|
|
'DiffusionRepositoryURIEditController' => 'applications/diffusion/controller/DiffusionRepositoryURIEditController.php',
|
2016-04-28 19:40:35 +02:00
|
|
|
'DiffusionRepositoryURIViewController' => 'applications/diffusion/controller/DiffusionRepositoryURIViewController.php',
|
2016-01-12 15:45:17 +01:00
|
|
|
'DiffusionRepositoryURIsIndexEngineExtension' => 'applications/diffusion/engineextension/DiffusionRepositoryURIsIndexEngineExtension.php',
|
2016-04-17 17:17:49 +02:00
|
|
|
'DiffusionRepositoryURIsManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryURIsManagementPanel.php',
|
2016-04-29 23:10:04 +02:00
|
|
|
'DiffusionRepositoryURIsSearchEngineAttachment' => 'applications/diffusion/engineextension/DiffusionRepositoryURIsSearchEngineAttachment.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionRequest' => 'applications/diffusion/request/DiffusionRequest.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionResolveRefsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionResolveRefsConduitAPIMethod.php',
|
2013-12-19 20:05:17 +01:00
|
|
|
'DiffusionResolveUserQuery' => 'applications/diffusion/query/DiffusionResolveUserQuery.php',
|
2013-10-26 19:46:09 +02:00
|
|
|
'DiffusionSSHWorkflow' => 'applications/diffusion/ssh/DiffusionSSHWorkflow.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionSearchQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionSearchQueryConduitAPIMethod.php',
|
2013-11-07 02:55:46 +01:00
|
|
|
'DiffusionServeController' => 'applications/diffusion/controller/DiffusionServeController.php',
|
2015-01-03 14:46:28 +01:00
|
|
|
'DiffusionSetPasswordSettingsPanel' => 'applications/diffusion/panel/DiffusionSetPasswordSettingsPanel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionSetupException' => 'applications/diffusion/exception/DiffusionSetupException.php',
|
2016-04-19 00:22:52 +02:00
|
|
|
'DiffusionSubversionCommandEngine' => 'applications/diffusion/protocol/DiffusionSubversionCommandEngine.php',
|
2015-01-04 20:33:18 +01:00
|
|
|
'DiffusionSubversionSSHWorkflow' => 'applications/diffusion/ssh/DiffusionSubversionSSHWorkflow.php',
|
|
|
|
'DiffusionSubversionServeSSHWorkflow' => 'applications/diffusion/ssh/DiffusionSubversionServeSSHWorkflow.php',
|
2013-11-11 21:19:06 +01:00
|
|
|
'DiffusionSubversionWireProtocol' => 'applications/diffusion/protocol/DiffusionSubversionWireProtocol.php',
|
|
|
|
'DiffusionSubversionWireProtocolTestCase' => 'applications/diffusion/protocol/__tests__/DiffusionSubversionWireProtocolTestCase.php',
|
2016-01-06 13:56:27 +01:00
|
|
|
'DiffusionSvnBlameQuery' => 'applications/diffusion/query/blame/DiffusionSvnBlameQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionSvnFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionSvnFileContentQuery.php',
|
|
|
|
'DiffusionSvnRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionSvnRawDiffQuery.php',
|
|
|
|
'DiffusionSvnRequest' => 'applications/diffusion/request/DiffusionSvnRequest.php',
|
|
|
|
'DiffusionSymbolController' => 'applications/diffusion/controller/DiffusionSymbolController.php',
|
2014-07-18 00:48:36 +02:00
|
|
|
'DiffusionSymbolDatasource' => 'applications/diffusion/typeahead/DiffusionSymbolDatasource.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionSymbolQuery' => 'applications/diffusion/query/DiffusionSymbolQuery.php',
|
|
|
|
'DiffusionTagListController' => 'applications/diffusion/controller/DiffusionTagListController.php',
|
|
|
|
'DiffusionTagListView' => 'applications/diffusion/view/DiffusionTagListView.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionTagsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionTagsQueryConduitAPIMethod.php',
|
2016-04-29 22:10:37 +02:00
|
|
|
'DiffusionURIEditConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionURIEditConduitAPIMethod.php',
|
2016-04-28 17:33:44 +02:00
|
|
|
'DiffusionURIEditEngine' => 'applications/diffusion/editor/DiffusionURIEditEngine.php',
|
|
|
|
'DiffusionURIEditor' => 'applications/diffusion/editor/DiffusionURIEditor.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionURITestCase' => 'applications/diffusion/request/__tests__/DiffusionURITestCase.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionUpdateCoverageConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionUpdateCoverageConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionView' => 'applications/diffusion/view/DiffusionView.php',
|
Port Diviner Core to Phabricator
Summary:
This implements most/all of the difficult parts of Diviner on top of Phabricator instead of as standalone components. See T988. In particular, here are the things I want to fix:
**Performance** The Diviner parser works in two stages. The first stage breaks source files into "Atoms". The second stage renders atoms into a display format (e.g., HTML). Diviner currently has a good caching story on the first step of the pipeline, but zero caching in the second step. This means it's very slow, even for a fairly small project like Phabricator. We must re-render every piece of documentation every time, instead of only changed documentation. Most of this diff concerns itself with addressing this problem. There's a fairly large explanatory comment about it, but the trickiest part is that when an atom changes, other atoms (defined in other places) may also change -- for example, if `class B extends A`, editing A should dirty B, even if B is in an entirely different file. We perform analysis in two stages to propagate these changes: first detecting direct changes, then detecting indirect changes. This isn't completely implemented -- we need to propagate 'extends' through more levels -- but I believe it's structurally correct and good enough until we actually document classes.
**Inheritance** Diviner currently has a very weak story on inheritance. I want to inherit a lot more metas/docs. If an interface documents a method, we should just pull that documentation in to every implementation by default (implementations can still override it if they want). It can be shown in grey or something, but it should be desirable and correct to omit documentation of a method implementation when you are implementing a parent. Similarly, I want to pull in inherited methods and @tasks and such. This diff sets up for that, by formalizing "extends" relationships between atoms.
**Overspecialization** Diviner currently specializes atoms (FileAtom, FunctionAtom, ClassAtom, etc.). This is pretty much not useful, because Atomizers (which produce the atoms) need to be highly specialized, and Renderers/Publishers (which consume the atoms) also need to be highly specialized. Nothing interesting actually lives in the atom specializations, and we don't benefit from having them -- it just costs us generality in storage/caches for them. In the new code, I've used a single Atom class to represent any type of atom.
**URIs** We have fairly hideous URIs right now, which are very cumbersome For in-app doc links, I want to provide nice URIs ("/h/notfications" or similar) which are stable redirects, and probably add remarkup for it: !{notifications} or similar. This diff isn't related to that since it's too premature.
**Search** Once we have a database generation target, we can index the documentation.
**Design** Chad has some nice mocks.
Test Plan: Ran `bin/diviner generate`, `bin/diviner generate --clean`. Saw appropriate graph propagation after edits. This diff doesn't do anything very useful yet.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4340
2013-01-07 23:04:23 +01:00
|
|
|
'DivinerArticleAtomizer' => 'applications/diviner/atomizer/DivinerArticleAtomizer.php',
|
|
|
|
'DivinerAtom' => 'applications/diviner/atom/DivinerAtom.php',
|
|
|
|
'DivinerAtomCache' => 'applications/diviner/cache/DivinerAtomCache.php',
|
2013-06-01 00:14:39 +02:00
|
|
|
'DivinerAtomController' => 'applications/diviner/controller/DivinerAtomController.php',
|
2013-05-31 19:52:25 +02:00
|
|
|
'DivinerAtomListController' => 'applications/diviner/controller/DivinerAtomListController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DivinerAtomPHIDType' => 'applications/diviner/phid/DivinerAtomPHIDType.php',
|
2013-05-31 19:52:25 +02:00
|
|
|
'DivinerAtomQuery' => 'applications/diviner/query/DivinerAtomQuery.php',
|
Port Diviner Core to Phabricator
Summary:
This implements most/all of the difficult parts of Diviner on top of Phabricator instead of as standalone components. See T988. In particular, here are the things I want to fix:
**Performance** The Diviner parser works in two stages. The first stage breaks source files into "Atoms". The second stage renders atoms into a display format (e.g., HTML). Diviner currently has a good caching story on the first step of the pipeline, but zero caching in the second step. This means it's very slow, even for a fairly small project like Phabricator. We must re-render every piece of documentation every time, instead of only changed documentation. Most of this diff concerns itself with addressing this problem. There's a fairly large explanatory comment about it, but the trickiest part is that when an atom changes, other atoms (defined in other places) may also change -- for example, if `class B extends A`, editing A should dirty B, even if B is in an entirely different file. We perform analysis in two stages to propagate these changes: first detecting direct changes, then detecting indirect changes. This isn't completely implemented -- we need to propagate 'extends' through more levels -- but I believe it's structurally correct and good enough until we actually document classes.
**Inheritance** Diviner currently has a very weak story on inheritance. I want to inherit a lot more metas/docs. If an interface documents a method, we should just pull that documentation in to every implementation by default (implementations can still override it if they want). It can be shown in grey or something, but it should be desirable and correct to omit documentation of a method implementation when you are implementing a parent. Similarly, I want to pull in inherited methods and @tasks and such. This diff sets up for that, by formalizing "extends" relationships between atoms.
**Overspecialization** Diviner currently specializes atoms (FileAtom, FunctionAtom, ClassAtom, etc.). This is pretty much not useful, because Atomizers (which produce the atoms) need to be highly specialized, and Renderers/Publishers (which consume the atoms) also need to be highly specialized. Nothing interesting actually lives in the atom specializations, and we don't benefit from having them -- it just costs us generality in storage/caches for them. In the new code, I've used a single Atom class to represent any type of atom.
**URIs** We have fairly hideous URIs right now, which are very cumbersome For in-app doc links, I want to provide nice URIs ("/h/notfications" or similar) which are stable redirects, and probably add remarkup for it: !{notifications} or similar. This diff isn't related to that since it's too premature.
**Search** Once we have a database generation target, we can index the documentation.
**Design** Chad has some nice mocks.
Test Plan: Ran `bin/diviner generate`, `bin/diviner generate --clean`. Saw appropriate graph propagation after edits. This diff doesn't do anything very useful yet.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4340
2013-01-07 23:04:23 +01:00
|
|
|
'DivinerAtomRef' => 'applications/diviner/atom/DivinerAtomRef.php',
|
2013-05-31 19:52:25 +02:00
|
|
|
'DivinerAtomSearchEngine' => 'applications/diviner/query/DivinerAtomSearchEngine.php',
|
Port Diviner Core to Phabricator
Summary:
This implements most/all of the difficult parts of Diviner on top of Phabricator instead of as standalone components. See T988. In particular, here are the things I want to fix:
**Performance** The Diviner parser works in two stages. The first stage breaks source files into "Atoms". The second stage renders atoms into a display format (e.g., HTML). Diviner currently has a good caching story on the first step of the pipeline, but zero caching in the second step. This means it's very slow, even for a fairly small project like Phabricator. We must re-render every piece of documentation every time, instead of only changed documentation. Most of this diff concerns itself with addressing this problem. There's a fairly large explanatory comment about it, but the trickiest part is that when an atom changes, other atoms (defined in other places) may also change -- for example, if `class B extends A`, editing A should dirty B, even if B is in an entirely different file. We perform analysis in two stages to propagate these changes: first detecting direct changes, then detecting indirect changes. This isn't completely implemented -- we need to propagate 'extends' through more levels -- but I believe it's structurally correct and good enough until we actually document classes.
**Inheritance** Diviner currently has a very weak story on inheritance. I want to inherit a lot more metas/docs. If an interface documents a method, we should just pull that documentation in to every implementation by default (implementations can still override it if they want). It can be shown in grey or something, but it should be desirable and correct to omit documentation of a method implementation when you are implementing a parent. Similarly, I want to pull in inherited methods and @tasks and such. This diff sets up for that, by formalizing "extends" relationships between atoms.
**Overspecialization** Diviner currently specializes atoms (FileAtom, FunctionAtom, ClassAtom, etc.). This is pretty much not useful, because Atomizers (which produce the atoms) need to be highly specialized, and Renderers/Publishers (which consume the atoms) also need to be highly specialized. Nothing interesting actually lives in the atom specializations, and we don't benefit from having them -- it just costs us generality in storage/caches for them. In the new code, I've used a single Atom class to represent any type of atom.
**URIs** We have fairly hideous URIs right now, which are very cumbersome For in-app doc links, I want to provide nice URIs ("/h/notfications" or similar) which are stable redirects, and probably add remarkup for it: !{notifications} or similar. This diff isn't related to that since it's too premature.
**Search** Once we have a database generation target, we can index the documentation.
**Design** Chad has some nice mocks.
Test Plan: Ran `bin/diviner generate`, `bin/diviner generate --clean`. Saw appropriate graph propagation after edits. This diff doesn't do anything very useful yet.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4340
2013-01-07 23:04:23 +01:00
|
|
|
'DivinerAtomizeWorkflow' => 'applications/diviner/workflow/DivinerAtomizeWorkflow.php',
|
|
|
|
'DivinerAtomizer' => 'applications/diviner/atomizer/DivinerAtomizer.php',
|
2013-06-04 20:15:34 +02:00
|
|
|
'DivinerBookController' => 'applications/diviner/controller/DivinerBookController.php',
|
2015-06-19 10:06:53 +02:00
|
|
|
'DivinerBookDatasource' => 'applications/diviner/typeahead/DivinerBookDatasource.php',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerBookEditController' => 'applications/diviner/controller/DivinerBookEditController.php',
|
2013-09-10 18:39:50 +02:00
|
|
|
'DivinerBookItemView' => 'applications/diviner/view/DivinerBookItemView.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DivinerBookPHIDType' => 'applications/diviner/phid/DivinerBookPHIDType.php',
|
2013-05-31 19:52:25 +02:00
|
|
|
'DivinerBookQuery' => 'applications/diviner/query/DivinerBookQuery.php',
|
|
|
|
'DivinerController' => 'applications/diviner/controller/DivinerController.php',
|
2013-05-20 19:18:26 +02:00
|
|
|
'DivinerDAO' => 'applications/diviner/storage/DivinerDAO.php',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerDefaultEditCapability' => 'applications/diviner/capability/DivinerDefaultEditCapability.php',
|
Move Diviner further toward usability
Summary:
- Complete the "project" -> "book" stuff. This is cleaner conceptually and keeps us from having yet another meaning for the word "project".
- Normalize symbols during atomization. This simplifies publishing a great deal, and allows static documentation to link to dynamic documentation and vice versa, because the canonical names of symbols are agreed upon (we can tweak the actual algorithm).
- Give articles a specifiable name distinct from the title, and default to something like "support" instead of "Get Help! Get Support!" so URIs end up more readable (not "Get_Help!_Get_Support!").
- Have the atomizers set book information on atoms.
- Implement very basic publishers. Publishers are basically glue code between the atomization process and the rendering process -- the two we'll have initially are "static" (publish to files on disk) and "phabricator" (or similar -- publish into the database).
- Handle duplicate symbol definitions in the atomize and publish pipelines. This fixes the issue where a project defines two functions named "idx()" and we currently tell them not to do that and break. Realistically, this is common in the real world and we should just roll our eyes and do the legwork to generate documentation as best we can.
- Particularly, dirty all atoms with the same name as a dirty atom (e.g., if 'function f()' is updated, regnerate the documentation for all functions named f() in the book).
- When publishing, we publish these at "function/f/@1", "function/f/@2". The base page will offer to disambiguate ("There are 8 functions named 'f' in this codebase, which one do you want?").
- Implement a very very basic renderer. This generates the actual HTML (or text, or XML, or whatever else) for the documentation, which the publisher dumps onto disk or into a database or whatever.
- The atomize workflow actually needs to depend on books, at least sort of, so make it load config and use it properly.
- Propagate multilevel dirties through the graph. If "C extends B" and "B extends A", we should regenerate C when A changes. Prior to this diff, we would regnerate B only.
Test Plan: Generated some documentation. Named two articles "feedback", generated docs, saw "article/feedback/@1/" and "article/feedback/@2/" created.
Reviewers: btrahan, vrana, chad
Reviewed By: chad
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4896
2013-02-18 00:39:36 +01:00
|
|
|
'DivinerDefaultRenderer' => 'applications/diviner/renderer/DivinerDefaultRenderer.php',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerDefaultViewCapability' => 'applications/diviner/capability/DivinerDefaultViewCapability.php',
|
2013-02-18 00:40:00 +01:00
|
|
|
'DivinerDiskCache' => 'applications/diviner/cache/DivinerDiskCache.php',
|
Port Diviner Core to Phabricator
Summary:
This implements most/all of the difficult parts of Diviner on top of Phabricator instead of as standalone components. See T988. In particular, here are the things I want to fix:
**Performance** The Diviner parser works in two stages. The first stage breaks source files into "Atoms". The second stage renders atoms into a display format (e.g., HTML). Diviner currently has a good caching story on the first step of the pipeline, but zero caching in the second step. This means it's very slow, even for a fairly small project like Phabricator. We must re-render every piece of documentation every time, instead of only changed documentation. Most of this diff concerns itself with addressing this problem. There's a fairly large explanatory comment about it, but the trickiest part is that when an atom changes, other atoms (defined in other places) may also change -- for example, if `class B extends A`, editing A should dirty B, even if B is in an entirely different file. We perform analysis in two stages to propagate these changes: first detecting direct changes, then detecting indirect changes. This isn't completely implemented -- we need to propagate 'extends' through more levels -- but I believe it's structurally correct and good enough until we actually document classes.
**Inheritance** Diviner currently has a very weak story on inheritance. I want to inherit a lot more metas/docs. If an interface documents a method, we should just pull that documentation in to every implementation by default (implementations can still override it if they want). It can be shown in grey or something, but it should be desirable and correct to omit documentation of a method implementation when you are implementing a parent. Similarly, I want to pull in inherited methods and @tasks and such. This diff sets up for that, by formalizing "extends" relationships between atoms.
**Overspecialization** Diviner currently specializes atoms (FileAtom, FunctionAtom, ClassAtom, etc.). This is pretty much not useful, because Atomizers (which produce the atoms) need to be highly specialized, and Renderers/Publishers (which consume the atoms) also need to be highly specialized. Nothing interesting actually lives in the atom specializations, and we don't benefit from having them -- it just costs us generality in storage/caches for them. In the new code, I've used a single Atom class to represent any type of atom.
**URIs** We have fairly hideous URIs right now, which are very cumbersome For in-app doc links, I want to provide nice URIs ("/h/notfications" or similar) which are stable redirects, and probably add remarkup for it: !{notifications} or similar. This diff isn't related to that since it's too premature.
**Search** Once we have a database generation target, we can index the documentation.
**Design** Chad has some nice mocks.
Test Plan: Ran `bin/diviner generate`, `bin/diviner generate --clean`. Saw appropriate graph propagation after edits. This diff doesn't do anything very useful yet.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4340
2013-01-07 23:04:23 +01:00
|
|
|
'DivinerFileAtomizer' => 'applications/diviner/atomizer/DivinerFileAtomizer.php',
|
2013-07-28 22:07:30 +02:00
|
|
|
'DivinerFindController' => 'applications/diviner/controller/DivinerFindController.php',
|
Port Diviner Core to Phabricator
Summary:
This implements most/all of the difficult parts of Diviner on top of Phabricator instead of as standalone components. See T988. In particular, here are the things I want to fix:
**Performance** The Diviner parser works in two stages. The first stage breaks source files into "Atoms". The second stage renders atoms into a display format (e.g., HTML). Diviner currently has a good caching story on the first step of the pipeline, but zero caching in the second step. This means it's very slow, even for a fairly small project like Phabricator. We must re-render every piece of documentation every time, instead of only changed documentation. Most of this diff concerns itself with addressing this problem. There's a fairly large explanatory comment about it, but the trickiest part is that when an atom changes, other atoms (defined in other places) may also change -- for example, if `class B extends A`, editing A should dirty B, even if B is in an entirely different file. We perform analysis in two stages to propagate these changes: first detecting direct changes, then detecting indirect changes. This isn't completely implemented -- we need to propagate 'extends' through more levels -- but I believe it's structurally correct and good enough until we actually document classes.
**Inheritance** Diviner currently has a very weak story on inheritance. I want to inherit a lot more metas/docs. If an interface documents a method, we should just pull that documentation in to every implementation by default (implementations can still override it if they want). It can be shown in grey or something, but it should be desirable and correct to omit documentation of a method implementation when you are implementing a parent. Similarly, I want to pull in inherited methods and @tasks and such. This diff sets up for that, by formalizing "extends" relationships between atoms.
**Overspecialization** Diviner currently specializes atoms (FileAtom, FunctionAtom, ClassAtom, etc.). This is pretty much not useful, because Atomizers (which produce the atoms) need to be highly specialized, and Renderers/Publishers (which consume the atoms) also need to be highly specialized. Nothing interesting actually lives in the atom specializations, and we don't benefit from having them -- it just costs us generality in storage/caches for them. In the new code, I've used a single Atom class to represent any type of atom.
**URIs** We have fairly hideous URIs right now, which are very cumbersome For in-app doc links, I want to provide nice URIs ("/h/notfications" or similar) which are stable redirects, and probably add remarkup for it: !{notifications} or similar. This diff isn't related to that since it's too premature.
**Search** Once we have a database generation target, we can index the documentation.
**Design** Chad has some nice mocks.
Test Plan: Ran `bin/diviner generate`, `bin/diviner generate --clean`. Saw appropriate graph propagation after edits. This diff doesn't do anything very useful yet.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4340
2013-01-07 23:04:23 +01:00
|
|
|
'DivinerGenerateWorkflow' => 'applications/diviner/workflow/DivinerGenerateWorkflow.php',
|
2013-05-20 19:18:26 +02:00
|
|
|
'DivinerLiveAtom' => 'applications/diviner/storage/DivinerLiveAtom.php',
|
|
|
|
'DivinerLiveBook' => 'applications/diviner/storage/DivinerLiveBook.php',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerLiveBookEditor' => 'applications/diviner/editor/DivinerLiveBookEditor.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'DivinerLiveBookFulltextEngine' => 'applications/diviner/search/DivinerLiveBookFulltextEngine.php',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerLiveBookTransaction' => 'applications/diviner/storage/DivinerLiveBookTransaction.php',
|
|
|
|
'DivinerLiveBookTransactionQuery' => 'applications/diviner/query/DivinerLiveBookTransactionQuery.php',
|
2013-05-20 19:18:26 +02:00
|
|
|
'DivinerLivePublisher' => 'applications/diviner/publisher/DivinerLivePublisher.php',
|
|
|
|
'DivinerLiveSymbol' => 'applications/diviner/storage/DivinerLiveSymbol.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'DivinerLiveSymbolFulltextEngine' => 'applications/diviner/search/DivinerLiveSymbolFulltextEngine.php',
|
2014-03-05 22:07:50 +01:00
|
|
|
'DivinerMainController' => 'applications/diviner/controller/DivinerMainController.php',
|
2013-08-27 12:14:00 +02:00
|
|
|
'DivinerPHPAtomizer' => 'applications/diviner/atomizer/DivinerPHPAtomizer.php',
|
|
|
|
'DivinerParameterTableView' => 'applications/diviner/view/DivinerParameterTableView.php',
|
2013-02-18 00:40:00 +01:00
|
|
|
'DivinerPublishCache' => 'applications/diviner/cache/DivinerPublishCache.php',
|
Move Diviner further toward usability
Summary:
- Complete the "project" -> "book" stuff. This is cleaner conceptually and keeps us from having yet another meaning for the word "project".
- Normalize symbols during atomization. This simplifies publishing a great deal, and allows static documentation to link to dynamic documentation and vice versa, because the canonical names of symbols are agreed upon (we can tweak the actual algorithm).
- Give articles a specifiable name distinct from the title, and default to something like "support" instead of "Get Help! Get Support!" so URIs end up more readable (not "Get_Help!_Get_Support!").
- Have the atomizers set book information on atoms.
- Implement very basic publishers. Publishers are basically glue code between the atomization process and the rendering process -- the two we'll have initially are "static" (publish to files on disk) and "phabricator" (or similar -- publish into the database).
- Handle duplicate symbol definitions in the atomize and publish pipelines. This fixes the issue where a project defines two functions named "idx()" and we currently tell them not to do that and break. Realistically, this is common in the real world and we should just roll our eyes and do the legwork to generate documentation as best we can.
- Particularly, dirty all atoms with the same name as a dirty atom (e.g., if 'function f()' is updated, regnerate the documentation for all functions named f() in the book).
- When publishing, we publish these at "function/f/@1", "function/f/@2". The base page will offer to disambiguate ("There are 8 functions named 'f' in this codebase, which one do you want?").
- Implement a very very basic renderer. This generates the actual HTML (or text, or XML, or whatever else) for the documentation, which the publisher dumps onto disk or into a database or whatever.
- The atomize workflow actually needs to depend on books, at least sort of, so make it load config and use it properly.
- Propagate multilevel dirties through the graph. If "C extends B" and "B extends A", we should regenerate C when A changes. Prior to this diff, we would regnerate B only.
Test Plan: Generated some documentation. Named two articles "feedback", generated docs, saw "article/feedback/@1/" and "article/feedback/@2/" created.
Reviewers: btrahan, vrana, chad
Reviewed By: chad
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4896
2013-02-18 00:39:36 +01:00
|
|
|
'DivinerPublisher' => 'applications/diviner/publisher/DivinerPublisher.php',
|
|
|
|
'DivinerRenderer' => 'applications/diviner/renderer/DivinerRenderer.php',
|
2013-08-27 12:14:00 +02:00
|
|
|
'DivinerReturnTableView' => 'applications/diviner/view/DivinerReturnTableView.php',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerSchemaSpec' => 'applications/diviner/storage/DivinerSchemaSpec.php',
|
2013-09-05 21:29:07 +02:00
|
|
|
'DivinerSectionView' => 'applications/diviner/view/DivinerSectionView.php',
|
Move Diviner further toward usability
Summary:
- Complete the "project" -> "book" stuff. This is cleaner conceptually and keeps us from having yet another meaning for the word "project".
- Normalize symbols during atomization. This simplifies publishing a great deal, and allows static documentation to link to dynamic documentation and vice versa, because the canonical names of symbols are agreed upon (we can tweak the actual algorithm).
- Give articles a specifiable name distinct from the title, and default to something like "support" instead of "Get Help! Get Support!" so URIs end up more readable (not "Get_Help!_Get_Support!").
- Have the atomizers set book information on atoms.
- Implement very basic publishers. Publishers are basically glue code between the atomization process and the rendering process -- the two we'll have initially are "static" (publish to files on disk) and "phabricator" (or similar -- publish into the database).
- Handle duplicate symbol definitions in the atomize and publish pipelines. This fixes the issue where a project defines two functions named "idx()" and we currently tell them not to do that and break. Realistically, this is common in the real world and we should just roll our eyes and do the legwork to generate documentation as best we can.
- Particularly, dirty all atoms with the same name as a dirty atom (e.g., if 'function f()' is updated, regnerate the documentation for all functions named f() in the book).
- When publishing, we publish these at "function/f/@1", "function/f/@2". The base page will offer to disambiguate ("There are 8 functions named 'f' in this codebase, which one do you want?").
- Implement a very very basic renderer. This generates the actual HTML (or text, or XML, or whatever else) for the documentation, which the publisher dumps onto disk or into a database or whatever.
- The atomize workflow actually needs to depend on books, at least sort of, so make it load config and use it properly.
- Propagate multilevel dirties through the graph. If "C extends B" and "B extends A", we should regenerate C when A changes. Prior to this diff, we would regnerate B only.
Test Plan: Generated some documentation. Named two articles "feedback", generated docs, saw "article/feedback/@1/" and "article/feedback/@2/" created.
Reviewers: btrahan, vrana, chad
Reviewed By: chad
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4896
2013-02-18 00:39:36 +01:00
|
|
|
'DivinerStaticPublisher' => 'applications/diviner/publisher/DivinerStaticPublisher.php',
|
2014-08-04 16:55:43 +02:00
|
|
|
'DivinerSymbolRemarkupRule' => 'applications/diviner/markup/DivinerSymbolRemarkupRule.php',
|
Port Diviner Core to Phabricator
Summary:
This implements most/all of the difficult parts of Diviner on top of Phabricator instead of as standalone components. See T988. In particular, here are the things I want to fix:
**Performance** The Diviner parser works in two stages. The first stage breaks source files into "Atoms". The second stage renders atoms into a display format (e.g., HTML). Diviner currently has a good caching story on the first step of the pipeline, but zero caching in the second step. This means it's very slow, even for a fairly small project like Phabricator. We must re-render every piece of documentation every time, instead of only changed documentation. Most of this diff concerns itself with addressing this problem. There's a fairly large explanatory comment about it, but the trickiest part is that when an atom changes, other atoms (defined in other places) may also change -- for example, if `class B extends A`, editing A should dirty B, even if B is in an entirely different file. We perform analysis in two stages to propagate these changes: first detecting direct changes, then detecting indirect changes. This isn't completely implemented -- we need to propagate 'extends' through more levels -- but I believe it's structurally correct and good enough until we actually document classes.
**Inheritance** Diviner currently has a very weak story on inheritance. I want to inherit a lot more metas/docs. If an interface documents a method, we should just pull that documentation in to every implementation by default (implementations can still override it if they want). It can be shown in grey or something, but it should be desirable and correct to omit documentation of a method implementation when you are implementing a parent. Similarly, I want to pull in inherited methods and @tasks and such. This diff sets up for that, by formalizing "extends" relationships between atoms.
**Overspecialization** Diviner currently specializes atoms (FileAtom, FunctionAtom, ClassAtom, etc.). This is pretty much not useful, because Atomizers (which produce the atoms) need to be highly specialized, and Renderers/Publishers (which consume the atoms) also need to be highly specialized. Nothing interesting actually lives in the atom specializations, and we don't benefit from having them -- it just costs us generality in storage/caches for them. In the new code, I've used a single Atom class to represent any type of atom.
**URIs** We have fairly hideous URIs right now, which are very cumbersome For in-app doc links, I want to provide nice URIs ("/h/notfications" or similar) which are stable redirects, and probably add remarkup for it: !{notifications} or similar. This diff isn't related to that since it's too premature.
**Search** Once we have a database generation target, we can index the documentation.
**Design** Chad has some nice mocks.
Test Plan: Ran `bin/diviner generate`, `bin/diviner generate --clean`. Saw appropriate graph propagation after edits. This diff doesn't do anything very useful yet.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4340
2013-01-07 23:04:23 +01:00
|
|
|
'DivinerWorkflow' => 'applications/diviner/workflow/DivinerWorkflow.php',
|
2015-01-03 00:25:25 +01:00
|
|
|
'DoorkeeperAsanaFeedWorker' => 'applications/doorkeeper/worker/DoorkeeperAsanaFeedWorker.php',
|
2015-06-08 03:27:19 +02:00
|
|
|
'DoorkeeperAsanaRemarkupRule' => 'applications/doorkeeper/remarkup/DoorkeeperAsanaRemarkupRule.php',
|
2013-06-25 00:54:54 +02:00
|
|
|
'DoorkeeperBridge' => 'applications/doorkeeper/bridge/DoorkeeperBridge.php',
|
|
|
|
'DoorkeeperBridgeAsana' => 'applications/doorkeeper/bridge/DoorkeeperBridgeAsana.php',
|
2016-03-09 15:30:22 +01:00
|
|
|
'DoorkeeperBridgeGitHub' => 'applications/doorkeeper/bridge/DoorkeeperBridgeGitHub.php',
|
|
|
|
'DoorkeeperBridgeGitHubIssue' => 'applications/doorkeeper/bridge/DoorkeeperBridgeGitHubIssue.php',
|
Bridge GitHub users into Phabricator and attribute actions to them
Summary:
Ref T10538. Ref T10537. This creates PHIDs which represent GitHub users, and uses them as the actors for synchronized comments.
I've just made them Doorkeeper objects. There are three major kinds of objects they //could// possibly be:
- Nuance requestor objects.
- External account objects.
- Doorkeeper objects.
I don't think we actually need distinct nuance requestor objects. These don't really do anything right now, and were originally created before Doorkeeper. I think Doorkeeper is a superset of nuance requestor functionality, and better developed and more flexible.
Likewise, doorkeeper objects are much more flexible than external account objects, and it's nice to imagine that we can import from Twootfeed or whatever without needing to build full OAuth for it. I also like less stuff touching auth code, when possible.
Making these separate from external accounts does make it a bit harder to reconcile external users with internal users, but I think that's OK, and that it's generally desirable to show the real source of a piece of content. That is, if I wrote a comment on GitHub but also have a Phabricator account, I think it's good to show "epriestley (GitHub)" (the GitHub user) as the author, not "epriestley" (the Phabricator user). I think this is generally less confusing overall, and we can add more linkage later to make it clearer.
Test Plan:
{F1194104}
{F1194105}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10537, T10538
Differential Revision: https://secure.phabricator.com/D15541
2016-03-28 21:01:18 +02:00
|
|
|
'DoorkeeperBridgeGitHubUser' => 'applications/doorkeeper/bridge/DoorkeeperBridgeGitHubUser.php',
|
2013-09-04 02:27:38 +02:00
|
|
|
'DoorkeeperBridgeJIRA' => 'applications/doorkeeper/bridge/DoorkeeperBridgeJIRA.php',
|
2014-05-18 14:45:21 +02:00
|
|
|
'DoorkeeperBridgeJIRATestCase' => 'applications/doorkeeper/bridge/__tests__/DoorkeeperBridgeJIRATestCase.php',
|
2016-03-25 13:29:19 +01:00
|
|
|
'DoorkeeperBridgedObjectCurtainExtension' => 'applications/doorkeeper/engineextension/DoorkeeperBridgedObjectCurtainExtension.php',
|
2016-03-09 17:40:19 +01:00
|
|
|
'DoorkeeperBridgedObjectInterface' => 'applications/doorkeeper/bridge/DoorkeeperBridgedObjectInterface.php',
|
2013-06-25 00:54:36 +02:00
|
|
|
'DoorkeeperDAO' => 'applications/doorkeeper/storage/DoorkeeperDAO.php',
|
|
|
|
'DoorkeeperExternalObject' => 'applications/doorkeeper/storage/DoorkeeperExternalObject.php',
|
Bridge GitHub users into Phabricator and attribute actions to them
Summary:
Ref T10538. Ref T10537. This creates PHIDs which represent GitHub users, and uses them as the actors for synchronized comments.
I've just made them Doorkeeper objects. There are three major kinds of objects they //could// possibly be:
- Nuance requestor objects.
- External account objects.
- Doorkeeper objects.
I don't think we actually need distinct nuance requestor objects. These don't really do anything right now, and were originally created before Doorkeeper. I think Doorkeeper is a superset of nuance requestor functionality, and better developed and more flexible.
Likewise, doorkeeper objects are much more flexible than external account objects, and it's nice to imagine that we can import from Twootfeed or whatever without needing to build full OAuth for it. I also like less stuff touching auth code, when possible.
Making these separate from external accounts does make it a bit harder to reconcile external users with internal users, but I think that's OK, and that it's generally desirable to show the real source of a piece of content. That is, if I wrote a comment on GitHub but also have a Phabricator account, I think it's good to show "epriestley (GitHub)" (the GitHub user) as the author, not "epriestley" (the Phabricator user). I think this is generally less confusing overall, and we can add more linkage later to make it clearer.
Test Plan:
{F1194104}
{F1194105}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10537, T10538
Differential Revision: https://secure.phabricator.com/D15541
2016-03-28 21:01:18 +02:00
|
|
|
'DoorkeeperExternalObjectPHIDType' => 'applications/doorkeeper/phid/DoorkeeperExternalObjectPHIDType.php',
|
2013-06-26 01:30:44 +02:00
|
|
|
'DoorkeeperExternalObjectQuery' => 'applications/doorkeeper/query/DoorkeeperExternalObjectQuery.php',
|
2013-07-26 17:56:35 +02:00
|
|
|
'DoorkeeperFeedStoryPublisher' => 'applications/doorkeeper/engine/DoorkeeperFeedStoryPublisher.php',
|
2013-09-11 00:22:01 +02:00
|
|
|
'DoorkeeperFeedWorker' => 'applications/doorkeeper/worker/DoorkeeperFeedWorker.php',
|
2013-06-25 00:55:08 +02:00
|
|
|
'DoorkeeperImportEngine' => 'applications/doorkeeper/engine/DoorkeeperImportEngine.php',
|
2015-01-03 00:25:25 +01:00
|
|
|
'DoorkeeperJIRAFeedWorker' => 'applications/doorkeeper/worker/DoorkeeperJIRAFeedWorker.php',
|
2015-06-08 03:27:19 +02:00
|
|
|
'DoorkeeperJIRARemarkupRule' => 'applications/doorkeeper/remarkup/DoorkeeperJIRARemarkupRule.php',
|
2014-04-02 21:03:59 +02:00
|
|
|
'DoorkeeperMissingLinkException' => 'applications/doorkeeper/exception/DoorkeeperMissingLinkException.php',
|
2013-06-25 00:54:54 +02:00
|
|
|
'DoorkeeperObjectRef' => 'applications/doorkeeper/engine/DoorkeeperObjectRef.php',
|
2013-09-04 02:27:38 +02:00
|
|
|
'DoorkeeperRemarkupRule' => 'applications/doorkeeper/remarkup/DoorkeeperRemarkupRule.php',
|
2014-09-18 20:15:49 +02:00
|
|
|
'DoorkeeperSchemaSpec' => 'applications/doorkeeper/storage/DoorkeeperSchemaSpec.php',
|
2013-11-25 23:54:35 +01:00
|
|
|
'DoorkeeperTagView' => 'applications/doorkeeper/view/DoorkeeperTagView.php',
|
2013-06-25 00:55:08 +02:00
|
|
|
'DoorkeeperTagsController' => 'applications/doorkeeper/controller/DoorkeeperTagsController.php',
|
Implement a rough AlmanacService blueprint in Drydock
Summary:
Ref T9253. Broadly, this realigns Allocator behavior to be more consistent and straightforward and amenable to intended future changes.
This attempts to make language more consistent: resources are "allocated" and leases are "acquired".
This prepares for (but does not implement) optimistic "slot locking", as discussed in D10304. Although I suspect some blueprints will need to perform other locking eventually, this does feel like a good fit for most of the locking blueprints need to do.
In particular, I've made the blueprint operations on `$resource` and `$lease` objects more purposeful: they need to invoke an activator on the appropriate object to be implemented correctly. Before they invoke this activator method, they configure the object. In a future diff, this configuration will include specifying slot locks that the lease or resource must acquire. So the API will be something like:
$lease
->setActivateWhenAcquired(true)
->needSlotLock('x')
->needSlotLock('y')
->acquireOnResource($resource);
In the common case where slot locks are a good fit, I think this should make correct blueprint implementation very straightforward.
This prepares for (but does not implement) resources and leases which need significant setup steps. I've basically carved out two modes:
- The "activate immediately" mode, as here, immediately opens the resource or activates the lease. This is appropriate if little or no setup is required. I expect many leases to operate in this mode, although I expect many resources will operate in the other mode.
- The "allocate now, activate later" mode, which is not fully implemented yet. This will queue setup workers when the allocator exits. Overall, this will work very similarly to Harbormaster.
- This new structure makes it acceptable for blueprints to sleep as long as they want during resource allocation and lease acquisition, so long as they are not waiting on anything which needs to be completed by the queue. Putting a `sleep(15 * 60)` in your EC2Blueprint to wait for EC2 to bring a machine up will perform worse than using delayed activation, but won't deadlock the queue or block any locks.
Overall, this flow is more similar to Harbormaster's flow. Having consistency between Harbormaster's model and Drydock's model is good, and I think Harbormaster's model is also simply much better than Drydock's (what exists today in Drydock was implemented a long time ago, and we had more support and infrastructure by the time Harbormaster was implemented, as well as a more clearly defined problem).
The particular strength of Harbormaster is that objects always (or almost always, at least) have a single, clearly defined writer. Ensuring objects have only one writer prevents races and makes reasoning about everything easier.
Drydock does not currently have a clearly defined single writer, but this moves us in that direction. We'll probably need more primitives eventually to flesh this out, like Harbormaster's command queue for messaging objects which you can't write to.
This blueprint was originally implemented in D13843. This makes a few changes to the blueprint itself:
- A bunch of code from that (e.g., interfaces) doesn't exist yet.
- I let the blueprint have multiple services. This simplifies the code a little and seems like it costs us nothing.
This also removes `bin/drydock create-resource`, which no longer makes sense to expose. It won't get locking, leasing, etc., correct, and can not be made correct.
NOTE: This technically works but doesn't do anything useful yet.
Test Plan: Used `bin/drydock lease --type host` to acquire leases against these blueprints.
Reviewers: hach-que, chad
Reviewed By: hach-que, chad
Subscribers: Mnkras
Maniphest Tasks: T9253
Differential Revision: https://secure.phabricator.com/D14117
2015-09-21 13:43:53 +02:00
|
|
|
'DrydockAlmanacServiceHostBlueprintImplementation' => 'applications/drydock/blueprint/DrydockAlmanacServiceHostBlueprintImplementation.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockApacheWebrootInterface' => 'applications/drydock/interface/webroot/DrydockApacheWebrootInterface.php',
|
Rough cut of "Blueprint Authorizations"
Summary:
Ref T9519. This is like 80% of the way there and doesn't fully work yet, but roughly shows the shape of things to come. Here's how it works:
First, there's a new custom field type for blueprints which works like a normal typeahead but has some extra logic. It's implemented this way to make it easy to add to Blueprints in Drydock and Build Plans in Harbormaster. Here, I've added a "Use Blueprints" field to the "WorkingCopy" blueprint, so you can control which hosts the working copies are permitted to allocate on:
{F869865}
This control has a bit of custom rendering logic. Instead of rendering a normal list of PHIDs, it renders an annotated list with icons:
{F869866}
These icons show whether the blueprint on the other size of the authorization has approved this object. Once you have a green checkmark, you're good to go.
On the blueprint side, things look like this:
{F869867}
This table shows all the objects which have asked for access to this blueprint. In this case it's showing that one object is approved to use the blueprint since I already approved it, but by default new requests come in here as "Authorization Requested" and someone has to go approve them.
You approve them from within the authorization detail screen:
{F869868}
You can use the "Approve" or "Decline" buttons to allow or prevent use of the blueprint.
This doesn't actually do anything yet -- objects don't need to be authorized in order to use blueprints quite yet. That will come in the next diff, I just wanted to get the UI in reasonable shape first.
The authorization also has a second piece of state, which is whether the request from the object is active or inactive. We use this to keep track of the authorization if the blueprint is (maybe temporarily) deleted.
For example, you might have a Build Plan that uses Blueprints A and B. For a couple days, you only want to use A, so you remove B from the "Use Blueprints: ..." field. Later, you can add B back and it will connect to its old authorization again, so you don't need to go re-approve things (and if you're declined, you stay declined instead of being able to request authorization over and over again). This should make working with authorizations a little easier and less labor intensive.
Stuff not in this diff:
- Actually preventing any allocations (next diff).
- Probably should have transactions for approve/decline, at least, at some point, so there's a log of who did approvals and when.
- Maybe should have a more clear/loud error state when no blueprints are approved?
- Should probably restrict the typeahead to specific blueprint types.
Test Plan:
- Added the field.
- Typed some stuff into it.
- Saw the UI update properly.
- Approved an authorization.
- Declined an authorization.
- Saw active authorizations on a blueprint page.
- Didn't see any inactive authroizations there.
- Clicked "View All Authorizations", saw all authorizations.
Reviewers: chad, hach-que
Reviewed By: chad
Maniphest Tasks: T9519
Differential Revision: https://secure.phabricator.com/D14251
2015-10-10 16:15:25 +02:00
|
|
|
'DrydockAuthorization' => 'applications/drydock/storage/DrydockAuthorization.php',
|
|
|
|
'DrydockAuthorizationAuthorizeController' => 'applications/drydock/controller/DrydockAuthorizationAuthorizeController.php',
|
|
|
|
'DrydockAuthorizationListController' => 'applications/drydock/controller/DrydockAuthorizationListController.php',
|
|
|
|
'DrydockAuthorizationListView' => 'applications/drydock/view/DrydockAuthorizationListView.php',
|
|
|
|
'DrydockAuthorizationPHIDType' => 'applications/drydock/phid/DrydockAuthorizationPHIDType.php',
|
|
|
|
'DrydockAuthorizationQuery' => 'applications/drydock/query/DrydockAuthorizationQuery.php',
|
|
|
|
'DrydockAuthorizationSearchEngine' => 'applications/drydock/query/DrydockAuthorizationSearchEngine.php',
|
|
|
|
'DrydockAuthorizationViewController' => 'applications/drydock/controller/DrydockAuthorizationViewController.php',
|
2013-12-03 01:09:07 +01:00
|
|
|
'DrydockBlueprint' => 'applications/drydock/storage/DrydockBlueprint.php',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockBlueprintController' => 'applications/drydock/controller/DrydockBlueprintController.php',
|
2014-08-12 00:39:00 +02:00
|
|
|
'DrydockBlueprintCoreCustomField' => 'applications/drydock/customfield/DrydockBlueprintCoreCustomField.php',
|
|
|
|
'DrydockBlueprintCustomField' => 'applications/drydock/customfield/DrydockBlueprintCustomField.php',
|
2015-08-24 13:13:20 +02:00
|
|
|
'DrydockBlueprintDatasource' => 'applications/drydock/typeahead/DrydockBlueprintDatasource.php',
|
2015-09-24 19:18:17 +02:00
|
|
|
'DrydockBlueprintDisableController' => 'applications/drydock/controller/DrydockBlueprintDisableController.php',
|
2013-12-03 01:09:07 +01:00
|
|
|
'DrydockBlueprintEditController' => 'applications/drydock/controller/DrydockBlueprintEditController.php',
|
2016-03-03 13:34:47 +01:00
|
|
|
'DrydockBlueprintEditEngine' => 'applications/drydock/editor/DrydockBlueprintEditEngine.php',
|
2014-01-09 21:19:54 +01:00
|
|
|
'DrydockBlueprintEditor' => 'applications/drydock/editor/DrydockBlueprintEditor.php',
|
2013-12-03 01:09:07 +01:00
|
|
|
'DrydockBlueprintImplementation' => 'applications/drydock/blueprint/DrydockBlueprintImplementation.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'DrydockBlueprintImplementationTestCase' => 'applications/drydock/blueprint/__tests__/DrydockBlueprintImplementationTestCase.php',
|
2013-12-03 01:09:07 +01:00
|
|
|
'DrydockBlueprintListController' => 'applications/drydock/controller/DrydockBlueprintListController.php',
|
2016-03-03 13:17:24 +01:00
|
|
|
'DrydockBlueprintNameNgrams' => 'applications/drydock/storage/DrydockBlueprintNameNgrams.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DrydockBlueprintPHIDType' => 'applications/drydock/phid/DrydockBlueprintPHIDType.php',
|
2013-12-03 01:09:07 +01:00
|
|
|
'DrydockBlueprintQuery' => 'applications/drydock/query/DrydockBlueprintQuery.php',
|
2013-12-26 21:30:04 +01:00
|
|
|
'DrydockBlueprintSearchEngine' => 'applications/drydock/query/DrydockBlueprintSearchEngine.php',
|
2014-01-09 21:19:54 +01:00
|
|
|
'DrydockBlueprintTransaction' => 'applications/drydock/storage/DrydockBlueprintTransaction.php',
|
|
|
|
'DrydockBlueprintTransactionQuery' => 'applications/drydock/query/DrydockBlueprintTransactionQuery.php',
|
2013-12-03 01:09:07 +01:00
|
|
|
'DrydockBlueprintViewController' => 'applications/drydock/controller/DrydockBlueprintViewController.php',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockCommand' => 'applications/drydock/storage/DrydockCommand.php',
|
2016-03-07 00:13:40 +01:00
|
|
|
'DrydockCommandError' => 'applications/drydock/exception/DrydockCommandError.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockCommandInterface' => 'applications/drydock/interface/command/DrydockCommandInterface.php',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockCommandQuery' => 'applications/drydock/query/DrydockCommandQuery.php',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockConsoleController' => 'applications/drydock/controller/DrydockConsoleController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockConstants' => 'applications/drydock/constants/DrydockConstants.php',
|
|
|
|
'DrydockController' => 'applications/drydock/controller/DrydockController.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'DrydockCreateBlueprintsCapability' => 'applications/drydock/capability/DrydockCreateBlueprintsCapability.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockDAO' => 'applications/drydock/storage/DrydockDAO.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'DrydockDefaultEditCapability' => 'applications/drydock/capability/DrydockDefaultEditCapability.php',
|
|
|
|
'DrydockDefaultViewCapability' => 'applications/drydock/capability/DrydockDefaultViewCapability.php',
|
2013-12-06 04:11:05 +01:00
|
|
|
'DrydockFilesystemInterface' => 'applications/drydock/interface/filesystem/DrydockFilesystemInterface.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockInterface' => 'applications/drydock/interface/DrydockInterface.php',
|
2015-10-14 00:46:12 +02:00
|
|
|
'DrydockLandRepositoryOperation' => 'applications/drydock/operation/DrydockLandRepositoryOperation.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockLease' => 'applications/drydock/storage/DrydockLease.php',
|
2015-10-01 17:10:07 +02:00
|
|
|
'DrydockLeaseAcquiredLogType' => 'applications/drydock/logtype/DrydockLeaseAcquiredLogType.php',
|
|
|
|
'DrydockLeaseActivatedLogType' => 'applications/drydock/logtype/DrydockLeaseActivatedLogType.php',
|
2015-10-01 17:11:42 +02:00
|
|
|
'DrydockLeaseActivationFailureLogType' => 'applications/drydock/logtype/DrydockLeaseActivationFailureLogType.php',
|
|
|
|
'DrydockLeaseActivationYieldLogType' => 'applications/drydock/logtype/DrydockLeaseActivationYieldLogType.php',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockLeaseController' => 'applications/drydock/controller/DrydockLeaseController.php',
|
2015-08-24 13:13:20 +02:00
|
|
|
'DrydockLeaseDatasource' => 'applications/drydock/typeahead/DrydockLeaseDatasource.php',
|
2015-10-01 17:10:07 +02:00
|
|
|
'DrydockLeaseDestroyedLogType' => 'applications/drydock/logtype/DrydockLeaseDestroyedLogType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockLeaseListController' => 'applications/drydock/controller/DrydockLeaseListController.php',
|
2014-05-13 21:14:33 +02:00
|
|
|
'DrydockLeaseListView' => 'applications/drydock/view/DrydockLeaseListView.php',
|
2015-10-13 02:02:35 +02:00
|
|
|
'DrydockLeaseNoAuthorizationsLogType' => 'applications/drydock/logtype/DrydockLeaseNoAuthorizationsLogType.php',
|
|
|
|
'DrydockLeaseNoBlueprintsLogType' => 'applications/drydock/logtype/DrydockLeaseNoBlueprintsLogType.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DrydockLeasePHIDType' => 'applications/drydock/phid/DrydockLeasePHIDType.php',
|
2012-12-17 22:53:32 +01:00
|
|
|
'DrydockLeaseQuery' => 'applications/drydock/query/DrydockLeaseQuery.php',
|
2015-10-01 17:10:07 +02:00
|
|
|
'DrydockLeaseQueuedLogType' => 'applications/drydock/logtype/DrydockLeaseQueuedLogType.php',
|
Make Drydock reclaim unused resources when it reaches a resource limit
Summary:
Fixes T9994. Currently, when Drydock can't allocate a new resource because some limit has been reached, it waits patiently for a resource to become available.
It is possible that no resource will ever become available. Particularly with "Working Copy" resources, the new lease may want a copy of `rB`, but the resource may already be maxed out on `rA`.
Right now, no process exists to automatically reclaim the unused `rA`.
When we encounter this situation, try to reclaim one of the other resources if it is just sitting there unused.
Specifically:
- Add a "reclaim" command which means "release this resource //if// it is completely unused".
- Add a `bin/drydock reclaim` to send this command to every active resource.
- When we try to acquire a resource and can't, but only because of some kind of limit / utilization problem, try to release an unused resource to free up some room.
Test Plan:
- Set "Working Copy" resource limit to 1.
- Ran "Test Configuration" in `rA`, which worked.
- Ran "Test Configuration" in `rB`, which hung forever.
- Applied patch.
- Ran "Test Configuration" in `rB`, saw it reclaim the `rA` resource, use the slot, then succeed.
- Ran "Test Configuration" in `rA` again, saw it grab the slot back.
- Ran `bin/drydock reclaim` and saw it reclaim a bunch of old orphaned resources.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9994
Differential Revision: https://secure.phabricator.com/D14819
2015-12-18 17:44:13 +01:00
|
|
|
'DrydockLeaseReclaimLogType' => 'applications/drydock/logtype/DrydockLeaseReclaimLogType.php',
|
2012-12-15 00:42:58 +01:00
|
|
|
'DrydockLeaseReleaseController' => 'applications/drydock/controller/DrydockLeaseReleaseController.php',
|
2015-10-01 17:10:07 +02:00
|
|
|
'DrydockLeaseReleasedLogType' => 'applications/drydock/logtype/DrydockLeaseReleasedLogType.php',
|
2013-12-26 19:42:00 +01:00
|
|
|
'DrydockLeaseSearchEngine' => 'applications/drydock/query/DrydockLeaseSearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockLeaseStatus' => 'applications/drydock/constants/DrydockLeaseStatus.php',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockLeaseUpdateWorker' => 'applications/drydock/worker/DrydockLeaseUpdateWorker.php',
|
2012-11-07 00:28:33 +01:00
|
|
|
'DrydockLeaseViewController' => 'applications/drydock/controller/DrydockLeaseViewController.php',
|
2015-10-01 17:11:42 +02:00
|
|
|
'DrydockLeaseWaitingForResourcesLogType' => 'applications/drydock/logtype/DrydockLeaseWaitingForResourcesLogType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockLog' => 'applications/drydock/storage/DrydockLog.php',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockLogController' => 'applications/drydock/controller/DrydockLogController.php',
|
2015-10-01 17:09:27 +02:00
|
|
|
'DrydockLogGarbageCollector' => 'applications/drydock/garbagecollector/DrydockLogGarbageCollector.php',
|
2013-12-26 21:30:29 +01:00
|
|
|
'DrydockLogListController' => 'applications/drydock/controller/DrydockLogListController.php',
|
2014-05-13 21:14:33 +02:00
|
|
|
'DrydockLogListView' => 'applications/drydock/view/DrydockLogListView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockLogQuery' => 'applications/drydock/query/DrydockLogQuery.php',
|
2013-12-26 21:30:29 +01:00
|
|
|
'DrydockLogSearchEngine' => 'applications/drydock/query/DrydockLogSearchEngine.php',
|
2015-10-01 17:10:07 +02:00
|
|
|
'DrydockLogType' => 'applications/drydock/logtype/DrydockLogType.php',
|
2015-09-21 13:46:02 +02:00
|
|
|
'DrydockManagementCommandWorkflow' => 'applications/drydock/management/DrydockManagementCommandWorkflow.php',
|
2012-11-01 23:30:14 +01:00
|
|
|
'DrydockManagementLeaseWorkflow' => 'applications/drydock/management/DrydockManagementLeaseWorkflow.php',
|
Make Drydock reclaim unused resources when it reaches a resource limit
Summary:
Fixes T9994. Currently, when Drydock can't allocate a new resource because some limit has been reached, it waits patiently for a resource to become available.
It is possible that no resource will ever become available. Particularly with "Working Copy" resources, the new lease may want a copy of `rB`, but the resource may already be maxed out on `rA`.
Right now, no process exists to automatically reclaim the unused `rA`.
When we encounter this situation, try to reclaim one of the other resources if it is just sitting there unused.
Specifically:
- Add a "reclaim" command which means "release this resource //if// it is completely unused".
- Add a `bin/drydock reclaim` to send this command to every active resource.
- When we try to acquire a resource and can't, but only because of some kind of limit / utilization problem, try to release an unused resource to free up some room.
Test Plan:
- Set "Working Copy" resource limit to 1.
- Ran "Test Configuration" in `rA`, which worked.
- Ran "Test Configuration" in `rB`, which hung forever.
- Applied patch.
- Ran "Test Configuration" in `rB`, saw it reclaim the `rA` resource, use the slot, then succeed.
- Ran "Test Configuration" in `rA` again, saw it grab the slot back.
- Ran `bin/drydock reclaim` and saw it reclaim a bunch of old orphaned resources.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9994
Differential Revision: https://secure.phabricator.com/D14819
2015-12-18 17:44:13 +01:00
|
|
|
'DrydockManagementReclaimWorkflow' => 'applications/drydock/management/DrydockManagementReclaimWorkflow.php',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockManagementReleaseLeaseWorkflow' => 'applications/drydock/management/DrydockManagementReleaseLeaseWorkflow.php',
|
|
|
|
'DrydockManagementReleaseResourceWorkflow' => 'applications/drydock/management/DrydockManagementReleaseResourceWorkflow.php',
|
|
|
|
'DrydockManagementUpdateLeaseWorkflow' => 'applications/drydock/management/DrydockManagementUpdateLeaseWorkflow.php',
|
|
|
|
'DrydockManagementUpdateResourceWorkflow' => 'applications/drydock/management/DrydockManagementUpdateResourceWorkflow.php',
|
2012-11-01 23:30:14 +01:00
|
|
|
'DrydockManagementWorkflow' => 'applications/drydock/management/DrydockManagementWorkflow.php',
|
2015-10-14 00:45:59 +02:00
|
|
|
'DrydockObjectAuthorizationView' => 'applications/drydock/view/DrydockObjectAuthorizationView.php',
|
2013-12-27 22:15:30 +01:00
|
|
|
'DrydockQuery' => 'applications/drydock/query/DrydockQuery.php',
|
2015-10-14 00:46:12 +02:00
|
|
|
'DrydockRepositoryOperation' => 'applications/drydock/storage/DrydockRepositoryOperation.php',
|
2016-03-03 15:34:18 +01:00
|
|
|
'DrydockRepositoryOperationController' => 'applications/drydock/controller/DrydockRepositoryOperationController.php',
|
2015-12-26 21:20:21 +01:00
|
|
|
'DrydockRepositoryOperationDismissController' => 'applications/drydock/controller/DrydockRepositoryOperationDismissController.php',
|
2015-10-17 03:47:05 +02:00
|
|
|
'DrydockRepositoryOperationListController' => 'applications/drydock/controller/DrydockRepositoryOperationListController.php',
|
2015-10-14 00:46:12 +02:00
|
|
|
'DrydockRepositoryOperationPHIDType' => 'applications/drydock/phid/DrydockRepositoryOperationPHIDType.php',
|
|
|
|
'DrydockRepositoryOperationQuery' => 'applications/drydock/query/DrydockRepositoryOperationQuery.php',
|
2015-10-17 03:47:05 +02:00
|
|
|
'DrydockRepositoryOperationSearchEngine' => 'applications/drydock/query/DrydockRepositoryOperationSearchEngine.php',
|
2015-10-21 20:28:26 +02:00
|
|
|
'DrydockRepositoryOperationStatusController' => 'applications/drydock/controller/DrydockRepositoryOperationStatusController.php',
|
|
|
|
'DrydockRepositoryOperationStatusView' => 'applications/drydock/view/DrydockRepositoryOperationStatusView.php',
|
2015-10-14 00:46:12 +02:00
|
|
|
'DrydockRepositoryOperationType' => 'applications/drydock/operation/DrydockRepositoryOperationType.php',
|
|
|
|
'DrydockRepositoryOperationUpdateWorker' => 'applications/drydock/worker/DrydockRepositoryOperationUpdateWorker.php',
|
|
|
|
'DrydockRepositoryOperationViewController' => 'applications/drydock/controller/DrydockRepositoryOperationViewController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockResource' => 'applications/drydock/storage/DrydockResource.php',
|
2015-10-01 17:11:42 +02:00
|
|
|
'DrydockResourceActivationFailureLogType' => 'applications/drydock/logtype/DrydockResourceActivationFailureLogType.php',
|
|
|
|
'DrydockResourceActivationYieldLogType' => 'applications/drydock/logtype/DrydockResourceActivationYieldLogType.php',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockResourceController' => 'applications/drydock/controller/DrydockResourceController.php',
|
2015-08-24 13:13:20 +02:00
|
|
|
'DrydockResourceDatasource' => 'applications/drydock/typeahead/DrydockResourceDatasource.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockResourceListController' => 'applications/drydock/controller/DrydockResourceListController.php',
|
2014-05-13 21:14:33 +02:00
|
|
|
'DrydockResourceListView' => 'applications/drydock/view/DrydockResourceListView.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DrydockResourcePHIDType' => 'applications/drydock/phid/DrydockResourcePHIDType.php',
|
2012-12-17 23:47:21 +01:00
|
|
|
'DrydockResourceQuery' => 'applications/drydock/query/DrydockResourceQuery.php',
|
Make Drydock reclaim unused resources when it reaches a resource limit
Summary:
Fixes T9994. Currently, when Drydock can't allocate a new resource because some limit has been reached, it waits patiently for a resource to become available.
It is possible that no resource will ever become available. Particularly with "Working Copy" resources, the new lease may want a copy of `rB`, but the resource may already be maxed out on `rA`.
Right now, no process exists to automatically reclaim the unused `rA`.
When we encounter this situation, try to reclaim one of the other resources if it is just sitting there unused.
Specifically:
- Add a "reclaim" command which means "release this resource //if// it is completely unused".
- Add a `bin/drydock reclaim` to send this command to every active resource.
- When we try to acquire a resource and can't, but only because of some kind of limit / utilization problem, try to release an unused resource to free up some room.
Test Plan:
- Set "Working Copy" resource limit to 1.
- Ran "Test Configuration" in `rA`, which worked.
- Ran "Test Configuration" in `rB`, which hung forever.
- Applied patch.
- Ran "Test Configuration" in `rB`, saw it reclaim the `rA` resource, use the slot, then succeed.
- Ran "Test Configuration" in `rA` again, saw it grab the slot back.
- Ran `bin/drydock reclaim` and saw it reclaim a bunch of old orphaned resources.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9994
Differential Revision: https://secure.phabricator.com/D14819
2015-12-18 17:44:13 +01:00
|
|
|
'DrydockResourceReclaimLogType' => 'applications/drydock/logtype/DrydockResourceReclaimLogType.php',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockResourceReleaseController' => 'applications/drydock/controller/DrydockResourceReleaseController.php',
|
2013-12-26 21:30:10 +01:00
|
|
|
'DrydockResourceSearchEngine' => 'applications/drydock/query/DrydockResourceSearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockResourceStatus' => 'applications/drydock/constants/DrydockResourceStatus.php',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockResourceUpdateWorker' => 'applications/drydock/worker/DrydockResourceUpdateWorker.php',
|
2012-11-20 22:25:22 +01:00
|
|
|
'DrydockResourceViewController' => 'applications/drydock/controller/DrydockResourceViewController.php',
|
2013-12-06 04:11:05 +01:00
|
|
|
'DrydockSFTPFilesystemInterface' => 'applications/drydock/interface/filesystem/DrydockSFTPFilesystemInterface.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockSSHCommandInterface' => 'applications/drydock/interface/command/DrydockSSHCommandInterface.php',
|
2016-03-03 14:52:21 +01:00
|
|
|
'DrydockSchemaSpec' => 'applications/drydock/storage/DrydockSchemaSpec.php',
|
Implement optimistic "slot locks" in Drydock
Summary:
See discussion in D10304. There's a lot of context there, but the general idea is:
- Blueprints should manage locks in a granular way during the actual allocation/acquisition phase.
- Optimistic "slot locks" might a pretty good primitive to make that easy to implement and reason about in most cases.
The way these locks work is that you just pick some name for the lock (like the PHID of a resource) and say that it needs to be acquired for the allocation/acquisition to work:
```
...
->needSlotLock("mylock(PHID-XYZQ-...)")
...
```
When you fire off the acquisition or allocation, it fails unless it could acquire the slot with that name. This is really simple (no explicit lock management) and a pretty good fit for most of the locking that blueprints and leases need to do.
If you need to do limit-based locks (e.g., maximum of 3 locks) you could acquire a lock like this:
```
mylock(whatever).slot(2)
```
Blueprints generally only contend with themselves, so it's normally OK for them to pick whatever strategy works best for them in naming locks.
This may not work as well if you have a huge number of slots (e.g., 100TB you want to give out in 1MB chunks), or other complex needs for locks (like you have to synchronize access to some external resource), but slot locks don't need to be the only mechanism that blueprints use. If they run into a problem that slot locks aren't a good fit for, they can use something else instead. For now, slot locks seem like a good fit for the problems we currently face and most of the problems I anticipate facing.
(The release workflows have other race issues which I'm not addressing here. They work fine if nothing races, but aren't race-safe.)
Test Plan:
To create a race where the same binding is allocated as a resource twice:
- Add `sleep(10)` near the beginning of `allocateResource()`, after the free bindings are loaded but before resources are allocated.
- (Comment out slot lock acquisition if you have this patch.)
- Run `bin/drydock lease ...` in two windows, within 10 seconds of one another.
This will reliably double-allocate the binding because both blueprints see a view of the world where the binding is free.
To verify the lock works, un-comment it (or apply this patch) and run the same test again. Now, the lock fails in one process and only one resource is allocated.
Reviewers: hach-que, chad
Reviewed By: hach-que, chad
Differential Revision: https://secure.phabricator.com/D14118
2015-09-21 13:45:25 +02:00
|
|
|
'DrydockSlotLock' => 'applications/drydock/storage/DrydockSlotLock.php',
|
2015-09-21 13:46:24 +02:00
|
|
|
'DrydockSlotLockException' => 'applications/drydock/exception/DrydockSlotLockException.php',
|
2015-10-01 17:11:42 +02:00
|
|
|
'DrydockSlotLockFailureLogType' => 'applications/drydock/logtype/DrydockSlotLockFailureLogType.php',
|
2015-10-27 19:04:02 +01:00
|
|
|
'DrydockTestRepositoryOperation' => 'applications/drydock/operation/DrydockTestRepositoryOperation.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockWebrootInterface' => 'applications/drydock/interface/webroot/DrydockWebrootInterface.php',
|
2015-09-21 13:46:24 +02:00
|
|
|
'DrydockWorker' => 'applications/drydock/worker/DrydockWorker.php',
|
2013-12-03 01:09:07 +01:00
|
|
|
'DrydockWorkingCopyBlueprintImplementation' => 'applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FeedConduitAPIMethod' => 'applications/feed/conduit/FeedConduitAPIMethod.php',
|
|
|
|
'FeedPublishConduitAPIMethod' => 'applications/feed/conduit/FeedPublishConduitAPIMethod.php',
|
2013-06-26 01:29:47 +02:00
|
|
|
'FeedPublisherHTTPWorker' => 'applications/feed/worker/FeedPublisherHTTPWorker.php',
|
2012-11-02 21:34:18 +01:00
|
|
|
'FeedPublisherWorker' => 'applications/feed/worker/FeedPublisherWorker.php',
|
2013-06-26 01:29:47 +02:00
|
|
|
'FeedPushWorker' => 'applications/feed/worker/FeedPushWorker.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FeedQueryConduitAPIMethod' => 'applications/feed/conduit/FeedQueryConduitAPIMethod.php',
|
2015-06-10 15:08:57 +02:00
|
|
|
'FeedStoryNotificationGarbageCollector' => 'applications/notification/garbagecollector/FeedStoryNotificationGarbageCollector.php',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'FileAllocateConduitAPIMethod' => 'applications/files/conduit/FileAllocateConduitAPIMethod.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FileConduitAPIMethod' => 'applications/files/conduit/FileConduitAPIMethod.php',
|
2013-09-05 22:11:02 +02:00
|
|
|
'FileCreateMailReceiver' => 'applications/files/mail/FileCreateMailReceiver.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FileDownloadConduitAPIMethod' => 'applications/files/conduit/FileDownloadConduitAPIMethod.php',
|
|
|
|
'FileInfoConduitAPIMethod' => 'applications/files/conduit/FileInfoConduitAPIMethod.php',
|
2013-09-05 22:11:02 +02:00
|
|
|
'FileMailReceiver' => 'applications/files/mail/FileMailReceiver.php',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'FileQueryChunksConduitAPIMethod' => 'applications/files/conduit/FileQueryChunksConduitAPIMethod.php',
|
2013-09-05 22:11:02 +02:00
|
|
|
'FileReplyHandler' => 'applications/files/mail/FileReplyHandler.php',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'FileUploadChunkConduitAPIMethod' => 'applications/files/conduit/FileUploadChunkConduitAPIMethod.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FileUploadConduitAPIMethod' => 'applications/files/conduit/FileUploadConduitAPIMethod.php',
|
|
|
|
'FileUploadHashConduitAPIMethod' => 'applications/files/conduit/FileUploadHashConduitAPIMethod.php',
|
2014-11-21 20:17:20 +01:00
|
|
|
'FilesDefaultViewCapability' => 'applications/files/capability/FilesDefaultViewCapability.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FlagConduitAPIMethod' => 'applications/flag/conduit/FlagConduitAPIMethod.php',
|
|
|
|
'FlagDeleteConduitAPIMethod' => 'applications/flag/conduit/FlagDeleteConduitAPIMethod.php',
|
|
|
|
'FlagEditConduitAPIMethod' => 'applications/flag/conduit/FlagEditConduitAPIMethod.php',
|
|
|
|
'FlagQueryConduitAPIMethod' => 'applications/flag/conduit/FlagQueryConduitAPIMethod.php',
|
2014-09-12 15:31:11 +02:00
|
|
|
'FundBacker' => 'applications/fund/storage/FundBacker.php',
|
2014-10-06 23:19:08 +02:00
|
|
|
'FundBackerCart' => 'applications/fund/phortune/FundBackerCart.php',
|
2014-09-12 15:31:11 +02:00
|
|
|
'FundBackerEditor' => 'applications/fund/editor/FundBackerEditor.php',
|
|
|
|
'FundBackerListController' => 'applications/fund/controller/FundBackerListController.php',
|
|
|
|
'FundBackerPHIDType' => 'applications/fund/phid/FundBackerPHIDType.php',
|
2014-10-06 19:30:06 +02:00
|
|
|
'FundBackerProduct' => 'applications/fund/phortune/FundBackerProduct.php',
|
2014-09-12 15:31:11 +02:00
|
|
|
'FundBackerQuery' => 'applications/fund/query/FundBackerQuery.php',
|
|
|
|
'FundBackerSearchEngine' => 'applications/fund/query/FundBackerSearchEngine.php',
|
|
|
|
'FundBackerTransaction' => 'applications/fund/storage/FundBackerTransaction.php',
|
|
|
|
'FundBackerTransactionQuery' => 'applications/fund/query/FundBackerTransactionQuery.php',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundController' => 'applications/fund/controller/FundController.php',
|
|
|
|
'FundCreateInitiativesCapability' => 'applications/fund/capability/FundCreateInitiativesCapability.php',
|
|
|
|
'FundDAO' => 'applications/fund/storage/FundDAO.php',
|
|
|
|
'FundDefaultViewCapability' => 'applications/fund/capability/FundDefaultViewCapability.php',
|
|
|
|
'FundInitiative' => 'applications/fund/storage/FundInitiative.php',
|
2014-09-12 15:31:11 +02:00
|
|
|
'FundInitiativeBackController' => 'applications/fund/controller/FundInitiativeBackController.php',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundInitiativeCloseController' => 'applications/fund/controller/FundInitiativeCloseController.php',
|
2016-04-01 00:29:42 +02:00
|
|
|
'FundInitiativeCommentController' => 'applications/fund/controller/FundInitiativeCommentController.php',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundInitiativeEditController' => 'applications/fund/controller/FundInitiativeEditController.php',
|
|
|
|
'FundInitiativeEditor' => 'applications/fund/editor/FundInitiativeEditor.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'FundInitiativeFulltextEngine' => 'applications/fund/search/FundInitiativeFulltextEngine.php',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundInitiativeListController' => 'applications/fund/controller/FundInitiativeListController.php',
|
|
|
|
'FundInitiativePHIDType' => 'applications/fund/phid/FundInitiativePHIDType.php',
|
|
|
|
'FundInitiativeQuery' => 'applications/fund/query/FundInitiativeQuery.php',
|
|
|
|
'FundInitiativeRemarkupRule' => 'applications/fund/remarkup/FundInitiativeRemarkupRule.php',
|
2014-10-10 20:29:42 +02:00
|
|
|
'FundInitiativeReplyHandler' => 'applications/fund/mail/FundInitiativeReplyHandler.php',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundInitiativeSearchEngine' => 'applications/fund/query/FundInitiativeSearchEngine.php',
|
|
|
|
'FundInitiativeTransaction' => 'applications/fund/storage/FundInitiativeTransaction.php',
|
2016-04-01 00:29:42 +02:00
|
|
|
'FundInitiativeTransactionComment' => 'applications/fund/storage/FundInitiativeTransactionComment.php',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundInitiativeTransactionQuery' => 'applications/fund/query/FundInitiativeTransactionQuery.php',
|
|
|
|
'FundInitiativeViewController' => 'applications/fund/controller/FundInitiativeViewController.php',
|
2014-09-19 14:44:40 +02:00
|
|
|
'FundSchemaSpec' => 'applications/fund/storage/FundSchemaSpec.php',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterArcLintBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterArcLintBuildStepImplementation.php',
|
|
|
|
'HarbormasterArcUnitBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterArcUnitBuildStepImplementation.php',
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterArtifact' => 'applications/harbormaster/artifact/HarbormasterArtifact.php',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterAutotargetsTestCase' => 'applications/harbormaster/__tests__/HarbormasterAutotargetsTestCase.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuild' => 'applications/harbormaster/storage/build/HarbormasterBuild.php',
|
2014-08-26 12:46:23 +02:00
|
|
|
'HarbormasterBuildAbortedException' => 'applications/harbormaster/exception/HarbormasterBuildAbortedException.php',
|
Replace "Cancel Build" with "Stop", "Resume" and "Restart"
Summary:
Ref T1049. Currently you can cancel a build, but now that we're tracking a lot more state we can stop, resume, and restart builds.
When the user issues a command against a build, I'm writing it into an auxiliary queue (`HarbormasterBuildCommand`) and then reading them out in the worker. This is mostly to avoid race messes where we try to `save()` the object in multiple places: basically, the BuildEngine is the //only// thing that writes to Build objects, and it holds a lock while it does it.
Test Plan:
- Created a plan which runs "sleep 2" a bunch of times in a row.
- Stopped, resumed, and restarted it.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, chad
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7892
2014-01-06 21:32:20 +01:00
|
|
|
'HarbormasterBuildActionController' => 'applications/harbormaster/controller/HarbormasterBuildActionController.php',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterBuildArcanistAutoplan' => 'applications/harbormaster/autoplan/HarbormasterBuildArcanistAutoplan.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildArtifact' => 'applications/harbormaster/storage/build/HarbormasterBuildArtifact.php',
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterBuildArtifactPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildArtifactPHIDType.php',
|
2013-12-05 02:01:12 +01:00
|
|
|
'HarbormasterBuildArtifactQuery' => 'applications/harbormaster/query/HarbormasterBuildArtifactQuery.php',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterBuildAutoplan' => 'applications/harbormaster/autoplan/HarbormasterBuildAutoplan.php',
|
Replace "Cancel Build" with "Stop", "Resume" and "Restart"
Summary:
Ref T1049. Currently you can cancel a build, but now that we're tracking a lot more state we can stop, resume, and restart builds.
When the user issues a command against a build, I'm writing it into an auxiliary queue (`HarbormasterBuildCommand`) and then reading them out in the worker. This is mostly to avoid race messes where we try to `save()` the object in multiple places: basically, the BuildEngine is the //only// thing that writes to Build objects, and it holds a lock while it does it.
Test Plan:
- Created a plan which runs "sleep 2" a bunch of times in a row.
- Stopped, resumed, and restarted it.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, chad
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7892
2014-01-06 21:32:20 +01:00
|
|
|
'HarbormasterBuildCommand' => 'applications/harbormaster/storage/HarbormasterBuildCommand.php',
|
2014-07-31 03:39:49 +02:00
|
|
|
'HarbormasterBuildDependencyDatasource' => 'applications/harbormaster/typeahead/HarbormasterBuildDependencyDatasource.php',
|
2014-01-06 21:32:10 +01:00
|
|
|
'HarbormasterBuildEngine' => 'applications/harbormaster/engine/HarbormasterBuildEngine.php',
|
2014-08-01 00:08:28 +02:00
|
|
|
'HarbormasterBuildFailureException' => 'applications/harbormaster/exception/HarbormasterBuildFailureException.php',
|
2014-07-31 03:39:49 +02:00
|
|
|
'HarbormasterBuildGraph' => 'applications/harbormaster/engine/HarbormasterBuildGraph.php',
|
2015-06-21 18:00:00 +02:00
|
|
|
'HarbormasterBuildLintMessage' => 'applications/harbormaster/storage/build/HarbormasterBuildLintMessage.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildLog' => 'applications/harbormaster/storage/build/HarbormasterBuildLog.php',
|
2016-03-01 21:10:27 +01:00
|
|
|
'HarbormasterBuildLogChunk' => 'applications/harbormaster/storage/build/HarbormasterBuildLogChunk.php',
|
2016-03-01 21:22:14 +01:00
|
|
|
'HarbormasterBuildLogChunkIterator' => 'applications/harbormaster/storage/build/HarbormasterBuildLogChunkIterator.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildLogPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildLogPHIDType.php',
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterBuildLogQuery' => 'applications/harbormaster/query/HarbormasterBuildLogQuery.php',
|
2014-03-26 00:11:28 +01:00
|
|
|
'HarbormasterBuildMessage' => 'applications/harbormaster/storage/HarbormasterBuildMessage.php',
|
|
|
|
'HarbormasterBuildMessageQuery' => 'applications/harbormaster/query/HarbormasterBuildMessageQuery.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildPHIDType.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildPlan' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlan.php',
|
2014-07-11 01:20:58 +02:00
|
|
|
'HarbormasterBuildPlanDatasource' => 'applications/harbormaster/typeahead/HarbormasterBuildPlanDatasource.php',
|
2015-10-26 20:38:21 +01:00
|
|
|
'HarbormasterBuildPlanDefaultEditCapability' => 'applications/harbormaster/capability/HarbormasterBuildPlanDefaultEditCapability.php',
|
|
|
|
'HarbormasterBuildPlanDefaultViewCapability' => 'applications/harbormaster/capability/HarbormasterBuildPlanDefaultViewCapability.php',
|
2016-02-27 04:12:55 +01:00
|
|
|
'HarbormasterBuildPlanEditEngine' => 'applications/harbormaster/editor/HarbormasterBuildPlanEditEngine.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildPlanEditor' => 'applications/harbormaster/editor/HarbormasterBuildPlanEditor.php',
|
2016-02-27 17:59:33 +01:00
|
|
|
'HarbormasterBuildPlanNameNgrams' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlanNameNgrams.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildPlanPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildPlanPHIDType.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildPlanQuery' => 'applications/harbormaster/query/HarbormasterBuildPlanQuery.php',
|
|
|
|
'HarbormasterBuildPlanSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php',
|
|
|
|
'HarbormasterBuildPlanTransaction' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlanTransaction.php',
|
|
|
|
'HarbormasterBuildPlanTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildPlanTransactionQuery.php',
|
|
|
|
'HarbormasterBuildQuery' => 'applications/harbormaster/query/HarbormasterBuildQuery.php',
|
2015-10-02 15:32:08 +02:00
|
|
|
'HarbormasterBuildRequest' => 'applications/harbormaster/engine/HarbormasterBuildRequest.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildStep' => 'applications/harbormaster/storage/configuration/HarbormasterBuildStep.php',
|
2014-03-26 00:08:40 +01:00
|
|
|
'HarbormasterBuildStepCoreCustomField' => 'applications/harbormaster/customfield/HarbormasterBuildStepCoreCustomField.php',
|
|
|
|
'HarbormasterBuildStepCustomField' => 'applications/harbormaster/customfield/HarbormasterBuildStepCustomField.php',
|
|
|
|
'HarbormasterBuildStepEditor' => 'applications/harbormaster/editor/HarbormasterBuildStepEditor.php',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterBuildStepGroup.php',
|
2014-03-26 00:09:21 +01:00
|
|
|
'HarbormasterBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterBuildStepImplementation.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'HarbormasterBuildStepImplementationTestCase' => 'applications/harbormaster/step/__tests__/HarbormasterBuildStepImplementationTestCase.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildStepPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildStepPHIDType.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildStepQuery' => 'applications/harbormaster/query/HarbormasterBuildStepQuery.php',
|
2014-03-26 00:08:40 +01:00
|
|
|
'HarbormasterBuildStepTransaction' => 'applications/harbormaster/storage/configuration/HarbormasterBuildStepTransaction.php',
|
|
|
|
'HarbormasterBuildStepTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildStepTransactionQuery.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildTarget' => 'applications/harbormaster/storage/build/HarbormasterBuildTarget.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildTargetPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildTargetPHIDType.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildTargetQuery' => 'applications/harbormaster/query/HarbormasterBuildTargetQuery.php',
|
2014-05-15 16:02:30 +02:00
|
|
|
'HarbormasterBuildTransaction' => 'applications/harbormaster/storage/HarbormasterBuildTransaction.php',
|
|
|
|
'HarbormasterBuildTransactionEditor' => 'applications/harbormaster/editor/HarbormasterBuildTransactionEditor.php',
|
|
|
|
'HarbormasterBuildTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildTransactionQuery.php',
|
2015-06-21 18:00:00 +02:00
|
|
|
'HarbormasterBuildUnitMessage' => 'applications/harbormaster/storage/build/HarbormasterBuildUnitMessage.php',
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterBuildViewController' => 'applications/harbormaster/controller/HarbormasterBuildViewController.php',
|
2013-11-05 21:43:47 +01:00
|
|
|
'HarbormasterBuildWorker' => 'applications/harbormaster/worker/HarbormasterBuildWorker.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildable' => 'applications/harbormaster/storage/HarbormasterBuildable.php',
|
2014-01-06 23:12:15 +01:00
|
|
|
'HarbormasterBuildableActionController' => 'applications/harbormaster/controller/HarbormasterBuildableActionController.php',
|
2015-07-30 21:22:35 +02:00
|
|
|
'HarbormasterBuildableAdapterInterface' => 'applications/harbormaster/herald/HarbormasterBuildableAdapterInterface.php',
|
2013-12-26 19:40:52 +01:00
|
|
|
'HarbormasterBuildableInterface' => 'applications/harbormaster/interface/HarbormasterBuildableInterface.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildableListController' => 'applications/harbormaster/controller/HarbormasterBuildableListController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildablePHIDType' => 'applications/harbormaster/phid/HarbormasterBuildablePHIDType.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildableQuery' => 'applications/harbormaster/query/HarbormasterBuildableQuery.php',
|
|
|
|
'HarbormasterBuildableSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildableSearchEngine.php',
|
2014-05-15 16:02:30 +02:00
|
|
|
'HarbormasterBuildableTransaction' => 'applications/harbormaster/storage/HarbormasterBuildableTransaction.php',
|
|
|
|
'HarbormasterBuildableTransactionEditor' => 'applications/harbormaster/editor/HarbormasterBuildableTransactionEditor.php',
|
|
|
|
'HarbormasterBuildableTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildableTransactionQuery.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildableViewController' => 'applications/harbormaster/controller/HarbormasterBuildableViewController.php',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterBuiltinBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterBuiltinBuildStepGroup.php',
|
2015-10-15 05:01:22 +02:00
|
|
|
'HarbormasterCircleCIBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterCircleCIBuildStepImplementation.php',
|
|
|
|
'HarbormasterCircleCIBuildableInterface' => 'applications/harbormaster/interface/HarbormasterCircleCIBuildableInterface.php',
|
2015-10-15 18:07:31 +02:00
|
|
|
'HarbormasterCircleCIHookController' => 'applications/harbormaster/controller/HarbormasterCircleCIHookController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'HarbormasterConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterConduitAPIMethod.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterController' => 'applications/harbormaster/controller/HarbormasterController.php',
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterCreateArtifactConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterCreateArtifactConduitAPIMethod.php',
|
2015-10-26 20:38:21 +01:00
|
|
|
'HarbormasterCreatePlansCapability' => 'applications/harbormaster/capability/HarbormasterCreatePlansCapability.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HarbormasterDAO' => 'applications/harbormaster/storage/HarbormasterDAO.php',
|
2015-10-06 00:59:35 +02:00
|
|
|
'HarbormasterDrydockBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterDrydockBuildStepGroup.php',
|
2015-09-25 19:43:32 +02:00
|
|
|
'HarbormasterDrydockCommandBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterDrydockCommandBuildStepImplementation.php',
|
2015-09-25 02:29:47 +02:00
|
|
|
'HarbormasterDrydockLeaseArtifact' => 'applications/harbormaster/artifact/HarbormasterDrydockLeaseArtifact.php',
|
2015-09-25 19:43:32 +02:00
|
|
|
'HarbormasterExecFuture' => 'applications/harbormaster/future/HarbormasterExecFuture.php',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterExternalBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterExternalBuildStepGroup.php',
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterFileArtifact' => 'applications/harbormaster/artifact/HarbormasterFileArtifact.php',
|
2013-11-09 16:16:12 +01:00
|
|
|
'HarbormasterHTTPRequestBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterHTTPRequestBuildStepImplementation.php',
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterHostArtifact' => 'applications/harbormaster/artifact/HarbormasterHostArtifact.php',
|
2015-09-25 02:29:47 +02:00
|
|
|
'HarbormasterLeaseWorkingCopyBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterLeaseWorkingCopyBuildStepImplementation.php',
|
2015-06-23 22:34:25 +02:00
|
|
|
'HarbormasterLintMessagesController' => 'applications/harbormaster/controller/HarbormasterLintMessagesController.php',
|
2015-06-21 19:11:53 +02:00
|
|
|
'HarbormasterLintPropertyView' => 'applications/harbormaster/view/HarbormasterLintPropertyView.php',
|
2016-03-01 22:53:13 +01:00
|
|
|
'HarbormasterManagementArchiveLogsWorkflow' => 'applications/harbormaster/management/HarbormasterManagementArchiveLogsWorkflow.php',
|
2013-12-26 19:40:52 +01:00
|
|
|
'HarbormasterManagementBuildWorkflow' => 'applications/harbormaster/management/HarbormasterManagementBuildWorkflow.php',
|
2014-04-18 01:01:16 +02:00
|
|
|
'HarbormasterManagementUpdateWorkflow' => 'applications/harbormaster/management/HarbormasterManagementUpdateWorkflow.php',
|
2013-12-26 19:40:52 +01:00
|
|
|
'HarbormasterManagementWorkflow' => 'applications/harbormaster/management/HarbormasterManagementWorkflow.php',
|
2015-08-04 22:05:52 +02:00
|
|
|
'HarbormasterMessageType' => 'applications/harbormaster/engine/HarbormasterMessageType.php',
|
2012-07-09 19:39:14 +02:00
|
|
|
'HarbormasterObject' => 'applications/harbormaster/storage/HarbormasterObject.php',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterOtherBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterOtherBuildStepGroup.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterPlanController' => 'applications/harbormaster/controller/HarbormasterPlanController.php',
|
2013-12-26 19:40:22 +01:00
|
|
|
'HarbormasterPlanDisableController' => 'applications/harbormaster/controller/HarbormasterPlanDisableController.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterPlanEditController' => 'applications/harbormaster/controller/HarbormasterPlanEditController.php',
|
|
|
|
'HarbormasterPlanListController' => 'applications/harbormaster/controller/HarbormasterPlanListController.php',
|
Formalize "manual" buildables in Harbormaster
Summary:
Ref T1049. Generally, it's useful to separate test/trial/manual runs from production/automatic runs.
For example, you don't want to email a bunch of people that the build is broken just because you messed something up when writing a new build plan. You'd rather try it first, then promote it into production once you have some good runs.
Similarly, test runs generally should not affect the outside world, etc. Finally, some build steps (like "wait for other buildables") may want to behave differently when run in production/automation than when run in a testing environment (where they should probably continue immediately).
So, formalize the distinction between automatic buildables (those created passively by the system in response to events) and manual buildables (those created explicitly by users). Add filtering, and stop the automated parts of the system from interacting with the manual parts (for example, we won't show manual results on revisions).
This also moves the "Apply Build Plan" to a third, new home: instead of the sidebar or Buildables, it's now on plans. I think this generally makes more sense given how things have developed. Broadly, this improves isolation of test environments.
Test Plan: Created some builds, browsed around, used filters, etc.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7824
2013-12-26 19:40:43 +01:00
|
|
|
'HarbormasterPlanRunController' => 'applications/harbormaster/controller/HarbormasterPlanRunController.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterPlanViewController' => 'applications/harbormaster/controller/HarbormasterPlanViewController.php',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterPrototypeBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterPrototypeBuildStepGroup.php',
|
2014-03-26 00:09:51 +01:00
|
|
|
'HarbormasterPublishFragmentBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterPublishFragmentBuildStepImplementation.php',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterQueryAutotargetsConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterQueryAutotargetsConduitAPIMethod.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'HarbormasterQueryBuildablesConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterQueryBuildablesConduitAPIMethod.php',
|
|
|
|
'HarbormasterQueryBuildsConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterQueryBuildsConduitAPIMethod.php',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterRemarkupRule' => 'applications/harbormaster/remarkup/HarbormasterRemarkupRule.php',
|
2015-07-30 21:22:35 +02:00
|
|
|
'HarbormasterRunBuildPlansHeraldAction' => 'applications/harbormaster/herald/HarbormasterRunBuildPlansHeraldAction.php',
|
2014-10-01 16:40:36 +02:00
|
|
|
'HarbormasterSchemaSpec' => 'applications/harbormaster/storage/HarbormasterSchemaSpec.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HarbormasterScratchTable' => 'applications/harbormaster/storage/HarbormasterScratchTable.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'HarbormasterSendMessageConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterSendMessageConduitAPIMethod.php',
|
2014-03-26 00:09:51 +01:00
|
|
|
'HarbormasterSleepBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterSleepBuildStepImplementation.php',
|
2013-11-05 22:54:03 +01:00
|
|
|
'HarbormasterStepAddController' => 'applications/harbormaster/controller/HarbormasterStepAddController.php',
|
|
|
|
'HarbormasterStepDeleteController' => 'applications/harbormaster/controller/HarbormasterStepDeleteController.php',
|
|
|
|
'HarbormasterStepEditController' => 'applications/harbormaster/controller/HarbormasterStepEditController.php',
|
2015-10-26 20:38:32 +01:00
|
|
|
'HarbormasterStepViewController' => 'applications/harbormaster/controller/HarbormasterStepViewController.php',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterTargetEngine' => 'applications/harbormaster/engine/HarbormasterTargetEngine.php',
|
2014-01-06 21:32:10 +01:00
|
|
|
'HarbormasterTargetWorker' => 'applications/harbormaster/worker/HarbormasterTargetWorker.php',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterTestBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterTestBuildStepGroup.php',
|
2014-01-13 21:21:49 +01:00
|
|
|
'HarbormasterThrowExceptionBuildStep' => 'applications/harbormaster/step/HarbormasterThrowExceptionBuildStep.php',
|
2013-11-10 00:02:07 +01:00
|
|
|
'HarbormasterUIEventListener' => 'applications/harbormaster/event/HarbormasterUIEventListener.php',
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterURIArtifact' => 'applications/harbormaster/artifact/HarbormasterURIArtifact.php',
|
2016-02-29 15:26:01 +01:00
|
|
|
'HarbormasterUnitMessageListController' => 'applications/harbormaster/controller/HarbormasterUnitMessageListController.php',
|
|
|
|
'HarbormasterUnitMessageViewController' => 'applications/harbormaster/controller/HarbormasterUnitMessageViewController.php',
|
2015-06-21 19:37:55 +02:00
|
|
|
'HarbormasterUnitPropertyView' => 'applications/harbormaster/view/HarbormasterUnitPropertyView.php',
|
2016-02-29 15:15:13 +01:00
|
|
|
'HarbormasterUnitStatus' => 'applications/harbormaster/constants/HarbormasterUnitStatus.php',
|
2016-02-29 18:53:46 +01:00
|
|
|
'HarbormasterUnitSummaryView' => 'applications/harbormaster/view/HarbormasterUnitSummaryView.php',
|
2014-03-26 00:09:51 +01:00
|
|
|
'HarbormasterUploadArtifactBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterUploadArtifactBuildStepImplementation.php',
|
|
|
|
'HarbormasterWaitForPreviousBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterWaitForPreviousBuildStepImplementation.php',
|
2014-01-06 21:32:10 +01:00
|
|
|
'HarbormasterWorker' => 'applications/harbormaster/worker/HarbormasterWorker.php',
|
2015-09-25 02:29:47 +02:00
|
|
|
'HarbormasterWorkingCopyArtifact' => 'applications/harbormaster/artifact/HarbormasterWorkingCopyArtifact.php',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldAction' => 'applications/herald/action/HeraldAction.php',
|
|
|
|
'HeraldActionGroup' => 'applications/herald/action/HeraldActionGroup.php',
|
2015-07-23 22:26:40 +02:00
|
|
|
'HeraldActionRecord' => 'applications/herald/storage/HeraldActionRecord.php',
|
2013-08-02 17:55:13 +02:00
|
|
|
'HeraldAdapter' => 'applications/herald/adapter/HeraldAdapter.php',
|
2015-07-06 22:15:47 +02:00
|
|
|
'HeraldAlwaysField' => 'applications/herald/field/HeraldAlwaysField.php',
|
|
|
|
'HeraldAnotherRuleField' => 'applications/herald/field/HeraldAnotherRuleField.php',
|
2015-07-24 21:51:30 +02:00
|
|
|
'HeraldApplicationActionGroup' => 'applications/herald/action/HeraldApplicationActionGroup.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldApplyTranscript' => 'applications/herald/storage/transcript/HeraldApplyTranscript.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'HeraldBasicFieldGroup' => 'applications/herald/field/HeraldBasicFieldGroup.php',
|
2015-07-07 20:53:17 +02:00
|
|
|
'HeraldCommitAdapter' => 'applications/diffusion/herald/HeraldCommitAdapter.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldCondition' => 'applications/herald/storage/HeraldCondition.php',
|
|
|
|
'HeraldConditionTranscript' => 'applications/herald/storage/transcript/HeraldConditionTranscript.php',
|
2015-07-06 22:15:33 +02:00
|
|
|
'HeraldContentSourceField' => 'applications/herald/field/HeraldContentSourceField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldController' => 'applications/herald/controller/HeraldController.php',
|
|
|
|
'HeraldDAO' => 'applications/herald/storage/HeraldDAO.php',
|
2015-07-08 21:25:38 +02:00
|
|
|
'HeraldDifferentialAdapter' => 'applications/differential/herald/HeraldDifferentialAdapter.php',
|
|
|
|
'HeraldDifferentialDiffAdapter' => 'applications/differential/herald/HeraldDifferentialDiffAdapter.php',
|
2015-07-08 21:25:48 +02:00
|
|
|
'HeraldDifferentialRevisionAdapter' => 'applications/differential/herald/HeraldDifferentialRevisionAdapter.php',
|
2013-10-07 02:10:29 +02:00
|
|
|
'HeraldDisableController' => 'applications/herald/controller/HeraldDisableController.php',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldDoNothingAction' => 'applications/herald/action/HeraldDoNothingAction.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'HeraldEditFieldGroup' => 'applications/herald/field/HeraldEditFieldGroup.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldEffect' => 'applications/herald/engine/HeraldEffect.php',
|
2015-07-16 23:12:00 +02:00
|
|
|
'HeraldEmptyFieldValue' => 'applications/herald/value/HeraldEmptyFieldValue.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldEngine' => 'applications/herald/engine/HeraldEngine.php',
|
2016-01-20 02:18:17 +01:00
|
|
|
'HeraldExactProjectsField' => 'applications/project/herald/HeraldExactProjectsField.php',
|
2015-07-06 22:15:33 +02:00
|
|
|
'HeraldField' => 'applications/herald/field/HeraldField.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'HeraldFieldGroup' => 'applications/herald/field/HeraldFieldGroup.php',
|
2015-07-07 15:05:02 +02:00
|
|
|
'HeraldFieldTestCase' => 'applications/herald/field/__tests__/HeraldFieldTestCase.php',
|
2015-07-16 23:12:00 +02:00
|
|
|
'HeraldFieldValue' => 'applications/herald/value/HeraldFieldValue.php',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldGroup' => 'applications/herald/group/HeraldGroup.php',
|
2013-08-06 20:23:01 +02:00
|
|
|
'HeraldInvalidActionException' => 'applications/herald/engine/exception/HeraldInvalidActionException.php',
|
|
|
|
'HeraldInvalidConditionException' => 'applications/herald/engine/exception/HeraldInvalidConditionException.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'HeraldManageGlobalRulesCapability' => 'applications/herald/capability/HeraldManageGlobalRulesCapability.php',
|
2015-07-06 22:17:01 +02:00
|
|
|
'HeraldManiphestTaskAdapter' => 'applications/maniphest/herald/HeraldManiphestTaskAdapter.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldNewController' => 'applications/herald/controller/HeraldNewController.php',
|
2015-07-06 22:15:47 +02:00
|
|
|
'HeraldNewObjectField' => 'applications/herald/field/HeraldNewObjectField.php',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldNotifyActionGroup' => 'applications/herald/action/HeraldNotifyActionGroup.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldObjectTranscript' => 'applications/herald/storage/transcript/HeraldObjectTranscript.php',
|
2015-12-28 05:19:39 +01:00
|
|
|
'HeraldPhameBlogAdapter' => 'applications/phame/herald/HeraldPhameBlogAdapter.php',
|
|
|
|
'HeraldPhamePostAdapter' => 'applications/phame/herald/HeraldPhamePostAdapter.php',
|
2015-07-06 22:17:33 +02:00
|
|
|
'HeraldPholioMockAdapter' => 'applications/pholio/herald/HeraldPholioMockAdapter.php',
|
2015-08-08 19:22:18 +02:00
|
|
|
'HeraldPonderQuestionAdapter' => 'applications/ponder/herald/HeraldPonderQuestionAdapter.php',
|
2014-01-03 21:24:28 +01:00
|
|
|
'HeraldPreCommitAdapter' => 'applications/diffusion/herald/HeraldPreCommitAdapter.php',
|
2013-12-18 23:18:45 +01:00
|
|
|
'HeraldPreCommitContentAdapter' => 'applications/diffusion/herald/HeraldPreCommitContentAdapter.php',
|
Add Herald support for blocking ref changes
Summary: Ref T4195. Allows users to write Herald rules which block ref changes. For example, you can write a rule like `alincoln can not create branches`, or `no one can push to the branch "frozen"`.
Test Plan:
This covers a lot of ground. I created and pushed a bunch of rules, then looked at transcripts, in general. Here are some bits in detail:
Here's a hook-based reject message:
>>> orbital ~/repos/POEMS $ git push
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 274 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: +---------------------------------------------------------------+
remote: | * * * PUSH REJECTED BY EVIL DRAGON BUREAUCRATS * * * |
remote: +---------------------------------------------------------------+
remote: \
remote: \ ^ /^
remote: \ / \ // \
remote: \ |\___/| / \// .\
remote: \ /V V \__ / // | \ \ *----*
remote: / / \/_/ // | \ \ \ |
remote: @___@` \/_ // | \ \ \/\ \
remote: 0/0/| \/_ // | \ \ \ \
remote: 0/0/0/0/| \/// | \ \ | |
remote: 0/0/0/0/0/_|_ / ( // | \ _\ | /
remote: 0/0/0/0/0/0/`/,_ _ _/ ) ; -. | _ _\.-~ / /
remote: ,-} _ *-.|.-~-. .~ ~
remote: \ \__/ `/\ / ~-. _ .-~ /
remote: \____(Oo) *. } { /
remote: ( (--) .----~-.\ \-` .~
remote: //__\\ \ DENIED! ///.----..< \ _ -~
remote: // \\ ///-._ _ _ _ _ _ _{^ - - - - ~
remote:
remote:
remote: This commit was rejected by Herald pre-commit rule H24.
remote: Rule: No Branches Called Blarp
remote: Reason: "blarp" is a bad branch name
remote:
To ssh://dweller@localhost/diffusion/POEMS/
! [remote rejected] blarp -> blarp (pre-receive hook declined)
error: failed to push some refs to 'ssh://dweller@localhost/diffusion/POEMS/'
Here's a transcript, showing that all the field values populate sensibly:
{F90453}
Here's a rule:
{F90454}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T4195
Differential Revision: https://secure.phabricator.com/D7782
2013-12-18 00:23:55 +01:00
|
|
|
'HeraldPreCommitRefAdapter' => 'applications/diffusion/herald/HeraldPreCommitRefAdapter.php',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldPreventActionGroup' => 'applications/herald/action/HeraldPreventActionGroup.php',
|
2015-07-06 22:15:47 +02:00
|
|
|
'HeraldProjectsField' => 'applications/project/herald/HeraldProjectsField.php',
|
2013-08-06 20:23:01 +02:00
|
|
|
'HeraldRecursiveConditionsException' => 'applications/herald/engine/exception/HeraldRecursiveConditionsException.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'HeraldRelatedFieldGroup' => 'applications/herald/field/HeraldRelatedFieldGroup.php',
|
2013-12-18 21:00:18 +01:00
|
|
|
'HeraldRemarkupRule' => 'applications/herald/remarkup/HeraldRemarkupRule.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldRepetitionPolicyConfig' => 'applications/herald/config/HeraldRepetitionPolicyConfig.php',
|
|
|
|
'HeraldRule' => 'applications/herald/storage/HeraldRule.php',
|
|
|
|
'HeraldRuleController' => 'applications/herald/controller/HeraldRuleController.php',
|
2013-10-07 02:10:29 +02:00
|
|
|
'HeraldRuleEditor' => 'applications/herald/editor/HeraldRuleEditor.php',
|
2013-08-02 15:53:01 +02:00
|
|
|
'HeraldRuleListController' => 'applications/herald/controller/HeraldRuleListController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HeraldRulePHIDType' => 'applications/herald/phid/HeraldRulePHIDType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldRuleQuery' => 'applications/herald/query/HeraldRuleQuery.php',
|
2013-08-02 15:53:01 +02:00
|
|
|
'HeraldRuleSearchEngine' => 'applications/herald/query/HeraldRuleSearchEngine.php',
|
2016-03-29 01:02:41 +02:00
|
|
|
'HeraldRuleSerializer' => 'applications/herald/editor/HeraldRuleSerializer.php',
|
2014-10-02 18:49:32 +02:00
|
|
|
'HeraldRuleTestCase' => 'applications/herald/storage/__tests__/HeraldRuleTestCase.php',
|
2013-08-02 17:28:55 +02:00
|
|
|
'HeraldRuleTransaction' => 'applications/herald/storage/HeraldRuleTransaction.php',
|
|
|
|
'HeraldRuleTransactionComment' => 'applications/herald/storage/HeraldRuleTransactionComment.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldRuleTranscript' => 'applications/herald/storage/transcript/HeraldRuleTranscript.php',
|
|
|
|
'HeraldRuleTypeConfig' => 'applications/herald/config/HeraldRuleTypeConfig.php',
|
2013-08-06 22:43:45 +02:00
|
|
|
'HeraldRuleViewController' => 'applications/herald/controller/HeraldRuleViewController.php',
|
2014-10-01 16:53:12 +02:00
|
|
|
'HeraldSchemaSpec' => 'applications/herald/storage/HeraldSchemaSpec.php',
|
2015-07-16 23:12:00 +02:00
|
|
|
'HeraldSelectFieldValue' => 'applications/herald/value/HeraldSelectFieldValue.php',
|
2015-07-06 22:15:47 +02:00
|
|
|
'HeraldSpaceField' => 'applications/spaces/herald/HeraldSpaceField.php',
|
|
|
|
'HeraldSubscribersField' => 'applications/subscriptions/herald/HeraldSubscribersField.php',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldSupportActionGroup' => 'applications/herald/action/HeraldSupportActionGroup.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'HeraldSupportFieldGroup' => 'applications/herald/field/HeraldSupportFieldGroup.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldTestConsoleController' => 'applications/herald/controller/HeraldTestConsoleController.php',
|
2015-07-16 23:12:00 +02:00
|
|
|
'HeraldTextFieldValue' => 'applications/herald/value/HeraldTextFieldValue.php',
|
2015-07-16 23:12:44 +02:00
|
|
|
'HeraldTokenizerFieldValue' => 'applications/herald/value/HeraldTokenizerFieldValue.php',
|
2013-10-07 02:10:29 +02:00
|
|
|
'HeraldTransactionQuery' => 'applications/herald/query/HeraldTransactionQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldTranscript' => 'applications/herald/storage/transcript/HeraldTranscript.php',
|
|
|
|
'HeraldTranscriptController' => 'applications/herald/controller/HeraldTranscriptController.php',
|
2015-12-20 17:11:59 +01:00
|
|
|
'HeraldTranscriptDestructionEngineExtension' => 'applications/herald/engineextension/HeraldTranscriptDestructionEngineExtension.php',
|
2014-01-15 19:02:24 +01:00
|
|
|
'HeraldTranscriptGarbageCollector' => 'applications/herald/garbagecollector/HeraldTranscriptGarbageCollector.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldTranscriptListController' => 'applications/herald/controller/HeraldTranscriptListController.php',
|
2016-01-15 17:40:48 +01:00
|
|
|
'HeraldTranscriptPHIDType' => 'applications/herald/phid/HeraldTranscriptPHIDType.php',
|
2013-10-05 00:17:18 +02:00
|
|
|
'HeraldTranscriptQuery' => 'applications/herald/query/HeraldTranscriptQuery.php',
|
2014-02-21 21:51:25 +01:00
|
|
|
'HeraldTranscriptSearchEngine' => 'applications/herald/query/HeraldTranscriptSearchEngine.php',
|
2013-12-18 20:59:53 +01:00
|
|
|
'HeraldTranscriptTestCase' => 'applications/herald/storage/__tests__/HeraldTranscriptTestCase.php',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldUtilityActionGroup' => 'applications/herald/action/HeraldUtilityActionGroup.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'Javelin' => 'infrastructure/javelin/Javelin.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'JavelinReactorUIExample' => 'applications/uiexample/examples/JavelinReactorUIExample.php',
|
2012-07-31 01:08:10 +02:00
|
|
|
'JavelinUIExample' => 'applications/uiexample/examples/JavelinUIExample.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'JavelinViewExampleServerView' => 'applications/uiexample/examples/JavelinViewExampleServerView.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'JavelinViewUIExample' => 'applications/uiexample/examples/JavelinViewUIExample.php',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadController' => 'applications/legalpad/controller/LegalpadController.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'LegalpadCreateDocumentsCapability' => 'applications/legalpad/capability/LegalpadCreateDocumentsCapability.php',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDAO' => 'applications/legalpad/storage/LegalpadDAO.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'LegalpadDefaultEditCapability' => 'applications/legalpad/capability/LegalpadDefaultEditCapability.php',
|
|
|
|
'LegalpadDefaultViewCapability' => 'applications/legalpad/capability/LegalpadDefaultViewCapability.php',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDocument' => 'applications/legalpad/storage/LegalpadDocument.php',
|
|
|
|
'LegalpadDocumentBody' => 'applications/legalpad/storage/LegalpadDocumentBody.php',
|
|
|
|
'LegalpadDocumentCommentController' => 'applications/legalpad/controller/LegalpadDocumentCommentController.php',
|
2014-07-11 01:18:48 +02:00
|
|
|
'LegalpadDocumentDatasource' => 'applications/legalpad/typeahead/LegalpadDocumentDatasource.php',
|
2014-06-26 16:16:42 +02:00
|
|
|
'LegalpadDocumentDoneController' => 'applications/legalpad/controller/LegalpadDocumentDoneController.php',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDocumentEditController' => 'applications/legalpad/controller/LegalpadDocumentEditController.php',
|
|
|
|
'LegalpadDocumentEditor' => 'applications/legalpad/editor/LegalpadDocumentEditor.php',
|
|
|
|
'LegalpadDocumentListController' => 'applications/legalpad/controller/LegalpadDocumentListController.php',
|
2014-06-26 03:38:07 +02:00
|
|
|
'LegalpadDocumentManageController' => 'applications/legalpad/controller/LegalpadDocumentManageController.php',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDocumentQuery' => 'applications/legalpad/query/LegalpadDocumentQuery.php',
|
2014-02-10 20:27:08 +01:00
|
|
|
'LegalpadDocumentRemarkupRule' => 'applications/legalpad/remarkup/LegalpadDocumentRemarkupRule.php',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDocumentSearchEngine' => 'applications/legalpad/query/LegalpadDocumentSearchEngine.php',
|
2013-07-10 20:46:39 +02:00
|
|
|
'LegalpadDocumentSignController' => 'applications/legalpad/controller/LegalpadDocumentSignController.php',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDocumentSignature' => 'applications/legalpad/storage/LegalpadDocumentSignature.php',
|
2014-07-02 13:59:35 +02:00
|
|
|
'LegalpadDocumentSignatureAddController' => 'applications/legalpad/controller/LegalpadDocumentSignatureAddController.php',
|
2014-01-17 20:40:26 +01:00
|
|
|
'LegalpadDocumentSignatureListController' => 'applications/legalpad/controller/LegalpadDocumentSignatureListController.php',
|
|
|
|
'LegalpadDocumentSignatureQuery' => 'applications/legalpad/query/LegalpadDocumentSignatureQuery.php',
|
2014-06-29 01:36:37 +02:00
|
|
|
'LegalpadDocumentSignatureSearchEngine' => 'applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php',
|
2014-01-15 02:17:18 +01:00
|
|
|
'LegalpadDocumentSignatureVerificationController' => 'applications/legalpad/controller/LegalpadDocumentSignatureVerificationController.php',
|
2014-07-02 13:59:35 +02:00
|
|
|
'LegalpadDocumentSignatureViewController' => 'applications/legalpad/controller/LegalpadDocumentSignatureViewController.php',
|
2015-04-01 20:01:21 +02:00
|
|
|
'LegalpadMailReceiver' => 'applications/legalpad/mail/LegalpadMailReceiver.php',
|
2015-01-01 01:15:34 +01:00
|
|
|
'LegalpadObjectNeedsSignatureEdgeType' => 'applications/legalpad/edge/LegalpadObjectNeedsSignatureEdgeType.php',
|
2013-07-04 01:37:05 +02:00
|
|
|
'LegalpadReplyHandler' => 'applications/legalpad/mail/LegalpadReplyHandler.php',
|
2015-07-30 21:09:17 +02:00
|
|
|
'LegalpadRequireSignatureHeraldAction' => 'applications/legalpad/herald/LegalpadRequireSignatureHeraldAction.php',
|
2014-09-19 14:44:40 +02:00
|
|
|
'LegalpadSchemaSpec' => 'applications/legalpad/storage/LegalpadSchemaSpec.php',
|
2015-01-01 01:15:34 +01:00
|
|
|
'LegalpadSignatureNeededByObjectEdgeType' => 'applications/legalpad/edge/LegalpadSignatureNeededByObjectEdgeType.php',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadTransaction' => 'applications/legalpad/storage/LegalpadTransaction.php',
|
|
|
|
'LegalpadTransactionComment' => 'applications/legalpad/storage/LegalpadTransactionComment.php',
|
|
|
|
'LegalpadTransactionQuery' => 'applications/legalpad/query/LegalpadTransactionQuery.php',
|
|
|
|
'LegalpadTransactionView' => 'applications/legalpad/view/LegalpadTransactionView.php',
|
Implement a more compact, general database-backed key-value cache
Summary:
See discussion in D4204. Facebook currently has a 314MB remarkup cache with a 55MB index, which is slow to access. Under the theory that this is an index size/quality problem (the current index is on a potentially-384-byte field, with many keys sharing prefixes), provide a more general index with fancy new features:
- It implements PhutilKeyValueCache, so it can be a component in cache stacks and supports TTL.
- It has a 12-byte hash-based key.
- It automatically compresses large blocks of data (most of what we store is highly-compressible HTML).
Test Plan:
- Basics:
- Loaded /paste/, saw caches generate and save.
- Reloaded /paste/, saw the page hit cache.
- GC:
- Ran GC daemon, saw nothing.
- Set maximum lifetime to 1 second, ran GC daemon, saw it collect the entire cache.
- Deflate:
- Selected row formats from the database, saw a mixture of 'raw' and 'deflate' storage.
- Used profiler to verify that 'deflate' is fast (12 calls @ 220us on my paste list).
- Ran unit tests
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran
Differential Revision: https://secure.phabricator.com/D4259
2012-12-21 23:17:56 +01:00
|
|
|
'LiskChunkTestCase' => 'infrastructure/storage/lisk/__tests__/LiskChunkTestCase.php',
|
2012-07-02 19:49:00 +02:00
|
|
|
'LiskDAO' => 'infrastructure/storage/lisk/LiskDAO.php',
|
|
|
|
'LiskDAOSet' => 'infrastructure/storage/lisk/LiskDAOSet.php',
|
2012-10-24 21:47:53 +02:00
|
|
|
'LiskDAOTestCase' => 'infrastructure/storage/lisk/__tests__/LiskDAOTestCase.php',
|
2012-07-02 19:49:00 +02:00
|
|
|
'LiskEphemeralObjectException' => 'infrastructure/storage/lisk/LiskEphemeralObjectException.php',
|
|
|
|
'LiskFixtureTestCase' => 'infrastructure/storage/lisk/__tests__/LiskFixtureTestCase.php',
|
|
|
|
'LiskIsolationTestCase' => 'infrastructure/storage/lisk/__tests__/LiskIsolationTestCase.php',
|
|
|
|
'LiskIsolationTestDAO' => 'infrastructure/storage/lisk/__tests__/LiskIsolationTestDAO.php',
|
|
|
|
'LiskIsolationTestDAOException' => 'infrastructure/storage/lisk/__tests__/LiskIsolationTestDAOException.php',
|
2012-07-19 05:01:23 +02:00
|
|
|
'LiskMigrationIterator' => 'infrastructure/storage/lisk/LiskMigrationIterator.php',
|
2013-06-21 21:55:07 +02:00
|
|
|
'LiskRawMigrationIterator' => 'infrastructure/storage/lisk/LiskRawMigrationIterator.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'MacroConduitAPIMethod' => 'applications/macro/conduit/MacroConduitAPIMethod.php',
|
|
|
|
'MacroCreateMemeConduitAPIMethod' => 'applications/macro/conduit/MacroCreateMemeConduitAPIMethod.php',
|
|
|
|
'MacroQueryConduitAPIMethod' => 'applications/macro/conduit/MacroQueryConduitAPIMethod.php',
|
2015-04-01 17:40:42 +02:00
|
|
|
'ManiphestAssignEmailCommand' => 'applications/maniphest/command/ManiphestAssignEmailCommand.php',
|
2015-04-19 17:23:56 +02:00
|
|
|
'ManiphestAssigneeDatasource' => 'applications/maniphest/typeahead/ManiphestAssigneeDatasource.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestBatchEditController' => 'applications/maniphest/controller/ManiphestBatchEditController.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'ManiphestBulkEditCapability' => 'applications/maniphest/capability/ManiphestBulkEditCapability.php',
|
2015-04-01 17:40:42 +02:00
|
|
|
'ManiphestClaimEmailCommand' => 'applications/maniphest/command/ManiphestClaimEmailCommand.php',
|
|
|
|
'ManiphestCloseEmailCommand' => 'applications/maniphest/command/ManiphestCloseEmailCommand.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestConduitAPIMethod.php',
|
2013-09-19 20:56:15 +02:00
|
|
|
'ManiphestConfiguredCustomField' => 'applications/maniphest/field/ManiphestConfiguredCustomField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestConstants' => 'applications/maniphest/constants/ManiphestConstants.php',
|
|
|
|
'ManiphestController' => 'applications/maniphest/controller/ManiphestController.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ManiphestCreateMailReceiver' => 'applications/maniphest/mail/ManiphestCreateMailReceiver.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestCreateTaskConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestCreateTaskConduitAPIMethod.php',
|
2013-09-11 00:31:48 +02:00
|
|
|
'ManiphestCustomField' => 'applications/maniphest/field/ManiphestCustomField.php',
|
2013-09-16 23:06:41 +02:00
|
|
|
'ManiphestCustomFieldNumericIndex' => 'applications/maniphest/storage/ManiphestCustomFieldNumericIndex.php',
|
2014-02-18 00:59:13 +01:00
|
|
|
'ManiphestCustomFieldStatusParser' => 'applications/maniphest/field/parser/ManiphestCustomFieldStatusParser.php',
|
|
|
|
'ManiphestCustomFieldStatusParserTestCase' => 'applications/maniphest/field/parser/__tests__/ManiphestCustomFieldStatusParserTestCase.php',
|
2013-09-16 23:06:41 +02:00
|
|
|
'ManiphestCustomFieldStorage' => 'applications/maniphest/storage/ManiphestCustomFieldStorage.php',
|
|
|
|
'ManiphestCustomFieldStringIndex' => 'applications/maniphest/storage/ManiphestCustomFieldStringIndex.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestDAO' => 'applications/maniphest/storage/ManiphestDAO.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'ManiphestDefaultEditCapability' => 'applications/maniphest/capability/ManiphestDefaultEditCapability.php',
|
|
|
|
'ManiphestDefaultViewCapability' => 'applications/maniphest/capability/ManiphestDefaultViewCapability.php',
|
|
|
|
'ManiphestEditAssignCapability' => 'applications/maniphest/capability/ManiphestEditAssignCapability.php',
|
2015-12-03 23:32:40 +01:00
|
|
|
'ManiphestEditConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestEditConduitAPIMethod.php',
|
|
|
|
'ManiphestEditEngine' => 'applications/maniphest/editor/ManiphestEditEngine.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'ManiphestEditPoliciesCapability' => 'applications/maniphest/capability/ManiphestEditPoliciesCapability.php',
|
|
|
|
'ManiphestEditPriorityCapability' => 'applications/maniphest/capability/ManiphestEditPriorityCapability.php',
|
|
|
|
'ManiphestEditProjectsCapability' => 'applications/maniphest/capability/ManiphestEditProjectsCapability.php',
|
|
|
|
'ManiphestEditStatusCapability' => 'applications/maniphest/capability/ManiphestEditStatusCapability.php',
|
2015-04-01 17:40:42 +02:00
|
|
|
'ManiphestEmailCommand' => 'applications/maniphest/command/ManiphestEmailCommand.php',
|
2013-04-11 20:22:06 +02:00
|
|
|
'ManiphestExcelDefaultFormat' => 'applications/maniphest/export/ManiphestExcelDefaultFormat.php',
|
|
|
|
'ManiphestExcelFormat' => 'applications/maniphest/export/ManiphestExcelFormat.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'ManiphestExcelFormatTestCase' => 'applications/maniphest/export/__tests__/ManiphestExcelFormatTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestExportController' => 'applications/maniphest/controller/ManiphestExportController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestGetTaskTransactionsConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestGetTaskTransactionsConduitAPIMethod.php',
|
2015-12-24 20:20:18 +01:00
|
|
|
'ManiphestHovercardEngineExtension' => 'applications/maniphest/engineextension/ManiphestHovercardEngineExtension.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestInfoConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestInfoConduitAPIMethod.php',
|
2013-09-12 22:06:44 +02:00
|
|
|
'ManiphestNameIndex' => 'applications/maniphest/storage/ManiphestNameIndex.php',
|
2016-02-12 02:32:44 +01:00
|
|
|
'ManiphestPointsConfigOptionType' => 'applications/maniphest/config/ManiphestPointsConfigOptionType.php',
|
2015-12-06 01:35:36 +01:00
|
|
|
'ManiphestPriorityConfigOptionType' => 'applications/maniphest/config/ManiphestPriorityConfigOptionType.php',
|
2015-04-01 19:09:47 +02:00
|
|
|
'ManiphestPriorityEmailCommand' => 'applications/maniphest/command/ManiphestPriorityEmailCommand.php',
|
2015-12-21 15:55:23 +01:00
|
|
|
'ManiphestProjectNameFulltextEngineExtension' => 'applications/maniphest/engineextension/ManiphestProjectNameFulltextEngineExtension.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestQueryConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestQueryConduitAPIMethod.php',
|
|
|
|
'ManiphestQueryStatusesConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestQueryStatusesConduitAPIMethod.php',
|
2013-02-26 23:57:41 +01:00
|
|
|
'ManiphestRemarkupRule' => 'applications/maniphest/remarkup/ManiphestRemarkupRule.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ManiphestReplyHandler' => 'applications/maniphest/mail/ManiphestReplyHandler.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestReportController' => 'applications/maniphest/controller/ManiphestReportController.php',
|
2014-09-19 20:46:44 +02:00
|
|
|
'ManiphestSchemaSpec' => 'applications/maniphest/storage/ManiphestSchemaSpec.php',
|
2015-12-13 11:31:09 +01:00
|
|
|
'ManiphestSearchConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestSearchConduitAPIMethod.php',
|
2014-03-25 22:05:36 +01:00
|
|
|
'ManiphestStatusConfigOptionType' => 'applications/maniphest/config/ManiphestStatusConfigOptionType.php',
|
2015-04-01 19:09:47 +02:00
|
|
|
'ManiphestStatusEmailCommand' => 'applications/maniphest/command/ManiphestStatusEmailCommand.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestSubpriorityController' => 'applications/maniphest/controller/ManiphestSubpriorityController.php',
|
|
|
|
'ManiphestTask' => 'applications/maniphest/storage/ManiphestTask.php',
|
2015-07-24 21:51:30 +02:00
|
|
|
'ManiphestTaskAssignHeraldAction' => 'applications/maniphest/herald/ManiphestTaskAssignHeraldAction.php',
|
|
|
|
'ManiphestTaskAssignOtherHeraldAction' => 'applications/maniphest/herald/ManiphestTaskAssignOtherHeraldAction.php',
|
|
|
|
'ManiphestTaskAssignSelfHeraldAction' => 'applications/maniphest/herald/ManiphestTaskAssignSelfHeraldAction.php',
|
2015-07-06 22:17:14 +02:00
|
|
|
'ManiphestTaskAssigneeHeraldField' => 'applications/maniphest/herald/ManiphestTaskAssigneeHeraldField.php',
|
|
|
|
'ManiphestTaskAuthorHeraldField' => 'applications/maniphest/herald/ManiphestTaskAuthorHeraldField.php',
|
2015-06-14 00:44:03 +02:00
|
|
|
'ManiphestTaskAuthorPolicyRule' => 'applications/maniphest/policyrule/ManiphestTaskAuthorPolicyRule.php',
|
2015-04-23 15:47:30 +02:00
|
|
|
'ManiphestTaskClosedStatusDatasource' => 'applications/maniphest/typeahead/ManiphestTaskClosedStatusDatasource.php',
|
2014-12-28 15:10:49 +01:00
|
|
|
'ManiphestTaskDependedOnByTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskDependedOnByTaskEdgeType.php',
|
|
|
|
'ManiphestTaskDependsOnTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskDependsOnTaskEdgeType.php',
|
2015-07-06 22:17:14 +02:00
|
|
|
'ManiphestTaskDescriptionHeraldField' => 'applications/maniphest/herald/ManiphestTaskDescriptionHeraldField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestTaskDetailController' => 'applications/maniphest/controller/ManiphestTaskDetailController.php',
|
2015-06-23 22:36:16 +02:00
|
|
|
'ManiphestTaskEditBulkJobType' => 'applications/maniphest/bulk/ManiphestTaskEditBulkJobType.php',
|
2015-12-09 01:54:46 +01:00
|
|
|
'ManiphestTaskEditController' => 'applications/maniphest/controller/ManiphestTaskEditController.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'ManiphestTaskFulltextEngine' => 'applications/maniphest/search/ManiphestTaskFulltextEngine.php',
|
2014-07-18 00:42:06 +02:00
|
|
|
'ManiphestTaskHasCommitEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasCommitEdgeType.php',
|
2015-01-02 00:11:41 +01:00
|
|
|
'ManiphestTaskHasMockEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasMockEdgeType.php',
|
2014-07-18 00:41:08 +02:00
|
|
|
'ManiphestTaskHasRevisionEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasRevisionEdgeType.php',
|
2015-07-06 22:17:14 +02:00
|
|
|
'ManiphestTaskHeraldField' => 'applications/maniphest/herald/ManiphestTaskHeraldField.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'ManiphestTaskHeraldFieldGroup' => 'applications/maniphest/herald/ManiphestTaskHeraldFieldGroup.php',
|
2013-09-13 18:50:46 +02:00
|
|
|
'ManiphestTaskListController' => 'applications/maniphest/controller/ManiphestTaskListController.php',
|
2015-12-08 16:54:01 +01:00
|
|
|
'ManiphestTaskListHTTPParameterType' => 'applications/maniphest/httpparametertype/ManiphestTaskListHTTPParameterType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestTaskListView' => 'applications/maniphest/view/ManiphestTaskListView.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ManiphestTaskMailReceiver' => 'applications/maniphest/mail/ManiphestTaskMailReceiver.php',
|
2015-04-23 15:47:30 +02:00
|
|
|
'ManiphestTaskOpenStatusDatasource' => 'applications/maniphest/typeahead/ManiphestTaskOpenStatusDatasource.php',
|
2015-12-08 16:54:01 +01:00
|
|
|
'ManiphestTaskPHIDResolver' => 'applications/maniphest/httpparametertype/ManiphestTaskPHIDResolver.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'ManiphestTaskPHIDType' => 'applications/maniphest/phid/ManiphestTaskPHIDType.php',
|
2016-02-09 00:24:52 +01:00
|
|
|
'ManiphestTaskPoints' => 'applications/maniphest/constants/ManiphestTaskPoints.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestTaskPriority' => 'applications/maniphest/constants/ManiphestTaskPriority.php',
|
2014-07-11 01:20:40 +02:00
|
|
|
'ManiphestTaskPriorityDatasource' => 'applications/maniphest/typeahead/ManiphestTaskPriorityDatasource.php',
|
2015-12-05 20:15:29 +01:00
|
|
|
'ManiphestTaskPriorityHeraldAction' => 'applications/maniphest/herald/ManiphestTaskPriorityHeraldAction.php',
|
2015-07-06 22:17:01 +02:00
|
|
|
'ManiphestTaskPriorityHeraldField' => 'applications/maniphest/herald/ManiphestTaskPriorityHeraldField.php',
|
2013-09-12 22:02:55 +02:00
|
|
|
'ManiphestTaskQuery' => 'applications/maniphest/query/ManiphestTaskQuery.php',
|
2014-05-16 04:17:38 +02:00
|
|
|
'ManiphestTaskResultListView' => 'applications/maniphest/view/ManiphestTaskResultListView.php',
|
2013-09-10 19:04:26 +02:00
|
|
|
'ManiphestTaskSearchEngine' => 'applications/maniphest/query/ManiphestTaskSearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestTaskStatus' => 'applications/maniphest/constants/ManiphestTaskStatus.php',
|
2014-11-12 21:54:29 +01:00
|
|
|
'ManiphestTaskStatusDatasource' => 'applications/maniphest/typeahead/ManiphestTaskStatusDatasource.php',
|
2015-04-23 15:47:30 +02:00
|
|
|
'ManiphestTaskStatusFunctionDatasource' => 'applications/maniphest/typeahead/ManiphestTaskStatusFunctionDatasource.php',
|
2015-12-05 19:51:34 +01:00
|
|
|
'ManiphestTaskStatusHeraldAction' => 'applications/maniphest/herald/ManiphestTaskStatusHeraldAction.php',
|
2015-07-06 22:17:01 +02:00
|
|
|
'ManiphestTaskStatusHeraldField' => 'applications/maniphest/herald/ManiphestTaskStatusHeraldField.php',
|
2014-03-25 22:04:51 +01:00
|
|
|
'ManiphestTaskStatusTestCase' => 'applications/maniphest/constants/__tests__/ManiphestTaskStatusTestCase.php',
|
2015-03-21 01:38:25 +01:00
|
|
|
'ManiphestTaskTestCase' => 'applications/maniphest/__tests__/ManiphestTaskTestCase.php',
|
2015-07-06 22:17:14 +02:00
|
|
|
'ManiphestTaskTitleHeraldField' => 'applications/maniphest/herald/ManiphestTaskTitleHeraldField.php',
|
2013-09-24 19:49:06 +02:00
|
|
|
'ManiphestTransaction' => 'applications/maniphest/storage/ManiphestTransaction.php',
|
2013-09-23 23:25:14 +02:00
|
|
|
'ManiphestTransactionComment' => 'applications/maniphest/storage/ManiphestTransactionComment.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestTransactionEditor' => 'applications/maniphest/editor/ManiphestTransactionEditor.php',
|
Migrate all Maniphest transaction data to new storage
Summary:
Ref T2217. This is the risky, hard part; everything after this should be smooth sailing. This is //mostly// clean, except:
- The old format would opportunistically combine a comment with some other transaction type if it could. We no longer do that, so:
- When migrating, "edit" + "comment" transactions need to be split in two.
- When editing now, we should no longer combine these transaction types.
- These changes are pretty straightforward and low-impact.
- This migration promotes "auxiliary field" data to the new CustomField/StandardField format, so that's not a straight migration either. The formats are very similar, though.
Broadly, this takes the same attack that the auth migration did: proxy all the code through to the new storage. `ManiphestTransaction` is now just an API on top of `ManiphestTransactionPro`, which is the new storage format. The two formats are very similar, so this was mostly a straight copy from one table to the other.
Test Plan:
- Without performing the migration, made a bunch of edits and comments on tasks and verified the new code works correctly.
- Droped the test data and performed the migration.
- Looked at the resulting data for obvious discrepancies.
- Looked at a bunch of tasks and their transaction history.
- Used Conduit to pull transaction data.
- Edited task description and clicked "View Details" on transaction.
- Used batch editor.
- Made a bunch more edits.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2217
Differential Revision: https://secure.phabricator.com/D7068
2013-09-23 23:25:28 +02:00
|
|
|
'ManiphestTransactionQuery' => 'applications/maniphest/query/ManiphestTransactionQuery.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestUpdateConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestUpdateConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestView' => 'applications/maniphest/view/ManiphestView.php',
|
2015-04-01 17:40:00 +02:00
|
|
|
'MetaMTAEmailTransactionCommand' => 'applications/metamta/command/MetaMTAEmailTransactionCommand.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'MetaMTAEmailTransactionCommandTestCase' => 'applications/metamta/command/__tests__/MetaMTAEmailTransactionCommandTestCase.php',
|
2014-02-03 19:51:31 +01:00
|
|
|
'MetaMTAMailReceivedGarbageCollector' => 'applications/metamta/garbagecollector/MetaMTAMailReceivedGarbageCollector.php',
|
|
|
|
'MetaMTAMailSentGarbageCollector' => 'applications/metamta/garbagecollector/MetaMTAMailSentGarbageCollector.php',
|
2013-05-14 01:32:19 +02:00
|
|
|
'MetaMTAReceivedMailStatus' => 'applications/metamta/constants/MetaMTAReceivedMailStatus.php',
|
Skeleton for "Multimeter", a performance sampling application
Summary:
Ref T6930. This application collects and displays performance samples -- roughly, things Phabricator spent some kind of resource on. It will collect samples on different types of resources and events:
- Wall time (queries, service calls, pages)
- Bytes In / Bytes Out (requests)
- Implicit requests to CSS/JS (static resources)
I've started with the simplest case (static resources), since this can be used in an immediate, straghtforward way to improve packaging (look at which individual files have the most requests recently).
There's no aggregation yet and a lot of the data isn't collected properly. Future diffs will add more dimension data (controllers, users), more event and resource types (queries, service calls, wall time), and more display options (aggregation, sorting).
Test Plan: {F389344}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6930
Differential Revision: https://secure.phabricator.com/D12623
2015-05-01 22:19:43 +02:00
|
|
|
'MultimeterContext' => 'applications/multimeter/storage/MultimeterContext.php',
|
|
|
|
'MultimeterControl' => 'applications/multimeter/data/MultimeterControl.php',
|
|
|
|
'MultimeterController' => 'applications/multimeter/controller/MultimeterController.php',
|
|
|
|
'MultimeterDAO' => 'applications/multimeter/storage/MultimeterDAO.php',
|
|
|
|
'MultimeterDimension' => 'applications/multimeter/storage/MultimeterDimension.php',
|
|
|
|
'MultimeterEvent' => 'applications/multimeter/storage/MultimeterEvent.php',
|
|
|
|
'MultimeterEventGarbageCollector' => 'applications/multimeter/garbagecollector/MultimeterEventGarbageCollector.php',
|
|
|
|
'MultimeterHost' => 'applications/multimeter/storage/MultimeterHost.php',
|
|
|
|
'MultimeterLabel' => 'applications/multimeter/storage/MultimeterLabel.php',
|
|
|
|
'MultimeterSampleController' => 'applications/multimeter/controller/MultimeterSampleController.php',
|
|
|
|
'MultimeterViewer' => 'applications/multimeter/storage/MultimeterViewer.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'NuanceConduitAPIMethod' => 'applications/nuance/conduit/NuanceConduitAPIMethod.php',
|
2015-08-23 16:19:35 +02:00
|
|
|
'NuanceConsoleController' => 'applications/nuance/controller/NuanceConsoleController.php',
|
2016-03-28 20:18:39 +02:00
|
|
|
'NuanceContentSource' => 'applications/nuance/contentsource/NuanceContentSource.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceController' => 'applications/nuance/controller/NuanceController.php',
|
|
|
|
'NuanceDAO' => 'applications/nuance/storage/NuanceDAO.php',
|
2016-03-08 22:07:22 +01:00
|
|
|
'NuanceGitHubEventItemType' => 'applications/nuance/item/NuanceGitHubEventItemType.php',
|
Split the GitHub import cursor into separate repository and issues event importers
Summary:
Ref T10538. The primary GitHub event activity stream does not report minor events (labels, milestones, etc).
GitHub has a second, similar activity stream which does report these events (the "Issues Events API").
Use two separate cursors: one consumes the primary stream; the second consumes the events stream.
One possible issue with this is that we may write events in a different order than they occurred, so GitHub shows "comment, label, close" but we show "comment, close, label" or similar. This is probably OK because the secondary API doesn't seem to have any very important events (e.g., it's probably fine if label changes are out-of-order), but we can conceivably put some buffer stage in between the two if it's an issue.
Test Plan: {F1164894}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10538
Differential Revision: https://secure.phabricator.com/D15446
2016-03-09 14:35:08 +01:00
|
|
|
'NuanceGitHubImportCursor' => 'applications/nuance/cursor/NuanceGitHubImportCursor.php',
|
|
|
|
'NuanceGitHubIssuesImportCursor' => 'applications/nuance/cursor/NuanceGitHubIssuesImportCursor.php',
|
2016-03-09 15:30:22 +01:00
|
|
|
'NuanceGitHubRawEvent' => 'applications/nuance/github/NuanceGitHubRawEvent.php',
|
2016-03-09 16:01:23 +01:00
|
|
|
'NuanceGitHubRawEventTestCase' => 'applications/nuance/github/__tests__/NuanceGitHubRawEventTestCase.php',
|
2016-03-08 16:50:43 +01:00
|
|
|
'NuanceGitHubRepositoryImportCursor' => 'applications/nuance/cursor/NuanceGitHubRepositoryImportCursor.php',
|
|
|
|
'NuanceGitHubRepositorySourceDefinition' => 'applications/nuance/source/NuanceGitHubRepositorySourceDefinition.php',
|
2016-03-08 14:59:24 +01:00
|
|
|
'NuanceImportCursor' => 'applications/nuance/cursor/NuanceImportCursor.php',
|
|
|
|
'NuanceImportCursorData' => 'applications/nuance/storage/NuanceImportCursorData.php',
|
|
|
|
'NuanceImportCursorDataQuery' => 'applications/nuance/query/NuanceImportCursorDataQuery.php',
|
|
|
|
'NuanceImportCursorPHIDType' => 'applications/nuance/phid/NuanceImportCursorPHIDType.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceItem' => 'applications/nuance/storage/NuanceItem.php',
|
2016-03-22 01:38:22 +01:00
|
|
|
'NuanceItemActionController' => 'applications/nuance/controller/NuanceItemActionController.php',
|
2016-03-22 14:51:22 +01:00
|
|
|
'NuanceItemCommand' => 'applications/nuance/storage/NuanceItemCommand.php',
|
|
|
|
'NuanceItemCommandQuery' => 'applications/nuance/query/NuanceItemCommandQuery.php',
|
2016-03-08 17:51:45 +01:00
|
|
|
'NuanceItemController' => 'applications/nuance/controller/NuanceItemController.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceItemEditor' => 'applications/nuance/editor/NuanceItemEditor.php',
|
2016-03-08 17:51:45 +01:00
|
|
|
'NuanceItemListController' => 'applications/nuance/controller/NuanceItemListController.php',
|
2016-03-09 13:01:17 +01:00
|
|
|
'NuanceItemManageController' => 'applications/nuance/controller/NuanceItemManageController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'NuanceItemPHIDType' => 'applications/nuance/phid/NuanceItemPHIDType.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceItemQuery' => 'applications/nuance/query/NuanceItemQuery.php',
|
2016-03-08 17:51:45 +01:00
|
|
|
'NuanceItemSearchEngine' => 'applications/nuance/query/NuanceItemSearchEngine.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceItemTransaction' => 'applications/nuance/storage/NuanceItemTransaction.php',
|
|
|
|
'NuanceItemTransactionComment' => 'applications/nuance/storage/NuanceItemTransactionComment.php',
|
|
|
|
'NuanceItemTransactionQuery' => 'applications/nuance/query/NuanceItemTransactionQuery.php',
|
2016-03-08 22:07:22 +01:00
|
|
|
'NuanceItemType' => 'applications/nuance/item/NuanceItemType.php',
|
|
|
|
'NuanceItemUpdateWorker' => 'applications/nuance/worker/NuanceItemUpdateWorker.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceItemViewController' => 'applications/nuance/controller/NuanceItemViewController.php',
|
2016-03-08 15:27:26 +01:00
|
|
|
'NuanceManagementImportWorkflow' => 'applications/nuance/management/NuanceManagementImportWorkflow.php',
|
2016-03-08 22:07:22 +01:00
|
|
|
'NuanceManagementUpdateWorkflow' => 'applications/nuance/management/NuanceManagementUpdateWorkflow.php',
|
2016-03-08 15:27:26 +01:00
|
|
|
'NuanceManagementWorkflow' => 'applications/nuance/management/NuanceManagementWorkflow.php',
|
2013-11-20 22:41:19 +01:00
|
|
|
'NuancePhabricatorFormSourceDefinition' => 'applications/nuance/source/NuancePhabricatorFormSourceDefinition.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceQuery' => 'applications/nuance/query/NuanceQuery.php',
|
|
|
|
'NuanceQueue' => 'applications/nuance/storage/NuanceQueue.php',
|
2016-03-08 00:18:55 +01:00
|
|
|
'NuanceQueueController' => 'applications/nuance/controller/NuanceQueueController.php',
|
2015-08-24 18:21:56 +02:00
|
|
|
'NuanceQueueDatasource' => 'applications/nuance/typeahead/NuanceQueueDatasource.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceQueueEditController' => 'applications/nuance/controller/NuanceQueueEditController.php',
|
2016-03-08 01:22:39 +01:00
|
|
|
'NuanceQueueEditEngine' => 'applications/nuance/editor/NuanceQueueEditEngine.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceQueueEditor' => 'applications/nuance/editor/NuanceQueueEditor.php',
|
2015-06-05 19:49:35 +02:00
|
|
|
'NuanceQueueListController' => 'applications/nuance/controller/NuanceQueueListController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'NuanceQueuePHIDType' => 'applications/nuance/phid/NuanceQueuePHIDType.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceQueueQuery' => 'applications/nuance/query/NuanceQueueQuery.php',
|
2015-06-05 19:49:35 +02:00
|
|
|
'NuanceQueueSearchEngine' => 'applications/nuance/query/NuanceQueueSearchEngine.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceQueueTransaction' => 'applications/nuance/storage/NuanceQueueTransaction.php',
|
|
|
|
'NuanceQueueTransactionComment' => 'applications/nuance/storage/NuanceQueueTransactionComment.php',
|
|
|
|
'NuanceQueueTransactionQuery' => 'applications/nuance/query/NuanceQueueTransactionQuery.php',
|
|
|
|
'NuanceQueueViewController' => 'applications/nuance/controller/NuanceQueueViewController.php',
|
2014-09-24 22:50:00 +02:00
|
|
|
'NuanceSchemaSpec' => 'applications/nuance/storage/NuanceSchemaSpec.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceSource' => 'applications/nuance/storage/NuanceSource.php',
|
2015-06-05 20:01:06 +02:00
|
|
|
'NuanceSourceActionController' => 'applications/nuance/controller/NuanceSourceActionController.php',
|
2016-03-08 00:18:55 +01:00
|
|
|
'NuanceSourceController' => 'applications/nuance/controller/NuanceSourceController.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'NuanceSourceDefaultEditCapability' => 'applications/nuance/capability/NuanceSourceDefaultEditCapability.php',
|
|
|
|
'NuanceSourceDefaultViewCapability' => 'applications/nuance/capability/NuanceSourceDefaultViewCapability.php',
|
2013-11-20 22:41:19 +01:00
|
|
|
'NuanceSourceDefinition' => 'applications/nuance/source/NuanceSourceDefinition.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'NuanceSourceDefinitionTestCase' => 'applications/nuance/source/__tests__/NuanceSourceDefinitionTestCase.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceSourceEditController' => 'applications/nuance/controller/NuanceSourceEditController.php',
|
2016-03-08 14:09:25 +01:00
|
|
|
'NuanceSourceEditEngine' => 'applications/nuance/editor/NuanceSourceEditEngine.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceSourceEditor' => 'applications/nuance/editor/NuanceSourceEditor.php',
|
2015-06-05 19:44:18 +02:00
|
|
|
'NuanceSourceListController' => 'applications/nuance/controller/NuanceSourceListController.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'NuanceSourceManageCapability' => 'applications/nuance/capability/NuanceSourceManageCapability.php',
|
2016-03-08 15:27:26 +01:00
|
|
|
'NuanceSourceNameNgrams' => 'applications/nuance/storage/NuanceSourceNameNgrams.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'NuanceSourcePHIDType' => 'applications/nuance/phid/NuanceSourcePHIDType.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceSourceQuery' => 'applications/nuance/query/NuanceSourceQuery.php',
|
2015-06-05 19:44:18 +02:00
|
|
|
'NuanceSourceSearchEngine' => 'applications/nuance/query/NuanceSourceSearchEngine.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceSourceTransaction' => 'applications/nuance/storage/NuanceSourceTransaction.php',
|
|
|
|
'NuanceSourceTransactionComment' => 'applications/nuance/storage/NuanceSourceTransactionComment.php',
|
|
|
|
'NuanceSourceTransactionQuery' => 'applications/nuance/query/NuanceSourceTransactionQuery.php',
|
|
|
|
'NuanceSourceViewController' => 'applications/nuance/controller/NuanceSourceViewController.php',
|
|
|
|
'NuanceTransaction' => 'applications/nuance/storage/NuanceTransaction.php',
|
2016-03-08 22:07:22 +01:00
|
|
|
'NuanceWorker' => 'applications/nuance/worker/NuanceWorker.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'OwnersConduitAPIMethod' => 'applications/owners/conduit/OwnersConduitAPIMethod.php',
|
2015-11-29 18:33:36 +01:00
|
|
|
'OwnersEditConduitAPIMethod' => 'applications/owners/conduit/OwnersEditConduitAPIMethod.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'OwnersPackageReplyHandler' => 'applications/owners/mail/OwnersPackageReplyHandler.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'OwnersQueryConduitAPIMethod' => 'applications/owners/conduit/OwnersQueryConduitAPIMethod.php',
|
2015-12-13 01:25:51 +01:00
|
|
|
'OwnersSearchConduitAPIMethod' => 'applications/owners/conduit/OwnersSearchConduitAPIMethod.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PHIDConduitAPIMethod' => 'applications/phid/conduit/PHIDConduitAPIMethod.php',
|
|
|
|
'PHIDInfoConduitAPIMethod' => 'applications/phid/conduit/PHIDInfoConduitAPIMethod.php',
|
|
|
|
'PHIDLookupConduitAPIMethod' => 'applications/phid/conduit/PHIDLookupConduitAPIMethod.php',
|
|
|
|
'PHIDQueryConduitAPIMethod' => 'applications/phid/conduit/PHIDQueryConduitAPIMethod.php',
|
2013-04-18 20:34:02 +02:00
|
|
|
'PHUI' => 'view/phui/PHUI.php',
|
2015-02-08 02:06:28 +01:00
|
|
|
'PHUIActionPanelExample' => 'applications/uiexample/examples/PHUIActionPanelExample.php',
|
|
|
|
'PHUIActionPanelView' => 'view/phui/PHUIActionPanelView.php',
|
Make mobile navigation work properly by default in more cases
Summary:
Fixes T5752. This obsoletes a bunch of old patterns and I'll follow up on those with a big "go do a bunch of mechanical code changes" task. Major goals are:
- Don't load named queries multiple times on search pages.
- Don't require extra code to get standard navigation right on mobile.
- Reduce the amount of boilerplate in ListControllers.
- Reduce the amount of boilerplate around navigation/menus in all controllers.
Specifically, here's what this does:
- The StandardPage is now a smarter/more structured object with `setNavigation()` and `setCrumbs()` methods. More rendering decisions are delayed until the last possible moment.
- It uses this to automatically add crumb actions to the application menu.
- It uses this to automatically reuse one SearchEngine instead of running queries multiple times.
- The new preferred way to build responses is `$this->newPage()` (like `$this->newDialog()`), which has structured methods for adding stuff (`setTitle()`, etc).
- SearchEngine exposes a new convenience method so you don't have to do all the controller delegation stuff.
- Building menus is generally simpler.
Test Plan:
- Tested paste list, view, edit, comment, raw controllers for functionality, mobile menu, crumbs, navigation menu.
- Edited saved queries.
- Tested Differential, Maniphest (no changes).
- Verified the paste pages don't run any duplicate NamedQuery queries.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T5752
Differential Revision: https://secure.phabricator.com/D14382
2015-11-02 21:06:28 +01:00
|
|
|
'PHUIApplicationMenuView' => 'view/layout/PHUIApplicationMenuView.php',
|
2015-07-10 00:12:11 +02:00
|
|
|
'PHUIBadgeBoxView' => 'view/phui/PHUIBadgeBoxView.php',
|
|
|
|
'PHUIBadgeExample' => 'applications/uiexample/examples/PHUIBadgeExample.php',
|
2015-07-10 19:49:28 +02:00
|
|
|
'PHUIBadgeMiniView' => 'view/phui/PHUIBadgeMiniView.php',
|
2015-07-10 00:12:11 +02:00
|
|
|
'PHUIBadgeView' => 'view/phui/PHUIBadgeView.php',
|
2015-12-21 16:35:45 +01:00
|
|
|
'PHUIBigInfoView' => 'view/phui/PHUIBigInfoView.php',
|
2013-04-18 20:34:02 +02:00
|
|
|
'PHUIBoxExample' => 'applications/uiexample/examples/PHUIBoxExample.php',
|
|
|
|
'PHUIBoxView' => 'view/phui/PHUIBoxView.php',
|
2014-02-10 20:11:36 +01:00
|
|
|
'PHUIButtonBarExample' => 'applications/uiexample/examples/PHUIButtonBarExample.php',
|
|
|
|
'PHUIButtonBarView' => 'view/phui/PHUIButtonBarView.php',
|
2013-06-13 03:23:35 +02:00
|
|
|
'PHUIButtonExample' => 'applications/uiexample/examples/PHUIButtonExample.php',
|
|
|
|
'PHUIButtonView' => 'view/phui/PHUIButtonView.php',
|
2015-05-04 01:57:18 +02:00
|
|
|
'PHUICalendarDayView' => 'view/phui/calendar/PHUICalendarDayView.php',
|
2014-02-24 19:04:23 +01:00
|
|
|
'PHUICalendarListView' => 'view/phui/calendar/PHUICalendarListView.php',
|
|
|
|
'PHUICalendarMonthView' => 'view/phui/calendar/PHUICalendarMonthView.php',
|
2015-04-27 15:42:32 +02:00
|
|
|
'PHUICalendarWidgetView' => 'view/phui/calendar/PHUICalendarWidgetView.php',
|
2013-06-19 00:35:14 +02:00
|
|
|
'PHUIColorPalletteExample' => 'applications/uiexample/examples/PHUIColorPalletteExample.php',
|
2015-01-23 20:35:09 +01:00
|
|
|
'PHUICrumbView' => 'view/phui/PHUICrumbView.php',
|
|
|
|
'PHUICrumbsView' => 'view/phui/PHUICrumbsView.php',
|
2016-03-05 23:45:56 +01:00
|
|
|
'PHUICurtainExtension' => 'view/extension/PHUICurtainExtension.php',
|
|
|
|
'PHUICurtainPanelView' => 'view/layout/PHUICurtainPanelView.php',
|
|
|
|
'PHUICurtainView' => 'view/layout/PHUICurtainView.php',
|
2015-03-06 14:11:29 +01:00
|
|
|
'PHUIDiffInlineCommentDetailView' => 'infrastructure/diff/view/PHUIDiffInlineCommentDetailView.php',
|
|
|
|
'PHUIDiffInlineCommentEditView' => 'infrastructure/diff/view/PHUIDiffInlineCommentEditView.php',
|
2015-03-06 14:44:36 +01:00
|
|
|
'PHUIDiffInlineCommentRowScaffold' => 'infrastructure/diff/view/PHUIDiffInlineCommentRowScaffold.php',
|
|
|
|
'PHUIDiffInlineCommentTableScaffold' => 'infrastructure/diff/view/PHUIDiffInlineCommentTableScaffold.php',
|
2015-03-08 23:27:16 +01:00
|
|
|
'PHUIDiffInlineCommentUndoView' => 'infrastructure/diff/view/PHUIDiffInlineCommentUndoView.php',
|
2015-03-06 14:11:29 +01:00
|
|
|
'PHUIDiffInlineCommentView' => 'infrastructure/diff/view/PHUIDiffInlineCommentView.php',
|
2015-03-06 14:44:36 +01:00
|
|
|
'PHUIDiffOneUpInlineCommentRowScaffold' => 'infrastructure/diff/view/PHUIDiffOneUpInlineCommentRowScaffold.php',
|
Allow inline comments to be individually hidden
Summary:
Ref T7447. Implements per-viewer comment hiding. Once a comment is obsolete or uninteresting, you can hide it completely.
This is sticky per-user.
My hope is that this will strike a better balance between concerns than some of the other approaches (conservative porting, summarization, hide-all).
Specifically, this adds a new action here:
{F435621}
Clicking it completely collapses the comment into a small icon on the previous line, and saves the comment state as hidden for you:
{F435626}
You can click the icon to reveal all hidden comments below the line.
Test Plan:
- Hid comments.
- Showed comments.
- Created, edited, deleted and submitted comments.
- Used Diffusion comments (hiding is not implemented there yet, but I'd plan to bring it there eventually if it works out in Differential).
Reviewers: btrahan, chad
Reviewed By: btrahan
Subscribers: jparise, yelirekim, epriestley
Maniphest Tasks: T7447
Differential Revision: https://secure.phabricator.com/D13009
2015-05-27 19:28:38 +02:00
|
|
|
'PHUIDiffRevealIconView' => 'infrastructure/diff/view/PHUIDiffRevealIconView.php',
|
2015-08-15 20:43:12 +02:00
|
|
|
'PHUIDiffTableOfContentsItemView' => 'infrastructure/diff/view/PHUIDiffTableOfContentsItemView.php',
|
|
|
|
'PHUIDiffTableOfContentsListView' => 'infrastructure/diff/view/PHUIDiffTableOfContentsListView.php',
|
2015-03-06 14:44:36 +01:00
|
|
|
'PHUIDiffTwoUpInlineCommentRowScaffold' => 'infrastructure/diff/view/PHUIDiffTwoUpInlineCommentRowScaffold.php',
|
2013-06-05 17:41:43 +02:00
|
|
|
'PHUIDocumentExample' => 'applications/uiexample/examples/PHUIDocumentExample.php',
|
2015-11-30 17:47:46 +01:00
|
|
|
'PHUIDocumentSummaryView' => 'view/phui/PHUIDocumentSummaryView.php',
|
2013-06-01 00:03:59 +02:00
|
|
|
'PHUIDocumentView' => 'view/phui/PHUIDocumentView.php',
|
Redesign Diviner
Summary:
This implements `PHUIDocumentViewPro` which should move to be the base for all documents (Phame, Phriction, Legalpad, Diviner). Overall this feels really good to me, but I'd like to roll it out into Diviner specifically first to work through the issues and then move into other apps and drop `PHUIDocumentView` once everything is converted. Some features are:
- White Background, no border on page
- Table of Contents is move to hidden menu (more space for documentation)
- Property List sits under the document
Some design decisions above are in anticipation of Phriction v3 and Unbeta Phame, specifically commenting and maybe some cool new Remarkup text layout options for Phame.
Test Plan:
Went through tons of pages on Diviner on Desktop, Tablet, Mobile. Bounce back to Phriction to make sure DocumentView CSS changes actually look better there.
{F930518}
{F930519}
{F930520}
{F930521}
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: tycho.tatitscheff, joshuaspence, Korvin
Differential Revision: https://secure.phabricator.com/D14374
2015-11-01 17:56:46 +01:00
|
|
|
'PHUIDocumentViewPro' => 'view/phui/PHUIDocumentViewPro.php',
|
2013-04-25 00:18:58 +02:00
|
|
|
'PHUIFeedStoryExample' => 'applications/uiexample/examples/PHUIFeedStoryExample.php',
|
2013-04-15 04:32:26 +02:00
|
|
|
'PHUIFeedStoryView' => 'view/phui/PHUIFeedStoryView.php',
|
2013-05-24 21:38:27 +02:00
|
|
|
'PHUIFormDividerControl' => 'view/form/control/PHUIFormDividerControl.php',
|
2013-05-31 02:32:12 +02:00
|
|
|
'PHUIFormFreeformDateControl' => 'view/form/control/PHUIFormFreeformDateControl.php',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PHUIFormIconSetControl' => 'view/form/control/PHUIFormIconSetControl.php',
|
2014-11-07 23:16:30 +01:00
|
|
|
'PHUIFormInsetView' => 'view/form/PHUIFormInsetView.php',
|
2013-08-26 20:53:11 +02:00
|
|
|
'PHUIFormLayoutView' => 'view/form/PHUIFormLayoutView.php',
|
Add a basic multipage form
Summary:
Ref T2232. Very busy day on IRC so I feel like I've made 20 minutes of progress in 1-minute spurts here, but this adds the basics for a form that can have multiple pages and automatically handle pagination and reading to/from the request, objects and responses.
The UIExample is reasonably instructive. Basically, you make a form, add pages to the form, and add controls to the pages. The core flow control looks like this:
if ($request->isFormPost()) {
$form->readFromRequest($request); // (1)
if ($form->isComplete()) { // (2)
$response = $form->writeToResponse($response); // (3)
// Process result here. // (4)
}
} else {
$form->readFromObject($object); // (5)
}
The key parts are:
# This reads the form state from the request, including reading all the inactive pages.
# This tests if all pages are valid and the user just clicked "Done" on the last page.
# This produces a "response", which might be writing to an object (for simpler forms) or creating a transaction record (for more complex forms).
# Here, we would save the object or apply the transactions.
# When the user views the form for the first time, we preload all the values from some object (which might just be empty).
Ultimate goal here is to fix repository creation to not be a terrible pit of awfulness.
There are probably a lot of rough edges and missing features still, but this seems to not be totally crazy.
I'm using two submit buttons with different names which doesn't work on IE7 or something, but we can JS our way out of that if we need to.
Test Plan: Paged forward and backward through the form.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2232
Differential Revision: https://secure.phabricator.com/D6003
2013-05-23 23:39:01 +02:00
|
|
|
'PHUIFormMultiSubmitControl' => 'view/form/control/PHUIFormMultiSubmitControl.php',
|
|
|
|
'PHUIFormPageView' => 'view/form/PHUIFormPageView.php',
|
2015-03-30 15:18:54 +02:00
|
|
|
'PHUIHandleListView' => 'applications/phid/view/PHUIHandleListView.php',
|
2014-06-26 17:49:44 +02:00
|
|
|
'PHUIHandleTagListView' => 'applications/phid/view/PHUIHandleTagListView.php',
|
2015-03-30 15:18:54 +02:00
|
|
|
'PHUIHandleView' => 'applications/phid/view/PHUIHandleView.php',
|
2016-02-26 23:34:51 +01:00
|
|
|
'PHUIHeadThingView' => 'view/phui/PHUIHeadThingView.php',
|
2013-09-17 18:12:37 +02:00
|
|
|
'PHUIHeaderView' => 'view/phui/PHUIHeaderView.php',
|
2016-02-03 17:26:30 +01:00
|
|
|
'PHUIHovercardUIExample' => 'applications/uiexample/examples/PHUIHovercardUIExample.php',
|
|
|
|
'PHUIHovercardView' => 'view/phui/PHUIHovercardView.php',
|
2016-01-16 06:37:36 +01:00
|
|
|
'PHUIIconCircleView' => 'view/phui/PHUIIconCircleView.php',
|
2013-04-20 02:44:20 +02:00
|
|
|
'PHUIIconExample' => 'applications/uiexample/examples/PHUIIconExample.php',
|
|
|
|
'PHUIIconView' => 'view/phui/PHUIIconView.php',
|
2014-06-18 23:09:37 +02:00
|
|
|
'PHUIImageMaskExample' => 'applications/uiexample/examples/PHUIImageMaskExample.php',
|
|
|
|
'PHUIImageMaskView' => 'view/phui/PHUIImageMaskView.php',
|
2015-03-01 23:45:56 +01:00
|
|
|
'PHUIInfoExample' => 'applications/uiexample/examples/PHUIInfoExample.php',
|
2013-10-25 20:09:06 +02:00
|
|
|
'PHUIInfoPanelExample' => 'applications/uiexample/examples/PHUIInfoPanelExample.php',
|
|
|
|
'PHUIInfoPanelView' => 'view/phui/PHUIInfoPanelView.php',
|
2015-03-01 23:45:56 +01:00
|
|
|
'PHUIInfoView' => 'view/form/PHUIInfoView.php',
|
2013-06-06 00:03:56 +02:00
|
|
|
'PHUIListExample' => 'applications/uiexample/examples/PHUIListExample.php',
|
2013-06-05 17:41:43 +02:00
|
|
|
'PHUIListItemView' => 'view/phui/PHUIListItemView.php',
|
|
|
|
'PHUIListView' => 'view/phui/PHUIListView.php',
|
|
|
|
'PHUIListViewTestCase' => 'view/layout/__tests__/PHUIListViewTestCase.php',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PHUIMainMenuView' => 'view/phui/PHUIMainMenuView.php',
|
2013-09-25 20:23:29 +02:00
|
|
|
'PHUIObjectBoxView' => 'view/phui/PHUIObjectBoxView.php',
|
2013-09-09 23:14:34 +02:00
|
|
|
'PHUIObjectItemListExample' => 'applications/uiexample/examples/PHUIObjectItemListExample.php',
|
|
|
|
'PHUIObjectItemListView' => 'view/phui/PHUIObjectItemListView.php',
|
|
|
|
'PHUIObjectItemView' => 'view/phui/PHUIObjectItemView.php',
|
Add a basic multipage form
Summary:
Ref T2232. Very busy day on IRC so I feel like I've made 20 minutes of progress in 1-minute spurts here, but this adds the basics for a form that can have multiple pages and automatically handle pagination and reading to/from the request, objects and responses.
The UIExample is reasonably instructive. Basically, you make a form, add pages to the form, and add controls to the pages. The core flow control looks like this:
if ($request->isFormPost()) {
$form->readFromRequest($request); // (1)
if ($form->isComplete()) { // (2)
$response = $form->writeToResponse($response); // (3)
// Process result here. // (4)
}
} else {
$form->readFromObject($object); // (5)
}
The key parts are:
# This reads the form state from the request, including reading all the inactive pages.
# This tests if all pages are valid and the user just clicked "Done" on the last page.
# This produces a "response", which might be writing to an object (for simpler forms) or creating a transaction record (for more complex forms).
# Here, we would save the object or apply the transactions.
# When the user views the form for the first time, we preload all the values from some object (which might just be empty).
Ultimate goal here is to fix repository creation to not be a terrible pit of awfulness.
There are probably a lot of rough edges and missing features still, but this seems to not be totally crazy.
I'm using two submit buttons with different names which doesn't work on IE7 or something, but we can JS our way out of that if we need to.
Test Plan: Paged forward and backward through the form.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2232
Differential Revision: https://secure.phabricator.com/D6003
2013-05-23 23:39:01 +02:00
|
|
|
'PHUIPagedFormView' => 'view/form/PHUIPagedFormView.php',
|
2015-06-02 23:34:04 +02:00
|
|
|
'PHUIPagerView' => 'view/phui/PHUIPagerView.php',
|
2013-08-07 19:58:09 +02:00
|
|
|
'PHUIPinboardItemView' => 'view/phui/PHUIPinboardItemView.php',
|
|
|
|
'PHUIPinboardView' => 'view/phui/PHUIPinboardView.php',
|
2013-10-11 16:53:56 +02:00
|
|
|
'PHUIPropertyGroupView' => 'view/phui/PHUIPropertyGroupView.php',
|
|
|
|
'PHUIPropertyListExample' => 'applications/uiexample/examples/PHUIPropertyListExample.php',
|
|
|
|
'PHUIPropertyListView' => 'view/phui/PHUIPropertyListView.php',
|
2013-08-05 19:46:39 +02:00
|
|
|
'PHUIRemarkupPreviewPanel' => 'view/phui/PHUIRemarkupPreviewPanel.php',
|
2015-10-15 19:20:19 +02:00
|
|
|
'PHUIRemarkupView' => 'infrastructure/markup/view/PHUIRemarkupView.php',
|
2016-02-08 23:37:31 +01:00
|
|
|
'PHUISegmentBarSegmentView' => 'view/phui/PHUISegmentBarSegmentView.php',
|
|
|
|
'PHUISegmentBarView' => 'view/phui/PHUISegmentBarView.php',
|
2015-06-05 23:20:25 +02:00
|
|
|
'PHUISpacesNamespaceContextView' => 'applications/spaces/view/PHUISpacesNamespaceContextView.php',
|
2013-07-24 23:13:22 +02:00
|
|
|
'PHUIStatusItemView' => 'view/phui/PHUIStatusItemView.php',
|
|
|
|
'PHUIStatusListView' => 'view/phui/PHUIStatusListView.php',
|
2014-01-14 23:09:52 +01:00
|
|
|
'PHUITagExample' => 'applications/uiexample/examples/PHUITagExample.php',
|
|
|
|
'PHUITagView' => 'view/phui/PHUITagView.php',
|
2014-02-12 18:02:05 +01:00
|
|
|
'PHUITimelineEventView' => 'view/phui/PHUITimelineEventView.php',
|
|
|
|
'PHUITimelineExample' => 'applications/uiexample/examples/PHUITimelineExample.php',
|
|
|
|
'PHUITimelineView' => 'view/phui/PHUITimelineView.php',
|
2015-08-10 23:55:43 +02:00
|
|
|
'PHUITwoColumnView' => 'view/phui/PHUITwoColumnView.php',
|
2015-04-17 16:00:43 +02:00
|
|
|
'PHUITypeaheadExample' => 'applications/uiexample/examples/PHUITypeaheadExample.php',
|
2013-09-06 23:06:12 +02:00
|
|
|
'PHUIWorkboardView' => 'view/phui/PHUIWorkboardView.php',
|
|
|
|
'PHUIWorkpanelView' => 'view/phui/PHUIWorkpanelView.php',
|
2013-11-23 00:23:10 +01:00
|
|
|
'PassphraseAbstractKey' => 'applications/passphrase/keys/PassphraseAbstractKey.php',
|
2014-08-16 14:41:03 +02:00
|
|
|
'PassphraseConduitAPIMethod' => 'applications/passphrase/conduit/PassphraseConduitAPIMethod.php',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseController' => 'applications/passphrase/controller/PassphraseController.php',
|
|
|
|
'PassphraseCredential' => 'applications/passphrase/storage/PassphraseCredential.php',
|
2015-06-22 20:28:33 +02:00
|
|
|
'PassphraseCredentialAuthorPolicyRule' => 'applications/passphrase/policyrule/PassphraseCredentialAuthorPolicyRule.php',
|
2014-08-16 14:41:03 +02:00
|
|
|
'PassphraseCredentialConduitController' => 'applications/passphrase/controller/PassphraseCredentialConduitController.php',
|
2013-11-21 21:35:36 +01:00
|
|
|
'PassphraseCredentialControl' => 'applications/passphrase/view/PassphraseCredentialControl.php',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseCredentialCreateController' => 'applications/passphrase/controller/PassphraseCredentialCreateController.php',
|
|
|
|
'PassphraseCredentialDestroyController' => 'applications/passphrase/controller/PassphraseCredentialDestroyController.php',
|
|
|
|
'PassphraseCredentialEditController' => 'applications/passphrase/controller/PassphraseCredentialEditController.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PassphraseCredentialFulltextEngine' => 'applications/passphrase/search/PassphraseCredentialFulltextEngine.php',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseCredentialListController' => 'applications/passphrase/controller/PassphraseCredentialListController.php',
|
2014-05-03 03:05:19 +02:00
|
|
|
'PassphraseCredentialLockController' => 'applications/passphrase/controller/PassphraseCredentialLockController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PassphraseCredentialPHIDType' => 'applications/passphrase/phid/PassphraseCredentialPHIDType.php',
|
2014-03-13 02:58:25 +01:00
|
|
|
'PassphraseCredentialPublicController' => 'applications/passphrase/controller/PassphraseCredentialPublicController.php',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseCredentialQuery' => 'applications/passphrase/query/PassphraseCredentialQuery.php',
|
|
|
|
'PassphraseCredentialRevealController' => 'applications/passphrase/controller/PassphraseCredentialRevealController.php',
|
|
|
|
'PassphraseCredentialSearchEngine' => 'applications/passphrase/query/PassphraseCredentialSearchEngine.php',
|
|
|
|
'PassphraseCredentialTransaction' => 'applications/passphrase/storage/PassphraseCredentialTransaction.php',
|
|
|
|
'PassphraseCredentialTransactionEditor' => 'applications/passphrase/editor/PassphraseCredentialTransactionEditor.php',
|
|
|
|
'PassphraseCredentialTransactionQuery' => 'applications/passphrase/query/PassphraseCredentialTransactionQuery.php',
|
|
|
|
'PassphraseCredentialType' => 'applications/passphrase/credentialtype/PassphraseCredentialType.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PassphraseCredentialTypeTestCase' => 'applications/passphrase/credentialtype/__tests__/PassphraseCredentialTypeTestCase.php',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseCredentialViewController' => 'applications/passphrase/controller/PassphraseCredentialViewController.php',
|
|
|
|
'PassphraseDAO' => 'applications/passphrase/storage/PassphraseDAO.php',
|
2015-06-22 20:28:33 +02:00
|
|
|
'PassphraseDefaultEditCapability' => 'applications/passphrase/capability/PassphraseDefaultEditCapability.php',
|
|
|
|
'PassphraseDefaultViewCapability' => 'applications/passphrase/capability/PassphraseDefaultViewCapability.php',
|
2015-06-16 22:44:51 +02:00
|
|
|
'PassphraseNoteCredentialType' => 'applications/passphrase/credentialtype/PassphraseNoteCredentialType.php',
|
2015-06-14 06:11:55 +02:00
|
|
|
'PassphrasePasswordCredentialType' => 'applications/passphrase/credentialtype/PassphrasePasswordCredentialType.php',
|
2013-11-23 00:23:10 +01:00
|
|
|
'PassphrasePasswordKey' => 'applications/passphrase/keys/PassphrasePasswordKey.php',
|
2014-08-16 14:41:03 +02:00
|
|
|
'PassphraseQueryConduitAPIMethod' => 'applications/passphrase/conduit/PassphraseQueryConduitAPIMethod.php',
|
2014-06-25 23:58:56 +02:00
|
|
|
'PassphraseRemarkupRule' => 'applications/passphrase/remarkup/PassphraseRemarkupRule.php',
|
2015-06-14 06:11:55 +02:00
|
|
|
'PassphraseSSHGeneratedKeyCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHGeneratedKeyCredentialType.php',
|
2013-11-23 00:23:10 +01:00
|
|
|
'PassphraseSSHKey' => 'applications/passphrase/keys/PassphraseSSHKey.php',
|
2015-06-14 06:11:55 +02:00
|
|
|
'PassphraseSSHPrivateKeyCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHPrivateKeyCredentialType.php',
|
|
|
|
'PassphraseSSHPrivateKeyFileCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHPrivateKeyFileCredentialType.php',
|
|
|
|
'PassphraseSSHPrivateKeyTextCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHPrivateKeyTextCredentialType.php',
|
2014-09-24 22:50:57 +02:00
|
|
|
'PassphraseSchemaSpec' => 'applications/passphrase/storage/PassphraseSchemaSpec.php',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseSecret' => 'applications/passphrase/storage/PassphraseSecret.php',
|
2015-10-15 03:34:55 +02:00
|
|
|
'PassphraseTokenCredentialType' => 'applications/passphrase/credentialtype/PassphraseTokenCredentialType.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PasteConduitAPIMethod' => 'applications/paste/conduit/PasteConduitAPIMethod.php',
|
|
|
|
'PasteCreateConduitAPIMethod' => 'applications/paste/conduit/PasteCreateConduitAPIMethod.php',
|
2013-07-30 22:26:55 +02:00
|
|
|
'PasteCreateMailReceiver' => 'applications/paste/mail/PasteCreateMailReceiver.php',
|
2014-12-31 17:23:47 +01:00
|
|
|
'PasteDefaultEditCapability' => 'applications/paste/capability/PasteDefaultEditCapability.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PasteDefaultViewCapability' => 'applications/paste/capability/PasteDefaultViewCapability.php',
|
2015-11-03 17:45:00 +01:00
|
|
|
'PasteEditConduitAPIMethod' => 'applications/paste/conduit/PasteEditConduitAPIMethod.php',
|
2013-03-13 14:44:27 +01:00
|
|
|
'PasteEmbedView' => 'applications/paste/view/PasteEmbedView.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PasteInfoConduitAPIMethod' => 'applications/paste/conduit/PasteInfoConduitAPIMethod.php',
|
2015-04-01 17:39:21 +02:00
|
|
|
'PasteMailReceiver' => 'applications/paste/mail/PasteMailReceiver.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PasteQueryConduitAPIMethod' => 'applications/paste/conduit/PasteQueryConduitAPIMethod.php',
|
2013-08-06 02:11:46 +02:00
|
|
|
'PasteReplyHandler' => 'applications/paste/mail/PasteReplyHandler.php',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PasteSearchConduitAPIMethod' => 'applications/paste/conduit/PasteSearchConduitAPIMethod.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PeopleBrowseUserDirectoryCapability' => 'applications/people/capability/PeopleBrowseUserDirectoryCapability.php',
|
2015-01-13 00:18:16 +01:00
|
|
|
'PeopleCreateUsersCapability' => 'applications/people/capability/PeopleCreateUsersCapability.php',
|
2016-02-03 17:26:30 +01:00
|
|
|
'PeopleHovercardEngineExtension' => 'applications/people/engineextension/PeopleHovercardEngineExtension.php',
|
2014-02-03 19:51:41 +01:00
|
|
|
'PeopleUserLogGarbageCollector' => 'applications/people/garbagecollector/PeopleUserLogGarbageCollector.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'Phabricator404Controller' => 'applications/base/controller/Phabricator404Controller.php',
|
2013-01-01 23:09:29 +01:00
|
|
|
'PhabricatorAWSConfigOptions' => 'applications/config/option/PhabricatorAWSConfigOptions.php',
|
2013-10-04 04:05:47 +02:00
|
|
|
'PhabricatorAccessControlTestCase' => 'applications/base/controller/__tests__/PhabricatorAccessControlTestCase.php',
|
2013-12-06 02:00:48 +01:00
|
|
|
'PhabricatorAccessLog' => 'infrastructure/log/PhabricatorAccessLog.php',
|
2013-01-01 23:09:17 +01:00
|
|
|
'PhabricatorAccessLogConfigOptions' => 'applications/config/option/PhabricatorAccessLogConfigOptions.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorAccountSettingsPanel' => 'applications/settings/panel/PhabricatorAccountSettingsPanel.php',
|
2012-08-15 19:45:06 +02:00
|
|
|
'PhabricatorActionListView' => 'view/layout/PhabricatorActionListView.php',
|
|
|
|
'PhabricatorActionView' => 'view/layout/PhabricatorActionView.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorActivitySettingsPanel' => 'applications/settings/panel/PhabricatorActivitySettingsPanel.php',
|
2015-11-16 20:26:13 +01:00
|
|
|
'PhabricatorAdministratorsPolicyRule' => 'applications/people/policyrule/PhabricatorAdministratorsPolicyRule.php',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorAjaxRequestExceptionHandler' => 'aphront/handler/PhabricatorAjaxRequestExceptionHandler.php',
|
2014-10-03 14:52:41 +02:00
|
|
|
'PhabricatorAlmanacApplication' => 'applications/almanac/application/PhabricatorAlmanacApplication.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorAmazonAuthProvider' => 'applications/auth/provider/PhabricatorAmazonAuthProvider.php',
|
2012-08-22 00:01:20 +02:00
|
|
|
'PhabricatorAnchorView' => 'view/layout/PhabricatorAnchorView.php',
|
2014-06-05 21:13:44 +02:00
|
|
|
'PhabricatorAphlictManagementDebugWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementDebugWorkflow.php',
|
|
|
|
'PhabricatorAphlictManagementRestartWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementRestartWorkflow.php',
|
|
|
|
'PhabricatorAphlictManagementStartWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementStartWorkflow.php',
|
|
|
|
'PhabricatorAphlictManagementStatusWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementStatusWorkflow.php',
|
|
|
|
'PhabricatorAphlictManagementStopWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementStopWorkflow.php',
|
|
|
|
'PhabricatorAphlictManagementWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementWorkflow.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorAphlictSetupCheck' => 'applications/notification/setup/PhabricatorAphlictSetupCheck.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorAphrontBarUIExample' => 'applications/uiexample/examples/PhabricatorAphrontBarUIExample.php',
|
Provide hasChildren() to replace isEmptyContent()
Summary:
Fixes T3698. Sometimes views need to render differently depending on whether they contain content or not. The existing approach for this is `isEmptyContent()`, which doesn't work well and is sort of hacky (it implies double-rendering content, which is not always free or side-effect free).
Instead, provide a test for an element without children. This test is powerful enough to catch the easy cases of `null`, etc., and just do the expected thing, but will not catch a View which is reduced upon rendering. Since this is rare and we have no actual need for it today, just accept that as a limitation.
Test Plan:
Viewed Timeline and Feed UI examples. Viewed Feed (feed), Pholio (timelineview), and Differential (old transactionview).
{F53915}
Reviewers: chad, btrahan
Reviewed By: chad
CC: aran
Maniphest Tasks: T3698
Differential Revision: https://secure.phabricator.com/D6718
2013-08-12 16:51:01 +02:00
|
|
|
'PhabricatorAphrontViewTestCase' => 'view/__tests__/PhabricatorAphrontViewTestCase.php',
|
2013-10-02 22:13:07 +02:00
|
|
|
'PhabricatorAppSearchEngine' => 'applications/meta/query/PhabricatorAppSearchEngine.php',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorApplication' => 'applications/base/PhabricatorApplication.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorApplicationApplicationPHIDType' => 'applications/meta/phid/PhabricatorApplicationApplicationPHIDType.php',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorApplicationConfigOptions' => 'applications/config/option/PhabricatorApplicationConfigOptions.php',
|
2015-03-12 21:28:37 +01:00
|
|
|
'PhabricatorApplicationConfigurationPanel' => 'applications/meta/panel/PhabricatorApplicationConfigurationPanel.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorApplicationConfigurationPanelTestCase' => 'applications/meta/panel/__tests__/PhabricatorApplicationConfigurationPanelTestCase.php',
|
2014-07-18 00:48:36 +02:00
|
|
|
'PhabricatorApplicationDatasource' => 'applications/meta/typeahead/PhabricatorApplicationDatasource.php',
|
2013-01-24 21:13:31 +01:00
|
|
|
'PhabricatorApplicationDetailViewController' => 'applications/meta/controller/PhabricatorApplicationDetailViewController.php',
|
2013-10-03 21:40:08 +02:00
|
|
|
'PhabricatorApplicationEditController' => 'applications/meta/controller/PhabricatorApplicationEditController.php',
|
2015-11-03 14:38:06 +01:00
|
|
|
'PhabricatorApplicationEditHTTPParameterHelpView' => 'applications/transactions/view/PhabricatorApplicationEditHTTPParameterHelpView.php',
|
2015-04-01 16:36:16 +02:00
|
|
|
'PhabricatorApplicationEmailCommandsController' => 'applications/meta/controller/PhabricatorApplicationEmailCommandsController.php',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationLaunchView' => 'applications/meta/view/PhabricatorApplicationLaunchView.php',
|
2015-03-12 21:28:37 +01:00
|
|
|
'PhabricatorApplicationPanelController' => 'applications/meta/controller/PhabricatorApplicationPanelController.php',
|
2013-10-02 22:13:07 +02:00
|
|
|
'PhabricatorApplicationQuery' => 'applications/meta/query/PhabricatorApplicationQuery.php',
|
2013-05-30 23:09:02 +02:00
|
|
|
'PhabricatorApplicationSearchController' => 'applications/search/controller/PhabricatorApplicationSearchController.php',
|
2013-04-14 15:53:20 +02:00
|
|
|
'PhabricatorApplicationSearchEngine' => 'applications/search/engine/PhabricatorApplicationSearchEngine.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorApplicationSearchEngineTestCase' => 'applications/search/engine/__tests__/PhabricatorApplicationSearchEngineTestCase.php',
|
2015-06-19 12:46:20 +02:00
|
|
|
'PhabricatorApplicationSearchResultView' => 'applications/search/view/PhabricatorApplicationSearchResultView.php',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationStatusView' => 'applications/meta/view/PhabricatorApplicationStatusView.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorApplicationTestCase' => 'applications/base/__tests__/PhabricatorApplicationTestCase.php',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransaction' => 'applications/transactions/storage/PhabricatorApplicationTransaction.php',
|
|
|
|
'PhabricatorApplicationTransactionComment' => 'applications/transactions/storage/PhabricatorApplicationTransactionComment.php',
|
2012-12-11 23:01:51 +01:00
|
|
|
'PhabricatorApplicationTransactionCommentEditController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionCommentEditor' => 'applications/transactions/editor/PhabricatorApplicationTransactionCommentEditor.php',
|
2012-12-11 23:01:51 +01:00
|
|
|
'PhabricatorApplicationTransactionCommentHistoryController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentHistoryController.php',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionCommentQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionCommentQuery.php',
|
2014-05-05 19:55:58 +02:00
|
|
|
'PhabricatorApplicationTransactionCommentQuoteController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentQuoteController.php',
|
2014-08-08 00:21:32 +02:00
|
|
|
'PhabricatorApplicationTransactionCommentRawController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentRawController.php',
|
2014-05-05 19:55:32 +02:00
|
|
|
'PhabricatorApplicationTransactionCommentRemoveController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentRemoveController.php',
|
2012-12-21 14:51:33 +01:00
|
|
|
'PhabricatorApplicationTransactionCommentView' => 'applications/transactions/view/PhabricatorApplicationTransactionCommentView.php',
|
2012-12-11 23:01:51 +01:00
|
|
|
'PhabricatorApplicationTransactionController' => 'applications/transactions/controller/PhabricatorApplicationTransactionController.php',
|
2013-08-23 01:45:14 +02:00
|
|
|
'PhabricatorApplicationTransactionDetailController' => 'applications/transactions/controller/PhabricatorApplicationTransactionDetailController.php',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionEditor' => 'applications/transactions/editor/PhabricatorApplicationTransactionEditor.php',
|
2012-12-11 23:00:21 +01:00
|
|
|
'PhabricatorApplicationTransactionFeedStory' => 'applications/transactions/feed/PhabricatorApplicationTransactionFeedStory.php',
|
2013-02-17 15:37:09 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface' => 'applications/transactions/interface/PhabricatorApplicationTransactionInterface.php',
|
Add ApplicationTransaction handling for transactions with no effect
Summary:
When a user submits an action with no effect (like an empty comment, an "abandon" on an already-accepted revision, or a "close, resolved" on a closed task) we want to alert them that their action isn't effective. These warnings fall into two general buckets:
- User is submitting two or more actions, and some aren't effective but some are. Prompt them to apply the effective actions only.
- A special case of this is where the only effective action is a comment. We provide tailored text ("Post Comment") in this case.
- User is submitting one action, which isn't effective. Tell them they're out of luck.
- A special case of this is an empty comment. We provide tailored text in this case.
By default, the transaction editor throws when transactions have no effect. The caller can then deal with this, or use `PhabricatorApplicationTransactionNoEffectResponse` to provide a standard dialog that gives the user information as above. For cases where we expect transactions to have no effect (notably, "edit" forms) we just continue on no-effect unconditionally.
Also fix an issue where new, combined or filtered transactions would not be represented properly in the Ajax response (i.e., return final transactions from `applyTransactions()`), and translate some strings.
Test Plan:
- Submitted empty and nonempy comments in Macro and Pholio.
- Submitted comments with new and existing "@mentions".
- Submitted edits in both applications.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T912, T2104
Differential Revision: https://secure.phabricator.com/D4160
2012-12-12 02:27:40 +01:00
|
|
|
'PhabricatorApplicationTransactionNoEffectException' => 'applications/transactions/exception/PhabricatorApplicationTransactionNoEffectException.php',
|
|
|
|
'PhabricatorApplicationTransactionNoEffectResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionNoEffectResponse.php',
|
2015-06-02 02:16:27 +02:00
|
|
|
'PhabricatorApplicationTransactionPublishWorker' => 'applications/transactions/worker/PhabricatorApplicationTransactionPublishWorker.php',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionQuery.php',
|
2015-12-22 20:32:07 +01:00
|
|
|
'PhabricatorApplicationTransactionRemarkupPreviewController' => 'applications/transactions/controller/PhabricatorApplicationTransactionRemarkupPreviewController.php',
|
2015-04-01 17:39:21 +02:00
|
|
|
'PhabricatorApplicationTransactionReplyHandler' => 'applications/transactions/replyhandler/PhabricatorApplicationTransactionReplyHandler.php',
|
2012-12-11 23:02:29 +01:00
|
|
|
'PhabricatorApplicationTransactionResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionResponse.php',
|
2014-12-02 22:10:29 +01:00
|
|
|
'PhabricatorApplicationTransactionShowOlderController' => 'applications/transactions/controller/PhabricatorApplicationTransactionShowOlderController.php',
|
2014-03-05 19:44:21 +01:00
|
|
|
'PhabricatorApplicationTransactionStructureException' => 'applications/transactions/exception/PhabricatorApplicationTransactionStructureException.php',
|
2015-03-09 20:15:54 +01:00
|
|
|
'PhabricatorApplicationTransactionTemplatedCommentQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionTemplatedCommentQuery.php',
|
2013-02-17 15:37:02 +01:00
|
|
|
'PhabricatorApplicationTransactionTextDiffDetailView' => 'applications/transactions/view/PhabricatorApplicationTransactionTextDiffDetailView.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorApplicationTransactionTransactionPHIDType' => 'applications/transactions/phid/PhabricatorApplicationTransactionTransactionPHIDType.php',
|
2013-09-19 00:31:58 +02:00
|
|
|
'PhabricatorApplicationTransactionValidationError' => 'applications/transactions/error/PhabricatorApplicationTransactionValidationError.php',
|
|
|
|
'PhabricatorApplicationTransactionValidationException' => 'applications/transactions/exception/PhabricatorApplicationTransactionValidationException.php',
|
2015-01-20 22:59:17 +01:00
|
|
|
'PhabricatorApplicationTransactionValidationResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionValidationResponse.php',
|
2014-04-29 18:42:54 +02:00
|
|
|
'PhabricatorApplicationTransactionValueController' => 'applications/transactions/controller/PhabricatorApplicationTransactionValueController.php',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorApplicationTransactionView' => 'applications/transactions/view/PhabricatorApplicationTransactionView.php',
|
2013-01-29 18:14:03 +01:00
|
|
|
'PhabricatorApplicationUninstallController' => 'applications/meta/controller/PhabricatorApplicationUninstallController.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorApplicationsApplication' => 'applications/meta/application/PhabricatorApplicationsApplication.php',
|
2013-01-19 22:46:48 +01:00
|
|
|
'PhabricatorApplicationsController' => 'applications/meta/controller/PhabricatorApplicationsController.php',
|
|
|
|
'PhabricatorApplicationsListController' => 'applications/meta/controller/PhabricatorApplicationsListController.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorAsanaAuthProvider' => 'applications/auth/provider/PhabricatorAsanaAuthProvider.php',
|
Initial Asana sync for Differential
Summary:
Ref T2852. This is highly incomplete but seems structurally sound. Some additional context is available in the Google doc.
- Add a workspace ID configuration. Without it, nothing else activates.
- Add a worker which reacts to feed stories.
- Feed stories about things which aren't Differential objects are ignored.
- We load the revision, or fail permanently if we can't.
- We get all the related user PHIDs (author, reviewers, CCs).
- We check if any of them have linked Asana accounts, or fail permanently if they don't.
- We check for an "ASANATASK" edge from the revision.
- If we do not find one, we create a new task.
- If we do find one, we load the task.
- If we succeed, we check the chronological key of the most recent synchronized feed story ("cursor").
- If this story is the same or newer, we update the task to synchronize it to the current state of the revision.
- If we fail to load the task, we fail permanently ("asana task has been deleted").
- We then publish the actual story text to the task.
Not in yet:
- Updating followers requires separate API calls which we don't do yet.
- No subtasks yet.
- No sync of open/closed state.
Test Plan: {F47546}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2852
Differential Revision: https://secure.phabricator.com/D6302
2013-06-26 01:33:16 +02:00
|
|
|
'PhabricatorAsanaConfigOptions' => 'applications/doorkeeper/option/PhabricatorAsanaConfigOptions.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorAsanaSubtaskHasObjectEdgeType' => 'applications/doorkeeper/edge/PhabricatorAsanaSubtaskHasObjectEdgeType.php',
|
|
|
|
'PhabricatorAsanaTaskHasObjectEdgeType' => 'applications/doorkeeper/edge/PhabricatorAsanaTaskHasObjectEdgeType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorAuditActionConstants' => 'applications/audit/constants/PhabricatorAuditActionConstants.php',
|
|
|
|
'PhabricatorAuditAddCommentController' => 'applications/audit/controller/PhabricatorAuditAddCommentController.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorAuditApplication' => 'applications/audit/application/PhabricatorAuditApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorAuditCommentEditor' => 'applications/audit/editor/PhabricatorAuditCommentEditor.php',
|
|
|
|
'PhabricatorAuditCommitStatusConstants' => 'applications/audit/constants/PhabricatorAuditCommitStatusConstants.php',
|
|
|
|
'PhabricatorAuditController' => 'applications/audit/controller/PhabricatorAuditController.php',
|
2014-08-02 09:06:25 +02:00
|
|
|
'PhabricatorAuditEditor' => 'applications/audit/editor/PhabricatorAuditEditor.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorAuditInlineComment' => 'applications/audit/storage/PhabricatorAuditInlineComment.php',
|
|
|
|
'PhabricatorAuditListController' => 'applications/audit/controller/PhabricatorAuditListController.php',
|
|
|
|
'PhabricatorAuditListView' => 'applications/audit/view/PhabricatorAuditListView.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorAuditMailReceiver' => 'applications/audit/mail/PhabricatorAuditMailReceiver.php',
|
2013-08-05 19:35:01 +02:00
|
|
|
'PhabricatorAuditManagementDeleteWorkflow' => 'applications/audit/management/PhabricatorAuditManagementDeleteWorkflow.php',
|
|
|
|
'PhabricatorAuditManagementWorkflow' => 'applications/audit/management/PhabricatorAuditManagementWorkflow.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorAuditPreviewController' => 'applications/audit/controller/PhabricatorAuditPreviewController.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorAuditReplyHandler' => 'applications/audit/mail/PhabricatorAuditReplyHandler.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorAuditStatusConstants' => 'applications/audit/constants/PhabricatorAuditStatusConstants.php',
|
2014-07-25 02:59:43 +02:00
|
|
|
'PhabricatorAuditTransaction' => 'applications/audit/storage/PhabricatorAuditTransaction.php',
|
|
|
|
'PhabricatorAuditTransactionComment' => 'applications/audit/storage/PhabricatorAuditTransactionComment.php',
|
|
|
|
'PhabricatorAuditTransactionQuery' => 'applications/audit/query/PhabricatorAuditTransactionQuery.php',
|
2014-07-29 00:01:43 +02:00
|
|
|
'PhabricatorAuditTransactionView' => 'applications/audit/view/PhabricatorAuditTransactionView.php',
|
2013-06-17 16:08:50 +02:00
|
|
|
'PhabricatorAuthAccountView' => 'applications/auth/view/PhabricatorAuthAccountView.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorAuthApplication' => 'applications/auth/application/PhabricatorAuthApplication.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorAuthAuthFactorPHIDType' => 'applications/auth/phid/PhabricatorAuthAuthFactorPHIDType.php',
|
Transactions - deploy buildTransactionTimeline against a few more applications
Summary:
Ref T4712. Thus far, it seems that most "non-standard" things can be done pretty easily in the controller. Aside from deploying, this diff had to fix a few bugs / missing implementations of stuff.
(Notably, PhabricatorAuthProviderConfig, HeraldRule, PhabricatorSlowvotePoll, and AlmanacNetwork needed to implement PhabricatorApplicationTransactionInterface, PhabricatorAuthAuthProviderPHIDType had to be added, and a rendering bug in transactions of type PhabricatorOAuth2AuthProvider had to be fixed.)
Test Plan: Almanac - looked at binding, device, network, and service view controllers and verified timeline displayed properly. Herald - looked at a rule and verified timeline. Slowvote - looked at a vote and verified timeline. Auth - looked at an auth provider (Facebook) and verified proper display of transactions within timeline.
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10921
2014-12-02 23:33:59 +01:00
|
|
|
'PhabricatorAuthAuthProviderPHIDType' => 'applications/auth/phid/PhabricatorAuthAuthProviderPHIDType.php',
|
2015-02-11 00:44:21 +01:00
|
|
|
'PhabricatorAuthConduitAPIMethod' => 'applications/auth/conduit/PhabricatorAuthConduitAPIMethod.php',
|
2013-06-17 15:12:45 +02:00
|
|
|
'PhabricatorAuthConfirmLinkController' => 'applications/auth/controller/PhabricatorAuthConfirmLinkController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorAuthController' => 'applications/auth/controller/PhabricatorAuthController.php',
|
2013-06-17 19:48:41 +02:00
|
|
|
'PhabricatorAuthDAO' => 'applications/auth/storage/PhabricatorAuthDAO.php',
|
2013-06-17 19:54:08 +02:00
|
|
|
'PhabricatorAuthDisableController' => 'applications/auth/controller/config/PhabricatorAuthDisableController.php',
|
2014-04-28 02:31:11 +02:00
|
|
|
'PhabricatorAuthDowngradeSessionController' => 'applications/auth/controller/PhabricatorAuthDowngradeSessionController.php',
|
2013-06-17 19:52:38 +02:00
|
|
|
'PhabricatorAuthEditController' => 'applications/auth/controller/config/PhabricatorAuthEditController.php',
|
2014-04-28 18:27:11 +02:00
|
|
|
'PhabricatorAuthFactor' => 'applications/auth/factor/PhabricatorAuthFactor.php',
|
|
|
|
'PhabricatorAuthFactorConfig' => 'applications/auth/storage/PhabricatorAuthFactorConfig.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorAuthFactorTestCase' => 'applications/auth/factor/__tests__/PhabricatorAuthFactorTestCase.php',
|
2014-05-01 19:23:02 +02:00
|
|
|
'PhabricatorAuthFinishController' => 'applications/auth/controller/PhabricatorAuthFinishController.php',
|
2014-04-28 02:31:11 +02:00
|
|
|
'PhabricatorAuthHighSecurityRequiredException' => 'applications/auth/exception/PhabricatorAuthHighSecurityRequiredException.php',
|
|
|
|
'PhabricatorAuthHighSecurityToken' => 'applications/auth/data/PhabricatorAuthHighSecurityToken.php',
|
Add email invites to Phabricator (logic only)
Summary:
Ref T7152. This builds the core of email invites and implements all the hard logic for them, covering it with a pile of tests.
There's no UI to create these yet, so users can't actually get invites (and administrators can't send them).
This stuff is a complicated mess because there are so many interactions between accounts, email addresses, email verification, email primary-ness, and user verification. However, I think I got it right and got test coverage everwhere.
The degree to which this is exception-driven is a little icky, but I think it's a reasonable way to get the testability we want while still making it hard for callers to get the flow wrong. In particular, I expect there to be at least two callers (one invite flow in the upstream, and one derived invite flow in Instances) so I believe there is merit in burying as much of this logic inside the Engine as is reasonably possible.
Test Plan: Unit tests only.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T7152
Differential Revision: https://secure.phabricator.com/D11723
2015-02-10 01:12:36 +01:00
|
|
|
'PhabricatorAuthInvite' => 'applications/auth/storage/PhabricatorAuthInvite.php',
|
|
|
|
'PhabricatorAuthInviteAccountException' => 'applications/auth/exception/PhabricatorAuthInviteAccountException.php',
|
2015-02-11 15:05:53 +01:00
|
|
|
'PhabricatorAuthInviteAction' => 'applications/auth/data/PhabricatorAuthInviteAction.php',
|
|
|
|
'PhabricatorAuthInviteActionTableView' => 'applications/auth/view/PhabricatorAuthInviteActionTableView.php',
|
Add email invites to Phabricator (logic only)
Summary:
Ref T7152. This builds the core of email invites and implements all the hard logic for them, covering it with a pile of tests.
There's no UI to create these yet, so users can't actually get invites (and administrators can't send them).
This stuff is a complicated mess because there are so many interactions between accounts, email addresses, email verification, email primary-ness, and user verification. However, I think I got it right and got test coverage everwhere.
The degree to which this is exception-driven is a little icky, but I think it's a reasonable way to get the testability we want while still making it hard for callers to get the flow wrong. In particular, I expect there to be at least two callers (one invite flow in the upstream, and one derived invite flow in Instances) so I believe there is merit in burying as much of this logic inside the Engine as is reasonably possible.
Test Plan: Unit tests only.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T7152
Differential Revision: https://secure.phabricator.com/D11723
2015-02-10 01:12:36 +01:00
|
|
|
'PhabricatorAuthInviteController' => 'applications/auth/controller/PhabricatorAuthInviteController.php',
|
|
|
|
'PhabricatorAuthInviteDialogException' => 'applications/auth/exception/PhabricatorAuthInviteDialogException.php',
|
|
|
|
'PhabricatorAuthInviteEngine' => 'applications/auth/engine/PhabricatorAuthInviteEngine.php',
|
|
|
|
'PhabricatorAuthInviteException' => 'applications/auth/exception/PhabricatorAuthInviteException.php',
|
|
|
|
'PhabricatorAuthInviteInvalidException' => 'applications/auth/exception/PhabricatorAuthInviteInvalidException.php',
|
|
|
|
'PhabricatorAuthInviteLoginException' => 'applications/auth/exception/PhabricatorAuthInviteLoginException.php',
|
2015-02-11 15:05:53 +01:00
|
|
|
'PhabricatorAuthInvitePHIDType' => 'applications/auth/phid/PhabricatorAuthInvitePHIDType.php',
|
|
|
|
'PhabricatorAuthInviteQuery' => 'applications/auth/query/PhabricatorAuthInviteQuery.php',
|
Add email invites to Phabricator (logic only)
Summary:
Ref T7152. This builds the core of email invites and implements all the hard logic for them, covering it with a pile of tests.
There's no UI to create these yet, so users can't actually get invites (and administrators can't send them).
This stuff is a complicated mess because there are so many interactions between accounts, email addresses, email verification, email primary-ness, and user verification. However, I think I got it right and got test coverage everwhere.
The degree to which this is exception-driven is a little icky, but I think it's a reasonable way to get the testability we want while still making it hard for callers to get the flow wrong. In particular, I expect there to be at least two callers (one invite flow in the upstream, and one derived invite flow in Instances) so I believe there is merit in burying as much of this logic inside the Engine as is reasonably possible.
Test Plan: Unit tests only.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T7152
Differential Revision: https://secure.phabricator.com/D11723
2015-02-10 01:12:36 +01:00
|
|
|
'PhabricatorAuthInviteRegisteredException' => 'applications/auth/exception/PhabricatorAuthInviteRegisteredException.php',
|
2015-02-11 15:05:53 +01:00
|
|
|
'PhabricatorAuthInviteSearchEngine' => 'applications/auth/query/PhabricatorAuthInviteSearchEngine.php',
|
Add email invites to Phabricator (logic only)
Summary:
Ref T7152. This builds the core of email invites and implements all the hard logic for them, covering it with a pile of tests.
There's no UI to create these yet, so users can't actually get invites (and administrators can't send them).
This stuff is a complicated mess because there are so many interactions between accounts, email addresses, email verification, email primary-ness, and user verification. However, I think I got it right and got test coverage everwhere.
The degree to which this is exception-driven is a little icky, but I think it's a reasonable way to get the testability we want while still making it hard for callers to get the flow wrong. In particular, I expect there to be at least two callers (one invite flow in the upstream, and one derived invite flow in Instances) so I believe there is merit in burying as much of this logic inside the Engine as is reasonably possible.
Test Plan: Unit tests only.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T7152
Differential Revision: https://secure.phabricator.com/D11723
2015-02-10 01:12:36 +01:00
|
|
|
'PhabricatorAuthInviteTestCase' => 'applications/auth/factor/__tests__/PhabricatorAuthInviteTestCase.php',
|
|
|
|
'PhabricatorAuthInviteVerifyException' => 'applications/auth/exception/PhabricatorAuthInviteVerifyException.php',
|
2015-02-11 15:06:09 +01:00
|
|
|
'PhabricatorAuthInviteWorker' => 'applications/auth/worker/PhabricatorAuthInviteWorker.php',
|
2013-06-17 15:12:45 +02:00
|
|
|
'PhabricatorAuthLinkController' => 'applications/auth/controller/PhabricatorAuthLinkController.php',
|
2013-06-17 19:50:43 +02:00
|
|
|
'PhabricatorAuthListController' => 'applications/auth/controller/config/PhabricatorAuthListController.php',
|
2013-06-16 19:14:07 +02:00
|
|
|
'PhabricatorAuthLoginController' => 'applications/auth/controller/PhabricatorAuthLoginController.php',
|
2015-09-04 19:34:39 +02:00
|
|
|
'PhabricatorAuthLoginHandler' => 'applications/auth/handler/PhabricatorAuthLoginHandler.php',
|
Implement "auth.logout" Conduit API method
Summary:
Ref T7303. Ref T7673. This implements an "auth.logout" which:
- terminates all web sessions;
- terminates the current OAuth token if called via OAuth; and
- may always be called via OAuth.
(Since it consumes an OAuth token, even a "malicious" OAuth application can't really be that much of a jerk with this: it can't continuously log you out, since calling the method once kills the token. The application would need to ask your permission again to get a fresh token.)
The primary goal here is to let Phacility instances call this against the Phacility upstream, so that when you log out of an instance it also logs you out of your Phacility account (possibly with a checkbox or something).
This also smooths over the session token code. Before this change, your sessions would get logged out but when you reloaded we'd tell you your session was invalid.
Instead, try to clear the invalid session before telling the user there's an issue. I think that ssentially 100% of invalid sessions are a result of something in this vein (e.g., forced logout via Settings) nowadays, since the session code is generally stable and sane and has been for a long time.
Test Plan:
- Called `auth.logout` via console, got a reasonable logout experience.
- Called `auth.logout` via OAuth.
- Tried to make another call, verified OAuth token had been invalidated.
- Verified web session had been invalidated.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T7303, T7673
Differential Revision: https://secure.phabricator.com/D15594
2016-04-03 18:06:26 +02:00
|
|
|
'PhabricatorAuthLogoutConduitAPIMethod' => 'applications/auth/conduit/PhabricatorAuthLogoutConduitAPIMethod.php',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PhabricatorAuthMainMenuBarExtension' => 'applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php',
|
Work around lack of PKCS8 support in OSX ssh-keygen
Summary:
Ref T4209. Ref T6240. Ref T6238. See D10401 for original discussion.
On OSX, `ssh-keygen` doesn't support PKCS8:
- When we hit an issue with this, raise a more tailored message about it.
- Allow the user to work around the problem with `auth cache-pkcs8 ...`, providing reasonable guidance / warnings.
In practice, this only really matters very much for one key, which I'm just going to make the services extension cache automatically. So it's sort of moot, but good to have around for weird cases and to make testing easier.
Test Plan: Hit error, cached key, got clean asymmetric auth.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T4209, T6240, T6238
Differential Revision: https://secure.phabricator.com/D11021
2014-12-20 01:36:40 +01:00
|
|
|
'PhabricatorAuthManagementCachePKCS8Workflow' => 'applications/auth/management/PhabricatorAuthManagementCachePKCS8Workflow.php',
|
2013-06-17 22:26:25 +02:00
|
|
|
'PhabricatorAuthManagementLDAPWorkflow' => 'applications/auth/management/PhabricatorAuthManagementLDAPWorkflow.php',
|
2014-04-30 23:30:00 +02:00
|
|
|
'PhabricatorAuthManagementListFactorsWorkflow' => 'applications/auth/management/PhabricatorAuthManagementListFactorsWorkflow.php',
|
2013-06-17 19:55:05 +02:00
|
|
|
'PhabricatorAuthManagementRecoverWorkflow' => 'applications/auth/management/PhabricatorAuthManagementRecoverWorkflow.php',
|
2013-06-25 00:55:41 +02:00
|
|
|
'PhabricatorAuthManagementRefreshWorkflow' => 'applications/auth/management/PhabricatorAuthManagementRefreshWorkflow.php',
|
2014-04-30 23:30:00 +02:00
|
|
|
'PhabricatorAuthManagementStripWorkflow' => 'applications/auth/management/PhabricatorAuthManagementStripWorkflow.php',
|
2015-02-09 23:23:49 +01:00
|
|
|
'PhabricatorAuthManagementTrustOAuthClientWorkflow' => 'applications/auth/management/PhabricatorAuthManagementTrustOAuthClientWorkflow.php',
|
2015-09-14 16:03:39 +02:00
|
|
|
'PhabricatorAuthManagementUnlimitWorkflow' => 'applications/auth/management/PhabricatorAuthManagementUnlimitWorkflow.php',
|
2015-02-09 23:23:49 +01:00
|
|
|
'PhabricatorAuthManagementUntrustOAuthClientWorkflow' => 'applications/auth/management/PhabricatorAuthManagementUntrustOAuthClientWorkflow.php',
|
2015-02-11 23:39:06 +01:00
|
|
|
'PhabricatorAuthManagementVerifyWorkflow' => 'applications/auth/management/PhabricatorAuthManagementVerifyWorkflow.php',
|
2013-06-17 19:55:05 +02:00
|
|
|
'PhabricatorAuthManagementWorkflow' => 'applications/auth/management/PhabricatorAuthManagementWorkflow.php',
|
2013-11-13 20:24:18 +01:00
|
|
|
'PhabricatorAuthNeedsApprovalController' => 'applications/auth/controller/PhabricatorAuthNeedsApprovalController.php',
|
2014-06-04 01:50:27 +02:00
|
|
|
'PhabricatorAuthNeedsMultiFactorController' => 'applications/auth/controller/PhabricatorAuthNeedsMultiFactorController.php',
|
2013-06-17 19:51:35 +02:00
|
|
|
'PhabricatorAuthNewController' => 'applications/auth/controller/config/PhabricatorAuthNewController.php',
|
2013-06-19 10:33:27 +02:00
|
|
|
'PhabricatorAuthOldOAuthRedirectController' => 'applications/auth/controller/PhabricatorAuthOldOAuthRedirectController.php',
|
Make password reset emails use one-time tokens
Summary:
Ref T4398. This code hadn't been touched in a while and had a few crufty bits.
**One Time Resets**: Currently, password reset (and similar links) are valid for about 48 hours, but we always use one token to generate them (it's bound to the account). This isn't horrible, but it could be better, and it produces a lot of false positives on HackerOne.
Instead, use TemporaryTokens to make each link one-time only and good for no more than 24 hours.
**Coupling of Email Verification and One-Time Login**: Currently, one-time login links ("password reset links") are tightly bound to an email address, and using a link verifies that email address.
This is convenient for "Welcome" emails, so the user doesn't need to go through two rounds of checking email in order to login, then very their email, then actually get access to Phabricator.
However, for other types of these links (like those generated by `bin/auth recover`) there's no need to do any email verification.
Instead, make the email verification part optional, and use it on welcome links but not other types of links.
**Message Customization**: These links can come out of several workflows: welcome, password reset, username change, or `bin/auth recover`. Add a hint to the URI so the text on the page can be customized a bit to help users through the workflow.
**Reset Emails Going to Main Account Email**: Previously, we would send password reset email to the user's primary account email. However, since we verify email coming from reset links this isn't correct and could allow a user to verify an email without actually controlling it.
Since the user needs a real account in the first place this does not seem useful on its own, but might be a component in some other attack. The user might also no longer have access to their primary account, in which case this wouldn't be wrong, but would not be very useful.
Mitigate this in two ways:
- First, send to the actual email address the user entered, not the primary account email address.
- Second, don't let these links verify emails: they're just login links. This primarily makes it more difficult for an attacker to add someone else's email to their account, send them a reset link, get them to login and implicitly verify the email by not reading very carefully, and then figure out something interesting to do (there's currently no followup attack here, but allowing this does seem undesirable).
**Password Reset Without Old Password**: After a user logs in via email, we send them to the password settings panel (if passwords are enabled) with a code that lets them set a new password without knowing the old one.
Previously, this code was static and based on the email address. Instead, issue a one-time code.
**Jump Into Hisec**: Normally, when a user who has multi-factor auth on their account logs in, we prompt them for factors but don't put them in high security. You usually don't want to go do high-security stuff immediately after login, and it would be confusing and annoying if normal logins gave you a "YOU ARE IN HIGH SECURITY" alert bubble.
However, if we're taking you to the password reset screen, we //do// want to put the user in high security, since that screen requires high security. If we don't do this, the user gets two factor prompts in a row.
To accomplish this, we set a cookie when we know we're sending the user into a high security workflow. This cookie makes login finalization upgrade all the way from "partial" to "high security", instead of stopping halfway at "normal". This is safe because the user has just passed a factor check; the only reason we don't normally do this is to reduce annoyance.
**Some UI Cleanup**: Some of this was using really old UI. Modernize it a bit.
Test Plan:
- **One Time Resets**
- Used a reset link.
- Tried to reuse a reset link, got denied.
- Verified each link is different.
- **Coupling of Email Verification and One-Time Login**
- Verified that `bin/auth`, password reset, and username change links do not have an email verifying URI component.
- Tried to tack one on, got denied.
- Used the welcome email link to login + verify.
- Tried to mutate the URI to not verify, or verify something else: got denied.
- **Message Customization**
- Viewed messages on the different workflows. They seemed OK.
- **Reset Emails Going to Main Account Email**
- Sent password reset email to non-primary email.
- Received email at specified address.
- Verified it does not verify the address.
- **Password Reset Without Old Password**
- Reset password without knowledge of old one after email reset.
- Tried to do that without a key, got denied.
- Tried to reuse a key, got denied.
- **Jump Into Hisec**
- Logged in with MFA user, got factor'd, jumped directly into hisec.
- Logged in with non-MFA user, no factors, normal password reset.
- **Some UI Cleanup**
- Viewed new UI.
- **Misc**
- Created accounts, logged in with welcome link, got verified.
- Changed a username, used link to log back in.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T4398
Differential Revision: https://secure.phabricator.com/D9252
2014-05-22 19:41:00 +02:00
|
|
|
'PhabricatorAuthOneTimeLoginController' => 'applications/auth/controller/PhabricatorAuthOneTimeLoginController.php',
|
2016-03-16 13:17:41 +01:00
|
|
|
'PhabricatorAuthOneTimeLoginTemporaryTokenType' => 'applications/auth/tokentype/PhabricatorAuthOneTimeLoginTemporaryTokenType.php',
|
|
|
|
'PhabricatorAuthPasswordResetTemporaryTokenType' => 'applications/auth/tokentype/PhabricatorAuthPasswordResetTemporaryTokenType.php',
|
2013-06-16 19:14:07 +02:00
|
|
|
'PhabricatorAuthProvider' => 'applications/auth/provider/PhabricatorAuthProvider.php',
|
2013-06-17 19:48:41 +02:00
|
|
|
'PhabricatorAuthProviderConfig' => 'applications/auth/storage/PhabricatorAuthProviderConfig.php',
|
2013-06-17 19:50:43 +02:00
|
|
|
'PhabricatorAuthProviderConfigController' => 'applications/auth/controller/config/PhabricatorAuthProviderConfigController.php',
|
2013-06-17 19:52:38 +02:00
|
|
|
'PhabricatorAuthProviderConfigEditor' => 'applications/auth/editor/PhabricatorAuthProviderConfigEditor.php',
|
2013-06-17 19:49:18 +02:00
|
|
|
'PhabricatorAuthProviderConfigQuery' => 'applications/auth/query/PhabricatorAuthProviderConfigQuery.php',
|
2013-06-17 19:48:41 +02:00
|
|
|
'PhabricatorAuthProviderConfigTransaction' => 'applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php',
|
2013-06-17 19:49:18 +02:00
|
|
|
'PhabricatorAuthProviderConfigTransactionQuery' => 'applications/auth/query/PhabricatorAuthProviderConfigTransactionQuery.php',
|
2015-02-11 00:44:21 +01:00
|
|
|
'PhabricatorAuthQueryPublicKeysConduitAPIMethod' => 'applications/auth/conduit/PhabricatorAuthQueryPublicKeysConduitAPIMethod.php',
|
New Registration Workflow
Summary:
Currently, registration and authentication are pretty messy. Two concrete problems:
- The `PhabricatorLDAPRegistrationController` and `PhabricatorOAuthDefaultRegistrationController` controllers are giant copy/pastes of one another. This is really bad.
- We can't practically implement OpenID because we can't reissue the authentication request.
Additionally, the OAuth registration controller can be replaced wholesale by config, which is a huge API surface area and a giant mess.
Broadly, the problem right now is that registration does too much: we hand it some set of indirect credentials (like OAuth tokens) and expect it to take those the entire way to a registered user. Instead, break registration into smaller steps:
- User authenticates with remote service.
- Phabricator pulls information (remote account ID, username, email, real name, profile picture, etc) from the remote service and saves it as `PhabricatorUserCredentials`.
- Phabricator hands the `PhabricatorUserCredentials` to the registration form, which is agnostic about where they originate from: it can process LDAP credentials, OAuth credentials, plain old email credentials, HTTP basic auth credentials, etc.
This doesn't do anything yet -- there is no way to create credentials objects (and no storage patch), but I wanted to get any initial feedback, especially about the event call for T2394. In particular, I think the implementation would look something like this:
$profile = $event->getValue('profile')
$username = $profile->getDefaultUsername();
$is_employee = is_this_a_facebook_employee($username);
if (!$is_employee) {
throw new Exception("You are not employed at Facebook.");
}
$fbid = get_fbid_for_facebook_username($username);
$profile->setDefaultEmail($fbid);
$profile->setCanEditUsername(false);
$profile->setCanEditEmail(false);
$profile->setCanEditRealName(false);
$profile->setShouldVerifyEmail(true);
Seem reasonable?
Test Plan: N/A yet, probably fatals.
Reviewers: vrana, btrahan, codeblock, chad
Reviewed By: btrahan
CC: aran, asherkin, nh, wez
Maniphest Tasks: T1536, T2394
Differential Revision: https://secure.phabricator.com/D4647
2013-06-16 19:13:49 +02:00
|
|
|
'PhabricatorAuthRegisterController' => 'applications/auth/controller/PhabricatorAuthRegisterController.php',
|
2014-08-04 21:04:13 +02:00
|
|
|
'PhabricatorAuthRevokeTokenController' => 'applications/auth/controller/PhabricatorAuthRevokeTokenController.php',
|
2014-11-06 21:37:22 +01:00
|
|
|
'PhabricatorAuthSSHKey' => 'applications/auth/storage/PhabricatorAuthSSHKey.php',
|
2014-11-11 17:18:26 +01:00
|
|
|
'PhabricatorAuthSSHKeyController' => 'applications/auth/controller/PhabricatorAuthSSHKeyController.php',
|
|
|
|
'PhabricatorAuthSSHKeyDeleteController' => 'applications/auth/controller/PhabricatorAuthSSHKeyDeleteController.php',
|
|
|
|
'PhabricatorAuthSSHKeyEditController' => 'applications/auth/controller/PhabricatorAuthSSHKeyEditController.php',
|
|
|
|
'PhabricatorAuthSSHKeyGenerateController' => 'applications/auth/controller/PhabricatorAuthSSHKeyGenerateController.php',
|
2015-12-19 20:55:59 +01:00
|
|
|
'PhabricatorAuthSSHKeyPHIDType' => 'applications/auth/phid/PhabricatorAuthSSHKeyPHIDType.php',
|
Add a query/policy layer on top of SSH keys for Almanac
Summary:
Ref T5833. Currently, SSH keys are associated only with users, and are a bit un-modern. I want to let Almanac Devices have SSH keys so devices in a cluster can identify to one another.
For example, with hosted installs, initialization will go something like this:
- A request comes in for `company.phacility.com`.
- A SiteSource (from D10787) makes a Conduit call to Almanac on the master install to check if `company` is a valid install and pull config if it is.
- This call can be signed with an SSH key which identifies a trusted Almanac Device.
In the cluster case, a web host can make an authenticated call to a repository host with similar key signing.
To move toward this, put a proper Query class on top of SSH key access (this diff). In following diffs, I'll:
- Rename `userPHID` to `objectPHID`.
- Move this to the `auth` database.
- Provide UI for device/key association.
An alternative approach would be to build some kind of special token layer in Conduit, but I think that would be a lot harder to manage in the hosting case. This gives us a more direct attack on trusting requests from machines and recognizing machines as first (well, sort of second-class) actors without needing things like fake user accounts.
Test Plan:
- Added and removed SSH keys.
- Added and removed SSH keys from a bot account.
- Tried to edit an unonwned SSH key (denied).
- Ran `bin/ssh-auth`, got sensible output.
- Ran `bin/ssh-auth-key`, got sensible output.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10790
2014-11-06 21:37:02 +01:00
|
|
|
'PhabricatorAuthSSHKeyQuery' => 'applications/auth/query/PhabricatorAuthSSHKeyQuery.php',
|
2014-11-11 17:20:08 +01:00
|
|
|
'PhabricatorAuthSSHKeyTableView' => 'applications/auth/view/PhabricatorAuthSSHKeyTableView.php',
|
2014-11-11 17:18:26 +01:00
|
|
|
'PhabricatorAuthSSHPublicKey' => 'applications/auth/sshkey/PhabricatorAuthSSHPublicKey.php',
|
2014-01-14 20:05:45 +01:00
|
|
|
'PhabricatorAuthSession' => 'applications/auth/storage/PhabricatorAuthSession.php',
|
2014-01-14 22:22:27 +01:00
|
|
|
'PhabricatorAuthSessionEngine' => 'applications/auth/engine/PhabricatorAuthSessionEngine.php',
|
2016-04-03 19:04:10 +02:00
|
|
|
'PhabricatorAuthSessionEngineExtension' => 'applications/auth/engine/PhabricatorAuthSessionEngineExtension.php',
|
|
|
|
'PhabricatorAuthSessionEngineExtensionModule' => 'applications/auth/engine/PhabricatorAuthSessionEngineExtensionModule.php',
|
2014-01-15 22:56:16 +01:00
|
|
|
'PhabricatorAuthSessionGarbageCollector' => 'applications/auth/garbagecollector/PhabricatorAuthSessionGarbageCollector.php',
|
2014-01-14 20:05:45 +01:00
|
|
|
'PhabricatorAuthSessionQuery' => 'applications/auth/query/PhabricatorAuthSessionQuery.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorAuthSetupCheck' => 'applications/config/check/PhabricatorAuthSetupCheck.php',
|
2013-06-16 19:15:16 +02:00
|
|
|
'PhabricatorAuthStartController' => 'applications/auth/controller/PhabricatorAuthStartController.php',
|
2016-03-16 14:17:31 +01:00
|
|
|
'PhabricatorAuthTOTPKeyTemporaryTokenType' => 'applications/auth/factor/PhabricatorAuthTOTPKeyTemporaryTokenType.php',
|
Add "temporary tokens" to auth, for SMS codes, TOTP codes, reset codes, etc
Summary:
Ref T4398. We have several auth-related systems which require (or are improved by) the ability to hand out one-time codes which expire after a short period of time.
In particular, these are:
- SMS multi-factor: we need to be able to hand out one-time codes for this in order to prove the user has the phone.
- Password reset emails: we use a time-based rotating token right now, but we could improve this with a one-time token, so once you reset your password the link is dead.
- TOTP auth: we don't need to verify/invalidate keys, but can improve security by doing so.
This adds a generic one-time code storage table, and strengthens the TOTP enrollment process by using it. Specifically, you can no longer edit the enrollment form (the one with a QR code) to force your own key as the TOTP key: only keys Phabricator generated are accepted. This has no practical security impact, but generally helps raise the barrier potential attackers face.
Followup changes will use this for reset emails, then implement SMS multi-factor.
Test Plan:
- Enrolled in TOTP multi-factor auth.
- Submitted an error in the form, saw the same key presented.
- Edited the form with web tools to provide a different key, saw it reject and the server generate an alternate.
- Change the expiration to 5 seconds instead of 1 hour, submitted the form over and over again, saw it cycle the key after 5 seconds.
- Looked at the database and saw the tokens I expected.
- Ran the GC and saw all the 5-second expiry tokens get cleaned up.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T4398
Differential Revision: https://secure.phabricator.com/D9217
2014-05-20 20:43:45 +02:00
|
|
|
'PhabricatorAuthTemporaryToken' => 'applications/auth/storage/PhabricatorAuthTemporaryToken.php',
|
|
|
|
'PhabricatorAuthTemporaryTokenGarbageCollector' => 'applications/auth/garbagecollector/PhabricatorAuthTemporaryTokenGarbageCollector.php',
|
|
|
|
'PhabricatorAuthTemporaryTokenQuery' => 'applications/auth/query/PhabricatorAuthTemporaryTokenQuery.php',
|
2016-03-16 13:17:41 +01:00
|
|
|
'PhabricatorAuthTemporaryTokenType' => 'applications/auth/tokentype/PhabricatorAuthTemporaryTokenType.php',
|
2016-03-16 14:17:31 +01:00
|
|
|
'PhabricatorAuthTemporaryTokenTypeModule' => 'applications/auth/tokentype/PhabricatorAuthTemporaryTokenTypeModule.php',
|
2014-03-17 23:02:01 +01:00
|
|
|
'PhabricatorAuthTerminateSessionController' => 'applications/auth/controller/PhabricatorAuthTerminateSessionController.php',
|
2014-04-30 23:30:31 +02:00
|
|
|
'PhabricatorAuthTryFactorAction' => 'applications/auth/action/PhabricatorAuthTryFactorAction.php',
|
2013-06-17 15:12:45 +02:00
|
|
|
'PhabricatorAuthUnlinkController' => 'applications/auth/controller/PhabricatorAuthUnlinkController.php',
|
2013-06-16 19:15:33 +02:00
|
|
|
'PhabricatorAuthValidateController' => 'applications/auth/controller/PhabricatorAuthValidateController.php',
|
2013-01-07 21:48:39 +01:00
|
|
|
'PhabricatorAuthenticationConfigOptions' => 'applications/config/option/PhabricatorAuthenticationConfigOptions.php',
|
2014-05-23 00:19:28 +02:00
|
|
|
'PhabricatorAutoEventListener' => 'infrastructure/events/PhabricatorAutoEventListener.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgeHasRecipientEdgeType' => 'applications/badges/edge/PhabricatorBadgeHasRecipientEdgeType.php',
|
|
|
|
'PhabricatorBadgesApplication' => 'applications/badges/application/PhabricatorBadgesApplication.php',
|
2015-12-09 22:26:26 +01:00
|
|
|
'PhabricatorBadgesArchiveController' => 'applications/badges/controller/PhabricatorBadgesArchiveController.php',
|
2016-01-13 20:33:46 +01:00
|
|
|
'PhabricatorBadgesAward' => 'applications/badges/storage/PhabricatorBadgesAward.php',
|
2016-03-31 22:39:06 +02:00
|
|
|
'PhabricatorBadgesAwardController' => 'applications/badges/controller/PhabricatorBadgesAwardController.php',
|
2016-01-13 20:33:46 +01:00
|
|
|
'PhabricatorBadgesAwardQuery' => 'applications/badges/query/PhabricatorBadgesAwardQuery.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesBadge' => 'applications/badges/storage/PhabricatorBadgesBadge.php',
|
2016-04-07 21:12:34 +02:00
|
|
|
'PhabricatorBadgesBadgeNameNgrams' => 'applications/badges/storage/PhabricatorBadgesBadgeNameNgrams.php',
|
2015-07-24 19:56:08 +02:00
|
|
|
'PhabricatorBadgesCommentController' => 'applications/badges/controller/PhabricatorBadgesCommentController.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesController' => 'applications/badges/controller/PhabricatorBadgesController.php',
|
|
|
|
'PhabricatorBadgesCreateCapability' => 'applications/badges/capability/PhabricatorBadgesCreateCapability.php',
|
|
|
|
'PhabricatorBadgesDAO' => 'applications/badges/storage/PhabricatorBadgesDAO.php',
|
2016-04-09 20:40:02 +02:00
|
|
|
'PhabricatorBadgesDatasource' => 'applications/badges/typeahead/PhabricatorBadgesDatasource.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesDefaultEditCapability' => 'applications/badges/capability/PhabricatorBadgesDefaultEditCapability.php',
|
2016-04-05 20:21:44 +02:00
|
|
|
'PhabricatorBadgesEditConduitAPIMethod' => 'applications/badges/conduit/PhabricatorBadgesEditConduitAPIMethod.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesEditController' => 'applications/badges/controller/PhabricatorBadgesEditController.php',
|
2016-01-01 17:12:13 +01:00
|
|
|
'PhabricatorBadgesEditEngine' => 'applications/badges/editor/PhabricatorBadgesEditEngine.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesEditRecipientsController' => 'applications/badges/controller/PhabricatorBadgesEditRecipientsController.php',
|
|
|
|
'PhabricatorBadgesEditor' => 'applications/badges/editor/PhabricatorBadgesEditor.php',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorBadgesIconSet' => 'applications/badges/icon/PhabricatorBadgesIconSet.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesListController' => 'applications/badges/controller/PhabricatorBadgesListController.php',
|
2015-07-25 22:34:43 +02:00
|
|
|
'PhabricatorBadgesMailReceiver' => 'applications/badges/mail/PhabricatorBadgesMailReceiver.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesPHIDType' => 'applications/badges/phid/PhabricatorBadgesPHIDType.php',
|
2016-03-31 02:07:27 +02:00
|
|
|
'PhabricatorBadgesQuality' => 'applications/badges/constants/PhabricatorBadgesQuality.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesQuery' => 'applications/badges/query/PhabricatorBadgesQuery.php',
|
|
|
|
'PhabricatorBadgesRecipientsListView' => 'applications/badges/view/PhabricatorBadgesRecipientsListView.php',
|
|
|
|
'PhabricatorBadgesRemoveRecipientsController' => 'applications/badges/controller/PhabricatorBadgesRemoveRecipientsController.php',
|
2015-07-25 22:34:43 +02:00
|
|
|
'PhabricatorBadgesReplyHandler' => 'applications/badges/mail/PhabricatorBadgesReplyHandler.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesSchemaSpec' => 'applications/badges/storage/PhabricatorBadgesSchemaSpec.php',
|
2016-04-05 20:21:44 +02:00
|
|
|
'PhabricatorBadgesSearchConduitAPIMethod' => 'applications/badges/conduit/PhabricatorBadgesSearchConduitAPIMethod.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesSearchEngine' => 'applications/badges/query/PhabricatorBadgesSearchEngine.php',
|
|
|
|
'PhabricatorBadgesTransaction' => 'applications/badges/storage/PhabricatorBadgesTransaction.php',
|
2015-07-24 19:56:08 +02:00
|
|
|
'PhabricatorBadgesTransactionComment' => 'applications/badges/storage/PhabricatorBadgesTransactionComment.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesTransactionQuery' => 'applications/badges/query/PhabricatorBadgesTransactionQuery.php',
|
|
|
|
'PhabricatorBadgesViewController' => 'applications/badges/controller/PhabricatorBadgesViewController.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorBarePageUIExample' => 'applications/uiexample/examples/PhabricatorBarePageUIExample.php',
|
2012-10-16 19:33:47 +02:00
|
|
|
'PhabricatorBarePageView' => 'view/page/PhabricatorBarePageView.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorBaseURISetupCheck' => 'applications/config/check/PhabricatorBaseURISetupCheck.php',
|
2014-02-18 20:03:56 +01:00
|
|
|
'PhabricatorBcryptPasswordHasher' => 'infrastructure/util/password/PhabricatorBcryptPasswordHasher.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorBinariesSetupCheck' => 'applications/config/check/PhabricatorBinariesSetupCheck.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorBitbucketAuthProvider' => 'applications/auth/provider/PhabricatorBitbucketAuthProvider.php',
|
Begin lifting column layout logic out of ColumnPositionQuery
Summary:
Ref T10010. This is a precursor to D15171, which I'll eventually rebuild on top of these changes.
Currently, ColumnPositionQuery does a lot of "column layout" stuff that's very similar to the Milestone/Subproject stuff that needs to happen in D15171. The current approach there ended up splitting this layout stuff across two unrelated classes (ColumnPositionQuery + BoardViewController), neither of which is a particularly great place to do it -- the Query is too low-level, and the Controller is too high-level.
Instead, introduce a new "LayoutEngine" which does all this layout stuff. Swap two of the four places that we query this stuff over to the new engine:
- "Project (Column)" on tasks.
- Transaction generation when moving cards.
These sites aren't swapped by this diff, but will be by the next one:
- Actually applying transactions.
- Main layout for boards (this could swap easily now, but applying transactions currently relies on position writes having taken place, so it can't swap until the other one swaps).
Once everything is swapped over, I should be able to add the D15171 logic to LayoutEngine instead of BoardViewController and end up with a cleaner approach overall.
One particularly benefit is that //looking// at a board won't do a bunch of position writes anymore, which wasn't a big deal, but which I was a bit uneasy with.
Test Plan:
- Viewed tasks that are on boards, saw column annotations in project list.
- Moved cards between columns on a board.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10010
Differential Revision: https://secure.phabricator.com/D15174
2016-02-03 18:39:17 +01:00
|
|
|
'PhabricatorBoardLayoutEngine' => 'applications/project/engine/PhabricatorBoardLayoutEngine.php',
|
2016-02-06 22:02:13 +01:00
|
|
|
'PhabricatorBoardRenderingEngine' => 'applications/project/engine/PhabricatorBoardRenderingEngine.php',
|
2016-02-10 14:59:46 +01:00
|
|
|
'PhabricatorBoardResponseEngine' => 'applications/project/engine/PhabricatorBoardResponseEngine.php',
|
2016-04-27 01:02:57 +02:00
|
|
|
'PhabricatorBoolEditField' => 'applications/transactions/editfield/PhabricatorBoolEditField.php',
|
First pass at decoupling Phabricator bot behavior from the protocol it's running on, this pulls the connection, reading, and writing functionalities out of the bot itself and into the adapter.
Summary:
Ugh, just wrote out a huge message, only to lose it with a fat-fingered ctrl-c. Le sigh.
First pass at decoupling the bot from the protocol. Noticeably absent is the command/message coupling. After this design pass I'll give that a go. Could use some advice, thinking that handlers should only create messages (which can be public or private) and not open ended, undefined 'commands'. The problem being that there needs to be some consistant api if we want handlers to be protocol agnostic. Perhaps that's a pipedream, what are your thoughts?
Secondly, a few notes, design review requests on the changes i did make:
# Config. For now i'm passing config through to the adapter. This was mainly to remain backwards compatible on the config. I was thinking it should probably be namespaced into it's own subobject though to distinguish the adapter config from the bot config.
# Adapter selection. This flavor is the one-bot-daemon, config specified protocol version. The upside is that in the future they won't have to run different daemons for this stuff, just have different config, and the door is open for multiple protocol adapters down the road if need be. The downside is that I had to rename the daemon (non-backwards compatible change) and there will need to be some sort of runtime evaluation for instatiation of the adapter. For now I just have a crude switch, but I was thinking of just taking the string they supply as the class name (ala `try { new $clasName(); } catch...`) so as to allow for homegrown adapters, but I wasn't sure how such runtime magic would go over. Also, an alternative would be to make the PhabricatorBot class a non-abstract non-final base class and have the adapters be accompanied by a bot class that just defines their adapter as a property. The upside of which is backwards compatibility (welcome back PhabricatorIRCBot) and perhaps a little bit clearer plugin path for homegrowners.
# Logging. You'll notice I commented out two very important logging lines in the irc adapter. This isn't intended to remain commented out, but I'm not sure what the best way is to get logging at this layer. I'm wary of just composing the daemon back down into the adapter (bi-directional object composition makes my skin crawl), but something needs to happen, obviously. Advice?
That's it. After the feedback on the above, you can either merge down, or wait until i finish the command/message refactor if you don't think the diff will grow too large. Up to you, this all functions as is.
Test Plan: Ran an irc bot, connected, read input, and wrote output including handler integration.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4757
2013-02-06 03:45:20 +01:00
|
|
|
'PhabricatorBot' => 'infrastructure/daemon/bot/PhabricatorBot.php',
|
2013-02-14 14:13:38 +01:00
|
|
|
'PhabricatorBotChannel' => 'infrastructure/daemon/bot/target/PhabricatorBotChannel.php',
|
First pass at decoupling Phabricator bot behavior from the protocol it's running on, this pulls the connection, reading, and writing functionalities out of the bot itself and into the adapter.
Summary:
Ugh, just wrote out a huge message, only to lose it with a fat-fingered ctrl-c. Le sigh.
First pass at decoupling the bot from the protocol. Noticeably absent is the command/message coupling. After this design pass I'll give that a go. Could use some advice, thinking that handlers should only create messages (which can be public or private) and not open ended, undefined 'commands'. The problem being that there needs to be some consistant api if we want handlers to be protocol agnostic. Perhaps that's a pipedream, what are your thoughts?
Secondly, a few notes, design review requests on the changes i did make:
# Config. For now i'm passing config through to the adapter. This was mainly to remain backwards compatible on the config. I was thinking it should probably be namespaced into it's own subobject though to distinguish the adapter config from the bot config.
# Adapter selection. This flavor is the one-bot-daemon, config specified protocol version. The upside is that in the future they won't have to run different daemons for this stuff, just have different config, and the door is open for multiple protocol adapters down the road if need be. The downside is that I had to rename the daemon (non-backwards compatible change) and there will need to be some sort of runtime evaluation for instatiation of the adapter. For now I just have a crude switch, but I was thinking of just taking the string they supply as the class name (ala `try { new $clasName(); } catch...`) so as to allow for homegrown adapters, but I wasn't sure how such runtime magic would go over. Also, an alternative would be to make the PhabricatorBot class a non-abstract non-final base class and have the adapters be accompanied by a bot class that just defines their adapter as a property. The upside of which is backwards compatibility (welcome back PhabricatorIRCBot) and perhaps a little bit clearer plugin path for homegrowners.
# Logging. You'll notice I commented out two very important logging lines in the irc adapter. This isn't intended to remain commented out, but I'm not sure what the best way is to get logging at this layer. I'm wary of just composing the daemon back down into the adapter (bi-directional object composition makes my skin crawl), but something needs to happen, obviously. Advice?
That's it. After the feedback on the above, you can either merge down, or wait until i finish the command/message refactor if you don't think the diff will grow too large. Up to you, this all functions as is.
Test Plan: Ran an irc bot, connected, read input, and wrote output including handler integration.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4757
2013-02-06 03:45:20 +01:00
|
|
|
'PhabricatorBotDebugLogHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotDebugLogHandler.php',
|
|
|
|
'PhabricatorBotFeedNotificationHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotFeedNotificationHandler.php',
|
2013-02-16 05:24:23 +01:00
|
|
|
'PhabricatorBotFlowdockProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorBotFlowdockProtocolAdapter.php',
|
First pass at decoupling Phabricator bot behavior from the protocol it's running on, this pulls the connection, reading, and writing functionalities out of the bot itself and into the adapter.
Summary:
Ugh, just wrote out a huge message, only to lose it with a fat-fingered ctrl-c. Le sigh.
First pass at decoupling the bot from the protocol. Noticeably absent is the command/message coupling. After this design pass I'll give that a go. Could use some advice, thinking that handlers should only create messages (which can be public or private) and not open ended, undefined 'commands'. The problem being that there needs to be some consistant api if we want handlers to be protocol agnostic. Perhaps that's a pipedream, what are your thoughts?
Secondly, a few notes, design review requests on the changes i did make:
# Config. For now i'm passing config through to the adapter. This was mainly to remain backwards compatible on the config. I was thinking it should probably be namespaced into it's own subobject though to distinguish the adapter config from the bot config.
# Adapter selection. This flavor is the one-bot-daemon, config specified protocol version. The upside is that in the future they won't have to run different daemons for this stuff, just have different config, and the door is open for multiple protocol adapters down the road if need be. The downside is that I had to rename the daemon (non-backwards compatible change) and there will need to be some sort of runtime evaluation for instatiation of the adapter. For now I just have a crude switch, but I was thinking of just taking the string they supply as the class name (ala `try { new $clasName(); } catch...`) so as to allow for homegrown adapters, but I wasn't sure how such runtime magic would go over. Also, an alternative would be to make the PhabricatorBot class a non-abstract non-final base class and have the adapters be accompanied by a bot class that just defines their adapter as a property. The upside of which is backwards compatibility (welcome back PhabricatorIRCBot) and perhaps a little bit clearer plugin path for homegrowners.
# Logging. You'll notice I commented out two very important logging lines in the irc adapter. This isn't intended to remain commented out, but I'm not sure what the best way is to get logging at this layer. I'm wary of just composing the daemon back down into the adapter (bi-directional object composition makes my skin crawl), but something needs to happen, obviously. Advice?
That's it. After the feedback on the above, you can either merge down, or wait until i finish the command/message refactor if you don't think the diff will grow too large. Up to you, this all functions as is.
Test Plan: Ran an irc bot, connected, read input, and wrote output including handler integration.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4757
2013-02-06 03:45:20 +01:00
|
|
|
'PhabricatorBotHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotHandler.php',
|
|
|
|
'PhabricatorBotLogHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotLogHandler.php',
|
|
|
|
'PhabricatorBotMacroHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotMacroHandler.php',
|
|
|
|
'PhabricatorBotMessage' => 'infrastructure/daemon/bot/PhabricatorBotMessage.php',
|
|
|
|
'PhabricatorBotObjectNameHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotObjectNameHandler.php',
|
|
|
|
'PhabricatorBotSymbolHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotSymbolHandler.php',
|
2013-02-14 14:13:38 +01:00
|
|
|
'PhabricatorBotTarget' => 'infrastructure/daemon/bot/target/PhabricatorBotTarget.php',
|
|
|
|
'PhabricatorBotUser' => 'infrastructure/daemon/bot/target/PhabricatorBotUser.php',
|
First pass at decoupling Phabricator bot behavior from the protocol it's running on, this pulls the connection, reading, and writing functionalities out of the bot itself and into the adapter.
Summary:
Ugh, just wrote out a huge message, only to lose it with a fat-fingered ctrl-c. Le sigh.
First pass at decoupling the bot from the protocol. Noticeably absent is the command/message coupling. After this design pass I'll give that a go. Could use some advice, thinking that handlers should only create messages (which can be public or private) and not open ended, undefined 'commands'. The problem being that there needs to be some consistant api if we want handlers to be protocol agnostic. Perhaps that's a pipedream, what are your thoughts?
Secondly, a few notes, design review requests on the changes i did make:
# Config. For now i'm passing config through to the adapter. This was mainly to remain backwards compatible on the config. I was thinking it should probably be namespaced into it's own subobject though to distinguish the adapter config from the bot config.
# Adapter selection. This flavor is the one-bot-daemon, config specified protocol version. The upside is that in the future they won't have to run different daemons for this stuff, just have different config, and the door is open for multiple protocol adapters down the road if need be. The downside is that I had to rename the daemon (non-backwards compatible change) and there will need to be some sort of runtime evaluation for instatiation of the adapter. For now I just have a crude switch, but I was thinking of just taking the string they supply as the class name (ala `try { new $clasName(); } catch...`) so as to allow for homegrown adapters, but I wasn't sure how such runtime magic would go over. Also, an alternative would be to make the PhabricatorBot class a non-abstract non-final base class and have the adapters be accompanied by a bot class that just defines their adapter as a property. The upside of which is backwards compatibility (welcome back PhabricatorIRCBot) and perhaps a little bit clearer plugin path for homegrowners.
# Logging. You'll notice I commented out two very important logging lines in the irc adapter. This isn't intended to remain commented out, but I'm not sure what the best way is to get logging at this layer. I'm wary of just composing the daemon back down into the adapter (bi-directional object composition makes my skin crawl), but something needs to happen, obviously. Advice?
That's it. After the feedback on the above, you can either merge down, or wait until i finish the command/message refactor if you don't think the diff will grow too large. Up to you, this all functions as is.
Test Plan: Ran an irc bot, connected, read input, and wrote output including handler integration.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4757
2013-02-06 03:45:20 +01:00
|
|
|
'PhabricatorBotWhatsNewHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotWhatsNewHandler.php',
|
2015-02-11 22:02:35 +01:00
|
|
|
'PhabricatorBritishEnglishTranslation' => 'infrastructure/internationalization/translation/PhabricatorBritishEnglishTranslation.php',
|
2012-07-02 19:49:00 +02:00
|
|
|
'PhabricatorBuiltinPatchList' => 'infrastructure/storage/patch/PhabricatorBuiltinPatchList.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorBulkContentSource' => 'infrastructure/daemon/contentsource/PhabricatorBulkContentSource.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorBusyUIExample' => 'applications/uiexample/examples/PhabricatorBusyUIExample.php',
|
Add a generic multistep Markup cache
Summary:
The immediate issue this addresses is T1366, adding a rendering cache to Phriction. For wiki pages with code blocks especially, rerendering them each time is expensive.
The broader issue is that out markup caches aren't very good right now. They have three major problems:
**Problem 1: the data is stored in the wrong place.** We currently store remarkup caches on objects. This means we're always loading it and passing it around even when we don't need it, can't genericize cache management code (e.g., have one simple script to drop/GC caches), need to update authoritative rows to clear caches, and can't genericize rendering code since each object is different.
To solve this, I created a dedicated cache database that I plan to move all markup caches to use.
**Problem 2: time-variant rules break when cached.** Some rules like `**bold**` are time-invariant and always produce the same output, but some rules like `{Tnnn}` and `@username` are variant and may render differently (because a task was closed or a user is on vacation). Currently, we cache the raw output, so these time-variant rules get locked at whatever values they had when they were first rendered. This is the main reason Phriction doesn't have a cache right now -- I wanted `{Tnnn}` rules to reflect open/closed tasks.
To solve this, I split markup into a "preprocessing" phase (which does all the parsing and evaluates all time-invariant rules) and a "postprocessing" phase (which evaluates time-variant rules only). The preprocessing phase is most of the expense (and, notably, includes syntax highlighting) so this is nearly as good as caching the final output. I did most of the work here in D737 / D738, but we never moved to use it in Phabricator -- we currently just do the two operations serially in all cases.
This diff splits them apart and caches the output of preprocessing only, so we benefit from caching but also get accurate time-variant rendering.
**Problem 3: cache access isn't batched/pipelined optimally.** When we're rendering a list of markup blocks, we should be able to batch datafetching better than we do. D738 helped with this (fetching is batched within a single hunk of markup) and this improves batching on cache access. We could still do better here, but this is at least a step forward.
Also fixes a bug with generating a link in the Phriction history interface ($uri gets clobbered).
I'm using PHP serialization instead of JSON serialization because Remarkup does some stuff with non-ascii characters that might not survive JSON.
Test Plan:
- Created a Phriction document and verified that previews don't go to cache (no rows appear in the cache table).
- Verified that published documents come out of cache.
- Verified that caches generate/regenerate correctly, time-variant rules render properly and old documents hit the right caches.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1366
Differential Revision: https://secure.phabricator.com/D2945
2012-07-10 00:20:56 +02:00
|
|
|
'PhabricatorCacheDAO' => 'applications/cache/storage/PhabricatorCacheDAO.php',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorCacheGeneralGarbageCollector' => 'applications/cache/garbagecollector/PhabricatorCacheGeneralGarbageCollector.php',
|
2013-05-20 19:16:35 +02:00
|
|
|
'PhabricatorCacheManagementPurgeWorkflow' => 'applications/cache/management/PhabricatorCacheManagementPurgeWorkflow.php',
|
|
|
|
'PhabricatorCacheManagementWorkflow' => 'applications/cache/management/PhabricatorCacheManagementWorkflow.php',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorCacheMarkupGarbageCollector' => 'applications/cache/garbagecollector/PhabricatorCacheMarkupGarbageCollector.php',
|
2014-09-18 17:36:22 +02:00
|
|
|
'PhabricatorCacheSchemaSpec' => 'applications/cache/storage/PhabricatorCacheSchemaSpec.php',
|
2015-04-08 20:31:01 +02:00
|
|
|
'PhabricatorCacheSetupCheck' => 'applications/config/check/PhabricatorCacheSetupCheck.php',
|
2015-04-07 23:38:03 +02:00
|
|
|
'PhabricatorCacheSpec' => 'applications/cache/spec/PhabricatorCacheSpec.php',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorCacheTTLGarbageCollector' => 'applications/cache/garbagecollector/PhabricatorCacheTTLGarbageCollector.php',
|
2012-12-25 15:09:51 +01:00
|
|
|
'PhabricatorCaches' => 'applications/cache/PhabricatorCaches.php',
|
2015-06-05 02:27:31 +02:00
|
|
|
'PhabricatorCachesTestCase' => 'applications/cache/__tests__/PhabricatorCachesTestCase.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorCalendarApplication' => 'applications/calendar/application/PhabricatorCalendarApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCalendarController' => 'applications/calendar/controller/PhabricatorCalendarController.php',
|
|
|
|
'PhabricatorCalendarDAO' => 'applications/calendar/storage/PhabricatorCalendarDAO.php',
|
2014-02-06 19:07:29 +01:00
|
|
|
'PhabricatorCalendarEvent' => 'applications/calendar/storage/PhabricatorCalendarEvent.php',
|
Canceling calendar events should deactivate the event
Summary: Closes T7943, Canceling calendar event should deactivate the event instead of destroying data.
Test Plan: Create an event, cancel it, see changed status icon, query for active events, event should not appear, query for deactivated events, event should appear in results.
Reviewers: #blessed_reviewers, epriestley
Reviewed By: #blessed_reviewers, epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T7943
Differential Revision: https://secure.phabricator.com/D12604
2015-04-29 17:39:39 +02:00
|
|
|
'PhabricatorCalendarEventCancelController' => 'applications/calendar/controller/PhabricatorCalendarEventCancelController.php',
|
2015-05-01 02:38:04 +02:00
|
|
|
'PhabricatorCalendarEventCommentController' => 'applications/calendar/controller/PhabricatorCalendarEventCommentController.php',
|
2015-05-24 04:47:23 +02:00
|
|
|
'PhabricatorCalendarEventDragController' => 'applications/calendar/controller/PhabricatorCalendarEventDragController.php',
|
2014-02-06 19:10:07 +01:00
|
|
|
'PhabricatorCalendarEventEditController' => 'applications/calendar/controller/PhabricatorCalendarEventEditController.php',
|
2015-04-28 15:26:48 +02:00
|
|
|
'PhabricatorCalendarEventEditor' => 'applications/calendar/editor/PhabricatorCalendarEventEditor.php',
|
2015-05-02 04:01:29 +02:00
|
|
|
'PhabricatorCalendarEventEmailCommand' => 'applications/calendar/command/PhabricatorCalendarEventEmailCommand.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorCalendarEventFulltextEngine' => 'applications/calendar/search/PhabricatorCalendarEventFulltextEngine.php',
|
2015-04-29 22:51:09 +02:00
|
|
|
'PhabricatorCalendarEventInvitee' => 'applications/calendar/storage/PhabricatorCalendarEventInvitee.php',
|
|
|
|
'PhabricatorCalendarEventInviteeQuery' => 'applications/calendar/query/PhabricatorCalendarEventInviteeQuery.php',
|
2015-04-30 03:18:27 +02:00
|
|
|
'PhabricatorCalendarEventJoinController' => 'applications/calendar/controller/PhabricatorCalendarEventJoinController.php',
|
2014-02-06 19:10:07 +01:00
|
|
|
'PhabricatorCalendarEventListController' => 'applications/calendar/controller/PhabricatorCalendarEventListController.php',
|
2015-05-01 22:26:07 +02:00
|
|
|
'PhabricatorCalendarEventMailReceiver' => 'applications/calendar/mail/PhabricatorCalendarEventMailReceiver.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorCalendarEventPHIDType' => 'applications/calendar/phid/PhabricatorCalendarEventPHIDType.php',
|
2014-02-06 19:07:42 +01:00
|
|
|
'PhabricatorCalendarEventQuery' => 'applications/calendar/query/PhabricatorCalendarEventQuery.php',
|
2015-05-02 04:01:29 +02:00
|
|
|
'PhabricatorCalendarEventRSVPEmailCommand' => 'applications/calendar/command/PhabricatorCalendarEventRSVPEmailCommand.php',
|
2014-02-06 19:10:18 +01:00
|
|
|
'PhabricatorCalendarEventSearchEngine' => 'applications/calendar/query/PhabricatorCalendarEventSearchEngine.php',
|
2015-04-28 15:26:48 +02:00
|
|
|
'PhabricatorCalendarEventTransaction' => 'applications/calendar/storage/PhabricatorCalendarEventTransaction.php',
|
|
|
|
'PhabricatorCalendarEventTransactionComment' => 'applications/calendar/storage/PhabricatorCalendarEventTransactionComment.php',
|
|
|
|
'PhabricatorCalendarEventTransactionQuery' => 'applications/calendar/query/PhabricatorCalendarEventTransactionQuery.php',
|
2014-02-06 19:10:27 +01:00
|
|
|
'PhabricatorCalendarEventViewController' => 'applications/calendar/controller/PhabricatorCalendarEventViewController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCalendarHoliday' => 'applications/calendar/storage/PhabricatorCalendarHoliday.php',
|
|
|
|
'PhabricatorCalendarHolidayTestCase' => 'applications/calendar/storage/__tests__/PhabricatorCalendarHolidayTestCase.php',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorCalendarIconSet' => 'applications/calendar/icon/PhabricatorCalendarIconSet.php',
|
2015-04-27 23:27:34 +02:00
|
|
|
'PhabricatorCalendarRemarkupRule' => 'applications/calendar/remarkup/PhabricatorCalendarRemarkupRule.php',
|
2015-05-01 22:26:07 +02:00
|
|
|
'PhabricatorCalendarReplyHandler' => 'applications/calendar/mail/PhabricatorCalendarReplyHandler.php',
|
2015-04-28 01:35:55 +02:00
|
|
|
'PhabricatorCalendarSchemaSpec' => 'applications/calendar/storage/PhabricatorCalendarSchemaSpec.php',
|
First (rough) pass at campfire protocol adapter for bot.
Summary:
Decided the best approach for refactoring the message/command stuff would be to actually start implementing the campfire adapter to get a better idea of what the abstractions should look like. It feels awkward and unwieldy trying to maintain the irc command interface (notice the message instantiation in the `processReadBuffer()` method. However, i'm still not clear what the best approach is without requiring a re-write of nearly all the existing handlers and defining essentially a custom dsl on top of irc's.
I suppose given that alternative, implementing to irc's dsl doesn't sound all that bad. Just feels like poor coupling.
Also, I know that there is some http stuff in libphutil's futures library, but the https future is shit and I need to do some custom curlopt stuff I wasn't sure how to do with that. But if you think this should be refactored, let me know.
I tested this with the ObjectHandler (messages with DXXX initiate the bot to respond with the title/link just as with irc), but beyond that, I haven't tried any of the other handlers, so if there are complications you think i'm going to run into, just let me know (this is one of the reasons for requesting review early on).
Also, this diff is against my last one, even though that hasn't been merged down yet. It was starting to get large and I'd prefer to keep to two conversations separate.
Fixing some lint issues.
Test Plan: Ran the bot with the Object Handler in campfire and observed it behaving properly.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4830
2013-02-07 15:31:29 +01:00
|
|
|
'PhabricatorCampfireProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorCampfireProtocolAdapter.php',
|
2014-10-13 20:17:23 +02:00
|
|
|
'PhabricatorCelerityApplication' => 'applications/celerity/application/PhabricatorCelerityApplication.php',
|
2014-09-22 10:50:20 +02:00
|
|
|
'PhabricatorCelerityTestCase' => '__tests__/PhabricatorCelerityTestCase.php',
|
2014-01-20 22:14:04 +01:00
|
|
|
'PhabricatorChangeParserTestCase' => 'applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorChangesetResponse' => 'infrastructure/diff/PhabricatorChangesetResponse.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorChatLogApplication' => 'applications/chatlog/application/PhabricatorChatLogApplication.php',
|
2013-02-14 13:10:42 +01:00
|
|
|
'PhabricatorChatLogChannel' => 'applications/chatlog/storage/PhabricatorChatLogChannel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorChatLogChannelListController' => 'applications/chatlog/controller/PhabricatorChatLogChannelListController.php',
|
|
|
|
'PhabricatorChatLogChannelLogController' => 'applications/chatlog/controller/PhabricatorChatLogChannelLogController.php',
|
2014-04-10 20:45:21 +02:00
|
|
|
'PhabricatorChatLogChannelQuery' => 'applications/chatlog/query/PhabricatorChatLogChannelQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorChatLogController' => 'applications/chatlog/controller/PhabricatorChatLogController.php',
|
|
|
|
'PhabricatorChatLogDAO' => 'applications/chatlog/storage/PhabricatorChatLogDAO.php',
|
|
|
|
'PhabricatorChatLogEvent' => 'applications/chatlog/storage/PhabricatorChatLogEvent.php',
|
2014-04-10 20:45:21 +02:00
|
|
|
'PhabricatorChatLogQuery' => 'applications/chatlog/query/PhabricatorChatLogQuery.php',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'PhabricatorChunkedFileStorageEngine' => 'applications/files/engine/PhabricatorChunkedFileStorageEngine.php',
|
Add `cluster.addresses` and require membership before accepting cluster authentication tokens
Summary:
Ref T2783. Ref T6706.
- Add `cluster.addresses`. This is a whitelist of CIDR blocks which define cluster hosts.
- When we recieve a request that has a cluster-based authentication token, require the cluster to be configured and require the remote address to be a cluster member before we accept it.
- This provides a general layer of security for these mechanisms.
- In particular, it means they do not work by default on unconfigured hosts.
- When cluster addresses are configured, and we receive a request //to// an address not on the list, reject it.
- This provides a general layer of security for getting the Ops side of cluster configuration correct.
- If cluster nodes have public IPs and are listening on them, we'll reject requests.
- Basically, this means that any requests which bypass the LB get rejected.
Test Plan:
- With addresses not configured, tried to make requests; rejected for using a cluster auth mechanism.
- With addresses configred wrong, tried to make requests; rejected for sending from (or to) an address outside of the cluster.
- With addresses configured correctly, made valid requests.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6706, T2783
Differential Revision: https://secure.phabricator.com/D11159
2015-01-03 00:13:41 +01:00
|
|
|
'PhabricatorClusterConfigOptions' => 'applications/config/option/PhabricatorClusterConfigOptions.php',
|
2016-04-09 14:41:08 +02:00
|
|
|
'PhabricatorClusterDatabasesConfigOptionType' => 'infrastructure/cluster/PhabricatorClusterDatabasesConfigOptionType.php',
|
2016-04-10 14:10:06 +02:00
|
|
|
'PhabricatorClusterException' => 'infrastructure/cluster/PhabricatorClusterException.php',
|
|
|
|
'PhabricatorClusterExceptionHandler' => 'infrastructure/cluster/PhabricatorClusterExceptionHandler.php',
|
Automatically degrade to read-only mode when unable to connect to the master
Summary:
Ref T4571. If we fail to connect to the master, automatically try to degrade into a temporary read-only mode ("UNREACHABLE") for the remainder of the request, if possible.
If the request was something like "load the homepage", that'll work fine. If it was something like "submit a comment", there's nothing we can do and we just have to fail.
Detecting this condition imposes a performance penalty: every request checks the connection and gives the database a long time to respond, since we don't want to drop writes unless we have to. So the degraded mode works, but it's really slow, and may perpetuate the problem if the root issue is load-related.
This lays the groundwork for improving this case by degrading futher into a "SEVERED" mode which will persist across requests. In the future, if several requests in a short period of time fail, we'll sever the database host and refuse to try to connect to it for a little while, connecting directly to replicas instead (basically, we're "health checking" the master, like a load balancer would health check a web application server). This will give us a better (much faster) degraded mode in a major service disruption, and reduce load on the master if the root cause is load-related, giving it a better chance of recovering on its own.
Test Plan:
- Disabled master in config by changing the host/username, got degraded automatically to UNREACAHBLE mode immediately.
- Faked full SEVERED mode, requests hit replicas and put me in the mode properly.
- Made stuff work, hit some good pages.
- Hit some non-cluster pages.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4571
Differential Revision: https://secure.phabricator.com/D15674
2016-04-10 14:51:34 +02:00
|
|
|
'PhabricatorClusterImpossibleWriteException' => 'infrastructure/cluster/PhabricatorClusterImpossibleWriteException.php',
|
2016-04-10 14:10:06 +02:00
|
|
|
'PhabricatorClusterImproperWriteException' => 'infrastructure/cluster/PhabricatorClusterImproperWriteException.php',
|
Automatically degrade to read-only mode when unable to connect to the master
Summary:
Ref T4571. If we fail to connect to the master, automatically try to degrade into a temporary read-only mode ("UNREACHABLE") for the remainder of the request, if possible.
If the request was something like "load the homepage", that'll work fine. If it was something like "submit a comment", there's nothing we can do and we just have to fail.
Detecting this condition imposes a performance penalty: every request checks the connection and gives the database a long time to respond, since we don't want to drop writes unless we have to. So the degraded mode works, but it's really slow, and may perpetuate the problem if the root issue is load-related.
This lays the groundwork for improving this case by degrading futher into a "SEVERED" mode which will persist across requests. In the future, if several requests in a short period of time fail, we'll sever the database host and refuse to try to connect to it for a little while, connecting directly to replicas instead (basically, we're "health checking" the master, like a load balancer would health check a web application server). This will give us a better (much faster) degraded mode in a major service disruption, and reduce load on the master if the root cause is load-related, giving it a better chance of recovering on its own.
Test Plan:
- Disabled master in config by changing the host/username, got degraded automatically to UNREACAHBLE mode immediately.
- Faked full SEVERED mode, requests hit replicas and put me in the mode properly.
- Made stuff work, hit some good pages.
- Hit some non-cluster pages.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4571
Differential Revision: https://secure.phabricator.com/D15674
2016-04-10 14:51:34 +02:00
|
|
|
'PhabricatorClusterStrandedException' => 'infrastructure/cluster/PhabricatorClusterStrandedException.php',
|
2016-02-02 18:53:18 +01:00
|
|
|
'PhabricatorColumnProxyInterface' => 'applications/project/interface/PhabricatorColumnProxyInterface.php',
|
2016-04-06 13:37:01 +02:00
|
|
|
'PhabricatorColumnsEditField' => 'applications/transactions/editfield/PhabricatorColumnsEditField.php',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorCommentEditEngineExtension' => 'applications/transactions/engineextension/PhabricatorCommentEditEngineExtension.php',
|
2015-11-18 23:11:21 +01:00
|
|
|
'PhabricatorCommentEditField' => 'applications/transactions/editfield/PhabricatorCommentEditField.php',
|
|
|
|
'PhabricatorCommentEditType' => 'applications/transactions/edittype/PhabricatorCommentEditType.php',
|
2014-03-12 19:30:33 +01:00
|
|
|
'PhabricatorCommitBranchesField' => 'applications/repository/customfield/PhabricatorCommitBranchesField.php',
|
|
|
|
'PhabricatorCommitCustomField' => 'applications/repository/customfield/PhabricatorCommitCustomField.php',
|
2015-05-25 13:49:12 +02:00
|
|
|
'PhabricatorCommitMergedCommitsField' => 'applications/repository/customfield/PhabricatorCommitMergedCommitsField.php',
|
2015-05-25 14:43:42 +02:00
|
|
|
'PhabricatorCommitRepositoryField' => 'applications/repository/customfield/PhabricatorCommitRepositoryField.php',
|
2014-04-27 18:43:05 +02:00
|
|
|
'PhabricatorCommitSearchEngine' => 'applications/audit/query/PhabricatorCommitSearchEngine.php',
|
2014-03-12 19:30:52 +01:00
|
|
|
'PhabricatorCommitTagsField' => 'applications/repository/customfield/PhabricatorCommitTagsField.php',
|
2014-01-23 23:01:18 +01:00
|
|
|
'PhabricatorCommonPasswords' => 'applications/auth/constants/PhabricatorCommonPasswords.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorConduitAPIController' => 'applications/conduit/controller/PhabricatorConduitAPIController.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorConduitApplication' => 'applications/conduit/application/PhabricatorConduitApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorConduitCertificateToken' => 'applications/conduit/storage/PhabricatorConduitCertificateToken.php',
|
2015-12-14 23:36:47 +01:00
|
|
|
'PhabricatorConduitConnectionLog' => 'applications/conduit/storage/PhabricatorConduitConnectionLog.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorConduitConsoleController' => 'applications/conduit/controller/PhabricatorConduitConsoleController.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorConduitContentSource' => 'infrastructure/contentsource/PhabricatorConduitContentSource.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorConduitController' => 'applications/conduit/controller/PhabricatorConduitController.php',
|
|
|
|
'PhabricatorConduitDAO' => 'applications/conduit/storage/PhabricatorConduitDAO.php',
|
2015-12-15 18:11:11 +01:00
|
|
|
'PhabricatorConduitEditField' => 'applications/transactions/editfield/PhabricatorConduitEditField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorConduitListController' => 'applications/conduit/controller/PhabricatorConduitListController.php',
|
|
|
|
'PhabricatorConduitLogController' => 'applications/conduit/controller/PhabricatorConduitLogController.php',
|
2013-07-01 21:37:34 +02:00
|
|
|
'PhabricatorConduitLogQuery' => 'applications/conduit/query/PhabricatorConduitLogQuery.php',
|
2015-12-14 21:27:57 +01:00
|
|
|
'PhabricatorConduitLogSearchEngine' => 'applications/conduit/query/PhabricatorConduitLogSearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorConduitMethodCallLog' => 'applications/conduit/storage/PhabricatorConduitMethodCallLog.php',
|
2013-07-01 21:36:34 +02:00
|
|
|
'PhabricatorConduitMethodQuery' => 'applications/conduit/query/PhabricatorConduitMethodQuery.php',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorConduitRequestExceptionHandler' => 'aphront/handler/PhabricatorConduitRequestExceptionHandler.php',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorConduitResultInterface' => 'applications/conduit/interface/PhabricatorConduitResultInterface.php',
|
2013-07-01 21:36:34 +02:00
|
|
|
'PhabricatorConduitSearchEngine' => 'applications/conduit/query/PhabricatorConduitSearchEngine.php',
|
2015-12-14 15:42:21 +01:00
|
|
|
'PhabricatorConduitSearchFieldSpecification' => 'applications/conduit/interface/PhabricatorConduitSearchFieldSpecification.php',
|
Accept Conduit tokens as an authentication mechanism
Summary:
- Ref T5955. Accept the tokens introduced in D10985 as an authentication token.
- Ref T3628. Permit simple `curl`-compatible decoding of parameters.
Test Plan:
- Ran some sensible `curl` API commands:
```
epriestley@orbital ~/dev/phabricator $ curl -g "http://local.phacility.com/api/user.whoami?api.token=api-f7dfpoyelk4mmz6vxcueb6hcbtbk" ; echo
{"result":{"phid":"PHID-USER-cvfydnwadpdj7vdon36z","userName":"admin","realName":"asdf","image":"http:\/\/local.phacility.com\/res\/1410737307T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/local.phacility.com\/p\/admin\/","roles":["admin","verified","approved","activated"]},"error_code":null,"error_info":null}
```
```
epriestley@orbital ~/dev/phabricator $ curl -g "http://local.phacility.com/api/differential.query?api.token=api-f7dfpoyelk4mmz6vxcueb6hcbtbk&ids[]=1" ; echo
{"result":[{"id":"1","phid":"PHID-DREV-v3a67ixww3ccg5lqbxee","title":"zxcb","uri":"http:\/\/local.phacility.com\/D1","dateCreated":"1418405590","dateModified":"1418405590","authorPHID":"PHID-USER-cvfydnwadpdj7vdon36z","status":"0","statusName":"Needs Review","branch":null,"summary":"","testPlan":"zxcb","lineCount":"6","activeDiffPHID":"PHID-DIFF-pzbtc5rw6pe5j2kxtlr2","diffs":["1"],"commits":[],"reviewers":[],"ccs":[],"hashes":[],"auxiliary":{"phabricator:projects":[],"phabricator:depends-on":[],"organization.sqlmigration":null},"arcanistProjectPHID":null,"repositoryPHID":null,"sourcePath":null}],"error_code":null,"error_info":null}
```
- Ran older-style commands like `arc list` against the local install.
- Ran commands via web console.
- Added and ran a unit test to make sure nothing is using forbidden parameter names.
- Terminated a token and verified it no longer works.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T3628, T5955
Differential Revision: https://secure.phabricator.com/D10986
2014-12-15 20:14:41 +01:00
|
|
|
'PhabricatorConduitTestCase' => '__tests__/PhabricatorConduitTestCase.php',
|
Add Conduit Tokens to make authentication in Conduit somewhat more sane
Summary:
Ref T5955. Summary of intended changes:
**Improve Granularity of Authorization**: Currently, users have one Conduit Certificate. This isn't very flexible, and means that you can't ever generate an API token with limited permissions or IP block controls (see T6706). This moves toward a world where you can generate multiple tokens, revoke them individually, and assign disparate privileges to them.
**Standardize Token Management**: This moves Conduit to work the same way that sessions, OAuth authorizations, and temporary tokens already work, instead of being this crazy bizarre mess.
**Make Authentication Faster**: Authentication currently requires a handshake (conduit.connect) to establish a session, like the web UI. This is unnecessary from a security point of view and puts an extra round trip in front of all Conduit activity. Essentially no other API anywhere works like this.
**Make Authentication Simpler**: The handshake is complex, and involves deriving hashes. The session is also complex, and creates issues like T4377. Handshake and session management require different inputs.
**Make Token Management Simpler**: The certificate is this huge long thing right now, which is not necessary from a security perspective. There are separate Arcanist handshake tokens, but they have a different set of issues. We can move forward to a token management world where neither of these problems exist.
**Lower Protocol Barrier**: The simplest possible API client is very complex right now. It should be `curl`. Simplifying authentication is a necessary step toward this.
**Unblock T2783**: T2783 is blocked on nodes in the cluster making authenticated API calls to other nodes. This provides a simpler way forward than the handshake mess (or enormous-hack-mess) which would currently be required.
Test Plan:
- Generated tokens.
- Generated tokens for a bot account.
- Terminated tokens (and for a bot account).
- Terminated all tokens (and for a bot account).
- Ran GC and saw it reap all the expired tokens.
NOTE: These tokens can not actually be used to authenticate yet!
{F249658}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5955
Differential Revision: https://secure.phabricator.com/D10985
2014-12-15 20:14:23 +01:00
|
|
|
'PhabricatorConduitToken' => 'applications/conduit/storage/PhabricatorConduitToken.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorConduitTokenController' => 'applications/conduit/controller/PhabricatorConduitTokenController.php',
|
Add Conduit Tokens to make authentication in Conduit somewhat more sane
Summary:
Ref T5955. Summary of intended changes:
**Improve Granularity of Authorization**: Currently, users have one Conduit Certificate. This isn't very flexible, and means that you can't ever generate an API token with limited permissions or IP block controls (see T6706). This moves toward a world where you can generate multiple tokens, revoke them individually, and assign disparate privileges to them.
**Standardize Token Management**: This moves Conduit to work the same way that sessions, OAuth authorizations, and temporary tokens already work, instead of being this crazy bizarre mess.
**Make Authentication Faster**: Authentication currently requires a handshake (conduit.connect) to establish a session, like the web UI. This is unnecessary from a security point of view and puts an extra round trip in front of all Conduit activity. Essentially no other API anywhere works like this.
**Make Authentication Simpler**: The handshake is complex, and involves deriving hashes. The session is also complex, and creates issues like T4377. Handshake and session management require different inputs.
**Make Token Management Simpler**: The certificate is this huge long thing right now, which is not necessary from a security perspective. There are separate Arcanist handshake tokens, but they have a different set of issues. We can move forward to a token management world where neither of these problems exist.
**Lower Protocol Barrier**: The simplest possible API client is very complex right now. It should be `curl`. Simplifying authentication is a necessary step toward this.
**Unblock T2783**: T2783 is blocked on nodes in the cluster making authenticated API calls to other nodes. This provides a simpler way forward than the handshake mess (or enormous-hack-mess) which would currently be required.
Test Plan:
- Generated tokens.
- Generated tokens for a bot account.
- Terminated tokens (and for a bot account).
- Terminated all tokens (and for a bot account).
- Ran GC and saw it reap all the expired tokens.
NOTE: These tokens can not actually be used to authenticate yet!
{F249658}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5955
Differential Revision: https://secure.phabricator.com/D10985
2014-12-15 20:14:23 +01:00
|
|
|
'PhabricatorConduitTokenEditController' => 'applications/conduit/controller/PhabricatorConduitTokenEditController.php',
|
2014-12-15 20:14:53 +01:00
|
|
|
'PhabricatorConduitTokenHandshakeController' => 'applications/conduit/controller/PhabricatorConduitTokenHandshakeController.php',
|
Add Conduit Tokens to make authentication in Conduit somewhat more sane
Summary:
Ref T5955. Summary of intended changes:
**Improve Granularity of Authorization**: Currently, users have one Conduit Certificate. This isn't very flexible, and means that you can't ever generate an API token with limited permissions or IP block controls (see T6706). This moves toward a world where you can generate multiple tokens, revoke them individually, and assign disparate privileges to them.
**Standardize Token Management**: This moves Conduit to work the same way that sessions, OAuth authorizations, and temporary tokens already work, instead of being this crazy bizarre mess.
**Make Authentication Faster**: Authentication currently requires a handshake (conduit.connect) to establish a session, like the web UI. This is unnecessary from a security point of view and puts an extra round trip in front of all Conduit activity. Essentially no other API anywhere works like this.
**Make Authentication Simpler**: The handshake is complex, and involves deriving hashes. The session is also complex, and creates issues like T4377. Handshake and session management require different inputs.
**Make Token Management Simpler**: The certificate is this huge long thing right now, which is not necessary from a security perspective. There are separate Arcanist handshake tokens, but they have a different set of issues. We can move forward to a token management world where neither of these problems exist.
**Lower Protocol Barrier**: The simplest possible API client is very complex right now. It should be `curl`. Simplifying authentication is a necessary step toward this.
**Unblock T2783**: T2783 is blocked on nodes in the cluster making authenticated API calls to other nodes. This provides a simpler way forward than the handshake mess (or enormous-hack-mess) which would currently be required.
Test Plan:
- Generated tokens.
- Generated tokens for a bot account.
- Terminated tokens (and for a bot account).
- Terminated all tokens (and for a bot account).
- Ran GC and saw it reap all the expired tokens.
NOTE: These tokens can not actually be used to authenticate yet!
{F249658}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5955
Differential Revision: https://secure.phabricator.com/D10985
2014-12-15 20:14:23 +01:00
|
|
|
'PhabricatorConduitTokenQuery' => 'applications/conduit/query/PhabricatorConduitTokenQuery.php',
|
|
|
|
'PhabricatorConduitTokenTerminateController' => 'applications/conduit/controller/PhabricatorConduitTokenTerminateController.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorConduitTokensSettingsPanel' => 'applications/conduit/settings/PhabricatorConduitTokensSettingsPanel.php',
|
2013-01-16 20:10:41 +01:00
|
|
|
'PhabricatorConfigAllController' => 'applications/config/controller/PhabricatorConfigAllController.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorConfigApplication' => 'applications/config/application/PhabricatorConfigApplication.php',
|
2015-04-07 23:28:20 +02:00
|
|
|
'PhabricatorConfigCacheController' => 'applications/config/controller/PhabricatorConfigCacheController.php',
|
2016-04-10 00:21:29 +02:00
|
|
|
'PhabricatorConfigClusterDatabasesController' => 'applications/config/controller/PhabricatorConfigClusterDatabasesController.php',
|
2016-04-13 21:07:48 +02:00
|
|
|
'PhabricatorConfigClusterNotificationsController' => 'applications/config/controller/PhabricatorConfigClusterNotificationsController.php',
|
2016-04-20 20:06:13 +02:00
|
|
|
'PhabricatorConfigClusterRepositoriesController' => 'applications/config/controller/PhabricatorConfigClusterRepositoriesController.php',
|
2015-10-02 01:58:43 +02:00
|
|
|
'PhabricatorConfigCollectorsModule' => 'applications/config/module/PhabricatorConfigCollectorsModule.php',
|
2014-09-18 17:22:18 +02:00
|
|
|
'PhabricatorConfigColumnSchema' => 'applications/config/schema/PhabricatorConfigColumnSchema.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorConfigConfigPHIDType' => 'applications/config/phid/PhabricatorConfigConfigPHIDType.php',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigController' => 'applications/config/controller/PhabricatorConfigController.php',
|
2014-10-02 18:51:20 +02:00
|
|
|
'PhabricatorConfigCoreSchemaSpec' => 'applications/config/schema/PhabricatorConfigCoreSchemaSpec.php',
|
2014-09-18 17:22:18 +02:00
|
|
|
'PhabricatorConfigDatabaseController' => 'applications/config/controller/PhabricatorConfigDatabaseController.php',
|
2014-09-19 20:46:30 +02:00
|
|
|
'PhabricatorConfigDatabaseIssueController' => 'applications/config/controller/PhabricatorConfigDatabaseIssueController.php',
|
2014-09-18 17:22:18 +02:00
|
|
|
'PhabricatorConfigDatabaseSchema' => 'applications/config/schema/PhabricatorConfigDatabaseSchema.php',
|
Add database configuration source to the source stack
Summary:
Read configuration from the new database source.
This adds an extra MySQL connect + query to every page. They're very cheap so I think we can suffer them for now, but I'd like to put cache in front of this at some point. The difficulties are:
- If we use APC, multi-frontend installs (Facebook) can't dirty it (major problem), and the CLI can't dirty it (fine for now, maybe a major problem later).
- If we use Memcache, we need to add config stuff.
- We could use APC in all non-Facebook installs if we can make it dirtyable from the CLI, but I don't see a reasonable way to do that.
- We don't have any other caches which are faster than the database.
So I'll probably implement Memcache support at some point, although this is a lame excuse for it.
Test Plan: Added some config values via web UI, saw them active on the install.
Reviewers: btrahan, codeblock, vrana
Reviewed By: codeblock
CC: aran
Maniphest Tasks: T2221
Differential Revision: https://secure.phabricator.com/D4296
2013-01-18 00:10:21 +01:00
|
|
|
'PhabricatorConfigDatabaseSource' => 'infrastructure/env/PhabricatorConfigDatabaseSource.php',
|
2014-09-19 20:46:30 +02:00
|
|
|
'PhabricatorConfigDatabaseStatusController' => 'applications/config/controller/PhabricatorConfigDatabaseStatusController.php',
|
2013-01-01 23:10:33 +01:00
|
|
|
'PhabricatorConfigDefaultSource' => 'infrastructure/env/PhabricatorConfigDefaultSource.php',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigDictionarySource' => 'infrastructure/env/PhabricatorConfigDictionarySource.php',
|
2015-07-21 02:08:37 +02:00
|
|
|
'PhabricatorConfigEdgeModule' => 'applications/config/module/PhabricatorConfigEdgeModule.php',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigEditController' => 'applications/config/controller/PhabricatorConfigEditController.php',
|
2013-01-02 03:14:41 +01:00
|
|
|
'PhabricatorConfigEditor' => 'applications/config/editor/PhabricatorConfigEditor.php',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigEntry' => 'applications/config/storage/PhabricatorConfigEntry.php',
|
|
|
|
'PhabricatorConfigEntryDAO' => 'applications/config/storage/PhabricatorConfigEntryDAO.php',
|
2013-07-22 00:04:21 +02:00
|
|
|
'PhabricatorConfigEntryQuery' => 'applications/config/query/PhabricatorConfigEntryQuery.php',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigFileSource' => 'infrastructure/env/PhabricatorConfigFileSource.php',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorConfigGroupController' => 'applications/config/controller/PhabricatorConfigGroupController.php',
|
2015-11-04 14:05:10 +01:00
|
|
|
'PhabricatorConfigHTTPParameterTypesModule' => 'applications/config/module/PhabricatorConfigHTTPParameterTypesModule.php',
|
2015-01-01 15:51:44 +01:00
|
|
|
'PhabricatorConfigHistoryController' => 'applications/config/controller/PhabricatorConfigHistoryController.php',
|
2013-03-06 23:14:09 +01:00
|
|
|
'PhabricatorConfigIgnoreController' => 'applications/config/controller/PhabricatorConfigIgnoreController.php',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorConfigIssueListController' => 'applications/config/controller/PhabricatorConfigIssueListController.php',
|
|
|
|
'PhabricatorConfigIssueViewController' => 'applications/config/controller/PhabricatorConfigIssueViewController.php',
|
2013-01-12 00:28:33 +01:00
|
|
|
'PhabricatorConfigJSON' => 'applications/config/json/PhabricatorConfigJSON.php',
|
2014-03-25 22:05:36 +01:00
|
|
|
'PhabricatorConfigJSONOptionType' => 'applications/config/custom/PhabricatorConfigJSONOptionType.php',
|
2014-09-18 17:32:21 +02:00
|
|
|
'PhabricatorConfigKeySchema' => 'applications/config/schema/PhabricatorConfigKeySchema.php',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigListController' => 'applications/config/controller/PhabricatorConfigListController.php',
|
Add a local configuration source and a non-environmental ENV config source
Summary:
See discussion in T2221. Before we can move configuration to the database, we have a bootstrapping problem: we need database credentials to live //somewhere// if we can't guess them (and we can only really guess localhost / root / no password).
Some options for this are:
- Have them live in ENV variables.
- These are often somewhat unfamiliar to users.
- Scripts would become a huge pain -- you'd have to dump a bunch of stuff into ENV.
- Some environments have limited ability to set ENV vars.
- SSH is also a pain.
- Have them live in a normal config file.
- This probably isn't really too awful, but:
- Since we deploy/upgrade with git, we can't currently let them edit a file which already exists, or their working copy will become dirty.
- So they have to copy or create a file, then edit it.
- The biggest issue I have with this is that it will be difficult to give specific, easily-followed directions from Setup. The instructions need to be like "Copy template.conf.php to real.conf.php, then edit these keys: x, y, z". This isn't as easy to follow as "run script Y".
- Have them live in an abnormal config file with script access (this diff).
- I think this is a little better than a normal config file, because we can tell users 'run phabricator/bin/config set mysql.user phabricator' and such, which is easier to follow than editing a config file.
I think this is only a marginal improvement over a normal config file and am open to arguments against this approach, but I think it will be a little easier for users to deal with than a normal config file. In most cases they should only need to store three values in this file -- db user/host/pass -- since once we have those we can bootstrap everything else. Normal config files also aren't going away for more advanced users, we're just offering a simple alternative for most users.
This also adds an ENVIRONMENT file as an alternative to PHABRICATOR_ENV. This is just a simple way to specify the environment if you don't have convenient access to env vars.
Test Plan: Ran `config set x y`, verified writes. Wrote to ENVIRONMENT, ran `PHABRICATOR_ENV= ./bin/repository`.
Reviewers: btrahan, vrana, codeblock
Reviewed By: codeblock
CC: aran
Maniphest Tasks: T2221
Differential Revision: https://secure.phabricator.com/D4294
2012-12-30 15:16:15 +01:00
|
|
|
'PhabricatorConfigLocalSource' => 'infrastructure/env/PhabricatorConfigLocalSource.php',
|
2013-01-22 00:27:42 +01:00
|
|
|
'PhabricatorConfigManagementDeleteWorkflow' => 'applications/config/management/PhabricatorConfigManagementDeleteWorkflow.php',
|
|
|
|
'PhabricatorConfigManagementGetWorkflow' => 'applications/config/management/PhabricatorConfigManagementGetWorkflow.php',
|
|
|
|
'PhabricatorConfigManagementListWorkflow' => 'applications/config/management/PhabricatorConfigManagementListWorkflow.php',
|
2014-10-09 01:15:05 +02:00
|
|
|
'PhabricatorConfigManagementMigrateWorkflow' => 'applications/config/management/PhabricatorConfigManagementMigrateWorkflow.php',
|
2013-01-22 00:27:42 +01:00
|
|
|
'PhabricatorConfigManagementSetWorkflow' => 'applications/config/management/PhabricatorConfigManagementSetWorkflow.php',
|
|
|
|
'PhabricatorConfigManagementWorkflow' => 'applications/config/management/PhabricatorConfigManagementWorkflow.php',
|
2015-07-21 02:08:37 +02:00
|
|
|
'PhabricatorConfigModule' => 'applications/config/module/PhabricatorConfigModule.php',
|
|
|
|
'PhabricatorConfigModuleController' => 'applications/config/controller/PhabricatorConfigModuleController.php',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorConfigOption' => 'applications/config/option/PhabricatorConfigOption.php',
|
2013-06-07 21:36:18 +02:00
|
|
|
'PhabricatorConfigOptionType' => 'applications/config/custom/PhabricatorConfigOptionType.php',
|
2015-07-21 02:08:37 +02:00
|
|
|
'PhabricatorConfigPHIDModule' => 'applications/config/module/PhabricatorConfigPHIDModule.php',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigProxySource' => 'infrastructure/env/PhabricatorConfigProxySource.php',
|
2015-09-10 23:18:52 +02:00
|
|
|
'PhabricatorConfigPurgeCacheController' => 'applications/config/controller/PhabricatorConfigPurgeCacheController.php',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorConfigRequestExceptionHandlerModule' => 'applications/config/module/PhabricatorConfigRequestExceptionHandlerModule.php',
|
2013-01-23 00:16:26 +01:00
|
|
|
'PhabricatorConfigResponse' => 'applications/config/response/PhabricatorConfigResponse.php',
|
2014-09-18 17:22:18 +02:00
|
|
|
'PhabricatorConfigSchemaQuery' => 'applications/config/schema/PhabricatorConfigSchemaQuery.php',
|
2014-09-18 17:22:54 +02:00
|
|
|
'PhabricatorConfigSchemaSpec' => 'applications/config/schema/PhabricatorConfigSchemaSpec.php',
|
2014-09-18 17:22:18 +02:00
|
|
|
'PhabricatorConfigServerSchema' => 'applications/config/schema/PhabricatorConfigServerSchema.php',
|
2015-07-21 02:08:37 +02:00
|
|
|
'PhabricatorConfigSiteModule' => 'applications/config/module/PhabricatorConfigSiteModule.php',
|
2014-11-06 00:30:40 +01:00
|
|
|
'PhabricatorConfigSiteSource' => 'infrastructure/env/PhabricatorConfigSiteSource.php',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigSource' => 'infrastructure/env/PhabricatorConfigSource.php',
|
|
|
|
'PhabricatorConfigStackSource' => 'infrastructure/env/PhabricatorConfigStackSource.php',
|
2014-09-18 17:22:54 +02:00
|
|
|
'PhabricatorConfigStorageSchema' => 'applications/config/schema/PhabricatorConfigStorageSchema.php',
|
2014-09-18 17:22:18 +02:00
|
|
|
'PhabricatorConfigTableSchema' => 'applications/config/schema/PhabricatorConfigTableSchema.php',
|
2013-01-02 03:14:41 +01:00
|
|
|
'PhabricatorConfigTransaction' => 'applications/config/storage/PhabricatorConfigTransaction.php',
|
|
|
|
'PhabricatorConfigTransactionQuery' => 'applications/config/query/PhabricatorConfigTransactionQuery.php',
|
2013-01-02 03:15:03 +01:00
|
|
|
'PhabricatorConfigValidationException' => 'applications/config/exception/PhabricatorConfigValidationException.php',
|
2015-10-24 17:13:22 +02:00
|
|
|
'PhabricatorConfigVersionsModule' => 'applications/config/module/PhabricatorConfigVersionsModule.php',
|
2014-06-23 18:37:51 +02:00
|
|
|
'PhabricatorConfigWelcomeController' => 'applications/config/controller/PhabricatorConfigWelcomeController.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorConpherenceApplication' => 'applications/conpherence/application/PhabricatorConpherenceApplication.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorConpherencePreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorConpherencePreferencesSettingsPanel.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorConpherenceThreadPHIDType' => 'applications/conpherence/phid/PhabricatorConpherenceThreadPHIDType.php',
|
2014-10-13 20:17:09 +02:00
|
|
|
'PhabricatorConsoleApplication' => 'applications/console/application/PhabricatorConsoleApplication.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorConsoleContentSource' => 'infrastructure/contentsource/PhabricatorConsoleContentSource.php',
|
|
|
|
'PhabricatorContentSource' => 'infrastructure/contentsource/PhabricatorContentSource.php',
|
|
|
|
'PhabricatorContentSourceModule' => 'infrastructure/contentsource/PhabricatorContentSourceModule.php',
|
|
|
|
'PhabricatorContentSourceView' => 'infrastructure/contentsource/PhabricatorContentSourceView.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorContributedToObjectEdgeType' => 'applications/transactions/edges/PhabricatorContributedToObjectEdgeType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorController' => 'applications/base/controller/PhabricatorController.php',
|
2014-01-23 23:01:35 +01:00
|
|
|
'PhabricatorCookies' => 'applications/auth/constants/PhabricatorCookies.php',
|
2013-01-02 03:22:48 +01:00
|
|
|
'PhabricatorCoreConfigOptions' => 'applications/config/option/PhabricatorCoreConfigOptions.php',
|
2013-05-04 00:49:29 +02:00
|
|
|
'PhabricatorCountdown' => 'applications/countdown/storage/PhabricatorCountdown.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorCountdownApplication' => 'applications/countdown/application/PhabricatorCountdownApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCountdownController' => 'applications/countdown/controller/PhabricatorCountdownController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorCountdownCountdownPHIDType' => 'applications/countdown/phid/PhabricatorCountdownCountdownPHIDType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCountdownDAO' => 'applications/countdown/storage/PhabricatorCountdownDAO.php',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorCountdownDefaultEditCapability' => 'applications/countdown/capability/PhabricatorCountdownDefaultEditCapability.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhabricatorCountdownDefaultViewCapability' => 'applications/countdown/capability/PhabricatorCountdownDefaultViewCapability.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCountdownDeleteController' => 'applications/countdown/controller/PhabricatorCountdownDeleteController.php',
|
|
|
|
'PhabricatorCountdownEditController' => 'applications/countdown/controller/PhabricatorCountdownEditController.php',
|
2016-04-07 20:06:26 +02:00
|
|
|
'PhabricatorCountdownEditEngine' => 'applications/countdown/editor/PhabricatorCountdownEditEngine.php',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorCountdownEditor' => 'applications/countdown/editor/PhabricatorCountdownEditor.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCountdownListController' => 'applications/countdown/controller/PhabricatorCountdownListController.php',
|
2015-07-26 00:47:07 +02:00
|
|
|
'PhabricatorCountdownMailReceiver' => 'applications/countdown/mail/PhabricatorCountdownMailReceiver.php',
|
2013-07-22 23:42:25 +02:00
|
|
|
'PhabricatorCountdownQuery' => 'applications/countdown/query/PhabricatorCountdownQuery.php',
|
2013-02-26 23:57:41 +01:00
|
|
|
'PhabricatorCountdownRemarkupRule' => 'applications/countdown/remarkup/PhabricatorCountdownRemarkupRule.php',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorCountdownReplyHandler' => 'applications/countdown/mail/PhabricatorCountdownReplyHandler.php',
|
|
|
|
'PhabricatorCountdownSchemaSpec' => 'applications/countdown/storage/PhabricatorCountdownSchemaSpec.php',
|
2013-07-23 15:16:19 +02:00
|
|
|
'PhabricatorCountdownSearchEngine' => 'applications/countdown/query/PhabricatorCountdownSearchEngine.php',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorCountdownTransaction' => 'applications/countdown/storage/PhabricatorCountdownTransaction.php',
|
2015-07-25 00:40:55 +02:00
|
|
|
'PhabricatorCountdownTransactionComment' => 'applications/countdown/storage/PhabricatorCountdownTransactionComment.php',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorCountdownTransactionQuery' => 'applications/countdown/query/PhabricatorCountdownTransactionQuery.php',
|
2013-07-23 15:16:19 +02:00
|
|
|
'PhabricatorCountdownView' => 'applications/countdown/view/PhabricatorCountdownView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCountdownViewController' => 'applications/countdown/controller/PhabricatorCountdownViewController.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorCredentialsUsedByObjectEdgeType' => 'applications/passphrase/edge/PhabricatorCredentialsUsedByObjectEdgeType.php',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorCursorPagedPolicyAwareQuery' => 'infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php',
|
Begin generalizing custom fields
Summary:
Ref T1703. We have currently have two custom field implementations (Maniphest, Differential) and are about to add a third (User, see D6122). I'd like to generalize custom fields before doing a third implementation, so we don't back ourselves into the ApplicationTransactions corner we have with Maniphest/Differential/Audit.
For the most part, the existing custom fields work well and can be directly generalized. There are three specific things I want to improve, though:
- Integration with ApplicationSearch: Custom fields aren't indexable. ApplicationSearch is now online and seems stable and good. D5278 provides a template for a backend which can integrate with ApplicationSearch, and ApplicationSearch solves many of the other UI problems implied by exposing custom fields into search (principally, giant pages full of query fields). Generally, I want to provide stronger builtin integration between custom fields and ApplicationSearch.
- Integration with ApplicationTransactions: Likewise, custom fields should support more native integrations with ApplicationTransactions, which are also online and seem stable and well designed.
- Selection and sorting: Selecting and sorting custom fields is a huge mess right now. I want to move this into config now that we have the UI to support it, and move away from requiring users to subclass a ton of stuff just to add a field.
For ApplicationSearch, I've adopted and generalized D5278.
For ApplicationTransactions, I haven't made any specific affordances yet.
For selection and sorting, I've partially implemented config-based selection and sorting. It will work like this:
- We add a new configuration value, like `differential.fields`. In the UI, this is a draggable list of supported fields. Fields can be reordered, and most fields can be disabled.
- We load every avialable field to populate this list. New fields will appear at the bottom.
- There are two downsides to this approach:
- If we add fields in the upstream at a later date, they will appear at the end of the list if an install has customized list order or disabled fields, even if we insert them elsewhere in the upstream.
- If we reorder fields in the upstream, the reordering will not be reflected in install which have customized the order/availability.
- I think these are both acceptable costs. We only incur them if an admin edits this config, which implies they'll know how to fix it if they want to.
- We can fix both of these problems with a straightforward configuration migration if we want to bother.
- There are numerous upsides to this approach:
- We can delete a bunch of code and replace it with simple configuration.
- In general, we don't need the "selector" classes anymore.
- Users can enable available-but-disabled fields with one click.
- Users can add fields by putting their implementations in `src/extensions/` with zero subclassing or libphutil stuff.
- Generally, it's super easy for users to understand.
This doesn't actually do anything yet and will probably see some adjustments before anything starts running it.
Test Plan: Static checks only, this code isn't reachable yet.
Reviewers: chad, seporaitis
Reviewed By: chad
CC: aran
Maniphest Tasks: T1703
Differential Revision: https://secure.phabricator.com/D6147
2013-06-06 23:52:40 +02:00
|
|
|
'PhabricatorCustomField' => 'infrastructure/customfield/field/PhabricatorCustomField.php',
|
2013-08-14 18:53:59 +02:00
|
|
|
'PhabricatorCustomFieldAttachment' => 'infrastructure/customfield/field/PhabricatorCustomFieldAttachment.php',
|
2013-06-07 21:36:18 +02:00
|
|
|
'PhabricatorCustomFieldConfigOptionType' => 'infrastructure/customfield/config/PhabricatorCustomFieldConfigOptionType.php',
|
Begin generalizing custom fields
Summary:
Ref T1703. We have currently have two custom field implementations (Maniphest, Differential) and are about to add a third (User, see D6122). I'd like to generalize custom fields before doing a third implementation, so we don't back ourselves into the ApplicationTransactions corner we have with Maniphest/Differential/Audit.
For the most part, the existing custom fields work well and can be directly generalized. There are three specific things I want to improve, though:
- Integration with ApplicationSearch: Custom fields aren't indexable. ApplicationSearch is now online and seems stable and good. D5278 provides a template for a backend which can integrate with ApplicationSearch, and ApplicationSearch solves many of the other UI problems implied by exposing custom fields into search (principally, giant pages full of query fields). Generally, I want to provide stronger builtin integration between custom fields and ApplicationSearch.
- Integration with ApplicationTransactions: Likewise, custom fields should support more native integrations with ApplicationTransactions, which are also online and seem stable and well designed.
- Selection and sorting: Selecting and sorting custom fields is a huge mess right now. I want to move this into config now that we have the UI to support it, and move away from requiring users to subclass a ton of stuff just to add a field.
For ApplicationSearch, I've adopted and generalized D5278.
For ApplicationTransactions, I haven't made any specific affordances yet.
For selection and sorting, I've partially implemented config-based selection and sorting. It will work like this:
- We add a new configuration value, like `differential.fields`. In the UI, this is a draggable list of supported fields. Fields can be reordered, and most fields can be disabled.
- We load every avialable field to populate this list. New fields will appear at the bottom.
- There are two downsides to this approach:
- If we add fields in the upstream at a later date, they will appear at the end of the list if an install has customized list order or disabled fields, even if we insert them elsewhere in the upstream.
- If we reorder fields in the upstream, the reordering will not be reflected in install which have customized the order/availability.
- I think these are both acceptable costs. We only incur them if an admin edits this config, which implies they'll know how to fix it if they want to.
- We can fix both of these problems with a straightforward configuration migration if we want to bother.
- There are numerous upsides to this approach:
- We can delete a bunch of code and replace it with simple configuration.
- In general, we don't need the "selector" classes anymore.
- Users can enable available-but-disabled fields with one click.
- Users can add fields by putting their implementations in `src/extensions/` with zero subclassing or libphutil stuff.
- Generally, it's super easy for users to understand.
This doesn't actually do anything yet and will probably see some adjustments before anything starts running it.
Test Plan: Static checks only, this code isn't reachable yet.
Reviewers: chad, seporaitis
Reviewed By: chad
CC: aran
Maniphest Tasks: T1703
Differential Revision: https://secure.phabricator.com/D6147
2013-06-06 23:52:40 +02:00
|
|
|
'PhabricatorCustomFieldDataNotAvailableException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldDataNotAvailableException.php',
|
2015-12-13 01:25:51 +01:00
|
|
|
'PhabricatorCustomFieldEditEngineExtension' => 'infrastructure/customfield/engineextension/PhabricatorCustomFieldEditEngineExtension.php',
|
2015-11-29 19:47:16 +01:00
|
|
|
'PhabricatorCustomFieldEditField' => 'infrastructure/customfield/editor/PhabricatorCustomFieldEditField.php',
|
|
|
|
'PhabricatorCustomFieldEditType' => 'infrastructure/customfield/editor/PhabricatorCustomFieldEditType.php',
|
2015-12-21 15:31:31 +01:00
|
|
|
'PhabricatorCustomFieldFulltextEngineExtension' => 'infrastructure/customfield/engineextension/PhabricatorCustomFieldFulltextEngineExtension.php',
|
2015-07-06 22:15:58 +02:00
|
|
|
'PhabricatorCustomFieldHeraldField' => 'infrastructure/customfield/herald/PhabricatorCustomFieldHeraldField.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'PhabricatorCustomFieldHeraldFieldGroup' => 'infrastructure/customfield/herald/PhabricatorCustomFieldHeraldFieldGroup.php',
|
Begin generalizing custom fields
Summary:
Ref T1703. We have currently have two custom field implementations (Maniphest, Differential) and are about to add a third (User, see D6122). I'd like to generalize custom fields before doing a third implementation, so we don't back ourselves into the ApplicationTransactions corner we have with Maniphest/Differential/Audit.
For the most part, the existing custom fields work well and can be directly generalized. There are three specific things I want to improve, though:
- Integration with ApplicationSearch: Custom fields aren't indexable. ApplicationSearch is now online and seems stable and good. D5278 provides a template for a backend which can integrate with ApplicationSearch, and ApplicationSearch solves many of the other UI problems implied by exposing custom fields into search (principally, giant pages full of query fields). Generally, I want to provide stronger builtin integration between custom fields and ApplicationSearch.
- Integration with ApplicationTransactions: Likewise, custom fields should support more native integrations with ApplicationTransactions, which are also online and seem stable and well designed.
- Selection and sorting: Selecting and sorting custom fields is a huge mess right now. I want to move this into config now that we have the UI to support it, and move away from requiring users to subclass a ton of stuff just to add a field.
For ApplicationSearch, I've adopted and generalized D5278.
For ApplicationTransactions, I haven't made any specific affordances yet.
For selection and sorting, I've partially implemented config-based selection and sorting. It will work like this:
- We add a new configuration value, like `differential.fields`. In the UI, this is a draggable list of supported fields. Fields can be reordered, and most fields can be disabled.
- We load every avialable field to populate this list. New fields will appear at the bottom.
- There are two downsides to this approach:
- If we add fields in the upstream at a later date, they will appear at the end of the list if an install has customized list order or disabled fields, even if we insert them elsewhere in the upstream.
- If we reorder fields in the upstream, the reordering will not be reflected in install which have customized the order/availability.
- I think these are both acceptable costs. We only incur them if an admin edits this config, which implies they'll know how to fix it if they want to.
- We can fix both of these problems with a straightforward configuration migration if we want to bother.
- There are numerous upsides to this approach:
- We can delete a bunch of code and replace it with simple configuration.
- In general, we don't need the "selector" classes anymore.
- Users can enable available-but-disabled fields with one click.
- Users can add fields by putting their implementations in `src/extensions/` with zero subclassing or libphutil stuff.
- Generally, it's super easy for users to understand.
This doesn't actually do anything yet and will probably see some adjustments before anything starts running it.
Test Plan: Static checks only, this code isn't reachable yet.
Reviewers: chad, seporaitis
Reviewed By: chad
CC: aran
Maniphest Tasks: T1703
Differential Revision: https://secure.phabricator.com/D6147
2013-06-06 23:52:40 +02:00
|
|
|
'PhabricatorCustomFieldImplementationIncompleteException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldImplementationIncompleteException.php',
|
|
|
|
'PhabricatorCustomFieldIndexStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldIndexStorage.php',
|
2013-06-06 23:53:07 +02:00
|
|
|
'PhabricatorCustomFieldInterface' => 'infrastructure/customfield/interface/PhabricatorCustomFieldInterface.php',
|
Support configuration-driven custom fields
Summary:
Ref T1702. Ref T3718. There are a couple of things going on here:
**PhabricatorCustomFieldList**: I added `PhabricatorCustomFieldList`, which is just a convenience class for dealing with lists of fields. Often, current field code does something like this inline in a Controller:
foreach ($fields as $field) {
// do some junk
}
Often, that junk has some slightly subtle implications. Move all of it to `$list->doSomeJunk()` methods (like `appendFieldsToForm()`, `loadFieldsFromStorage()`) to reduce code duplication and prevent errors. This additionally moves an existing list-convenience method there, out of `PhabricatorPropertyListView`.
**PhabricatorUserConfiguredCustomFieldStorage**: Adds `PhabricatorUserConfiguredCustomFieldStorage` for storing custom field data (like "ICQ Handle", "Phone Number", "Desk", "Favorite Flower", etc).
**Configuration-Driven Custom Fields**: Previously, I was thinking about doing these with interfaces, but as I thought about it more I started to dislike that approach. Instead, I built proxies into `PhabricatorCustomField`. Basically, this means that fields (like a custom, configuration-driven "Favorite Flower" field) can just use some other Field to actually provide their implementation (like a "standard" field which knows how to render text areas). The previous approach would have involed subclasssing the "standard" field and implementing an interface, but that would mean that every application would have at least two "base" fields and generally just seemed bleh as I worked through it.
The cost of this approach is that we need a bunch of `proxy` junk in the base class, but that's a one-time cost and I think it simplifies all the implementations and makes them a lot less magical (e.g., all of the custom fields now extend the right base field classes).
**Fixed Some Bugs**: Some of this code hadn't really been run yet and had minor bugs.
Test Plan:
{F54240}
{F54241}
{F54242}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1702, T1703, T3718
Differential Revision: https://secure.phabricator.com/D6749
2013-08-14 17:10:16 +02:00
|
|
|
'PhabricatorCustomFieldList' => 'infrastructure/customfield/field/PhabricatorCustomFieldList.php',
|
Modularize parser for "Closes task X as Y"
Summary:
Ref T3886. Ref T3872. Ref T1812. We have several parsers which look for textual references to other objects, like:
Closes Tx.
Depends on Dy.
Reverts Dz.
Currently, these are pretty hard coded, don't get all the edge cases right, and don't generalize well. They're also implemented in the middle of Differential's field code. So I want to:
- Share more code so that, e.g., "Tx, Ty" always works (only some rules support it right now);
- fix bugs in the parser, like T3872;
- make this a modular, extensible process which runs against custom fields, not a builtin part of fields;
- make the internals more flexible to accommodate custom stuff like T1812.
This implements the "Verbs optional-noun Object, Optional Other Objects optional-as-something." grammar in a general way so subclasses can just plug in their keywords. Runtime code doesn't touch this yet.
Test Plan: Ran unit tests.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3872, T1812, T3886
Differential Revision: https://secure.phabricator.com/D8261
2014-02-18 00:53:47 +01:00
|
|
|
'PhabricatorCustomFieldMonogramParser' => 'infrastructure/customfield/parser/PhabricatorCustomFieldMonogramParser.php',
|
2013-06-06 23:53:07 +02:00
|
|
|
'PhabricatorCustomFieldNotAttachedException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldNotAttachedException.php',
|
Support configuration-driven custom fields
Summary:
Ref T1702. Ref T3718. There are a couple of things going on here:
**PhabricatorCustomFieldList**: I added `PhabricatorCustomFieldList`, which is just a convenience class for dealing with lists of fields. Often, current field code does something like this inline in a Controller:
foreach ($fields as $field) {
// do some junk
}
Often, that junk has some slightly subtle implications. Move all of it to `$list->doSomeJunk()` methods (like `appendFieldsToForm()`, `loadFieldsFromStorage()`) to reduce code duplication and prevent errors. This additionally moves an existing list-convenience method there, out of `PhabricatorPropertyListView`.
**PhabricatorUserConfiguredCustomFieldStorage**: Adds `PhabricatorUserConfiguredCustomFieldStorage` for storing custom field data (like "ICQ Handle", "Phone Number", "Desk", "Favorite Flower", etc).
**Configuration-Driven Custom Fields**: Previously, I was thinking about doing these with interfaces, but as I thought about it more I started to dislike that approach. Instead, I built proxies into `PhabricatorCustomField`. Basically, this means that fields (like a custom, configuration-driven "Favorite Flower" field) can just use some other Field to actually provide their implementation (like a "standard" field which knows how to render text areas). The previous approach would have involed subclasssing the "standard" field and implementing an interface, but that would mean that every application would have at least two "base" fields and generally just seemed bleh as I worked through it.
The cost of this approach is that we need a bunch of `proxy` junk in the base class, but that's a one-time cost and I think it simplifies all the implementations and makes them a lot less magical (e.g., all of the custom fields now extend the right base field classes).
**Fixed Some Bugs**: Some of this code hadn't really been run yet and had minor bugs.
Test Plan:
{F54240}
{F54241}
{F54242}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1702, T1703, T3718
Differential Revision: https://secure.phabricator.com/D6749
2013-08-14 17:10:16 +02:00
|
|
|
'PhabricatorCustomFieldNotProxyException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldNotProxyException.php',
|
Begin generalizing custom fields
Summary:
Ref T1703. We have currently have two custom field implementations (Maniphest, Differential) and are about to add a third (User, see D6122). I'd like to generalize custom fields before doing a third implementation, so we don't back ourselves into the ApplicationTransactions corner we have with Maniphest/Differential/Audit.
For the most part, the existing custom fields work well and can be directly generalized. There are three specific things I want to improve, though:
- Integration with ApplicationSearch: Custom fields aren't indexable. ApplicationSearch is now online and seems stable and good. D5278 provides a template for a backend which can integrate with ApplicationSearch, and ApplicationSearch solves many of the other UI problems implied by exposing custom fields into search (principally, giant pages full of query fields). Generally, I want to provide stronger builtin integration between custom fields and ApplicationSearch.
- Integration with ApplicationTransactions: Likewise, custom fields should support more native integrations with ApplicationTransactions, which are also online and seem stable and well designed.
- Selection and sorting: Selecting and sorting custom fields is a huge mess right now. I want to move this into config now that we have the UI to support it, and move away from requiring users to subclass a ton of stuff just to add a field.
For ApplicationSearch, I've adopted and generalized D5278.
For ApplicationTransactions, I haven't made any specific affordances yet.
For selection and sorting, I've partially implemented config-based selection and sorting. It will work like this:
- We add a new configuration value, like `differential.fields`. In the UI, this is a draggable list of supported fields. Fields can be reordered, and most fields can be disabled.
- We load every avialable field to populate this list. New fields will appear at the bottom.
- There are two downsides to this approach:
- If we add fields in the upstream at a later date, they will appear at the end of the list if an install has customized list order or disabled fields, even if we insert them elsewhere in the upstream.
- If we reorder fields in the upstream, the reordering will not be reflected in install which have customized the order/availability.
- I think these are both acceptable costs. We only incur them if an admin edits this config, which implies they'll know how to fix it if they want to.
- We can fix both of these problems with a straightforward configuration migration if we want to bother.
- There are numerous upsides to this approach:
- We can delete a bunch of code and replace it with simple configuration.
- In general, we don't need the "selector" classes anymore.
- Users can enable available-but-disabled fields with one click.
- Users can add fields by putting their implementations in `src/extensions/` with zero subclassing or libphutil stuff.
- Generally, it's super easy for users to understand.
This doesn't actually do anything yet and will probably see some adjustments before anything starts running it.
Test Plan: Static checks only, this code isn't reachable yet.
Reviewers: chad, seporaitis
Reviewed By: chad
CC: aran
Maniphest Tasks: T1703
Differential Revision: https://secure.phabricator.com/D6147
2013-06-06 23:52:40 +02:00
|
|
|
'PhabricatorCustomFieldNumericIndexStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldNumericIndexStorage.php',
|
2015-12-13 01:25:51 +01:00
|
|
|
'PhabricatorCustomFieldSearchEngineExtension' => 'infrastructure/customfield/engineextension/PhabricatorCustomFieldSearchEngineExtension.php',
|
Begin generalizing custom fields
Summary:
Ref T1703. We have currently have two custom field implementations (Maniphest, Differential) and are about to add a third (User, see D6122). I'd like to generalize custom fields before doing a third implementation, so we don't back ourselves into the ApplicationTransactions corner we have with Maniphest/Differential/Audit.
For the most part, the existing custom fields work well and can be directly generalized. There are three specific things I want to improve, though:
- Integration with ApplicationSearch: Custom fields aren't indexable. ApplicationSearch is now online and seems stable and good. D5278 provides a template for a backend which can integrate with ApplicationSearch, and ApplicationSearch solves many of the other UI problems implied by exposing custom fields into search (principally, giant pages full of query fields). Generally, I want to provide stronger builtin integration between custom fields and ApplicationSearch.
- Integration with ApplicationTransactions: Likewise, custom fields should support more native integrations with ApplicationTransactions, which are also online and seem stable and well designed.
- Selection and sorting: Selecting and sorting custom fields is a huge mess right now. I want to move this into config now that we have the UI to support it, and move away from requiring users to subclass a ton of stuff just to add a field.
For ApplicationSearch, I've adopted and generalized D5278.
For ApplicationTransactions, I haven't made any specific affordances yet.
For selection and sorting, I've partially implemented config-based selection and sorting. It will work like this:
- We add a new configuration value, like `differential.fields`. In the UI, this is a draggable list of supported fields. Fields can be reordered, and most fields can be disabled.
- We load every avialable field to populate this list. New fields will appear at the bottom.
- There are two downsides to this approach:
- If we add fields in the upstream at a later date, they will appear at the end of the list if an install has customized list order or disabled fields, even if we insert them elsewhere in the upstream.
- If we reorder fields in the upstream, the reordering will not be reflected in install which have customized the order/availability.
- I think these are both acceptable costs. We only incur them if an admin edits this config, which implies they'll know how to fix it if they want to.
- We can fix both of these problems with a straightforward configuration migration if we want to bother.
- There are numerous upsides to this approach:
- We can delete a bunch of code and replace it with simple configuration.
- In general, we don't need the "selector" classes anymore.
- Users can enable available-but-disabled fields with one click.
- Users can add fields by putting their implementations in `src/extensions/` with zero subclassing or libphutil stuff.
- Generally, it's super easy for users to understand.
This doesn't actually do anything yet and will probably see some adjustments before anything starts running it.
Test Plan: Static checks only, this code isn't reachable yet.
Reviewers: chad, seporaitis
Reviewed By: chad
CC: aran
Maniphest Tasks: T1703
Differential Revision: https://secure.phabricator.com/D6147
2013-06-06 23:52:40 +02:00
|
|
|
'PhabricatorCustomFieldStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldStorage.php',
|
|
|
|
'PhabricatorCustomFieldStringIndexStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldStringIndexStorage.php',
|
2015-02-25 21:00:36 +01:00
|
|
|
'PhabricatorCustomHeaderConfigType' => 'applications/config/custom/PhabricatorCustomHeaderConfigType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDaemon' => 'infrastructure/daemon/PhabricatorDaemon.php',
|
2016-04-15 21:00:34 +02:00
|
|
|
'PhabricatorDaemonBulkJobController' => 'applications/daemon/controller/PhabricatorDaemonBulkJobController.php',
|
2015-06-23 22:36:16 +02:00
|
|
|
'PhabricatorDaemonBulkJobListController' => 'applications/daemon/controller/PhabricatorDaemonBulkJobListController.php',
|
|
|
|
'PhabricatorDaemonBulkJobMonitorController' => 'applications/daemon/controller/PhabricatorDaemonBulkJobMonitorController.php',
|
|
|
|
'PhabricatorDaemonBulkJobViewController' => 'applications/daemon/controller/PhabricatorDaemonBulkJobViewController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDaemonConsoleController' => 'applications/daemon/controller/PhabricatorDaemonConsoleController.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorDaemonContentSource' => 'infrastructure/daemon/contentsource/PhabricatorDaemonContentSource.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDaemonController' => 'applications/daemon/controller/PhabricatorDaemonController.php',
|
2013-07-23 21:11:34 +02:00
|
|
|
'PhabricatorDaemonDAO' => 'applications/daemon/storage/PhabricatorDaemonDAO.php',
|
2013-07-23 21:10:02 +02:00
|
|
|
'PhabricatorDaemonEventListener' => 'applications/daemon/event/PhabricatorDaemonEventListener.php',
|
2013-07-23 21:11:34 +02:00
|
|
|
'PhabricatorDaemonLog' => 'applications/daemon/storage/PhabricatorDaemonLog.php',
|
|
|
|
'PhabricatorDaemonLogEvent' => 'applications/daemon/storage/PhabricatorDaemonLogEvent.php',
|
2014-06-18 00:33:08 +02:00
|
|
|
'PhabricatorDaemonLogEventGarbageCollector' => 'applications/daemon/garbagecollector/PhabricatorDaemonLogEventGarbageCollector.php',
|
2013-07-23 21:30:58 +02:00
|
|
|
'PhabricatorDaemonLogEventViewController' => 'applications/daemon/controller/PhabricatorDaemonLogEventViewController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDaemonLogEventsView' => 'applications/daemon/view/PhabricatorDaemonLogEventsView.php',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorDaemonLogGarbageCollector' => 'applications/daemon/garbagecollector/PhabricatorDaemonLogGarbageCollector.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDaemonLogListController' => 'applications/daemon/controller/PhabricatorDaemonLogListController.php',
|
|
|
|
'PhabricatorDaemonLogListView' => 'applications/daemon/view/PhabricatorDaemonLogListView.php',
|
2013-07-23 21:10:41 +02:00
|
|
|
'PhabricatorDaemonLogQuery' => 'applications/daemon/query/PhabricatorDaemonLogQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDaemonLogViewController' => 'applications/daemon/controller/PhabricatorDaemonLogViewController.php',
|
2013-07-19 00:28:56 +02:00
|
|
|
'PhabricatorDaemonManagementDebugWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementDebugWorkflow.php',
|
|
|
|
'PhabricatorDaemonManagementLaunchWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementLaunchWorkflow.php',
|
|
|
|
'PhabricatorDaemonManagementListWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementListWorkflow.php',
|
2013-07-23 21:48:45 +02:00
|
|
|
'PhabricatorDaemonManagementLogWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementLogWorkflow.php',
|
2015-02-27 20:38:42 +01:00
|
|
|
'PhabricatorDaemonManagementReloadWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementReloadWorkflow.php',
|
2013-07-19 00:28:56 +02:00
|
|
|
'PhabricatorDaemonManagementRestartWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementRestartWorkflow.php',
|
|
|
|
'PhabricatorDaemonManagementStartWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementStartWorkflow.php',
|
|
|
|
'PhabricatorDaemonManagementStatusWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementStatusWorkflow.php',
|
|
|
|
'PhabricatorDaemonManagementStopWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementStopWorkflow.php',
|
|
|
|
'PhabricatorDaemonManagementWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementWorkflow.php',
|
2015-11-10 22:34:34 +01:00
|
|
|
'PhabricatorDaemonOverseerModule' => 'infrastructure/daemon/overseer/PhabricatorDaemonOverseerModule.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDaemonReference' => 'infrastructure/daemon/control/PhabricatorDaemonReference.php',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorDaemonTaskGarbageCollector' => 'applications/daemon/garbagecollector/PhabricatorDaemonTaskGarbageCollector.php',
|
2014-12-30 19:00:06 +01:00
|
|
|
'PhabricatorDaemonTasksTableView' => 'applications/daemon/view/PhabricatorDaemonTasksTableView.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDaemonsApplication' => 'applications/daemon/application/PhabricatorDaemonsApplication.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorDaemonsSetupCheck' => 'applications/config/check/PhabricatorDaemonsSetupCheck.php',
|
2015-01-20 01:54:23 +01:00
|
|
|
'PhabricatorDailyRoutineTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorDailyRoutineTriggerClock.php',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboard' => 'applications/dashboard/storage/PhabricatorDashboard.php',
|
2014-04-30 23:28:55 +02:00
|
|
|
'PhabricatorDashboardAddPanelController' => 'applications/dashboard/controller/PhabricatorDashboardAddPanelController.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDashboardApplication' => 'applications/dashboard/application/PhabricatorDashboardApplication.php',
|
2015-12-09 21:17:03 +01:00
|
|
|
'PhabricatorDashboardArchiveController' => 'applications/dashboard/controller/PhabricatorDashboardArchiveController.php',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardController' => 'applications/dashboard/controller/PhabricatorDashboardController.php',
|
2014-06-13 06:49:19 +02:00
|
|
|
'PhabricatorDashboardCopyController' => 'applications/dashboard/controller/PhabricatorDashboardCopyController.php',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardDAO' => 'applications/dashboard/storage/PhabricatorDashboardDAO.php',
|
2015-01-02 00:11:59 +01:00
|
|
|
'PhabricatorDashboardDashboardHasPanelEdgeType' => 'applications/dashboard/edge/PhabricatorDashboardDashboardHasPanelEdgeType.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorDashboardDashboardPHIDType' => 'applications/dashboard/phid/PhabricatorDashboardDashboardPHIDType.php',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardEditController' => 'applications/dashboard/controller/PhabricatorDashboardEditController.php',
|
2014-05-20 01:09:31 +02:00
|
|
|
'PhabricatorDashboardInstall' => 'applications/dashboard/storage/PhabricatorDashboardInstall.php',
|
|
|
|
'PhabricatorDashboardInstallController' => 'applications/dashboard/controller/PhabricatorDashboardInstallController.php',
|
2014-05-16 04:12:40 +02:00
|
|
|
'PhabricatorDashboardLayoutConfig' => 'applications/dashboard/layoutconfig/PhabricatorDashboardLayoutConfig.php',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardListController' => 'applications/dashboard/controller/PhabricatorDashboardListController.php',
|
Make the default view of dashboards be just the dashboard
Summary: Fixes T4985, add manage page, change view page to show only panels. Arguably, PhabricatorDashboardArrangeController is no longer necessary. Also, still trying to figure out if I updated all flows that involve "arrange/{id}". Probably missed some. Also not sure of the Manage Dashboard icon. Please advise.
Test Plan: Create dashboard, add panels, "view/{id}" should show just panels, Manage Dashboard should show timeline and edit links.
Reviewers: #blessed_reviewers, epriestley, chad
Reviewed By: #blessed_reviewers, epriestley
Subscribers: epriestley, Korvin
Maniphest Tasks: T4985
Differential Revision: https://secure.phabricator.com/D9258
2014-05-22 19:59:46 +02:00
|
|
|
'PhabricatorDashboardManageController' => 'applications/dashboard/controller/PhabricatorDashboardManageController.php',
|
2014-05-16 04:12:40 +02:00
|
|
|
'PhabricatorDashboardMovePanelController' => 'applications/dashboard/controller/PhabricatorDashboardMovePanelController.php',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardPanel' => 'applications/dashboard/storage/PhabricatorDashboardPanel.php',
|
2014-07-02 02:50:28 +02:00
|
|
|
'PhabricatorDashboardPanelArchiveController' => 'applications/dashboard/controller/PhabricatorDashboardPanelArchiveController.php',
|
2014-04-30 23:29:41 +02:00
|
|
|
'PhabricatorDashboardPanelCoreCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelCoreCustomField.php',
|
|
|
|
'PhabricatorDashboardPanelCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelCustomField.php',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardPanelEditController' => 'applications/dashboard/controller/PhabricatorDashboardPanelEditController.php',
|
2015-01-02 00:11:59 +01:00
|
|
|
'PhabricatorDashboardPanelHasDashboardEdgeType' => 'applications/dashboard/edge/PhabricatorDashboardPanelHasDashboardEdgeType.php',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardPanelListController' => 'applications/dashboard/controller/PhabricatorDashboardPanelListController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorDashboardPanelPHIDType' => 'applications/dashboard/phid/PhabricatorDashboardPanelPHIDType.php',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardPanelQuery' => 'applications/dashboard/query/PhabricatorDashboardPanelQuery.php',
|
2014-04-30 23:28:37 +02:00
|
|
|
'PhabricatorDashboardPanelRenderController' => 'applications/dashboard/controller/PhabricatorDashboardPanelRenderController.php',
|
|
|
|
'PhabricatorDashboardPanelRenderingEngine' => 'applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php',
|
2014-06-12 22:22:20 +02:00
|
|
|
'PhabricatorDashboardPanelSearchApplicationCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelSearchApplicationCustomField.php',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardPanelSearchEngine' => 'applications/dashboard/query/PhabricatorDashboardPanelSearchEngine.php',
|
2014-06-16 21:27:12 +02:00
|
|
|
'PhabricatorDashboardPanelSearchQueryCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelSearchQueryCustomField.php',
|
2014-06-18 00:32:55 +02:00
|
|
|
'PhabricatorDashboardPanelTabsCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelTabsCustomField.php',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardPanelTransaction' => 'applications/dashboard/storage/PhabricatorDashboardPanelTransaction.php',
|
|
|
|
'PhabricatorDashboardPanelTransactionEditor' => 'applications/dashboard/editor/PhabricatorDashboardPanelTransactionEditor.php',
|
|
|
|
'PhabricatorDashboardPanelTransactionQuery' => 'applications/dashboard/query/PhabricatorDashboardPanelTransactionQuery.php',
|
2014-04-30 23:28:20 +02:00
|
|
|
'PhabricatorDashboardPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardPanelType.php',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardPanelViewController' => 'applications/dashboard/controller/PhabricatorDashboardPanelViewController.php',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardQuery' => 'applications/dashboard/query/PhabricatorDashboardQuery.php',
|
2015-01-04 20:32:07 +01:00
|
|
|
'PhabricatorDashboardQueryPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardQueryPanelType.php',
|
2014-05-20 19:53:27 +02:00
|
|
|
'PhabricatorDashboardRemarkupRule' => 'applications/dashboard/remarkup/PhabricatorDashboardRemarkupRule.php',
|
2014-05-19 23:04:26 +02:00
|
|
|
'PhabricatorDashboardRemovePanelController' => 'applications/dashboard/controller/PhabricatorDashboardRemovePanelController.php',
|
2014-04-30 23:29:14 +02:00
|
|
|
'PhabricatorDashboardRenderingEngine' => 'applications/dashboard/engine/PhabricatorDashboardRenderingEngine.php',
|
2014-09-18 20:15:38 +02:00
|
|
|
'PhabricatorDashboardSchemaSpec' => 'applications/dashboard/storage/PhabricatorDashboardSchemaSpec.php',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardSearchEngine' => 'applications/dashboard/query/PhabricatorDashboardSearchEngine.php',
|
2015-01-04 20:32:07 +01:00
|
|
|
'PhabricatorDashboardTabsPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardTabsPanelType.php',
|
|
|
|
'PhabricatorDashboardTextPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardTextPanelType.php',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardTransaction' => 'applications/dashboard/storage/PhabricatorDashboardTransaction.php',
|
|
|
|
'PhabricatorDashboardTransactionEditor' => 'applications/dashboard/editor/PhabricatorDashboardTransactionEditor.php',
|
|
|
|
'PhabricatorDashboardTransactionQuery' => 'applications/dashboard/query/PhabricatorDashboardTransactionQuery.php',
|
2014-05-20 01:09:31 +02:00
|
|
|
'PhabricatorDashboardUninstallController' => 'applications/dashboard/controller/PhabricatorDashboardUninstallController.php',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardViewController' => 'applications/dashboard/controller/PhabricatorDashboardViewController.php',
|
2015-04-07 23:38:03 +02:00
|
|
|
'PhabricatorDataCacheSpec' => 'applications/cache/spec/PhabricatorDataCacheSpec.php',
|
2013-07-21 18:27:00 +02:00
|
|
|
'PhabricatorDataNotAttachedException' => 'infrastructure/storage/lisk/PhabricatorDataNotAttachedException.php',
|
Automatically sever databases after prolonged unreachability
Summary:
Ref T4571. When a database goes down briefly, we fall back to replicas.
However, this fallback is slow (not good for users) and keeps sending a lot of traffic to the master (might be bad if the root cause is load-related).
Keep track of recent connections and fully degrade into "severed" mode if we see a sequence of failures over a reasonable period of time. In this mode, we send much less traffic to the master (faster for users; less load for the database).
We do send a little bit of traffic still, and if the master recovers we'll recover back into normal mode seeing several connections in a row succeed.
This is similar to what most load balancers do when pulling web servers in and out of pools.
For now, the specific numbers are:
- We do at most one health check every 3 seconds.
- If 5 checks in a row fail or succeed, we sever or un-sever the database (so it takes about 15 seconds to switch modes).
- If the database is currently marked unhealthy, we reduce timeouts and retries when connecting to it.
Test Plan:
- Configured a bad `master`.
- Browsed around for a bit, initially saw "unrechable master" errors.
- After about 15 seconds, saw "major interruption" errors instead.
- Fixed the config for `master`.
- Browsed around for a while longer.
- After about 15 seconds, things recovered.
- Used "Cluster Databases" console to keep an eye on health checks: it now shows how many recent health checks were good:
{F1213397}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4571
Differential Revision: https://secure.phabricator.com/D15677
2016-04-10 23:18:09 +02:00
|
|
|
'PhabricatorDatabaseHealthRecord' => 'infrastructure/cluster/PhabricatorDatabaseHealthRecord.php',
|
2016-04-10 00:21:29 +02:00
|
|
|
'PhabricatorDatabaseRef' => 'infrastructure/cluster/PhabricatorDatabaseRef.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorDatabaseSetupCheck' => 'applications/config/check/PhabricatorDatabaseSetupCheck.php',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorDatasourceEditField' => 'applications/transactions/editfield/PhabricatorDatasourceEditField.php',
|
2015-12-04 18:30:53 +01:00
|
|
|
'PhabricatorDatasourceEditType' => 'applications/transactions/edittype/PhabricatorDatasourceEditType.php',
|
2015-05-17 02:21:37 +02:00
|
|
|
'PhabricatorDateTimeSettingsPanel' => 'applications/settings/panel/PhabricatorDateTimeSettingsPanel.php',
|
2014-03-14 19:53:17 +01:00
|
|
|
'PhabricatorDebugController' => 'applications/system/controller/PhabricatorDebugController.php',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorDefaultRequestExceptionHandler' => 'aphront/handler/PhabricatorDefaultRequestExceptionHandler.php',
|
2016-05-05 03:24:59 +02:00
|
|
|
'PhabricatorDefaultSyntaxStyle' => 'infrastructure/syntax/PhabricatorDefaultSyntaxStyle.php',
|
2015-06-22 22:11:37 +02:00
|
|
|
'PhabricatorDesktopNotificationsSettingsPanel' => 'applications/settings/panel/PhabricatorDesktopNotificationsSettingsPanel.php',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorDestructibleInterface' => 'applications/system/interface/PhabricatorDestructibleInterface.php',
|
2014-05-02 03:23:31 +02:00
|
|
|
'PhabricatorDestructionEngine' => 'applications/system/engine/PhabricatorDestructionEngine.php',
|
2015-12-20 16:44:03 +01:00
|
|
|
'PhabricatorDestructionEngineExtension' => 'applications/system/engine/PhabricatorDestructionEngineExtension.php',
|
|
|
|
'PhabricatorDestructionEngineExtensionModule' => 'applications/system/engine/PhabricatorDestructionEngineExtensionModule.php',
|
2013-01-01 23:09:17 +01:00
|
|
|
'PhabricatorDeveloperConfigOptions' => 'applications/config/option/PhabricatorDeveloperConfigOptions.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorDeveloperPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorDeveloperPreferencesSettingsPanel.php',
|
2015-03-09 20:40:29 +01:00
|
|
|
'PhabricatorDiffInlineCommentQuery' => 'infrastructure/diff/query/PhabricatorDiffInlineCommentQuery.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorDiffPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorDiffPreferencesSettingsPanel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDifferenceEngine' => 'infrastructure/diff/PhabricatorDifferenceEngine.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDifferentialApplication' => 'applications/differential/application/PhabricatorDifferentialApplication.php',
|
2016-01-08 13:59:31 +01:00
|
|
|
'PhabricatorDifferentialAttachCommitWorkflow' => 'applications/differential/management/PhabricatorDifferentialAttachCommitWorkflow.php',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorDifferentialConfigOptions' => 'applications/differential/config/PhabricatorDifferentialConfigOptions.php',
|
2016-01-08 13:35:17 +01:00
|
|
|
'PhabricatorDifferentialExtractWorkflow' => 'applications/differential/management/PhabricatorDifferentialExtractWorkflow.php',
|
|
|
|
'PhabricatorDifferentialManagementWorkflow' => 'applications/differential/management/PhabricatorDifferentialManagementWorkflow.php',
|
2013-05-06 23:11:26 +02:00
|
|
|
'PhabricatorDifferentialRevisionTestDataGenerator' => 'applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDiffusionApplication' => 'applications/diffusion/application/PhabricatorDiffusionApplication.php',
|
2013-01-16 18:08:13 +01:00
|
|
|
'PhabricatorDiffusionConfigOptions' => 'applications/diffusion/config/PhabricatorDiffusionConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDisabledUserController' => 'applications/auth/controller/PhabricatorDisabledUserController.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorDisplayPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorDisplayPreferencesSettingsPanel.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorDisqusAuthProvider' => 'applications/auth/provider/PhabricatorDisqusAuthProvider.php',
|
2016-01-14 23:34:21 +01:00
|
|
|
'PhabricatorDividerProfilePanel' => 'applications/search/profilepanel/PhabricatorDividerProfilePanel.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDivinerApplication' => 'applications/diviner/application/PhabricatorDivinerApplication.php',
|
|
|
|
'PhabricatorDoorkeeperApplication' => 'applications/doorkeeper/application/PhabricatorDoorkeeperApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDraft' => 'applications/draft/storage/PhabricatorDraft.php',
|
|
|
|
'PhabricatorDraftDAO' => 'applications/draft/storage/PhabricatorDraftDAO.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDrydockApplication' => 'applications/drydock/application/PhabricatorDrydockApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorEdgeConfig' => 'infrastructure/edges/constants/PhabricatorEdgeConfig.php',
|
|
|
|
'PhabricatorEdgeConstants' => 'infrastructure/edges/constants/PhabricatorEdgeConstants.php',
|
Allow edges to be configured to prevent cycles
Summary:
Certain types of things we should be storing in edges (notably, Task X depends on Task Y) should always be acyclic. Allow `PhabricatorEdgeEditor` to enforce this, since we can't correctly enforce it outside of the editor without being vulnerable to races.
Each edge type can be marked acyclic. If an edge type is acyclic, we perform additional steps when writing new edges of that type:
- We acquire a global lock on the edge type before performing any reads or writes. This ensures we can't produce a cycle as a result of a race where two edits add edges which independently do not produce a cycle, but do produce a cycle when combined.
- After performing writes but before committing transactions, we load the edge graph for each acyclic type and verify that it is, in fact, acyclic. If we detect cycles, we abort the edit.
- When we're done, we release the edge type locks.
This is a relatively high-complexity change, but gives us a simple way to flag an edge type as acyclic in a robust way.
Test Plan: Ran unit tests.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1162
Differential Revision: https://secure.phabricator.com/D2940
2012-07-09 19:39:38 +02:00
|
|
|
'PhabricatorEdgeCycleException' => 'infrastructure/edges/exception/PhabricatorEdgeCycleException.php',
|
2015-11-03 17:45:00 +01:00
|
|
|
'PhabricatorEdgeEditType' => 'applications/transactions/edittype/PhabricatorEdgeEditType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorEdgeEditor' => 'infrastructure/edges/editor/PhabricatorEdgeEditor.php',
|
Allow edges to be configured to prevent cycles
Summary:
Certain types of things we should be storing in edges (notably, Task X depends on Task Y) should always be acyclic. Allow `PhabricatorEdgeEditor` to enforce this, since we can't correctly enforce it outside of the editor without being vulnerable to races.
Each edge type can be marked acyclic. If an edge type is acyclic, we perform additional steps when writing new edges of that type:
- We acquire a global lock on the edge type before performing any reads or writes. This ensures we can't produce a cycle as a result of a race where two edits add edges which independently do not produce a cycle, but do produce a cycle when combined.
- After performing writes but before committing transactions, we load the edge graph for each acyclic type and verify that it is, in fact, acyclic. If we detect cycles, we abort the edit.
- When we're done, we release the edge type locks.
This is a relatively high-complexity change, but gives us a simple way to flag an edge type as acyclic in a robust way.
Test Plan: Ran unit tests.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1162
Differential Revision: https://secure.phabricator.com/D2940
2012-07-09 19:39:38 +02:00
|
|
|
'PhabricatorEdgeGraph' => 'infrastructure/edges/util/PhabricatorEdgeGraph.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorEdgeQuery' => 'infrastructure/edges/query/PhabricatorEdgeQuery.php',
|
Allow edges to be configured to prevent cycles
Summary:
Certain types of things we should be storing in edges (notably, Task X depends on Task Y) should always be acyclic. Allow `PhabricatorEdgeEditor` to enforce this, since we can't correctly enforce it outside of the editor without being vulnerable to races.
Each edge type can be marked acyclic. If an edge type is acyclic, we perform additional steps when writing new edges of that type:
- We acquire a global lock on the edge type before performing any reads or writes. This ensures we can't produce a cycle as a result of a race where two edits add edges which independently do not produce a cycle, but do produce a cycle when combined.
- After performing writes but before committing transactions, we load the edge graph for each acyclic type and verify that it is, in fact, acyclic. If we detect cycles, we abort the edit.
- When we're done, we release the edge type locks.
This is a relatively high-complexity change, but gives us a simple way to flag an edge type as acyclic in a robust way.
Test Plan: Ran unit tests.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1162
Differential Revision: https://secure.phabricator.com/D2940
2012-07-09 19:39:38 +02:00
|
|
|
'PhabricatorEdgeTestCase' => 'infrastructure/edges/__tests__/PhabricatorEdgeTestCase.php',
|
2014-07-18 00:40:37 +02:00
|
|
|
'PhabricatorEdgeType' => 'infrastructure/edges/type/PhabricatorEdgeType.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorEdgeTypeTestCase' => 'infrastructure/edges/type/__tests__/PhabricatorEdgeTypeTestCase.php',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorEdgesDestructionEngineExtension' => 'infrastructure/edges/engineextension/PhabricatorEdgesDestructionEngineExtension.php',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngine' => 'applications/transactions/editengine/PhabricatorEditEngine.php',
|
|
|
|
'PhabricatorEditEngineAPIMethod' => 'applications/transactions/editengine/PhabricatorEditEngineAPIMethod.php',
|
2016-04-06 14:59:09 +02:00
|
|
|
'PhabricatorEditEngineColumnsCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineColumnsCommentAction.php',
|
2015-12-15 15:57:32 +01:00
|
|
|
'PhabricatorEditEngineCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineCommentAction.php',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfiguration' => 'applications/transactions/storage/PhabricatorEditEngineConfiguration.php',
|
2015-11-19 23:16:44 +01:00
|
|
|
'PhabricatorEditEngineConfigurationDefaultCreateController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationDefaultCreateController.php',
|
2015-11-18 19:38:12 +01:00
|
|
|
'PhabricatorEditEngineConfigurationDefaultsController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationDefaultsController.php',
|
2015-11-19 23:16:44 +01:00
|
|
|
'PhabricatorEditEngineConfigurationDisableController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationDisableController.php',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfigurationEditController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationEditController.php',
|
|
|
|
'PhabricatorEditEngineConfigurationEditEngine' => 'applications/transactions/editor/PhabricatorEditEngineConfigurationEditEngine.php',
|
|
|
|
'PhabricatorEditEngineConfigurationEditor' => 'applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php',
|
Allow EditEngine forms to be marked as "edit" forms
Summary:
Ref T9132. Ref T9908. This attempts to move us forward on answering this question:
> Which form gets used when a user clicks "Edit Task"?
One answer is "the same form that was used to create the task". There are several problems with that:
- The form might not exist anymore.
- The user might not have permission to see it.
- Some of the fields might be hidden, essentially preventing them from being edited.
- We have to store the value somewhere and old tasks won't have a value.
- Any instructions on the form probably don't apply to edits.
One answer is "force the default, full form". That's not as problematic, but it means we have no ability to create limited access users who see fewer fields.
The answer in this diff is:
- Forms can be marked as "edit forms".
- We take the user to the first edit form they have permission to see, from a master list.
This allows you to create several forms like:
- Advanced Edit Form (say, all fields -- visible to administrators).
- Basic Edit Form (say, no policies -- visible to trusted users).
- Noob Edit Form (say, no policies, priorities, or status -- visible to everyone).
Then you can give everyone access to "noob", some people access to "basic", and a few people access to "advanced".
This might only be part of the answer. In particular, you can still //use// any edit form you can see, so we could do these things in the future:
- Give you an option to switch to a different form if you want.
- Save the form the task was created with, and use that form by default.
If we do pursue those, we can fall back to this behavior if there's a problem with them (e.g., original form doesn't exist or wasn't recorded).
There's also no "reorder" UI yet, that'll be coming in the next diff.
I'm also going to try to probably make the "create" and "edit" stuff a little more consistent / less weird in a bit.
Test Plan: Marked various forms as edit forms or not edit forms, made edits, hit permissions errors, etc.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132, T9908
Differential Revision: https://secure.phabricator.com/D14702
2015-12-08 02:11:35 +01:00
|
|
|
'PhabricatorEditEngineConfigurationIsEditController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationIsEditController.php',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfigurationListController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationListController.php',
|
2015-11-18 19:50:09 +01:00
|
|
|
'PhabricatorEditEngineConfigurationLockController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationLockController.php',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfigurationPHIDType' => 'applications/transactions/phid/PhabricatorEditEngineConfigurationPHIDType.php',
|
|
|
|
'PhabricatorEditEngineConfigurationQuery' => 'applications/transactions/query/PhabricatorEditEngineConfigurationQuery.php',
|
2015-11-17 18:33:06 +01:00
|
|
|
'PhabricatorEditEngineConfigurationReorderController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationReorderController.php',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfigurationSaveController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationSaveController.php',
|
|
|
|
'PhabricatorEditEngineConfigurationSearchEngine' => 'applications/transactions/query/PhabricatorEditEngineConfigurationSearchEngine.php',
|
2015-12-08 15:14:47 +01:00
|
|
|
'PhabricatorEditEngineConfigurationSortController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationSortController.php',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfigurationTransaction' => 'applications/transactions/storage/PhabricatorEditEngineConfigurationTransaction.php',
|
|
|
|
'PhabricatorEditEngineConfigurationTransactionQuery' => 'applications/transactions/query/PhabricatorEditEngineConfigurationTransactionQuery.php',
|
|
|
|
'PhabricatorEditEngineConfigurationViewController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationViewController.php',
|
|
|
|
'PhabricatorEditEngineController' => 'applications/transactions/controller/PhabricatorEditEngineController.php',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorEditEngineExtension' => 'applications/transactions/engineextension/PhabricatorEditEngineExtension.php',
|
|
|
|
'PhabricatorEditEngineExtensionModule' => 'applications/transactions/engineextension/PhabricatorEditEngineExtensionModule.php',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineListController' => 'applications/transactions/controller/PhabricatorEditEngineListController.php',
|
2016-02-09 00:24:52 +01:00
|
|
|
'PhabricatorEditEnginePointsCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEnginePointsCommentAction.php',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineQuery' => 'applications/transactions/query/PhabricatorEditEngineQuery.php',
|
|
|
|
'PhabricatorEditEngineSearchEngine' => 'applications/transactions/query/PhabricatorEditEngineSearchEngine.php',
|
2015-12-15 15:57:32 +01:00
|
|
|
'PhabricatorEditEngineSelectCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineSelectCommentAction.php',
|
|
|
|
'PhabricatorEditEngineTokenizerCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineTokenizerCommentAction.php',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorEditField' => 'applications/transactions/editfield/PhabricatorEditField.php',
|
2016-05-02 14:35:05 +02:00
|
|
|
'PhabricatorEditPage' => 'applications/transactions/editengine/PhabricatorEditPage.php',
|
2015-11-03 17:45:00 +01:00
|
|
|
'PhabricatorEditType' => 'applications/transactions/edittype/PhabricatorEditType.php',
|
2012-10-10 19:18:23 +02:00
|
|
|
'PhabricatorEditor' => 'infrastructure/PhabricatorEditor.php',
|
2015-12-21 19:25:28 +01:00
|
|
|
'PhabricatorElasticFulltextStorageEngine' => 'applications/search/fulltextstorage/PhabricatorElasticFulltextStorageEngine.php',
|
2015-05-19 22:59:58 +02:00
|
|
|
'PhabricatorElasticSearchSetupCheck' => 'applications/config/check/PhabricatorElasticSearchSetupCheck.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorEmailAddressesSettingsPanel' => 'applications/settings/panel/PhabricatorEmailAddressesSettingsPanel.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorEmailContentSource' => 'applications/metamta/contentsource/PhabricatorEmailContentSource.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorEmailFormatSettingsPanel' => 'applications/settings/panel/PhabricatorEmailFormatSettingsPanel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorEmailLoginController' => 'applications/auth/controller/PhabricatorEmailLoginController.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorEmailPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorEmailPreferencesSettingsPanel.php',
|
2013-07-11 03:53:09 +02:00
|
|
|
'PhabricatorEmailVerificationController' => 'applications/auth/controller/PhabricatorEmailVerificationController.php',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorEmbedFileRemarkupRule' => 'applications/files/markup/PhabricatorEmbedFileRemarkupRule.php',
|
2014-09-29 17:31:00 +02:00
|
|
|
'PhabricatorEmojiRemarkupRule' => 'applications/macro/markup/PhabricatorEmojiRemarkupRule.php',
|
2013-03-01 20:28:02 +01:00
|
|
|
'PhabricatorEmptyQueryException' => 'infrastructure/query/PhabricatorEmptyQueryException.php',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorEnv' => 'infrastructure/env/PhabricatorEnv.php',
|
|
|
|
'PhabricatorEnvTestCase' => 'infrastructure/env/__tests__/PhabricatorEnvTestCase.php',
|
2016-04-07 20:06:26 +02:00
|
|
|
'PhabricatorEpochEditField' => 'applications/transactions/editfield/PhabricatorEpochEditField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorEvent' => 'infrastructure/events/PhabricatorEvent.php',
|
|
|
|
'PhabricatorEventEngine' => 'infrastructure/events/PhabricatorEventEngine.php',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorEventListener' => 'infrastructure/events/PhabricatorEventListener.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorEventType' => 'infrastructure/events/constant/PhabricatorEventType.php',
|
2012-07-04 01:46:27 +02:00
|
|
|
'PhabricatorExampleEventListener' => 'infrastructure/events/PhabricatorExampleEventListener.php',
|
2016-01-21 13:25:38 +01:00
|
|
|
'PhabricatorExecFutureFileUploadSource' => 'applications/files/uploadsource/PhabricatorExecFutureFileUploadSource.php',
|
2015-05-11 23:23:35 +02:00
|
|
|
'PhabricatorExtendedPolicyInterface' => 'applications/policy/interface/PhabricatorExtendedPolicyInterface.php',
|
2013-01-03 00:52:30 +01:00
|
|
|
'PhabricatorExtendingPhabricatorConfigOptions' => 'applications/config/option/PhabricatorExtendingPhabricatorConfigOptions.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorExtensionsSetupCheck' => 'applications/config/check/PhabricatorExtensionsSetupCheck.php',
|
2013-04-19 20:40:13 +02:00
|
|
|
'PhabricatorExternalAccount' => 'applications/people/storage/PhabricatorExternalAccount.php',
|
2013-06-17 21:14:00 +02:00
|
|
|
'PhabricatorExternalAccountQuery' => 'applications/auth/query/PhabricatorExternalAccountQuery.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorExternalAccountsSettingsPanel' => 'applications/settings/panel/PhabricatorExternalAccountsSettingsPanel.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorExtraConfigSetupCheck' => 'applications/config/check/PhabricatorExtraConfigSetupCheck.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorFacebookAuthProvider' => 'applications/auth/provider/PhabricatorFacebookAuthProvider.php',
|
2012-07-27 22:46:01 +02:00
|
|
|
'PhabricatorFactAggregate' => 'applications/fact/storage/PhabricatorFactAggregate.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorFactApplication' => 'applications/fact/application/PhabricatorFactApplication.php',
|
2012-07-30 19:44:08 +02:00
|
|
|
'PhabricatorFactChartController' => 'applications/fact/controller/PhabricatorFactChartController.php',
|
2012-07-27 22:46:01 +02:00
|
|
|
'PhabricatorFactController' => 'applications/fact/controller/PhabricatorFactController.php',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactCountEngine' => 'applications/fact/engine/PhabricatorFactCountEngine.php',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorFactCursor' => 'applications/fact/storage/PhabricatorFactCursor.php',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactDAO' => 'applications/fact/storage/PhabricatorFactDAO.php',
|
|
|
|
'PhabricatorFactDaemon' => 'applications/fact/daemon/PhabricatorFactDaemon.php',
|
|
|
|
'PhabricatorFactEngine' => 'applications/fact/engine/PhabricatorFactEngine.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorFactEngineTestCase' => 'applications/fact/engine/__tests__/PhabricatorFactEngineTestCase.php',
|
2012-07-27 22:46:01 +02:00
|
|
|
'PhabricatorFactHomeController' => 'applications/fact/controller/PhabricatorFactHomeController.php',
|
|
|
|
'PhabricatorFactLastUpdatedEngine' => 'applications/fact/engine/PhabricatorFactLastUpdatedEngine.php',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactManagementAnalyzeWorkflow' => 'applications/fact/management/PhabricatorFactManagementAnalyzeWorkflow.php',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorFactManagementCursorsWorkflow' => 'applications/fact/management/PhabricatorFactManagementCursorsWorkflow.php',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactManagementDestroyWorkflow' => 'applications/fact/management/PhabricatorFactManagementDestroyWorkflow.php',
|
|
|
|
'PhabricatorFactManagementListWorkflow' => 'applications/fact/management/PhabricatorFactManagementListWorkflow.php',
|
|
|
|
'PhabricatorFactManagementStatusWorkflow' => 'applications/fact/management/PhabricatorFactManagementStatusWorkflow.php',
|
|
|
|
'PhabricatorFactManagementWorkflow' => 'applications/fact/management/PhabricatorFactManagementWorkflow.php',
|
|
|
|
'PhabricatorFactRaw' => 'applications/fact/storage/PhabricatorFactRaw.php',
|
2012-07-28 02:29:44 +02:00
|
|
|
'PhabricatorFactSimpleSpec' => 'applications/fact/spec/PhabricatorFactSimpleSpec.php',
|
|
|
|
'PhabricatorFactSpec' => 'applications/fact/spec/PhabricatorFactSpec.php',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactUpdateIterator' => 'applications/fact/extract/PhabricatorFactUpdateIterator.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorFaxContentSource' => 'infrastructure/contentsource/PhabricatorFaxContentSource.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorFeedApplication' => 'applications/feed/application/PhabricatorFeedApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFeedBuilder' => 'applications/feed/builder/PhabricatorFeedBuilder.php',
|
2013-01-15 02:49:32 +01:00
|
|
|
'PhabricatorFeedConfigOptions' => 'applications/feed/config/PhabricatorFeedConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFeedController' => 'applications/feed/controller/PhabricatorFeedController.php',
|
|
|
|
'PhabricatorFeedDAO' => 'applications/feed/storage/PhabricatorFeedDAO.php',
|
2013-07-13 02:04:02 +02:00
|
|
|
'PhabricatorFeedDetailController' => 'applications/feed/controller/PhabricatorFeedDetailController.php',
|
2013-08-05 23:10:41 +02:00
|
|
|
'PhabricatorFeedListController' => 'applications/feed/controller/PhabricatorFeedListController.php',
|
2013-06-26 01:29:47 +02:00
|
|
|
'PhabricatorFeedManagementRepublishWorkflow' => 'applications/feed/management/PhabricatorFeedManagementRepublishWorkflow.php',
|
|
|
|
'PhabricatorFeedManagementWorkflow' => 'applications/feed/management/PhabricatorFeedManagementWorkflow.php',
|
2013-08-05 23:10:41 +02:00
|
|
|
'PhabricatorFeedQuery' => 'applications/feed/query/PhabricatorFeedQuery.php',
|
|
|
|
'PhabricatorFeedSearchEngine' => 'applications/feed/query/PhabricatorFeedSearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFeedStory' => 'applications/feed/story/PhabricatorFeedStory.php',
|
|
|
|
'PhabricatorFeedStoryData' => 'applications/feed/storage/PhabricatorFeedStoryData.php',
|
2012-06-08 15:31:30 +02:00
|
|
|
'PhabricatorFeedStoryNotification' => 'applications/notification/storage/PhabricatorFeedStoryNotification.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFeedStoryPublisher' => 'applications/feed/PhabricatorFeedStoryPublisher.php',
|
|
|
|
'PhabricatorFeedStoryReference' => 'applications/feed/storage/PhabricatorFeedStoryReference.php',
|
|
|
|
'PhabricatorFile' => 'applications/files/storage/PhabricatorFile.php',
|
2013-09-30 21:21:33 +02:00
|
|
|
'PhabricatorFileBundleLoader' => 'applications/files/query/PhabricatorFileBundleLoader.php',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'PhabricatorFileChunk' => 'applications/files/storage/PhabricatorFileChunk.php',
|
2015-03-14 16:29:30 +01:00
|
|
|
'PhabricatorFileChunkIterator' => 'applications/files/engine/PhabricatorFileChunkIterator.php',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'PhabricatorFileChunkQuery' => 'applications/files/query/PhabricatorFileChunkQuery.php',
|
2013-09-05 22:11:02 +02:00
|
|
|
'PhabricatorFileCommentController' => 'applications/files/controller/PhabricatorFileCommentController.php',
|
2013-10-17 18:32:34 +02:00
|
|
|
'PhabricatorFileComposeController' => 'applications/files/controller/PhabricatorFileComposeController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileController' => 'applications/files/controller/PhabricatorFileController.php',
|
|
|
|
'PhabricatorFileDAO' => 'applications/files/storage/PhabricatorFileDAO.php',
|
|
|
|
'PhabricatorFileDataController' => 'applications/files/controller/PhabricatorFileDataController.php',
|
|
|
|
'PhabricatorFileDeleteController' => 'applications/files/controller/PhabricatorFileDeleteController.php',
|
|
|
|
'PhabricatorFileDropUploadController' => 'applications/files/controller/PhabricatorFileDropUploadController.php',
|
2014-08-02 23:45:50 +02:00
|
|
|
'PhabricatorFileEditController' => 'applications/files/controller/PhabricatorFileEditController.php',
|
2013-09-05 22:11:02 +02:00
|
|
|
'PhabricatorFileEditor' => 'applications/files/editor/PhabricatorFileEditor.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorFileFilePHIDType' => 'applications/files/phid/PhabricatorFileFilePHIDType.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorFileHasObjectEdgeType' => 'applications/files/edge/PhabricatorFileHasObjectEdgeType.php',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorFileIconSetSelectController' => 'applications/files/controller/PhabricatorFileIconSetSelectController.php',
|
2012-10-01 23:04:03 +02:00
|
|
|
'PhabricatorFileImageMacro' => 'applications/macro/storage/PhabricatorFileImageMacro.php',
|
2015-05-12 15:16:18 +02:00
|
|
|
'PhabricatorFileImageTransform' => 'applications/files/transform/PhabricatorFileImageTransform.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileInfoController' => 'applications/files/controller/PhabricatorFileInfoController.php',
|
2012-10-23 04:06:56 +02:00
|
|
|
'PhabricatorFileLinkView' => 'view/layout/PhabricatorFileLinkView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileListController' => 'applications/files/controller/PhabricatorFileListController.php',
|
2012-10-31 17:57:46 +01:00
|
|
|
'PhabricatorFileQuery' => 'applications/files/query/PhabricatorFileQuery.php',
|
2014-09-19 14:44:40 +02:00
|
|
|
'PhabricatorFileSchemaSpec' => 'applications/files/storage/PhabricatorFileSchemaSpec.php',
|
2013-05-31 19:51:05 +02:00
|
|
|
'PhabricatorFileSearchEngine' => 'applications/files/query/PhabricatorFileSearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileStorageBlob' => 'applications/files/storage/PhabricatorFileStorageBlob.php',
|
|
|
|
'PhabricatorFileStorageConfigurationException' => 'applications/files/exception/PhabricatorFileStorageConfigurationException.php',
|
|
|
|
'PhabricatorFileStorageEngine' => 'applications/files/engine/PhabricatorFileStorageEngine.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorFileStorageEngineTestCase' => 'applications/files/engine/__tests__/PhabricatorFileStorageEngineTestCase.php',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorFileTemporaryGarbageCollector' => 'applications/files/garbagecollector/PhabricatorFileTemporaryGarbageCollector.php',
|
2013-02-06 22:37:42 +01:00
|
|
|
'PhabricatorFileTestCase' => 'applications/files/storage/__tests__/PhabricatorFileTestCase.php',
|
2013-05-06 19:30:24 +02:00
|
|
|
'PhabricatorFileTestDataGenerator' => 'applications/files/lipsum/PhabricatorFileTestDataGenerator.php',
|
2015-05-12 15:16:18 +02:00
|
|
|
'PhabricatorFileThumbnailTransform' => 'applications/files/transform/PhabricatorFileThumbnailTransform.php',
|
2013-09-05 22:11:02 +02:00
|
|
|
'PhabricatorFileTransaction' => 'applications/files/storage/PhabricatorFileTransaction.php',
|
|
|
|
'PhabricatorFileTransactionComment' => 'applications/files/storage/PhabricatorFileTransactionComment.php',
|
|
|
|
'PhabricatorFileTransactionQuery' => 'applications/files/query/PhabricatorFileTransactionQuery.php',
|
2015-05-12 15:16:18 +02:00
|
|
|
'PhabricatorFileTransform' => 'applications/files/transform/PhabricatorFileTransform.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileTransformController' => 'applications/files/controller/PhabricatorFileTransformController.php',
|
2015-05-12 15:16:18 +02:00
|
|
|
'PhabricatorFileTransformListController' => 'applications/files/controller/PhabricatorFileTransformListController.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorFileTransformTestCase' => 'applications/files/transform/__tests__/PhabricatorFileTransformTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileUploadController' => 'applications/files/controller/PhabricatorFileUploadController.php',
|
2013-05-26 22:45:24 +02:00
|
|
|
'PhabricatorFileUploadDialogController' => 'applications/files/controller/PhabricatorFileUploadDialogController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileUploadException' => 'applications/files/exception/PhabricatorFileUploadException.php',
|
2016-01-21 13:25:38 +01:00
|
|
|
'PhabricatorFileUploadSource' => 'applications/files/uploadsource/PhabricatorFileUploadSource.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorFileinfoSetupCheck' => 'applications/config/check/PhabricatorFileinfoSetupCheck.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorFilesApplication' => 'applications/files/application/PhabricatorFilesApplication.php',
|
2015-03-12 21:28:53 +01:00
|
|
|
'PhabricatorFilesApplicationStorageEnginePanel' => 'applications/files/applicationpanel/PhabricatorFilesApplicationStorageEnginePanel.php',
|
2016-01-18 21:58:19 +01:00
|
|
|
'PhabricatorFilesBuiltinFile' => 'applications/files/builtin/PhabricatorFilesBuiltinFile.php',
|
|
|
|
'PhabricatorFilesComposeIconBuiltinFile' => 'applications/files/builtin/PhabricatorFilesComposeIconBuiltinFile.php',
|
2013-01-14 02:01:00 +01:00
|
|
|
'PhabricatorFilesConfigOptions' => 'applications/files/config/PhabricatorFilesConfigOptions.php',
|
2015-03-13 19:30:13 +01:00
|
|
|
'PhabricatorFilesManagementCatWorkflow' => 'applications/files/management/PhabricatorFilesManagementCatWorkflow.php',
|
2014-08-21 20:47:59 +02:00
|
|
|
'PhabricatorFilesManagementCompactWorkflow' => 'applications/files/management/PhabricatorFilesManagementCompactWorkflow.php',
|
2012-10-25 20:36:38 +02:00
|
|
|
'PhabricatorFilesManagementEnginesWorkflow' => 'applications/files/management/PhabricatorFilesManagementEnginesWorkflow.php',
|
|
|
|
'PhabricatorFilesManagementMigrateWorkflow' => 'applications/files/management/PhabricatorFilesManagementMigrateWorkflow.php',
|
2013-05-29 15:28:57 +02:00
|
|
|
'PhabricatorFilesManagementPurgeWorkflow' => 'applications/files/management/PhabricatorFilesManagementPurgeWorkflow.php',
|
2013-05-17 19:00:31 +02:00
|
|
|
'PhabricatorFilesManagementRebuildWorkflow' => 'applications/files/management/PhabricatorFilesManagementRebuildWorkflow.php',
|
2012-10-25 20:36:38 +02:00
|
|
|
'PhabricatorFilesManagementWorkflow' => 'applications/files/management/PhabricatorFilesManagementWorkflow.php',
|
2016-01-18 21:58:19 +01:00
|
|
|
'PhabricatorFilesOnDiskBuiltinFile' => 'applications/files/builtin/PhabricatorFilesOnDiskBuiltinFile.php',
|
2015-03-26 19:11:52 +01:00
|
|
|
'PhabricatorFilesOutboundRequestAction' => 'applications/files/action/PhabricatorFilesOutboundRequestAction.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFlag' => 'applications/flag/storage/PhabricatorFlag.php',
|
2015-07-18 14:54:26 +02:00
|
|
|
'PhabricatorFlagAddFlagHeraldAction' => 'applications/flag/herald/PhabricatorFlagAddFlagHeraldAction.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFlagColor' => 'applications/flag/constants/PhabricatorFlagColor.php',
|
|
|
|
'PhabricatorFlagConstants' => 'applications/flag/constants/PhabricatorFlagConstants.php',
|
|
|
|
'PhabricatorFlagController' => 'applications/flag/controller/PhabricatorFlagController.php',
|
|
|
|
'PhabricatorFlagDAO' => 'applications/flag/storage/PhabricatorFlagDAO.php',
|
|
|
|
'PhabricatorFlagDeleteController' => 'applications/flag/controller/PhabricatorFlagDeleteController.php',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorFlagDestructionEngineExtension' => 'applications/flag/engineextension/PhabricatorFlagDestructionEngineExtension.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFlagEditController' => 'applications/flag/controller/PhabricatorFlagEditController.php',
|
|
|
|
'PhabricatorFlagListController' => 'applications/flag/controller/PhabricatorFlagListController.php',
|
|
|
|
'PhabricatorFlagQuery' => 'applications/flag/query/PhabricatorFlagQuery.php',
|
2013-08-14 01:27:26 +02:00
|
|
|
'PhabricatorFlagSearchEngine' => 'applications/flag/query/PhabricatorFlagSearchEngine.php',
|
|
|
|
'PhabricatorFlagSelectControl' => 'applications/flag/view/PhabricatorFlagSelectControl.php',
|
2013-10-25 21:52:00 +02:00
|
|
|
'PhabricatorFlaggableInterface' => 'applications/flag/interface/PhabricatorFlaggableInterface.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorFlagsApplication' => 'applications/flag/application/PhabricatorFlagsApplication.php',
|
2012-08-24 22:19:47 +02:00
|
|
|
'PhabricatorFlagsUIEventListener' => 'applications/flag/events/PhabricatorFlagsUIEventListener.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextEngine' => 'applications/search/index/PhabricatorFulltextEngine.php',
|
2015-12-21 15:31:31 +01:00
|
|
|
'PhabricatorFulltextEngineExtension' => 'applications/search/index/PhabricatorFulltextEngineExtension.php',
|
|
|
|
'PhabricatorFulltextEngineExtensionModule' => 'applications/search/index/PhabricatorFulltextEngineExtensionModule.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextIndexEngineExtension' => 'applications/search/engineextension/PhabricatorFulltextIndexEngineExtension.php',
|
|
|
|
'PhabricatorFulltextInterface' => 'applications/search/interface/PhabricatorFulltextInterface.php',
|
2015-12-21 19:25:28 +01:00
|
|
|
'PhabricatorFulltextStorageEngine' => 'applications/search/fulltextstorage/PhabricatorFulltextStorageEngine.php',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'PhabricatorFundApplication' => 'applications/fund/application/PhabricatorFundApplication.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorGDSetupCheck' => 'applications/config/check/PhabricatorGDSetupCheck.php',
|
2014-01-15 19:02:24 +01:00
|
|
|
'PhabricatorGarbageCollector' => 'infrastructure/daemon/garbagecollector/PhabricatorGarbageCollector.php',
|
2015-10-02 18:17:24 +02:00
|
|
|
'PhabricatorGarbageCollectorManagementCollectWorkflow' => 'infrastructure/daemon/garbagecollector/management/PhabricatorGarbageCollectorManagementCollectWorkflow.php',
|
|
|
|
'PhabricatorGarbageCollectorManagementSetPolicyWorkflow' => 'infrastructure/daemon/garbagecollector/management/PhabricatorGarbageCollectorManagementSetPolicyWorkflow.php',
|
|
|
|
'PhabricatorGarbageCollectorManagementWorkflow' => 'infrastructure/daemon/garbagecollector/management/PhabricatorGarbageCollectorManagementWorkflow.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorGestureUIExample' => 'applications/uiexample/examples/PhabricatorGestureUIExample.php',
|
2012-06-26 00:21:48 +02:00
|
|
|
'PhabricatorGitGraphStream' => 'applications/repository/daemon/PhabricatorGitGraphStream.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorGitHubAuthProvider' => 'applications/auth/provider/PhabricatorGitHubAuthProvider.php',
|
2012-06-27 22:59:12 +02:00
|
|
|
'PhabricatorGlobalLock' => 'infrastructure/util/PhabricatorGlobalLock.php',
|
Modernize file uploads
Summary:
Modernizes file uploads. In particular:
- Adds a mobile menu, with an "Upload File" item.
- Adds crumbs to the list view, detail view and upload view.
- Adds "Upload File" action to crumbs.
- Moves upload file to a separate page.
- Removes the combined upload file + recent files page.
- Makes upload file use a normal file control by default (works on mobile).
- Home page, file list and file upload page are now global drop targets which accept files dropped anywhere on them. Dragging a file into the window shows a mask and an instructional message.
- User education on this is a little weak but I think that's a big can of worms?
- Fixes a bug where dropping multiple files into a Remarkup text area produced bad results (resolves T2190).
T879 is related, although it's specifically about Maniphest. I've declined to make global drop targets yet there because there are multiple drop targets on the page with different meanings. That UI needs updating in general.
@chad, do we have an "upload" icon (counterpart to "download")?
Test Plan: Uploaded files in Maniphest, Differential, Files, and from Home. Dragged and dropped multiple files into Differential. Used crumbs, mobile.
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2190
Differential Revision: https://secure.phabricator.com/D4200
2012-12-17 01:34:01 +01:00
|
|
|
'PhabricatorGlobalUploadTargetView' => 'applications/files/view/PhabricatorGlobalUploadTargetView.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorGoogleAuthProvider' => 'applications/auth/provider/PhabricatorGoogleAuthProvider.php',
|
2015-11-04 14:05:10 +01:00
|
|
|
'PhabricatorHTTPParameterTypeTableView' => 'applications/config/view/PhabricatorHTTPParameterTypeTableView.php',
|
2015-03-30 03:22:27 +02:00
|
|
|
'PhabricatorHandleList' => 'applications/phid/handle/pool/PhabricatorHandleList.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorHandleObjectSelectorDataView' => 'applications/phid/handle/view/PhabricatorHandleObjectSelectorDataView.php',
|
2015-03-30 03:22:27 +02:00
|
|
|
'PhabricatorHandlePool' => 'applications/phid/handle/pool/PhabricatorHandlePool.php',
|
|
|
|
'PhabricatorHandlePoolTestCase' => 'applications/phid/handle/pool/__tests__/PhabricatorHandlePoolTestCase.php',
|
2013-07-21 16:03:10 +02:00
|
|
|
'PhabricatorHandleQuery' => 'applications/phid/query/PhabricatorHandleQuery.php',
|
2016-03-17 21:24:03 +01:00
|
|
|
'PhabricatorHandleRemarkupRule' => 'applications/phid/remarkup/PhabricatorHandleRemarkupRule.php',
|
2015-12-08 16:54:01 +01:00
|
|
|
'PhabricatorHandlesEditField' => 'applications/transactions/editfield/PhabricatorHandlesEditField.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorHarbormasterApplication' => 'applications/harbormaster/application/PhabricatorHarbormasterApplication.php',
|
2013-11-09 03:09:03 +01:00
|
|
|
'PhabricatorHarbormasterConfigOptions' => 'applications/harbormaster/config/PhabricatorHarbormasterConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorHash' => 'infrastructure/util/PhabricatorHash.php',
|
2012-12-21 14:43:33 +01:00
|
|
|
'PhabricatorHashTestCase' => 'infrastructure/util/__tests__/PhabricatorHashTestCase.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorHelpApplication' => 'applications/help/application/PhabricatorHelpApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorHelpController' => 'applications/help/controller/PhabricatorHelpController.php',
|
2015-04-01 17:13:12 +02:00
|
|
|
'PhabricatorHelpDocumentationController' => 'applications/help/controller/PhabricatorHelpDocumentationController.php',
|
2014-03-17 21:00:37 +01:00
|
|
|
'PhabricatorHelpEditorProtocolController' => 'applications/help/controller/PhabricatorHelpEditorProtocolController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorHelpKeyboardShortcutController' => 'applications/help/controller/PhabricatorHelpKeyboardShortcutController.php',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PhabricatorHelpMainMenuBarExtension' => 'applications/help/extension/PhabricatorHelpMainMenuBarExtension.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorHeraldApplication' => 'applications/herald/application/PhabricatorHeraldApplication.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorHeraldContentSource' => 'applications/herald/contentsource/PhabricatorHeraldContentSource.php',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorHighSecurityRequestExceptionHandler' => 'aphront/handler/PhabricatorHighSecurityRequestExceptionHandler.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorHomeApplication' => 'applications/home/application/PhabricatorHomeApplication.php',
|
2014-01-26 21:26:13 +01:00
|
|
|
'PhabricatorHomeController' => 'applications/home/controller/PhabricatorHomeController.php',
|
|
|
|
'PhabricatorHomeMainController' => 'applications/home/controller/PhabricatorHomeMainController.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorHomePreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorHomePreferencesSettingsPanel.php',
|
2014-01-29 05:18:01 +01:00
|
|
|
'PhabricatorHomeQuickCreateController' => 'applications/home/controller/PhabricatorHomeQuickCreateController.php',
|
2015-12-24 20:20:18 +01:00
|
|
|
'PhabricatorHovercardEngineExtension' => 'applications/search/engineextension/PhabricatorHovercardEngineExtension.php',
|
|
|
|
'PhabricatorHovercardEngineExtensionModule' => 'applications/search/engineextension/PhabricatorHovercardEngineExtensionModule.php',
|
2014-05-25 18:54:12 +02:00
|
|
|
'PhabricatorHunksManagementMigrateWorkflow' => 'applications/differential/management/PhabricatorHunksManagementMigrateWorkflow.php',
|
|
|
|
'PhabricatorHunksManagementWorkflow' => 'applications/differential/management/PhabricatorHunksManagementWorkflow.php',
|
2015-12-13 19:11:40 +01:00
|
|
|
'PhabricatorIDsSearchEngineExtension' => 'applications/search/engineextension/PhabricatorIDsSearchEngineExtension.php',
|
|
|
|
'PhabricatorIDsSearchField' => 'applications/search/field/PhabricatorIDsSearchField.php',
|
First pass at decoupling Phabricator bot behavior from the protocol it's running on, this pulls the connection, reading, and writing functionalities out of the bot itself and into the adapter.
Summary:
Ugh, just wrote out a huge message, only to lose it with a fat-fingered ctrl-c. Le sigh.
First pass at decoupling the bot from the protocol. Noticeably absent is the command/message coupling. After this design pass I'll give that a go. Could use some advice, thinking that handlers should only create messages (which can be public or private) and not open ended, undefined 'commands'. The problem being that there needs to be some consistant api if we want handlers to be protocol agnostic. Perhaps that's a pipedream, what are your thoughts?
Secondly, a few notes, design review requests on the changes i did make:
# Config. For now i'm passing config through to the adapter. This was mainly to remain backwards compatible on the config. I was thinking it should probably be namespaced into it's own subobject though to distinguish the adapter config from the bot config.
# Adapter selection. This flavor is the one-bot-daemon, config specified protocol version. The upside is that in the future they won't have to run different daemons for this stuff, just have different config, and the door is open for multiple protocol adapters down the road if need be. The downside is that I had to rename the daemon (non-backwards compatible change) and there will need to be some sort of runtime evaluation for instatiation of the adapter. For now I just have a crude switch, but I was thinking of just taking the string they supply as the class name (ala `try { new $clasName(); } catch...`) so as to allow for homegrown adapters, but I wasn't sure how such runtime magic would go over. Also, an alternative would be to make the PhabricatorBot class a non-abstract non-final base class and have the adapters be accompanied by a bot class that just defines their adapter as a property. The upside of which is backwards compatibility (welcome back PhabricatorIRCBot) and perhaps a little bit clearer plugin path for homegrowners.
# Logging. You'll notice I commented out two very important logging lines in the irc adapter. This isn't intended to remain commented out, but I'm not sure what the best way is to get logging at this layer. I'm wary of just composing the daemon back down into the adapter (bi-directional object composition makes my skin crawl), but something needs to happen, obviously. Advice?
That's it. After the feedback on the above, you can either merge down, or wait until i finish the command/message refactor if you don't think the diff will grow too large. Up to you, this all functions as is.
Test Plan: Ran an irc bot, connected, read input, and wrote output including handler integration.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4757
2013-02-06 03:45:20 +01:00
|
|
|
'PhabricatorIRCProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorIRCProtocolAdapter.php',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorIconRemarkupRule' => 'applications/macro/markup/PhabricatorIconRemarkupRule.php',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorIconSet' => 'applications/files/iconset/PhabricatorIconSet.php',
|
2015-12-27 15:45:53 +01:00
|
|
|
'PhabricatorIconSetEditField' => 'applications/transactions/editfield/PhabricatorIconSetEditField.php',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorIconSetIcon' => 'applications/files/iconset/PhabricatorIconSetIcon.php',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorImageMacroRemarkupRule' => 'applications/macro/markup/PhabricatorImageMacroRemarkupRule.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorImageTransformer' => 'applications/files/PhabricatorImageTransformer.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorImagemagickSetupCheck' => 'applications/config/check/PhabricatorImagemagickSetupCheck.php',
|
2015-12-20 17:54:29 +01:00
|
|
|
'PhabricatorIndexEngine' => 'applications/search/index/PhabricatorIndexEngine.php',
|
2015-12-21 15:07:41 +01:00
|
|
|
'PhabricatorIndexEngineExtension' => 'applications/search/index/PhabricatorIndexEngineExtension.php',
|
|
|
|
'PhabricatorIndexEngineExtensionModule' => 'applications/search/index/PhabricatorIndexEngineExtensionModule.php',
|
2014-06-15 21:52:11 +02:00
|
|
|
'PhabricatorInfrastructureTestCase' => '__tests__/PhabricatorInfrastructureTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorInlineCommentController' => 'infrastructure/diff/PhabricatorInlineCommentController.php',
|
|
|
|
'PhabricatorInlineCommentInterface' => 'infrastructure/diff/interface/PhabricatorInlineCommentInterface.php',
|
2012-07-23 20:01:28 +02:00
|
|
|
'PhabricatorInlineCommentPreviewController' => 'infrastructure/diff/PhabricatorInlineCommentPreviewController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorInlineSummaryView' => 'infrastructure/diff/view/PhabricatorInlineSummaryView.php',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorInstructionsEditField' => 'applications/transactions/editfield/PhabricatorInstructionsEditField.php',
|
2014-02-05 20:02:41 +01:00
|
|
|
'PhabricatorInternationalizationManagementExtractWorkflow' => 'infrastructure/internationalization/management/PhabricatorInternationalizationManagementExtractWorkflow.php',
|
|
|
|
'PhabricatorInternationalizationManagementWorkflow' => 'infrastructure/internationalization/management/PhabricatorInternationalizationManagementWorkflow.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorInvalidConfigSetupCheck' => 'applications/config/check/PhabricatorInvalidConfigSetupCheck.php',
|
2014-02-18 18:31:30 +01:00
|
|
|
'PhabricatorIteratedMD5PasswordHasher' => 'infrastructure/util/password/PhabricatorIteratedMD5PasswordHasher.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorIteratedMD5PasswordHasherTestCase' => 'infrastructure/util/password/__tests__/PhabricatorIteratedMD5PasswordHasherTestCase.php',
|
2016-03-18 14:22:37 +01:00
|
|
|
'PhabricatorIteratorFileUploadSource' => 'applications/files/uploadsource/PhabricatorIteratorFileUploadSource.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorJIRAAuthProvider' => 'applications/auth/provider/PhabricatorJIRAAuthProvider.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorJavelinLinter' => 'infrastructure/lint/linter/PhabricatorJavelinLinter.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorJiraIssueHasObjectEdgeType' => 'applications/doorkeeper/edge/PhabricatorJiraIssueHasObjectEdgeType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorJumpNavHandler' => 'applications/search/engine/PhabricatorJumpNavHandler.php',
|
Implement a more compact, general database-backed key-value cache
Summary:
See discussion in D4204. Facebook currently has a 314MB remarkup cache with a 55MB index, which is slow to access. Under the theory that this is an index size/quality problem (the current index is on a potentially-384-byte field, with many keys sharing prefixes), provide a more general index with fancy new features:
- It implements PhutilKeyValueCache, so it can be a component in cache stacks and supports TTL.
- It has a 12-byte hash-based key.
- It automatically compresses large blocks of data (most of what we store is highly-compressible HTML).
Test Plan:
- Basics:
- Loaded /paste/, saw caches generate and save.
- Reloaded /paste/, saw the page hit cache.
- GC:
- Ran GC daemon, saw nothing.
- Set maximum lifetime to 1 second, ran GC daemon, saw it collect the entire cache.
- Deflate:
- Selected row formats from the database, saw a mixture of 'raw' and 'deflate' storage.
- Used profiler to verify that 'deflate' is fast (12 calls @ 220us on my paste list).
- Ran unit tests
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran
Differential Revision: https://secure.phabricator.com/D4259
2012-12-21 23:17:56 +01:00
|
|
|
'PhabricatorKeyValueDatabaseCache' => 'applications/cache/PhabricatorKeyValueDatabaseCache.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorLDAPAuthProvider' => 'applications/auth/provider/PhabricatorLDAPAuthProvider.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorLegalpadApplication' => 'applications/legalpad/application/PhabricatorLegalpadApplication.php',
|
2013-07-04 01:37:05 +02:00
|
|
|
'PhabricatorLegalpadConfigOptions' => 'applications/legalpad/config/PhabricatorLegalpadConfigOptions.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorLegalpadDocumentPHIDType' => 'applications/legalpad/phid/PhabricatorLegalpadDocumentPHIDType.php',
|
2015-11-16 20:26:13 +01:00
|
|
|
'PhabricatorLegalpadSignaturePolicyRule' => 'applications/legalpad/policyrule/PhabricatorLegalpadSignaturePolicyRule.php',
|
2015-01-06 21:38:08 +01:00
|
|
|
'PhabricatorLibraryTestCase' => '__tests__/PhabricatorLibraryTestCase.php',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorLinkProfilePanel' => 'applications/search/profilepanel/PhabricatorLinkProfilePanel.php',
|
2013-04-16 17:19:45 +02:00
|
|
|
'PhabricatorLipsumArtist' => 'applications/lipsum/image/PhabricatorLipsumArtist.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorLipsumContentSource' => 'infrastructure/contentsource/PhabricatorLipsumContentSource.php',
|
2013-04-12 23:07:15 +02:00
|
|
|
'PhabricatorLipsumGenerateWorkflow' => 'applications/lipsum/management/PhabricatorLipsumGenerateWorkflow.php',
|
|
|
|
'PhabricatorLipsumManagementWorkflow' => 'applications/lipsum/management/PhabricatorLipsumManagementWorkflow.php',
|
2013-04-16 17:19:45 +02:00
|
|
|
'PhabricatorLipsumMondrianArtist' => 'applications/lipsum/image/PhabricatorLipsumMondrianArtist.php',
|
2012-07-02 19:49:00 +02:00
|
|
|
'PhabricatorLiskDAO' => 'infrastructure/storage/lisk/PhabricatorLiskDAO.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorLiskFulltextEngineExtension' => 'applications/search/engineextension/PhabricatorLiskFulltextEngineExtension.php',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorLiskSearchEngineExtension' => 'applications/search/engineextension/PhabricatorLiskSearchEngineExtension.php',
|
2014-10-06 19:26:48 +02:00
|
|
|
'PhabricatorLiskSerializer' => 'infrastructure/storage/lisk/PhabricatorLiskSerializer.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorListFilterUIExample' => 'applications/uiexample/examples/PhabricatorListFilterUIExample.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorLocalDiskFileStorageEngine' => 'applications/files/engine/PhabricatorLocalDiskFileStorageEngine.php',
|
|
|
|
'PhabricatorLocalTimeTestCase' => 'view/__tests__/PhabricatorLocalTimeTestCase.php',
|
2015-06-03 19:49:27 +02:00
|
|
|
'PhabricatorLocaleScopeGuard' => 'infrastructure/internationalization/scope/PhabricatorLocaleScopeGuard.php',
|
|
|
|
'PhabricatorLocaleScopeGuardTestCase' => 'infrastructure/internationalization/scope/__tests__/PhabricatorLocaleScopeGuardTestCase.php',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorLogTriggerAction' => 'infrastructure/daemon/workers/action/PhabricatorLogTriggerAction.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorLogoutController' => 'applications/auth/controller/PhabricatorLogoutController.php',
|
2015-01-03 13:48:19 +01:00
|
|
|
'PhabricatorLunarPhasePolicyRule' => 'applications/policy/rule/PhabricatorLunarPhasePolicyRule.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorMacroApplication' => 'applications/macro/application/PhabricatorMacroApplication.php',
|
2013-09-28 01:01:37 +02:00
|
|
|
'PhabricatorMacroAudioController' => 'applications/macro/controller/PhabricatorMacroAudioController.php',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorMacroCommentController' => 'applications/macro/controller/PhabricatorMacroCommentController.php',
|
2013-01-16 19:52:30 +01:00
|
|
|
'PhabricatorMacroConfigOptions' => 'applications/macro/config/PhabricatorMacroConfigOptions.php',
|
2012-10-01 23:04:03 +02:00
|
|
|
'PhabricatorMacroController' => 'applications/macro/controller/PhabricatorMacroController.php',
|
2014-07-11 01:18:15 +02:00
|
|
|
'PhabricatorMacroDatasource' => 'applications/macro/typeahead/PhabricatorMacroDatasource.php',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorMacroDisableController' => 'applications/macro/controller/PhabricatorMacroDisableController.php',
|
2012-10-01 23:04:03 +02:00
|
|
|
'PhabricatorMacroEditController' => 'applications/macro/controller/PhabricatorMacroEditController.php',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorMacroEditor' => 'applications/macro/editor/PhabricatorMacroEditor.php',
|
2012-10-01 23:04:03 +02:00
|
|
|
'PhabricatorMacroListController' => 'applications/macro/controller/PhabricatorMacroListController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorMacroMacroPHIDType' => 'applications/macro/phid/PhabricatorMacroMacroPHIDType.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorMacroMailReceiver' => 'applications/macro/mail/PhabricatorMacroMailReceiver.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhabricatorMacroManageCapability' => 'applications/macro/capability/PhabricatorMacroManageCapability.php',
|
2013-01-20 03:43:35 +01:00
|
|
|
'PhabricatorMacroMemeController' => 'applications/macro/controller/PhabricatorMacroMemeController.php',
|
2013-01-22 03:46:04 +01:00
|
|
|
'PhabricatorMacroMemeDialogController' => 'applications/macro/controller/PhabricatorMacroMemeDialogController.php',
|
Adding some filters and queries to Macro application
Summary:
Fixes T2778
Introduces `PhabricatorMacroQuery`, which should consolidate all queries regarding macros
Adds `PolicyInterface` to `PhabricatorImageMacro`, as else the query would fail (we should consider adding it to the ApplicationTransaction instead, if that was ever planned)
Adds `Active Macros` filter, making it the default
Adds `My Macros` filter. You may ask why it overwrites `$authors`. Well, I did not want the page jump to the conclusion that it is a search result. It //is// one more or less, but the filter would jump to `seach` instead of `my`. If you want `My Macros` removed, tell me. It is useful only to heavy-macro-uploaders-and-users though. Five or six people in `http://secure.phabricator.(org|com)`, and an estimated dozen and a half at bigger installs.
Test Plan: created multiple macros from multiple authors, disabled them at will. browsed around, verified that Macros only appeared in the right filters and that nothing else broke.
Reviewers: epriestley, chad, btrahan
CC: aran, Korvin
Maniphest Tasks: T2778
Differential Revision: https://secure.phabricator.com/D5409
2013-03-22 17:46:21 +01:00
|
|
|
'PhabricatorMacroQuery' => 'applications/macro/query/PhabricatorMacroQuery.php',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorMacroReplyHandler' => 'applications/macro/mail/PhabricatorMacroReplyHandler.php',
|
2013-05-30 23:09:37 +02:00
|
|
|
'PhabricatorMacroSearchEngine' => 'applications/macro/query/PhabricatorMacroSearchEngine.php',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorMacroTransaction' => 'applications/macro/storage/PhabricatorMacroTransaction.php',
|
|
|
|
'PhabricatorMacroTransactionComment' => 'applications/macro/storage/PhabricatorMacroTransactionComment.php',
|
|
|
|
'PhabricatorMacroTransactionQuery' => 'applications/macro/query/PhabricatorMacroTransactionQuery.php',
|
|
|
|
'PhabricatorMacroViewController' => 'applications/macro/controller/PhabricatorMacroViewController.php',
|
2015-08-15 19:54:33 +02:00
|
|
|
'PhabricatorMailEmailHeraldField' => 'applications/metamta/herald/PhabricatorMailEmailHeraldField.php',
|
|
|
|
'PhabricatorMailEmailHeraldFieldGroup' => 'applications/metamta/herald/PhabricatorMailEmailHeraldFieldGroup.php',
|
|
|
|
'PhabricatorMailEmailSubjectHeraldField' => 'applications/metamta/herald/PhabricatorMailEmailSubjectHeraldField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMailImplementationAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationAdapter.php',
|
|
|
|
'PhabricatorMailImplementationAmazonSESAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationAmazonSESAdapter.php',
|
2014-01-21 19:36:33 +01:00
|
|
|
'PhabricatorMailImplementationMailgunAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationMailgunAdapter.php',
|
2012-12-09 11:36:40 +01:00
|
|
|
'PhabricatorMailImplementationPHPMailerAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationPHPMailerAdapter.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationPHPMailerLiteAdapter.php',
|
|
|
|
'PhabricatorMailImplementationSendGridAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationSendGridAdapter.php',
|
|
|
|
'PhabricatorMailImplementationTestAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationTestAdapter.php',
|
2013-07-11 00:18:37 +02:00
|
|
|
'PhabricatorMailManagementListInboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementListInboundWorkflow.php',
|
Move outbound mail lists to CLI and enhance details
Summary: Finish off moving all this stuff to the CLI. Ref T3306.
Test Plan:
PROPERTIES
ID: 6483
Status: void
Retry Count: 0
Next Retry: 1373494457
Related PHID: PHID-DREV-5bnb33yeuhuaulyc3exg
Message: Message has no valid recipients: all To/Cc are disabled, invalid, or configured not to receive this mail.
PARAMETERS
from: PHID-USER-lqiz3yd7wmk64ejugvov
is-html:
parent-message-id: null
thread-id: differential-rev-PHID-DREV-5bnb33yeuhuaulyc3exg-req
is-first-message: null
is-bulk: 1
mailtags: ["differential-comment"]
cc: ["PHID-USER-cluwcdowc35gmperlkbi"]
subject: D22: quack quack
subject-prefix: [Differential]
vary-subject-prefix: [Commented On]
worker-task: 936546
HEADERS
Thread-Topic: D22: quack quack
X-Herald-Rules: none
X-Differential-Author: <PHID-USER-lqiz3yd7wmk64ejugvov>
X-Differential-CC: <PHID-USER-ly3pvrtdkw7lbgs72jvr>
X-Differential-CC: <PHID-USER-cluwcdowc35gmperlkbi>
X-Differential-CC: <PHID-MLST-wkxaantg3q6pgdkty5pt>
X-Differential-CC: <PHID-USER-aeabc4ipqbifny3rw4ok>
X-Differential-CC: <PHID-USER-zqxtb3oi4pouwxnxlv3f>
X-Differential-CC: <PHID-USER-cknqtm2dzw7twnwyiaye>
X-Differential-CCs: <PHID-USER-ly3pvrtdkw7lbgs72jvr>, <PHID-USER-cluwcdowc35gmperlkbi>, <PHID-MLST-wkxaantg3q6pgdkty5pt>, <PHID-USER-aeabc4ipqbifny3rw4ok>, <PHID-USER-zqxtb3oi4pouwxnxlv3f>, <PHID-USER-cknqtm2dzw7twnwyiaye>
X-Differential-Explicit-CC: <PHID-USER-ly3pvrtdkw7lbgs72jvr>
X-Differential-Explicit-CC: <PHID-USER-cluwcdowc35gmperlkbi>
X-Differential-Explicit-CC: <PHID-MLST-wkxaantg3q6pgdkty5pt>
X-Differential-Explicit-CC: <PHID-USER-aeabc4ipqbifny3rw4ok>
X-Differential-Explicit-CC: <PHID-USER-zqxtb3oi4pouwxnxlv3f>
X-Differential-Explicit-CC: <PHID-USER-cknqtm2dzw7twnwyiaye>
X-Differential-Explicit-CCs: <PHID-USER-ly3pvrtdkw7lbgs72jvr>, <PHID-USER-cluwcdowc35gmperlkbi>, <PHID-MLST-wkxaantg3q6pgdkty5pt>, <PHID-USER-aeabc4ipqbifny3rw4ok>, <PHID-USER-zqxtb3oi4pouwxnxlv3f>, <PHID-USER-cknqtm2dzw7twnwyiaye>
X-Phabricator-To: <PHID-USER-lqiz3yd7wmk64ejugvov>
X-Phabricator-Cc: <PHID-USER-ly3pvrtdkw7lbgs72jvr>
X-Phabricator-Cc: <PHID-USER-cluwcdowc35gmperlkbi>
X-Phabricator-Cc: <PHID-MLST-wkxaantg3q6pgdkty5pt>
X-Phabricator-Cc: <PHID-USER-aeabc4ipqbifny3rw4ok>
X-Phabricator-Cc: <PHID-USER-zqxtb3oi4pouwxnxlv3f>
X-Phabricator-Cc: <PHID-USER-cknqtm2dzw7twnwyiaye>
RECIPIENTS
! dog (dog)
- This user is disabled; disabled users do not receive mail.
BODY
epriestley has commented on the revision "quack quack".
zxcbzxcb
REVISION DETAIL
http://local.aphront.com:8080/D22
To: epriestley
Cc: Unknown User, dog, list, duck, epriestley992, asana
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3306
Differential Revision: https://secure.phabricator.com/D6423
2013-07-11 03:52:22 +02:00
|
|
|
'PhabricatorMailManagementListOutboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementListOutboundWorkflow.php',
|
2013-07-11 00:13:24 +02:00
|
|
|
'PhabricatorMailManagementReceiveTestWorkflow' => 'applications/metamta/management/PhabricatorMailManagementReceiveTestWorkflow.php',
|
2013-03-30 23:53:49 +01:00
|
|
|
'PhabricatorMailManagementResendWorkflow' => 'applications/metamta/management/PhabricatorMailManagementResendWorkflow.php',
|
2013-07-11 00:18:24 +02:00
|
|
|
'PhabricatorMailManagementSendTestWorkflow' => 'applications/metamta/management/PhabricatorMailManagementSendTestWorkflow.php',
|
2013-05-20 19:13:42 +02:00
|
|
|
'PhabricatorMailManagementShowInboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementShowInboundWorkflow.php',
|
|
|
|
'PhabricatorMailManagementShowOutboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementShowOutboundWorkflow.php',
|
2015-08-06 20:32:17 +02:00
|
|
|
'PhabricatorMailManagementVolumeWorkflow' => 'applications/metamta/management/PhabricatorMailManagementVolumeWorkflow.php',
|
2013-03-30 23:53:49 +01:00
|
|
|
'PhabricatorMailManagementWorkflow' => 'applications/metamta/management/PhabricatorMailManagementWorkflow.php',
|
2015-08-15 19:54:33 +02:00
|
|
|
'PhabricatorMailOutboundMailHeraldAdapter' => 'applications/metamta/herald/PhabricatorMailOutboundMailHeraldAdapter.php',
|
|
|
|
'PhabricatorMailOutboundRoutingHeraldAction' => 'applications/metamta/herald/PhabricatorMailOutboundRoutingHeraldAction.php',
|
|
|
|
'PhabricatorMailOutboundRoutingSelfEmailHeraldAction' => 'applications/metamta/herald/PhabricatorMailOutboundRoutingSelfEmailHeraldAction.php',
|
|
|
|
'PhabricatorMailOutboundRoutingSelfNotificationHeraldAction' => 'applications/metamta/herald/PhabricatorMailOutboundRoutingSelfNotificationHeraldAction.php',
|
2015-08-14 13:31:42 +02:00
|
|
|
'PhabricatorMailOutboundStatus' => 'applications/metamta/constants/PhabricatorMailOutboundStatus.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorMailReceiver' => 'applications/metamta/receiver/PhabricatorMailReceiver.php',
|
2013-05-15 00:04:17 +02:00
|
|
|
'PhabricatorMailReceiverTestCase' => 'applications/metamta/receiver/__tests__/PhabricatorMailReceiverTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/PhabricatorMailReplyHandler.php',
|
2015-08-15 19:54:33 +02:00
|
|
|
'PhabricatorMailRoutingRule' => 'applications/metamta/constants/PhabricatorMailRoutingRule.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorMailSetupCheck' => 'applications/config/check/PhabricatorMailSetupCheck.php',
|
Build separate mail for each recipient, honoring recipient access levels
Summary:
Ref T6367. Removes `multiplexMail()`!
We can't pass a single body into a function which splits it anymore: we need to split recipients first, then build bodies for each recipient list. This lets us build separate bodies for each recipient's individual translation/access levels.
The new logic does this:
- First, split recipients into groups called "targets".
- Each target corresponds to one actual mail we're going to build.
- Each target has a viewer (whose translation / access levels will be used to generate the mail).
- Each target has a to/cc list (the users who we'll ultimately send the mail to).
- For each target, build a custom mail body based on the viewer's access levels and settings (language prefs not actually implemented).
- Then, deliver the mail.
Test Plan:
- Read new config help.
Then did a bunch of testing, primarily with `bin/mail list-outbound` and `bin/mail show-outbound` (to review generated mail), `bin/phd debug taskmaster` (to run daemons freely) and `bin/worker execute --id <id>` (to repeatedly test a specific piece of code after identifying an issue).
With `one-mail-per-recipient` on (default):
- Sent mail to multiple users.
- Verified mail showed up in `mail list-outbound`.
- Examined mail with `mail show-outbound`.
- Added a project that a subscriber could not see.
- Verified it was not present in `X-Phabricator-Projects`.
- Verified it was rendered as "Restricted Project" for the non-permissioned viewer.
- Added a subscriber, then changed the object policy so they could not see it and sent mail.
- Verified I received mail but the other user did not.
- Enabled public replies and verified mail generated with public addresses.
- Disabld public replies and verified mail generated with private addresses.
With `one-mail-per-recipient` off:
- Verified that one mail is sent to all recipients.
- Verified users who can not see the object are still filtered.
- Verified that partially-visible projects are completely visible in the mail (this violates policies, as documented, as the best available compromise).
- Enabled public replies and verified the mail generated with "Reply To".
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: carlsverre, epriestley
Maniphest Tasks: T6367
Differential Revision: https://secure.phabricator.com/D13131
2015-06-02 23:29:30 +02:00
|
|
|
'PhabricatorMailTarget' => 'applications/metamta/replyhandler/PhabricatorMailTarget.php',
|
2014-01-21 19:36:33 +01:00
|
|
|
'PhabricatorMailgunConfigOptions' => 'applications/config/option/PhabricatorMailgunConfigOptions.php',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PhabricatorMainMenuBarExtension' => 'view/page/menu/PhabricatorMainMenuBarExtension.php',
|
2012-07-31 01:09:14 +02:00
|
|
|
'PhabricatorMainMenuSearchView' => 'view/page/menu/PhabricatorMainMenuSearchView.php',
|
|
|
|
'PhabricatorMainMenuView' => 'view/page/menu/PhabricatorMainMenuView.php',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorManagementWorkflow' => 'infrastructure/management/PhabricatorManagementWorkflow.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorManiphestApplication' => 'applications/maniphest/application/PhabricatorManiphestApplication.php',
|
2013-01-11 19:24:35 +01:00
|
|
|
'PhabricatorManiphestConfigOptions' => 'applications/maniphest/config/PhabricatorManiphestConfigOptions.php',
|
2013-04-25 03:17:30 +02:00
|
|
|
'PhabricatorManiphestTaskTestDataGenerator' => 'applications/maniphest/lipsum/PhabricatorManiphestTaskTestDataGenerator.php',
|
Add a generic multistep Markup cache
Summary:
The immediate issue this addresses is T1366, adding a rendering cache to Phriction. For wiki pages with code blocks especially, rerendering them each time is expensive.
The broader issue is that out markup caches aren't very good right now. They have three major problems:
**Problem 1: the data is stored in the wrong place.** We currently store remarkup caches on objects. This means we're always loading it and passing it around even when we don't need it, can't genericize cache management code (e.g., have one simple script to drop/GC caches), need to update authoritative rows to clear caches, and can't genericize rendering code since each object is different.
To solve this, I created a dedicated cache database that I plan to move all markup caches to use.
**Problem 2: time-variant rules break when cached.** Some rules like `**bold**` are time-invariant and always produce the same output, but some rules like `{Tnnn}` and `@username` are variant and may render differently (because a task was closed or a user is on vacation). Currently, we cache the raw output, so these time-variant rules get locked at whatever values they had when they were first rendered. This is the main reason Phriction doesn't have a cache right now -- I wanted `{Tnnn}` rules to reflect open/closed tasks.
To solve this, I split markup into a "preprocessing" phase (which does all the parsing and evaluates all time-invariant rules) and a "postprocessing" phase (which evaluates time-variant rules only). The preprocessing phase is most of the expense (and, notably, includes syntax highlighting) so this is nearly as good as caching the final output. I did most of the work here in D737 / D738, but we never moved to use it in Phabricator -- we currently just do the two operations serially in all cases.
This diff splits them apart and caches the output of preprocessing only, so we benefit from caching but also get accurate time-variant rendering.
**Problem 3: cache access isn't batched/pipelined optimally.** When we're rendering a list of markup blocks, we should be able to batch datafetching better than we do. D738 helped with this (fetching is batched within a single hunk of markup) and this improves batching on cache access. We could still do better here, but this is at least a step forward.
Also fixes a bug with generating a link in the Phriction history interface ($uri gets clobbered).
I'm using PHP serialization instead of JSON serialization because Remarkup does some stuff with non-ascii characters that might not survive JSON.
Test Plan:
- Created a Phriction document and verified that previews don't go to cache (no rows appear in the cache table).
- Verified that published documents come out of cache.
- Verified that caches generate/regenerate correctly, time-variant rules render properly and old documents hit the right caches.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1366
Differential Revision: https://secure.phabricator.com/D2945
2012-07-10 00:20:56 +02:00
|
|
|
'PhabricatorMarkupCache' => 'applications/cache/storage/PhabricatorMarkupCache.php',
|
2012-07-02 19:44:37 +02:00
|
|
|
'PhabricatorMarkupEngine' => 'infrastructure/markup/PhabricatorMarkupEngine.php',
|
Add a generic multistep Markup cache
Summary:
The immediate issue this addresses is T1366, adding a rendering cache to Phriction. For wiki pages with code blocks especially, rerendering them each time is expensive.
The broader issue is that out markup caches aren't very good right now. They have three major problems:
**Problem 1: the data is stored in the wrong place.** We currently store remarkup caches on objects. This means we're always loading it and passing it around even when we don't need it, can't genericize cache management code (e.g., have one simple script to drop/GC caches), need to update authoritative rows to clear caches, and can't genericize rendering code since each object is different.
To solve this, I created a dedicated cache database that I plan to move all markup caches to use.
**Problem 2: time-variant rules break when cached.** Some rules like `**bold**` are time-invariant and always produce the same output, but some rules like `{Tnnn}` and `@username` are variant and may render differently (because a task was closed or a user is on vacation). Currently, we cache the raw output, so these time-variant rules get locked at whatever values they had when they were first rendered. This is the main reason Phriction doesn't have a cache right now -- I wanted `{Tnnn}` rules to reflect open/closed tasks.
To solve this, I split markup into a "preprocessing" phase (which does all the parsing and evaluates all time-invariant rules) and a "postprocessing" phase (which evaluates time-variant rules only). The preprocessing phase is most of the expense (and, notably, includes syntax highlighting) so this is nearly as good as caching the final output. I did most of the work here in D737 / D738, but we never moved to use it in Phabricator -- we currently just do the two operations serially in all cases.
This diff splits them apart and caches the output of preprocessing only, so we benefit from caching but also get accurate time-variant rendering.
**Problem 3: cache access isn't batched/pipelined optimally.** When we're rendering a list of markup blocks, we should be able to batch datafetching better than we do. D738 helped with this (fetching is batched within a single hunk of markup) and this improves batching on cache access. We could still do better here, but this is at least a step forward.
Also fixes a bug with generating a link in the Phriction history interface ($uri gets clobbered).
I'm using PHP serialization instead of JSON serialization because Remarkup does some stuff with non-ascii characters that might not survive JSON.
Test Plan:
- Created a Phriction document and verified that previews don't go to cache (no rows appear in the cache table).
- Verified that published documents come out of cache.
- Verified that caches generate/regenerate correctly, time-variant rules render properly and old documents hit the right caches.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1366
Differential Revision: https://secure.phabricator.com/D2945
2012-07-10 00:20:56 +02:00
|
|
|
'PhabricatorMarkupInterface' => 'infrastructure/markup/PhabricatorMarkupInterface.php',
|
2013-05-24 21:37:53 +02:00
|
|
|
'PhabricatorMarkupOneOff' => 'infrastructure/markup/PhabricatorMarkupOneOff.php',
|
2013-08-05 19:46:39 +02:00
|
|
|
'PhabricatorMarkupPreviewController' => 'infrastructure/markup/PhabricatorMarkupPreviewController.php',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorMemeRemarkupRule' => 'applications/macro/markup/PhabricatorMemeRemarkupRule.php',
|
|
|
|
'PhabricatorMentionRemarkupRule' => 'applications/people/markup/PhabricatorMentionRemarkupRule.php',
|
2014-09-09 23:21:13 +02:00
|
|
|
'PhabricatorMentionableInterface' => 'applications/transactions/interface/PhabricatorMentionableInterface.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMercurialGraphStream' => 'applications/repository/daemon/PhabricatorMercurialGraphStream.php',
|
2013-07-11 00:17:38 +02:00
|
|
|
'PhabricatorMetaMTAActor' => 'applications/metamta/query/PhabricatorMetaMTAActor.php',
|
|
|
|
'PhabricatorMetaMTAActorQuery' => 'applications/metamta/query/PhabricatorMetaMTAActorQuery.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorMetaMTAApplication' => 'applications/metamta/application/PhabricatorMetaMTAApplication.php',
|
2015-01-20 01:07:26 +01:00
|
|
|
'PhabricatorMetaMTAApplicationEmail' => 'applications/metamta/storage/PhabricatorMetaMTAApplicationEmail.php',
|
2015-01-28 23:35:42 +01:00
|
|
|
'PhabricatorMetaMTAApplicationEmailDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAApplicationEmailDatasource.php',
|
2015-06-11 19:15:49 +02:00
|
|
|
'PhabricatorMetaMTAApplicationEmailEditor' => 'applications/metamta/editor/PhabricatorMetaMTAApplicationEmailEditor.php',
|
2015-07-06 22:16:26 +02:00
|
|
|
'PhabricatorMetaMTAApplicationEmailHeraldField' => 'applications/metamta/herald/PhabricatorMetaMTAApplicationEmailHeraldField.php',
|
2015-01-20 01:07:26 +01:00
|
|
|
'PhabricatorMetaMTAApplicationEmailPHIDType' => 'applications/phid/PhabricatorMetaMTAApplicationEmailPHIDType.php',
|
2015-03-12 21:28:37 +01:00
|
|
|
'PhabricatorMetaMTAApplicationEmailPanel' => 'applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php',
|
2015-01-20 01:07:26 +01:00
|
|
|
'PhabricatorMetaMTAApplicationEmailQuery' => 'applications/metamta/query/PhabricatorMetaMTAApplicationEmailQuery.php',
|
2015-06-11 19:15:49 +02:00
|
|
|
'PhabricatorMetaMTAApplicationEmailTransaction' => 'applications/metamta/storage/PhabricatorMetaMTAApplicationEmailTransaction.php',
|
|
|
|
'PhabricatorMetaMTAApplicationEmailTransactionQuery' => 'applications/metamta/query/PhabricatorMetaMTAApplicationEmailTransactionQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMetaMTAAttachment' => 'applications/metamta/storage/PhabricatorMetaMTAAttachment.php',
|
2013-01-17 00:06:39 +01:00
|
|
|
'PhabricatorMetaMTAConfigOptions' => 'applications/config/option/PhabricatorMetaMTAConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMetaMTAController' => 'applications/metamta/controller/PhabricatorMetaMTAController.php',
|
|
|
|
'PhabricatorMetaMTADAO' => 'applications/metamta/storage/PhabricatorMetaMTADAO.php',
|
2013-05-21 00:52:54 +02:00
|
|
|
'PhabricatorMetaMTAEmailBodyParser' => 'applications/metamta/parser/PhabricatorMetaMTAEmailBodyParser.php',
|
|
|
|
'PhabricatorMetaMTAEmailBodyParserTestCase' => 'applications/metamta/parser/__tests__/PhabricatorMetaMTAEmailBodyParserTestCase.php',
|
2015-07-24 17:19:47 +02:00
|
|
|
'PhabricatorMetaMTAEmailHeraldAction' => 'applications/metamta/herald/PhabricatorMetaMTAEmailHeraldAction.php',
|
|
|
|
'PhabricatorMetaMTAEmailOthersHeraldAction' => 'applications/metamta/herald/PhabricatorMetaMTAEmailOthersHeraldAction.php',
|
|
|
|
'PhabricatorMetaMTAEmailSelfHeraldAction' => 'applications/metamta/herald/PhabricatorMetaMTAEmailSelfHeraldAction.php',
|
When we fail to process mail, tell the user about it
Summary:
Ref T4371. Ref T4699. Fixes T3994.
Currently, we're very conservative about sending errors back to users. A concern I had about this was that mistakes could lead to email loops, massive amounts of email spam, etc. Because of this, I was pretty hesitant about replying to email with more email when I wrote this stuff.
However, this was a long time ago. We now have Message-ID deduplication, "X-Phabricator-Sent-This-Mail", generally better mail infrastructure, and rate limiting. Together, these mechanisms should reasonably prevent anything crazy (primarily, infinite email loops) from happening.
Thus:
- When we hit any processing error after receiving a mail, try to send the author a reply with details about what went wrong. These are limited to 6 per hour per address.
- Rewrite most of the errors to be more detailed and informative.
- Rewrite most of the errors in a user-facing voice ("You sent this mail..." instead of "This mail was sent..").
- Remove the redundant, less sophisticated code which does something similar in Differential.
Test Plan:
- Using `scripts/mail/mail_receiver.php`, artificially received a pile of mail.
- Hit a bunch of different errors.
- Saw reasonable error mail get sent to me.
- Saw other reasonable error mail get rate limited.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T3994, T4371, T4699
Differential Revision: https://secure.phabricator.com/D8692
2014-04-04 03:43:18 +02:00
|
|
|
'PhabricatorMetaMTAErrorMailAction' => 'applications/metamta/action/PhabricatorMetaMTAErrorMailAction.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMetaMTAMail' => 'applications/metamta/storage/PhabricatorMetaMTAMail.php',
|
2012-07-17 04:01:43 +02:00
|
|
|
'PhabricatorMetaMTAMailBody' => 'applications/metamta/view/PhabricatorMetaMTAMailBody.php',
|
|
|
|
'PhabricatorMetaMTAMailBodyTestCase' => 'applications/metamta/view/__tests__/PhabricatorMetaMTAMailBodyTestCase.php',
|
2015-06-23 20:37:14 +02:00
|
|
|
'PhabricatorMetaMTAMailHasRecipientEdgeType' => 'applications/metamta/edge/PhabricatorMetaMTAMailHasRecipientEdgeType.php',
|
|
|
|
'PhabricatorMetaMTAMailListController' => 'applications/metamta/controller/PhabricatorMetaMTAMailListController.php',
|
2015-06-22 22:46:26 +02:00
|
|
|
'PhabricatorMetaMTAMailPHIDType' => 'applications/metamta/phid/PhabricatorMetaMTAMailPHIDType.php',
|
|
|
|
'PhabricatorMetaMTAMailQuery' => 'applications/metamta/query/PhabricatorMetaMTAMailQuery.php',
|
2015-06-23 20:37:14 +02:00
|
|
|
'PhabricatorMetaMTAMailSearchEngine' => 'applications/metamta/query/PhabricatorMetaMTAMailSearchEngine.php',
|
2014-08-15 17:04:10 +02:00
|
|
|
'PhabricatorMetaMTAMailSection' => 'applications/metamta/view/PhabricatorMetaMTAMailSection.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMetaMTAMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAMailTestCase.php',
|
2015-06-23 20:37:14 +02:00
|
|
|
'PhabricatorMetaMTAMailViewController' => 'applications/metamta/controller/PhabricatorMetaMTAMailViewController.php',
|
2014-07-18 00:44:29 +02:00
|
|
|
'PhabricatorMetaMTAMailableDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAMailableDatasource.php',
|
2015-04-23 12:34:33 +02:00
|
|
|
'PhabricatorMetaMTAMailableFunctionDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAMailableFunctionDatasource.php',
|
2014-01-21 19:36:33 +01:00
|
|
|
'PhabricatorMetaMTAMailgunReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTAMailgunReceiveController.php',
|
2014-02-01 23:35:55 +01:00
|
|
|
'PhabricatorMetaMTAMemberQuery' => 'applications/metamta/query/PhabricatorMetaMTAMemberQuery.php',
|
2013-08-30 17:21:50 +02:00
|
|
|
'PhabricatorMetaMTAPermanentFailureException' => 'applications/metamta/exception/PhabricatorMetaMTAPermanentFailureException.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMetaMTAReceivedMail' => 'applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php',
|
2013-05-14 01:32:19 +02:00
|
|
|
'PhabricatorMetaMTAReceivedMailProcessingException' => 'applications/metamta/exception/PhabricatorMetaMTAReceivedMailProcessingException.php',
|
|
|
|
'PhabricatorMetaMTAReceivedMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAReceivedMailTestCase.php',
|
2014-09-24 22:50:00 +02:00
|
|
|
'PhabricatorMetaMTASchemaSpec' => 'applications/metamta/storage/PhabricatorMetaMTASchemaSpec.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMetaMTASendGridReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php',
|
|
|
|
'PhabricatorMetaMTAWorker' => 'applications/metamta/PhabricatorMetaMTAWorker.php',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorMetronomicTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorMetronomicTriggerClock.php',
|
2016-01-15 00:29:21 +01:00
|
|
|
'PhabricatorMotivatorProfilePanel' => 'applications/search/profilepanel/PhabricatorMotivatorProfilePanel.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorMultiColumnUIExample' => 'applications/uiexample/examples/PhabricatorMultiColumnUIExample.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorMultiFactorSettingsPanel' => 'applications/settings/panel/PhabricatorMultiFactorSettingsPanel.php',
|
Skeleton for "Multimeter", a performance sampling application
Summary:
Ref T6930. This application collects and displays performance samples -- roughly, things Phabricator spent some kind of resource on. It will collect samples on different types of resources and events:
- Wall time (queries, service calls, pages)
- Bytes In / Bytes Out (requests)
- Implicit requests to CSS/JS (static resources)
I've started with the simplest case (static resources), since this can be used in an immediate, straghtforward way to improve packaging (look at which individual files have the most requests recently).
There's no aggregation yet and a lot of the data isn't collected properly. Future diffs will add more dimension data (controllers, users), more event and resource types (queries, service calls, wall time), and more display options (aggregation, sorting).
Test Plan: {F389344}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6930
Differential Revision: https://secure.phabricator.com/D12623
2015-05-01 22:19:43 +02:00
|
|
|
'PhabricatorMultimeterApplication' => 'applications/multimeter/application/PhabricatorMultimeterApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMustVerifyEmailController' => 'applications/auth/controller/PhabricatorMustVerifyEmailController.php',
|
2013-01-03 15:01:14 +01:00
|
|
|
'PhabricatorMySQLConfigOptions' => 'applications/config/option/PhabricatorMySQLConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMySQLFileStorageEngine' => 'applications/files/engine/PhabricatorMySQLFileStorageEngine.php',
|
2015-12-21 19:25:28 +01:00
|
|
|
'PhabricatorMySQLFulltextStorageEngine' => 'applications/search/fulltextstorage/PhabricatorMySQLFulltextStorageEngine.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorMySQLSetupCheck' => 'applications/config/check/PhabricatorMySQLSetupCheck.php',
|
2013-05-10 22:43:59 +02:00
|
|
|
'PhabricatorNamedQuery' => 'applications/search/storage/PhabricatorNamedQuery.php',
|
2013-05-27 22:40:43 +02:00
|
|
|
'PhabricatorNamedQueryQuery' => 'applications/search/query/PhabricatorNamedQueryQuery.php',
|
2014-08-26 21:14:28 +02:00
|
|
|
'PhabricatorNavigationRemarkupRule' => 'infrastructure/markup/rule/PhabricatorNavigationRemarkupRule.php',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorNeverTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorNeverTriggerClock.php',
|
Implement basic ngram search for Owners Package names
Summary:
Ref T9979. This uses ngrams (specifically, trigrams) to build a reasonably efficient index for substring matching. Specifically, for a package like "Example", with ID 123, we store rows like this:
```
< ex, 123>
<exa, 123>
<xam, 123>
<amp, 123>
<mpl, 123>
<ple, 123>
<le , 123>
```
When the user searches for `exam`, we join this table for packages with tokens `exa` and `xam`. MySQL can do this a lot more efficiently than it can process a `LIKE "%exam%"` query against a huge table.
When the user searches for a one-letter or two-letter string, we only search the beginnings of words. This is probably what they want, the only thing we can do quickly, and a reasonable/expected behavior for typeaheads.
Test Plan:
- Ran storage upgrades and search indexer.
- Searched for stuff with "name contains".
- Used typehaead and got sensible results.
- Searched for `aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz` and saw only 16 joins.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9979
Differential Revision: https://secure.phabricator.com/D14846
2015-12-21 21:22:07 +01:00
|
|
|
'PhabricatorNgramsIndexEngineExtension' => 'applications/search/engineextension/PhabricatorNgramsIndexEngineExtension.php',
|
|
|
|
'PhabricatorNgramsInterface' => 'applications/search/interface/PhabricatorNgramsInterface.php',
|
2012-06-08 22:00:07 +02:00
|
|
|
'PhabricatorNotificationBuilder' => 'applications/notification/builder/PhabricatorNotificationBuilder.php',
|
2012-06-20 22:51:19 +02:00
|
|
|
'PhabricatorNotificationClearController' => 'applications/notification/controller/PhabricatorNotificationClearController.php',
|
2014-02-18 00:59:39 +01:00
|
|
|
'PhabricatorNotificationClient' => 'applications/notification/client/PhabricatorNotificationClient.php',
|
2013-01-03 18:29:19 +01:00
|
|
|
'PhabricatorNotificationConfigOptions' => 'applications/config/option/PhabricatorNotificationConfigOptions.php',
|
2012-06-08 22:00:07 +02:00
|
|
|
'PhabricatorNotificationController' => 'applications/notification/controller/PhabricatorNotificationController.php',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorNotificationDestructionEngineExtension' => 'applications/notification/engineextension/PhabricatorNotificationDestructionEngineExtension.php',
|
2012-06-12 02:49:32 +02:00
|
|
|
'PhabricatorNotificationIndividualController' => 'applications/notification/controller/PhabricatorNotificationIndividualController.php',
|
2012-06-18 23:07:38 +02:00
|
|
|
'PhabricatorNotificationListController' => 'applications/notification/controller/PhabricatorNotificationListController.php',
|
2012-06-11 18:37:06 +02:00
|
|
|
'PhabricatorNotificationPanelController' => 'applications/notification/controller/PhabricatorNotificationPanelController.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorNotificationQuery' => 'applications/notification/query/PhabricatorNotificationQuery.php',
|
2014-08-16 20:14:32 +02:00
|
|
|
'PhabricatorNotificationSearchEngine' => 'applications/notification/query/PhabricatorNotificationSearchEngine.php',
|
2016-04-13 21:07:48 +02:00
|
|
|
'PhabricatorNotificationServerRef' => 'applications/notification/client/PhabricatorNotificationServerRef.php',
|
|
|
|
'PhabricatorNotificationServersConfigOptionType' => 'applications/notification/config/PhabricatorNotificationServersConfigOptionType.php',
|
2014-06-24 01:26:16 +02:00
|
|
|
'PhabricatorNotificationStatusView' => 'applications/notification/view/PhabricatorNotificationStatusView.php',
|
2014-02-18 01:00:33 +01:00
|
|
|
'PhabricatorNotificationTestController' => 'applications/notification/controller/PhabricatorNotificationTestController.php',
|
2015-06-22 22:11:37 +02:00
|
|
|
'PhabricatorNotificationTestFeedStory' => 'applications/notification/feed/PhabricatorNotificationTestFeedStory.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorNotificationUIExample' => 'applications/uiexample/examples/PhabricatorNotificationUIExample.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorNotificationsApplication' => 'applications/notification/application/PhabricatorNotificationsApplication.php',
|
|
|
|
'PhabricatorNuanceApplication' => 'applications/nuance/application/PhabricatorNuanceApplication.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorOAuth1AuthProvider' => 'applications/auth/provider/PhabricatorOAuth1AuthProvider.php',
|
2016-03-16 14:36:04 +01:00
|
|
|
'PhabricatorOAuth1SecretTemporaryTokenType' => 'applications/auth/provider/PhabricatorOAuth1SecretTemporaryTokenType.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorOAuth2AuthProvider' => 'applications/auth/provider/PhabricatorOAuth2AuthProvider.php',
|
|
|
|
'PhabricatorOAuthAuthProvider' => 'applications/auth/provider/PhabricatorOAuthAuthProvider.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOAuthClientAuthorization' => 'applications/oauthserver/storage/PhabricatorOAuthClientAuthorization.php',
|
|
|
|
'PhabricatorOAuthClientAuthorizationQuery' => 'applications/oauthserver/query/PhabricatorOAuthClientAuthorizationQuery.php',
|
2014-07-21 16:05:17 +02:00
|
|
|
'PhabricatorOAuthClientController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientController.php',
|
2016-04-05 18:40:22 +02:00
|
|
|
'PhabricatorOAuthClientDisableController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientDisableController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOAuthClientEditController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientEditController.php',
|
|
|
|
'PhabricatorOAuthClientListController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientListController.php',
|
2015-01-15 02:27:45 +01:00
|
|
|
'PhabricatorOAuthClientSecretController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientSecretController.php',
|
2016-04-03 16:25:33 +02:00
|
|
|
'PhabricatorOAuthClientTestController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientTestController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOAuthClientViewController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientViewController.php',
|
|
|
|
'PhabricatorOAuthResponse' => 'applications/oauthserver/PhabricatorOAuthResponse.php',
|
|
|
|
'PhabricatorOAuthServer' => 'applications/oauthserver/PhabricatorOAuthServer.php',
|
|
|
|
'PhabricatorOAuthServerAccessToken' => 'applications/oauthserver/storage/PhabricatorOAuthServerAccessToken.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorOAuthServerApplication' => 'applications/oauthserver/application/PhabricatorOAuthServerApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOAuthServerAuthController' => 'applications/oauthserver/controller/PhabricatorOAuthServerAuthController.php',
|
|
|
|
'PhabricatorOAuthServerAuthorizationCode' => 'applications/oauthserver/storage/PhabricatorOAuthServerAuthorizationCode.php',
|
2014-03-18 21:28:19 +01:00
|
|
|
'PhabricatorOAuthServerAuthorizationsSettingsPanel' => 'applications/oauthserver/panel/PhabricatorOAuthServerAuthorizationsSettingsPanel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOAuthServerClient' => 'applications/oauthserver/storage/PhabricatorOAuthServerClient.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorOAuthServerClientAuthorizationPHIDType' => 'applications/oauthserver/phid/PhabricatorOAuthServerClientAuthorizationPHIDType.php',
|
|
|
|
'PhabricatorOAuthServerClientPHIDType' => 'applications/oauthserver/phid/PhabricatorOAuthServerClientPHIDType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOAuthServerClientQuery' => 'applications/oauthserver/query/PhabricatorOAuthServerClientQuery.php',
|
2014-03-18 21:31:04 +01:00
|
|
|
'PhabricatorOAuthServerClientSearchEngine' => 'applications/oauthserver/query/PhabricatorOAuthServerClientSearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOAuthServerController' => 'applications/oauthserver/controller/PhabricatorOAuthServerController.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhabricatorOAuthServerCreateClientsCapability' => 'applications/oauthserver/capability/PhabricatorOAuthServerCreateClientsCapability.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOAuthServerDAO' => 'applications/oauthserver/storage/PhabricatorOAuthServerDAO.php',
|
2016-04-04 18:27:42 +02:00
|
|
|
'PhabricatorOAuthServerEditEngine' => 'applications/oauthserver/editor/PhabricatorOAuthServerEditEngine.php',
|
|
|
|
'PhabricatorOAuthServerEditor' => 'applications/oauthserver/editor/PhabricatorOAuthServerEditor.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOAuthServerScope' => 'applications/oauthserver/PhabricatorOAuthServerScope.php',
|
|
|
|
'PhabricatorOAuthServerTestCase' => 'applications/oauthserver/__tests__/PhabricatorOAuthServerTestCase.php',
|
|
|
|
'PhabricatorOAuthServerTokenController' => 'applications/oauthserver/controller/PhabricatorOAuthServerTokenController.php',
|
2016-04-04 18:27:42 +02:00
|
|
|
'PhabricatorOAuthServerTransaction' => 'applications/oauthserver/storage/PhabricatorOAuthServerTransaction.php',
|
|
|
|
'PhabricatorOAuthServerTransactionQuery' => 'applications/oauthserver/query/PhabricatorOAuthServerTransactionQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorObjectHandle' => 'applications/phid/PhabricatorObjectHandle.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorObjectHasAsanaSubtaskEdgeType' => 'applications/doorkeeper/edge/PhabricatorObjectHasAsanaSubtaskEdgeType.php',
|
|
|
|
'PhabricatorObjectHasAsanaTaskEdgeType' => 'applications/doorkeeper/edge/PhabricatorObjectHasAsanaTaskEdgeType.php',
|
|
|
|
'PhabricatorObjectHasContributorEdgeType' => 'applications/transactions/edges/PhabricatorObjectHasContributorEdgeType.php',
|
|
|
|
'PhabricatorObjectHasFileEdgeType' => 'applications/transactions/edges/PhabricatorObjectHasFileEdgeType.php',
|
|
|
|
'PhabricatorObjectHasJiraIssueEdgeType' => 'applications/doorkeeper/edge/PhabricatorObjectHasJiraIssueEdgeType.php',
|
|
|
|
'PhabricatorObjectHasSubscriberEdgeType' => 'applications/transactions/edges/PhabricatorObjectHasSubscriberEdgeType.php',
|
|
|
|
'PhabricatorObjectHasUnsubscriberEdgeType' => 'applications/transactions/edges/PhabricatorObjectHasUnsubscriberEdgeType.php',
|
|
|
|
'PhabricatorObjectHasWatcherEdgeType' => 'applications/transactions/edges/PhabricatorObjectHasWatcherEdgeType.php',
|
2014-03-08 02:44:44 +01:00
|
|
|
'PhabricatorObjectListQuery' => 'applications/phid/query/PhabricatorObjectListQuery.php',
|
|
|
|
'PhabricatorObjectListQueryTestCase' => 'applications/phid/query/__tests__/PhabricatorObjectListQueryTestCase.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorObjectMailReceiver' => 'applications/metamta/receiver/PhabricatorObjectMailReceiver.php',
|
2013-05-17 12:49:29 +02:00
|
|
|
'PhabricatorObjectMailReceiverTestCase' => 'applications/metamta/receiver/__tests__/PhabricatorObjectMailReceiverTestCase.php',
|
2015-01-01 05:40:26 +01:00
|
|
|
'PhabricatorObjectMentionedByObjectEdgeType' => 'applications/transactions/edges/PhabricatorObjectMentionedByObjectEdgeType.php',
|
|
|
|
'PhabricatorObjectMentionsObjectEdgeType' => 'applications/transactions/edges/PhabricatorObjectMentionsObjectEdgeType.php',
|
2013-07-21 15:34:21 +02:00
|
|
|
'PhabricatorObjectQuery' => 'applications/phid/query/PhabricatorObjectQuery.php',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorObjectRemarkupRule' => 'infrastructure/markup/rule/PhabricatorObjectRemarkupRule.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorObjectSelectorDialog' => 'view/control/PhabricatorObjectSelectorDialog.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorObjectUsesCredentialsEdgeType' => 'applications/transactions/edges/PhabricatorObjectUsesCredentialsEdgeType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOffsetPagedQuery' => 'infrastructure/query/PhabricatorOffsetPagedQuery.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorOldWorldContentSource' => 'infrastructure/contentsource/PhabricatorOldWorldContentSource.php',
|
2015-01-16 00:57:45 +01:00
|
|
|
'PhabricatorOneTimeTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorOneTimeTriggerClock.php',
|
2015-04-07 23:38:03 +02:00
|
|
|
'PhabricatorOpcodeCacheSpec' => 'applications/cache/spec/PhabricatorOpcodeCacheSpec.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOwnerPathQuery' => 'applications/owners/query/PhabricatorOwnerPathQuery.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorOwnersApplication' => 'applications/owners/application/PhabricatorOwnersApplication.php',
|
2015-12-09 22:41:31 +01:00
|
|
|
'PhabricatorOwnersArchiveController' => 'applications/owners/controller/PhabricatorOwnersArchiveController.php',
|
2013-01-16 19:52:30 +01:00
|
|
|
'PhabricatorOwnersConfigOptions' => 'applications/owners/config/PhabricatorOwnersConfigOptions.php',
|
2015-09-10 22:32:31 +02:00
|
|
|
'PhabricatorOwnersConfiguredCustomField' => 'applications/owners/customfield/PhabricatorOwnersConfiguredCustomField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOwnersController' => 'applications/owners/controller/PhabricatorOwnersController.php',
|
2015-09-10 22:32:31 +02:00
|
|
|
'PhabricatorOwnersCustomField' => 'applications/owners/customfield/PhabricatorOwnersCustomField.php',
|
|
|
|
'PhabricatorOwnersCustomFieldNumericIndex' => 'applications/owners/storage/PhabricatorOwnersCustomFieldNumericIndex.php',
|
|
|
|
'PhabricatorOwnersCustomFieldStorage' => 'applications/owners/storage/PhabricatorOwnersCustomFieldStorage.php',
|
|
|
|
'PhabricatorOwnersCustomFieldStringIndex' => 'applications/owners/storage/PhabricatorOwnersCustomFieldStringIndex.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOwnersDAO' => 'applications/owners/storage/PhabricatorOwnersDAO.php',
|
2016-02-15 20:37:13 +01:00
|
|
|
'PhabricatorOwnersDefaultEditCapability' => 'applications/owners/capability/PhabricatorOwnersDefaultEditCapability.php',
|
|
|
|
'PhabricatorOwnersDefaultViewCapability' => 'applications/owners/capability/PhabricatorOwnersDefaultViewCapability.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOwnersDetailController' => 'applications/owners/controller/PhabricatorOwnersDetailController.php',
|
|
|
|
'PhabricatorOwnersEditController' => 'applications/owners/controller/PhabricatorOwnersEditController.php',
|
|
|
|
'PhabricatorOwnersListController' => 'applications/owners/controller/PhabricatorOwnersListController.php',
|
|
|
|
'PhabricatorOwnersOwner' => 'applications/owners/storage/PhabricatorOwnersOwner.php',
|
|
|
|
'PhabricatorOwnersPackage' => 'applications/owners/storage/PhabricatorOwnersPackage.php',
|
2014-07-11 01:21:21 +02:00
|
|
|
'PhabricatorOwnersPackageDatasource' => 'applications/owners/typeahead/PhabricatorOwnersPackageDatasource.php',
|
2015-11-29 18:33:36 +01:00
|
|
|
'PhabricatorOwnersPackageEditEngine' => 'applications/owners/editor/PhabricatorOwnersPackageEditEngine.php',
|
Implement basic ngram search for Owners Package names
Summary:
Ref T9979. This uses ngrams (specifically, trigrams) to build a reasonably efficient index for substring matching. Specifically, for a package like "Example", with ID 123, we store rows like this:
```
< ex, 123>
<exa, 123>
<xam, 123>
<amp, 123>
<mpl, 123>
<ple, 123>
<le , 123>
```
When the user searches for `exam`, we join this table for packages with tokens `exa` and `xam`. MySQL can do this a lot more efficiently than it can process a `LIKE "%exam%"` query against a huge table.
When the user searches for a one-letter or two-letter string, we only search the beginnings of words. This is probably what they want, the only thing we can do quickly, and a reasonable/expected behavior for typeaheads.
Test Plan:
- Ran storage upgrades and search indexer.
- Searched for stuff with "name contains".
- Used typehaead and got sensible results.
- Searched for `aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz` and saw only 16 joins.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9979
Differential Revision: https://secure.phabricator.com/D14846
2015-12-21 21:22:07 +01:00
|
|
|
'PhabricatorOwnersPackageFulltextEngine' => 'applications/owners/query/PhabricatorOwnersPackageFulltextEngine.php',
|
2015-08-31 19:17:54 +02:00
|
|
|
'PhabricatorOwnersPackageFunctionDatasource' => 'applications/owners/typeahead/PhabricatorOwnersPackageFunctionDatasource.php',
|
Implement basic ngram search for Owners Package names
Summary:
Ref T9979. This uses ngrams (specifically, trigrams) to build a reasonably efficient index for substring matching. Specifically, for a package like "Example", with ID 123, we store rows like this:
```
< ex, 123>
<exa, 123>
<xam, 123>
<amp, 123>
<mpl, 123>
<ple, 123>
<le , 123>
```
When the user searches for `exam`, we join this table for packages with tokens `exa` and `xam`. MySQL can do this a lot more efficiently than it can process a `LIKE "%exam%"` query against a huge table.
When the user searches for a one-letter or two-letter string, we only search the beginnings of words. This is probably what they want, the only thing we can do quickly, and a reasonable/expected behavior for typeaheads.
Test Plan:
- Ran storage upgrades and search indexer.
- Searched for stuff with "name contains".
- Used typehaead and got sensible results.
- Searched for `aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz` and saw only 16 joins.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9979
Differential Revision: https://secure.phabricator.com/D14846
2015-12-21 21:22:07 +01:00
|
|
|
'PhabricatorOwnersPackageNameNgrams' => 'applications/owners/storage/PhabricatorOwnersPackageNameNgrams.php',
|
2015-08-31 19:17:54 +02:00
|
|
|
'PhabricatorOwnersPackageOwnerDatasource' => 'applications/owners/typeahead/PhabricatorOwnersPackageOwnerDatasource.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorOwnersPackagePHIDType' => 'applications/owners/phid/PhabricatorOwnersPackagePHIDType.php',
|
2012-08-08 21:25:11 +02:00
|
|
|
'PhabricatorOwnersPackageQuery' => 'applications/owners/query/PhabricatorOwnersPackageQuery.php',
|
2015-05-27 19:29:01 +02:00
|
|
|
'PhabricatorOwnersPackageSearchEngine' => 'applications/owners/query/PhabricatorOwnersPackageSearchEngine.php',
|
2012-12-07 02:23:56 +01:00
|
|
|
'PhabricatorOwnersPackageTestCase' => 'applications/owners/storage/__tests__/PhabricatorOwnersPackageTestCase.php',
|
2015-05-27 19:30:08 +02:00
|
|
|
'PhabricatorOwnersPackageTransaction' => 'applications/owners/storage/PhabricatorOwnersPackageTransaction.php',
|
|
|
|
'PhabricatorOwnersPackageTransactionEditor' => 'applications/owners/editor/PhabricatorOwnersPackageTransactionEditor.php',
|
|
|
|
'PhabricatorOwnersPackageTransactionQuery' => 'applications/owners/query/PhabricatorOwnersPackageTransactionQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOwnersPath' => 'applications/owners/storage/PhabricatorOwnersPath.php',
|
2015-05-27 19:29:50 +02:00
|
|
|
'PhabricatorOwnersPathsController' => 'applications/owners/controller/PhabricatorOwnersPathsController.php',
|
2015-12-14 15:11:03 +01:00
|
|
|
'PhabricatorOwnersPathsSearchEngineAttachment' => 'applications/owners/engineextension/PhabricatorOwnersPathsSearchEngineAttachment.php',
|
2015-11-16 18:53:01 +01:00
|
|
|
'PhabricatorOwnersSchemaSpec' => 'applications/owners/storage/PhabricatorOwnersSchemaSpec.php',
|
2015-07-06 14:52:04 +02:00
|
|
|
'PhabricatorOwnersSearchField' => 'applications/owners/searchfield/PhabricatorOwnersSearchField.php',
|
2013-01-09 15:05:34 +01:00
|
|
|
'PhabricatorPHDConfigOptions' => 'applications/config/option/PhabricatorPHDConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPHID' => 'applications/phid/storage/PhabricatorPHID.php',
|
|
|
|
'PhabricatorPHIDConstants' => 'applications/phid/PhabricatorPHIDConstants.php',
|
2013-10-26 00:58:17 +02:00
|
|
|
'PhabricatorPHIDInterface' => 'applications/phid/interface/PhabricatorPHIDInterface.php',
|
2015-11-29 22:24:47 +01:00
|
|
|
'PhabricatorPHIDListEditField' => 'applications/transactions/editfield/PhabricatorPHIDListEditField.php',
|
2015-12-04 18:30:53 +01:00
|
|
|
'PhabricatorPHIDListEditType' => 'applications/transactions/edittype/PhabricatorPHIDListEditType.php',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorPHIDResolver' => 'applications/phid/resolver/PhabricatorPHIDResolver.php',
|
2013-07-21 15:34:21 +02:00
|
|
|
'PhabricatorPHIDType' => 'applications/phid/type/PhabricatorPHIDType.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorPHIDTypeTestCase' => 'applications/phid/type/__tests__/PhabricatorPHIDTypeTestCase.php',
|
2015-12-13 19:11:40 +01:00
|
|
|
'PhabricatorPHIDsSearchField' => 'applications/search/field/PhabricatorPHIDsSearchField.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPHPASTApplication' => 'applications/phpast/application/PhabricatorPHPASTApplication.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorPHPConfigSetupCheck' => 'applications/config/check/PhabricatorPHPConfigSetupCheck.php',
|
2013-01-15 21:03:44 +01:00
|
|
|
'PhabricatorPHPMailerConfigOptions' => 'applications/config/option/PhabricatorPHPMailerConfigOptions.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorPagedFormUIExample' => 'applications/uiexample/examples/PhabricatorPagedFormUIExample.php',
|
2015-01-04 20:38:59 +01:00
|
|
|
'PhabricatorPagerUIExample' => 'applications/uiexample/examples/PhabricatorPagerUIExample.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPassphraseApplication' => 'applications/passphrase/application/PhabricatorPassphraseApplication.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorPasswordAuthProvider' => 'applications/auth/provider/PhabricatorPasswordAuthProvider.php',
|
2014-02-18 18:31:30 +01:00
|
|
|
'PhabricatorPasswordHasher' => 'infrastructure/util/password/PhabricatorPasswordHasher.php',
|
|
|
|
'PhabricatorPasswordHasherTestCase' => 'infrastructure/util/password/__tests__/PhabricatorPasswordHasherTestCase.php',
|
|
|
|
'PhabricatorPasswordHasherUnavailableException' => 'infrastructure/util/password/PhabricatorPasswordHasherUnavailableException.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorPasswordSettingsPanel' => 'applications/settings/panel/PhabricatorPasswordSettingsPanel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPaste' => 'applications/paste/storage/PhabricatorPaste.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPasteApplication' => 'applications/paste/application/PhabricatorPasteApplication.php',
|
2015-12-09 20:50:19 +01:00
|
|
|
'PhabricatorPasteArchiveController' => 'applications/paste/controller/PhabricatorPasteArchiveController.php',
|
2013-07-30 22:26:55 +02:00
|
|
|
'PhabricatorPasteConfigOptions' => 'applications/paste/config/PhabricatorPasteConfigOptions.php',
|
2015-12-14 15:01:04 +01:00
|
|
|
'PhabricatorPasteContentSearchEngineAttachment' => 'applications/paste/engineextension/PhabricatorPasteContentSearchEngineAttachment.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPasteController' => 'applications/paste/controller/PhabricatorPasteController.php',
|
|
|
|
'PhabricatorPasteDAO' => 'applications/paste/storage/PhabricatorPasteDAO.php',
|
2012-08-24 22:19:14 +02:00
|
|
|
'PhabricatorPasteEditController' => 'applications/paste/controller/PhabricatorPasteEditController.php',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorPasteEditEngine' => 'applications/paste/editor/PhabricatorPasteEditEngine.php',
|
2013-08-02 21:56:58 +02:00
|
|
|
'PhabricatorPasteEditor' => 'applications/paste/editor/PhabricatorPasteEditor.php',
|
2015-12-25 15:20:25 +01:00
|
|
|
'PhabricatorPasteFilenameContextFreeGrammar' => 'applications/paste/lipsum/PhabricatorPasteFilenameContextFreeGrammar.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPasteListController' => 'applications/paste/controller/PhabricatorPasteListController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorPastePastePHIDType' => 'applications/paste/phid/PhabricatorPastePastePHIDType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPasteQuery' => 'applications/paste/query/PhabricatorPasteQuery.php',
|
2015-09-25 19:45:01 +02:00
|
|
|
'PhabricatorPasteRawController' => 'applications/paste/controller/PhabricatorPasteRawController.php',
|
2013-02-26 23:57:41 +01:00
|
|
|
'PhabricatorPasteRemarkupRule' => 'applications/paste/remarkup/PhabricatorPasteRemarkupRule.php',
|
2014-09-24 22:50:57 +02:00
|
|
|
'PhabricatorPasteSchemaSpec' => 'applications/paste/storage/PhabricatorPasteSchemaSpec.php',
|
2013-04-14 15:53:20 +02:00
|
|
|
'PhabricatorPasteSearchEngine' => 'applications/paste/query/PhabricatorPasteSearchEngine.php',
|
2015-10-20 21:07:04 +02:00
|
|
|
'PhabricatorPasteSnippet' => 'applications/paste/snippet/PhabricatorPasteSnippet.php',
|
2013-04-29 21:10:53 +02:00
|
|
|
'PhabricatorPasteTestDataGenerator' => 'applications/paste/lipsum/PhabricatorPasteTestDataGenerator.php',
|
2013-08-02 21:56:58 +02:00
|
|
|
'PhabricatorPasteTransaction' => 'applications/paste/storage/PhabricatorPasteTransaction.php',
|
|
|
|
'PhabricatorPasteTransactionComment' => 'applications/paste/storage/PhabricatorPasteTransactionComment.php',
|
|
|
|
'PhabricatorPasteTransactionQuery' => 'applications/paste/query/PhabricatorPasteTransactionQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPasteViewController' => 'applications/paste/controller/PhabricatorPasteViewController.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorPathSetupCheck' => 'applications/config/check/PhabricatorPathSetupCheck.php',
|
2015-04-24 00:44:27 +02:00
|
|
|
'PhabricatorPeopleAnyOwnerDatasource' => 'applications/people/typeahead/PhabricatorPeopleAnyOwnerDatasource.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPeopleApplication' => 'applications/people/application/PhabricatorPeopleApplication.php',
|
2013-11-13 20:24:18 +01:00
|
|
|
'PhabricatorPeopleApproveController' => 'applications/people/controller/PhabricatorPeopleApproveController.php',
|
2014-02-24 19:04:23 +01:00
|
|
|
'PhabricatorPeopleCalendarController' => 'applications/people/controller/PhabricatorPeopleCalendarController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPeopleController' => 'applications/people/controller/PhabricatorPeopleController.php',
|
2014-04-02 21:06:27 +02:00
|
|
|
'PhabricatorPeopleCreateController' => 'applications/people/controller/PhabricatorPeopleCreateController.php',
|
2014-07-18 00:44:18 +02:00
|
|
|
'PhabricatorPeopleDatasource' => 'applications/people/typeahead/PhabricatorPeopleDatasource.php',
|
2014-04-02 21:05:07 +02:00
|
|
|
'PhabricatorPeopleDeleteController' => 'applications/people/controller/PhabricatorPeopleDeleteController.php',
|
2016-01-14 15:47:06 +01:00
|
|
|
'PhabricatorPeopleDetailsProfilePanel' => 'applications/people/profilepanel/PhabricatorPeopleDetailsProfilePanel.php',
|
2013-11-13 20:24:18 +01:00
|
|
|
'PhabricatorPeopleDisableController' => 'applications/people/controller/PhabricatorPeopleDisableController.php',
|
2014-04-02 21:05:49 +02:00
|
|
|
'PhabricatorPeopleEmpowerController' => 'applications/people/controller/PhabricatorPeopleEmpowerController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorPeopleExternalPHIDType' => 'applications/people/phid/PhabricatorPeopleExternalPHIDType.php',
|
2016-01-24 14:43:57 +01:00
|
|
|
'PhabricatorPeopleIconSet' => 'applications/people/icon/PhabricatorPeopleIconSet.php',
|
2015-02-11 15:05:53 +01:00
|
|
|
'PhabricatorPeopleInviteController' => 'applications/people/controller/PhabricatorPeopleInviteController.php',
|
|
|
|
'PhabricatorPeopleInviteListController' => 'applications/people/controller/PhabricatorPeopleInviteListController.php',
|
|
|
|
'PhabricatorPeopleInviteSendController' => 'applications/people/controller/PhabricatorPeopleInviteSendController.php',
|
2012-07-04 04:10:38 +02:00
|
|
|
'PhabricatorPeopleLdapController' => 'applications/people/controller/PhabricatorPeopleLdapController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPeopleListController' => 'applications/people/controller/PhabricatorPeopleListController.php',
|
2014-04-28 02:31:35 +02:00
|
|
|
'PhabricatorPeopleLogQuery' => 'applications/people/query/PhabricatorPeopleLogQuery.php',
|
|
|
|
'PhabricatorPeopleLogSearchEngine' => 'applications/people/query/PhabricatorPeopleLogSearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPeopleLogsController' => 'applications/people/controller/PhabricatorPeopleLogsController.php',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PhabricatorPeopleMainMenuBarExtension' => 'applications/people/extension/PhabricatorPeopleMainMenuBarExtension.php',
|
2016-01-24 16:07:17 +01:00
|
|
|
'PhabricatorPeopleManageProfilePanel' => 'applications/people/profilepanel/PhabricatorPeopleManageProfilePanel.php',
|
2014-04-02 21:06:27 +02:00
|
|
|
'PhabricatorPeopleNewController' => 'applications/people/controller/PhabricatorPeopleNewController.php',
|
2015-04-23 12:07:24 +02:00
|
|
|
'PhabricatorPeopleNoOwnerDatasource' => 'applications/people/typeahead/PhabricatorPeopleNoOwnerDatasource.php',
|
|
|
|
'PhabricatorPeopleOwnerDatasource' => 'applications/people/typeahead/PhabricatorPeopleOwnerDatasource.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPeopleProfileController' => 'applications/people/controller/PhabricatorPeopleProfileController.php',
|
2013-06-07 18:55:55 +02:00
|
|
|
'PhabricatorPeopleProfileEditController' => 'applications/people/controller/PhabricatorPeopleProfileEditController.php',
|
2016-01-24 16:07:17 +01:00
|
|
|
'PhabricatorPeopleProfileManageController' => 'applications/people/controller/PhabricatorPeopleProfileManageController.php',
|
2016-01-14 15:47:06 +01:00
|
|
|
'PhabricatorPeopleProfilePanelEngine' => 'applications/people/engine/PhabricatorPeopleProfilePanelEngine.php',
|
2013-07-10 01:23:54 +02:00
|
|
|
'PhabricatorPeopleProfilePictureController' => 'applications/people/controller/PhabricatorPeopleProfilePictureController.php',
|
2016-01-14 15:47:06 +01:00
|
|
|
'PhabricatorPeopleProfileViewController' => 'applications/people/controller/PhabricatorPeopleProfileViewController.php',
|
2013-05-31 19:51:20 +02:00
|
|
|
'PhabricatorPeopleQuery' => 'applications/people/query/PhabricatorPeopleQuery.php',
|
2014-04-02 21:05:19 +02:00
|
|
|
'PhabricatorPeopleRenameController' => 'applications/people/controller/PhabricatorPeopleRenameController.php',
|
2013-05-31 19:51:20 +02:00
|
|
|
'PhabricatorPeopleSearchEngine' => 'applications/people/query/PhabricatorPeopleSearchEngine.php',
|
2013-04-15 04:09:20 +02:00
|
|
|
'PhabricatorPeopleTestDataGenerator' => 'applications/people/lipsum/PhabricatorPeopleTestDataGenerator.php',
|
2015-06-08 22:35:57 +02:00
|
|
|
'PhabricatorPeopleTransactionQuery' => 'applications/people/query/PhabricatorPeopleTransactionQuery.php',
|
2015-04-23 17:06:46 +02:00
|
|
|
'PhabricatorPeopleUserFunctionDatasource' => 'applications/people/typeahead/PhabricatorPeopleUserFunctionDatasource.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorPeopleUserPHIDType' => 'applications/people/phid/PhabricatorPeopleUserPHIDType.php',
|
2014-04-02 21:06:17 +02:00
|
|
|
'PhabricatorPeopleWelcomeController' => 'applications/people/controller/PhabricatorPeopleWelcomeController.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorPersonaAuthProvider' => 'applications/auth/provider/PhabricatorPersonaAuthProvider.php',
|
2015-01-09 01:28:04 +01:00
|
|
|
'PhabricatorPhabricatorAuthProvider' => 'applications/auth/provider/PhabricatorPhabricatorAuthProvider.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPhameApplication' => 'applications/phame/application/PhabricatorPhameApplication.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorPhameBlogPHIDType' => 'applications/phame/phid/PhabricatorPhameBlogPHIDType.php',
|
|
|
|
'PhabricatorPhamePostPHIDType' => 'applications/phame/phid/PhabricatorPhamePostPHIDType.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPhluxApplication' => 'applications/phlux/application/PhabricatorPhluxApplication.php',
|
|
|
|
'PhabricatorPholioApplication' => 'applications/pholio/application/PhabricatorPholioApplication.php',
|
2013-01-16 19:52:30 +01:00
|
|
|
'PhabricatorPholioConfigOptions' => 'applications/pholio/config/PhabricatorPholioConfigOptions.php',
|
2013-05-06 21:33:37 +02:00
|
|
|
'PhabricatorPholioMockTestDataGenerator' => 'applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPhortuneApplication' => 'applications/phortune/application/PhabricatorPhortuneApplication.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorPhortuneContentSource' => 'applications/phortune/contentsource/PhabricatorPhortuneContentSource.php',
|
2015-01-30 20:29:05 +01:00
|
|
|
'PhabricatorPhortuneManagementInvoiceWorkflow' => 'applications/phortune/management/PhabricatorPhortuneManagementInvoiceWorkflow.php',
|
|
|
|
'PhabricatorPhortuneManagementWorkflow' => 'applications/phortune/management/PhabricatorPhortuneManagementWorkflow.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPhragmentApplication' => 'applications/phragment/application/PhabricatorPhragmentApplication.php',
|
|
|
|
'PhabricatorPhrequentApplication' => 'applications/phrequent/application/PhabricatorPhrequentApplication.php',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhabricatorPhrequentConfigOptions' => 'applications/phrequent/config/PhabricatorPhrequentConfigOptions.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPhrictionApplication' => 'applications/phriction/application/PhabricatorPhrictionApplication.php',
|
2013-01-15 15:31:53 +01:00
|
|
|
'PhabricatorPhrictionConfigOptions' => 'applications/phriction/config/PhabricatorPhrictionConfigOptions.php',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlApplication' => 'applications/phurl/application/PhabricatorPhurlApplication.php',
|
2015-11-09 19:09:19 +01:00
|
|
|
'PhabricatorPhurlConfigOptions' => 'applications/config/option/PhabricatorPhurlConfigOptions.php',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlController' => 'applications/phurl/controller/PhabricatorPhurlController.php',
|
|
|
|
'PhabricatorPhurlDAO' => 'applications/phurl/storage/PhabricatorPhurlDAO.php',
|
2015-11-06 22:47:52 +01:00
|
|
|
'PhabricatorPhurlLinkRemarkupRule' => 'applications/phurl/remarkup/PhabricatorPhurlLinkRemarkupRule.php',
|
|
|
|
'PhabricatorPhurlRemarkupRule' => 'applications/phurl/remarkup/PhabricatorPhurlRemarkupRule.php',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlSchemaSpec' => 'applications/phurl/storage/PhabricatorPhurlSchemaSpec.php',
|
2015-11-09 19:09:19 +01:00
|
|
|
'PhabricatorPhurlShortURLController' => 'applications/phurl/controller/PhabricatorPhurlShortURLController.php',
|
|
|
|
'PhabricatorPhurlShortURLDefaultController' => 'applications/phurl/controller/PhabricatorPhurlShortURLDefaultController.php',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlURL' => 'applications/phurl/storage/PhabricatorPhurlURL.php',
|
2015-11-02 21:08:47 +01:00
|
|
|
'PhabricatorPhurlURLAccessController' => 'applications/phurl/controller/PhabricatorPhurlURLAccessController.php',
|
2015-11-13 23:36:58 +01:00
|
|
|
'PhabricatorPhurlURLCommentController' => 'applications/phurl/controller/PhabricatorPhurlURLCommentController.php',
|
2015-11-18 21:24:09 +01:00
|
|
|
'PhabricatorPhurlURLCreateCapability' => 'applications/phurl/capability/PhabricatorPhurlURLCreateCapability.php',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlURLEditController' => 'applications/phurl/controller/PhabricatorPhurlURLEditController.php',
|
|
|
|
'PhabricatorPhurlURLEditor' => 'applications/phurl/editor/PhabricatorPhurlURLEditor.php',
|
|
|
|
'PhabricatorPhurlURLListController' => 'applications/phurl/controller/PhabricatorPhurlURLListController.php',
|
2015-12-22 17:05:56 +01:00
|
|
|
'PhabricatorPhurlURLMailReceiver' => 'applications/phurl/mail/PhabricatorPhurlURLMailReceiver.php',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlURLPHIDType' => 'applications/phurl/phid/PhabricatorPhurlURLPHIDType.php',
|
|
|
|
'PhabricatorPhurlURLQuery' => 'applications/phurl/query/PhabricatorPhurlURLQuery.php',
|
2015-12-22 17:05:56 +01:00
|
|
|
'PhabricatorPhurlURLReplyHandler' => 'applications/phurl/mail/PhabricatorPhurlURLReplyHandler.php',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlURLSearchEngine' => 'applications/phurl/query/PhabricatorPhurlURLSearchEngine.php',
|
|
|
|
'PhabricatorPhurlURLTransaction' => 'applications/phurl/storage/PhabricatorPhurlURLTransaction.php',
|
|
|
|
'PhabricatorPhurlURLTransactionComment' => 'applications/phurl/storage/PhabricatorPhurlURLTransactionComment.php',
|
|
|
|
'PhabricatorPhurlURLTransactionQuery' => 'applications/phurl/query/PhabricatorPhurlURLTransactionQuery.php',
|
|
|
|
'PhabricatorPhurlURLViewController' => 'applications/phurl/controller/PhabricatorPhurlURLViewController.php',
|
2015-12-20 16:03:07 +01:00
|
|
|
'PhabricatorPirateEnglishTranslation' => 'infrastructure/internationalization/translation/PhabricatorPirateEnglishTranslation.php',
|
2015-06-29 23:04:48 +02:00
|
|
|
'PhabricatorPlatformSite' => 'aphront/site/PhabricatorPlatformSite.php',
|
2016-02-09 00:24:52 +01:00
|
|
|
'PhabricatorPointsEditField' => 'applications/transactions/editfield/PhabricatorPointsEditField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPolicies' => 'applications/policy/constants/PhabricatorPolicies.php',
|
2013-10-11 01:09:51 +02:00
|
|
|
'PhabricatorPolicy' => 'applications/policy/storage/PhabricatorPolicy.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPolicyApplication' => 'applications/policy/application/PhabricatorPolicyApplication.php',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorPolicyAwareQuery' => 'infrastructure/query/policy/PhabricatorPolicyAwareQuery.php',
|
|
|
|
'PhabricatorPolicyAwareTestQuery' => 'applications/policy/__tests__/PhabricatorPolicyAwareTestQuery.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhabricatorPolicyCanEditCapability' => 'applications/policy/capability/PhabricatorPolicyCanEditCapability.php',
|
|
|
|
'PhabricatorPolicyCanJoinCapability' => 'applications/policy/capability/PhabricatorPolicyCanJoinCapability.php',
|
|
|
|
'PhabricatorPolicyCanViewCapability' => 'applications/policy/capability/PhabricatorPolicyCanViewCapability.php',
|
Allow applications to define new policy capabilities
Summary:
Ref T603. I want to let applications define new capabilities (like "can manage global rules" in Herald) and get full support for them, including reasonable error strings in the UI.
Currently, this is difficult for a couple of reasons. Partly this is just a code organization issue, which is easy to fix. The bigger thing is that we have a bunch of strings which depend on both the policy and capability, like: "You must be an administrator to view this object." "Administrator" is the policy, and "view" is the capability.
That means every new capability has to add a string for each policy, and every new policy (should we introduce any) needs to add a string for each capability. And we can't do any piecemeal "You must be a {$role} to {$action} this object" becuase it's impossible to translate.
Instead, make all the strings depend on //only// the policy, //only// the capability, or //only// the object type. This makes the dialogs read a little more strangely, but I think it's still pretty easy to understand, and it makes adding new stuff way way easier.
Also provide more context, and more useful exception messages.
Test Plan:
- See screenshots.
- Also triggered a policy exception and verified it was dramatically more useful than it used to be.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: chad, aran
Maniphest Tasks: T603
Differential Revision: https://secure.phabricator.com/D7260
2013-10-07 22:28:58 +02:00
|
|
|
'PhabricatorPolicyCapability' => 'applications/policy/capability/PhabricatorPolicyCapability.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorPolicyCapabilityTestCase' => 'applications/policy/capability/__tests__/PhabricatorPolicyCapabilityTestCase.php',
|
2013-09-27 19:50:19 +02:00
|
|
|
'PhabricatorPolicyConfigOptions' => 'applications/policy/config/PhabricatorPolicyConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPolicyConstants' => 'applications/policy/constants/PhabricatorPolicyConstants.php',
|
2013-09-27 17:43:41 +02:00
|
|
|
'PhabricatorPolicyController' => 'applications/policy/controller/PhabricatorPolicyController.php',
|
2013-10-11 01:09:51 +02:00
|
|
|
'PhabricatorPolicyDAO' => 'applications/policy/storage/PhabricatorPolicyDAO.php',
|
2013-09-25 22:45:04 +02:00
|
|
|
'PhabricatorPolicyDataTestCase' => 'applications/policy/__tests__/PhabricatorPolicyDataTestCase.php',
|
2013-10-09 23:05:10 +02:00
|
|
|
'PhabricatorPolicyEditController' => 'applications/policy/controller/PhabricatorPolicyEditController.php',
|
2015-11-29 19:05:41 +01:00
|
|
|
'PhabricatorPolicyEditEngineExtension' => 'applications/policy/editor/PhabricatorPolicyEditEngineExtension.php',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorPolicyEditField' => 'applications/transactions/editfield/PhabricatorPolicyEditField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPolicyException' => 'applications/policy/exception/PhabricatorPolicyException.php',
|
2013-09-27 17:43:41 +02:00
|
|
|
'PhabricatorPolicyExplainController' => 'applications/policy/controller/PhabricatorPolicyExplainController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPolicyFilter' => 'applications/policy/filter/PhabricatorPolicyFilter.php',
|
|
|
|
'PhabricatorPolicyInterface' => 'applications/policy/interface/PhabricatorPolicyInterface.php',
|
2013-09-29 18:06:41 +02:00
|
|
|
'PhabricatorPolicyManagementShowWorkflow' => 'applications/policy/management/PhabricatorPolicyManagementShowWorkflow.php',
|
2013-10-02 01:01:15 +02:00
|
|
|
'PhabricatorPolicyManagementUnlockWorkflow' => 'applications/policy/management/PhabricatorPolicyManagementUnlockWorkflow.php',
|
2013-09-29 18:06:41 +02:00
|
|
|
'PhabricatorPolicyManagementWorkflow' => 'applications/policy/management/PhabricatorPolicyManagementWorkflow.php',
|
2013-10-11 01:09:51 +02:00
|
|
|
'PhabricatorPolicyPHIDTypePolicy' => 'applications/policy/phid/PhabricatorPolicyPHIDTypePolicy.php',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorPolicyQuery' => 'applications/policy/query/PhabricatorPolicyQuery.php',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorPolicyRequestExceptionHandler' => 'aphront/handler/PhabricatorPolicyRequestExceptionHandler.php',
|
2013-10-09 23:05:10 +02:00
|
|
|
'PhabricatorPolicyRule' => 'applications/policy/rule/PhabricatorPolicyRule.php',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorPolicySearchEngineExtension' => 'applications/policy/engineextension/PhabricatorPolicySearchEngineExtension.php',
|
2012-06-01 21:39:29 +02:00
|
|
|
'PhabricatorPolicyTestCase' => 'applications/policy/__tests__/PhabricatorPolicyTestCase.php',
|
|
|
|
'PhabricatorPolicyTestObject' => 'applications/policy/__tests__/PhabricatorPolicyTestObject.php',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorPolicyType' => 'applications/policy/constants/PhabricatorPolicyType.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPonderApplication' => 'applications/ponder/application/PhabricatorPonderApplication.php',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProfilePanel' => 'applications/search/profilepanel/PhabricatorProfilePanel.php',
|
|
|
|
'PhabricatorProfilePanelConfiguration' => 'applications/search/storage/PhabricatorProfilePanelConfiguration.php',
|
|
|
|
'PhabricatorProfilePanelConfigurationQuery' => 'applications/search/query/PhabricatorProfilePanelConfigurationQuery.php',
|
|
|
|
'PhabricatorProfilePanelConfigurationTransaction' => 'applications/search/storage/PhabricatorProfilePanelConfigurationTransaction.php',
|
2016-01-19 16:28:10 +01:00
|
|
|
'PhabricatorProfilePanelConfigurationTransactionQuery' => 'applications/search/query/PhabricatorProfilePanelConfigurationTransactionQuery.php',
|
2016-01-13 00:06:43 +01:00
|
|
|
'PhabricatorProfilePanelEditEngine' => 'applications/search/editor/PhabricatorProfilePanelEditEngine.php',
|
|
|
|
'PhabricatorProfilePanelEditor' => 'applications/search/editor/PhabricatorProfilePanelEditor.php',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProfilePanelEngine' => 'applications/search/engine/PhabricatorProfilePanelEngine.php',
|
2016-01-13 00:06:43 +01:00
|
|
|
'PhabricatorProfilePanelIconSet' => 'applications/search/profilepanel/PhabricatorProfilePanelIconSet.php',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProfilePanelPHIDType' => 'applications/search/phidtype/PhabricatorProfilePanelPHIDType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProject' => 'applications/project/storage/PhabricatorProject.php',
|
2015-07-24 19:56:52 +02:00
|
|
|
'PhabricatorProjectAddHeraldAction' => 'applications/project/herald/PhabricatorProjectAddHeraldAction.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorProjectApplication' => 'applications/project/application/PhabricatorProjectApplication.php',
|
2014-02-10 23:30:47 +01:00
|
|
|
'PhabricatorProjectArchiveController' => 'applications/project/controller/PhabricatorProjectArchiveController.php',
|
2016-02-16 15:52:32 +01:00
|
|
|
'PhabricatorProjectBoardBackgroundController' => 'applications/project/controller/PhabricatorProjectBoardBackgroundController.php',
|
Add a secret board view to Projects
Summary:
Ref T1344. This is //very// rough. Some UI issues:
- Empty states for the board and columns are junky.
- Column widths are crazy. I think we need to set them to fixed-width, since we may have an arbitrarily large number of columns?
- I don't think we have the header UI elements in M10 yet and that mock is pretty old, so I sort of very roughly approximated it.
- What should we do when you click a task title? Popping the whole task in a dialog is possible but needs a bunch of work to actually work. Might need to build "sheets" or something.
- Icons are slightly clipped for some reason.
- All the backend stuff is totally faked.
Generally, my plan is just to use these to implement all of T390. Specifically:
- "Kanban" projects will have "Backlog" on the left. You'll drag them toward the right as you make progress.
- "Milestone" projects will have "No Milestone" on the left, then "Milestone 9", "Milestone 8", etc.
- "Sprint" projects will have "Backlog" on the left, then "Sprint 31", "Sprint 30", etc.
So all of these things end up being pretty much exactly the same, with some minor text changes and new columns showing up on the left vs the right or whatever.
Test Plan: See screenshot.
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: chad, aran, sascha-egerer
Maniphest Tasks: T1344
Differential Revision: https://secure.phabricator.com/D7374
2013-10-22 06:11:36 +02:00
|
|
|
'PhabricatorProjectBoardController' => 'applications/project/controller/PhabricatorProjectBoardController.php',
|
2016-02-08 20:24:32 +01:00
|
|
|
'PhabricatorProjectBoardDisableController' => 'applications/project/controller/PhabricatorProjectBoardDisableController.php',
|
2014-08-05 22:40:41 +02:00
|
|
|
'PhabricatorProjectBoardImportController' => 'applications/project/controller/PhabricatorProjectBoardImportController.php',
|
2016-02-16 15:24:15 +01:00
|
|
|
'PhabricatorProjectBoardManageController' => 'applications/project/controller/PhabricatorProjectBoardManageController.php',
|
2014-07-12 04:27:07 +02:00
|
|
|
'PhabricatorProjectBoardReorderController' => 'applications/project/controller/PhabricatorProjectBoardReorderController.php',
|
2014-03-26 22:40:47 +01:00
|
|
|
'PhabricatorProjectBoardViewController' => 'applications/project/controller/PhabricatorProjectBoardViewController.php',
|
2016-02-05 05:11:36 +01:00
|
|
|
'PhabricatorProjectCardView' => 'applications/project/view/PhabricatorProjectCardView.php',
|
2016-01-22 13:33:23 +01:00
|
|
|
'PhabricatorProjectColorsConfigOptionType' => 'applications/project/config/PhabricatorProjectColorsConfigOptionType.php',
|
Add a secret board view to Projects
Summary:
Ref T1344. This is //very// rough. Some UI issues:
- Empty states for the board and columns are junky.
- Column widths are crazy. I think we need to set them to fixed-width, since we may have an arbitrarily large number of columns?
- I don't think we have the header UI elements in M10 yet and that mock is pretty old, so I sort of very roughly approximated it.
- What should we do when you click a task title? Popping the whole task in a dialog is possible but needs a bunch of work to actually work. Might need to build "sheets" or something.
- Icons are slightly clipped for some reason.
- All the backend stuff is totally faked.
Generally, my plan is just to use these to implement all of T390. Specifically:
- "Kanban" projects will have "Backlog" on the left. You'll drag them toward the right as you make progress.
- "Milestone" projects will have "No Milestone" on the left, then "Milestone 9", "Milestone 8", etc.
- "Sprint" projects will have "Backlog" on the left, then "Sprint 31", "Sprint 30", etc.
So all of these things end up being pretty much exactly the same, with some minor text changes and new columns showing up on the left vs the right or whatever.
Test Plan: See screenshot.
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: chad, aran, sascha-egerer
Maniphest Tasks: T1344
Differential Revision: https://secure.phabricator.com/D7374
2013-10-22 06:11:36 +02:00
|
|
|
'PhabricatorProjectColumn' => 'applications/project/storage/PhabricatorProjectColumn.php',
|
2014-03-26 22:40:47 +01:00
|
|
|
'PhabricatorProjectColumnDetailController' => 'applications/project/controller/PhabricatorProjectColumnDetailController.php',
|
Allow columns to have a point limit
Summary:
Fixes T5885. This implements optional soft point limits for workboard columns, per traditional Kanban.
- Allow columns to have a point limit set.
- When a column has a point limit, show it in the header.
- If a column has too many points in it, show the column and point count in red.
@chad, this could probably use some design tweaks. In particular:
- I changed the color of "hidden" columns to avoid confusion with "overfull" columns. We might be able to find a better color.
- UI hints for overfull columns might need adjustment.
(After T4427, we'll let you sum some custom field instead of total number of tasks, which is why this is called "points" rather than "number of tasks".)
Test Plan:
{F190914}
Note that:
- "Pre-planning" has a limit, so it shows "4/12".
- "Planning" has a limit and is overfull, so it shows "5 / 4".
- Other columns do not have limits.
- "Post-planning" is a hidden column. This might be too muted now.
Transactions:
{F190915}
Error messages / edit screen:
{F190916}
Reviewers: btrahan, chad
Reviewed By: btrahan
Subscribers: chad, epriestley
Maniphest Tasks: T5885
Differential Revision: https://secure.phabricator.com/D10276
2014-08-15 20:16:08 +02:00
|
|
|
'PhabricatorProjectColumnEditController' => 'applications/project/controller/PhabricatorProjectColumnEditController.php',
|
2014-09-04 21:47:32 +02:00
|
|
|
'PhabricatorProjectColumnHideController' => 'applications/project/controller/PhabricatorProjectColumnHideController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorProjectColumnPHIDType' => 'applications/project/phid/PhabricatorProjectColumnPHIDType.php',
|
2014-08-07 00:09:09 +02:00
|
|
|
'PhabricatorProjectColumnPosition' => 'applications/project/storage/PhabricatorProjectColumnPosition.php',
|
|
|
|
'PhabricatorProjectColumnPositionQuery' => 'applications/project/query/PhabricatorProjectColumnPositionQuery.php',
|
Add a secret board view to Projects
Summary:
Ref T1344. This is //very// rough. Some UI issues:
- Empty states for the board and columns are junky.
- Column widths are crazy. I think we need to set them to fixed-width, since we may have an arbitrarily large number of columns?
- I don't think we have the header UI elements in M10 yet and that mock is pretty old, so I sort of very roughly approximated it.
- What should we do when you click a task title? Popping the whole task in a dialog is possible but needs a bunch of work to actually work. Might need to build "sheets" or something.
- Icons are slightly clipped for some reason.
- All the backend stuff is totally faked.
Generally, my plan is just to use these to implement all of T390. Specifically:
- "Kanban" projects will have "Backlog" on the left. You'll drag them toward the right as you make progress.
- "Milestone" projects will have "No Milestone" on the left, then "Milestone 9", "Milestone 8", etc.
- "Sprint" projects will have "Backlog" on the left, then "Sprint 31", "Sprint 30", etc.
So all of these things end up being pretty much exactly the same, with some minor text changes and new columns showing up on the left vs the right or whatever.
Test Plan: See screenshot.
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: chad, aran, sascha-egerer
Maniphest Tasks: T1344
Differential Revision: https://secure.phabricator.com/D7374
2013-10-22 06:11:36 +02:00
|
|
|
'PhabricatorProjectColumnQuery' => 'applications/project/query/PhabricatorProjectColumnQuery.php',
|
2014-03-26 22:40:47 +01:00
|
|
|
'PhabricatorProjectColumnTransaction' => 'applications/project/storage/PhabricatorProjectColumnTransaction.php',
|
|
|
|
'PhabricatorProjectColumnTransactionEditor' => 'applications/project/editor/PhabricatorProjectColumnTransactionEditor.php',
|
|
|
|
'PhabricatorProjectColumnTransactionQuery' => 'applications/project/query/PhabricatorProjectColumnTransactionQuery.php',
|
2014-02-10 23:31:34 +01:00
|
|
|
'PhabricatorProjectConfigOptions' => 'applications/project/config/PhabricatorProjectConfigOptions.php',
|
|
|
|
'PhabricatorProjectConfiguredCustomField' => 'applications/project/customfield/PhabricatorProjectConfiguredCustomField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectController' => 'applications/project/controller/PhabricatorProjectController.php',
|
2015-12-23 12:42:42 +01:00
|
|
|
'PhabricatorProjectCoreTestCase' => 'applications/project/__tests__/PhabricatorProjectCoreTestCase.php',
|
2016-02-06 23:05:15 +01:00
|
|
|
'PhabricatorProjectCoverController' => 'applications/project/controller/PhabricatorProjectCoverController.php',
|
2014-02-10 23:31:34 +01:00
|
|
|
'PhabricatorProjectCustomField' => 'applications/project/customfield/PhabricatorProjectCustomField.php',
|
Add a secret board view to Projects
Summary:
Ref T1344. This is //very// rough. Some UI issues:
- Empty states for the board and columns are junky.
- Column widths are crazy. I think we need to set them to fixed-width, since we may have an arbitrarily large number of columns?
- I don't think we have the header UI elements in M10 yet and that mock is pretty old, so I sort of very roughly approximated it.
- What should we do when you click a task title? Popping the whole task in a dialog is possible but needs a bunch of work to actually work. Might need to build "sheets" or something.
- Icons are slightly clipped for some reason.
- All the backend stuff is totally faked.
Generally, my plan is just to use these to implement all of T390. Specifically:
- "Kanban" projects will have "Backlog" on the left. You'll drag them toward the right as you make progress.
- "Milestone" projects will have "No Milestone" on the left, then "Milestone 9", "Milestone 8", etc.
- "Sprint" projects will have "Backlog" on the left, then "Sprint 31", "Sprint 30", etc.
So all of these things end up being pretty much exactly the same, with some minor text changes and new columns showing up on the left vs the right or whatever.
Test Plan: See screenshot.
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: chad, aran, sascha-egerer
Maniphest Tasks: T1344
Differential Revision: https://secure.phabricator.com/D7374
2013-10-22 06:11:36 +02:00
|
|
|
'PhabricatorProjectCustomFieldNumericIndex' => 'applications/project/storage/PhabricatorProjectCustomFieldNumericIndex.php',
|
|
|
|
'PhabricatorProjectCustomFieldStorage' => 'applications/project/storage/PhabricatorProjectCustomFieldStorage.php',
|
|
|
|
'PhabricatorProjectCustomFieldStringIndex' => 'applications/project/storage/PhabricatorProjectCustomFieldStringIndex.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectDAO' => 'applications/project/storage/PhabricatorProjectDAO.php',
|
2014-07-11 02:28:29 +02:00
|
|
|
'PhabricatorProjectDatasource' => 'applications/project/typeahead/PhabricatorProjectDatasource.php',
|
2016-02-12 15:19:26 +01:00
|
|
|
'PhabricatorProjectDefaultController' => 'applications/project/controller/PhabricatorProjectDefaultController.php',
|
2014-02-10 23:31:57 +01:00
|
|
|
'PhabricatorProjectDescriptionField' => 'applications/project/customfield/PhabricatorProjectDescriptionField.php',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProjectDetailsProfilePanel' => 'applications/project/profilepanel/PhabricatorProjectDetailsProfilePanel.php',
|
2015-12-27 15:45:53 +01:00
|
|
|
'PhabricatorProjectEditController' => 'applications/project/controller/PhabricatorProjectEditController.php',
|
|
|
|
'PhabricatorProjectEditEngine' => 'applications/project/engine/PhabricatorProjectEditEngine.php',
|
2014-02-17 05:17:52 +01:00
|
|
|
'PhabricatorProjectEditPictureController' => 'applications/project/controller/PhabricatorProjectEditPictureController.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorProjectFulltextEngine' => 'applications/project/search/PhabricatorProjectFulltextEngine.php',
|
2015-07-24 19:56:52 +02:00
|
|
|
'PhabricatorProjectHeraldAction' => 'applications/project/herald/PhabricatorProjectHeraldAction.php',
|
2016-01-20 02:18:17 +01:00
|
|
|
'PhabricatorProjectHeraldAdapter' => 'applications/project/herald/PhabricatorProjectHeraldAdapter.php',
|
|
|
|
'PhabricatorProjectHeraldFieldGroup' => 'applications/project/herald/PhabricatorProjectHeraldFieldGroup.php',
|
2016-02-11 23:55:44 +01:00
|
|
|
'PhabricatorProjectHovercardEngineExtension' => 'applications/project/engineextension/PhabricatorProjectHovercardEngineExtension.php',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorProjectIconSet' => 'applications/project/icon/PhabricatorProjectIconSet.php',
|
2016-01-22 13:33:23 +01:00
|
|
|
'PhabricatorProjectIconsConfigOptionType' => 'applications/project/config/PhabricatorProjectIconsConfigOptionType.php',
|
2014-06-04 02:19:40 +02:00
|
|
|
'PhabricatorProjectInterface' => 'applications/project/interface/PhabricatorProjectInterface.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectListController' => 'applications/project/controller/PhabricatorProjectListController.php',
|
2015-12-27 14:16:36 +01:00
|
|
|
'PhabricatorProjectListView' => 'applications/project/view/PhabricatorProjectListView.php',
|
2015-12-27 15:56:15 +01:00
|
|
|
'PhabricatorProjectLockController' => 'applications/project/controller/PhabricatorProjectLockController.php',
|
2015-12-29 14:06:47 +01:00
|
|
|
'PhabricatorProjectLogicalAncestorDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalAncestorDatasource.php',
|
2015-04-18 20:04:50 +02:00
|
|
|
'PhabricatorProjectLogicalDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalDatasource.php',
|
2015-04-18 18:58:33 +02:00
|
|
|
'PhabricatorProjectLogicalOrNotDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalOrNotDatasource.php',
|
2015-04-18 20:04:50 +02:00
|
|
|
'PhabricatorProjectLogicalUserDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalUserDatasource.php',
|
|
|
|
'PhabricatorProjectLogicalViewerDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalViewerDatasource.php',
|
2016-01-24 01:02:29 +01:00
|
|
|
'PhabricatorProjectManageController' => 'applications/project/controller/PhabricatorProjectManageController.php',
|
|
|
|
'PhabricatorProjectManageProfilePanel' => 'applications/project/profilepanel/PhabricatorProjectManageProfilePanel.php',
|
2015-12-23 12:12:20 +01:00
|
|
|
'PhabricatorProjectMaterializedMemberEdgeType' => 'applications/project/edge/PhabricatorProjectMaterializedMemberEdgeType.php',
|
2016-01-20 01:27:36 +01:00
|
|
|
'PhabricatorProjectMemberListView' => 'applications/project/view/PhabricatorProjectMemberListView.php',
|
2015-01-02 00:10:58 +01:00
|
|
|
'PhabricatorProjectMemberOfProjectEdgeType' => 'applications/project/edge/PhabricatorProjectMemberOfProjectEdgeType.php',
|
2016-01-20 01:27:36 +01:00
|
|
|
'PhabricatorProjectMembersAddController' => 'applications/project/controller/PhabricatorProjectMembersAddController.php',
|
2015-04-17 00:30:41 +02:00
|
|
|
'PhabricatorProjectMembersDatasource' => 'applications/project/typeahead/PhabricatorProjectMembersDatasource.php',
|
2015-12-24 01:34:01 +01:00
|
|
|
'PhabricatorProjectMembersPolicyRule' => 'applications/project/policyrule/PhabricatorProjectMembersPolicyRule.php',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProjectMembersProfilePanel' => 'applications/project/profilepanel/PhabricatorProjectMembersProfilePanel.php',
|
2014-03-20 03:30:27 +01:00
|
|
|
'PhabricatorProjectMembersRemoveController' => 'applications/project/controller/PhabricatorProjectMembersRemoveController.php',
|
2016-01-20 01:27:36 +01:00
|
|
|
'PhabricatorProjectMembersViewController' => 'applications/project/controller/PhabricatorProjectMembersViewController.php',
|
2014-01-13 21:24:36 +01:00
|
|
|
'PhabricatorProjectMoveController' => 'applications/project/controller/PhabricatorProjectMoveController.php',
|
2015-12-24 14:29:57 +01:00
|
|
|
'PhabricatorProjectNameContextFreeGrammar' => 'applications/project/lipsum/PhabricatorProjectNameContextFreeGrammar.php',
|
2015-04-18 18:58:33 +02:00
|
|
|
'PhabricatorProjectNoProjectsDatasource' => 'applications/project/typeahead/PhabricatorProjectNoProjectsDatasource.php',
|
2014-07-18 00:42:19 +02:00
|
|
|
'PhabricatorProjectObjectHasProjectEdgeType' => 'applications/project/edge/PhabricatorProjectObjectHasProjectEdgeType.php',
|
2014-07-18 00:45:07 +02:00
|
|
|
'PhabricatorProjectOrUserDatasource' => 'applications/project/typeahead/PhabricatorProjectOrUserDatasource.php',
|
2015-08-31 19:17:54 +02:00
|
|
|
'PhabricatorProjectOrUserFunctionDatasource' => 'applications/project/typeahead/PhabricatorProjectOrUserFunctionDatasource.php',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorProjectPHIDResolver' => 'applications/phid/resolver/PhabricatorProjectPHIDResolver.php',
|
2016-01-13 00:06:43 +01:00
|
|
|
'PhabricatorProjectPanelController' => 'applications/project/controller/PhabricatorProjectPanelController.php',
|
2016-02-09 02:31:21 +01:00
|
|
|
'PhabricatorProjectPointsProfilePanel' => 'applications/project/profilepanel/PhabricatorProjectPointsProfilePanel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectProfileController' => 'applications/project/controller/PhabricatorProjectProfileController.php',
|
2016-01-14 14:59:25 +01:00
|
|
|
'PhabricatorProjectProfilePanelEngine' => 'applications/project/engine/PhabricatorProjectProfilePanelEngine.php',
|
2015-01-02 00:10:58 +01:00
|
|
|
'PhabricatorProjectProjectHasMemberEdgeType' => 'applications/project/edge/PhabricatorProjectProjectHasMemberEdgeType.php',
|
2014-07-18 00:42:19 +02:00
|
|
|
'PhabricatorProjectProjectHasObjectEdgeType' => 'applications/project/edge/PhabricatorProjectProjectHasObjectEdgeType.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorProjectProjectPHIDType' => 'applications/project/phid/PhabricatorProjectProjectPHIDType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectQuery' => 'applications/project/query/PhabricatorProjectQuery.php',
|
2015-07-24 19:56:52 +02:00
|
|
|
'PhabricatorProjectRemoveHeraldAction' => 'applications/project/herald/PhabricatorProjectRemoveHeraldAction.php',
|
2014-10-01 16:37:01 +02:00
|
|
|
'PhabricatorProjectSchemaSpec' => 'applications/project/storage/PhabricatorProjectSchemaSpec.php',
|
2013-07-22 17:34:35 +02:00
|
|
|
'PhabricatorProjectSearchEngine' => 'applications/project/query/PhabricatorProjectSearchEngine.php',
|
2015-07-06 14:52:04 +02:00
|
|
|
'PhabricatorProjectSearchField' => 'applications/project/searchfield/PhabricatorProjectSearchField.php',
|
Replace subscribe/unsubscribe for projects with explicit mail setting
Summary:
Ref T10054. Ref T6113. Users can currently subscribe to projects, which causes them to receive:
# mail about project membership changes, description changes, etc; and
# mail to the project, e.g. when the project is added as a subscriber on a task, or a reviewer on a revision.
Almost no one cares about (1), and after D15061 you can use Herald to get this stuff if you really want it. (It will get progressively more annoying in the future with external membership sources causing automated project membership updates.)
A lot of users are confused about (2) and how it relates to membership, watching, etc, and most users who want (2) don't want (1).
Instead, add an explicit option for this and explain what it does.
This is fairly verbose but I've hidden it on the member/watch screen, which is now the "explain how projects work" screen, I guess.
Test Plan:
{F1064929}
{F1064930}
{F1064931}
- Disabled/enabled mail for a project.
- Sent mail to a project with mail disabled, verified I didn't get a copy.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T6113, T10054
Differential Revision: https://secure.phabricator.com/D15065
2016-01-20 03:56:15 +01:00
|
|
|
'PhabricatorProjectSilenceController' => 'applications/project/controller/PhabricatorProjectSilenceController.php',
|
|
|
|
'PhabricatorProjectSilencedEdgeType' => 'applications/project/edge/PhabricatorProjectSilencedEdgeType.php',
|
2014-05-22 20:19:03 +02:00
|
|
|
'PhabricatorProjectSlug' => 'applications/project/storage/PhabricatorProjectSlug.php',
|
2014-02-10 23:31:57 +01:00
|
|
|
'PhabricatorProjectStandardCustomField' => 'applications/project/customfield/PhabricatorProjectStandardCustomField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectStatus' => 'applications/project/constants/PhabricatorProjectStatus.php',
|
2016-02-01 16:04:19 +01:00
|
|
|
'PhabricatorProjectSubprojectWarningController' => 'applications/project/controller/PhabricatorProjectSubprojectWarningController.php',
|
2015-12-27 13:47:08 +01:00
|
|
|
'PhabricatorProjectSubprojectsController' => 'applications/project/controller/PhabricatorProjectSubprojectsController.php',
|
2016-02-01 16:04:19 +01:00
|
|
|
'PhabricatorProjectSubprojectsProfilePanel' => 'applications/project/profilepanel/PhabricatorProjectSubprojectsProfilePanel.php',
|
2013-04-29 21:17:55 +02:00
|
|
|
'PhabricatorProjectTestDataGenerator' => 'applications/project/lipsum/PhabricatorProjectTestDataGenerator.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectTransaction' => 'applications/project/storage/PhabricatorProjectTransaction.php',
|
2014-02-10 23:30:00 +01:00
|
|
|
'PhabricatorProjectTransactionEditor' => 'applications/project/editor/PhabricatorProjectTransactionEditor.php',
|
2013-10-22 22:49:37 +02:00
|
|
|
'PhabricatorProjectTransactionQuery' => 'applications/project/query/PhabricatorProjectTransactionQuery.php',
|
2014-06-04 02:19:40 +02:00
|
|
|
'PhabricatorProjectUIEventListener' => 'applications/project/events/PhabricatorProjectUIEventListener.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectUpdateController' => 'applications/project/controller/PhabricatorProjectUpdateController.php',
|
2015-08-31 19:17:54 +02:00
|
|
|
'PhabricatorProjectUserFunctionDatasource' => 'applications/project/typeahead/PhabricatorProjectUserFunctionDatasource.php',
|
2016-01-20 01:27:36 +01:00
|
|
|
'PhabricatorProjectUserListView' => 'applications/project/view/PhabricatorProjectUserListView.php',
|
2015-01-12 19:04:01 +01:00
|
|
|
'PhabricatorProjectViewController' => 'applications/project/controller/PhabricatorProjectViewController.php',
|
2014-05-19 21:40:57 +02:00
|
|
|
'PhabricatorProjectWatchController' => 'applications/project/controller/PhabricatorProjectWatchController.php',
|
2016-01-20 01:27:36 +01:00
|
|
|
'PhabricatorProjectWatcherListView' => 'applications/project/view/PhabricatorProjectWatcherListView.php',
|
2016-02-16 15:52:32 +01:00
|
|
|
'PhabricatorProjectWorkboardBackgroundColor' => 'applications/project/constants/PhabricatorProjectWorkboardBackgroundColor.php',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProjectWorkboardProfilePanel' => 'applications/project/profilepanel/PhabricatorProjectWorkboardProfilePanel.php',
|
2016-03-05 23:45:56 +01:00
|
|
|
'PhabricatorProjectsCurtainExtension' => 'applications/project/engineextension/PhabricatorProjectsCurtainExtension.php',
|
2015-12-13 13:12:34 +01:00
|
|
|
'PhabricatorProjectsEditEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsEditEngineExtension.php',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorProjectsEditField' => 'applications/transactions/editfield/PhabricatorProjectsEditField.php',
|
2015-12-21 15:31:31 +01:00
|
|
|
'PhabricatorProjectsFulltextEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsFulltextEngineExtension.php',
|
2016-01-24 16:19:54 +01:00
|
|
|
'PhabricatorProjectsMembersSearchEngineAttachment' => 'applications/project/engineextension/PhabricatorProjectsMembersSearchEngineAttachment.php',
|
2015-12-23 12:12:20 +01:00
|
|
|
'PhabricatorProjectsMembershipIndexEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsMembershipIndexEngineExtension.php',
|
2015-11-16 20:26:13 +01:00
|
|
|
'PhabricatorProjectsPolicyRule' => 'applications/project/policyrule/PhabricatorProjectsPolicyRule.php',
|
2015-12-14 14:41:26 +01:00
|
|
|
'PhabricatorProjectsSearchEngineAttachment' => 'applications/project/engineextension/PhabricatorProjectsSearchEngineAttachment.php',
|
2015-12-13 13:12:34 +01:00
|
|
|
'PhabricatorProjectsSearchEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsSearchEngineExtension.php',
|
2016-01-24 16:19:54 +01:00
|
|
|
'PhabricatorProjectsWatchersSearchEngineAttachment' => 'applications/project/engineextension/PhabricatorProjectsWatchersSearchEngineAttachment.php',
|
2015-05-18 00:20:11 +02:00
|
|
|
'PhabricatorProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorProtocolAdapter.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorPygmentSetupCheck' => 'applications/config/check/PhabricatorPygmentSetupCheck.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorQuery' => 'infrastructure/query/PhabricatorQuery.php',
|
2015-04-18 16:53:43 +02:00
|
|
|
'PhabricatorQueryConstraint' => 'infrastructure/query/constraint/PhabricatorQueryConstraint.php',
|
2015-04-11 21:10:35 +02:00
|
|
|
'PhabricatorQueryOrderItem' => 'infrastructure/query/order/PhabricatorQueryOrderItem.php',
|
|
|
|
'PhabricatorQueryOrderTestCase' => 'infrastructure/query/order/__tests__/PhabricatorQueryOrderTestCase.php',
|
|
|
|
'PhabricatorQueryOrderVector' => 'infrastructure/query/order/PhabricatorQueryOrderVector.php',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorRateLimitRequestExceptionHandler' => 'aphront/handler/PhabricatorRateLimitRequestExceptionHandler.php',
|
2013-01-03 18:17:38 +01:00
|
|
|
'PhabricatorRecaptchaConfigOptions' => 'applications/config/option/PhabricatorRecaptchaConfigOptions.php',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorRecipientHasBadgeEdgeType' => 'applications/badges/edge/PhabricatorRecipientHasBadgeEdgeType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRedirectController' => 'applications/base/controller/PhabricatorRedirectController.php',
|
|
|
|
'PhabricatorRefreshCSRFController' => 'applications/auth/controller/PhabricatorRefreshCSRFController.php',
|
New Registration Workflow
Summary:
Currently, registration and authentication are pretty messy. Two concrete problems:
- The `PhabricatorLDAPRegistrationController` and `PhabricatorOAuthDefaultRegistrationController` controllers are giant copy/pastes of one another. This is really bad.
- We can't practically implement OpenID because we can't reissue the authentication request.
Additionally, the OAuth registration controller can be replaced wholesale by config, which is a huge API surface area and a giant mess.
Broadly, the problem right now is that registration does too much: we hand it some set of indirect credentials (like OAuth tokens) and expect it to take those the entire way to a registered user. Instead, break registration into smaller steps:
- User authenticates with remote service.
- Phabricator pulls information (remote account ID, username, email, real name, profile picture, etc) from the remote service and saves it as `PhabricatorUserCredentials`.
- Phabricator hands the `PhabricatorUserCredentials` to the registration form, which is agnostic about where they originate from: it can process LDAP credentials, OAuth credentials, plain old email credentials, HTTP basic auth credentials, etc.
This doesn't do anything yet -- there is no way to create credentials objects (and no storage patch), but I wanted to get any initial feedback, especially about the event call for T2394. In particular, I think the implementation would look something like this:
$profile = $event->getValue('profile')
$username = $profile->getDefaultUsername();
$is_employee = is_this_a_facebook_employee($username);
if (!$is_employee) {
throw new Exception("You are not employed at Facebook.");
}
$fbid = get_fbid_for_facebook_username($username);
$profile->setDefaultEmail($fbid);
$profile->setCanEditUsername(false);
$profile->setCanEditEmail(false);
$profile->setCanEditRealName(false);
$profile->setShouldVerifyEmail(true);
Seem reasonable?
Test Plan: N/A yet, probably fatals.
Reviewers: vrana, btrahan, codeblock, chad
Reviewed By: btrahan
CC: aran, asherkin, nh, wez
Maniphest Tasks: T1536, T2394
Differential Revision: https://secure.phabricator.com/D4647
2013-06-16 19:13:49 +02:00
|
|
|
'PhabricatorRegistrationProfile' => 'applications/people/storage/PhabricatorRegistrationProfile.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorReleephApplication' => 'applications/releeph/application/PhabricatorReleephApplication.php',
|
|
|
|
'PhabricatorReleephApplicationConfigOptions' => 'applications/releeph/config/PhabricatorReleephApplicationConfigOptions.php',
|
2012-09-19 21:27:28 +02:00
|
|
|
'PhabricatorRemarkupControl' => 'view/form/control/PhabricatorRemarkupControl.php',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorRemarkupCowsayBlockInterpreter' => 'infrastructure/markup/interpreter/PhabricatorRemarkupCowsayBlockInterpreter.php',
|
2013-10-25 02:26:07 +02:00
|
|
|
'PhabricatorRemarkupCustomBlockRule' => 'infrastructure/markup/rule/PhabricatorRemarkupCustomBlockRule.php',
|
|
|
|
'PhabricatorRemarkupCustomInlineRule' => 'infrastructure/markup/rule/PhabricatorRemarkupCustomInlineRule.php',
|
2015-11-17 18:33:06 +01:00
|
|
|
'PhabricatorRemarkupEditField' => 'applications/transactions/editfield/PhabricatorRemarkupEditField.php',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorRemarkupFigletBlockInterpreter' => 'infrastructure/markup/interpreter/PhabricatorRemarkupFigletBlockInterpreter.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorRemarkupUIExample' => 'applications/uiexample/examples/PhabricatorRemarkupUIExample.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorRepositoriesSetupCheck' => 'applications/config/check/PhabricatorRepositoriesSetupCheck.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepository' => 'applications/repository/storage/PhabricatorRepository.php',
|
|
|
|
'PhabricatorRepositoryAuditRequest' => 'applications/repository/storage/PhabricatorRepositoryAuditRequest.php',
|
2012-11-06 08:09:36 +01:00
|
|
|
'PhabricatorRepositoryBranch' => 'applications/repository/storage/PhabricatorRepositoryBranch.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryCommit' => 'applications/repository/storage/PhabricatorRepositoryCommit.php',
|
|
|
|
'PhabricatorRepositoryCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php',
|
|
|
|
'PhabricatorRepositoryCommitData' => 'applications/repository/storage/PhabricatorRepositoryCommitData.php',
|
|
|
|
'PhabricatorRepositoryCommitHeraldWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php',
|
|
|
|
'PhabricatorRepositoryCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php',
|
|
|
|
'PhabricatorRepositoryCommitOwnersWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitOwnersWorker.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorRepositoryCommitPHIDType' => 'applications/repository/phid/PhabricatorRepositoryCommitPHIDType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryCommitParserWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitParserWorker.php',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorRepositoryCommitRef' => 'applications/repository/engine/PhabricatorRepositoryCommitRef.php',
|
2015-02-09 22:10:56 +01:00
|
|
|
'PhabricatorRepositoryConfigOptions' => 'applications/repository/config/PhabricatorRepositoryConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryDAO' => 'applications/repository/storage/PhabricatorRepositoryDAO.php',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorRepositoryDiscoveryEngine' => 'applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php',
|
2013-05-24 21:37:42 +02:00
|
|
|
'PhabricatorRepositoryEditor' => 'applications/repository/editor/PhabricatorRepositoryEditor.php',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorRepositoryEngine' => 'applications/repository/engine/PhabricatorRepositoryEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryGitCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryGitCommitChangeParserWorker.php',
|
|
|
|
'PhabricatorRepositoryGitCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryGitCommitMessageParserWorker.php',
|
2016-03-17 20:49:18 +01:00
|
|
|
'PhabricatorRepositoryGitLFSRef' => 'applications/repository/storage/PhabricatorRepositoryGitLFSRef.php',
|
|
|
|
'PhabricatorRepositoryGitLFSRefQuery' => 'applications/repository/query/PhabricatorRepositoryGitLFSRefQuery.php',
|
Implement a chunked, APC-backed graph cache
Summary:
Ref T2683. This is a refinement and simplification of D5257. In particular:
- D5257 only cached the commit chain, not path changes. This meant that we had to go issue an awkward query (which was slow on Facebook's install) periodically while reading the cache. This was reasonable locally but killed performance at FB scale. Instead, we can include path information in the cache. It is very rare that this is large except in Subversion, and we do not need to use this cache in Subversion. In other VCSes, the scale of this data is quite small (a handful of bytes per commit on average).
- D5257 required a large, slow offline computation step. This relies on D9044 to populate parent data so we can build the cache online at will, and let it expire with normal LRU/LFU/whatever semantics. We need this parent data for other reasons anyway.
- D5257 separated graph chunks per-repository. This change assumes we'll be able to pull stuff from APC most of the time and that the cost of switching chunks is not very large, so we can just build one chunk cache across all repositories. This allows the cache to be simpler.
- D5257 needed an offline cache, and used a unique cache structure. Since this one can be built online it can mostly use normal cache code.
- This also supports online appends to the cache.
- Finally, this has a timeout to guarantee a ceiling on the worst case: the worst case is something like a query for a file that has never existed, in a repository which receives exactly 1 commit every time other repositories receive 4095 commits, on a cold cache. If we hit cases like this we can bail after warming the cache up a bit and fall back to asking the VCS for an answer.
This cache isn't perfect, but I believe it will give us substantial gains in the average case. It can often satisfy "average-looking" queries in 4-8ms, and pathological-ish queries in 20ms on my machine; `hg` usually can't even start up in less than 100ms. The major thing that's attractive about this approach is that it does not require anything external or complicated, and will "just work", even producing reasonble improvements for users without APC.
In followups, I'll modify queries to use this cache and see if it holds up in more realistic workloads.
Test Plan:
- Used `bin/repository cache` to examine the behavior of this cache.
- Did some profiling/testing from the web UI using `debug.php`.
- This //appears// to provide a reasonable fast way to issue this query very quickly in the average case, without the various issues that plagued D5257.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley, jhurwitz
Maniphest Tasks: T2683
Differential Revision: https://secure.phabricator.com/D9045
2014-05-10 19:10:13 +02:00
|
|
|
'PhabricatorRepositoryGraphCache' => 'applications/repository/graphcache/PhabricatorRepositoryGraphCache.php',
|
2014-01-17 00:31:52 +01:00
|
|
|
'PhabricatorRepositoryGraphStream' => 'applications/repository/daemon/PhabricatorRepositoryGraphStream.php',
|
Implement a chunked, APC-backed graph cache
Summary:
Ref T2683. This is a refinement and simplification of D5257. In particular:
- D5257 only cached the commit chain, not path changes. This meant that we had to go issue an awkward query (which was slow on Facebook's install) periodically while reading the cache. This was reasonable locally but killed performance at FB scale. Instead, we can include path information in the cache. It is very rare that this is large except in Subversion, and we do not need to use this cache in Subversion. In other VCSes, the scale of this data is quite small (a handful of bytes per commit on average).
- D5257 required a large, slow offline computation step. This relies on D9044 to populate parent data so we can build the cache online at will, and let it expire with normal LRU/LFU/whatever semantics. We need this parent data for other reasons anyway.
- D5257 separated graph chunks per-repository. This change assumes we'll be able to pull stuff from APC most of the time and that the cost of switching chunks is not very large, so we can just build one chunk cache across all repositories. This allows the cache to be simpler.
- D5257 needed an offline cache, and used a unique cache structure. Since this one can be built online it can mostly use normal cache code.
- This also supports online appends to the cache.
- Finally, this has a timeout to guarantee a ceiling on the worst case: the worst case is something like a query for a file that has never existed, in a repository which receives exactly 1 commit every time other repositories receive 4095 commits, on a cold cache. If we hit cases like this we can bail after warming the cache up a bit and fall back to asking the VCS for an answer.
This cache isn't perfect, but I believe it will give us substantial gains in the average case. It can often satisfy "average-looking" queries in 4-8ms, and pathological-ish queries in 20ms on my machine; `hg` usually can't even start up in less than 100ms. The major thing that's attractive about this approach is that it does not require anything external or complicated, and will "just work", even producing reasonble improvements for users without APC.
In followups, I'll modify queries to use this cache and see if it holds up in more realistic workloads.
Test Plan:
- Used `bin/repository cache` to examine the behavior of this cache.
- Did some profiling/testing from the web UI using `debug.php`.
- This //appears// to provide a reasonable fast way to issue this query very quickly in the average case, without the various issues that plagued D5257.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley, jhurwitz
Maniphest Tasks: T2683
Differential Revision: https://secure.phabricator.com/D9045
2014-05-10 19:10:13 +02:00
|
|
|
'PhabricatorRepositoryManagementCacheWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementCacheWorkflow.php',
|
2016-04-25 16:45:10 +02:00
|
|
|
'PhabricatorRepositoryManagementClusterizeWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementClusterizeWorkflow.php',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementDiscoverWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementDiscoverWorkflow.php',
|
2013-11-06 20:26:41 +01:00
|
|
|
'PhabricatorRepositoryManagementImportingWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementImportingWorkflow.php',
|
2015-07-16 23:11:33 +02:00
|
|
|
'PhabricatorRepositoryManagementListPathsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementListPathsWorkflow.php',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementListWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementListWorkflow.php',
|
2013-12-19 20:05:17 +01:00
|
|
|
'PhabricatorRepositoryManagementLookupUsersWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementLookupUsersWorkflow.php',
|
2013-11-06 20:26:24 +01:00
|
|
|
'PhabricatorRepositoryManagementMarkImportedWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMarkImportedWorkflow.php',
|
2014-01-25 23:01:58 +01:00
|
|
|
'PhabricatorRepositoryManagementMirrorWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMirrorWorkflow.php',
|
2015-07-16 23:11:33 +02:00
|
|
|
'PhabricatorRepositoryManagementMovePathsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMovePathsWorkflow.php',
|
Record parent relationships when discovering commits
Summary:
Ref T4455. This adds a `repository_parents` table which stores `<childCommitID, parentCommitID>` relationships.
For new commits, it is populated when commits are discovered.
For older commits, there's a `bin/repository parents` script to rebuild the data.
Right now, there's no UI suggestion that you should run the script. I haven't come up with a super clean way to do this, and this table will only improve performance for now, so it's not important that we get everyone to run the script right away. I'm just leaving it for the moment, and we can figure out how to tell admins to run it later.
The ultimate goal is to solve T2683, but solving T4455 gets us some stuff anyway (for example, we can serve `diffusion.commitparentsquery` faster out of this cache).
Test Plan:
- Used `bin/repository discover` to discover new commits in Git, SVN and Mercurial repositories.
- Used `bin/repository parents` to rebuild Git and Mercurial repositories (SVN repos just exit with a message).
- Verified that the table appears to be sensible.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: jhurwitz, epriestley
Maniphest Tasks: T4455
Differential Revision: https://secure.phabricator.com/D9044
2014-05-10 21:41:18 +02:00
|
|
|
'PhabricatorRepositoryManagementParentsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementParentsWorkflow.php',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementPullWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementPullWorkflow.php',
|
2014-01-16 21:05:30 +01:00
|
|
|
'PhabricatorRepositoryManagementRefsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementRefsWorkflow.php',
|
2015-01-06 20:42:15 +01:00
|
|
|
'PhabricatorRepositoryManagementReparseWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementReparseWorkflow.php',
|
2016-04-20 15:54:53 +02:00
|
|
|
'PhabricatorRepositoryManagementThawWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementThawWorkflow.php',
|
2014-04-16 22:00:29 +02:00
|
|
|
'PhabricatorRepositoryManagementUpdateWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementUpdateWorkflow.php',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementWorkflow.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryMercurialCommitChangeParserWorker.php',
|
|
|
|
'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryMercurialCommitMessageParserWorker.php',
|
2013-11-23 00:23:50 +01:00
|
|
|
'PhabricatorRepositoryMirror' => 'applications/repository/storage/PhabricatorRepositoryMirror.php',
|
2014-01-25 23:01:58 +01:00
|
|
|
'PhabricatorRepositoryMirrorEngine' => 'applications/repository/engine/PhabricatorRepositoryMirrorEngine.php',
|
Begin making change parsers testable
Summary:
Ref T4327. There are a bunch of other probably-related tasks too, some linked there.
We have some rare/unusual bugs in the change parsers, mostly in Subversion, but it's terrifying to touch them because they're complicated and fragile and have no test coverage.
To fix this stuff, I want to make them more testable. In particular, they basically end with this big INSERT right now. Instead, I'm going to make them return objects representing the data to be inserted, then have the common infrastructure do the insert. This gives us two benefits:
- Reduced code duplication on the insert;
- we can stop before the insert and have unit tests examine the objects.
This swaps the Git parser over, but doesn't swap the hg/svn parsers yet. I'll do those separately, the SVN one looks a bit tricky.
Test Plan:
- Used `scripts/repository/reparse.php` to reparse a Git commit, with `--trace`. Verified it looked the same as before and the SQL that was executed seemed reasonable.
- Did the same for `hg` / `svn` commits, to make sure I didn't derp anything. These aren't expected to do anything differently.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T4327
Differential Revision: https://secure.phabricator.com/D7980
2014-01-20 22:12:44 +01:00
|
|
|
'PhabricatorRepositoryParsedChange' => 'applications/repository/data/PhabricatorRepositoryParsedChange.php',
|
2013-05-13 04:05:52 +02:00
|
|
|
'PhabricatorRepositoryPullEngine' => 'applications/repository/engine/PhabricatorRepositoryPullEngine.php',
|
2016-01-28 14:21:38 +01:00
|
|
|
'PhabricatorRepositoryPullEvent' => 'applications/repository/storage/PhabricatorRepositoryPullEvent.php',
|
|
|
|
'PhabricatorRepositoryPullEventPHIDType' => 'applications/repository/phid/PhabricatorRepositoryPullEventPHIDType.php',
|
|
|
|
'PhabricatorRepositoryPullEventQuery' => 'applications/repository/query/PhabricatorRepositoryPullEventQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryPullLocalDaemon' => 'applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php',
|
2014-03-26 03:43:26 +01:00
|
|
|
'PhabricatorRepositoryPushEvent' => 'applications/repository/storage/PhabricatorRepositoryPushEvent.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorRepositoryPushEventPHIDType' => 'applications/repository/phid/PhabricatorRepositoryPushEventPHIDType.php',
|
2014-03-26 03:43:26 +01:00
|
|
|
'PhabricatorRepositoryPushEventQuery' => 'applications/repository/query/PhabricatorRepositoryPushEventQuery.php',
|
2013-12-05 20:56:14 +01:00
|
|
|
'PhabricatorRepositoryPushLog' => 'applications/repository/storage/PhabricatorRepositoryPushLog.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorRepositoryPushLogPHIDType' => 'applications/repository/phid/PhabricatorRepositoryPushLogPHIDType.php',
|
2013-12-05 20:56:14 +01:00
|
|
|
'PhabricatorRepositoryPushLogQuery' => 'applications/repository/query/PhabricatorRepositoryPushLogQuery.php',
|
|
|
|
'PhabricatorRepositoryPushLogSearchEngine' => 'applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php',
|
2014-03-26 18:44:06 +01:00
|
|
|
'PhabricatorRepositoryPushMailWorker' => 'applications/repository/worker/PhabricatorRepositoryPushMailWorker.php',
|
|
|
|
'PhabricatorRepositoryPushReplyHandler' => 'applications/repository/mail/PhabricatorRepositoryPushReplyHandler.php',
|
2012-12-19 20:07:06 +01:00
|
|
|
'PhabricatorRepositoryQuery' => 'applications/repository/query/PhabricatorRepositoryQuery.php',
|
2014-01-16 21:05:30 +01:00
|
|
|
'PhabricatorRepositoryRefCursor' => 'applications/repository/storage/PhabricatorRepositoryRefCursor.php',
|
2015-12-10 21:59:25 +01:00
|
|
|
'PhabricatorRepositoryRefCursorPHIDType' => 'applications/repository/phid/PhabricatorRepositoryRefCursorPHIDType.php',
|
2014-01-16 21:05:30 +01:00
|
|
|
'PhabricatorRepositoryRefCursorQuery' => 'applications/repository/query/PhabricatorRepositoryRefCursorQuery.php',
|
|
|
|
'PhabricatorRepositoryRefEngine' => 'applications/repository/engine/PhabricatorRepositoryRefEngine.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorRepositoryRepositoryPHIDType' => 'applications/repository/phid/PhabricatorRepositoryRepositoryPHIDType.php',
|
2014-09-29 00:12:21 +02:00
|
|
|
'PhabricatorRepositorySchemaSpec' => 'applications/repository/storage/PhabricatorRepositorySchemaSpec.php',
|
2013-09-11 00:26:08 +02:00
|
|
|
'PhabricatorRepositorySearchEngine' => 'applications/repository/query/PhabricatorRepositorySearchEngine.php',
|
2013-10-31 00:04:19 +01:00
|
|
|
'PhabricatorRepositoryStatusMessage' => 'applications/repository/storage/PhabricatorRepositoryStatusMessage.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositorySvnCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositorySvnCommitChangeParserWorker.php',
|
|
|
|
'PhabricatorRepositorySvnCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositorySvnCommitMessageParserWorker.php',
|
|
|
|
'PhabricatorRepositorySymbol' => 'applications/repository/storage/PhabricatorRepositorySymbol.php',
|
|
|
|
'PhabricatorRepositoryTestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php',
|
2013-05-24 21:37:42 +02:00
|
|
|
'PhabricatorRepositoryTransaction' => 'applications/repository/storage/PhabricatorRepositoryTransaction.php',
|
|
|
|
'PhabricatorRepositoryTransactionQuery' => 'applications/repository/query/PhabricatorRepositoryTransactionQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryType' => 'applications/repository/constants/PhabricatorRepositoryType.php',
|
2016-04-17 17:17:49 +02:00
|
|
|
'PhabricatorRepositoryURI' => 'applications/repository/storage/PhabricatorRepositoryURI.php',
|
2016-01-12 15:45:17 +01:00
|
|
|
'PhabricatorRepositoryURIIndex' => 'applications/repository/storage/PhabricatorRepositoryURIIndex.php',
|
2014-01-16 19:49:03 +01:00
|
|
|
'PhabricatorRepositoryURINormalizer' => 'applications/repository/data/PhabricatorRepositoryURINormalizer.php',
|
|
|
|
'PhabricatorRepositoryURINormalizerTestCase' => 'applications/repository/data/__tests__/PhabricatorRepositoryURINormalizerTestCase.php',
|
2016-04-28 17:33:44 +02:00
|
|
|
'PhabricatorRepositoryURIPHIDType' => 'applications/repository/phid/PhabricatorRepositoryURIPHIDType.php',
|
|
|
|
'PhabricatorRepositoryURIQuery' => 'applications/repository/query/PhabricatorRepositoryURIQuery.php',
|
2013-12-12 18:45:27 +01:00
|
|
|
'PhabricatorRepositoryURITestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryURITestCase.php',
|
2016-04-28 17:33:44 +02:00
|
|
|
'PhabricatorRepositoryURITransaction' => 'applications/repository/storage/PhabricatorRepositoryURITransaction.php',
|
2016-04-28 19:40:35 +02:00
|
|
|
'PhabricatorRepositoryURITransactionQuery' => 'applications/repository/query/PhabricatorRepositoryURITransactionQuery.php',
|
2013-11-01 16:34:11 +01:00
|
|
|
'PhabricatorRepositoryVCSPassword' => 'applications/repository/storage/PhabricatorRepositoryVCSPassword.php',
|
2015-03-20 17:26:32 +01:00
|
|
|
'PhabricatorRepositoryVersion' => 'applications/repository/constants/PhabricatorRepositoryVersion.php',
|
Move toward multi-master replicated repositories
Summary:
Ref T4292. This mostly implements the locking/versioning logic for multi-master repositories. It is only active on Git SSH pathways, and doesn't actually do anything useful yet: it just does bookkeeping so far.
When we read (e.g., `git fetch`) the logic goes like this:
- Get the read lock (unique to device + repository).
- Read all the versions of the repository on every other device.
- If any node has a newer version:
- Fetch the newer version.
- Increment our version to be the same as the version we fetched.
- Release the read lock.
- Actually do the fetch.
This makes sure that any time you do a read, you always read the most recently acknowledged write. You may have to wait for an internal fetch to happen (this isn't actually implemented yet) but the operation will always work like you expect it to.
When we write (e.g., `git push`) the logic goes like this:
- Get the write lock (unique to the repository).
- Do all the read steps so we're up to date.
- Mark a write pending.
- Do the actual write.
- Bump our version and mark our write finished.
- Release the write lock.
This allows you to write to any replica. Again, you might have to wait for a fetch first, but everything will work like you expect.
There's one notable failure mode here: if the network connection between the repository node and the database fails during the write, the write lock might be released even though a write is ongoing.
The "isWriting" column protects against that, by staying locked if we lose our connection to the database. This will currently "freeze" the repository (prevent any new writes) until an administrator can sort things out, since it'd dangerous to continue doing writes (we may lose data).
(Since we won't actually acknowledge the write, I think, we could probably smooth this out a bit and make it self-healing //most// of the time: basically, have the broken node rewind itself by updating from another good node. But that's a little more complex.)
Test Plan:
- Pushed changes to a cluster-mode repository.
- Viewed web interface, saw "writing" flag and version changes.
- Pulled changes.
- Faked various failures, got sensible states.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4292
Differential Revision: https://secure.phabricator.com/D15688
2016-04-11 20:58:02 +02:00
|
|
|
'PhabricatorRepositoryWorkingCopyVersion' => 'applications/repository/storage/PhabricatorRepositoryWorkingCopyVersion.php',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorRequestExceptionHandler' => 'aphront/handler/PhabricatorRequestExceptionHandler.php',
|
2015-12-11 17:23:39 +01:00
|
|
|
'PhabricatorResourceSite' => 'aphront/site/PhabricatorResourceSite.php',
|
2014-03-14 19:53:17 +01:00
|
|
|
'PhabricatorRobotsController' => 'applications/system/controller/PhabricatorRobotsController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorS3FileStorageEngine' => 'applications/files/engine/PhabricatorS3FileStorageEngine.php',
|
2014-05-09 21:47:21 +02:00
|
|
|
'PhabricatorSMS' => 'infrastructure/sms/storage/PhabricatorSMS.php',
|
|
|
|
'PhabricatorSMSConfigOptions' => 'applications/config/option/PhabricatorSMSConfigOptions.php',
|
|
|
|
'PhabricatorSMSDAO' => 'infrastructure/sms/storage/PhabricatorSMSDAO.php',
|
|
|
|
'PhabricatorSMSDemultiplexWorker' => 'infrastructure/sms/worker/PhabricatorSMSDemultiplexWorker.php',
|
|
|
|
'PhabricatorSMSImplementationAdapter' => 'infrastructure/sms/adapter/PhabricatorSMSImplementationAdapter.php',
|
|
|
|
'PhabricatorSMSImplementationTestBlackholeAdapter' => 'infrastructure/sms/adapter/PhabricatorSMSImplementationTestBlackholeAdapter.php',
|
|
|
|
'PhabricatorSMSImplementationTwilioAdapter' => 'infrastructure/sms/adapter/PhabricatorSMSImplementationTwilioAdapter.php',
|
|
|
|
'PhabricatorSMSManagementListOutboundWorkflow' => 'infrastructure/sms/management/PhabricatorSMSManagementListOutboundWorkflow.php',
|
|
|
|
'PhabricatorSMSManagementSendTestWorkflow' => 'infrastructure/sms/management/PhabricatorSMSManagementSendTestWorkflow.php',
|
|
|
|
'PhabricatorSMSManagementShowOutboundWorkflow' => 'infrastructure/sms/management/PhabricatorSMSManagementShowOutboundWorkflow.php',
|
|
|
|
'PhabricatorSMSManagementWorkflow' => 'infrastructure/sms/management/PhabricatorSMSManagementWorkflow.php',
|
|
|
|
'PhabricatorSMSSendWorker' => 'infrastructure/sms/worker/PhabricatorSMSSendWorker.php',
|
|
|
|
'PhabricatorSMSWorker' => 'infrastructure/sms/worker/PhabricatorSMSWorker.php',
|
2012-07-02 19:49:00 +02:00
|
|
|
'PhabricatorSQLPatchList' => 'infrastructure/storage/patch/PhabricatorSQLPatchList.php',
|
2014-03-13 02:17:11 +01:00
|
|
|
'PhabricatorSSHKeyGenerator' => 'infrastructure/util/PhabricatorSSHKeyGenerator.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorSSHKeysSettingsPanel' => 'applications/settings/panel/PhabricatorSSHKeysSettingsPanel.php',
|
2013-12-06 02:00:48 +01:00
|
|
|
'PhabricatorSSHLog' => 'infrastructure/log/PhabricatorSSHLog.php',
|
Generalize SSH passthru for repository hosting
Summary:
Ref T2230. In Git, we can determine if a command is read-only or read/write from the command itself, but this isn't the case in Mercurial or SVN.
For Mercurial and SVN, we need to proxy the protocol that's coming over the wire, look at each request from the client, and then check if it's a read or a write. To support this, provide a more flexible version of `passthruIO`.
The way this will work is:
- The SSH IO channel is wrapped in a `ProtocolChannel` which can parse the the incoming stream into message objects.
- The `willWriteCallback` will look at those messages and determine if they're reads or writes.
- If they're writes, it will check for write permission.
- If we're good to go, the message object is converted back into a byte stream and handed to the underlying command.
Test Plan: Executed `git clone`, `git clone --depth 3`, `git push` (against no-write repo, got error), `git push` (against valid repo).
Reviewers: btrahan
Reviewed By: btrahan
CC: hach-que, asherkin, aran
Maniphest Tasks: T2230
Differential Revision: https://secure.phabricator.com/D7551
2013-11-11 21:12:21 +01:00
|
|
|
'PhabricatorSSHPassthruCommand' => 'infrastructure/ssh/PhabricatorSSHPassthruCommand.php',
|
2014-11-11 17:18:26 +01:00
|
|
|
'PhabricatorSSHPublicKeyInterface' => 'applications/auth/sshkey/PhabricatorSSHPublicKeyInterface.php',
|
Implement SSHD glue and Conduit SSH endpoint
Summary:
- Build "sshd-auth" (for authentication) and "sshd-exec" (for command execution) binaries. These are callable by "sshd-vcs", located [[https://github.com/epriestley/sshd-vcs | in my account on GitHub]]. They are based on precursors [[https://github.com/epriestley/sshd-vcs-glue | here on GitHub]] which I deployed for TenXer about a year ago, so I have some confidence they at least basically work.
- The problem this solves is that normally every user would need an account on a machine to connect to it, and/or their public keys would all need to be listed in `~/.authorized_keys`. This is a big pain in most installs. Software like Gitosis/Gitolite solve this problem by giving you an easy way to add public keys to `~/.authorized_keys`, but this is pretty gross.
- Roughly, instead of looking in `~/.authorized_keys` when a user connects, the patched sshd instead runs `echo <public key> | sshd-auth`. The `sshd-auth` script looks up the public key and authorizes the matching user, if they exist. It also forces sshd to run `sshd-exec` instead of a normal shell.
- `sshd-exec` receives the authenticated user and any command which was passed to ssh (like `git receive-pack`) and can route them appropriately.
- Overall, this permits a single account to be set up on a server which all Phabricator users can connect to without any extra work, and which can safely execute commands and apply appropriate permissions, and disable users when they are disabled in Phabricator and all that stuff.
- Build out "sshd-exec" to do more thorough checks and setup, and delegate command execution to Workflows (they now exist, and did not when I originally built this stuff).
- Convert @btrahan's conduit API script into a workflow and slightly simplify it (ConduitCall did not exist at the time it was written).
The next steps here on the Repository side are to implement Workflows for Git, SVN and HG wire protocols. These will mostly just proxy the protocols, but also need to enforce permissions. So the approach will basically be:
- Implement workflows for stuff like `git receive-pack`.
- These workflows will implement enough of the underlying protocol to determine what resource the user is trying to access, and whether they want to read or write it.
- They'll then do a permissons check, and kick the user out if they don't have permission to do whatever they are trying to do.
- If the user does have permission, we just proxy the rest of the transaction.
Next steps on the Conduit side are more simple:
- Make ConduitClient understand "ssh://" URLs.
Test Plan: Ran `sshd-exec --phabricator-ssh-user epriestley conduit differential.query`, etc. This will get a more comprehensive test once I set up sshd-vcs.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T603, T550
Differential Revision: https://secure.phabricator.com/D4229
2012-12-19 20:08:07 +01:00
|
|
|
'PhabricatorSSHWorkflow' => 'infrastructure/ssh/PhabricatorSSHWorkflow.php',
|
2013-04-14 15:53:20 +02:00
|
|
|
'PhabricatorSavedQuery' => 'applications/search/storage/PhabricatorSavedQuery.php',
|
2013-05-27 22:41:20 +02:00
|
|
|
'PhabricatorSavedQueryQuery' => 'applications/search/query/PhabricatorSavedQueryQuery.php',
|
2015-01-20 01:55:23 +01:00
|
|
|
'PhabricatorScheduleTaskTriggerAction' => 'infrastructure/daemon/workers/action/PhabricatorScheduleTaskTriggerAction.php',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorScopedEnv' => 'infrastructure/env/PhabricatorScopedEnv.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchAbstractDocument' => 'applications/search/index/PhabricatorSearchAbstractDocument.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSearchApplication' => 'applications/search/application/PhabricatorSearchApplication.php',
|
2014-02-03 21:51:08 +01:00
|
|
|
'PhabricatorSearchApplicationSearchEngine' => 'applications/search/query/PhabricatorSearchApplicationSearchEngine.php',
|
2015-05-19 22:59:58 +02:00
|
|
|
'PhabricatorSearchApplicationStorageEnginePanel' => 'applications/search/applicationpanel/PhabricatorSearchApplicationStorageEnginePanel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchAttachController' => 'applications/search/controller/PhabricatorSearchAttachController.php',
|
|
|
|
'PhabricatorSearchBaseController' => 'applications/search/controller/PhabricatorSearchBaseController.php',
|
2015-06-07 16:31:28 +02:00
|
|
|
'PhabricatorSearchCheckboxesField' => 'applications/search/field/PhabricatorSearchCheckboxesField.php',
|
2013-01-12 00:28:16 +01:00
|
|
|
'PhabricatorSearchConfigOptions' => 'applications/search/config/PhabricatorSearchConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchController' => 'applications/search/controller/PhabricatorSearchController.php',
|
2015-06-08 21:20:16 +02:00
|
|
|
'PhabricatorSearchCustomFieldProxyField' => 'applications/search/field/PhabricatorSearchCustomFieldProxyField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchDAO' => 'applications/search/storage/PhabricatorSearchDAO.php',
|
2014-07-18 00:48:36 +02:00
|
|
|
'PhabricatorSearchDatasource' => 'applications/search/typeahead/PhabricatorSearchDatasource.php',
|
2015-06-08 21:20:16 +02:00
|
|
|
'PhabricatorSearchDatasourceField' => 'applications/search/field/PhabricatorSearchDatasourceField.php',
|
2015-06-22 22:27:37 +02:00
|
|
|
'PhabricatorSearchDateControlField' => 'applications/search/field/PhabricatorSearchDateControlField.php',
|
2015-06-05 20:21:08 +02:00
|
|
|
'PhabricatorSearchDateField' => 'applications/search/field/PhabricatorSearchDateField.php',
|
2013-05-27 22:42:44 +02:00
|
|
|
'PhabricatorSearchDeleteController' => 'applications/search/controller/PhabricatorSearchDeleteController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchDocument' => 'applications/search/storage/document/PhabricatorSearchDocument.php',
|
|
|
|
'PhabricatorSearchDocumentField' => 'applications/search/storage/document/PhabricatorSearchDocumentField.php',
|
2015-06-05 20:01:25 +02:00
|
|
|
'PhabricatorSearchDocumentFieldType' => 'applications/search/constants/PhabricatorSearchDocumentFieldType.php',
|
2014-02-03 21:51:08 +01:00
|
|
|
'PhabricatorSearchDocumentQuery' => 'applications/search/query/PhabricatorSearchDocumentQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchDocumentRelationship' => 'applications/search/storage/document/PhabricatorSearchDocumentRelationship.php',
|
2015-04-23 00:25:34 +02:00
|
|
|
'PhabricatorSearchDocumentTypeDatasource' => 'applications/search/typeahead/PhabricatorSearchDocumentTypeDatasource.php',
|
2013-05-27 22:42:01 +02:00
|
|
|
'PhabricatorSearchEditController' => 'applications/search/controller/PhabricatorSearchEditController.php',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorSearchEngineAPIMethod' => 'applications/search/engine/PhabricatorSearchEngineAPIMethod.php',
|
Implement an "Attachments" behavior for Conduit Search APIs
Summary:
Ref T9964. We have various kinds of secondary data on objects (like subscribers, projects, paste content, Owners paths, file attachments, etc) which is somewhat slow, or somewhat large, or both.
Some approaches to handling this in the API include:
- Always return all of it (very easy, but slow).
- Require users to make separate API calls to get each piece of data (very simple, but inefficient and really cumbersome to use).
- Implement a hierarchical query language like GraphQL (powerful, but very complex).
- Kind of mix-and-match a half-power query language and some extra calls? (fairly simple, not too terrible?)
We currently mix-and-match internally, with `->needStuff(true)`. This is not a general-purpose, full-power graph query language like GraphQL, and it occasionally does limit us.
For example, there is no way to do this sort of thing:
$conpherence_thread_query = id(new ConpherenceThreadQuery())
->setViewer($viewer)
// ...
->setNeedMessages(true)
->setWhenYouLoadTheMessagesTheyNeedProfilePictures(true);
However, we almost never actually need to do this and when we do want to do it we usually don't //really// want to do it, so I don't think this is a major limit to the practical power of the system for the kinds of things we really want to do with it.
Put another way, we have a lot of 1-level hierarchical queries (get pictures or repositories or projects or files or content for these objects) but few-to-no 2+ level queries (get files for these objects, then get all the projects for those files).
So even though 1-level hierarchies are not a beautiful, general-purpose, fully-abstract system, they've worked well so far in practice and I'm comfortable moving forward with them in the API.
If we do need N-level queries in the future, there is no technical reason we can't put GraphQL (or something similar) on top of this eventually, and this would represent a solid step toward that. However, I suspect we'll never need them.
Upshot: I'm pretty happy with "->needX()" for all practical purposes, so this is just adding a way to say "->needX()" to the API.
Specifically, you say:
```
{
"attachments": {
"subscribers": true,
}
}
```
...and get back subscriber data. In the future (or for certain attachments), `true` might become a dictionary of extra parameters, if necessary, and could do so without breaking the API.
Test Plan:
- Ran queries to get attachments.
{F1025449}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9964
Differential Revision: https://secure.phabricator.com/D14772
2015-12-14 13:58:34 +01:00
|
|
|
'PhabricatorSearchEngineAttachment' => 'applications/search/engineextension/PhabricatorSearchEngineAttachment.php',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorSearchEngineExtension' => 'applications/search/engineextension/PhabricatorSearchEngineExtension.php',
|
|
|
|
'PhabricatorSearchEngineExtensionModule' => 'applications/search/engineextension/PhabricatorSearchEngineExtensionModule.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorSearchEngineTestCase' => 'applications/search/engine/__tests__/PhabricatorSearchEngineTestCase.php',
|
2015-06-05 20:21:08 +02:00
|
|
|
'PhabricatorSearchField' => 'applications/search/field/PhabricatorSearchField.php',
|
2013-04-03 17:31:27 +02:00
|
|
|
'PhabricatorSearchHovercardController' => 'applications/search/controller/PhabricatorSearchHovercardController.php',
|
Allow index extensions to skip indexing if the object has not changed
Summary:
Fixes T9890. This allows IndexExtensions to emit an object version.
Before we build indexes, we check if the indexed version is the same as the current version. If it is, we just don't call that extension.
T9890 has a case where this is useful: a script went crazy and posted thousands of comments to a single task.
Without versioning, that results in the same comments being indexed over and over again. With versioning, most of the queue could just exit without doing any work.
Test Plan:
- Added a `sleep(1)` to the actual indexing, used `bin/search index --background` to queue up a lot of tasks, ran them with `bin/phd debug task`, saw them complete very quickly with only one actual index operation performed.
- Used `bin/search index --trace` and `bin/search index --trace --background` to observe the behavior of queries against the index version store, which looked sensible.
- Made comments/transactions, saw versions update.
- Used `bin/remove destroy`, verified index versions were purged.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9890
Differential Revision: https://secure.phabricator.com/D14845
2015-12-21 20:04:08 +01:00
|
|
|
'PhabricatorSearchIndexVersion' => 'applications/search/storage/PhabricatorSearchIndexVersion.php',
|
|
|
|
'PhabricatorSearchIndexVersionDestructionEngineExtension' => 'applications/search/engineextension/PhabricatorSearchIndexVersionDestructionEngineExtension.php',
|
Improve Search architecture
Summary:
The search indexing API has several problems right now:
- Always runs in-process.
- It would be nice to push this into the task queue for performance. However, the API currently passses an object all the way through (and some indexers depend on preloaded object attributes), so it can't be dumped into the task queue at any stage since we can't serialize it.
- Being able to use the task queue will also make rebuilding indexes faster.
- Instead, make the API phid-oriented.
- No uniform indexing API.
- Each "Editor" currently calls SomeCustomIndexer::indexThing(). This won't work with AbstractTransactions. The API is also just weird.
- Instead, provide a uniform API.
- No uniform CLI.
- We have `scripts/search/reindex_everything.php`, but it doesn't actually index everything. Each new document type needs to be separately added to it, leading to stuff like D3839. Third-party applications can't provide indexers.
- Instead, let indexers expose documents for indexing.
- Not application-oriented.
- All the indexers live in search/ right now, which isn't the right organization in an application-orietned view of the world.
- Instead, move indexers to applications and load them with SymbolLoader.
Test Plan:
- `bin/search index`
- Indexed one revision, one task.
- Indexed `--type TASK`, `--type DREV`, etc., for all types.
- Indexed `--all`.
- Added the word "saboteur" to a revision, task, wiki page, and question and then searched for it.
- Creating users is a pain; searched for a user after indexing.
- Creating commits is a pain; searched for a commit after indexing.
- Mocks aren't currently loadable in the result view, so their indexing is moot.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: 20after4, aran
Maniphest Tasks: T1991, T2104
Differential Revision: https://secure.phabricator.com/D4261
2012-12-21 23:21:31 +01:00
|
|
|
'PhabricatorSearchManagementIndexWorkflow' => 'applications/search/management/PhabricatorSearchManagementIndexWorkflow.php',
|
2014-12-22 22:10:52 +01:00
|
|
|
'PhabricatorSearchManagementInitWorkflow' => 'applications/search/management/PhabricatorSearchManagementInitWorkflow.php',
|
Improve Search architecture
Summary:
The search indexing API has several problems right now:
- Always runs in-process.
- It would be nice to push this into the task queue for performance. However, the API currently passses an object all the way through (and some indexers depend on preloaded object attributes), so it can't be dumped into the task queue at any stage since we can't serialize it.
- Being able to use the task queue will also make rebuilding indexes faster.
- Instead, make the API phid-oriented.
- No uniform indexing API.
- Each "Editor" currently calls SomeCustomIndexer::indexThing(). This won't work with AbstractTransactions. The API is also just weird.
- Instead, provide a uniform API.
- No uniform CLI.
- We have `scripts/search/reindex_everything.php`, but it doesn't actually index everything. Each new document type needs to be separately added to it, leading to stuff like D3839. Third-party applications can't provide indexers.
- Instead, let indexers expose documents for indexing.
- Not application-oriented.
- All the indexers live in search/ right now, which isn't the right organization in an application-orietned view of the world.
- Instead, move indexers to applications and load them with SymbolLoader.
Test Plan:
- `bin/search index`
- Indexed one revision, one task.
- Indexed `--type TASK`, `--type DREV`, etc., for all types.
- Indexed `--all`.
- Added the word "saboteur" to a revision, task, wiki page, and question and then searched for it.
- Creating users is a pain; searched for a user after indexing.
- Creating commits is a pain; searched for a commit after indexing.
- Mocks aren't currently loadable in the result view, so their indexing is moot.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: 20after4, aran
Maniphest Tasks: T1991, T2104
Differential Revision: https://secure.phabricator.com/D4261
2012-12-21 23:21:31 +01:00
|
|
|
'PhabricatorSearchManagementWorkflow' => 'applications/search/management/PhabricatorSearchManagementWorkflow.php',
|
Implement basic ngram search for Owners Package names
Summary:
Ref T9979. This uses ngrams (specifically, trigrams) to build a reasonably efficient index for substring matching. Specifically, for a package like "Example", with ID 123, we store rows like this:
```
< ex, 123>
<exa, 123>
<xam, 123>
<amp, 123>
<mpl, 123>
<ple, 123>
<le , 123>
```
When the user searches for `exam`, we join this table for packages with tokens `exa` and `xam`. MySQL can do this a lot more efficiently than it can process a `LIKE "%exam%"` query against a huge table.
When the user searches for a one-letter or two-letter string, we only search the beginnings of words. This is probably what they want, the only thing we can do quickly, and a reasonable/expected behavior for typeaheads.
Test Plan:
- Ran storage upgrades and search indexer.
- Searched for stuff with "name contains".
- Used typehaead and got sensible results.
- Searched for `aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz` and saw only 16 joins.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9979
Differential Revision: https://secure.phabricator.com/D14846
2015-12-21 21:22:07 +01:00
|
|
|
'PhabricatorSearchNgrams' => 'applications/search/ngrams/PhabricatorSearchNgrams.php',
|
|
|
|
'PhabricatorSearchNgramsDestructionEngineExtension' => 'applications/search/engineextension/PhabricatorSearchNgramsDestructionEngineExtension.php',
|
2013-06-06 01:22:27 +02:00
|
|
|
'PhabricatorSearchOrderController' => 'applications/search/controller/PhabricatorSearchOrderController.php',
|
2015-06-08 21:21:48 +02:00
|
|
|
'PhabricatorSearchOrderField' => 'applications/search/field/PhabricatorSearchOrderField.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorSearchPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorSearchPreferencesSettingsPanel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchRelationship' => 'applications/search/constants/PhabricatorSearchRelationship.php',
|
|
|
|
'PhabricatorSearchResultView' => 'applications/search/view/PhabricatorSearchResultView.php',
|
2016-04-26 20:19:03 +02:00
|
|
|
'PhabricatorSearchSchemaSpec' => 'applications/search/storage/PhabricatorSearchSchemaSpec.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchSelectController' => 'applications/search/controller/PhabricatorSearchSelectController.php',
|
2015-06-08 21:20:16 +02:00
|
|
|
'PhabricatorSearchSelectField' => 'applications/search/field/PhabricatorSearchSelectField.php',
|
2015-06-05 20:21:08 +02:00
|
|
|
'PhabricatorSearchStringListField' => 'applications/search/field/PhabricatorSearchStringListField.php',
|
2015-06-08 21:20:53 +02:00
|
|
|
'PhabricatorSearchSubscribersField' => 'applications/search/field/PhabricatorSearchSubscribersField.php',
|
2015-06-08 21:20:16 +02:00
|
|
|
'PhabricatorSearchTextField' => 'applications/search/field/PhabricatorSearchTextField.php',
|
2015-06-07 16:32:09 +02:00
|
|
|
'PhabricatorSearchThreeStateField' => 'applications/search/field/PhabricatorSearchThreeStateField.php',
|
2015-06-05 20:21:08 +02:00
|
|
|
'PhabricatorSearchTokenizerField' => 'applications/search/field/PhabricatorSearchTokenizerField.php',
|
2014-01-14 22:22:56 +01:00
|
|
|
'PhabricatorSearchWorker' => 'applications/search/worker/PhabricatorSearchWorker.php',
|
2013-01-03 14:45:23 +01:00
|
|
|
'PhabricatorSecurityConfigOptions' => 'applications/config/option/PhabricatorSecurityConfigOptions.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorSecuritySetupCheck' => 'applications/config/check/PhabricatorSecuritySetupCheck.php',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorSelectEditField' => 'applications/transactions/editfield/PhabricatorSelectEditField.php',
|
2013-01-15 21:04:05 +01:00
|
|
|
'PhabricatorSendGridConfigOptions' => 'applications/config/option/PhabricatorSendGridConfigOptions.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorSessionsSettingsPanel' => 'applications/settings/panel/PhabricatorSessionsSettingsPanel.php',
|
2014-04-03 20:22:38 +02:00
|
|
|
'PhabricatorSettingsAddEmailAction' => 'applications/settings/action/PhabricatorSettingsAddEmailAction.php',
|
2012-08-13 21:37:18 +02:00
|
|
|
'PhabricatorSettingsAdjustController' => 'applications/settings/controller/PhabricatorSettingsAdjustController.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSettingsApplication' => 'applications/settings/application/PhabricatorSettingsApplication.php',
|
2012-08-13 21:37:18 +02:00
|
|
|
'PhabricatorSettingsMainController' => 'applications/settings/controller/PhabricatorSettingsMainController.php',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PhabricatorSettingsMainMenuBarExtension' => 'applications/settings/extension/PhabricatorSettingsMainMenuBarExtension.php',
|
2012-08-13 21:37:26 +02:00
|
|
|
'PhabricatorSettingsPanel' => 'applications/settings/panel/PhabricatorSettingsPanel.php',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorSetupCheck' => 'applications/config/check/PhabricatorSetupCheck.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorSetupCheckTestCase' => 'applications/config/check/__tests__/PhabricatorSetupCheckTestCase.php',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorSetupIssue' => 'applications/config/issue/PhabricatorSetupIssue.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorSetupIssueUIExample' => 'applications/uiexample/examples/PhabricatorSetupIssueUIExample.php',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorSetupIssueView' => 'applications/config/view/PhabricatorSetupIssueView.php',
|
2015-11-09 19:09:19 +01:00
|
|
|
'PhabricatorShortSite' => 'aphront/site/PhabricatorShortSite.php',
|
2015-11-03 17:45:00 +01:00
|
|
|
'PhabricatorSimpleEditType' => 'applications/transactions/edittype/PhabricatorSimpleEditType.php',
|
2015-06-29 23:04:48 +02:00
|
|
|
'PhabricatorSite' => 'aphront/site/PhabricatorSite.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSlowvoteApplication' => 'applications/slowvote/application/PhabricatorSlowvoteApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSlowvoteChoice' => 'applications/slowvote/storage/PhabricatorSlowvoteChoice.php',
|
2014-04-24 21:00:31 +02:00
|
|
|
'PhabricatorSlowvoteCloseController' => 'applications/slowvote/controller/PhabricatorSlowvoteCloseController.php',
|
2013-07-15 13:45:43 +02:00
|
|
|
'PhabricatorSlowvoteCommentController' => 'applications/slowvote/controller/PhabricatorSlowvoteCommentController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSlowvoteController' => 'applications/slowvote/controller/PhabricatorSlowvoteController.php',
|
|
|
|
'PhabricatorSlowvoteDAO' => 'applications/slowvote/storage/PhabricatorSlowvoteDAO.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhabricatorSlowvoteDefaultViewCapability' => 'applications/slowvote/capability/PhabricatorSlowvoteDefaultViewCapability.php',
|
2013-07-15 19:50:38 +02:00
|
|
|
'PhabricatorSlowvoteEditController' => 'applications/slowvote/controller/PhabricatorSlowvoteEditController.php',
|
2013-07-15 13:45:43 +02:00
|
|
|
'PhabricatorSlowvoteEditor' => 'applications/slowvote/editor/PhabricatorSlowvoteEditor.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSlowvoteListController' => 'applications/slowvote/controller/PhabricatorSlowvoteListController.php',
|
2015-08-02 00:41:08 +02:00
|
|
|
'PhabricatorSlowvoteMailReceiver' => 'applications/slowvote/mail/PhabricatorSlowvoteMailReceiver.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSlowvoteOption' => 'applications/slowvote/storage/PhabricatorSlowvoteOption.php',
|
|
|
|
'PhabricatorSlowvotePoll' => 'applications/slowvote/storage/PhabricatorSlowvotePoll.php',
|
|
|
|
'PhabricatorSlowvotePollController' => 'applications/slowvote/controller/PhabricatorSlowvotePollController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorSlowvotePollPHIDType' => 'applications/slowvote/phid/PhabricatorSlowvotePollPHIDType.php',
|
2013-07-13 19:41:30 +02:00
|
|
|
'PhabricatorSlowvoteQuery' => 'applications/slowvote/query/PhabricatorSlowvoteQuery.php',
|
2015-08-02 00:41:08 +02:00
|
|
|
'PhabricatorSlowvoteReplyHandler' => 'applications/slowvote/mail/PhabricatorSlowvoteReplyHandler.php',
|
2014-09-19 14:45:24 +02:00
|
|
|
'PhabricatorSlowvoteSchemaSpec' => 'applications/slowvote/storage/PhabricatorSlowvoteSchemaSpec.php',
|
2013-07-13 19:41:49 +02:00
|
|
|
'PhabricatorSlowvoteSearchEngine' => 'applications/slowvote/query/PhabricatorSlowvoteSearchEngine.php',
|
2013-07-15 13:20:10 +02:00
|
|
|
'PhabricatorSlowvoteTransaction' => 'applications/slowvote/storage/PhabricatorSlowvoteTransaction.php',
|
|
|
|
'PhabricatorSlowvoteTransactionComment' => 'applications/slowvote/storage/PhabricatorSlowvoteTransactionComment.php',
|
|
|
|
'PhabricatorSlowvoteTransactionQuery' => 'applications/slowvote/query/PhabricatorSlowvoteTransactionQuery.php',
|
2013-05-04 00:48:59 +02:00
|
|
|
'PhabricatorSlowvoteVoteController' => 'applications/slowvote/controller/PhabricatorSlowvoteVoteController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSlug' => 'infrastructure/util/PhabricatorSlug.php',
|
|
|
|
'PhabricatorSlugTestCase' => 'infrastructure/util/__tests__/PhabricatorSlugTestCase.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorSortTableUIExample' => 'applications/uiexample/examples/PhabricatorSortTableUIExample.php',
|
2012-08-15 19:45:06 +02:00
|
|
|
'PhabricatorSourceCodeView' => 'view/layout/PhabricatorSourceCodeView.php',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorSpaceEditField' => 'applications/transactions/editfield/PhabricatorSpaceEditField.php',
|
2015-06-01 23:54:18 +02:00
|
|
|
'PhabricatorSpacesApplication' => 'applications/spaces/application/PhabricatorSpacesApplication.php',
|
2015-06-11 19:13:47 +02:00
|
|
|
'PhabricatorSpacesArchiveController' => 'applications/spaces/controller/PhabricatorSpacesArchiveController.php',
|
Add "Spaces", an application for managing policy namespaces
Summary: Ref T3820. This doesn't actually do anything yet, but dumps in all the plumbing.
Test Plan:
{F156989}
{F156990}
{F156991}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: eadler, wienczny, jdloft, devurandom, thz, hwinkel, 20after4, sascha-egerer, seporaitis, joshuaspence, chad, epriestley
Maniphest Tasks: T3820
Differential Revision: https://secure.phabricator.com/D9204
2015-06-01 20:28:38 +02:00
|
|
|
'PhabricatorSpacesCapabilityCreateSpaces' => 'applications/spaces/capability/PhabricatorSpacesCapabilityCreateSpaces.php',
|
|
|
|
'PhabricatorSpacesCapabilityDefaultEdit' => 'applications/spaces/capability/PhabricatorSpacesCapabilityDefaultEdit.php',
|
|
|
|
'PhabricatorSpacesCapabilityDefaultView' => 'applications/spaces/capability/PhabricatorSpacesCapabilityDefaultView.php',
|
|
|
|
'PhabricatorSpacesController' => 'applications/spaces/controller/PhabricatorSpacesController.php',
|
|
|
|
'PhabricatorSpacesDAO' => 'applications/spaces/storage/PhabricatorSpacesDAO.php',
|
|
|
|
'PhabricatorSpacesEditController' => 'applications/spaces/controller/PhabricatorSpacesEditController.php',
|
|
|
|
'PhabricatorSpacesInterface' => 'applications/spaces/interface/PhabricatorSpacesInterface.php',
|
|
|
|
'PhabricatorSpacesListController' => 'applications/spaces/controller/PhabricatorSpacesListController.php',
|
|
|
|
'PhabricatorSpacesNamespace' => 'applications/spaces/storage/PhabricatorSpacesNamespace.php',
|
2015-06-05 20:21:45 +02:00
|
|
|
'PhabricatorSpacesNamespaceDatasource' => 'applications/spaces/typeahead/PhabricatorSpacesNamespaceDatasource.php',
|
Add "Spaces", an application for managing policy namespaces
Summary: Ref T3820. This doesn't actually do anything yet, but dumps in all the plumbing.
Test Plan:
{F156989}
{F156990}
{F156991}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: eadler, wienczny, jdloft, devurandom, thz, hwinkel, 20after4, sascha-egerer, seporaitis, joshuaspence, chad, epriestley
Maniphest Tasks: T3820
Differential Revision: https://secure.phabricator.com/D9204
2015-06-01 20:28:38 +02:00
|
|
|
'PhabricatorSpacesNamespaceEditor' => 'applications/spaces/editor/PhabricatorSpacesNamespaceEditor.php',
|
|
|
|
'PhabricatorSpacesNamespacePHIDType' => 'applications/spaces/phid/PhabricatorSpacesNamespacePHIDType.php',
|
|
|
|
'PhabricatorSpacesNamespaceQuery' => 'applications/spaces/query/PhabricatorSpacesNamespaceQuery.php',
|
|
|
|
'PhabricatorSpacesNamespaceSearchEngine' => 'applications/spaces/query/PhabricatorSpacesNamespaceSearchEngine.php',
|
|
|
|
'PhabricatorSpacesNamespaceTransaction' => 'applications/spaces/storage/PhabricatorSpacesNamespaceTransaction.php',
|
|
|
|
'PhabricatorSpacesNamespaceTransactionQuery' => 'applications/spaces/query/PhabricatorSpacesNamespaceTransactionQuery.php',
|
2015-07-03 22:03:33 +02:00
|
|
|
'PhabricatorSpacesNoAccessController' => 'applications/spaces/controller/PhabricatorSpacesNoAccessController.php',
|
2015-06-05 23:19:40 +02:00
|
|
|
'PhabricatorSpacesRemarkupRule' => 'applications/spaces/remarkup/PhabricatorSpacesRemarkupRule.php',
|
2015-06-11 00:53:51 +02:00
|
|
|
'PhabricatorSpacesSchemaSpec' => 'applications/spaces/storage/PhabricatorSpacesSchemaSpec.php',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorSpacesSearchEngineExtension' => 'applications/spaces/engineextension/PhabricatorSpacesSearchEngineExtension.php',
|
2015-07-06 14:52:04 +02:00
|
|
|
'PhabricatorSpacesSearchField' => 'applications/spaces/searchfield/PhabricatorSpacesSearchField.php',
|
2015-06-01 21:02:20 +02:00
|
|
|
'PhabricatorSpacesTestCase' => 'applications/spaces/__tests__/PhabricatorSpacesTestCase.php',
|
Add "Spaces", an application for managing policy namespaces
Summary: Ref T3820. This doesn't actually do anything yet, but dumps in all the plumbing.
Test Plan:
{F156989}
{F156990}
{F156991}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: eadler, wienczny, jdloft, devurandom, thz, hwinkel, 20after4, sascha-egerer, seporaitis, joshuaspence, chad, epriestley
Maniphest Tasks: T3820
Differential Revision: https://secure.phabricator.com/D9204
2015-06-01 20:28:38 +02:00
|
|
|
'PhabricatorSpacesViewController' => 'applications/spaces/controller/PhabricatorSpacesViewController.php',
|
2013-09-17 01:03:24 +02:00
|
|
|
'PhabricatorStandardCustomField' => 'infrastructure/customfield/standard/PhabricatorStandardCustomField.php',
|
Rough cut of "Blueprint Authorizations"
Summary:
Ref T9519. This is like 80% of the way there and doesn't fully work yet, but roughly shows the shape of things to come. Here's how it works:
First, there's a new custom field type for blueprints which works like a normal typeahead but has some extra logic. It's implemented this way to make it easy to add to Blueprints in Drydock and Build Plans in Harbormaster. Here, I've added a "Use Blueprints" field to the "WorkingCopy" blueprint, so you can control which hosts the working copies are permitted to allocate on:
{F869865}
This control has a bit of custom rendering logic. Instead of rendering a normal list of PHIDs, it renders an annotated list with icons:
{F869866}
These icons show whether the blueprint on the other size of the authorization has approved this object. Once you have a green checkmark, you're good to go.
On the blueprint side, things look like this:
{F869867}
This table shows all the objects which have asked for access to this blueprint. In this case it's showing that one object is approved to use the blueprint since I already approved it, but by default new requests come in here as "Authorization Requested" and someone has to go approve them.
You approve them from within the authorization detail screen:
{F869868}
You can use the "Approve" or "Decline" buttons to allow or prevent use of the blueprint.
This doesn't actually do anything yet -- objects don't need to be authorized in order to use blueprints quite yet. That will come in the next diff, I just wanted to get the UI in reasonable shape first.
The authorization also has a second piece of state, which is whether the request from the object is active or inactive. We use this to keep track of the authorization if the blueprint is (maybe temporarily) deleted.
For example, you might have a Build Plan that uses Blueprints A and B. For a couple days, you only want to use A, so you remove B from the "Use Blueprints: ..." field. Later, you can add B back and it will connect to its old authorization again, so you don't need to go re-approve things (and if you're declined, you stay declined instead of being able to request authorization over and over again). This should make working with authorizations a little easier and less labor intensive.
Stuff not in this diff:
- Actually preventing any allocations (next diff).
- Probably should have transactions for approve/decline, at least, at some point, so there's a log of who did approvals and when.
- Maybe should have a more clear/loud error state when no blueprints are approved?
- Should probably restrict the typeahead to specific blueprint types.
Test Plan:
- Added the field.
- Typed some stuff into it.
- Saw the UI update properly.
- Approved an authorization.
- Declined an authorization.
- Saw active authorizations on a blueprint page.
- Didn't see any inactive authroizations there.
- Clicked "View All Authorizations", saw all authorizations.
Reviewers: chad, hach-que
Reviewed By: chad
Maniphest Tasks: T9519
Differential Revision: https://secure.phabricator.com/D14251
2015-10-10 16:15:25 +02:00
|
|
|
'PhabricatorStandardCustomFieldBlueprints' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldBlueprints.php',
|
2013-09-17 01:03:51 +02:00
|
|
|
'PhabricatorStandardCustomFieldBool' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldBool.php',
|
2014-03-26 00:13:27 +01:00
|
|
|
'PhabricatorStandardCustomFieldCredential' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldCredential.php',
|
2015-09-21 13:41:52 +02:00
|
|
|
'PhabricatorStandardCustomFieldDatasource' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldDatasource.php',
|
2013-09-17 01:04:31 +02:00
|
|
|
'PhabricatorStandardCustomFieldDate' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldDate.php',
|
2013-09-17 23:22:04 +02:00
|
|
|
'PhabricatorStandardCustomFieldHeader' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldHeader.php',
|
2013-09-17 01:03:24 +02:00
|
|
|
'PhabricatorStandardCustomFieldInt' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldInt.php',
|
Support configuration-driven custom fields
Summary:
Ref T1702. Ref T3718. There are a couple of things going on here:
**PhabricatorCustomFieldList**: I added `PhabricatorCustomFieldList`, which is just a convenience class for dealing with lists of fields. Often, current field code does something like this inline in a Controller:
foreach ($fields as $field) {
// do some junk
}
Often, that junk has some slightly subtle implications. Move all of it to `$list->doSomeJunk()` methods (like `appendFieldsToForm()`, `loadFieldsFromStorage()`) to reduce code duplication and prevent errors. This additionally moves an existing list-convenience method there, out of `PhabricatorPropertyListView`.
**PhabricatorUserConfiguredCustomFieldStorage**: Adds `PhabricatorUserConfiguredCustomFieldStorage` for storing custom field data (like "ICQ Handle", "Phone Number", "Desk", "Favorite Flower", etc).
**Configuration-Driven Custom Fields**: Previously, I was thinking about doing these with interfaces, but as I thought about it more I started to dislike that approach. Instead, I built proxies into `PhabricatorCustomField`. Basically, this means that fields (like a custom, configuration-driven "Favorite Flower" field) can just use some other Field to actually provide their implementation (like a "standard" field which knows how to render text areas). The previous approach would have involed subclasssing the "standard" field and implementing an interface, but that would mean that every application would have at least two "base" fields and generally just seemed bleh as I worked through it.
The cost of this approach is that we need a bunch of `proxy` junk in the base class, but that's a one-time cost and I think it simplifies all the implementations and makes them a lot less magical (e.g., all of the custom fields now extend the right base field classes).
**Fixed Some Bugs**: Some of this code hadn't really been run yet and had minor bugs.
Test Plan:
{F54240}
{F54241}
{F54242}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1702, T1703, T3718
Differential Revision: https://secure.phabricator.com/D6749
2013-08-14 17:10:16 +02:00
|
|
|
'PhabricatorStandardCustomFieldInterface' => 'infrastructure/customfield/interface/PhabricatorStandardCustomFieldInterface.php',
|
2015-04-24 20:49:11 +02:00
|
|
|
'PhabricatorStandardCustomFieldLink' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldLink.php',
|
2013-09-17 01:04:46 +02:00
|
|
|
'PhabricatorStandardCustomFieldPHIDs' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldPHIDs.php',
|
2013-09-17 01:04:18 +02:00
|
|
|
'PhabricatorStandardCustomFieldRemarkup' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldRemarkup.php',
|
2013-09-17 01:04:08 +02:00
|
|
|
'PhabricatorStandardCustomFieldSelect' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldSelect.php',
|
2013-09-17 01:03:24 +02:00
|
|
|
'PhabricatorStandardCustomFieldText' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldText.php',
|
2015-09-21 13:41:52 +02:00
|
|
|
'PhabricatorStandardCustomFieldTokenizer' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldTokenizer.php',
|
2013-09-17 01:04:46 +02:00
|
|
|
'PhabricatorStandardCustomFieldUsers' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldUsers.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorStandardPageView' => 'view/page/PhabricatorStandardPageView.php',
|
2015-07-16 23:12:54 +02:00
|
|
|
'PhabricatorStandardSelectCustomFieldDatasource' => 'infrastructure/customfield/datasource/PhabricatorStandardSelectCustomFieldDatasource.php',
|
2016-03-03 13:34:47 +01:00
|
|
|
'PhabricatorStaticEditField' => 'applications/transactions/editfield/PhabricatorStaticEditField.php',
|
2014-03-14 19:53:17 +01:00
|
|
|
'PhabricatorStatusController' => 'applications/system/controller/PhabricatorStatusController.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorStatusUIExample' => 'applications/uiexample/examples/PhabricatorStatusUIExample.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorStorageFixtureScopeGuard' => 'infrastructure/testing/fixture/PhabricatorStorageFixtureScopeGuard.php',
|
2012-07-02 19:49:00 +02:00
|
|
|
'PhabricatorStorageManagementAPI' => 'infrastructure/storage/management/PhabricatorStorageManagementAPI.php',
|
2014-10-01 17:16:31 +02:00
|
|
|
'PhabricatorStorageManagementAdjustWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementAdjustWorkflow.php',
|
2012-07-02 19:49:00 +02:00
|
|
|
'PhabricatorStorageManagementDatabasesWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementDatabasesWorkflow.php',
|
|
|
|
'PhabricatorStorageManagementDestroyWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementDestroyWorkflow.php',
|
|
|
|
'PhabricatorStorageManagementDumpWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php',
|
2013-07-03 01:34:17 +02:00
|
|
|
'PhabricatorStorageManagementProbeWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementProbeWorkflow.php',
|
2014-10-01 17:22:37 +02:00
|
|
|
'PhabricatorStorageManagementQuickstartWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementQuickstartWorkflow.php',
|
Add a `storage renamespace` for mangling SQL dumpfiles into a new namespace
Summary:
Ref T7149. When users give us dumpfiles for import, they will almost inevitably use the `phabricator` namespace. They need to be renamed to use an instance namespace.
We can do this either by:
- importing the data first, then renaming; or
- renaming first, then importing.
This implements the second one, basically `storage renamespace --in dump.sql --from phabricator --to instancename > instance.sql`.
Renaming first is a little hackier since we have to `preg_match()` a SQL dump file, but I think it's better overall:
- With only one database, it lets you dump/import without downtime.
- If you have development stuff in a development environment in the `phabricator` namespace, you don't have to move it aside to do an import.
- No possibility that two people doing an import at the same time on the same box will collide with each other.
- You can do the rename once and then repeat the import process with the renamed dump more easily.
- No tricky stuff with modern Phabricator running against an old dump and the database names not matching up.
None of this is super important, but it just makes large dumps a bit easier to work with, and the dumpfile format is regular enough that this seems unlikely to ever really not work.
Test Plan: Renamespaced a dump, did a `diff -u`, saw all the relevant parts changed (and only those parts changed).
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12105
2015-03-18 02:29:01 +01:00
|
|
|
'PhabricatorStorageManagementRenamespaceWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementRenamespaceWorkflow.php',
|
2015-01-29 21:15:27 +01:00
|
|
|
'PhabricatorStorageManagementShellWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementShellWorkflow.php',
|
2012-07-02 19:49:00 +02:00
|
|
|
'PhabricatorStorageManagementStatusWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementStatusWorkflow.php',
|
|
|
|
'PhabricatorStorageManagementUpgradeWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementUpgradeWorkflow.php',
|
|
|
|
'PhabricatorStorageManagementWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementWorkflow.php',
|
|
|
|
'PhabricatorStoragePatch' => 'infrastructure/storage/management/PhabricatorStoragePatch.php',
|
2014-09-24 22:50:00 +02:00
|
|
|
'PhabricatorStorageSchemaSpec' => 'infrastructure/storage/schema/PhabricatorStorageSchemaSpec.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorStorageSetupCheck' => 'applications/config/check/PhabricatorStorageSetupCheck.php',
|
2015-05-18 00:20:11 +02:00
|
|
|
'PhabricatorStreamingProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorStreamingProtocolAdapter.php',
|
2015-12-27 15:45:53 +01:00
|
|
|
'PhabricatorStringListEditField' => 'applications/transactions/editfield/PhabricatorStringListEditField.php',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorSubscribableInterface' => 'applications/subscriptions/interface/PhabricatorSubscribableInterface.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorSubscribedToObjectEdgeType' => 'applications/transactions/edges/PhabricatorSubscribedToObjectEdgeType.php',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorSubscribersEditField' => 'applications/transactions/editfield/PhabricatorSubscribersEditField.php',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorSubscribersQuery' => 'applications/subscriptions/query/PhabricatorSubscribersQuery.php',
|
2015-01-16 00:57:45 +01:00
|
|
|
'PhabricatorSubscriptionTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorSubscriptionTriggerClock.php',
|
2015-07-18 17:07:31 +02:00
|
|
|
'PhabricatorSubscriptionsAddSelfHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsAddSelfHeraldAction.php',
|
|
|
|
'PhabricatorSubscriptionsAddSubscribersHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsAddSubscribersHeraldAction.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSubscriptionsApplication' => 'applications/subscriptions/application/PhabricatorSubscriptionsApplication.php',
|
2016-03-05 23:45:56 +01:00
|
|
|
'PhabricatorSubscriptionsCurtainExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsCurtainExtension.php',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorSubscriptionsEditController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsEditController.php',
|
2015-12-13 13:12:34 +01:00
|
|
|
'PhabricatorSubscriptionsEditEngineExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsEditEngineExtension.php',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorSubscriptionsEditor' => 'applications/subscriptions/editor/PhabricatorSubscriptionsEditor.php',
|
2015-12-21 15:31:31 +01:00
|
|
|
'PhabricatorSubscriptionsFulltextEngineExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsFulltextEngineExtension.php',
|
2015-07-18 17:07:31 +02:00
|
|
|
'PhabricatorSubscriptionsHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsHeraldAction.php',
|
2014-03-14 19:22:00 +01:00
|
|
|
'PhabricatorSubscriptionsListController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsListController.php',
|
2015-07-18 17:07:31 +02:00
|
|
|
'PhabricatorSubscriptionsRemoveSelfHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSelfHeraldAction.php',
|
|
|
|
'PhabricatorSubscriptionsRemoveSubscribersHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSubscribersHeraldAction.php',
|
Implement an "Attachments" behavior for Conduit Search APIs
Summary:
Ref T9964. We have various kinds of secondary data on objects (like subscribers, projects, paste content, Owners paths, file attachments, etc) which is somewhat slow, or somewhat large, or both.
Some approaches to handling this in the API include:
- Always return all of it (very easy, but slow).
- Require users to make separate API calls to get each piece of data (very simple, but inefficient and really cumbersome to use).
- Implement a hierarchical query language like GraphQL (powerful, but very complex).
- Kind of mix-and-match a half-power query language and some extra calls? (fairly simple, not too terrible?)
We currently mix-and-match internally, with `->needStuff(true)`. This is not a general-purpose, full-power graph query language like GraphQL, and it occasionally does limit us.
For example, there is no way to do this sort of thing:
$conpherence_thread_query = id(new ConpherenceThreadQuery())
->setViewer($viewer)
// ...
->setNeedMessages(true)
->setWhenYouLoadTheMessagesTheyNeedProfilePictures(true);
However, we almost never actually need to do this and when we do want to do it we usually don't //really// want to do it, so I don't think this is a major limit to the practical power of the system for the kinds of things we really want to do with it.
Put another way, we have a lot of 1-level hierarchical queries (get pictures or repositories or projects or files or content for these objects) but few-to-no 2+ level queries (get files for these objects, then get all the projects for those files).
So even though 1-level hierarchies are not a beautiful, general-purpose, fully-abstract system, they've worked well so far in practice and I'm comfortable moving forward with them in the API.
If we do need N-level queries in the future, there is no technical reason we can't put GraphQL (or something similar) on top of this eventually, and this would represent a solid step toward that. However, I suspect we'll never need them.
Upshot: I'm pretty happy with "->needX()" for all practical purposes, so this is just adding a way to say "->needX()" to the API.
Specifically, you say:
```
{
"attachments": {
"subscribers": true,
}
}
```
...and get back subscriber data. In the future (or for certain attachments), `true` might become a dictionary of extra parameters, if necessary, and could do so without breaking the API.
Test Plan:
- Ran queries to get attachments.
{F1025449}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9964
Differential Revision: https://secure.phabricator.com/D14772
2015-12-14 13:58:34 +01:00
|
|
|
'PhabricatorSubscriptionsSearchEngineAttachment' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsSearchEngineAttachment.php',
|
2015-12-13 13:12:34 +01:00
|
|
|
'PhabricatorSubscriptionsSearchEngineExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsSearchEngineExtension.php',
|
2015-04-01 18:45:18 +02:00
|
|
|
'PhabricatorSubscriptionsSubscribeEmailCommand' => 'applications/subscriptions/command/PhabricatorSubscriptionsSubscribeEmailCommand.php',
|
2015-06-14 00:45:17 +02:00
|
|
|
'PhabricatorSubscriptionsSubscribersPolicyRule' => 'applications/subscriptions/policyrule/PhabricatorSubscriptionsSubscribersPolicyRule.php',
|
2014-03-14 22:27:45 +01:00
|
|
|
'PhabricatorSubscriptionsTransactionController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsTransactionController.php',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorSubscriptionsUIEventListener' => 'applications/subscriptions/events/PhabricatorSubscriptionsUIEventListener.php',
|
2015-04-01 17:40:00 +02:00
|
|
|
'PhabricatorSubscriptionsUnsubscribeEmailCommand' => 'applications/subscriptions/command/PhabricatorSubscriptionsUnsubscribeEmailCommand.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSupportApplication' => 'applications/support/application/PhabricatorSupportApplication.php',
|
2012-07-02 19:44:37 +02:00
|
|
|
'PhabricatorSyntaxHighlighter' => 'infrastructure/markup/PhabricatorSyntaxHighlighter.php',
|
2013-01-10 18:56:36 +01:00
|
|
|
'PhabricatorSyntaxHighlightingConfigOptions' => 'applications/config/option/PhabricatorSyntaxHighlightingConfigOptions.php',
|
2016-05-05 03:24:59 +02:00
|
|
|
'PhabricatorSyntaxStyle' => 'infrastructure/syntax/PhabricatorSyntaxStyle.php',
|
2014-04-03 20:22:38 +02:00
|
|
|
'PhabricatorSystemAction' => 'applications/system/action/PhabricatorSystemAction.php',
|
|
|
|
'PhabricatorSystemActionEngine' => 'applications/system/engine/PhabricatorSystemActionEngine.php',
|
|
|
|
'PhabricatorSystemActionGarbageCollector' => 'applications/system/garbagecollector/PhabricatorSystemActionGarbageCollector.php',
|
|
|
|
'PhabricatorSystemActionLog' => 'applications/system/storage/PhabricatorSystemActionLog.php',
|
|
|
|
'PhabricatorSystemActionRateLimitException' => 'applications/system/exception/PhabricatorSystemActionRateLimitException.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSystemApplication' => 'applications/system/application/PhabricatorSystemApplication.php',
|
2014-04-03 20:22:38 +02:00
|
|
|
'PhabricatorSystemDAO' => 'applications/system/storage/PhabricatorSystemDAO.php',
|
2014-05-02 03:23:31 +02:00
|
|
|
'PhabricatorSystemDestructionGarbageCollector' => 'applications/system/garbagecollector/PhabricatorSystemDestructionGarbageCollector.php',
|
|
|
|
'PhabricatorSystemDestructionLog' => 'applications/system/storage/PhabricatorSystemDestructionLog.php',
|
2016-04-10 13:26:53 +02:00
|
|
|
'PhabricatorSystemReadOnlyController' => 'applications/system/controller/PhabricatorSystemReadOnlyController.php',
|
2014-05-02 03:23:31 +02:00
|
|
|
'PhabricatorSystemRemoveDestroyWorkflow' => 'applications/system/management/PhabricatorSystemRemoveDestroyWorkflow.php',
|
|
|
|
'PhabricatorSystemRemoveLogWorkflow' => 'applications/system/management/PhabricatorSystemRemoveLogWorkflow.php',
|
|
|
|
'PhabricatorSystemRemoveWorkflow' => 'applications/system/management/PhabricatorSystemRemoveWorkflow.php',
|
2014-06-20 20:49:41 +02:00
|
|
|
'PhabricatorSystemSelectEncodingController' => 'applications/system/controller/PhabricatorSystemSelectEncodingController.php',
|
|
|
|
'PhabricatorSystemSelectHighlightController' => 'applications/system/controller/PhabricatorSystemSelectHighlightController.php',
|
2015-01-06 12:56:03 +01:00
|
|
|
'PhabricatorTOTPAuthFactor' => 'applications/auth/factor/PhabricatorTOTPAuthFactor.php',
|
|
|
|
'PhabricatorTOTPAuthFactorTestCase' => 'applications/auth/factor/__tests__/PhabricatorTOTPAuthFactorTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorTaskmasterDaemon' => 'infrastructure/daemon/workers/PhabricatorTaskmasterDaemon.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorTestApplication' => 'applications/base/controller/__tests__/PhabricatorTestApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorTestCase' => 'infrastructure/testing/PhabricatorTestCase.php',
|
2013-10-04 04:05:47 +02:00
|
|
|
'PhabricatorTestController' => 'applications/base/controller/__tests__/PhabricatorTestController.php',
|
2013-04-15 04:09:20 +02:00
|
|
|
'PhabricatorTestDataGenerator' => 'applications/lipsum/generator/PhabricatorTestDataGenerator.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorTestNoCycleEdgeType' => 'applications/transactions/edges/PhabricatorTestNoCycleEdgeType.php',
|
2013-02-06 22:37:42 +01:00
|
|
|
'PhabricatorTestStorageEngine' => 'applications/files/engine/PhabricatorTestStorageEngine.php',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorTestWorker' => 'infrastructure/daemon/workers/__tests__/PhabricatorTestWorker.php',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorTextAreaEditField' => 'applications/transactions/editfield/PhabricatorTextAreaEditField.php',
|
|
|
|
'PhabricatorTextEditField' => 'applications/transactions/editfield/PhabricatorTextEditField.php',
|
2013-06-03 21:58:11 +02:00
|
|
|
'PhabricatorTime' => 'infrastructure/time/PhabricatorTime.php',
|
|
|
|
'PhabricatorTimeGuard' => 'infrastructure/time/PhabricatorTimeGuard.php',
|
|
|
|
'PhabricatorTimeTestCase' => 'infrastructure/time/__tests__/PhabricatorTimeTestCase.php',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorTimezoneSetupCheck' => 'applications/config/check/PhabricatorTimezoneSetupCheck.php',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorToken' => 'applications/tokens/storage/PhabricatorToken.php',
|
|
|
|
'PhabricatorTokenController' => 'applications/tokens/controller/PhabricatorTokenController.php',
|
|
|
|
'PhabricatorTokenCount' => 'applications/tokens/storage/PhabricatorTokenCount.php',
|
2013-03-04 20:47:58 +01:00
|
|
|
'PhabricatorTokenCountQuery' => 'applications/tokens/query/PhabricatorTokenCountQuery.php',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenDAO' => 'applications/tokens/storage/PhabricatorTokenDAO.php',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorTokenDestructionEngineExtension' => 'applications/tokens/engineextension/PhabricatorTokenDestructionEngineExtension.php',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenGiveController' => 'applications/tokens/controller/PhabricatorTokenGiveController.php',
|
|
|
|
'PhabricatorTokenGiven' => 'applications/tokens/storage/PhabricatorTokenGiven.php',
|
|
|
|
'PhabricatorTokenGivenController' => 'applications/tokens/controller/PhabricatorTokenGivenController.php',
|
|
|
|
'PhabricatorTokenGivenEditor' => 'applications/tokens/editor/PhabricatorTokenGivenEditor.php',
|
2013-02-19 02:44:45 +01:00
|
|
|
'PhabricatorTokenGivenFeedStory' => 'applications/tokens/feed/PhabricatorTokenGivenFeedStory.php',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenGivenQuery' => 'applications/tokens/query/PhabricatorTokenGivenQuery.php',
|
2013-03-22 00:04:29 +01:00
|
|
|
'PhabricatorTokenLeaderController' => 'applications/tokens/controller/PhabricatorTokenLeaderController.php',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenQuery' => 'applications/tokens/query/PhabricatorTokenQuery.php',
|
|
|
|
'PhabricatorTokenReceiverInterface' => 'applications/tokens/interface/PhabricatorTokenReceiverInterface.php',
|
2013-03-22 00:04:29 +01:00
|
|
|
'PhabricatorTokenReceiverQuery' => 'applications/tokens/query/PhabricatorTokenReceiverQuery.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorTokenTokenPHIDType' => 'applications/tokens/phid/PhabricatorTokenTokenPHIDType.php',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenUIEventListener' => 'applications/tokens/event/PhabricatorTokenUIEventListener.php',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorTokenizerEditField' => 'applications/transactions/editfield/PhabricatorTokenizerEditField.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorTokensApplication' => 'applications/tokens/application/PhabricatorTokensApplication.php',
|
2016-03-05 23:45:56 +01:00
|
|
|
'PhabricatorTokensCurtainExtension' => 'applications/tokens/engineextension/PhabricatorTokensCurtainExtension.php',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorTokensSettingsPanel' => 'applications/settings/panel/PhabricatorTokensSettingsPanel.php',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorTooltipUIExample' => 'applications/uiexample/examples/PhabricatorTooltipUIExample.php',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorTransactions' => 'applications/transactions/constants/PhabricatorTransactions.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorTransactionsApplication' => 'applications/transactions/application/PhabricatorTransactionsApplication.php',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorTransactionsDestructionEngineExtension' => 'applications/transactions/engineextension/PhabricatorTransactionsDestructionEngineExtension.php',
|
2015-12-21 16:08:17 +01:00
|
|
|
'PhabricatorTransactionsFulltextEngineExtension' => 'applications/transactions/engineextension/PhabricatorTransactionsFulltextEngineExtension.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorTransformedFile' => 'applications/files/storage/PhabricatorTransformedFile.php',
|
2013-01-05 01:22:52 +01:00
|
|
|
'PhabricatorTranslationsConfigOptions' => 'applications/config/option/PhabricatorTranslationsConfigOptions.php',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorTriggerAction' => 'infrastructure/daemon/workers/action/PhabricatorTriggerAction.php',
|
2015-01-16 00:57:45 +01:00
|
|
|
'PhabricatorTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorTriggerClock.php',
|
|
|
|
'PhabricatorTriggerClockTestCase' => 'infrastructure/daemon/workers/clock/__tests__/PhabricatorTriggerClockTestCase.php',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorTriggerDaemon' => 'infrastructure/daemon/workers/PhabricatorTriggerDaemon.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorTrivialTestCase' => 'infrastructure/testing/__tests__/PhabricatorTrivialTestCase.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorTwitchAuthProvider' => 'applications/auth/provider/PhabricatorTwitchAuthProvider.php',
|
|
|
|
'PhabricatorTwitterAuthProvider' => 'applications/auth/provider/PhabricatorTwitterAuthProvider.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorTypeaheadApplication' => 'applications/typeahead/application/PhabricatorTypeaheadApplication.php',
|
2014-02-14 19:23:25 +01:00
|
|
|
'PhabricatorTypeaheadCompositeDatasource' => 'applications/typeahead/datasource/PhabricatorTypeaheadCompositeDatasource.php',
|
|
|
|
'PhabricatorTypeaheadDatasource' => 'applications/typeahead/datasource/PhabricatorTypeaheadDatasource.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorTypeaheadDatasourceController' => 'applications/typeahead/controller/PhabricatorTypeaheadDatasourceController.php',
|
2015-04-20 22:43:07 +02:00
|
|
|
'PhabricatorTypeaheadFunctionHelpController' => 'applications/typeahead/controller/PhabricatorTypeaheadFunctionHelpController.php',
|
2015-04-17 00:30:41 +02:00
|
|
|
'PhabricatorTypeaheadInvalidTokenException' => 'applications/typeahead/exception/PhabricatorTypeaheadInvalidTokenException.php',
|
2014-02-14 19:23:25 +01:00
|
|
|
'PhabricatorTypeaheadModularDatasourceController' => 'applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php',
|
|
|
|
'PhabricatorTypeaheadMonogramDatasource' => 'applications/typeahead/datasource/PhabricatorTypeaheadMonogramDatasource.php',
|
2012-08-01 21:36:19 +02:00
|
|
|
'PhabricatorTypeaheadResult' => 'applications/typeahead/storage/PhabricatorTypeaheadResult.php',
|
2014-02-14 19:23:25 +01:00
|
|
|
'PhabricatorTypeaheadRuntimeCompositeDatasource' => 'applications/typeahead/datasource/PhabricatorTypeaheadRuntimeCompositeDatasource.php',
|
2015-04-15 18:16:26 +02:00
|
|
|
'PhabricatorTypeaheadTokenView' => 'applications/typeahead/view/PhabricatorTypeaheadTokenView.php',
|
2013-12-07 19:46:09 +01:00
|
|
|
'PhabricatorUIConfigOptions' => 'applications/config/option/PhabricatorUIConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUIExample' => 'applications/uiexample/examples/PhabricatorUIExample.php',
|
|
|
|
'PhabricatorUIExampleRenderController' => 'applications/uiexample/controller/PhabricatorUIExampleRenderController.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorUIExamplesApplication' => 'applications/uiexample/application/PhabricatorUIExamplesApplication.php',
|
2015-02-11 22:02:35 +01:00
|
|
|
'PhabricatorUSEnglishTranslation' => 'infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorUnitTestContentSource' => 'infrastructure/contentsource/PhabricatorUnitTestContentSource.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUnitsTestCase' => 'view/__tests__/PhabricatorUnitsTestCase.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorUnknownContentSource' => 'infrastructure/contentsource/PhabricatorUnknownContentSource.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorUnsubscribedFromObjectEdgeType' => 'applications/transactions/edges/PhabricatorUnsubscribedFromObjectEdgeType.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUser' => 'applications/people/storage/PhabricatorUser.php',
|
2013-06-07 19:22:45 +02:00
|
|
|
'PhabricatorUserBlurbField' => 'applications/people/customfield/PhabricatorUserBlurbField.php',
|
2016-02-11 23:55:44 +01:00
|
|
|
'PhabricatorUserCardView' => 'applications/people/view/PhabricatorUserCardView.php',
|
2013-06-07 19:22:45 +02:00
|
|
|
'PhabricatorUserConfigOptions' => 'applications/people/config/PhabricatorUserConfigOptions.php',
|
Support configuration-driven custom fields
Summary:
Ref T1702. Ref T3718. There are a couple of things going on here:
**PhabricatorCustomFieldList**: I added `PhabricatorCustomFieldList`, which is just a convenience class for dealing with lists of fields. Often, current field code does something like this inline in a Controller:
foreach ($fields as $field) {
// do some junk
}
Often, that junk has some slightly subtle implications. Move all of it to `$list->doSomeJunk()` methods (like `appendFieldsToForm()`, `loadFieldsFromStorage()`) to reduce code duplication and prevent errors. This additionally moves an existing list-convenience method there, out of `PhabricatorPropertyListView`.
**PhabricatorUserConfiguredCustomFieldStorage**: Adds `PhabricatorUserConfiguredCustomFieldStorage` for storing custom field data (like "ICQ Handle", "Phone Number", "Desk", "Favorite Flower", etc).
**Configuration-Driven Custom Fields**: Previously, I was thinking about doing these with interfaces, but as I thought about it more I started to dislike that approach. Instead, I built proxies into `PhabricatorCustomField`. Basically, this means that fields (like a custom, configuration-driven "Favorite Flower" field) can just use some other Field to actually provide their implementation (like a "standard" field which knows how to render text areas). The previous approach would have involed subclasssing the "standard" field and implementing an interface, but that would mean that every application would have at least two "base" fields and generally just seemed bleh as I worked through it.
The cost of this approach is that we need a bunch of `proxy` junk in the base class, but that's a one-time cost and I think it simplifies all the implementations and makes them a lot less magical (e.g., all of the custom fields now extend the right base field classes).
**Fixed Some Bugs**: Some of this code hadn't really been run yet and had minor bugs.
Test Plan:
{F54240}
{F54241}
{F54242}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1702, T1703, T3718
Differential Revision: https://secure.phabricator.com/D6749
2013-08-14 17:10:16 +02:00
|
|
|
'PhabricatorUserConfiguredCustomField' => 'applications/people/customfield/PhabricatorUserConfiguredCustomField.php',
|
|
|
|
'PhabricatorUserConfiguredCustomFieldStorage' => 'applications/people/storage/PhabricatorUserConfiguredCustomFieldStorage.php',
|
2013-06-07 18:55:55 +02:00
|
|
|
'PhabricatorUserCustomField' => 'applications/people/customfield/PhabricatorUserCustomField.php',
|
Integrate ApplicationSearch with CustomField
Summary:
Ref T2625. Ref T3794. Ref T418. Ref T1703.
This is a more general version of D5278. It expands CustomField support to include real integration with ApplicationSearch.
Broadly, custom fields may elect to:
- build indicies when objects are updated;
- populate ApplicationSearch forms with new controls;
- read inputs entered into those controls out of the request; and
- apply constraints to search queries.
Some utility/helper stuff is provided to make this easier. This part could be cleaner, but seems reasonable for a first cut. In particular, the Query and SearchEngine must manually call all the hooks right now instead of everything happening magically. I think that's fine for the moment; they're pretty easy to get right.
Test Plan:
I added a new searchable "Company" field to People:
{F58229}
This also cleaned up the disable/reorder view a little bit:
{F58230}
As it did before, this field appears on the edit screen:
{F58231}
However, because it has `search`, it also appears on the search screen:
{F58232}
When queried, it returns the expected results:
{F58233}
And the actually good bit of all this is that the query can take advantage of indexes:
mysql> explain SELECT * FROM `user` user JOIN `user_customfieldstringindex` `appsearch_0` ON `appsearch_0`.objectPHID = user.phid AND `appsearch_0`.indexKey = 'mk3Ndy476ge6' AND `appsearch_0`.indexValue IN ('phacility') ORDER BY user.id DESC LIMIT 101;
+----+-------------+-------------+--------+-------------------+----------+---------+------------------------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+--------+-------------------+----------+---------+------------------------------------------+------+----------------------------------------------+
| 1 | SIMPLE | appsearch_0 | ref | key_join,key_find | key_find | 232 | const,const | 1 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | user | eq_ref | phid | phid | 194 | phabricator2_user.appsearch_0.objectPHID | 1 | |
+----+-------------+-------------+--------+-------------------+----------+---------+------------------------------------------+------+----------------------------------------------+
2 rows in set (0.00 sec)
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T418, T1703, T2625, T3794
Differential Revision: https://secure.phabricator.com/D6992
2013-09-16 22:44:34 +02:00
|
|
|
'PhabricatorUserCustomFieldNumericIndex' => 'applications/people/storage/PhabricatorUserCustomFieldNumericIndex.php',
|
|
|
|
'PhabricatorUserCustomFieldStringIndex' => 'applications/people/storage/PhabricatorUserCustomFieldStringIndex.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUserDAO' => 'applications/people/storage/PhabricatorUserDAO.php',
|
2013-06-06 23:53:07 +02:00
|
|
|
'PhabricatorUserEditor' => 'applications/people/editor/PhabricatorUserEditor.php',
|
2014-02-23 19:19:35 +01:00
|
|
|
'PhabricatorUserEditorTestCase' => 'applications/people/editor/__tests__/PhabricatorUserEditorTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUserEmail' => 'applications/people/storage/PhabricatorUserEmail.php',
|
2014-02-24 02:31:46 +01:00
|
|
|
'PhabricatorUserEmailTestCase' => 'applications/people/storage/__tests__/PhabricatorUserEmailTestCase.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorUserFulltextEngine' => 'applications/people/search/PhabricatorUserFulltextEngine.php',
|
2016-01-24 14:43:57 +01:00
|
|
|
'PhabricatorUserIconField' => 'applications/people/customfield/PhabricatorUserIconField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUserLog' => 'applications/people/storage/PhabricatorUserLog.php',
|
2014-04-28 02:32:09 +02:00
|
|
|
'PhabricatorUserLogView' => 'applications/people/view/PhabricatorUserLogView.php',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorUserPHIDResolver' => 'applications/phid/resolver/PhabricatorUserPHIDResolver.php',
|
2012-08-13 21:37:18 +02:00
|
|
|
'PhabricatorUserPreferences' => 'applications/settings/storage/PhabricatorUserPreferences.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUserProfile' => 'applications/people/storage/PhabricatorUserProfile.php',
|
2013-06-07 18:55:55 +02:00
|
|
|
'PhabricatorUserProfileEditor' => 'applications/people/editor/PhabricatorUserProfileEditor.php',
|
|
|
|
'PhabricatorUserRealNameField' => 'applications/people/customfield/PhabricatorUserRealNameField.php',
|
2013-07-10 21:34:09 +02:00
|
|
|
'PhabricatorUserRolesField' => 'applications/people/customfield/PhabricatorUserRolesField.php',
|
Generate expected schemata for User/People tables
Summary:
Ref T1191. Some notes here:
- Drops the old LDAP and OAuth info tables. These were migrated to the ExternalAccount table a very long time ago.
- Separates surplus/missing keys from other types of surplus/missing things. In the long run, my plan is to have only two notice levels:
- Error: something we can't fix (missing database, table, or column; overlong key).
- Warning: something we can fix (surplus anything, missing key, bad column type, bad key columns, bad uniqueness, bad collation or charset).
- For now, retaining three levels is helpful in generating all the expected scheamta.
Test Plan:
- Saw ~200 issues resolve, leaving ~1,300.
- Grepped for removed tables.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T1191
Differential Revision: https://secure.phabricator.com/D10580
2014-10-01 16:36:47 +02:00
|
|
|
'PhabricatorUserSchemaSpec' => 'applications/people/storage/PhabricatorUserSchemaSpec.php',
|
2013-07-10 14:09:59 +02:00
|
|
|
'PhabricatorUserSinceField' => 'applications/people/customfield/PhabricatorUserSinceField.php',
|
2013-07-10 21:34:09 +02:00
|
|
|
'PhabricatorUserStatusField' => 'applications/people/customfield/PhabricatorUserStatusField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUserTestCase' => 'applications/people/storage/__tests__/PhabricatorUserTestCase.php',
|
2013-06-07 19:22:45 +02:00
|
|
|
'PhabricatorUserTitleField' => 'applications/people/customfield/PhabricatorUserTitleField.php',
|
2013-06-06 23:53:07 +02:00
|
|
|
'PhabricatorUserTransaction' => 'applications/people/storage/PhabricatorUserTransaction.php',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorUsersEditField' => 'applications/transactions/editfield/PhabricatorUsersEditField.php',
|
2015-11-16 20:26:13 +01:00
|
|
|
'PhabricatorUsersPolicyRule' => 'applications/people/policyrule/PhabricatorUsersPolicyRule.php',
|
2015-07-07 14:53:13 +02:00
|
|
|
'PhabricatorUsersSearchField' => 'applications/people/searchfield/PhabricatorUsersSearchField.php',
|
Accept and route VCS HTTP requests
Summary:
Mostly ripped from D7391, with some changes:
- Serve repositories at `/diffusion/X/`, with no special `/git/` or `/serve/` URI component.
- This requires a little bit of magic, but I got the magic working for Git, Mercurial and SVN, and it seems reasonable.
- I think having one URI for everything will make it easier for users to understand.
- One downside is that git will clone into `X` by default, but I think that's not a big deal, and we can work around that in the future easily enough.
- Accept HTTP requests for Git, SVN and Mercurial repositories.
- Auth logic is a little different in order to be more consistent with how other things work.
- Instead of AphrontBasicAuthResponse, added "VCSResponse". Mercurial can print strings we send it on the CLI if we're careful, so support that. I did a fair amount of digging and didn't have any luck with git or svn.
- Commands we don't know about are assumed to require "Push" capability by default.
No actual VCS data going over the wire yet.
Test Plan:
Ran a bunch of stuff like this:
$ hg clone http://local.aphront.com:8080/diffusion/P/
abort: HTTP Error 403: This repository is not available over HTTP.
...and got pretty reasonable-seeming errors in all cases. All this can do is produce errors for now.
Reviewers: hach-que, btrahan
Reviewed By: hach-que
CC: aran
Maniphest Tasks: T2230
Differential Revision: https://secure.phabricator.com/D7417
2013-10-26 16:56:17 +02:00
|
|
|
'PhabricatorVCSResponse' => 'applications/repository/response/PhabricatorVCSResponse.php',
|
2015-12-02 21:25:24 +01:00
|
|
|
'PhabricatorVersionedDraft' => 'applications/draft/storage/PhabricatorVersionedDraft.php',
|
2015-02-11 22:02:35 +01:00
|
|
|
'PhabricatorVeryWowEnglishTranslation' => 'infrastructure/internationalization/translation/PhabricatorVeryWowEnglishTranslation.php',
|
2015-04-17 00:30:41 +02:00
|
|
|
'PhabricatorViewerDatasource' => 'applications/people/typeahead/PhabricatorViewerDatasource.php',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorWatcherHasObjectEdgeType' => 'applications/transactions/edges/PhabricatorWatcherHasObjectEdgeType.php',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorWebContentSource' => 'infrastructure/contentsource/PhabricatorWebContentSource.php',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorWordPressAuthProvider' => 'applications/auth/provider/PhabricatorWordPressAuthProvider.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorWorker' => 'infrastructure/daemon/workers/PhabricatorWorker.php',
|
2012-10-31 23:22:16 +01:00
|
|
|
'PhabricatorWorkerActiveTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerActiveTask.php',
|
|
|
|
'PhabricatorWorkerArchiveTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerArchiveTask.php',
|
2014-12-24 00:45:42 +01:00
|
|
|
'PhabricatorWorkerArchiveTaskQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerArchiveTaskQuery.php',
|
2015-06-23 22:36:16 +02:00
|
|
|
'PhabricatorWorkerBulkJob' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerBulkJob.php',
|
|
|
|
'PhabricatorWorkerBulkJobCreateWorker' => 'infrastructure/daemon/workers/bulk/PhabricatorWorkerBulkJobCreateWorker.php',
|
|
|
|
'PhabricatorWorkerBulkJobEditor' => 'infrastructure/daemon/workers/editor/PhabricatorWorkerBulkJobEditor.php',
|
|
|
|
'PhabricatorWorkerBulkJobPHIDType' => 'infrastructure/daemon/workers/phid/PhabricatorWorkerBulkJobPHIDType.php',
|
|
|
|
'PhabricatorWorkerBulkJobQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerBulkJobQuery.php',
|
|
|
|
'PhabricatorWorkerBulkJobSearchEngine' => 'infrastructure/daemon/workers/query/PhabricatorWorkerBulkJobSearchEngine.php',
|
|
|
|
'PhabricatorWorkerBulkJobTaskWorker' => 'infrastructure/daemon/workers/bulk/PhabricatorWorkerBulkJobTaskWorker.php',
|
|
|
|
'PhabricatorWorkerBulkJobTestCase' => 'infrastructure/daemon/workers/__tests__/PhabricatorWorkerBulkJobTestCase.php',
|
|
|
|
'PhabricatorWorkerBulkJobTransaction' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerBulkJobTransaction.php',
|
|
|
|
'PhabricatorWorkerBulkJobTransactionQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerBulkJobTransactionQuery.php',
|
|
|
|
'PhabricatorWorkerBulkJobType' => 'infrastructure/daemon/workers/bulk/PhabricatorWorkerBulkJobType.php',
|
|
|
|
'PhabricatorWorkerBulkJobWorker' => 'infrastructure/daemon/workers/bulk/PhabricatorWorkerBulkJobWorker.php',
|
|
|
|
'PhabricatorWorkerBulkTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerBulkTask.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorWorkerDAO' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerDAO.php',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorWorkerDestructionEngineExtension' => 'infrastructure/daemon/workers/engineextension/PhabricatorWorkerDestructionEngineExtension.php',
|
2012-11-01 19:30:16 +01:00
|
|
|
'PhabricatorWorkerLeaseQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerLeaseQuery.php',
|
2014-12-06 18:14:16 +01:00
|
|
|
'PhabricatorWorkerManagementCancelWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementCancelWorkflow.php',
|
2015-02-11 15:06:09 +01:00
|
|
|
'PhabricatorWorkerManagementExecuteWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementExecuteWorkflow.php',
|
2014-11-24 20:10:15 +01:00
|
|
|
'PhabricatorWorkerManagementFloodWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementFloodWorkflow.php',
|
2014-12-06 18:14:16 +01:00
|
|
|
'PhabricatorWorkerManagementFreeWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementFreeWorkflow.php',
|
|
|
|
'PhabricatorWorkerManagementRetryWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php',
|
2014-11-24 20:10:15 +01:00
|
|
|
'PhabricatorWorkerManagementWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementWorkflow.php',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorWorkerPermanentFailureException' => 'infrastructure/daemon/workers/exception/PhabricatorWorkerPermanentFailureException.php',
|
2015-06-23 22:36:16 +02:00
|
|
|
'PhabricatorWorkerSchemaSpec' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerSchemaSpec.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorWorkerTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTask.php',
|
|
|
|
'PhabricatorWorkerTaskData' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTaskData.php',
|
|
|
|
'PhabricatorWorkerTaskDetailController' => 'applications/daemon/controller/PhabricatorWorkerTaskDetailController.php',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorWorkerTestCase' => 'infrastructure/daemon/workers/__tests__/PhabricatorWorkerTestCase.php',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorWorkerTrigger' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTrigger.php',
|
|
|
|
'PhabricatorWorkerTriggerEvent' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTriggerEvent.php',
|
2015-01-20 20:31:32 +01:00
|
|
|
'PhabricatorWorkerTriggerManagementFireWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerTriggerManagementFireWorkflow.php',
|
|
|
|
'PhabricatorWorkerTriggerManagementWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerTriggerManagementWorkflow.php',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorWorkerTriggerPHIDType' => 'infrastructure/daemon/workers/phid/PhabricatorWorkerTriggerPHIDType.php',
|
|
|
|
'PhabricatorWorkerTriggerQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerTriggerQuery.php',
|
2014-04-16 22:02:12 +02:00
|
|
|
'PhabricatorWorkerYieldException' => 'infrastructure/daemon/workers/exception/PhabricatorWorkerYieldException.php',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorWorkingCopyDiscoveryTestCase' => 'applications/repository/engine/__tests__/PhabricatorWorkingCopyDiscoveryTestCase.php',
|
2013-05-13 04:05:52 +02:00
|
|
|
'PhabricatorWorkingCopyPullTestCase' => 'applications/repository/engine/__tests__/PhabricatorWorkingCopyPullTestCase.php',
|
|
|
|
'PhabricatorWorkingCopyTestCase' => 'applications/repository/engine/__tests__/PhabricatorWorkingCopyTestCase.php',
|
2015-11-14 11:41:27 +01:00
|
|
|
'PhabricatorXHPASTDAO' => 'applications/phpast/storage/PhabricatorXHPASTDAO.php',
|
|
|
|
'PhabricatorXHPASTParseTree' => 'applications/phpast/storage/PhabricatorXHPASTParseTree.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'PhabricatorXHPASTViewController' => 'applications/phpast/controller/PhabricatorXHPASTViewController.php',
|
|
|
|
'PhabricatorXHPASTViewFrameController' => 'applications/phpast/controller/PhabricatorXHPASTViewFrameController.php',
|
|
|
|
'PhabricatorXHPASTViewFramesetController' => 'applications/phpast/controller/PhabricatorXHPASTViewFramesetController.php',
|
|
|
|
'PhabricatorXHPASTViewInputController' => 'applications/phpast/controller/PhabricatorXHPASTViewInputController.php',
|
|
|
|
'PhabricatorXHPASTViewPanelController' => 'applications/phpast/controller/PhabricatorXHPASTViewPanelController.php',
|
|
|
|
'PhabricatorXHPASTViewRunController' => 'applications/phpast/controller/PhabricatorXHPASTViewRunController.php',
|
|
|
|
'PhabricatorXHPASTViewStreamController' => 'applications/phpast/controller/PhabricatorXHPASTViewStreamController.php',
|
|
|
|
'PhabricatorXHPASTViewTreeController' => 'applications/phpast/controller/PhabricatorXHPASTViewTreeController.php',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorXHProfApplication' => 'applications/xhprof/application/PhabricatorXHProfApplication.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorXHProfController' => 'applications/xhprof/controller/PhabricatorXHProfController.php',
|
2012-08-25 00:14:38 +02:00
|
|
|
'PhabricatorXHProfDAO' => 'applications/xhprof/storage/PhabricatorXHProfDAO.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorXHProfProfileController' => 'applications/xhprof/controller/PhabricatorXHProfProfileController.php',
|
|
|
|
'PhabricatorXHProfProfileSymbolView' => 'applications/xhprof/view/PhabricatorXHProfProfileSymbolView.php',
|
|
|
|
'PhabricatorXHProfProfileTopLevelView' => 'applications/xhprof/view/PhabricatorXHProfProfileTopLevelView.php',
|
|
|
|
'PhabricatorXHProfProfileView' => 'applications/xhprof/view/PhabricatorXHProfProfileView.php',
|
2012-08-25 00:14:38 +02:00
|
|
|
'PhabricatorXHProfSample' => 'applications/xhprof/storage/PhabricatorXHProfSample.php',
|
|
|
|
'PhabricatorXHProfSampleListController' => 'applications/xhprof/controller/PhabricatorXHProfSampleListController.php',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorYoutubeRemarkupRule' => 'infrastructure/markup/rule/PhabricatorYoutubeRemarkupRule.php',
|
2012-07-19 18:03:10 +02:00
|
|
|
'PhameBlog' => 'applications/phame/storage/PhameBlog.php',
|
2015-11-21 17:51:07 +01:00
|
|
|
'PhameBlogArchiveController' => 'applications/phame/controller/blog/PhameBlogArchiveController.php',
|
2015-11-05 23:53:24 +01:00
|
|
|
'PhameBlogController' => 'applications/phame/controller/blog/PhameBlogController.php',
|
2015-11-07 20:57:34 +01:00
|
|
|
'PhameBlogCreateCapability' => 'applications/phame/capability/PhameBlogCreateCapability.php',
|
2015-12-28 12:57:03 +01:00
|
|
|
'PhameBlogEditConduitAPIMethod' => 'applications/phame/conduit/PhameBlogEditConduitAPIMethod.php',
|
2012-07-19 18:03:10 +02:00
|
|
|
'PhameBlogEditController' => 'applications/phame/controller/blog/PhameBlogEditController.php',
|
2015-12-16 20:56:41 +01:00
|
|
|
'PhameBlogEditEngine' => 'applications/phame/editor/PhameBlogEditEngine.php',
|
2015-05-15 02:05:58 +02:00
|
|
|
'PhameBlogEditor' => 'applications/phame/editor/PhameBlogEditor.php',
|
2013-01-09 04:53:34 +01:00
|
|
|
'PhameBlogFeedController' => 'applications/phame/controller/blog/PhameBlogFeedController.php',
|
2012-10-15 23:50:12 +02:00
|
|
|
'PhameBlogListController' => 'applications/phame/controller/blog/PhameBlogListController.php',
|
2015-12-12 02:23:09 +01:00
|
|
|
'PhameBlogListView' => 'applications/phame/view/PhameBlogListView.php',
|
2015-11-30 17:47:46 +01:00
|
|
|
'PhameBlogManageController' => 'applications/phame/controller/blog/PhameBlogManageController.php',
|
2015-11-28 21:42:36 +01:00
|
|
|
'PhameBlogProfilePictureController' => 'applications/phame/controller/blog/PhameBlogProfilePictureController.php',
|
2012-07-19 18:03:10 +02:00
|
|
|
'PhameBlogQuery' => 'applications/phame/query/PhameBlogQuery.php',
|
2015-11-08 16:50:01 +01:00
|
|
|
'PhameBlogReplyHandler' => 'applications/phame/mail/PhameBlogReplyHandler.php',
|
2015-12-28 12:58:43 +01:00
|
|
|
'PhameBlogSearchConduitAPIMethod' => 'applications/phame/conduit/PhameBlogSearchConduitAPIMethod.php',
|
2015-07-22 22:31:47 +02:00
|
|
|
'PhameBlogSearchEngine' => 'applications/phame/query/PhameBlogSearchEngine.php',
|
2015-06-29 23:04:48 +02:00
|
|
|
'PhameBlogSite' => 'applications/phame/site/PhameBlogSite.php',
|
2015-05-15 02:05:58 +02:00
|
|
|
'PhameBlogTransaction' => 'applications/phame/storage/PhameBlogTransaction.php',
|
2015-11-08 16:50:01 +01:00
|
|
|
'PhameBlogTransactionQuery' => 'applications/phame/query/PhameBlogTransactionQuery.php',
|
2012-07-19 18:03:10 +02:00
|
|
|
'PhameBlogViewController' => 'applications/phame/controller/blog/PhameBlogViewController.php',
|
2015-11-07 15:52:42 +01:00
|
|
|
'PhameConstants' => 'applications/phame/constants/PhameConstants.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhameController' => 'applications/phame/controller/PhameController.php',
|
|
|
|
'PhameDAO' => 'applications/phame/storage/PhameDAO.php',
|
2015-12-03 23:28:44 +01:00
|
|
|
'PhameDescriptionView' => 'applications/phame/view/PhameDescriptionView.php',
|
2015-12-12 22:19:21 +01:00
|
|
|
'PhameDraftListView' => 'applications/phame/view/PhameDraftListView.php',
|
2015-12-01 01:25:59 +01:00
|
|
|
'PhameHomeController' => 'applications/phame/controller/PhameHomeController.php',
|
Remove skins from Phame
Summary:
Ref T9897. Purge a bunch of stuff:
- Remove skins.
- Remove all custom sites for skin resources.
- Remove "framed", "notlive", "preview", separate "live" controllers (see below).
- Merge "publish" and "unpublish" controllers into one.
New behavior:
- Blogs and posts have three views:
- "View": Internal view URI, which is a normal detail page.
- "Internal Live": Internal view URI which is a little prettier.
- "External Live": External view URI for an external domain.
Right now, the differences are pretty minor (basically, different crumbs/chrome). This mostly gives us room to put some milder flavor of skins back later (photography or more "presentation" elements, for example).
This removes 9 million lines of code so I probably missed a couple of things, but I think it's like 95% of the way there.
Test Plan:
Here are some examples of what the "view", "internal" and "external" views look like for blogs (posts are similar):
"View": Unchanged
{F1021634}
"Internal": No chrome or footer. Still write actions (edit, post commments). Has crumbs to get back into Phame.
{F1021635}
"External": No chrome or footer. No write actions. No Phabricator crumbs. No policy/status information.
{F1021638}
I figure we'll probably tweak these a bit to figure out what makes sense (like: maybe no actions on "internal, live"? and "external, live" probably needs a way to set a root "Company >" crumb?) but that they're reasonable-ish as a first cut?
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9897
Differential Revision: https://secure.phabricator.com/D14740
2015-12-11 16:07:45 +01:00
|
|
|
'PhameLiveController' => 'applications/phame/controller/PhameLiveController.php',
|
2015-12-31 22:08:33 +01:00
|
|
|
'PhameNextPostView' => 'applications/phame/view/PhameNextPostView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhamePost' => 'applications/phame/storage/PhamePost.php',
|
2015-11-10 06:20:35 +01:00
|
|
|
'PhamePostCommentController' => 'applications/phame/controller/post/PhamePostCommentController.php',
|
2015-11-05 23:53:24 +01:00
|
|
|
'PhamePostController' => 'applications/phame/controller/post/PhamePostController.php',
|
2015-12-28 14:46:22 +01:00
|
|
|
'PhamePostEditConduitAPIMethod' => 'applications/phame/conduit/PhamePostEditConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhamePostEditController' => 'applications/phame/controller/post/PhamePostEditController.php',
|
2015-12-28 02:38:25 +01:00
|
|
|
'PhamePostEditEngine' => 'applications/phame/editor/PhamePostEditEngine.php',
|
2015-05-15 22:07:45 +02:00
|
|
|
'PhamePostEditor' => 'applications/phame/editor/PhamePostEditor.php',
|
2015-12-04 00:27:01 +01:00
|
|
|
'PhamePostHistoryController' => 'applications/phame/controller/post/PhamePostHistoryController.php',
|
2012-10-15 23:50:37 +02:00
|
|
|
'PhamePostListController' => 'applications/phame/controller/post/PhamePostListController.php',
|
2015-12-01 01:25:59 +01:00
|
|
|
'PhamePostListView' => 'applications/phame/view/PhamePostListView.php',
|
2015-11-10 18:41:05 +01:00
|
|
|
'PhamePostMailReceiver' => 'applications/phame/mail/PhamePostMailReceiver.php',
|
2015-12-07 23:12:05 +01:00
|
|
|
'PhamePostMoveController' => 'applications/phame/controller/post/PhamePostMoveController.php',
|
2012-10-15 23:50:45 +02:00
|
|
|
'PhamePostPublishController' => 'applications/phame/controller/post/PhamePostPublishController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhamePostQuery' => 'applications/phame/query/PhamePostQuery.php',
|
2015-11-07 02:40:13 +01:00
|
|
|
'PhamePostReplyHandler' => 'applications/phame/mail/PhamePostReplyHandler.php',
|
2015-12-28 13:25:01 +01:00
|
|
|
'PhamePostSearchConduitAPIMethod' => 'applications/phame/conduit/PhamePostSearchConduitAPIMethod.php',
|
2015-07-22 16:30:52 +02:00
|
|
|
'PhamePostSearchEngine' => 'applications/phame/query/PhamePostSearchEngine.php',
|
2015-05-15 22:07:45 +02:00
|
|
|
'PhamePostTransaction' => 'applications/phame/storage/PhamePostTransaction.php',
|
2015-11-10 06:20:35 +01:00
|
|
|
'PhamePostTransactionComment' => 'applications/phame/storage/PhamePostTransactionComment.php',
|
2015-05-15 22:07:45 +02:00
|
|
|
'PhamePostTransactionQuery' => 'applications/phame/query/PhamePostTransactionQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhamePostViewController' => 'applications/phame/controller/post/PhamePostViewController.php',
|
2014-09-24 22:50:57 +02:00
|
|
|
'PhameSchemaSpec' => 'applications/phame/storage/PhameSchemaSpec.php',
|
2015-06-29 23:04:48 +02:00
|
|
|
'PhameSite' => 'applications/phame/site/PhameSite.php',
|
2013-03-21 02:01:52 +01:00
|
|
|
'PhluxController' => 'applications/phlux/controller/PhluxController.php',
|
|
|
|
'PhluxDAO' => 'applications/phlux/storage/PhluxDAO.php',
|
|
|
|
'PhluxEditController' => 'applications/phlux/controller/PhluxEditController.php',
|
|
|
|
'PhluxListController' => 'applications/phlux/controller/PhluxListController.php',
|
|
|
|
'PhluxTransaction' => 'applications/phlux/storage/PhluxTransaction.php',
|
|
|
|
'PhluxTransactionQuery' => 'applications/phlux/query/PhluxTransactionQuery.php',
|
|
|
|
'PhluxVariable' => 'applications/phlux/storage/PhluxVariable.php',
|
|
|
|
'PhluxVariableEditor' => 'applications/phlux/editor/PhluxVariableEditor.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhluxVariablePHIDType' => 'applications/phlux/phid/PhluxVariablePHIDType.php',
|
2013-03-21 02:01:52 +01:00
|
|
|
'PhluxVariableQuery' => 'applications/phlux/query/PhluxVariableQuery.php',
|
|
|
|
'PhluxViewController' => 'applications/phlux/controller/PhluxViewController.php',
|
2013-10-22 02:00:50 +02:00
|
|
|
'PholioActionMenuEventListener' => 'applications/pholio/event/PholioActionMenuEventListener.php',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioController' => 'applications/pholio/controller/PholioController.php',
|
|
|
|
'PholioDAO' => 'applications/pholio/storage/PholioDAO.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PholioDefaultEditCapability' => 'applications/pholio/capability/PholioDefaultEditCapability.php',
|
|
|
|
'PholioDefaultViewCapability' => 'applications/pholio/capability/PholioDefaultViewCapability.php',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioImage' => 'applications/pholio/storage/PholioImage.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PholioImagePHIDType' => 'applications/pholio/phid/PholioImagePHIDType.php',
|
2013-07-26 01:59:25 +02:00
|
|
|
'PholioImageQuery' => 'applications/pholio/query/PholioImageQuery.php',
|
2013-07-19 00:04:08 +02:00
|
|
|
'PholioImageUploadController' => 'applications/pholio/controller/PholioImageUploadController.php',
|
2013-02-08 16:24:17 +01:00
|
|
|
'PholioInlineController' => 'applications/pholio/controller/PholioInlineController.php',
|
2014-06-15 03:41:45 +02:00
|
|
|
'PholioInlineListController' => 'applications/pholio/controller/PholioInlineListController.php',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioMock' => 'applications/pholio/storage/PholioMock.php',
|
2015-12-09 21:56:27 +01:00
|
|
|
'PholioMockArchiveController' => 'applications/pholio/controller/PholioMockArchiveController.php',
|
2015-07-06 22:17:33 +02:00
|
|
|
'PholioMockAuthorHeraldField' => 'applications/pholio/herald/PholioMockAuthorHeraldField.php',
|
2012-11-22 02:27:20 +01:00
|
|
|
'PholioMockCommentController' => 'applications/pholio/controller/PholioMockCommentController.php',
|
2015-07-06 22:17:33 +02:00
|
|
|
'PholioMockDescriptionHeraldField' => 'applications/pholio/herald/PholioMockDescriptionHeraldField.php',
|
2012-11-22 02:23:28 +01:00
|
|
|
'PholioMockEditController' => 'applications/pholio/controller/PholioMockEditController.php',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioMockEditor' => 'applications/pholio/editor/PholioMockEditor.php',
|
2013-03-07 17:23:40 +01:00
|
|
|
'PholioMockEmbedView' => 'applications/pholio/view/PholioMockEmbedView.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PholioMockFulltextEngine' => 'applications/pholio/search/PholioMockFulltextEngine.php',
|
2015-01-02 00:11:41 +01:00
|
|
|
'PholioMockHasTaskEdgeType' => 'applications/pholio/edge/PholioMockHasTaskEdgeType.php',
|
2015-07-06 22:17:33 +02:00
|
|
|
'PholioMockHeraldField' => 'applications/pholio/herald/PholioMockHeraldField.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'PholioMockHeraldFieldGroup' => 'applications/pholio/herald/PholioMockHeraldFieldGroup.php',
|
2013-01-20 18:29:34 +01:00
|
|
|
'PholioMockImagesView' => 'applications/pholio/view/PholioMockImagesView.php',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioMockListController' => 'applications/pholio/controller/PholioMockListController.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PholioMockMailReceiver' => 'applications/pholio/mail/PholioMockMailReceiver.php',
|
2015-07-06 22:17:33 +02:00
|
|
|
'PholioMockNameHeraldField' => 'applications/pholio/herald/PholioMockNameHeraldField.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PholioMockPHIDType' => 'applications/pholio/phid/PholioMockPHIDType.php',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioMockQuery' => 'applications/pholio/query/PholioMockQuery.php',
|
2013-07-22 21:21:15 +02:00
|
|
|
'PholioMockSearchEngine' => 'applications/pholio/query/PholioMockSearchEngine.php',
|
2014-06-15 06:12:19 +02:00
|
|
|
'PholioMockThumbGridView' => 'applications/pholio/view/PholioMockThumbGridView.php',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioMockViewController' => 'applications/pholio/controller/PholioMockViewController.php',
|
2013-02-26 23:59:31 +01:00
|
|
|
'PholioRemarkupRule' => 'applications/pholio/remarkup/PholioRemarkupRule.php',
|
2012-11-22 02:39:46 +01:00
|
|
|
'PholioReplyHandler' => 'applications/pholio/mail/PholioReplyHandler.php',
|
2014-10-01 16:52:26 +02:00
|
|
|
'PholioSchemaSpec' => 'applications/pholio/storage/PholioSchemaSpec.php',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioTransaction' => 'applications/pholio/storage/PholioTransaction.php',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PholioTransactionComment' => 'applications/pholio/storage/PholioTransactionComment.php',
|
2012-11-22 02:27:20 +01:00
|
|
|
'PholioTransactionQuery' => 'applications/pholio/query/PholioTransactionQuery.php',
|
2013-03-10 04:23:50 +01:00
|
|
|
'PholioTransactionView' => 'applications/pholio/view/PholioTransactionView.php',
|
2013-07-16 22:31:20 +02:00
|
|
|
'PholioUploadedImageView' => 'applications/pholio/view/PholioUploadedImageView.php',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneAccount' => 'applications/phortune/storage/PhortuneAccount.php',
|
2014-10-10 01:59:03 +02:00
|
|
|
'PhortuneAccountEditController' => 'applications/phortune/controller/PhortuneAccountEditController.php',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneAccountEditor' => 'applications/phortune/editor/PhortuneAccountEditor.php',
|
2014-10-11 00:00:06 +02:00
|
|
|
'PhortuneAccountHasMemberEdgeType' => 'applications/phortune/edge/PhortuneAccountHasMemberEdgeType.php',
|
2014-10-10 01:59:03 +02:00
|
|
|
'PhortuneAccountListController' => 'applications/phortune/controller/PhortuneAccountListController.php',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortuneAccountPHIDType' => 'applications/phortune/phid/PhortuneAccountPHIDType.php',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneAccountQuery' => 'applications/phortune/query/PhortuneAccountQuery.php',
|
|
|
|
'PhortuneAccountTransaction' => 'applications/phortune/storage/PhortuneAccountTransaction.php',
|
|
|
|
'PhortuneAccountTransactionQuery' => 'applications/phortune/query/PhortuneAccountTransactionQuery.php',
|
|
|
|
'PhortuneAccountViewController' => 'applications/phortune/controller/PhortuneAccountViewController.php',
|
2015-04-20 19:05:22 +02:00
|
|
|
'PhortuneAdHocCart' => 'applications/phortune/cart/PhortuneAdHocCart.php',
|
|
|
|
'PhortuneAdHocProduct' => 'applications/phortune/product/PhortuneAdHocProduct.php',
|
2013-04-25 18:45:07 +02:00
|
|
|
'PhortuneCart' => 'applications/phortune/storage/PhortuneCart.php',
|
2014-10-10 20:29:13 +02:00
|
|
|
'PhortuneCartAcceptController' => 'applications/phortune/controller/PhortuneCartAcceptController.php',
|
2014-10-09 00:33:25 +02:00
|
|
|
'PhortuneCartCancelController' => 'applications/phortune/controller/PhortuneCartCancelController.php',
|
2014-07-23 19:36:25 +02:00
|
|
|
'PhortuneCartCheckoutController' => 'applications/phortune/controller/PhortuneCartCheckoutController.php',
|
|
|
|
'PhortuneCartController' => 'applications/phortune/controller/PhortuneCartController.php',
|
2014-10-13 20:16:27 +02:00
|
|
|
'PhortuneCartEditor' => 'applications/phortune/editor/PhortuneCartEditor.php',
|
2014-10-06 23:19:08 +02:00
|
|
|
'PhortuneCartImplementation' => 'applications/phortune/cart/PhortuneCartImplementation.php',
|
2014-10-08 23:40:02 +02:00
|
|
|
'PhortuneCartListController' => 'applications/phortune/controller/PhortuneCartListController.php',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortuneCartPHIDType' => 'applications/phortune/phid/PhortuneCartPHIDType.php',
|
2014-07-23 19:34:08 +02:00
|
|
|
'PhortuneCartQuery' => 'applications/phortune/query/PhortuneCartQuery.php',
|
2014-10-13 20:16:44 +02:00
|
|
|
'PhortuneCartReplyHandler' => 'applications/phortune/mail/PhortuneCartReplyHandler.php',
|
2014-10-08 23:40:02 +02:00
|
|
|
'PhortuneCartSearchEngine' => 'applications/phortune/query/PhortuneCartSearchEngine.php',
|
2014-10-13 20:16:27 +02:00
|
|
|
'PhortuneCartTransaction' => 'applications/phortune/storage/PhortuneCartTransaction.php',
|
|
|
|
'PhortuneCartTransactionQuery' => 'applications/phortune/query/PhortuneCartTransactionQuery.php',
|
2014-10-09 13:30:47 +02:00
|
|
|
'PhortuneCartUpdateController' => 'applications/phortune/controller/PhortuneCartUpdateController.php',
|
2014-07-23 19:36:25 +02:00
|
|
|
'PhortuneCartViewController' => 'applications/phortune/controller/PhortuneCartViewController.php',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneCharge' => 'applications/phortune/storage/PhortuneCharge.php',
|
2014-10-13 20:14:50 +02:00
|
|
|
'PhortuneChargeListController' => 'applications/phortune/controller/PhortuneChargeListController.php',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortuneChargePHIDType' => 'applications/phortune/phid/PhortuneChargePHIDType.php',
|
2014-07-23 19:36:12 +02:00
|
|
|
'PhortuneChargeQuery' => 'applications/phortune/query/PhortuneChargeQuery.php',
|
2014-10-13 20:14:50 +02:00
|
|
|
'PhortuneChargeSearchEngine' => 'applications/phortune/query/PhortuneChargeSearchEngine.php',
|
|
|
|
'PhortuneChargeTableView' => 'applications/phortune/view/PhortuneChargeTableView.php',
|
2013-04-25 18:49:32 +02:00
|
|
|
'PhortuneConstants' => 'applications/phortune/constants/PhortuneConstants.php',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneController' => 'applications/phortune/controller/PhortuneController.php',
|
2013-04-25 18:46:59 +02:00
|
|
|
'PhortuneCreditCardForm' => 'applications/phortune/view/PhortuneCreditCardForm.php',
|
2013-05-07 03:04:45 +02:00
|
|
|
'PhortuneCurrency' => 'applications/phortune/currency/PhortuneCurrency.php',
|
2014-10-06 19:26:48 +02:00
|
|
|
'PhortuneCurrencySerializer' => 'applications/phortune/currency/PhortuneCurrencySerializer.php',
|
2013-05-07 03:04:45 +02:00
|
|
|
'PhortuneCurrencyTestCase' => 'applications/phortune/currency/__tests__/PhortuneCurrencyTestCase.php',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneDAO' => 'applications/phortune/storage/PhortuneDAO.php',
|
2013-04-25 18:49:32 +02:00
|
|
|
'PhortuneErrCode' => 'applications/phortune/constants/PhortuneErrCode.php',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneLandingController' => 'applications/phortune/controller/PhortuneLandingController.php',
|
2014-10-11 00:00:06 +02:00
|
|
|
'PhortuneMemberHasAccountEdgeType' => 'applications/phortune/edge/PhortuneMemberHasAccountEdgeType.php',
|
2014-10-13 20:13:50 +02:00
|
|
|
'PhortuneMemberHasMerchantEdgeType' => 'applications/phortune/edge/PhortuneMemberHasMerchantEdgeType.php',
|
Add Merchants to Phortune
Summary:
Ref T2787. Currently, you add payment providers (Stripe, Paypal, etc) in global configuration.
Generally, this approach is cumbersome, limiting, and often hard for users to figure out. It also doesn't provide a natural way to segment payment receivers or provide web access to administrative payment functions like issuing refunds, canceling orders, etc. I think that stuff definitely needs to be in the web UI, and the rule for access to it can't reasonably just be "all administrators" in a lot of reasonable cases.
The only real advantage is that it prevents an attacker from adjusting settings and pointing something at an account they control. But this attack can be mitigated through notifications, some sort of CLI-only merchant lock, payment accounts being relatively identifiable, etc.
So introduce "merchants", which are basically payable entities. An individual merchant will have attached Paypal, Stripe, etc., accounts, and access rules. When you buy something in an application, the merchant to pay is also specified. They also provide an umbrella for dealing with permissions down the line.
This may get a //little// cumbersome because if there are several merchants your saved card information is not shared across them. I think that will be fine in the normal case (most installs will have only one merchant). Even if it isn't and we leave providers global, I think introducing this is the right call from a web UI / permissions point of view. I'll play around with it in the next couple of diffs and figure out exactly where the line goes.
Test Plan: Listed, created, edited, viewed merchants.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D10648
2014-10-07 19:55:16 +02:00
|
|
|
'PhortuneMerchant' => 'applications/phortune/storage/PhortuneMerchant.php',
|
|
|
|
'PhortuneMerchantCapability' => 'applications/phortune/capability/PhortuneMerchantCapability.php',
|
|
|
|
'PhortuneMerchantController' => 'applications/phortune/controller/PhortuneMerchantController.php',
|
|
|
|
'PhortuneMerchantEditController' => 'applications/phortune/controller/PhortuneMerchantEditController.php',
|
|
|
|
'PhortuneMerchantEditor' => 'applications/phortune/editor/PhortuneMerchantEditor.php',
|
2014-10-13 20:13:50 +02:00
|
|
|
'PhortuneMerchantHasMemberEdgeType' => 'applications/phortune/edge/PhortuneMerchantHasMemberEdgeType.php',
|
2015-04-20 19:05:22 +02:00
|
|
|
'PhortuneMerchantInvoiceCreateController' => 'applications/phortune/controller/PhortuneMerchantInvoiceCreateController.php',
|
Add Merchants to Phortune
Summary:
Ref T2787. Currently, you add payment providers (Stripe, Paypal, etc) in global configuration.
Generally, this approach is cumbersome, limiting, and often hard for users to figure out. It also doesn't provide a natural way to segment payment receivers or provide web access to administrative payment functions like issuing refunds, canceling orders, etc. I think that stuff definitely needs to be in the web UI, and the rule for access to it can't reasonably just be "all administrators" in a lot of reasonable cases.
The only real advantage is that it prevents an attacker from adjusting settings and pointing something at an account they control. But this attack can be mitigated through notifications, some sort of CLI-only merchant lock, payment accounts being relatively identifiable, etc.
So introduce "merchants", which are basically payable entities. An individual merchant will have attached Paypal, Stripe, etc., accounts, and access rules. When you buy something in an application, the merchant to pay is also specified. They also provide an umbrella for dealing with permissions down the line.
This may get a //little// cumbersome because if there are several merchants your saved card information is not shared across them. I think that will be fine in the normal case (most installs will have only one merchant). Even if it isn't and we leave providers global, I think introducing this is the right call from a web UI / permissions point of view. I'll play around with it in the next couple of diffs and figure out exactly where the line goes.
Test Plan: Listed, created, edited, viewed merchants.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D10648
2014-10-07 19:55:16 +02:00
|
|
|
'PhortuneMerchantListController' => 'applications/phortune/controller/PhortuneMerchantListController.php',
|
|
|
|
'PhortuneMerchantPHIDType' => 'applications/phortune/phid/PhortuneMerchantPHIDType.php',
|
|
|
|
'PhortuneMerchantQuery' => 'applications/phortune/query/PhortuneMerchantQuery.php',
|
|
|
|
'PhortuneMerchantSearchEngine' => 'applications/phortune/query/PhortuneMerchantSearchEngine.php',
|
|
|
|
'PhortuneMerchantTransaction' => 'applications/phortune/storage/PhortuneMerchantTransaction.php',
|
|
|
|
'PhortuneMerchantTransactionQuery' => 'applications/phortune/query/PhortuneMerchantTransactionQuery.php',
|
|
|
|
'PhortuneMerchantViewController' => 'applications/phortune/controller/PhortuneMerchantViewController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhortuneMonthYearExpiryControl' => 'applications/phortune/control/PhortuneMonthYearExpiryControl.php',
|
2014-10-13 20:14:50 +02:00
|
|
|
'PhortuneOrderTableView' => 'applications/phortune/view/PhortuneOrderTableView.php',
|
2014-10-07 23:41:41 +02:00
|
|
|
'PhortunePayPalPaymentProvider' => 'applications/phortune/provider/PhortunePayPalPaymentProvider.php',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortunePaymentMethod' => 'applications/phortune/storage/PhortunePaymentMethod.php',
|
2014-08-11 21:07:35 +02:00
|
|
|
'PhortunePaymentMethodCreateController' => 'applications/phortune/controller/PhortunePaymentMethodCreateController.php',
|
|
|
|
'PhortunePaymentMethodDisableController' => 'applications/phortune/controller/PhortunePaymentMethodDisableController.php',
|
2013-03-28 17:11:42 +01:00
|
|
|
'PhortunePaymentMethodEditController' => 'applications/phortune/controller/PhortunePaymentMethodEditController.php',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortunePaymentMethodPHIDType' => 'applications/phortune/phid/PhortunePaymentMethodPHIDType.php',
|
2013-03-28 17:11:42 +01:00
|
|
|
'PhortunePaymentMethodQuery' => 'applications/phortune/query/PhortunePaymentMethodQuery.php',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortunePaymentProvider' => 'applications/phortune/provider/PhortunePaymentProvider.php',
|
2014-10-07 23:41:41 +02:00
|
|
|
'PhortunePaymentProviderConfig' => 'applications/phortune/storage/PhortunePaymentProviderConfig.php',
|
|
|
|
'PhortunePaymentProviderConfigEditor' => 'applications/phortune/editor/PhortunePaymentProviderConfigEditor.php',
|
|
|
|
'PhortunePaymentProviderConfigQuery' => 'applications/phortune/query/PhortunePaymentProviderConfigQuery.php',
|
|
|
|
'PhortunePaymentProviderConfigTransaction' => 'applications/phortune/storage/PhortunePaymentProviderConfigTransaction.php',
|
|
|
|
'PhortunePaymentProviderConfigTransactionQuery' => 'applications/phortune/query/PhortunePaymentProviderConfigTransactionQuery.php',
|
|
|
|
'PhortunePaymentProviderPHIDType' => 'applications/phortune/phid/PhortunePaymentProviderPHIDType.php',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhortunePaymentProviderTestCase' => 'applications/phortune/provider/__tests__/PhortunePaymentProviderTestCase.php',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneProduct' => 'applications/phortune/storage/PhortuneProduct.php',
|
2014-10-06 19:30:06 +02:00
|
|
|
'PhortuneProductImplementation' => 'applications/phortune/product/PhortuneProductImplementation.php',
|
2013-03-28 17:13:07 +01:00
|
|
|
'PhortuneProductListController' => 'applications/phortune/controller/PhortuneProductListController.php',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortuneProductPHIDType' => 'applications/phortune/phid/PhortuneProductPHIDType.php',
|
2013-03-28 17:13:07 +01:00
|
|
|
'PhortuneProductQuery' => 'applications/phortune/query/PhortuneProductQuery.php',
|
|
|
|
'PhortuneProductViewController' => 'applications/phortune/controller/PhortuneProductViewController.php',
|
2014-10-07 23:41:41 +02:00
|
|
|
'PhortuneProviderActionController' => 'applications/phortune/controller/PhortuneProviderActionController.php',
|
2014-10-08 17:31:24 +02:00
|
|
|
'PhortuneProviderDisableController' => 'applications/phortune/controller/PhortuneProviderDisableController.php',
|
2014-10-07 23:41:41 +02:00
|
|
|
'PhortuneProviderEditController' => 'applications/phortune/controller/PhortuneProviderEditController.php',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortunePurchase' => 'applications/phortune/storage/PhortunePurchase.php',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortunePurchasePHIDType' => 'applications/phortune/phid/PhortunePurchasePHIDType.php',
|
2014-07-23 19:34:08 +02:00
|
|
|
'PhortunePurchaseQuery' => 'applications/phortune/query/PhortunePurchaseQuery.php',
|
2014-10-01 16:52:26 +02:00
|
|
|
'PhortuneSchemaSpec' => 'applications/phortune/storage/PhortuneSchemaSpec.php',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortuneStripePaymentProvider' => 'applications/phortune/provider/PhortuneStripePaymentProvider.php',
|
2015-01-27 23:50:20 +01:00
|
|
|
'PhortuneSubscription' => 'applications/phortune/storage/PhortuneSubscription.php',
|
2015-01-30 20:52:50 +01:00
|
|
|
'PhortuneSubscriptionCart' => 'applications/phortune/cart/PhortuneSubscriptionCart.php',
|
2015-02-01 21:31:46 +01:00
|
|
|
'PhortuneSubscriptionEditController' => 'applications/phortune/controller/PhortuneSubscriptionEditController.php',
|
2015-01-27 23:50:20 +01:00
|
|
|
'PhortuneSubscriptionImplementation' => 'applications/phortune/subscription/PhortuneSubscriptionImplementation.php',
|
|
|
|
'PhortuneSubscriptionListController' => 'applications/phortune/controller/PhortuneSubscriptionListController.php',
|
|
|
|
'PhortuneSubscriptionPHIDType' => 'applications/phortune/phid/PhortuneSubscriptionPHIDType.php',
|
2015-01-30 20:52:50 +01:00
|
|
|
'PhortuneSubscriptionProduct' => 'applications/phortune/product/PhortuneSubscriptionProduct.php',
|
2015-01-27 23:50:20 +01:00
|
|
|
'PhortuneSubscriptionQuery' => 'applications/phortune/query/PhortuneSubscriptionQuery.php',
|
|
|
|
'PhortuneSubscriptionSearchEngine' => 'applications/phortune/query/PhortuneSubscriptionSearchEngine.php',
|
|
|
|
'PhortuneSubscriptionTableView' => 'applications/phortune/view/PhortuneSubscriptionTableView.php',
|
2015-01-30 20:28:49 +01:00
|
|
|
'PhortuneSubscriptionViewController' => 'applications/phortune/controller/PhortuneSubscriptionViewController.php',
|
2015-01-30 20:29:05 +01:00
|
|
|
'PhortuneSubscriptionWorker' => 'applications/phortune/worker/PhortuneSubscriptionWorker.php',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortuneTestPaymentProvider' => 'applications/phortune/provider/PhortuneTestPaymentProvider.php',
|
2013-05-22 00:34:46 +02:00
|
|
|
'PhortuneWePayPaymentProvider' => 'applications/phortune/provider/PhortuneWePayPaymentProvider.php',
|
2013-12-07 02:43:49 +01:00
|
|
|
'PhragmentBrowseController' => 'applications/phragment/controller/PhragmentBrowseController.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhragmentCanCreateCapability' => 'applications/phragment/capability/PhragmentCanCreateCapability.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhragmentConduitAPIMethod' => 'applications/phragment/conduit/PhragmentConduitAPIMethod.php',
|
2013-12-07 02:43:49 +01:00
|
|
|
'PhragmentController' => 'applications/phragment/controller/PhragmentController.php',
|
|
|
|
'PhragmentCreateController' => 'applications/phragment/controller/PhragmentCreateController.php',
|
|
|
|
'PhragmentDAO' => 'applications/phragment/storage/PhragmentDAO.php',
|
|
|
|
'PhragmentFragment' => 'applications/phragment/storage/PhragmentFragment.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhragmentFragmentPHIDType' => 'applications/phragment/phid/PhragmentFragmentPHIDType.php',
|
2013-12-07 02:43:49 +01:00
|
|
|
'PhragmentFragmentQuery' => 'applications/phragment/query/PhragmentFragmentQuery.php',
|
|
|
|
'PhragmentFragmentVersion' => 'applications/phragment/storage/PhragmentFragmentVersion.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhragmentFragmentVersionPHIDType' => 'applications/phragment/phid/PhragmentFragmentVersionPHIDType.php',
|
2013-12-07 02:43:49 +01:00
|
|
|
'PhragmentFragmentVersionQuery' => 'applications/phragment/query/PhragmentFragmentVersionQuery.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhragmentGetPatchConduitAPIMethod' => 'applications/phragment/conduit/PhragmentGetPatchConduitAPIMethod.php',
|
2013-12-07 02:56:55 +01:00
|
|
|
'PhragmentHistoryController' => 'applications/phragment/controller/PhragmentHistoryController.php',
|
2013-12-08 02:14:34 +01:00
|
|
|
'PhragmentPatchController' => 'applications/phragment/controller/PhragmentPatchController.php',
|
2013-12-07 02:43:49 +01:00
|
|
|
'PhragmentPatchUtil' => 'applications/phragment/util/PhragmentPatchUtil.php',
|
2013-12-13 04:42:12 +01:00
|
|
|
'PhragmentPolicyController' => 'applications/phragment/controller/PhragmentPolicyController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhragmentQueryFragmentsConduitAPIMethod' => 'applications/phragment/conduit/PhragmentQueryFragmentsConduitAPIMethod.php',
|
2013-12-08 21:57:53 +01:00
|
|
|
'PhragmentRevertController' => 'applications/phragment/controller/PhragmentRevertController.php',
|
2014-10-01 16:52:26 +02:00
|
|
|
'PhragmentSchemaSpec' => 'applications/phragment/storage/PhragmentSchemaSpec.php',
|
2013-12-08 22:24:50 +01:00
|
|
|
'PhragmentSnapshot' => 'applications/phragment/storage/PhragmentSnapshot.php',
|
|
|
|
'PhragmentSnapshotChild' => 'applications/phragment/storage/PhragmentSnapshotChild.php',
|
|
|
|
'PhragmentSnapshotChildQuery' => 'applications/phragment/query/PhragmentSnapshotChildQuery.php',
|
|
|
|
'PhragmentSnapshotCreateController' => 'applications/phragment/controller/PhragmentSnapshotCreateController.php',
|
|
|
|
'PhragmentSnapshotDeleteController' => 'applications/phragment/controller/PhragmentSnapshotDeleteController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhragmentSnapshotPHIDType' => 'applications/phragment/phid/PhragmentSnapshotPHIDType.php',
|
2013-12-08 22:24:50 +01:00
|
|
|
'PhragmentSnapshotPromoteController' => 'applications/phragment/controller/PhragmentSnapshotPromoteController.php',
|
|
|
|
'PhragmentSnapshotQuery' => 'applications/phragment/query/PhragmentSnapshotQuery.php',
|
|
|
|
'PhragmentSnapshotViewController' => 'applications/phragment/controller/PhragmentSnapshotViewController.php',
|
2013-12-07 02:56:55 +01:00
|
|
|
'PhragmentUpdateController' => 'applications/phragment/controller/PhragmentUpdateController.php',
|
2013-12-08 02:14:34 +01:00
|
|
|
'PhragmentVersionController' => 'applications/phragment/controller/PhragmentVersionController.php',
|
2013-12-07 03:25:22 +01:00
|
|
|
'PhragmentZIPController' => 'applications/phragment/controller/PhragmentZIPController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrequentConduitAPIMethod' => 'applications/phrequent/conduit/PhrequentConduitAPIMethod.php',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhrequentController' => 'applications/phrequent/controller/PhrequentController.php',
|
2016-03-11 03:11:12 +01:00
|
|
|
'PhrequentCurtainExtension' => 'applications/phrequent/engineextension/PhrequentCurtainExtension.php',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhrequentDAO' => 'applications/phrequent/storage/PhrequentDAO.php',
|
|
|
|
'PhrequentListController' => 'applications/phrequent/controller/PhrequentListController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrequentPopConduitAPIMethod' => 'applications/phrequent/conduit/PhrequentPopConduitAPIMethod.php',
|
|
|
|
'PhrequentPushConduitAPIMethod' => 'applications/phrequent/conduit/PhrequentPushConduitAPIMethod.php',
|
2013-10-01 22:04:47 +02:00
|
|
|
'PhrequentSearchEngine' => 'applications/phrequent/query/PhrequentSearchEngine.php',
|
2013-10-18 21:47:36 +02:00
|
|
|
'PhrequentTimeBlock' => 'applications/phrequent/storage/PhrequentTimeBlock.php',
|
|
|
|
'PhrequentTimeBlockTestCase' => 'applications/phrequent/storage/__tests__/PhrequentTimeBlockTestCase.php',
|
2014-07-17 02:12:38 +02:00
|
|
|
'PhrequentTimeSlices' => 'applications/phrequent/storage/PhrequentTimeSlices.php',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhrequentTrackController' => 'applications/phrequent/controller/PhrequentTrackController.php',
|
|
|
|
'PhrequentTrackableInterface' => 'applications/phrequent/interface/PhrequentTrackableInterface.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrequentTrackingConduitAPIMethod' => 'applications/phrequent/conduit/PhrequentTrackingConduitAPIMethod.php',
|
Conduit APIs to start and stop tracking time in phrequent
Summary:
This adds methods to start and stop tracking any arbitrary PHID in phrequent. Currently, this uses copy-pasted code from PhrequentTrackController. I had to do this because the code to start/stop was not abstracted into a common class.
Once the code to start/stop working is extracted into a re-usable class, the conduit API can use this as well.
Test Plan: I called the functions with a PHID of a task and ensured that the fields in the phrequent database table was being updated correctly.
Reviewers: skyronic, #blessed_reviewers, epriestley
Reviewed By: #blessed_reviewers, epriestley
Subscribers: maxhodak, erik.fercak, aran, epriestley, Korvin
Maniphest Tasks: T3569, T3970
Differential Revision: https://secure.phabricator.com/D7326
2014-07-12 03:42:32 +02:00
|
|
|
'PhrequentTrackingEditor' => 'applications/phrequent/editor/PhrequentTrackingEditor.php',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhrequentUIEventListener' => 'applications/phrequent/event/PhrequentUIEventListener.php',
|
|
|
|
'PhrequentUserTime' => 'applications/phrequent/storage/PhrequentUserTime.php',
|
|
|
|
'PhrequentUserTimeQuery' => 'applications/phrequent/query/PhrequentUserTimeQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhrictionChangeType' => 'applications/phriction/constants/PhrictionChangeType.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrictionConduitAPIMethod' => 'applications/phriction/conduit/PhrictionConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhrictionConstants' => 'applications/phriction/constants/PhrictionConstants.php',
|
|
|
|
'PhrictionContent' => 'applications/phriction/storage/PhrictionContent.php',
|
|
|
|
'PhrictionController' => 'applications/phriction/controller/PhrictionController.php',
|
2014-11-07 20:46:25 +01:00
|
|
|
'PhrictionCreateConduitAPIMethod' => 'applications/phriction/conduit/PhrictionCreateConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhrictionDAO' => 'applications/phriction/storage/PhrictionDAO.php',
|
|
|
|
'PhrictionDeleteController' => 'applications/phriction/controller/PhrictionDeleteController.php',
|
|
|
|
'PhrictionDiffController' => 'applications/phriction/controller/PhrictionDiffController.php',
|
|
|
|
'PhrictionDocument' => 'applications/phriction/storage/PhrictionDocument.php',
|
2015-07-06 22:17:50 +02:00
|
|
|
'PhrictionDocumentAuthorHeraldField' => 'applications/phriction/herald/PhrictionDocumentAuthorHeraldField.php',
|
|
|
|
'PhrictionDocumentContentHeraldField' => 'applications/phriction/herald/PhrictionDocumentContentHeraldField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhrictionDocumentController' => 'applications/phriction/controller/PhrictionDocumentController.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhrictionDocumentFulltextEngine' => 'applications/phriction/search/PhrictionDocumentFulltextEngine.php',
|
2014-11-12 03:29:36 +01:00
|
|
|
'PhrictionDocumentHeraldAdapter' => 'applications/phriction/herald/PhrictionDocumentHeraldAdapter.php',
|
2015-07-06 22:17:50 +02:00
|
|
|
'PhrictionDocumentHeraldField' => 'applications/phriction/herald/PhrictionDocumentHeraldField.php',
|
2015-07-16 23:13:13 +02:00
|
|
|
'PhrictionDocumentHeraldFieldGroup' => 'applications/phriction/herald/PhrictionDocumentHeraldFieldGroup.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhrictionDocumentPHIDType' => 'applications/phriction/phid/PhrictionDocumentPHIDType.php',
|
2015-07-06 22:17:50 +02:00
|
|
|
'PhrictionDocumentPathHeraldField' => 'applications/phriction/herald/PhrictionDocumentPathHeraldField.php',
|
2013-03-08 16:12:24 +01:00
|
|
|
'PhrictionDocumentQuery' => 'applications/phriction/query/PhrictionDocumentQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhrictionDocumentStatus' => 'applications/phriction/constants/PhrictionDocumentStatus.php',
|
2015-07-06 22:17:50 +02:00
|
|
|
'PhrictionDocumentTitleHeraldField' => 'applications/phriction/herald/PhrictionDocumentTitleHeraldField.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrictionEditConduitAPIMethod' => 'applications/phriction/conduit/PhrictionEditConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhrictionEditController' => 'applications/phriction/controller/PhrictionEditController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrictionHistoryConduitAPIMethod' => 'applications/phriction/conduit/PhrictionHistoryConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhrictionHistoryController' => 'applications/phriction/controller/PhrictionHistoryController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrictionInfoConduitAPIMethod' => 'applications/phriction/conduit/PhrictionInfoConduitAPIMethod.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhrictionListController' => 'applications/phriction/controller/PhrictionListController.php',
|
2016-04-16 04:07:03 +02:00
|
|
|
'PhrictionMarkupPreviewController' => 'applications/phriction/controller/PhrictionMarkupPreviewController.php',
|
2013-03-06 22:12:04 +01:00
|
|
|
'PhrictionMoveController' => 'applications/phriction/controller/PhrictionMoveController.php',
|
2012-11-10 00:08:37 +01:00
|
|
|
'PhrictionNewController' => 'applications/phriction/controller/PhrictionNewController.php',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhrictionRemarkupRule' => 'applications/phriction/markup/PhrictionRemarkupRule.php',
|
2014-10-30 16:59:21 +01:00
|
|
|
'PhrictionReplyHandler' => 'applications/phriction/mail/PhrictionReplyHandler.php',
|
2014-10-01 16:52:26 +02:00
|
|
|
'PhrictionSchemaSpec' => 'applications/phriction/storage/PhrictionSchemaSpec.php',
|
2013-07-28 03:26:42 +02:00
|
|
|
'PhrictionSearchEngine' => 'applications/phriction/query/PhrictionSearchEngine.php',
|
2014-10-30 16:59:21 +01:00
|
|
|
'PhrictionTransaction' => 'applications/phriction/storage/PhrictionTransaction.php',
|
|
|
|
'PhrictionTransactionComment' => 'applications/phriction/storage/PhrictionTransactionComment.php',
|
|
|
|
'PhrictionTransactionEditor' => 'applications/phriction/editor/PhrictionTransactionEditor.php',
|
|
|
|
'PhrictionTransactionQuery' => 'applications/phriction/query/PhrictionTransactionQuery.php',
|
2015-01-13 20:46:29 +01:00
|
|
|
'PolicyLockOptionType' => 'applications/policy/config/PolicyLockOptionType.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderAddAnswerView' => 'applications/ponder/view/PonderAddAnswerView.php',
|
|
|
|
'PonderAnswer' => 'applications/ponder/storage/PonderAnswer.php',
|
2013-07-29 02:40:11 +02:00
|
|
|
'PonderAnswerCommentController' => 'applications/ponder/controller/PonderAnswerCommentController.php',
|
2013-07-29 02:23:04 +02:00
|
|
|
'PonderAnswerEditController' => 'applications/ponder/controller/PonderAnswerEditController.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderAnswerEditor' => 'applications/ponder/editor/PonderAnswerEditor.php',
|
2013-07-29 03:32:55 +02:00
|
|
|
'PonderAnswerHistoryController' => 'applications/ponder/controller/PonderAnswerHistoryController.php',
|
2015-08-17 19:22:54 +02:00
|
|
|
'PonderAnswerMailReceiver' => 'applications/ponder/mail/PonderAnswerMailReceiver.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PonderAnswerPHIDType' => 'applications/ponder/phid/PonderAnswerPHIDType.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderAnswerQuery' => 'applications/ponder/query/PonderAnswerQuery.php',
|
2015-08-17 19:22:54 +02:00
|
|
|
'PonderAnswerReplyHandler' => 'applications/ponder/mail/PonderAnswerReplyHandler.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderAnswerSaveController' => 'applications/ponder/controller/PonderAnswerSaveController.php',
|
2015-08-14 18:25:02 +02:00
|
|
|
'PonderAnswerStatus' => 'applications/ponder/constants/PonderAnswerStatus.php',
|
2013-07-26 22:52:57 +02:00
|
|
|
'PonderAnswerTransaction' => 'applications/ponder/storage/PonderAnswerTransaction.php',
|
|
|
|
'PonderAnswerTransactionComment' => 'applications/ponder/storage/PonderAnswerTransactionComment.php',
|
2013-07-29 01:17:51 +02:00
|
|
|
'PonderAnswerTransactionQuery' => 'applications/ponder/query/PonderAnswerTransactionQuery.php',
|
2015-08-11 19:42:40 +02:00
|
|
|
'PonderAnswerView' => 'applications/ponder/view/PonderAnswerView.php',
|
2013-07-28 03:37:17 +02:00
|
|
|
'PonderConstants' => 'applications/ponder/constants/PonderConstants.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderController' => 'applications/ponder/controller/PonderController.php',
|
|
|
|
'PonderDAO' => 'applications/ponder/storage/PonderDAO.php',
|
2015-08-08 21:20:01 +02:00
|
|
|
'PonderDefaultViewCapability' => 'applications/ponder/capability/PonderDefaultViewCapability.php',
|
2013-09-19 00:15:25 +02:00
|
|
|
'PonderEditor' => 'applications/ponder/editor/PonderEditor.php',
|
2015-08-11 19:42:40 +02:00
|
|
|
'PonderFooterView' => 'applications/ponder/view/PonderFooterView.php',
|
2015-08-08 21:20:01 +02:00
|
|
|
'PonderModerateCapability' => 'applications/ponder/capability/PonderModerateCapability.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderQuestion' => 'applications/ponder/storage/PonderQuestion.php',
|
2013-07-29 02:58:34 +02:00
|
|
|
'PonderQuestionCommentController' => 'applications/ponder/controller/PonderQuestionCommentController.php',
|
2013-07-29 00:02:18 +02:00
|
|
|
'PonderQuestionEditController' => 'applications/ponder/controller/PonderQuestionEditController.php',
|
2012-10-07 23:35:01 +02:00
|
|
|
'PonderQuestionEditor' => 'applications/ponder/editor/PonderQuestionEditor.php',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PonderQuestionFulltextEngine' => 'applications/ponder/search/PonderQuestionFulltextEngine.php',
|
2013-07-29 03:32:55 +02:00
|
|
|
'PonderQuestionHistoryController' => 'applications/ponder/controller/PonderQuestionHistoryController.php',
|
2013-07-18 21:40:51 +02:00
|
|
|
'PonderQuestionListController' => 'applications/ponder/controller/PonderQuestionListController.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PonderQuestionMailReceiver' => 'applications/ponder/mail/PonderQuestionMailReceiver.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PonderQuestionPHIDType' => 'applications/ponder/phid/PonderQuestionPHIDType.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderQuestionQuery' => 'applications/ponder/query/PonderQuestionQuery.php',
|
2013-07-29 17:38:25 +02:00
|
|
|
'PonderQuestionReplyHandler' => 'applications/ponder/mail/PonderQuestionReplyHandler.php',
|
2013-07-18 21:40:51 +02:00
|
|
|
'PonderQuestionSearchEngine' => 'applications/ponder/query/PonderQuestionSearchEngine.php',
|
2013-07-28 03:37:17 +02:00
|
|
|
'PonderQuestionStatus' => 'applications/ponder/constants/PonderQuestionStatus.php',
|
|
|
|
'PonderQuestionStatusController' => 'applications/ponder/controller/PonderQuestionStatusController.php',
|
2013-07-26 22:52:57 +02:00
|
|
|
'PonderQuestionTransaction' => 'applications/ponder/storage/PonderQuestionTransaction.php',
|
|
|
|
'PonderQuestionTransactionComment' => 'applications/ponder/storage/PonderQuestionTransactionComment.php',
|
2013-07-29 00:02:18 +02:00
|
|
|
'PonderQuestionTransactionQuery' => 'applications/ponder/query/PonderQuestionTransactionQuery.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderQuestionViewController' => 'applications/ponder/controller/PonderQuestionViewController.php',
|
2013-02-26 23:57:41 +01:00
|
|
|
'PonderRemarkupRule' => 'applications/ponder/remarkup/PonderRemarkupRule.php',
|
2014-10-01 16:37:14 +02:00
|
|
|
'PonderSchemaSpec' => 'applications/ponder/storage/PonderSchemaSpec.php',
|
2015-04-01 18:40:12 +02:00
|
|
|
'ProjectAddProjectsEmailCommand' => 'applications/project/command/ProjectAddProjectsEmailCommand.php',
|
2014-03-04 20:50:44 +01:00
|
|
|
'ProjectBoardTaskCard' => 'applications/project/view/ProjectBoardTaskCard.php',
|
2014-09-18 20:00:50 +02:00
|
|
|
'ProjectCanLockProjectsCapability' => 'applications/project/capability/ProjectCanLockProjectsCapability.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ProjectConduitAPIMethod' => 'applications/project/conduit/ProjectConduitAPIMethod.php',
|
2014-08-05 22:40:41 +02:00
|
|
|
'ProjectCreateConduitAPIMethod' => 'applications/project/conduit/ProjectCreateConduitAPIMethod.php',
|
2014-07-25 00:20:39 +02:00
|
|
|
'ProjectCreateProjectsCapability' => 'applications/project/capability/ProjectCreateProjectsCapability.php',
|
2014-11-21 20:22:17 +01:00
|
|
|
'ProjectDefaultEditCapability' => 'applications/project/capability/ProjectDefaultEditCapability.php',
|
|
|
|
'ProjectDefaultJoinCapability' => 'applications/project/capability/ProjectDefaultJoinCapability.php',
|
|
|
|
'ProjectDefaultViewCapability' => 'applications/project/capability/ProjectDefaultViewCapability.php',
|
2015-12-27 15:45:53 +01:00
|
|
|
'ProjectEditConduitAPIMethod' => 'applications/project/conduit/ProjectEditConduitAPIMethod.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ProjectQueryConduitAPIMethod' => 'applications/project/conduit/ProjectQueryConduitAPIMethod.php',
|
2013-05-18 11:46:39 +02:00
|
|
|
'ProjectRemarkupRule' => 'applications/project/remarkup/ProjectRemarkupRule.php',
|
2014-10-29 16:13:38 +01:00
|
|
|
'ProjectRemarkupRuleTestCase' => 'applications/project/remarkup/__tests__/ProjectRemarkupRuleTestCase.php',
|
2015-05-16 01:33:31 +02:00
|
|
|
'ProjectReplyHandler' => 'applications/project/mail/ProjectReplyHandler.php',
|
2015-12-27 11:44:07 +01:00
|
|
|
'ProjectSearchConduitAPIMethod' => 'applications/project/conduit/ProjectSearchConduitAPIMethod.php',
|
2012-07-26 21:01:47 +02:00
|
|
|
'QueryFormattingTestCase' => 'infrastructure/storage/__tests__/QueryFormattingTestCase.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephAuthorFieldSpecification' => 'applications/releeph/field/specification/ReleephAuthorFieldSpecification.php',
|
|
|
|
'ReleephBranch' => 'applications/releeph/storage/ReleephBranch.php',
|
|
|
|
'ReleephBranchAccessController' => 'applications/releeph/controller/branch/ReleephBranchAccessController.php',
|
|
|
|
'ReleephBranchCommitFieldSpecification' => 'applications/releeph/field/specification/ReleephBranchCommitFieldSpecification.php',
|
2014-04-13 01:53:51 +02:00
|
|
|
'ReleephBranchController' => 'applications/releeph/controller/branch/ReleephBranchController.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephBranchCreateController' => 'applications/releeph/controller/branch/ReleephBranchCreateController.php',
|
|
|
|
'ReleephBranchEditController' => 'applications/releeph/controller/branch/ReleephBranchEditController.php',
|
|
|
|
'ReleephBranchEditor' => 'applications/releeph/editor/ReleephBranchEditor.php',
|
2013-08-20 19:11:52 +02:00
|
|
|
'ReleephBranchHistoryController' => 'applications/releeph/controller/branch/ReleephBranchHistoryController.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephBranchNamePreviewController' => 'applications/releeph/controller/branch/ReleephBranchNamePreviewController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'ReleephBranchPHIDType' => 'applications/releeph/phid/ReleephBranchPHIDType.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephBranchPreviewView' => 'applications/releeph/view/branch/ReleephBranchPreviewView.php',
|
2013-07-21 18:27:00 +02:00
|
|
|
'ReleephBranchQuery' => 'applications/releeph/query/ReleephBranchQuery.php',
|
2013-08-17 03:55:35 +02:00
|
|
|
'ReleephBranchSearchEngine' => 'applications/releeph/query/ReleephBranchSearchEngine.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephBranchTemplate' => 'applications/releeph/view/branch/ReleephBranchTemplate.php',
|
2013-08-20 18:31:27 +02:00
|
|
|
'ReleephBranchTransaction' => 'applications/releeph/storage/ReleephBranchTransaction.php',
|
2013-08-20 19:11:52 +02:00
|
|
|
'ReleephBranchTransactionQuery' => 'applications/releeph/query/ReleephBranchTransactionQuery.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephBranchViewController' => 'applications/releeph/controller/branch/ReleephBranchViewController.php',
|
|
|
|
'ReleephCommitFinder' => 'applications/releeph/commitfinder/ReleephCommitFinder.php',
|
|
|
|
'ReleephCommitFinderException' => 'applications/releeph/commitfinder/ReleephCommitFinderException.php',
|
|
|
|
'ReleephCommitMessageFieldSpecification' => 'applications/releeph/field/specification/ReleephCommitMessageFieldSpecification.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephConduitAPIMethod' => 'applications/releeph/conduit/ReleephConduitAPIMethod.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephController' => 'applications/releeph/controller/ReleephController.php',
|
|
|
|
'ReleephDAO' => 'applications/releeph/storage/ReleephDAO.php',
|
|
|
|
'ReleephDefaultFieldSelector' => 'applications/releeph/field/selector/ReleephDefaultFieldSelector.php',
|
2014-01-14 03:18:26 +01:00
|
|
|
'ReleephDependsOnFieldSpecification' => 'applications/releeph/field/specification/ReleephDependsOnFieldSpecification.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephDiffChurnFieldSpecification' => 'applications/releeph/field/specification/ReleephDiffChurnFieldSpecification.php',
|
|
|
|
'ReleephDiffMessageFieldSpecification' => 'applications/releeph/field/specification/ReleephDiffMessageFieldSpecification.php',
|
|
|
|
'ReleephDiffSizeFieldSpecification' => 'applications/releeph/field/specification/ReleephDiffSizeFieldSpecification.php',
|
|
|
|
'ReleephFieldParseException' => 'applications/releeph/field/exception/ReleephFieldParseException.php',
|
|
|
|
'ReleephFieldSelector' => 'applications/releeph/field/selector/ReleephFieldSelector.php',
|
|
|
|
'ReleephFieldSpecification' => 'applications/releeph/field/specification/ReleephFieldSpecification.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephGetBranchesConduitAPIMethod' => 'applications/releeph/conduit/ReleephGetBranchesConduitAPIMethod.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephIntentFieldSpecification' => 'applications/releeph/field/specification/ReleephIntentFieldSpecification.php',
|
|
|
|
'ReleephLevelFieldSpecification' => 'applications/releeph/field/specification/ReleephLevelFieldSpecification.php',
|
|
|
|
'ReleephOriginalCommitFieldSpecification' => 'applications/releeph/field/specification/ReleephOriginalCommitFieldSpecification.php',
|
2014-04-20 20:54:37 +02:00
|
|
|
'ReleephProductActionController' => 'applications/releeph/controller/product/ReleephProductActionController.php',
|
|
|
|
'ReleephProductController' => 'applications/releeph/controller/product/ReleephProductController.php',
|
|
|
|
'ReleephProductCreateController' => 'applications/releeph/controller/product/ReleephProductCreateController.php',
|
|
|
|
'ReleephProductEditController' => 'applications/releeph/controller/product/ReleephProductEditController.php',
|
2014-03-29 17:16:02 +01:00
|
|
|
'ReleephProductEditor' => 'applications/releeph/editor/ReleephProductEditor.php',
|
2014-04-20 20:54:37 +02:00
|
|
|
'ReleephProductHistoryController' => 'applications/releeph/controller/product/ReleephProductHistoryController.php',
|
|
|
|
'ReleephProductListController' => 'applications/releeph/controller/product/ReleephProductListController.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'ReleephProductPHIDType' => 'applications/releeph/phid/ReleephProductPHIDType.php',
|
2014-04-20 20:51:02 +02:00
|
|
|
'ReleephProductQuery' => 'applications/releeph/query/ReleephProductQuery.php',
|
2014-03-29 17:16:24 +01:00
|
|
|
'ReleephProductSearchEngine' => 'applications/releeph/query/ReleephProductSearchEngine.php',
|
2014-03-29 17:15:09 +01:00
|
|
|
'ReleephProductTransaction' => 'applications/releeph/storage/ReleephProductTransaction.php',
|
|
|
|
'ReleephProductTransactionQuery' => 'applications/releeph/query/ReleephProductTransactionQuery.php',
|
2014-04-20 20:54:37 +02:00
|
|
|
'ReleephProductViewController' => 'applications/releeph/controller/product/ReleephProductViewController.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephProject' => 'applications/releeph/storage/ReleephProject.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephQueryBranchesConduitAPIMethod' => 'applications/releeph/conduit/ReleephQueryBranchesConduitAPIMethod.php',
|
2014-08-02 09:36:34 +02:00
|
|
|
'ReleephQueryProductsConduitAPIMethod' => 'applications/releeph/conduit/ReleephQueryProductsConduitAPIMethod.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephQueryRequestsConduitAPIMethod' => 'applications/releeph/conduit/ReleephQueryRequestsConduitAPIMethod.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephReasonFieldSpecification' => 'applications/releeph/field/specification/ReleephReasonFieldSpecification.php',
|
|
|
|
'ReleephRequest' => 'applications/releeph/storage/ReleephRequest.php',
|
|
|
|
'ReleephRequestActionController' => 'applications/releeph/controller/request/ReleephRequestActionController.php',
|
2013-04-08 17:34:21 +02:00
|
|
|
'ReleephRequestCommentController' => 'applications/releeph/controller/request/ReleephRequestCommentController.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephRequestConduitAPIMethod' => 'applications/releeph/conduit/ReleephRequestConduitAPIMethod.php',
|
2014-04-14 21:06:56 +02:00
|
|
|
'ReleephRequestController' => 'applications/releeph/controller/request/ReleephRequestController.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephRequestDifferentialCreateController' => 'applications/releeph/controller/request/ReleephRequestDifferentialCreateController.php',
|
|
|
|
'ReleephRequestEditController' => 'applications/releeph/controller/request/ReleephRequestEditController.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ReleephRequestMailReceiver' => 'applications/releeph/mail/ReleephRequestMailReceiver.php',
|
2014-07-24 00:05:46 +02:00
|
|
|
'ReleephRequestPHIDType' => 'applications/releeph/phid/ReleephRequestPHIDType.php',
|
2013-05-15 00:04:17 +02:00
|
|
|
'ReleephRequestQuery' => 'applications/releeph/query/ReleephRequestQuery.php',
|
2013-04-08 17:34:21 +02:00
|
|
|
'ReleephRequestReplyHandler' => 'applications/releeph/mail/ReleephRequestReplyHandler.php',
|
2013-08-15 00:38:52 +02:00
|
|
|
'ReleephRequestSearchEngine' => 'applications/releeph/query/ReleephRequestSearchEngine.php',
|
2013-05-10 18:07:33 +02:00
|
|
|
'ReleephRequestStatus' => 'applications/releeph/constants/ReleephRequestStatus.php',
|
2013-04-08 17:34:21 +02:00
|
|
|
'ReleephRequestTransaction' => 'applications/releeph/storage/ReleephRequestTransaction.php',
|
|
|
|
'ReleephRequestTransactionComment' => 'applications/releeph/storage/ReleephRequestTransactionComment.php',
|
|
|
|
'ReleephRequestTransactionQuery' => 'applications/releeph/query/ReleephRequestTransactionQuery.php',
|
|
|
|
'ReleephRequestTransactionalEditor' => 'applications/releeph/editor/ReleephRequestTransactionalEditor.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephRequestTypeaheadControl' => 'applications/releeph/view/request/ReleephRequestTypeaheadControl.php',
|
|
|
|
'ReleephRequestTypeaheadController' => 'applications/releeph/controller/request/ReleephRequestTypeaheadController.php',
|
2014-04-18 15:44:45 +02:00
|
|
|
'ReleephRequestView' => 'applications/releeph/view/ReleephRequestView.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephRequestViewController' => 'applications/releeph/controller/request/ReleephRequestViewController.php',
|
|
|
|
'ReleephRequestorFieldSpecification' => 'applications/releeph/field/specification/ReleephRequestorFieldSpecification.php',
|
|
|
|
'ReleephRevisionFieldSpecification' => 'applications/releeph/field/specification/ReleephRevisionFieldSpecification.php',
|
|
|
|
'ReleephSeverityFieldSpecification' => 'applications/releeph/field/specification/ReleephSeverityFieldSpecification.php',
|
|
|
|
'ReleephSummaryFieldSpecification' => 'applications/releeph/field/specification/ReleephSummaryFieldSpecification.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephWorkCanPushConduitAPIMethod' => 'applications/releeph/conduit/work/ReleephWorkCanPushConduitAPIMethod.php',
|
|
|
|
'ReleephWorkGetAuthorInfoConduitAPIMethod' => 'applications/releeph/conduit/work/ReleephWorkGetAuthorInfoConduitAPIMethod.php',
|
|
|
|
'ReleephWorkGetBranchCommitMessageConduitAPIMethod' => 'applications/releeph/conduit/work/ReleephWorkGetBranchCommitMessageConduitAPIMethod.php',
|
|
|
|
'ReleephWorkGetBranchConduitAPIMethod' => 'applications/releeph/conduit/work/ReleephWorkGetBranchConduitAPIMethod.php',
|
|
|
|
'ReleephWorkGetCommitMessageConduitAPIMethod' => 'applications/releeph/conduit/work/ReleephWorkGetCommitMessageConduitAPIMethod.php',
|
|
|
|
'ReleephWorkNextRequestConduitAPIMethod' => 'applications/releeph/conduit/work/ReleephWorkNextRequestConduitAPIMethod.php',
|
|
|
|
'ReleephWorkRecordConduitAPIMethod' => 'applications/releeph/conduit/work/ReleephWorkRecordConduitAPIMethod.php',
|
|
|
|
'ReleephWorkRecordPickStatusConduitAPIMethod' => 'applications/releeph/conduit/work/ReleephWorkRecordPickStatusConduitAPIMethod.php',
|
|
|
|
'RemarkupProcessConduitAPIMethod' => 'applications/remarkup/conduit/RemarkupProcessConduitAPIMethod.php',
|
|
|
|
'RepositoryConduitAPIMethod' => 'applications/repository/conduit/RepositoryConduitAPIMethod.php',
|
|
|
|
'RepositoryQueryConduitAPIMethod' => 'applications/repository/conduit/RepositoryQueryConduitAPIMethod.php',
|
2013-11-09 03:09:03 +01:00
|
|
|
'ShellLogView' => 'applications/harbormaster/view/ShellLogView.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'SlowvoteConduitAPIMethod' => 'applications/slowvote/conduit/SlowvoteConduitAPIMethod.php',
|
2013-04-16 17:18:52 +02:00
|
|
|
'SlowvoteEmbedView' => 'applications/slowvote/view/SlowvoteEmbedView.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'SlowvoteInfoConduitAPIMethod' => 'applications/slowvote/conduit/SlowvoteInfoConduitAPIMethod.php',
|
2013-04-16 17:18:52 +02:00
|
|
|
'SlowvoteRemarkupRule' => 'applications/slowvote/remarkup/SlowvoteRemarkupRule.php',
|
2014-03-14 19:22:00 +01:00
|
|
|
'SubscriptionListDialogBuilder' => 'applications/subscriptions/view/SubscriptionListDialogBuilder.php',
|
|
|
|
'SubscriptionListStringBuilder' => 'applications/subscriptions/view/SubscriptionListStringBuilder.php',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'TokenConduitAPIMethod' => 'applications/tokens/conduit/TokenConduitAPIMethod.php',
|
|
|
|
'TokenGiveConduitAPIMethod' => 'applications/tokens/conduit/TokenGiveConduitAPIMethod.php',
|
|
|
|
'TokenGivenConduitAPIMethod' => 'applications/tokens/conduit/TokenGivenConduitAPIMethod.php',
|
|
|
|
'TokenQueryConduitAPIMethod' => 'applications/tokens/conduit/TokenQueryConduitAPIMethod.php',
|
|
|
|
'UserConduitAPIMethod' => 'applications/people/conduit/UserConduitAPIMethod.php',
|
|
|
|
'UserDisableConduitAPIMethod' => 'applications/people/conduit/UserDisableConduitAPIMethod.php',
|
|
|
|
'UserEnableConduitAPIMethod' => 'applications/people/conduit/UserEnableConduitAPIMethod.php',
|
|
|
|
'UserFindConduitAPIMethod' => 'applications/people/conduit/UserFindConduitAPIMethod.php',
|
|
|
|
'UserQueryConduitAPIMethod' => 'applications/people/conduit/UserQueryConduitAPIMethod.php',
|
|
|
|
'UserWhoAmIConduitAPIMethod' => 'applications/people/conduit/UserWhoAmIConduitAPIMethod.php',
|
2011-01-16 22:51:39 +01:00
|
|
|
),
|
2014-07-17 23:48:54 +02:00
|
|
|
'function' => array(
|
2014-10-13 20:17:23 +02:00
|
|
|
'celerity_generate_unique_node_id' => 'applications/celerity/api.php',
|
|
|
|
'celerity_get_resource_uri' => 'applications/celerity/api.php',
|
2013-01-29 20:05:02 +01:00
|
|
|
'javelin_tag' => 'infrastructure/javelin/markup.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'phabricator_date' => 'view/viewutils.php',
|
|
|
|
'phabricator_datetime' => 'view/viewutils.php',
|
2013-01-30 20:24:30 +01:00
|
|
|
'phabricator_form' => 'infrastructure/javelin/markup.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'phabricator_format_local_time' => 'view/viewutils.php',
|
|
|
|
'phabricator_relative_date' => 'view/viewutils.php',
|
|
|
|
'phabricator_time' => 'view/viewutils.php',
|
2012-12-11 23:00:21 +01:00
|
|
|
'phid_get_subtype' => 'applications/phid/utils.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'phid_get_type' => 'applications/phid/utils.php',
|
|
|
|
'phid_group_by_type' => 'applications/phid/utils.php',
|
2014-10-13 20:17:23 +02:00
|
|
|
'require_celerity_resource' => 'applications/celerity/api.php',
|
2011-01-16 22:51:39 +01:00
|
|
|
),
|
2014-07-17 23:48:54 +02:00
|
|
|
'xmap' => array(
|
2014-10-17 14:04:24 +02:00
|
|
|
'AlmanacAddress' => 'Phobject',
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
'AlmanacBinding' => array(
|
|
|
|
'AlmanacDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-11-06 00:28:36 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'AlmanacPropertyInterface',
|
2015-11-15 21:14:55 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2016-02-26 18:42:23 +01:00
|
|
|
'PhabricatorExtendedPolicyInterface',
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
),
|
2016-02-25 12:52:41 +01:00
|
|
|
'AlmanacBindingDisableController' => 'AlmanacServiceController',
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
'AlmanacBindingEditController' => 'AlmanacServiceController',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacBindingEditor' => 'AlmanacEditor',
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
'AlmanacBindingPHIDType' => 'PhabricatorPHIDType',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacBindingPropertyEditEngine' => 'AlmanacPropertyEditEngine',
|
2014-11-06 00:28:36 +01:00
|
|
|
'AlmanacBindingQuery' => 'AlmanacQuery',
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
'AlmanacBindingTableView' => 'AphrontView',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacBindingTransaction' => 'AlmanacTransaction',
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
'AlmanacBindingTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'AlmanacBindingViewController' => 'AlmanacServiceController',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacBindingsSearchEngineAttachment' => 'AlmanacSearchEngineAttachment',
|
2015-01-13 20:59:23 +01:00
|
|
|
'AlmanacClusterDatabaseServiceType' => 'AlmanacClusterServiceType',
|
2014-12-17 20:10:27 +01:00
|
|
|
'AlmanacClusterRepositoryServiceType' => 'AlmanacClusterServiceType',
|
|
|
|
'AlmanacClusterServiceType' => 'AlmanacServiceType',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacConsoleController' => 'AlmanacController',
|
|
|
|
'AlmanacController' => 'PhabricatorController',
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacCreateDevicesCapability' => 'PhabricatorPolicyCapability',
|
2016-02-21 21:15:57 +01:00
|
|
|
'AlmanacCreateNamespacesCapability' => 'PhabricatorPolicyCapability',
|
2014-10-17 14:04:02 +02:00
|
|
|
'AlmanacCreateNetworksCapability' => 'PhabricatorPolicyCapability',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacCreateServicesCapability' => 'PhabricatorPolicyCapability',
|
2014-12-17 20:10:27 +01:00
|
|
|
'AlmanacCustomServiceType' => 'AlmanacServiceType',
|
2014-10-03 14:52:41 +02:00
|
|
|
'AlmanacDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'AlmanacDevice' => array(
|
|
|
|
'AlmanacDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-11-06 00:28:36 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-11-06 00:30:00 +01:00
|
|
|
'PhabricatorProjectInterface',
|
2014-11-11 17:20:08 +01:00
|
|
|
'PhabricatorSSHPublicKeyInterface',
|
2014-11-06 00:28:36 +01:00
|
|
|
'AlmanacPropertyInterface',
|
2014-12-22 21:50:44 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2016-02-21 11:48:10 +01:00
|
|
|
'PhabricatorNgramsInterface',
|
2016-02-22 21:53:40 +01:00
|
|
|
'PhabricatorConduitResultInterface',
|
2016-02-26 18:42:23 +01:00
|
|
|
'PhabricatorExtendedPolicyInterface',
|
2014-10-03 14:52:41 +02:00
|
|
|
),
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacDeviceController' => 'AlmanacController',
|
|
|
|
'AlmanacDeviceEditController' => 'AlmanacDeviceController',
|
2016-03-05 01:14:27 +01:00
|
|
|
'AlmanacDeviceEditEngine' => 'PhabricatorEditEngine',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacDeviceEditor' => 'AlmanacEditor',
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacDeviceListController' => 'AlmanacDeviceController',
|
2016-02-21 11:48:10 +01:00
|
|
|
'AlmanacDeviceNameNgrams' => 'PhabricatorSearchNgrams',
|
2014-10-03 14:52:41 +02:00
|
|
|
'AlmanacDevicePHIDType' => 'PhabricatorPHIDType',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacDevicePropertyEditEngine' => 'AlmanacPropertyEditEngine',
|
2014-11-06 00:28:36 +01:00
|
|
|
'AlmanacDeviceQuery' => 'AlmanacQuery',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacDeviceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacDeviceSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacDeviceTransaction' => 'AlmanacTransaction',
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacDeviceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'AlmanacDeviceViewController' => 'AlmanacDeviceController',
|
2015-09-21 13:41:23 +02:00
|
|
|
'AlmanacDrydockPoolServiceType' => 'AlmanacServiceType',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-10-17 14:04:24 +02:00
|
|
|
'AlmanacInterface' => array(
|
|
|
|
'AlmanacDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-12-22 21:50:44 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2016-02-25 12:52:41 +01:00
|
|
|
'PhabricatorExtendedPolicyInterface',
|
2014-10-17 14:04:24 +02:00
|
|
|
),
|
Add AlmanacBinding, to bind a service to an interface
Summary: Ref T5833. Allows you to bind a service (like `db.example.com`) to one or more interfaces (for example, to specify a pool with one read/write host and two read-only hosts). You can't configure which hosts have which properties yet, but you can add all the relevant interfaces to the service. Next diff will start supporting service, binding, and device properties like "is writable", "is active", etc., so that Almanac will be able to express operations like "change which database is writable", "disable writes", "bring a device down", etc.
Test Plan: See screenshots.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10745
2014-10-27 21:39:36 +01:00
|
|
|
'AlmanacInterfaceDatasource' => 'PhabricatorTypeaheadDatasource',
|
2016-02-25 12:52:41 +01:00
|
|
|
'AlmanacInterfaceDeleteController' => 'AlmanacDeviceController',
|
2014-10-17 14:04:24 +02:00
|
|
|
'AlmanacInterfaceEditController' => 'AlmanacDeviceController',
|
|
|
|
'AlmanacInterfacePHIDType' => 'PhabricatorPHIDType',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacInterfaceQuery' => 'AlmanacQuery',
|
2014-10-17 14:04:24 +02:00
|
|
|
'AlmanacInterfaceTableView' => 'AphrontView',
|
2015-01-03 00:13:30 +01:00
|
|
|
'AlmanacKeys' => 'Phobject',
|
2016-02-26 18:42:23 +01:00
|
|
|
'AlmanacManageClusterServicesCapability' => 'PhabricatorPolicyCapability',
|
2015-01-03 00:13:30 +01:00
|
|
|
'AlmanacManagementRegisterWorkflow' => 'AlmanacManagementWorkflow',
|
2014-11-21 02:33:30 +01:00
|
|
|
'AlmanacManagementTrustKeyWorkflow' => 'AlmanacManagementWorkflow',
|
|
|
|
'AlmanacManagementUntrustKeyWorkflow' => 'AlmanacManagementWorkflow',
|
2014-10-03 14:52:41 +02:00
|
|
|
'AlmanacManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2014-10-17 14:02:14 +02:00
|
|
|
'AlmanacNames' => 'Phobject',
|
|
|
|
'AlmanacNamesTestCase' => 'PhabricatorTestCase',
|
2016-02-21 21:15:57 +01:00
|
|
|
'AlmanacNamespace' => array(
|
|
|
|
'AlmanacDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorProjectInterface',
|
|
|
|
'AlmanacPropertyInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
|
|
|
'PhabricatorNgramsInterface',
|
|
|
|
),
|
|
|
|
'AlmanacNamespaceController' => 'AlmanacController',
|
2016-02-22 14:11:02 +01:00
|
|
|
'AlmanacNamespaceEditController' => 'AlmanacNamespaceController',
|
2016-02-21 21:15:57 +01:00
|
|
|
'AlmanacNamespaceEditEngine' => 'PhabricatorEditEngine',
|
|
|
|
'AlmanacNamespaceEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'AlmanacNamespaceListController' => 'AlmanacNamespaceController',
|
|
|
|
'AlmanacNamespaceNameNgrams' => 'PhabricatorSearchNgrams',
|
|
|
|
'AlmanacNamespacePHIDType' => 'PhabricatorPHIDType',
|
2016-02-21 23:34:03 +01:00
|
|
|
'AlmanacNamespaceQuery' => 'AlmanacQuery',
|
2016-02-21 21:15:57 +01:00
|
|
|
'AlmanacNamespaceSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'AlmanacNamespaceTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'AlmanacNamespaceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'AlmanacNamespaceViewController' => 'AlmanacNamespaceController',
|
2014-10-17 14:04:02 +02:00
|
|
|
'AlmanacNetwork' => array(
|
|
|
|
'AlmanacDAO',
|
Transactions - deploy buildTransactionTimeline against a few more applications
Summary:
Ref T4712. Thus far, it seems that most "non-standard" things can be done pretty easily in the controller. Aside from deploying, this diff had to fix a few bugs / missing implementations of stuff.
(Notably, PhabricatorAuthProviderConfig, HeraldRule, PhabricatorSlowvotePoll, and AlmanacNetwork needed to implement PhabricatorApplicationTransactionInterface, PhabricatorAuthAuthProviderPHIDType had to be added, and a rendering bug in transactions of type PhabricatorOAuth2AuthProvider had to be fixed.)
Test Plan: Almanac - looked at binding, device, network, and service view controllers and verified timeline displayed properly. Herald - looked at a rule and verified timeline. Slowvote - looked at a vote and verified timeline. Auth - looked at an auth provider (Facebook) and verified proper display of transactions within timeline.
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10921
2014-12-02 23:33:59 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-10-17 14:04:02 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
2014-12-22 21:50:44 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2016-02-21 20:13:08 +01:00
|
|
|
'PhabricatorNgramsInterface',
|
2014-10-17 14:04:02 +02:00
|
|
|
),
|
|
|
|
'AlmanacNetworkController' => 'AlmanacController',
|
|
|
|
'AlmanacNetworkEditController' => 'AlmanacNetworkController',
|
2016-02-22 14:11:02 +01:00
|
|
|
'AlmanacNetworkEditEngine' => 'PhabricatorEditEngine',
|
2014-10-17 14:04:02 +02:00
|
|
|
'AlmanacNetworkEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'AlmanacNetworkListController' => 'AlmanacNetworkController',
|
2016-02-21 20:13:08 +01:00
|
|
|
'AlmanacNetworkNameNgrams' => 'PhabricatorSearchNgrams',
|
2014-10-17 14:04:02 +02:00
|
|
|
'AlmanacNetworkPHIDType' => 'PhabricatorPHIDType',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacNetworkQuery' => 'AlmanacQuery',
|
2014-10-17 14:04:02 +02:00
|
|
|
'AlmanacNetworkSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'AlmanacNetworkTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'AlmanacNetworkTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'AlmanacNetworkViewController' => 'AlmanacNetworkController',
|
2015-12-20 16:44:03 +01:00
|
|
|
'AlmanacPropertiesDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacPropertiesSearchEngineAttachment' => 'AlmanacSearchEngineAttachment',
|
Give Almanac generic, custom-field-based properties
Summary:
Ref T5833. Currently, we have an `AlmanacDeviceProperty`, but it doesn't use CustomFields and is specific to devices. Make this more generic:
- Reuse most of the CustomField infrastructure (so we can eventually get easy support for nice editor UIs, etc).
- Make properties more generic so Services, Bindings and Devices can all have them.
The major difference between this implementation and existing CustomField implementations is that all other implementations are application-authoritative: the application code determines what the available list of fields is.
I want Almanac to be a bit more freeform (basically: you can write whatever properties you want, and we'll put nice UIs on them if we have a nice UI available). For example, we might have some sort of "ServiceTemplate" that says "a database binding should usually have the fields 'writable', 'active', 'credential'", which would do things like offer these as options and put a nice UI on them, but you should also be able to write whatever other properties you want and add services without building a specific service template for them.
This involves a little bit of rule bending, but ends up pretty clean. We can adjust CustomField to accommodate this a bit more gracefully later on if it makes sense.
Test Plan: {F229172}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10777
2014-11-06 00:27:16 +01:00
|
|
|
'AlmanacProperty' => array(
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacDAO',
|
Give Almanac generic, custom-field-based properties
Summary:
Ref T5833. Currently, we have an `AlmanacDeviceProperty`, but it doesn't use CustomFields and is specific to devices. Make this more generic:
- Reuse most of the CustomField infrastructure (so we can eventually get easy support for nice editor UIs, etc).
- Make properties more generic so Services, Bindings and Devices can all have them.
The major difference between this implementation and existing CustomField implementations is that all other implementations are application-authoritative: the application code determines what the available list of fields is.
I want Almanac to be a bit more freeform (basically: you can write whatever properties you want, and we'll put nice UIs on them if we have a nice UI available). For example, we might have some sort of "ServiceTemplate" that says "a database binding should usually have the fields 'writable', 'active', 'credential'", which would do things like offer these as options and put a nice UI on them, but you should also be able to write whatever other properties you want and add services without building a specific service template for them.
This involves a little bit of rule bending, but ends up pretty clean. We can adjust CustomField to accommodate this a bit more gracefully later on if it makes sense.
Test Plan: {F229172}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10777
2014-11-06 00:27:16 +01:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'AlmanacPropertyController' => 'AlmanacController',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacPropertyDeleteController' => 'AlmanacPropertyController',
|
|
|
|
'AlmanacPropertyEditController' => 'AlmanacPropertyController',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacPropertyEditEngine' => 'PhabricatorEditEngine',
|
Give Almanac generic, custom-field-based properties
Summary:
Ref T5833. Currently, we have an `AlmanacDeviceProperty`, but it doesn't use CustomFields and is specific to devices. Make this more generic:
- Reuse most of the CustomField infrastructure (so we can eventually get easy support for nice editor UIs, etc).
- Make properties more generic so Services, Bindings and Devices can all have them.
The major difference between this implementation and existing CustomField implementations is that all other implementations are application-authoritative: the application code determines what the available list of fields is.
I want Almanac to be a bit more freeform (basically: you can write whatever properties you want, and we'll put nice UIs on them if we have a nice UI available). For example, we might have some sort of "ServiceTemplate" that says "a database binding should usually have the fields 'writable', 'active', 'credential'", which would do things like offer these as options and put a nice UI on them, but you should also be able to write whatever other properties you want and add services without building a specific service template for them.
This involves a little bit of rule bending, but ends up pretty clean. We can adjust CustomField to accommodate this a bit more gracefully later on if it makes sense.
Test Plan: {F229172}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10777
2014-11-06 00:27:16 +01:00
|
|
|
'AlmanacPropertyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-11-06 00:28:36 +01:00
|
|
|
'AlmanacQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-11-06 00:30:00 +01:00
|
|
|
'AlmanacSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacService' => array(
|
|
|
|
'AlmanacDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
Give Almanac generic, custom-field-based properties
Summary:
Ref T5833. Currently, we have an `AlmanacDeviceProperty`, but it doesn't use CustomFields and is specific to devices. Make this more generic:
- Reuse most of the CustomField infrastructure (so we can eventually get easy support for nice editor UIs, etc).
- Make properties more generic so Services, Bindings and Devices can all have them.
The major difference between this implementation and existing CustomField implementations is that all other implementations are application-authoritative: the application code determines what the available list of fields is.
I want Almanac to be a bit more freeform (basically: you can write whatever properties you want, and we'll put nice UIs on them if we have a nice UI available). For example, we might have some sort of "ServiceTemplate" that says "a database binding should usually have the fields 'writable', 'active', 'credential'", which would do things like offer these as options and put a nice UI on them, but you should also be able to write whatever other properties you want and add services without building a specific service template for them.
This involves a little bit of rule bending, but ends up pretty clean. We can adjust CustomField to accommodate this a bit more gracefully later on if it makes sense.
Test Plan: {F229172}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10777
2014-11-06 00:27:16 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-11-06 00:30:00 +01:00
|
|
|
'PhabricatorProjectInterface',
|
Give Almanac generic, custom-field-based properties
Summary:
Ref T5833. Currently, we have an `AlmanacDeviceProperty`, but it doesn't use CustomFields and is specific to devices. Make this more generic:
- Reuse most of the CustomField infrastructure (so we can eventually get easy support for nice editor UIs, etc).
- Make properties more generic so Services, Bindings and Devices can all have them.
The major difference between this implementation and existing CustomField implementations is that all other implementations are application-authoritative: the application code determines what the available list of fields is.
I want Almanac to be a bit more freeform (basically: you can write whatever properties you want, and we'll put nice UIs on them if we have a nice UI available). For example, we might have some sort of "ServiceTemplate" that says "a database binding should usually have the fields 'writable', 'active', 'credential'", which would do things like offer these as options and put a nice UI on them, but you should also be able to write whatever other properties you want and add services without building a specific service template for them.
This involves a little bit of rule bending, but ends up pretty clean. We can adjust CustomField to accommodate this a bit more gracefully later on if it makes sense.
Test Plan: {F229172}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10777
2014-11-06 00:27:16 +01:00
|
|
|
'AlmanacPropertyInterface',
|
2014-12-22 21:50:44 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2016-02-21 19:52:19 +01:00
|
|
|
'PhabricatorNgramsInterface',
|
2016-02-22 21:53:40 +01:00
|
|
|
'PhabricatorConduitResultInterface',
|
2016-02-26 18:42:23 +01:00
|
|
|
'PhabricatorExtendedPolicyInterface',
|
2014-10-17 14:01:57 +02:00
|
|
|
),
|
|
|
|
'AlmanacServiceController' => 'AlmanacController',
|
2014-12-19 21:36:14 +01:00
|
|
|
'AlmanacServiceDatasource' => 'PhabricatorTypeaheadDatasource',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServiceEditController' => 'AlmanacServiceController',
|
2016-03-05 01:08:38 +01:00
|
|
|
'AlmanacServiceEditEngine' => 'PhabricatorEditEngine',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacServiceEditor' => 'AlmanacEditor',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServiceListController' => 'AlmanacServiceController',
|
2016-02-21 19:52:19 +01:00
|
|
|
'AlmanacServiceNameNgrams' => 'PhabricatorSearchNgrams',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServicePHIDType' => 'PhabricatorPHIDType',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacServicePropertyEditEngine' => 'AlmanacPropertyEditEngine',
|
2014-11-06 00:28:36 +01:00
|
|
|
'AlmanacServiceQuery' => 'AlmanacQuery',
|
2016-02-22 21:53:40 +01:00
|
|
|
'AlmanacServiceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServiceSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacServiceTransaction' => 'AlmanacTransaction',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServiceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-12-17 20:10:27 +01:00
|
|
|
'AlmanacServiceType' => 'Phobject',
|
Store Almanac "service types" instead of "service classes"
Summary:
Ref T10449. Currently, we store classes (like "AlmanacClusterRepositoryServiceType") in the database.
Instead, store types (like "cluster.repository").
This is a small change, but types are a little more flexible (they let us freely reanme classes), a little cleaner (fewer magic strings in the codebase), and a little better for API usage (they're more human readable).
Make this minor usability change now, before we unprototype.
Also make services searchable by type.
Also remove old Almanac API endpoints.
Test Plan:
- Ran migration, verified all data migrated properly.
- Created, edited, rebound, and changed properties of services.
- Searched for services by service type.
- Reviewed available Conduit methods.
Reviewers: chad
Reviewed By: chad
Subscribers: yelirekim
Maniphest Tasks: T10449
Differential Revision: https://secure.phabricator.com/D15346
2016-02-25 14:05:36 +01:00
|
|
|
'AlmanacServiceTypeDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-06-15 10:07:06 +02:00
|
|
|
'AlmanacServiceTypeTestCase' => 'PhabricatorTestCase',
|
2014-10-17 14:01:57 +02:00
|
|
|
'AlmanacServiceViewController' => 'AlmanacServiceController',
|
2016-02-22 15:35:30 +01:00
|
|
|
'AlmanacTransaction' => 'PhabricatorApplicationTransaction',
|
2015-06-15 10:02:26 +02:00
|
|
|
'AphlictDropdownDataQuery' => 'Phobject',
|
2011-05-09 10:10:40 +02:00
|
|
|
'Aphront304Response' => 'AphrontResponse',
|
2011-01-30 21:08:40 +01:00
|
|
|
'Aphront400Response' => 'AphrontResponse',
|
2012-11-29 08:57:13 +01:00
|
|
|
'Aphront403Response' => 'AphrontHTMLResponse',
|
|
|
|
'Aphront404Response' => 'AphrontHTMLResponse',
|
2011-01-25 20:57:47 +01:00
|
|
|
'AphrontAjaxResponse' => 'AphrontResponse',
|
2015-06-15 10:02:26 +02:00
|
|
|
'AphrontApplicationConfiguration' => 'Phobject',
|
2013-03-05 17:46:09 +01:00
|
|
|
'AphrontBarView' => 'AphrontView',
|
2015-12-02 14:55:31 +01:00
|
|
|
'AphrontBoolHTTPParameterType' => 'AphrontHTTPParameterType',
|
Fix conservative CSRF token cycling limit
Summary:
We currently cycle CSRF tokens every hour and check for the last two valid ones.
This means that a form could go stale in as little as an hour, and is certainly
stale after two.
When a stale form is submitted, you basically get a terrible heisen-state where
some of your data might persist if you're lucky but more likely it all just
vanishes. The .js file below outlines some more details.
This is a pretty terrible UX and we don't need to be as conservative about CSRF
validation as we're being. Remedy this problem by:
- Accepting the last 6 CSRF tokens instead of the last 1 (i.e., pages are
valid for at least 6 hours, and for as long as 7).
- Using JS to refresh the CSRF token every 55 minutes (i.e., pages connected
to the internet are valid indefinitely).
- Showing the user an explicit message about what went wrong when CSRF
validation fails so the experience is less bewildering.
They should now only be able to submit with a bad CSRF token if:
- They load a page, disconnect from the internet for 7 hours, reconnect, and
submit the form within 55 minutes; or
- They are actually the victim of a CSRF attack.
We could eventually fix the first one by tracking reconnects, which might be
"free" once the notification server gets built. It will probably never be an
issue in practice.
Test Plan:
- Reduced CSRF cycle frequency to 2 seconds, submitted a form after 15
seconds, got the CSRF exception.
- Reduced csrf-refresh cycle frequency to 3 seconds, submitted a form after 15
seconds, got a clean form post.
- Added debugging code the the csrf refresh to make sure it was doing sensible
things (pulling different tokens, finding all the inputs).
Reviewed By: aran
Reviewers: tuomaspelkonen, jungejason, aran
CC: aran, epriestley
Differential Revision: 660
2011-07-13 23:05:18 +02:00
|
|
|
'AphrontCSRFException' => 'AphrontException',
|
2012-05-21 19:24:23 +02:00
|
|
|
'AphrontCalendarEventView' => 'AphrontView',
|
2012-12-19 01:11:07 +01:00
|
|
|
'AphrontController' => 'Phobject',
|
Rename "IDPaged" to "CursorPaged", "executeWithPager" to "executeWith[Cursor|Offset]Pager"
Summary:
I'm trying to make progress on the policy/visibility stuff since it's a blocker for Wikimedia.
First, I want to improve Projects so they can serve as policy groups (e.g., an object can have a visibility policy like "Visible to: members of project 'security'"). However, doing this without breaking anything or snowballing into a bigger change is a bit awkward because Projects are name-ordered and we have a Conduit API which does offset paging. Rather than breaking or rewriting this stuff, I want to just continue offset paging them for now.
So I'm going to make PhabricatorPolicyQuery extend PhabricatorOffsetPagedQuery, but can't currently since the `executeWithPager` methods would clash. These methods do different things anyway and are probably better with different names.
This also generally improves the names of these classes, since cursors are not necessarily IDs (in the feed case, they're "chronlogicalKeys", for example). I did leave some of the interals as "ID" since calling them "Cursor"s (e.g., `setAfterCursor()`) seemed a little wrong -- it should maybe be `setAfterCursorPosition()`. These APIs have very limited use and can easily be made more consistent later.
Test Plan: Browsed around various affected tools; any issues here should throw/fail in a loud/obvious way.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran
Maniphest Tasks: T603
Differential Revision: https://secure.phabricator.com/D3177
2012-08-07 20:54:06 +02:00
|
|
|
'AphrontCursorPagerView' => 'AphrontView',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontDefaultApplicationConfiguration' => 'AphrontApplicationConfiguration',
|
|
|
|
'AphrontDialogResponse' => 'AphrontResponse',
|
2015-09-02 00:52:52 +02:00
|
|
|
'AphrontDialogView' => array(
|
|
|
|
'AphrontView',
|
|
|
|
'AphrontResponseProducerInterface',
|
|
|
|
),
|
2016-04-07 20:06:26 +02:00
|
|
|
'AphrontEpochHTTPParameterType' => 'AphrontHTTPParameterType',
|
2012-05-30 23:26:29 +02:00
|
|
|
'AphrontException' => 'Exception',
|
2011-01-23 03:33:00 +01:00
|
|
|
'AphrontFileResponse' => 'AphrontResponse',
|
2011-01-26 02:40:21 +01:00
|
|
|
'AphrontFormCheckboxControl' => 'AphrontFormControl',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontFormControl' => 'AphrontView',
|
2012-04-04 21:14:10 +02:00
|
|
|
'AphrontFormDateControl' => 'AphrontFormControl',
|
2015-05-02 01:07:57 +02:00
|
|
|
'AphrontFormDateControlValue' => 'Phobject',
|
2011-02-05 02:53:14 +01:00
|
|
|
'AphrontFormDividerControl' => 'AphrontFormControl',
|
2011-01-23 03:33:00 +01:00
|
|
|
'AphrontFormFileControl' => 'AphrontFormControl',
|
2015-12-08 16:54:01 +01:00
|
|
|
'AphrontFormHandlesControl' => 'AphrontFormControl',
|
2011-01-24 20:36:53 +01:00
|
|
|
'AphrontFormMarkupControl' => 'AphrontFormControl',
|
2011-01-31 20:55:26 +01:00
|
|
|
'AphrontFormPasswordControl' => 'AphrontFormControl',
|
Add basic per-object privacy policies
Summary:
Provides a basic start for access policies. Objects expose various capabilities, like CAN_VIEW, CAN_EDIT, etc., and set a policy for each capability. We currently implement three policies, PUBLIC (anyone, including logged-out), USERS (any logged-in) and NOONE (nobody). There's also a way to provide automatic capability grants (e.g., the owner of an object can always see it, even if some capability is set to "NOONE"), but I'm not sure how great the implementation feels and it might change.
Most of the code here is providing a primitive for efficient policy-aware list queries. The problem with doing queries naively is that you have to do crazy amounts of filtering, e.g. to show the user page 6, you need to filter at least 600 objects (and likely more) before you can figure out which ones are 500-600 for them. You can't just do "LIMIT 500, 100" because that might have only 50 results, or no results. Instead, the query looks like "WHERE id > last_visible_id", and then we fetch additional pages as necessary to satisfy the request.
The general idea is that we move all data access to Query classes and have them do object filtering. The ID paging primitive allows efficient paging in most cases, and the executeOne() method provides a concise way to do policy checks for edit/view screens.
We'll probably end up with mostly broader policy UIs or configuration-based policies, but there are at least a few cases for per-object privacy (e.g., marking tasks as "Security", and restricting things to the members of projects) so I figured we'd start with a flexible primitive and the simplify it in the UI where we can.
Test Plan: Unit tests, played around in the UI with various policy settings.
Reviewers: btrahan, vrana, jungejason
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T603
Differential Revision: https://secure.phabricator.com/D2210
2012-04-14 19:13:29 +02:00
|
|
|
'AphrontFormPolicyControl' => 'AphrontFormControl',
|
Improve Herald personal/global UI/UX
Summary:
- Default "personal" vs "global" choice to "personal".
- Don't show global rules under "My Rules".
- After editing or creating a global rule, redirect back to global rule list.
- Use radio buttons for "personal" vs "global" and add captions explaining the
difference.
- For "global" rules, don't show the owner/author in the rule detail view --
they effectively have no owner (see also D1387).
- For "global" rules, don't show the owner/author in the rule list view, as
above.
- For admin views, show rule type (global vs personal).
Test Plan:
- Created and edited new global and personal rules.
- Viewed "my", "global" and "admin" views.
Reviewers: btrahan, jungejason, nh, xela
Reviewed By: btrahan
CC: aran, epriestley
Differential Revision: https://secure.phabricator.com/D1518
2012-01-31 21:09:29 +01:00
|
|
|
'AphrontFormRadioButtonControl' => 'AphrontFormControl',
|
2011-01-31 20:55:26 +01:00
|
|
|
'AphrontFormRecaptchaControl' => 'AphrontFormControl',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontFormSelectControl' => 'AphrontFormControl',
|
2011-01-23 03:33:00 +01:00
|
|
|
'AphrontFormStaticControl' => 'AphrontFormControl',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontFormSubmitControl' => 'AphrontFormControl',
|
|
|
|
'AphrontFormTextAreaControl' => 'AphrontFormControl',
|
|
|
|
'AphrontFormTextControl' => 'AphrontFormControl',
|
2014-02-01 20:48:28 +01:00
|
|
|
'AphrontFormTextWithSubmitControl' => 'AphrontFormControl',
|
2011-01-25 22:48:05 +01:00
|
|
|
'AphrontFormTokenizerControl' => 'AphrontFormControl',
|
2014-05-13 23:08:21 +02:00
|
|
|
'AphrontFormTypeaheadControl' => 'AphrontFormControl',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontFormView' => 'AphrontView',
|
2013-03-05 17:46:09 +01:00
|
|
|
'AphrontGlyphBarView' => 'AphrontBarView',
|
2012-11-29 08:57:13 +01:00
|
|
|
'AphrontHTMLResponse' => 'AphrontResponse',
|
2015-11-04 14:05:10 +01:00
|
|
|
'AphrontHTTPParameterType' => 'Phobject',
|
2015-01-27 23:50:52 +01:00
|
|
|
'AphrontHTTPProxyResponse' => 'AphrontResponse',
|
2015-06-15 10:02:26 +02:00
|
|
|
'AphrontHTTPSink' => 'Phobject',
|
2012-02-06 18:59:34 +01:00
|
|
|
'AphrontHTTPSinkTestCase' => 'PhabricatorTestCase',
|
2015-12-02 14:55:31 +01:00
|
|
|
'AphrontIntHTTPParameterType' => 'AphrontHTTPParameterType',
|
2011-04-30 19:11:41 +02:00
|
|
|
'AphrontIsolatedDatabaseConnectionTestCase' => 'PhabricatorTestCase',
|
2012-02-06 18:59:34 +01:00
|
|
|
'AphrontIsolatedHTTPSink' => 'AphrontHTTPSink',
|
2012-02-14 23:51:51 +01:00
|
|
|
'AphrontJSONResponse' => 'AphrontResponse',
|
2011-09-07 23:01:13 +02:00
|
|
|
'AphrontJavelinView' => 'AphrontView',
|
2011-06-08 20:53:10 +02:00
|
|
|
'AphrontKeyboardShortcutsAvailableView' => 'AphrontView',
|
2011-04-04 00:50:06 +02:00
|
|
|
'AphrontListFilterView' => 'AphrontView',
|
2015-11-29 22:24:47 +01:00
|
|
|
'AphrontListHTTPParameterType' => 'AphrontHTTPParameterType',
|
2015-09-03 19:04:17 +02:00
|
|
|
'AphrontMalformedRequestException' => 'AphrontException',
|
2012-05-10 00:56:37 +02:00
|
|
|
'AphrontMoreView' => 'AphrontView',
|
2013-04-02 20:23:24 +02:00
|
|
|
'AphrontMultiColumnView' => 'AphrontView',
|
2012-02-07 23:58:37 +01:00
|
|
|
'AphrontMySQLDatabaseConnectionTestCase' => 'PhabricatorTestCase',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontNullView' => 'AphrontView',
|
2015-11-04 14:05:10 +01:00
|
|
|
'AphrontPHIDHTTPParameterType' => 'AphrontHTTPParameterType',
|
2015-11-29 22:24:47 +01:00
|
|
|
'AphrontPHIDListHTTPParameterType' => 'AphrontListHTTPParameterType',
|
2012-02-06 18:59:34 +01:00
|
|
|
'AphrontPHPHTTPSink' => 'AphrontHTTPSink',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontPageView' => 'AphrontView',
|
2012-01-15 20:06:13 +01:00
|
|
|
'AphrontPlainTextResponse' => 'AphrontResponse',
|
2013-03-05 17:46:09 +01:00
|
|
|
'AphrontProgressBarView' => 'AphrontBarView',
|
2015-11-29 22:24:47 +01:00
|
|
|
'AphrontProjectListHTTPParameterType' => 'AphrontListHTTPParameterType',
|
2015-09-02 00:52:52 +02:00
|
|
|
'AphrontProxyResponse' => array(
|
|
|
|
'AphrontResponse',
|
|
|
|
'AphrontResponseProducerInterface',
|
|
|
|
),
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontRedirectResponse' => 'AphrontResponse',
|
2014-08-18 23:11:06 +02:00
|
|
|
'AphrontRedirectResponseTestCase' => 'PhabricatorTestCase',
|
2011-05-16 20:43:39 +02:00
|
|
|
'AphrontReloadResponse' => 'AphrontRedirectResponse',
|
2015-06-15 10:02:26 +02:00
|
|
|
'AphrontRequest' => 'Phobject',
|
2015-09-03 19:04:42 +02:00
|
|
|
'AphrontRequestExceptionHandler' => 'Phobject',
|
2012-01-04 06:57:45 +01:00
|
|
|
'AphrontRequestTestCase' => 'PhabricatorTestCase',
|
2015-06-15 10:02:26 +02:00
|
|
|
'AphrontResponse' => 'Phobject',
|
2015-08-31 13:01:01 +02:00
|
|
|
'AphrontRoutingMap' => 'Phobject',
|
|
|
|
'AphrontRoutingResult' => 'Phobject',
|
2015-11-04 14:05:10 +01:00
|
|
|
'AphrontSelectHTTPParameterType' => 'AphrontHTTPParameterType',
|
2011-12-17 02:08:18 +01:00
|
|
|
'AphrontSideNavFilterView' => 'AphrontView',
|
2015-06-29 23:04:48 +02:00
|
|
|
'AphrontSite' => 'Phobject',
|
2013-11-21 23:38:29 +01:00
|
|
|
'AphrontStackTraceView' => 'AphrontView',
|
Improve top-level exception handling
Summary:
Fixes T6692. Addresses two main issues:
- The write guard would sometimes not get disposed of on exception pathways, generating an unnecessary secondary error which was just a symptom of the original root error.
- This was generally confusing and reduced the quality of reports we received because users would report the symptomatic error sometimes instead of the real error.
- Instead, reflow the handling so that we always dispose of the write guard if we create one.
- If we missed the Controller-level error page generation (normally, a nice page with full CSS, etc), we'd jump straight to Startup-level error page generation (very basic plain text).
- A large class of errors occur too early or too late to be handled by Controller-level pages, but many of these errors are not fundamental, and the plain text page is excessively severe.
- Provide a mid-level simple HTML error page for errors which can't get full CSS, but also aren't so fundamental that we have no recourse but plain text.
Test Plan:
Mid-level errors now produce an intentional-looking error page:
{F259885}
Verified that setup errors still render properly.
@chad, feel free to tweak the exception page -- I just did a rough pass on it. Like the setup error stuff, it doesn't have Celerity, so we can't use `{$colors}` and no other CSS will be loaded.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley, chad
Maniphest Tasks: T6692
Differential Revision: https://secure.phabricator.com/D11126
2015-01-02 19:49:27 +01:00
|
|
|
'AphrontStandaloneHTMLResponse' => 'AphrontHTMLResponse',
|
2015-11-04 14:05:10 +01:00
|
|
|
'AphrontStringHTTPParameterType' => 'AphrontHTTPParameterType',
|
2015-11-29 22:24:47 +01:00
|
|
|
'AphrontStringListHTTPParameterType' => 'AphrontListHTTPParameterType',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontTableView' => 'AphrontView',
|
2013-01-16 19:50:41 +01:00
|
|
|
'AphrontTagView' => 'AphrontView',
|
2011-03-23 04:41:02 +01:00
|
|
|
'AphrontTokenizerTemplateView' => 'AphrontView',
|
2011-04-04 04:20:47 +02:00
|
|
|
'AphrontTypeaheadTemplateView' => 'AphrontView',
|
Improve top-level exception handling
Summary:
Fixes T6692. Addresses two main issues:
- The write guard would sometimes not get disposed of on exception pathways, generating an unnecessary secondary error which was just a symptom of the original root error.
- This was generally confusing and reduced the quality of reports we received because users would report the symptomatic error sometimes instead of the real error.
- Instead, reflow the handling so that we always dispose of the write guard if we create one.
- If we missed the Controller-level error page generation (normally, a nice page with full CSS, etc), we'd jump straight to Startup-level error page generation (very basic plain text).
- A large class of errors occur too early or too late to be handled by Controller-level pages, but many of these errors are not fundamental, and the plain text page is excessively severe.
- Provide a mid-level simple HTML error page for errors which can't get full CSS, but also aren't so fundamental that we have no recourse but plain text.
Test Plan:
Mid-level errors now produce an intentional-looking error page:
{F259885}
Verified that setup errors still render properly.
@chad, feel free to tweak the exception page -- I just did a rough pass on it. Like the setup error stuff, it doesn't have Celerity, so we can't use `{$colors}` and no other CSS will be loaded.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley, chad
Maniphest Tasks: T6692
Differential Revision: https://secure.phabricator.com/D11126
2015-01-02 19:49:27 +01:00
|
|
|
'AphrontUnhandledExceptionResponse' => 'AphrontStandaloneHTMLResponse',
|
2015-11-29 22:24:47 +01:00
|
|
|
'AphrontUserListHTTPParameterType' => 'AphrontListHTTPParameterType',
|
2014-07-17 23:48:54 +02:00
|
|
|
'AphrontView' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'Phobject',
|
|
|
|
'PhutilSafeHTMLProducerInterface',
|
2013-03-09 22:52:21 +01:00
|
|
|
),
|
2012-11-29 08:57:13 +01:00
|
|
|
'AphrontWebpageResponse' => 'AphrontHTMLResponse',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ArcanistConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'AuditConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'AuditQueryConduitAPIMethod' => 'AuditConduitAPIMethod',
|
2015-01-12 23:37:58 +01:00
|
|
|
'AuthManageProvidersCapability' => 'PhabricatorPolicyCapability',
|
2015-06-15 10:02:26 +02:00
|
|
|
'CalendarTimeUtil' => 'Phobject',
|
2014-02-25 22:43:31 +01:00
|
|
|
'CalendarTimeUtilTestCase' => 'PhabricatorTestCase',
|
2015-06-15 10:02:26 +02:00
|
|
|
'CelerityAPI' => 'Phobject',
|
2015-06-20 15:10:42 +02:00
|
|
|
'CelerityDefaultPostprocessor' => 'CelerityPostprocessor',
|
|
|
|
'CelerityHighContrastPostprocessor' => 'CelerityPostprocessor',
|
2015-06-26 18:33:03 +02:00
|
|
|
'CelerityLargeFontPostprocessor' => 'CelerityPostprocessor',
|
2014-01-01 03:02:41 +01:00
|
|
|
'CelerityManagementMapWorkflow' => 'CelerityManagementWorkflow',
|
2016-05-05 03:24:59 +02:00
|
|
|
'CelerityManagementSyntaxWorkflow' => 'CelerityManagementWorkflow',
|
2014-01-01 03:02:41 +01:00
|
|
|
'CelerityManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2012-10-17 17:37:05 +02:00
|
|
|
'CelerityPhabricatorResourceController' => 'CelerityResourceController',
|
2014-01-01 03:02:41 +01:00
|
|
|
'CelerityPhabricatorResources' => 'CelerityResourcesOnDisk',
|
2014-01-01 04:21:56 +01:00
|
|
|
'CelerityPhysicalResources' => 'CelerityResources',
|
2015-06-15 10:07:06 +02:00
|
|
|
'CelerityPhysicalResourcesTestCase' => 'PhabricatorTestCase',
|
2015-06-20 15:10:42 +02:00
|
|
|
'CelerityPostprocessor' => 'Phobject',
|
|
|
|
'CelerityPostprocessorTestCase' => 'PhabricatorTestCase',
|
Make CelerityController extend PhabricatorController
Summary:
Currently, CelerityController extends AphrontController, not PhabricatorController. (I think I imagined Celerity being somewhat stand-alone and didn't want to create a dependency.)
This creates a concrete problem if a static resource is missing, since we throw an exception, but the higher-level exception handlers depend on the User existing in order to show an appropriate response page. This is the only controller which doesn't extend PhabricatorController, and it doesn't seem worthwhile to make a weird edge case out of it.
Specific repro case is:
- Remove `externals/javelin/` (or forget to run `git submodule update --init`).
- Load a static resource.
- Get "[Rendering Exception] Argument 1 passed to PhabricatorMainMenuView::setUser() must be an instance of PhabricatorUser, null given, called in /services/apache/phabricator/phabricator/src/view/page/PhabricatorStandardPageView.php on line 435 and defined"
Test Plan:
- Followed above steps, no more fataling.
- Verified this is the only weird controller.
Reviewers: voldern, vrana, btrahan
Reviewed By: voldern
CC: aran
Differential Revision: https://secure.phabricator.com/D3389
2012-08-28 22:46:35 +02:00
|
|
|
'CelerityResourceController' => 'PhabricatorController',
|
2011-11-22 20:36:57 +01:00
|
|
|
'CelerityResourceGraph' => 'AbstractDirectedGraph',
|
2015-06-15 10:02:26 +02:00
|
|
|
'CelerityResourceMap' => 'Phobject',
|
|
|
|
'CelerityResourceMapGenerator' => 'Phobject',
|
|
|
|
'CelerityResourceTransformer' => 'Phobject',
|
Use Celerity to version all static resources
Summary:
We don't use versioned URIs for images, so when they change users may get old versions.
This was a particular issue with the recent logo change, which several users reported cache-related issues from.
Instead, use Celerity to manage image URI versions in addition to CSS/JS.
This is complicated, because we need to rewrite image URIs inside of CSS, which means the hash of a CSS file has to be derived from the current image data. Otherwise, when we updated an image the CSS wouldn't update, so we wouldn't be any better off.
So basically we:
- Find all the "raw" files, and put them into the map.
- Find all the CSS/JS, perform content-altering transformations on it (i.e., not minification) based on the partial map, and then put it into the map based on transformed hashes.
(If we wanted, we could now do CSS variables or whatever for "free", more or less.)
Test Plan:
- Regenerated celerity map, browsed site, verified images generated with versioned URIs.
- Moved "blue" flag image over "green" flag image, regenerated map, verified "green" flag image and the associated CSS changed hashes.
- Added transformation unit tests; ran unit tests.
Reviewers: btrahan, vrana, jungejason
Reviewed By: vrana
CC: aran
Maniphest Tasks: T1073
Differential Revision: https://secure.phabricator.com/D2146
2012-04-08 19:07:51 +02:00
|
|
|
'CelerityResourceTransformerTestCase' => 'PhabricatorTestCase',
|
2015-06-15 10:02:26 +02:00
|
|
|
'CelerityResources' => 'Phobject',
|
2014-01-01 04:21:56 +01:00
|
|
|
'CelerityResourcesOnDisk' => 'CelerityPhysicalResources',
|
2015-06-15 10:02:26 +02:00
|
|
|
'CeleritySpriteGenerator' => 'Phobject',
|
|
|
|
'CelerityStaticResourceResponse' => 'Phobject',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ChatLogConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'ChatLogQueryConduitAPIMethod' => 'ChatLogConduitAPIMethod',
|
|
|
|
'ChatLogRecordConduitAPIMethod' => 'ChatLogConduitAPIMethod',
|
2014-07-17 23:48:54 +02:00
|
|
|
'ConduitAPIMethod' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'Phobject',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-07-01 21:36:34 +02:00
|
|
|
),
|
2015-06-15 10:07:06 +02:00
|
|
|
'ConduitAPIMethodTestCase' => 'PhabricatorTestCase',
|
2015-06-15 10:02:26 +02:00
|
|
|
'ConduitAPIRequest' => 'Phobject',
|
|
|
|
'ConduitAPIResponse' => 'Phobject',
|
2014-07-25 03:24:31 +02:00
|
|
|
'ConduitApplicationNotInstalledException' => 'ConduitMethodNotFoundException',
|
2016-04-27 01:02:57 +02:00
|
|
|
'ConduitBoolParameterType' => 'ConduitParameterType',
|
2015-06-15 10:02:26 +02:00
|
|
|
'ConduitCall' => 'Phobject',
|
Allow applications to call Conduit directly
Summary:
Sorry this took so long, had a bunch of stuff going on today.
Separate the actual core part of making conduit calls from the controller, so the application can make conduit calls without needing to invoke HTTP or redo auth. Generally, this lets us build more parts of the application on top of Conduit, as appropriate.
This diff can be simplified, but I wanted to unblock you guys first. I'll followup with a cleanup patch once I have a chance.
Test Plan: Ran unit tests, ran calls from the conduit API console, and ran calls over arc.
Reviewers: nodren, 20after4, btrahan, vrana
Reviewed By: 20after4
CC: aran, svemir
Maniphest Tasks: T945
Differential Revision: https://secure.phabricator.com/D2718
2012-06-17 17:47:09 +02:00
|
|
|
'ConduitCallTestCase' => 'PhabricatorTestCase',
|
2016-04-06 13:37:01 +02:00
|
|
|
'ConduitColumnsParameterType' => 'ConduitParameterType',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConduitConnectConduitAPIMethod' => 'ConduitAPIMethod',
|
2015-12-13 15:52:37 +01:00
|
|
|
'ConduitEpochParameterType' => 'ConduitListParameterType',
|
2012-05-30 23:26:29 +02:00
|
|
|
'ConduitException' => 'Exception',
|
2014-12-15 20:14:53 +01:00
|
|
|
'ConduitGetCapabilitiesConduitAPIMethod' => 'ConduitAPIMethod',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConduitGetCertificateConduitAPIMethod' => 'ConduitAPIMethod',
|
2015-12-13 16:43:02 +01:00
|
|
|
'ConduitIntListParameterType' => 'ConduitListParameterType',
|
2016-02-09 00:24:52 +01:00
|
|
|
'ConduitIntParameterType' => 'ConduitParameterType',
|
2015-12-13 12:53:15 +01:00
|
|
|
'ConduitListParameterType' => 'ConduitParameterType',
|
2014-01-15 19:02:31 +01:00
|
|
|
'ConduitLogGarbageCollector' => 'PhabricatorGarbageCollector',
|
2014-08-11 21:08:06 +02:00
|
|
|
'ConduitMethodDoesNotExistException' => 'ConduitMethodNotFoundException',
|
2014-07-25 03:24:31 +02:00
|
|
|
'ConduitMethodNotFoundException' => 'ConduitException',
|
2015-12-13 15:52:37 +01:00
|
|
|
'ConduitPHIDListParameterType' => 'ConduitListParameterType',
|
2015-12-28 14:46:22 +01:00
|
|
|
'ConduitPHIDParameterType' => 'ConduitParameterType',
|
2015-12-13 12:53:15 +01:00
|
|
|
'ConduitParameterType' => 'Phobject',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConduitPingConduitAPIMethod' => 'ConduitAPIMethod',
|
2016-02-09 00:24:52 +01:00
|
|
|
'ConduitPointsParameterType' => 'ConduitParameterType',
|
2015-12-13 15:52:37 +01:00
|
|
|
'ConduitProjectListParameterType' => 'ConduitListParameterType',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConduitQueryConduitAPIMethod' => 'ConduitAPIMethod',
|
2015-12-11 17:45:56 +01:00
|
|
|
'ConduitResultSearchEngineExtension' => 'PhabricatorSearchEngineExtension',
|
Implement SSHD glue and Conduit SSH endpoint
Summary:
- Build "sshd-auth" (for authentication) and "sshd-exec" (for command execution) binaries. These are callable by "sshd-vcs", located [[https://github.com/epriestley/sshd-vcs | in my account on GitHub]]. They are based on precursors [[https://github.com/epriestley/sshd-vcs-glue | here on GitHub]] which I deployed for TenXer about a year ago, so I have some confidence they at least basically work.
- The problem this solves is that normally every user would need an account on a machine to connect to it, and/or their public keys would all need to be listed in `~/.authorized_keys`. This is a big pain in most installs. Software like Gitosis/Gitolite solve this problem by giving you an easy way to add public keys to `~/.authorized_keys`, but this is pretty gross.
- Roughly, instead of looking in `~/.authorized_keys` when a user connects, the patched sshd instead runs `echo <public key> | sshd-auth`. The `sshd-auth` script looks up the public key and authorizes the matching user, if they exist. It also forces sshd to run `sshd-exec` instead of a normal shell.
- `sshd-exec` receives the authenticated user and any command which was passed to ssh (like `git receive-pack`) and can route them appropriately.
- Overall, this permits a single account to be set up on a server which all Phabricator users can connect to without any extra work, and which can safely execute commands and apply appropriate permissions, and disable users when they are disabled in Phabricator and all that stuff.
- Build out "sshd-exec" to do more thorough checks and setup, and delegate command execution to Workflows (they now exist, and did not when I originally built this stuff).
- Convert @btrahan's conduit API script into a workflow and slightly simplify it (ConduitCall did not exist at the time it was written).
The next steps here on the Repository side are to implement Workflows for Git, SVN and HG wire protocols. These will mostly just proxy the protocols, but also need to enforce permissions. So the approach will basically be:
- Implement workflows for stuff like `git receive-pack`.
- These workflows will implement enough of the underlying protocol to determine what resource the user is trying to access, and whether they want to read or write it.
- They'll then do a permissons check, and kick the user out if they don't have permission to do whatever they are trying to do.
- If the user does have permission, we just proxy the rest of the transaction.
Next steps on the Conduit side are more simple:
- Make ConduitClient understand "ssh://" URLs.
Test Plan: Ran `sshd-exec --phabricator-ssh-user epriestley conduit differential.query`, etc. This will get a more comprehensive test once I set up sshd-vcs.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T603, T550
Differential Revision: https://secure.phabricator.com/D4229
2012-12-19 20:08:07 +01:00
|
|
|
'ConduitSSHWorkflow' => 'PhabricatorSSHWorkflow',
|
2015-12-13 12:53:15 +01:00
|
|
|
'ConduitStringListParameterType' => 'ConduitListParameterType',
|
2015-12-28 12:57:03 +01:00
|
|
|
'ConduitStringParameterType' => 'ConduitParameterType',
|
Add Conduit Tokens to make authentication in Conduit somewhat more sane
Summary:
Ref T5955. Summary of intended changes:
**Improve Granularity of Authorization**: Currently, users have one Conduit Certificate. This isn't very flexible, and means that you can't ever generate an API token with limited permissions or IP block controls (see T6706). This moves toward a world where you can generate multiple tokens, revoke them individually, and assign disparate privileges to them.
**Standardize Token Management**: This moves Conduit to work the same way that sessions, OAuth authorizations, and temporary tokens already work, instead of being this crazy bizarre mess.
**Make Authentication Faster**: Authentication currently requires a handshake (conduit.connect) to establish a session, like the web UI. This is unnecessary from a security point of view and puts an extra round trip in front of all Conduit activity. Essentially no other API anywhere works like this.
**Make Authentication Simpler**: The handshake is complex, and involves deriving hashes. The session is also complex, and creates issues like T4377. Handshake and session management require different inputs.
**Make Token Management Simpler**: The certificate is this huge long thing right now, which is not necessary from a security perspective. There are separate Arcanist handshake tokens, but they have a different set of issues. We can move forward to a token management world where neither of these problems exist.
**Lower Protocol Barrier**: The simplest possible API client is very complex right now. It should be `curl`. Simplifying authentication is a necessary step toward this.
**Unblock T2783**: T2783 is blocked on nodes in the cluster making authenticated API calls to other nodes. This provides a simpler way forward than the handshake mess (or enormous-hack-mess) which would currently be required.
Test Plan:
- Generated tokens.
- Generated tokens for a bot account.
- Terminated tokens (and for a bot account).
- Terminated all tokens (and for a bot account).
- Ran GC and saw it reap all the expired tokens.
NOTE: These tokens can not actually be used to authenticate yet!
{F249658}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5955
Differential Revision: https://secure.phabricator.com/D10985
2014-12-15 20:14:23 +01:00
|
|
|
'ConduitTokenGarbageCollector' => 'PhabricatorGarbageCollector',
|
2015-12-13 12:53:15 +01:00
|
|
|
'ConduitUserListParameterType' => 'ConduitListParameterType',
|
2016-01-11 12:24:03 +01:00
|
|
|
'ConduitUserParameterType' => 'ConduitParameterType',
|
2015-12-16 14:09:21 +01:00
|
|
|
'ConduitWildParameterType' => 'ConduitListParameterType',
|
Conpherence - make the durable column kind of work and stuff
Summary:
Ref T7014. This hooks up the durable column such that when you open it up it loads your most recent Conpherence. You can then switch amongst the various widgets and stuff and everything works nicely.
Except...
- scroll bar does not work
- also doesn't work at HEAD when I add a ton of text to the UI with no changes? (wrapped $copy in array_fill(0, 1000, $copy))
- "widget selector" does not collapse when you select something else
- this part wasn't really specified so I used the aphlict dropdown stuff. didn't want to keep working on that if this was the wrong UI choice
- can not edit title
- do we still want that to be done by clicking on the title, which pops a dialogue?
- can not add participants or calendar events
- what should this UI be? maybe just a button on the top for "participants" and a button on the bottom for calendar? both on top?
- this is not pixel perfect to the mock or two I've seen around. Aside from generally being bad at that, I definitely didn't get the name + timestamps formatting correctly, because the standard DOM of that has timestamp FIRST which appears second due to a "float right". Seemed like a lot of special-casing for what might not even be that important in the UI so I punted. (And again, there's likely many unknown ways in which this isn't pixel perfect)
There's also code quality issues
- `ConpherenceWidgetConfigConstants` is hopefully temporary or at least gets more sleek as we keep progressing here
- copied some CSS from main Conpherence app
- DOM structure is pretty different
- there's some minor CSS tweaks too given the different width (not to mention the DOM structure being different)
- copied some JS from behavior-pontificate.js to sync threads relative to aphlict updates
- JS in general is like a better version of existing JS; these should collapse I'd hope?
- maybe the aphlict-behavior-dropdown change was badsauce?
...but all that said, this definitely feels really nice and I feel like adding stuff is going to be really easy compared to how normal Conpherence is.
Also includes a bonus bug fix - we now correctly update participation. The user would encounter this issue if they were in a conpherence that got some updates and then they went to a different page; they would have unread status for the messages that were ajax'd in. This patch fixes that by making sure we mark participation up to date with the proper transaction in all cases.
Test Plan: hit "\" to invoke the column and saw nice loading UI and my latest conpherence load. sent messages and verified they received A-OK by looking in DOM console. toggled various widges and verified they rendered correctly. opened up a second browser with a second user on the thread, sent a message, and it was received in a nice asynchronous fashion
Reviewers: chad, epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T7014
Differential Revision: https://secure.phabricator.com/D11968
2015-03-05 19:33:39 +01:00
|
|
|
'ConpherenceColumnViewController' => 'ConpherenceController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConpherenceConduitAPIMethod' => 'ConduitAPIMethod',
|
2013-01-26 01:03:54 +01:00
|
|
|
'ConpherenceConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-06-15 10:02:26 +02:00
|
|
|
'ConpherenceConstants' => 'Phobject',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceController' => 'PhabricatorController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConpherenceCreateThreadConduitAPIMethod' => 'ConpherenceConduitAPIMethod',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceDAO' => 'PhabricatorLiskDAO',
|
2015-02-27 20:38:33 +01:00
|
|
|
'ConpherenceDurableColumnView' => 'AphrontTagView',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-05-04 22:52:22 +02:00
|
|
|
'ConpherenceFormDragAndDropUploadControl' => 'AphrontFormControl',
|
2015-01-06 19:24:30 +01:00
|
|
|
'ConpherenceFulltextQuery' => 'PhabricatorOffsetPagedQuery',
|
2015-05-04 22:52:22 +02:00
|
|
|
'ConpherenceImageData' => 'ConpherenceConstants',
|
2015-01-06 19:24:30 +01:00
|
|
|
'ConpherenceIndex' => 'ConpherenceDAO',
|
2013-04-01 21:43:07 +02:00
|
|
|
'ConpherenceLayoutView' => 'AphrontView',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceListController' => 'ConpherenceController',
|
|
|
|
'ConpherenceMenuItemView' => 'AphrontTagView',
|
2015-03-24 21:04:33 +01:00
|
|
|
'ConpherenceNewRoomController' => 'ConpherenceController',
|
2013-08-08 22:43:33 +02:00
|
|
|
'ConpherenceNotificationPanelController' => 'ConpherenceController',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceParticipant' => 'ConpherenceDAO',
|
2013-04-26 19:30:41 +02:00
|
|
|
'ConpherenceParticipantCountQuery' => 'PhabricatorOffsetPagedQuery',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceParticipantQuery' => 'PhabricatorOffsetPagedQuery',
|
|
|
|
'ConpherenceParticipationStatus' => 'ConpherenceConstants',
|
2013-04-02 18:32:40 +02:00
|
|
|
'ConpherencePeopleWidgetView' => 'ConpherenceWidgetView',
|
2015-05-04 22:52:22 +02:00
|
|
|
'ConpherencePicCropControl' => 'AphrontFormControl',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConpherenceQueryThreadConduitAPIMethod' => 'ConpherenceConduitAPIMethod',
|
|
|
|
'ConpherenceQueryTransactionConduitAPIMethod' => 'ConpherenceConduitAPIMethod',
|
2013-01-26 01:03:54 +01:00
|
|
|
'ConpherenceReplyHandler' => 'PhabricatorMailReplyHandler',
|
2015-03-24 21:04:33 +01:00
|
|
|
'ConpherenceRoomListController' => 'ConpherenceController',
|
2015-03-26 20:24:29 +01:00
|
|
|
'ConpherenceRoomTestCase' => 'ConpherenceTestCase',
|
2014-09-18 20:15:38 +02:00
|
|
|
'ConpherenceSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-03-26 21:30:35 +01:00
|
|
|
'ConpherenceSettings' => 'ConpherenceConstants',
|
2015-03-26 20:24:29 +01:00
|
|
|
'ConpherenceTestCase' => 'PhabricatorTestCase',
|
2014-07-17 23:48:54 +02:00
|
|
|
'ConpherenceThread' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'ConpherenceDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-04-01 20:01:21 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-04-14 21:25:35 +02:00
|
|
|
'PhabricatorMentionableInterface',
|
2015-04-08 21:19:40 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
2013-01-25 02:23:05 +01:00
|
|
|
),
|
2015-12-21 15:07:41 +01:00
|
|
|
'ConpherenceThreadIndexEngineExtension' => 'PhabricatorIndexEngineExtension',
|
2013-04-01 21:50:39 +02:00
|
|
|
'ConpherenceThreadListView' => 'AphrontView',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ConpherenceThreadMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2015-06-14 00:44:56 +02:00
|
|
|
'ConpherenceThreadMembersPolicyRule' => 'PhabricatorPolicyRule',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceThreadQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-04-13 21:45:55 +02:00
|
|
|
'ConpherenceThreadRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-03-24 21:04:33 +01:00
|
|
|
'ConpherenceThreadSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'ConpherenceTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'ConpherenceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'ConpherenceTransactionRenderer' => 'Phobject',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceTransactionView' => 'AphrontView',
|
2013-04-10 20:37:04 +02:00
|
|
|
'ConpherenceUpdateActions' => 'ConpherenceConstants',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceUpdateController' => 'ConpherenceController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ConpherenceUpdateThreadConduitAPIMethod' => 'ConpherenceConduitAPIMethod',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceViewController' => 'ConpherenceController',
|
Conpherence - make the durable column kind of work and stuff
Summary:
Ref T7014. This hooks up the durable column such that when you open it up it loads your most recent Conpherence. You can then switch amongst the various widgets and stuff and everything works nicely.
Except...
- scroll bar does not work
- also doesn't work at HEAD when I add a ton of text to the UI with no changes? (wrapped $copy in array_fill(0, 1000, $copy))
- "widget selector" does not collapse when you select something else
- this part wasn't really specified so I used the aphlict dropdown stuff. didn't want to keep working on that if this was the wrong UI choice
- can not edit title
- do we still want that to be done by clicking on the title, which pops a dialogue?
- can not add participants or calendar events
- what should this UI be? maybe just a button on the top for "participants" and a button on the bottom for calendar? both on top?
- this is not pixel perfect to the mock or two I've seen around. Aside from generally being bad at that, I definitely didn't get the name + timestamps formatting correctly, because the standard DOM of that has timestamp FIRST which appears second due to a "float right". Seemed like a lot of special-casing for what might not even be that important in the UI so I punted. (And again, there's likely many unknown ways in which this isn't pixel perfect)
There's also code quality issues
- `ConpherenceWidgetConfigConstants` is hopefully temporary or at least gets more sleek as we keep progressing here
- copied some CSS from main Conpherence app
- DOM structure is pretty different
- there's some minor CSS tweaks too given the different width (not to mention the DOM structure being different)
- copied some JS from behavior-pontificate.js to sync threads relative to aphlict updates
- JS in general is like a better version of existing JS; these should collapse I'd hope?
- maybe the aphlict-behavior-dropdown change was badsauce?
...but all that said, this definitely feels really nice and I feel like adding stuff is going to be really easy compared to how normal Conpherence is.
Also includes a bonus bug fix - we now correctly update participation. The user would encounter this issue if they were in a conpherence that got some updates and then they went to a different page; they would have unread status for the messages that were ajax'd in. This patch fixes that by making sure we mark participation up to date with the proper transaction in all cases.
Test Plan: hit "\" to invoke the column and saw nice loading UI and my latest conpherence load. sent messages and verified they received A-OK by looking in DOM console. toggled various widges and verified they rendered correctly. opened up a second browser with a second user on the thread, sent a message, and it was received in a nice asynchronous fashion
Reviewers: chad, epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T7014
Differential Revision: https://secure.phabricator.com/D11968
2015-03-05 19:33:39 +01:00
|
|
|
'ConpherenceWidgetConfigConstants' => 'ConpherenceConstants',
|
2013-02-15 23:01:27 +01:00
|
|
|
'ConpherenceWidgetController' => 'ConpherenceController',
|
2013-04-02 18:32:40 +02:00
|
|
|
'ConpherenceWidgetView' => 'AphrontView',
|
2011-02-03 07:38:42 +01:00
|
|
|
'DarkConsoleController' => 'PhabricatorController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DarkConsoleCore' => 'Phobject',
|
DarkConsole: fix rendering, move request log, load over ajax
Summary:
This accomplishes three major goals:
# Fixes phutil_render_tag -> phutil_tag callsites in DarkConsole.
# Moves the Ajax request log to a new panel on the left. This panel (and the tabs panel) get scrollbars when they get large, instead of making the page constantly scroll down.
# Loads the panel content over ajax, instead of dumping it into the page body / ajax response body. I've been planning to do this for about 3 years, which is why the plugins are architected the way they are. This should make debugging easier by making response bodies not be 50%+ darkconsole stuff.
Additionally, load the plugins dynamically (the old method predates library maps and PhutilSymbolLoader).
Test Plan:
{F30675}
- Switched between requests and tabs, reloaded page, saw same tab.
- Used "analyze queries", "profile page", triggered errors.
- Verified page does not load anything by default if dark console is closed with Charles.
- Generally banged on it a bit.
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2432
Differential Revision: https://secure.phabricator.com/D4692
2013-01-29 03:45:32 +01:00
|
|
|
'DarkConsoleDataController' => 'PhabricatorController',
|
2011-02-02 22:48:52 +01:00
|
|
|
'DarkConsoleErrorLogPlugin' => 'DarkConsolePlugin',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DarkConsoleErrorLogPluginAPI' => 'Phobject',
|
2011-09-30 21:54:17 +02:00
|
|
|
'DarkConsoleEventPlugin' => 'DarkConsolePlugin',
|
2013-10-22 02:00:21 +02:00
|
|
|
'DarkConsoleEventPluginAPI' => 'PhabricatorEventListener',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DarkConsolePlugin' => 'Phobject',
|
2011-02-02 22:48:52 +01:00
|
|
|
'DarkConsoleRequestPlugin' => 'DarkConsolePlugin',
|
|
|
|
'DarkConsoleServicesPlugin' => 'DarkConsolePlugin',
|
2015-08-21 23:53:29 +02:00
|
|
|
'DarkConsoleStartupPlugin' => 'DarkConsolePlugin',
|
2011-02-02 22:48:52 +01:00
|
|
|
'DarkConsoleXHProfPlugin' => 'DarkConsolePlugin',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DarkConsoleXHProfPluginAPI' => 'Phobject',
|
|
|
|
'DefaultDatabaseConfigurationProvider' => array(
|
|
|
|
'Phobject',
|
|
|
|
'DatabaseConfigurationProvider',
|
|
|
|
),
|
|
|
|
'DifferentialAction' => 'Phobject',
|
2015-04-01 17:40:12 +02:00
|
|
|
'DifferentialActionEmailCommand' => 'MetaMTAEmailTransactionCommand',
|
2013-10-22 02:00:21 +02:00
|
|
|
'DifferentialActionMenuEventListener' => 'PhabricatorEventListener',
|
2011-01-30 20:02:22 +01:00
|
|
|
'DifferentialAddCommentView' => 'AphrontView',
|
2015-05-20 01:37:39 +02:00
|
|
|
'DifferentialAdjustmentMapTestCase' => 'PhutilTestCase',
|
2011-09-14 19:59:52 +02:00
|
|
|
'DifferentialAffectedPath' => 'DifferentialDAO',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialApplyPatchField' => 'DifferentialCustomField',
|
|
|
|
'DifferentialAsanaRepresentationField' => 'DifferentialCustomField',
|
2014-03-08 02:05:00 +01:00
|
|
|
'DifferentialAuditorsField' => 'DifferentialStoredCustomField',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialAuthorField' => 'DifferentialCustomField',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialBlameRevisionField' => 'DifferentialStoredCustomField',
|
2015-08-03 21:54:40 +02:00
|
|
|
'DifferentialBlockHeraldAction' => 'HeraldAction',
|
2014-02-27 20:05:48 +01:00
|
|
|
'DifferentialBranchField' => 'DifferentialCustomField',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DifferentialChangeHeraldFieldGroup' => 'HeraldFieldGroup',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialChangeType' => 'Phobject',
|
2014-04-01 17:23:34 +02:00
|
|
|
'DifferentialChangesSinceLastUpdateField' => 'DifferentialCustomField',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DifferentialChangeset' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DifferentialDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-05-25 17:09:01 +02:00
|
|
|
),
|
2011-01-24 22:18:41 +01:00
|
|
|
'DifferentialChangesetDetailView' => 'AphrontView',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialChangesetFileTreeSideNavBuilder' => 'Phobject',
|
Implement basic one-up and test renderers
Summary:
This is a half-step toward one-up and test renderers. This is mostly a structural change, and has no user-facing impact. It splits the rendering hierarchy like this:
- Renderer (more methods are abstract than before)
- HTML Renderer (most HTML stuff has moved down from the base to here)
- HTML 1-up (placeholder only -- not yet a functional implementation)
- HTML 2-up (minimal changes, uses mostly old code)
- Test Renderer (unit-testable renderer base, implements text versions of the HTML stuff)
- Test 1-up (selects 1-up mode for test rendering)
- Test 2-up (selects 2-up mode for test rendering)
Broadly, I'm trying to share as much code as possible by splitting rendering into more, smaller stages. Specifically, we do this:
- Combine the various sorts of inputs (changes, context, inlines, etc.) into a single, relatively homogenous list of "primitives". This happens in the base class.
- The primitive types are: old (diff left side), new (diff right side), context ("show more context"), no-context ("context not available") and inline (inline comment).
- Possibly, apply a filtering/reordering step to the primitives to get them ready for 1-up rendering. This mostly removes information, and does a small amount of reordering. This also happens in the base class.
- Pass the primitives to the actual renderer, to convert them into HTML, text, or whatever else. This happens in the leaf class.
The primitive implementation is not yet complete (it doesn't attach as much information to the primitives as it should -- stuff like coverage and copies), but covers the basics.
The existing HTMLTwoUp renderer does not use the primitive path; instead, it still goes down the old path.
Test Plan: Ran unit tests, looked at a bunch of diffs.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2009
Differential Revision: https://secure.phabricator.com/D4421
2013-01-14 23:20:06 +01:00
|
|
|
'DifferentialChangesetHTMLRenderer' => 'DifferentialChangesetRenderer',
|
2012-12-06 20:33:04 +01:00
|
|
|
'DifferentialChangesetListView' => 'AphrontView',
|
2016-05-05 18:46:44 +02:00
|
|
|
'DifferentialChangesetOneUpMailRenderer' => 'DifferentialChangesetRenderer',
|
Implement basic one-up and test renderers
Summary:
This is a half-step toward one-up and test renderers. This is mostly a structural change, and has no user-facing impact. It splits the rendering hierarchy like this:
- Renderer (more methods are abstract than before)
- HTML Renderer (most HTML stuff has moved down from the base to here)
- HTML 1-up (placeholder only -- not yet a functional implementation)
- HTML 2-up (minimal changes, uses mostly old code)
- Test Renderer (unit-testable renderer base, implements text versions of the HTML stuff)
- Test 1-up (selects 1-up mode for test rendering)
- Test 2-up (selects 2-up mode for test rendering)
Broadly, I'm trying to share as much code as possible by splitting rendering into more, smaller stages. Specifically, we do this:
- Combine the various sorts of inputs (changes, context, inlines, etc.) into a single, relatively homogenous list of "primitives". This happens in the base class.
- The primitive types are: old (diff left side), new (diff right side), context ("show more context"), no-context ("context not available") and inline (inline comment).
- Possibly, apply a filtering/reordering step to the primitives to get them ready for 1-up rendering. This mostly removes information, and does a small amount of reordering. This also happens in the base class.
- Pass the primitives to the actual renderer, to convert them into HTML, text, or whatever else. This happens in the leaf class.
The primitive implementation is not yet complete (it doesn't attach as much information to the primitives as it should -- stuff like coverage and copies), but covers the basics.
The existing HTMLTwoUp renderer does not use the primitive path; instead, it still goes down the old path.
Test Plan: Ran unit tests, looked at a bunch of diffs.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2009
Differential Revision: https://secure.phabricator.com/D4421
2013-01-14 23:20:06 +01:00
|
|
|
'DifferentialChangesetOneUpRenderer' => 'DifferentialChangesetHTMLRenderer',
|
|
|
|
'DifferentialChangesetOneUpTestRenderer' => 'DifferentialChangesetTestRenderer',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialChangesetParser' => 'Phobject',
|
Implement basic one-up and test renderers
Summary:
This is a half-step toward one-up and test renderers. This is mostly a structural change, and has no user-facing impact. It splits the rendering hierarchy like this:
- Renderer (more methods are abstract than before)
- HTML Renderer (most HTML stuff has moved down from the base to here)
- HTML 1-up (placeholder only -- not yet a functional implementation)
- HTML 2-up (minimal changes, uses mostly old code)
- Test Renderer (unit-testable renderer base, implements text versions of the HTML stuff)
- Test 1-up (selects 1-up mode for test rendering)
- Test 2-up (selects 2-up mode for test rendering)
Broadly, I'm trying to share as much code as possible by splitting rendering into more, smaller stages. Specifically, we do this:
- Combine the various sorts of inputs (changes, context, inlines, etc.) into a single, relatively homogenous list of "primitives". This happens in the base class.
- The primitive types are: old (diff left side), new (diff right side), context ("show more context"), no-context ("context not available") and inline (inline comment).
- Possibly, apply a filtering/reordering step to the primitives to get them ready for 1-up rendering. This mostly removes information, and does a small amount of reordering. This also happens in the base class.
- Pass the primitives to the actual renderer, to convert them into HTML, text, or whatever else. This happens in the leaf class.
The primitive implementation is not yet complete (it doesn't attach as much information to the primitives as it should -- stuff like coverage and copies), but covers the basics.
The existing HTMLTwoUp renderer does not use the primitive path; instead, it still goes down the old path.
Test Plan: Ran unit tests, looked at a bunch of diffs.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2009
Differential Revision: https://secure.phabricator.com/D4421
2013-01-14 23:20:06 +01:00
|
|
|
'DifferentialChangesetParserTestCase' => 'PhabricatorTestCase',
|
2014-05-25 17:59:31 +02:00
|
|
|
'DifferentialChangesetQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialChangesetRenderer' => 'Phobject',
|
Implement basic one-up and test renderers
Summary:
This is a half-step toward one-up and test renderers. This is mostly a structural change, and has no user-facing impact. It splits the rendering hierarchy like this:
- Renderer (more methods are abstract than before)
- HTML Renderer (most HTML stuff has moved down from the base to here)
- HTML 1-up (placeholder only -- not yet a functional implementation)
- HTML 2-up (minimal changes, uses mostly old code)
- Test Renderer (unit-testable renderer base, implements text versions of the HTML stuff)
- Test 1-up (selects 1-up mode for test rendering)
- Test 2-up (selects 2-up mode for test rendering)
Broadly, I'm trying to share as much code as possible by splitting rendering into more, smaller stages. Specifically, we do this:
- Combine the various sorts of inputs (changes, context, inlines, etc.) into a single, relatively homogenous list of "primitives". This happens in the base class.
- The primitive types are: old (diff left side), new (diff right side), context ("show more context"), no-context ("context not available") and inline (inline comment).
- Possibly, apply a filtering/reordering step to the primitives to get them ready for 1-up rendering. This mostly removes information, and does a small amount of reordering. This also happens in the base class.
- Pass the primitives to the actual renderer, to convert them into HTML, text, or whatever else. This happens in the leaf class.
The primitive implementation is not yet complete (it doesn't attach as much information to the primitives as it should -- stuff like coverage and copies), but covers the basics.
The existing HTMLTwoUp renderer does not use the primitive path; instead, it still goes down the old path.
Test Plan: Ran unit tests, looked at a bunch of diffs.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2009
Differential Revision: https://secure.phabricator.com/D4421
2013-01-14 23:20:06 +01:00
|
|
|
'DifferentialChangesetTestRenderer' => 'DifferentialChangesetRenderer',
|
|
|
|
'DifferentialChangesetTwoUpRenderer' => 'DifferentialChangesetHTMLRenderer',
|
|
|
|
'DifferentialChangesetTwoUpTestRenderer' => 'DifferentialChangesetTestRenderer',
|
2011-01-25 00:52:35 +01:00
|
|
|
'DifferentialChangesetViewController' => 'DifferentialController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialCloseConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
2011-02-01 03:05:20 +01:00
|
|
|
'DifferentialCommentPreviewController' => 'DifferentialController',
|
2011-01-30 21:08:40 +01:00
|
|
|
'DifferentialCommentSaveController' => 'DifferentialController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialCommitMessageParser' => 'Phobject',
|
2014-03-08 02:44:35 +01:00
|
|
|
'DifferentialCommitMessageParserTestCase' => 'PhabricatorTestCase',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialCommitsField' => 'DifferentialCustomField',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialConduitAPIMethod' => 'ConduitAPIMethod',
|
2014-03-08 02:05:00 +01:00
|
|
|
'DifferentialConflictsField' => 'DifferentialCustomField',
|
2011-01-24 22:18:41 +01:00
|
|
|
'DifferentialController' => 'PhabricatorController',
|
2014-02-21 20:52:52 +01:00
|
|
|
'DifferentialCoreCustomField' => 'DifferentialCustomField',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialCreateCommentConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialCreateDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialCreateInlineConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
2015-01-30 19:31:39 +01:00
|
|
|
'DifferentialCreateMailReceiver' => 'PhabricatorMailReceiver',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialCreateRawDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialCreateRevisionConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
2014-02-19 01:32:55 +01:00
|
|
|
'DifferentialCustomField' => 'PhabricatorCustomField',
|
Modularize parser for "Closes task X as Y"
Summary:
Ref T3886. Ref T3872. Ref T1812. We have several parsers which look for textual references to other objects, like:
Closes Tx.
Depends on Dy.
Reverts Dz.
Currently, these are pretty hard coded, don't get all the edge cases right, and don't generalize well. They're also implemented in the middle of Differential's field code. So I want to:
- Share more code so that, e.g., "Tx, Ty" always works (only some rules support it right now);
- fix bugs in the parser, like T3872;
- make this a modular, extensible process which runs against custom fields, not a builtin part of fields;
- make the internals more flexible to accommodate custom stuff like T1812.
This implements the "Verbs optional-noun Object, Optional Other Objects optional-as-something." grammar in a general way so subclasses can just plug in their keywords. Runtime code doesn't touch this yet.
Test Plan: Ran unit tests.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3872, T1812, T3886
Differential Revision: https://secure.phabricator.com/D8261
2014-02-18 00:53:47 +01:00
|
|
|
'DifferentialCustomFieldDependsOnParser' => 'PhabricatorCustomFieldMonogramParser',
|
|
|
|
'DifferentialCustomFieldDependsOnParserTestCase' => 'PhabricatorTestCase',
|
2013-09-26 22:48:36 +02:00
|
|
|
'DifferentialCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage',
|
2014-02-18 00:58:59 +01:00
|
|
|
'DifferentialCustomFieldRevertsParser' => 'PhabricatorCustomFieldMonogramParser',
|
|
|
|
'DifferentialCustomFieldRevertsParserTestCase' => 'PhabricatorTestCase',
|
2013-09-26 22:48:36 +02:00
|
|
|
'DifferentialCustomFieldStorage' => 'PhabricatorCustomFieldStorage',
|
|
|
|
'DifferentialCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage',
|
2011-01-24 20:01:53 +01:00
|
|
|
'DifferentialDAO' => 'PhabricatorLiskDAO',
|
2014-07-25 00:20:39 +02:00
|
|
|
'DifferentialDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialDependenciesField' => 'DifferentialCustomField',
|
|
|
|
'DifferentialDependsOnField' => 'DifferentialCustomField',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DifferentialDiff' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DifferentialDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'HarbormasterBuildableInterface',
|
2015-10-15 05:01:22 +02:00
|
|
|
'HarbormasterCircleCIBuildableInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2013-07-01 21:38:42 +02:00
|
|
|
),
|
2015-07-08 21:25:38 +02:00
|
|
|
'DifferentialDiffAffectedFilesHeraldField' => 'DifferentialDiffHeraldField',
|
|
|
|
'DifferentialDiffAuthorHeraldField' => 'DifferentialDiffHeraldField',
|
|
|
|
'DifferentialDiffAuthorProjectsHeraldField' => 'DifferentialDiffHeraldField',
|
|
|
|
'DifferentialDiffContentAddedHeraldField' => 'DifferentialDiffHeraldField',
|
|
|
|
'DifferentialDiffContentHeraldField' => 'DifferentialDiffHeraldField',
|
|
|
|
'DifferentialDiffContentRemovedHeraldField' => 'DifferentialDiffHeraldField',
|
2011-02-05 21:20:18 +01:00
|
|
|
'DifferentialDiffCreateController' => 'DifferentialController',
|
2014-11-19 00:32:23 +01:00
|
|
|
'DifferentialDiffEditor' => 'PhabricatorApplicationTransactionEditor',
|
2016-01-08 13:35:17 +01:00
|
|
|
'DifferentialDiffExtractionEngine' => 'Phobject',
|
2015-07-08 21:25:38 +02:00
|
|
|
'DifferentialDiffHeraldField' => 'HeraldField',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DifferentialDiffHeraldFieldGroup' => 'HeraldFieldGroup',
|
2015-03-09 20:40:29 +01:00
|
|
|
'DifferentialDiffInlineCommentQuery' => 'PhabricatorDiffInlineCommentQuery',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DifferentialDiffPHIDType' => 'PhabricatorPHIDType',
|
2011-01-24 21:07:34 +01:00
|
|
|
'DifferentialDiffProperty' => 'DifferentialDAO',
|
2013-07-01 21:38:42 +02:00
|
|
|
'DifferentialDiffQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-07-08 21:25:38 +02:00
|
|
|
'DifferentialDiffRepositoryHeraldField' => 'DifferentialDiffHeraldField',
|
|
|
|
'DifferentialDiffRepositoryProjectsHeraldField' => 'DifferentialDiffHeraldField',
|
2015-05-20 01:37:39 +02:00
|
|
|
'DifferentialDiffTestCase' => 'PhutilTestCase',
|
2014-11-19 00:32:23 +01:00
|
|
|
'DifferentialDiffTransaction' => 'PhabricatorApplicationTransaction',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'DifferentialDiffTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2011-01-24 22:18:41 +01:00
|
|
|
'DifferentialDiffViewController' => 'DifferentialController',
|
2013-07-26 17:56:35 +02:00
|
|
|
'DifferentialDoorkeeperRevisionFeedStoryPublisher' => 'DoorkeeperFeedStoryPublisher',
|
2014-02-19 01:25:16 +01:00
|
|
|
'DifferentialDraft' => 'DifferentialDAO',
|
2014-02-21 20:53:48 +01:00
|
|
|
'DifferentialEditPolicyField' => 'DifferentialCoreCustomField',
|
2012-05-30 23:26:29 +02:00
|
|
|
'DifferentialFieldParseException' => 'Exception',
|
|
|
|
'DifferentialFieldValidationException' => 'Exception',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialFindConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialGetAllDiffsConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialGetCommitMessageConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialGetCommitPathsConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialGetDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialGetRawDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialGetRevisionCommentsConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialGetRevisionConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialGetWorkingCopy' => 'Phobject',
|
2015-01-04 20:33:42 +01:00
|
|
|
'DifferentialGitHubLandingStrategy' => 'DifferentialLandingStrategy',
|
2014-03-08 02:05:00 +01:00
|
|
|
'DifferentialGitSVNIDField' => 'DifferentialCustomField',
|
2015-06-23 22:33:09 +02:00
|
|
|
'DifferentialHarbormasterField' => 'DifferentialCustomField',
|
Allow inline comments to be individually hidden
Summary:
Ref T7447. Implements per-viewer comment hiding. Once a comment is obsolete or uninteresting, you can hide it completely.
This is sticky per-user.
My hope is that this will strike a better balance between concerns than some of the other approaches (conservative porting, summarization, hide-all).
Specifically, this adds a new action here:
{F435621}
Clicking it completely collapses the comment into a small icon on the previous line, and saves the comment state as hidden for you:
{F435626}
You can click the icon to reveal all hidden comments below the line.
Test Plan:
- Hid comments.
- Showed comments.
- Created, edited, deleted and submitted comments.
- Used Diffusion comments (hiding is not implemented there yet, but I'd plan to bring it there eventually if it works out in Differential).
Reviewers: btrahan, chad
Reviewed By: btrahan
Subscribers: jparise, yelirekim, epriestley
Maniphest Tasks: T7447
Differential Revision: https://secure.phabricator.com/D13009
2015-05-27 19:28:38 +02:00
|
|
|
'DifferentialHiddenComment' => 'DifferentialDAO',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialHostField' => 'DifferentialCustomField',
|
2015-01-04 20:33:42 +01:00
|
|
|
'DifferentialHostedGitLandingStrategy' => 'DifferentialLandingStrategy',
|
|
|
|
'DifferentialHostedMercurialLandingStrategy' => 'DifferentialLandingStrategy',
|
2015-12-24 20:20:18 +01:00
|
|
|
'DifferentialHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DifferentialHunk' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DifferentialDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-04-14 21:06:26 +02:00
|
|
|
),
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialHunkParser' => 'Phobject',
|
2013-01-09 22:11:17 +01:00
|
|
|
'DifferentialHunkParserTestCase' => 'PhabricatorTestCase',
|
2014-04-14 21:06:26 +02:00
|
|
|
'DifferentialHunkQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-05-20 01:37:39 +02:00
|
|
|
'DifferentialHunkTestCase' => 'PhutilTestCase',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialInlineComment' => array(
|
|
|
|
'Phobject',
|
|
|
|
'PhabricatorInlineCommentInterface',
|
|
|
|
),
|
Add inline comments to Diffusion/Audit
Summary:
- Add inline comments to Audits, like Differential.
- Creates new storage for the comments in the Audits database.
- Creates a new PhabricatorAuditInlineComment class, similar to DifferentialInlineComment.
- Defines an Interface which Differential and Audit comments conform to.
- Makes consumers of DifferentialInlineComments consume objects which implement that interface instead.
- Adds save
NOTE: Some features are still missing! Wanted to cut this off before it got crazy:
- Inline comments aren't shown in the main comment list.
- Inline comments aren't shown in the emails.
- Inline comments aren't previewed.
I'll followup with those but this was getting pretty big.
@vrana, does the SQL change look correct?
Test Plan:
- Created, edited, deleted, replied to, reloaded and saved inline comments in Diffusion, on the left and right side of diffs.
- Created, edited, deleted, replied to, reloaded and saved inline comments in Differentila, on the left and right side of primary and diff-versus-diff diffs.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran, epriestley
Maniphest Tasks: T904
Differential Revision: https://secure.phabricator.com/D1898
2012-03-14 20:56:01 +01:00
|
|
|
'DifferentialInlineCommentEditController' => 'PhabricatorInlineCommentController',
|
Rough cut of inline comment context
Summary:
Ref T10694. This is still missing some pieces, but seems to get most of the data into the mail in a plausible format:
- When an inline remarks on code, show the patch inline in the mail body.
- When an inline replies to another inline, show that other inline in the mail body.
- Apply remarkup rendering to inline content.
- Apply basic styling to mail body blocks.
Not covered yet:
- Syntax highlighting.
- Diff highlighting.
- Maybe clearer style/layout hints to connect comments to what they reply to? Current approach might get messy with inlines that have blockquotes and code blocks inside them, for example.
- I probably want to cap the amount of diff context we ever show to ~7 lines, even if you drag over 200 lines of code.
- CSS is a generally a bit rough still.
- The `unified-comment-context` option is effectively always on now, and should be removed.
- Text section is getting indented right now but probably shouldn't be.
- Spacing, etc., might be a bit off.
Test Plan:
Rigged Home to render these things, got a plausible-looking render (top is text, bottom is HTML):
{F1259052}
Sent myself some inline comment mail, got a plausible result.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10694
Differential Revision: https://secure.phabricator.com/D15850
2016-05-05 13:42:29 +02:00
|
|
|
'DifferentialInlineCommentMailView' => 'Phobject',
|
2012-07-23 20:01:28 +02:00
|
|
|
'DifferentialInlineCommentPreviewController' => 'PhabricatorInlineCommentPreviewController',
|
2013-06-21 21:54:56 +02:00
|
|
|
'DifferentialInlineCommentQuery' => 'PhabricatorOffsetPagedQuery',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialJIRAIssuesField' => 'DifferentialStoredCustomField',
|
Land Revision button for hosted git repos
Summary:
ref T182.
Simple approach of clone, patch, push. While waiting for drydock, implement a hackish mutex
setup for the workspace, which should work ok as long as there's only one committer who is
carefull about theses things.
Less obvious note: This is taking the both author and commiter's 'primary email' for the commit -
which might rub some people wrong.
Test Plan:
With a hosted repo, created some diffs and landed them.
Also clicked button for some error cases, got the right error message.
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley
CC: hach-que, Korvin, epriestley, aran
Maniphest Tasks: T182
Differential Revision: https://secure.phabricator.com/D7486
2013-11-05 22:00:12 +01:00
|
|
|
'DifferentialLandingActionMenuEventListener' => 'PhabricatorEventListener',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialLandingStrategy' => 'Phobject',
|
2015-01-22 21:17:04 +01:00
|
|
|
'DifferentialLegacyHunk' => 'DifferentialHunk',
|
2015-05-07 23:09:41 +02:00
|
|
|
'DifferentialLineAdjustmentMap' => 'Phobject',
|
2015-06-23 22:33:09 +02:00
|
|
|
'DifferentialLintField' => 'DifferentialHarbormasterField',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialLintStatus' => 'Phobject',
|
2011-08-30 20:34:07 +02:00
|
|
|
'DifferentialLocalCommitsView' => 'AphrontView',
|
2014-03-08 21:15:29 +01:00
|
|
|
'DifferentialManiphestTasksField' => 'DifferentialCoreCustomField',
|
2015-01-22 21:17:04 +01:00
|
|
|
'DifferentialModernHunk' => 'DifferentialHunk',
|
2015-10-30 17:00:53 +01:00
|
|
|
'DifferentialNextStepField' => 'DifferentialCustomField',
|
2014-01-15 19:02:31 +01:00
|
|
|
'DifferentialParseCacheGarbageCollector' => 'PhabricatorGarbageCollector',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialParseCommitMessageConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
Implement basic one-up and test renderers
Summary:
This is a half-step toward one-up and test renderers. This is mostly a structural change, and has no user-facing impact. It splits the rendering hierarchy like this:
- Renderer (more methods are abstract than before)
- HTML Renderer (most HTML stuff has moved down from the base to here)
- HTML 1-up (placeholder only -- not yet a functional implementation)
- HTML 2-up (minimal changes, uses mostly old code)
- Test Renderer (unit-testable renderer base, implements text versions of the HTML stuff)
- Test 1-up (selects 1-up mode for test rendering)
- Test 2-up (selects 2-up mode for test rendering)
Broadly, I'm trying to share as much code as possible by splitting rendering into more, smaller stages. Specifically, we do this:
- Combine the various sorts of inputs (changes, context, inlines, etc.) into a single, relatively homogenous list of "primitives". This happens in the base class.
- The primitive types are: old (diff left side), new (diff right side), context ("show more context"), no-context ("context not available") and inline (inline comment).
- Possibly, apply a filtering/reordering step to the primitives to get them ready for 1-up rendering. This mostly removes information, and does a small amount of reordering. This also happens in the base class.
- Pass the primitives to the actual renderer, to convert them into HTML, text, or whatever else. This happens in the leaf class.
The primitive implementation is not yet complete (it doesn't attach as much information to the primitives as it should -- stuff like coverage and copies), but covers the basics.
The existing HTMLTwoUp renderer does not use the primitive path; instead, it still goes down the old path.
Test Plan: Ran unit tests, looked at a bunch of diffs.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2009
Differential Revision: https://secure.phabricator.com/D4421
2013-01-14 23:20:06 +01:00
|
|
|
'DifferentialParseRenderTestCase' => 'PhabricatorTestCase',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialPathField' => 'DifferentialCustomField',
|
2014-02-26 23:46:18 +01:00
|
|
|
'DifferentialProjectReviewersField' => 'DifferentialCustomField',
|
2014-06-23 18:49:52 +02:00
|
|
|
'DifferentialProjectsField' => 'DifferentialCoreCustomField',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialQueryConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
|
|
|
'DifferentialQueryDiffsConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialRawDiffRenderer' => 'Phobject',
|
|
|
|
'DifferentialReleephRequestFieldSpecification' => 'Phobject',
|
2014-08-04 16:55:43 +02:00
|
|
|
'DifferentialRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-04-01 17:40:12 +02:00
|
|
|
'DifferentialReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2014-02-21 20:53:37 +01:00
|
|
|
'DifferentialRepositoryField' => 'DifferentialCoreCustomField',
|
2013-09-27 00:28:42 +02:00
|
|
|
'DifferentialRepositoryLookup' => 'Phobject',
|
Allow Herald to "Require legal signatures" for reviews
Summary:
Ref T3116. Add a Herald action "Require legal signatures" which requires revision authors to accept legal agreements before their revisions can be accepted.
- Herald will check which documents the author has signed, and trigger a "you have to sign X, Y, Z" for other documents.
- If the author has already signed everything, we don't spam the revision -- basically, this only triggers when signatures are missing.
- The UI will show which documents must be signed and warn that the revision can't be accepted until they're completed.
- Users aren't allowed to "Accept" the revision until documents are cleared.
Fixes T1157. The original install making the request (Hive) no longer uses Phabricator, and this satisfies our requirements.
Test Plan:
- Added a Herald rule.
- Created a revision, saw the rule trigger.
- Viewed as author and non-author, saw field UI (generic for non-author, specific for author), transaction UI, and accept-warning UI.
- Tried to accept revision.
- Signed document, saw UI update. Note that signatures don't currently //push// an update to the revision, but could eventually (like blocking tasks work).
- Accepted revision.
- Created another revision, saw rules not add the document (since it's already signed, this is the "no spam" case).
Reviewers: btrahan, chad
Reviewed By: chad
Subscribers: asherkin, epriestley
Maniphest Tasks: T1157, T3116
Differential Revision: https://secure.phabricator.com/D9771
2014-06-29 16:53:53 +02:00
|
|
|
'DifferentialRequiredSignaturesField' => 'DifferentialCoreCustomField',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialRevertPlanField' => 'DifferentialStoredCustomField',
|
2014-03-08 02:05:00 +01:00
|
|
|
'DifferentialReviewedByField' => 'DifferentialCoreCustomField',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialReviewer' => 'Phobject',
|
2015-01-01 04:43:26 +01:00
|
|
|
'DifferentialReviewerForRevisionEdgeType' => 'PhabricatorEdgeType',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialReviewerStatus' => 'Phobject',
|
2015-07-30 20:39:35 +02:00
|
|
|
'DifferentialReviewersAddBlockingReviewersHeraldAction' => 'DifferentialReviewersHeraldAction',
|
|
|
|
'DifferentialReviewersAddBlockingSelfHeraldAction' => 'DifferentialReviewersHeraldAction',
|
|
|
|
'DifferentialReviewersAddReviewersHeraldAction' => 'DifferentialReviewersHeraldAction',
|
|
|
|
'DifferentialReviewersAddSelfHeraldAction' => 'DifferentialReviewersHeraldAction',
|
2014-02-21 20:54:32 +01:00
|
|
|
'DifferentialReviewersField' => 'DifferentialCoreCustomField',
|
2015-07-30 20:39:35 +02:00
|
|
|
'DifferentialReviewersHeraldAction' => 'HeraldAction',
|
2013-10-05 16:54:42 +02:00
|
|
|
'DifferentialReviewersView' => 'AphrontView',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DifferentialRevision' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DifferentialDAO',
|
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-05-11 23:23:35 +02:00
|
|
|
'PhabricatorExtendedPolicyInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhrequentTrackableInterface',
|
|
|
|
'HarbormasterBuildableInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorCustomFieldInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-09-09 23:21:13 +02:00
|
|
|
'PhabricatorMentionableInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
|
|
|
'PhabricatorProjectInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2013-02-15 16:47:14 +01:00
|
|
|
),
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionAffectedFilesHeraldField' => 'DifferentialRevisionHeraldField',
|
|
|
|
'DifferentialRevisionAuthorHeraldField' => 'DifferentialRevisionHeraldField',
|
|
|
|
'DifferentialRevisionAuthorProjectsHeraldField' => 'DifferentialRevisionHeraldField',
|
2014-10-14 01:55:26 +02:00
|
|
|
'DifferentialRevisionCloseDetailsController' => 'DifferentialController',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionContentAddedHeraldField' => 'DifferentialRevisionHeraldField',
|
|
|
|
'DifferentialRevisionContentHeraldField' => 'DifferentialRevisionHeraldField',
|
|
|
|
'DifferentialRevisionContentRemovedHeraldField' => 'DifferentialRevisionHeraldField',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialRevisionControlSystem' => 'Phobject',
|
2015-01-01 04:43:26 +01:00
|
|
|
'DifferentialRevisionDependedOnByRevisionEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'DifferentialRevisionDependsOnRevisionEdgeType' => 'PhabricatorEdgeType',
|
2011-01-25 22:26:09 +01:00
|
|
|
'DifferentialRevisionEditController' => 'DifferentialController',
|
2015-12-21 18:02:55 +01:00
|
|
|
'DifferentialRevisionFulltextEngine' => 'PhabricatorFulltextEngine',
|
2015-01-01 04:43:26 +01:00
|
|
|
'DifferentialRevisionHasCommitEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'DifferentialRevisionHasReviewerEdgeType' => 'PhabricatorEdgeType',
|
2014-07-18 00:41:08 +02:00
|
|
|
'DifferentialRevisionHasTaskEdgeType' => 'PhabricatorEdgeType',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionHeraldField' => 'HeraldField',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DifferentialRevisionHeraldFieldGroup' => 'HeraldFieldGroup',
|
2014-03-08 02:05:00 +01:00
|
|
|
'DifferentialRevisionIDField' => 'DifferentialCustomField',
|
Land Revision button for hosted git repos
Summary:
ref T182.
Simple approach of clone, patch, push. While waiting for drydock, implement a hackish mutex
setup for the workspace, which should work ok as long as there's only one committer who is
carefull about theses things.
Less obvious note: This is taking the both author and commiter's 'primary email' for the commit -
which might rub some people wrong.
Test Plan:
With a hosted repo, created some diffs and landed them.
Also clicked button for some error cases, got the right error message.
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley
CC: hach-que, Korvin, epriestley, aran
Maniphest Tasks: T182
Differential Revision: https://secure.phabricator.com/D7486
2013-11-05 22:00:12 +01:00
|
|
|
'DifferentialRevisionLandController' => 'DifferentialController',
|
2014-05-08 19:08:37 +02:00
|
|
|
'DifferentialRevisionListController' => 'DifferentialController',
|
2011-10-02 20:42:41 +02:00
|
|
|
'DifferentialRevisionListView' => 'AphrontView',
|
2013-05-14 19:57:41 +02:00
|
|
|
'DifferentialRevisionMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2015-10-14 00:46:12 +02:00
|
|
|
'DifferentialRevisionOperationController' => 'DifferentialController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DifferentialRevisionPHIDType' => 'PhabricatorPHIDType',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionPackageHeraldField' => 'DifferentialRevisionHeraldField',
|
|
|
|
'DifferentialRevisionPackageOwnerHeraldField' => 'DifferentialRevisionHeraldField',
|
[Rough Sketch] Differential ObjectItemView Smexyness
Summary:
Tried out `PhabricatorObjectItemView` for Differential. It looks smexy and smooth.
Refs T2014
- Title and Date as Maniphest
- Author in the handle icon
- Bar color reflects revision status (Needs Review, Accepted, Abandoned etc.) @chad looking for non-blue is faster than keeping watch for everything that's not "Closed" in old table form
- Some status information are in footer icons; currently only stale/old status display as well as saved drafts, maybe more in future; these come into my mind:
- No reviewer warning
- Push Blocking Priority (T2730)
- Trivial, fast review guaranteed
- Sketch / Just looking for advice/help
- Arcanist Project (T2614)
- Denote "Public Send-in" (T1476)
{F37662}
{F37663}
{F37664}
{F37665}
Some flaws:
- Date and reviewers on every entry the same?
- No respect for Differential fields (for some reason, every entry appeared the same, so broke it to parts)
- Plenty of (potential) increase in height - advise reducing paging length from 100 to 50 - or just ignore me
Suggestions for the future:
- Expand the meta information regarding revisions; e.g. the various status displays above
- Uh... T2543, T1279, T793, T731 and what else I want for Differential, because they are awesome!
- T793 should be in particular easy appearance-wise, just copy-paste from Maniphest
Test Plan: By looking at it, of course. Verified there are no errors or crashed
Reviewers: epriestley, chad, btrahan, liguobig
Reviewed By: chad
CC: aran, Korvin, edward, nh
Maniphest Tasks: T2014
Differential Revision: https://secure.phabricator.com/D5451
Conflicts:
src/__celerity_resource_map__.php
2013-07-02 21:14:33 +02:00
|
|
|
'DifferentialRevisionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionRepositoryHeraldField' => 'DifferentialRevisionHeraldField',
|
|
|
|
'DifferentialRevisionRepositoryProjectsHeraldField' => 'DifferentialRevisionHeraldField',
|
|
|
|
'DifferentialRevisionReviewersHeraldField' => 'DifferentialRevisionHeraldField',
|
Use ApplicationSearch in Differential
Summary:
Ref T603. Ref T2625. Fixes T3241. Depends on D5451. Depends on D6346.
@wez, this changes the Differential revision list UI substantially and may generate a lot of bikeshedding / who-moved-my-cheese churn. See T3417 for context, for example. The motivations for this change are:
- The list now works on devices, like phones and tablets. This is a requirement to make the rest of Differential work on devices.
- Although ApplicationSearch intentionally presents a simpler interface initially and some options which were one click away before aren't now, it is much more powerful than the search it replaces and allows users to build, save, share, fork, edit, and customize a much wider range of queries. Users who used the old filters frequently can use Advanced Search -> Save Custom Query to create new versions of them, and of any other query. "Edit Queries.." allows users to remove and reorder queries, including builtin queries. Basically, there are like three things which have gone from "1-click" to "a few clicks", and ten trillion things which have gone from "hard/impossible" to "relatively easy".
The local screenshots look a bit iffy, but I think a lot of this is the fakenesss of my test data. If they still feel iffy in production we can tweak them until they feel good, like we did for Maniphest.
Test Plan:
{F48477}
{F48478}
Reviewers: btrahan, chad, wez
Reviewed By: btrahan
CC: aran, s
Maniphest Tasks: T603, T2625, T3241
Differential Revision: https://secure.phabricator.com/D6347
2013-07-03 15:11:07 +02:00
|
|
|
'DifferentialRevisionSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialRevisionStatus' => 'Phobject',
|
2015-07-08 21:25:48 +02:00
|
|
|
'DifferentialRevisionSummaryHeraldField' => 'DifferentialRevisionHeraldField',
|
|
|
|
'DifferentialRevisionTitleHeraldField' => 'DifferentialRevisionHeraldField',
|
2011-01-27 23:55:52 +01:00
|
|
|
'DifferentialRevisionUpdateHistoryView' => 'AphrontView',
|
|
|
|
'DifferentialRevisionViewController' => 'DifferentialController',
|
2014-09-18 17:25:34 +02:00
|
|
|
'DifferentialSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialSetDiffPropertyConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
2014-02-27 01:53:42 +01:00
|
|
|
'DifferentialStoredCustomField' => 'DifferentialCustomField',
|
2014-02-21 20:54:08 +01:00
|
|
|
'DifferentialSubscribersField' => 'DifferentialCoreCustomField',
|
2014-02-21 20:52:52 +01:00
|
|
|
'DifferentialSummaryField' => 'DifferentialCoreCustomField',
|
2014-02-21 20:53:27 +01:00
|
|
|
'DifferentialTestPlanField' => 'DifferentialCoreCustomField',
|
2014-02-21 20:52:52 +01:00
|
|
|
'DifferentialTitleField' => 'DifferentialCoreCustomField',
|
2013-06-21 21:54:29 +02:00
|
|
|
'DifferentialTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'DifferentialTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2014-02-19 01:32:55 +01:00
|
|
|
'DifferentialTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
Migrate Differential comments to ApplicationTransactions
Summary:
Ref T2222. This is the big one.
This migrates each `DifferentialComment` to one or more ApplicationTransactions (action, cc, reviewers, update, comment, inlines), and makes `DifferentialComment` a double-reader for ApplicationTransactions.
The migration is pretty straightforward:
- If a comment took an action not otherwise covered, it gets an "action" transaction. This is something like "epriestley abandoned this revision.".
- If a comment updated the diff, it gets an "updated diff" transaction. Very old transactions of this type may not have a diff ID (probably only at Facebook).
- If a comment added or removed reviewers, it gets a "changed reviewers" transaction.
- If a comment added CCs, it gets a "subscribers" transaction.
- If a comment added comment text, it gets a "comment" transaction.
- For each inline attached to a comment, we generate an "inline" transaction.
Most comments generate a small number of transactions, but a few generate a significant number.
At HEAD, the code is basically already doing this, so comments in the last day or two already obey these rules, roughly, and will all generate only one transaction (except inlines).
Because we've already preallocated PHIDs in the comment text table, we only need to write to the transaction table.
NOTE: This significantly degrades Differential, making inline comments pretty much useless (they each get their own transaction, and don't show line numbers or files). The data is all fine, but the UI is garbage now. This needs to be fixed before we can deploy this to users, but it's easily separable since it's all just display code.
Specifically, they look like this:
{F112270}
Test Plan:
I've migrated locally and put things through their paces, but it's hard to catch sketchy stuff locally because most of my test data is nonsense and bad migrations wouldn't necessarily look out of place.
IMPORTANT: I'm planning to push this to a branch and then shift production over to the branch, and run it for a day or two before bringing it to master.
I generally feel good about this change: it's not that big since we were able to separate a lot of pieces out of it, and it's pretty straightforward. That said, it's still one of the most scary/dangerous changes we've ever made.
Reviewers: btrahan
CC: chad, aran
Maniphest Tasks: T2222
Differential Revision: https://secure.phabricator.com/D8210
2014-02-12 00:36:58 +01:00
|
|
|
'DifferentialTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-02-12 23:05:40 +01:00
|
|
|
'DifferentialTransactionView' => 'PhabricatorApplicationTransactionView',
|
2016-02-29 18:53:46 +01:00
|
|
|
'DifferentialUnitField' => 'DifferentialCustomField',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DifferentialUnitStatus' => 'Phobject',
|
|
|
|
'DifferentialUnitTestResult' => 'Phobject',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DifferentialUpdateRevisionConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
2014-02-21 20:53:48 +01:00
|
|
|
'DifferentialViewPolicyField' => 'DifferentialCoreCustomField',
|
2014-07-18 00:45:21 +02:00
|
|
|
'DiffusionAuditorDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-08-31 19:17:54 +02:00
|
|
|
'DiffusionAuditorFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-08-03 15:01:24 +02:00
|
|
|
'DiffusionAuditorsAddAuditorsHeraldAction' => 'DiffusionAuditorsHeraldAction',
|
|
|
|
'DiffusionAuditorsAddSelfHeraldAction' => 'DiffusionAuditorsHeraldAction',
|
|
|
|
'DiffusionAuditorsHeraldAction' => 'HeraldAction',
|
2016-01-06 13:56:27 +01:00
|
|
|
'DiffusionBlameConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
|
|
|
'DiffusionBlameQuery' => 'DiffusionQuery',
|
2015-08-03 21:54:40 +02:00
|
|
|
'DiffusionBlockHeraldAction' => 'HeraldAction',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionBranchQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2012-05-10 09:28:19 +02:00
|
|
|
'DiffusionBranchTableController' => 'DiffusionController',
|
2011-03-13 01:17:34 +01:00
|
|
|
'DiffusionBranchTableView' => 'DiffusionView',
|
2011-03-08 02:25:47 +01:00
|
|
|
'DiffusionBrowseController' => 'DiffusionController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionBrowseQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionBrowseResultSet' => 'Phobject',
|
2011-03-13 01:17:34 +01:00
|
|
|
'DiffusionBrowseTableView' => 'DiffusionView',
|
2015-01-23 22:31:17 +01:00
|
|
|
'DiffusionCachedResolveRefsQuery' => 'DiffusionLowLevelQuery',
|
2011-03-14 06:03:30 +01:00
|
|
|
'DiffusionChangeController' => 'DiffusionController',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DiffusionChangeHeraldFieldGroup' => 'HeraldFieldGroup',
|
2016-04-19 00:22:52 +02:00
|
|
|
'DiffusionCommandEngine' => 'Phobject',
|
|
|
|
'DiffusionCommandEngineTestCase' => 'PhabricatorTestCase',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitAffectedFilesHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitAuthorHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitAutocloseHeraldField' => 'DiffusionCommitHeraldField',
|
2012-08-01 01:27:48 +02:00
|
|
|
'DiffusionCommitBranchesController' => 'DiffusionController',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitBranchesHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitCommitterHeraldField' => 'DiffusionCommitHeraldField',
|
2011-03-11 18:34:22 +01:00
|
|
|
'DiffusionCommitController' => 'DiffusionController',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitDiffContentAddedHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitDiffContentHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitDiffContentRemovedHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitDiffEnormousHeraldField' => 'DiffusionCommitHeraldField',
|
2012-08-08 19:03:41 +02:00
|
|
|
'DiffusionCommitEditController' => 'DiffusionController',
|
2015-12-21 18:02:55 +01:00
|
|
|
'DiffusionCommitFulltextEngine' => 'PhabricatorFulltextEngine',
|
2015-01-01 04:43:26 +01:00
|
|
|
'DiffusionCommitHasRevisionEdgeType' => 'PhabricatorEdgeType',
|
2014-07-18 00:42:06 +02:00
|
|
|
'DiffusionCommitHasTaskEdgeType' => 'PhabricatorEdgeType',
|
2013-12-20 21:38:15 +01:00
|
|
|
'DiffusionCommitHash' => 'Phobject',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitHeraldField' => 'HeraldField',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DiffusionCommitHeraldFieldGroup' => 'HeraldFieldGroup',
|
2013-12-03 00:45:36 +01:00
|
|
|
'DiffusionCommitHookEngine' => 'Phobject',
|
2013-12-03 19:28:39 +01:00
|
|
|
'DiffusionCommitHookRejectException' => 'Exception',
|
2015-12-05 21:54:51 +01:00
|
|
|
'DiffusionCommitMergeHeraldField' => 'DiffusionCommitHeraldField',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitMessageHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitPackageAuditHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitPackageHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitPackageOwnerHeraldField' => 'DiffusionCommitHeraldField',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionCommitParentsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2013-02-27 17:04:54 +01:00
|
|
|
'DiffusionCommitQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-12-19 02:48:06 +01:00
|
|
|
'DiffusionCommitRef' => 'Phobject',
|
2014-08-04 16:55:43 +02:00
|
|
|
'DiffusionCommitRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2014-12-02 03:48:20 +01:00
|
|
|
'DiffusionCommitRemarkupRuleTestCase' => 'PhabricatorTestCase',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitRepositoryHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitRepositoryProjectsHeraldField' => 'DiffusionCommitHeraldField',
|
Write edges for commit reverts
Summary:
Ref T1751. When a commit reverts another commit:
- Add an edge linking them;
- Show the edge in Diffusion.
Next steps are:
- If the reverted commit is associated with a Differential revision, leave a comment;
- Also leave a comment on the commit (no API yet);
- Also trigger an audit by the original commit's author.
Test Plan: Used `scripts/repository/reparse.php --message ...` to parse commits with revert language. Verified they appear correctly in Diffusion, and update Differential.
Reviewers: btrahan, epriestley
Reviewed By: btrahan, epriestley
Subscribers: Korvin, epriestley, cburroughs, joshuaspence, sascha-egerer, aran
Maniphest Tasks: T4896, T1751
Differential Revision: https://secure.phabricator.com/D5846
2015-01-04 20:52:38 +01:00
|
|
|
'DiffusionCommitRevertedByCommitEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'DiffusionCommitRevertsCommitEdgeType' => 'PhabricatorEdgeType',
|
2015-07-07 20:53:17 +02:00
|
|
|
'DiffusionCommitReviewerHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitRevisionAcceptedHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitRevisionHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitRevisionReviewersHeraldField' => 'DiffusionCommitHeraldField',
|
|
|
|
'DiffusionCommitRevisionSubscribersHeraldField' => 'DiffusionCommitHeraldField',
|
2012-08-01 01:27:48 +02:00
|
|
|
'DiffusionCommitTagsController' => 'DiffusionController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionConduitAPIMethod' => 'ConduitAPIMethod',
|
2011-03-08 00:13:36 +01:00
|
|
|
'DiffusionController' => 'PhabricatorController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionCreateCommentConduitAPIMethod' => 'DiffusionConduitAPIMethod',
|
2014-07-25 00:20:39 +02:00
|
|
|
'DiffusionCreateRepositoriesCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'DiffusionDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'DiffusionDefaultPushCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'DiffusionDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2011-03-31 02:36:16 +02:00
|
|
|
'DiffusionDiffController' => 'DiffusionController',
|
2015-03-09 20:50:33 +01:00
|
|
|
'DiffusionDiffInlineCommentQuery' => 'PhabricatorDiffInlineCommentQuery',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionDiffQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2013-07-26 19:31:35 +02:00
|
|
|
'DiffusionDoorkeeperCommitFeedStoryPublisher' => 'DoorkeeperFeedStoryPublisher',
|
2012-02-03 01:42:29 +01:00
|
|
|
'DiffusionEmptyResultView' => 'DiffusionView',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionExistsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
Improve Diffusion behavior for externals
Summary:
- Feature request from Airtime that I missed in the feedback notes, came up yesterday.
- Identify git submodules as "FILE_SUBMODULE", not "FILE_NORMAL".
- Link git submodules to an external resolver endpoint, which tries to find commits in tracked repositories.
- Identify git symlinks as "FILE_SYMLINK", not "FILE_NORMAL".
- Add folder, file, symlink and externals icons.
Test Plan:
- externals/javelin is now identified as a submoudule and links to Javelin, not identified as a file and links to error.
- bin/phd is now identified as a symlink.
- Interfaces have pretty icons.
Reviewers: btrahan, cpiro, ddfisher, keebuhm, allenjohnashton
Reviewed By: btrahan
CC: aran, epriestley
Differential Revision: https://secure.phabricator.com/D1975
2012-03-21 22:01:20 +01:00
|
|
|
'DiffusionExternalController' => 'DiffusionController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionExternalSymbolQuery' => 'Phobject',
|
|
|
|
'DiffusionExternalSymbolsSource' => 'Phobject',
|
2012-03-27 05:54:26 +02:00
|
|
|
'DiffusionFileContentQuery' => 'DiffusionQuery',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionFileContentQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
|
|
|
'DiffusionFindSymbolsConduitAPIMethod' => 'DiffusionConduitAPIMethod',
|
|
|
|
'DiffusionGetLintMessagesConduitAPIMethod' => 'DiffusionConduitAPIMethod',
|
|
|
|
'DiffusionGetRecentCommitsByPathConduitAPIMethod' => 'DiffusionConduitAPIMethod',
|
2016-01-06 13:56:27 +01:00
|
|
|
'DiffusionGitBlameQuery' => 'DiffusionBlameQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionGitBranch' => 'Phobject',
|
2013-05-01 23:56:36 +02:00
|
|
|
'DiffusionGitBranchTestCase' => 'PhabricatorTestCase',
|
2016-04-19 00:22:52 +02:00
|
|
|
'DiffusionGitCommandEngine' => 'DiffusionCommandEngine',
|
2011-03-08 18:54:55 +01:00
|
|
|
'DiffusionGitFileContentQuery' => 'DiffusionFileContentQuery',
|
2016-03-16 15:44:25 +01:00
|
|
|
'DiffusionGitLFSAuthenticateWorkflow' => 'DiffusionGitSSHWorkflow',
|
2016-03-16 20:42:21 +01:00
|
|
|
'DiffusionGitLFSResponse' => 'AphrontResponse',
|
2016-03-16 15:44:25 +01:00
|
|
|
'DiffusionGitLFSTemporaryTokenType' => 'PhabricatorAuthTemporaryTokenType',
|
2012-05-02 22:43:45 +02:00
|
|
|
'DiffusionGitRawDiffQuery' => 'DiffusionRawDiffQuery',
|
2015-01-04 20:33:18 +01:00
|
|
|
'DiffusionGitReceivePackSSHWorkflow' => 'DiffusionGitSSHWorkflow',
|
2011-03-08 23:29:02 +01:00
|
|
|
'DiffusionGitRequest' => 'DiffusionRequest',
|
2013-10-26 21:10:52 +02:00
|
|
|
'DiffusionGitResponse' => 'AphrontResponse',
|
Make cluster repositories more chatty
Summary:
Ref T10860. At least in Git over SSH, we can freely echo a bunch of stuff to stderr and Git will print it to the console, so we can tell users what's going on.
This should make debugging, etc., easier. We could tone this down a little bit once things are more stable if it's a little too chatty.
Test Plan:
```
$ echo D >> record && git commit -am D && git push
[master ca5efff] D
1 file changed, 1 insertion(+)
# Push received by "local001.phacility.net", forwarding to cluster host.
# Waiting up to 120 second(s) for a cluster write lock...
# Acquired write lock immediately.
# Waiting up to 120 second(s) for a cluster read lock on "local001.phacility.net"...
# Acquired read lock immediately.
# Device "local001.phacility.net" is already a cluster leader and does not need to be synchronized.
# Ready to receive on cluster host "local001.phacility.net".
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 256 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To ssh://local@localvault.phacility.com/diffusion/26/locktopia.git
8616189..ca5efff master -> master
```
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10860
Differential Revision: https://secure.phabricator.com/D15791
2016-04-24 18:49:18 +02:00
|
|
|
'DiffusionGitSSHWorkflow' => array(
|
|
|
|
'DiffusionSSHWorkflow',
|
|
|
|
'DiffusionRepositoryClusterEngineLogInterface',
|
|
|
|
),
|
2015-01-04 20:33:18 +01:00
|
|
|
'DiffusionGitUploadPackSSHWorkflow' => 'DiffusionGitSSHWorkflow',
|
2011-03-09 02:31:44 +01:00
|
|
|
'DiffusionHistoryController' => 'DiffusionController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionHistoryQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2011-03-13 01:17:34 +01:00
|
|
|
'DiffusionHistoryTableView' => 'DiffusionView',
|
2015-12-24 20:20:18 +01:00
|
|
|
'DiffusionHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension',
|
Add inline comments to Diffusion/Audit
Summary:
- Add inline comments to Audits, like Differential.
- Creates new storage for the comments in the Audits database.
- Creates a new PhabricatorAuditInlineComment class, similar to DifferentialInlineComment.
- Defines an Interface which Differential and Audit comments conform to.
- Makes consumers of DifferentialInlineComments consume objects which implement that interface instead.
- Adds save
NOTE: Some features are still missing! Wanted to cut this off before it got crazy:
- Inline comments aren't shown in the main comment list.
- Inline comments aren't shown in the emails.
- Inline comments aren't previewed.
I'll followup with those but this was getting pretty big.
@vrana, does the SQL change look correct?
Test Plan:
- Created, edited, deleted, replied to, reloaded and saved inline comments in Diffusion, on the left and right side of diffs.
- Created, edited, deleted, replied to, reloaded and saved inline comments in Differentila, on the left and right side of primary and diff-versus-diff diffs.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran, epriestley
Maniphest Tasks: T904
Differential Revision: https://secure.phabricator.com/D1898
2012-03-14 20:56:01 +01:00
|
|
|
'DiffusionInlineCommentController' => 'PhabricatorInlineCommentController',
|
2012-07-23 20:01:28 +02:00
|
|
|
'DiffusionInlineCommentPreviewController' => 'PhabricatorInlineCommentPreviewController',
|
2016-04-08 22:08:56 +02:00
|
|
|
'DiffusionInternalGitRawDiffQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2011-03-31 08:27:06 +02:00
|
|
|
'DiffusionLastModifiedController' => 'DiffusionController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionLastModifiedQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2012-11-08 20:11:44 +01:00
|
|
|
'DiffusionLintController' => 'DiffusionController',
|
2014-05-11 00:21:05 +02:00
|
|
|
'DiffusionLintCountQuery' => 'PhabricatorQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionLintSaveRunner' => 'Phobject',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionLookSoonConduitAPIMethod' => 'DiffusionConduitAPIMethod',
|
2013-12-20 21:38:44 +01:00
|
|
|
'DiffusionLowLevelCommitFieldsQuery' => 'DiffusionLowLevelQuery',
|
2013-12-19 20:05:06 +01:00
|
|
|
'DiffusionLowLevelCommitQuery' => 'DiffusionLowLevelQuery',
|
2013-10-30 21:06:09 +01:00
|
|
|
'DiffusionLowLevelGitRefQuery' => 'DiffusionLowLevelQuery',
|
2013-11-04 21:15:32 +01:00
|
|
|
'DiffusionLowLevelMercurialBranchesQuery' => 'DiffusionLowLevelQuery',
|
2014-08-28 22:08:42 +02:00
|
|
|
'DiffusionLowLevelMercurialPathsQuery' => 'DiffusionLowLevelQuery',
|
2015-10-13 02:50:26 +02:00
|
|
|
'DiffusionLowLevelMercurialPathsQueryTests' => 'PhabricatorTestCase',
|
2013-12-20 21:39:21 +01:00
|
|
|
'DiffusionLowLevelParentsQuery' => 'DiffusionLowLevelQuery',
|
2013-10-30 21:06:09 +01:00
|
|
|
'DiffusionLowLevelQuery' => 'Phobject',
|
2013-11-04 23:13:07 +01:00
|
|
|
'DiffusionLowLevelResolveRefsQuery' => 'DiffusionLowLevelQuery',
|
2016-01-06 13:56:27 +01:00
|
|
|
'DiffusionMercurialBlameQuery' => 'DiffusionBlameQuery',
|
2016-04-19 00:22:52 +02:00
|
|
|
'DiffusionMercurialCommandEngine' => 'DiffusionCommandEngine',
|
Basic support for Mercurial in Diffusion
Summary: Change import script plus almost all the view stuff. Still some rough
edges but this seems to mostly work. Blame is currently unsupported but I think
everything else works properly.
Test Plan:
Imported the hg repository itself. It doesn't immediately seem completely
broken. Here are some screens:
https://secure.phabricator.com/file/view/PHID-FILE-1438b71cc7c4a2eb4569/
https://secure.phabricator.com/file/view/PHID-FILE-3cec4f72f39e7de2d041/
https://secure.phabricator.com/file/view/PHID-FILE-2ea4883f160e8e5098f9/
https://secure.phabricator.com/file/view/PHID-FILE-35f751a36ebf65399ade/
All the parsers were able to churn through it without errors.
Ran the new "reparse.php" script in various one-commit and repository modes.
Browsed/imported some git repos for good measure.
NOTE: The hg repository is only 15,000 commits and around 1,000 files.
Performance is okay but hg doesn't provide performant, native APIs to get some
data efficiently so we have to do some dumb stuff. If some of these interfaces
are cripplingly slow or whatever, let me know and we can start bundling some
Mercurial extensions with Arcanist.
Reviewers: Makinde, jungejason, nh, tuomaspelkonen, aran
Reviewed By: Makinde
CC: aran, Makinde, epriestley
Differential Revision: 960
2011-09-26 20:07:38 +02:00
|
|
|
'DiffusionMercurialFileContentQuery' => 'DiffusionFileContentQuery',
|
2012-05-02 22:43:45 +02:00
|
|
|
'DiffusionMercurialRawDiffQuery' => 'DiffusionRawDiffQuery',
|
Basic support for Mercurial in Diffusion
Summary: Change import script plus almost all the view stuff. Still some rough
edges but this seems to mostly work. Blame is currently unsupported but I think
everything else works properly.
Test Plan:
Imported the hg repository itself. It doesn't immediately seem completely
broken. Here are some screens:
https://secure.phabricator.com/file/view/PHID-FILE-1438b71cc7c4a2eb4569/
https://secure.phabricator.com/file/view/PHID-FILE-3cec4f72f39e7de2d041/
https://secure.phabricator.com/file/view/PHID-FILE-2ea4883f160e8e5098f9/
https://secure.phabricator.com/file/view/PHID-FILE-35f751a36ebf65399ade/
All the parsers were able to churn through it without errors.
Ran the new "reparse.php" script in various one-commit and repository modes.
Browsed/imported some git repos for good measure.
NOTE: The hg repository is only 15,000 commits and around 1,000 files.
Performance is okay but hg doesn't provide performant, native APIs to get some
data efficiently so we have to do some dumb stuff. If some of these interfaces
are cripplingly slow or whatever, let me know and we can start bundling some
Mercurial extensions with Arcanist.
Reviewers: Makinde, jungejason, nh, tuomaspelkonen, aran
Reviewed By: Makinde
CC: aran, Makinde, epriestley
Differential Revision: 960
2011-09-26 20:07:38 +02:00
|
|
|
'DiffusionMercurialRequest' => 'DiffusionRequest',
|
2013-11-07 03:00:42 +01:00
|
|
|
'DiffusionMercurialResponse' => 'AphrontResponse',
|
2015-01-04 20:33:18 +01:00
|
|
|
'DiffusionMercurialSSHWorkflow' => 'DiffusionSSHWorkflow',
|
|
|
|
'DiffusionMercurialServeSSHWorkflow' => 'DiffusionMercurialSSHWorkflow',
|
|
|
|
'DiffusionMercurialWireClientSSHProtocolChannel' => 'PhutilProtocolChannel',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionMercurialWireProtocol' => 'Phobject',
|
2015-10-10 16:14:48 +02:00
|
|
|
'DiffusionMercurialWireProtocolTests' => 'PhabricatorTestCase',
|
2015-01-04 20:33:18 +01:00
|
|
|
'DiffusionMercurialWireSSHTestCase' => 'PhabricatorTestCase',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionMergedCommitsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionPathChange' => 'Phobject',
|
|
|
|
'DiffusionPathChangeQuery' => 'Phobject',
|
2011-04-04 04:20:47 +02:00
|
|
|
'DiffusionPathCompleteController' => 'DiffusionController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionPathIDQuery' => 'Phobject',
|
|
|
|
'DiffusionPathQuery' => 'Phobject',
|
2011-09-14 20:23:39 +02:00
|
|
|
'DiffusionPathQueryTestCase' => 'PhabricatorTestCase',
|
2014-05-13 23:08:21 +02:00
|
|
|
'DiffusionPathTreeController' => 'DiffusionController',
|
2011-04-04 04:20:47 +02:00
|
|
|
'DiffusionPathValidateController' => 'DiffusionController',
|
2015-05-31 16:36:54 +02:00
|
|
|
'DiffusionPhpExternalSymbolsSource' => 'DiffusionExternalSymbolsSource',
|
2015-07-08 21:26:57 +02:00
|
|
|
'DiffusionPreCommitContentAffectedFilesHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentAuthorHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentAuthorRawHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentBranchesHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentCommitterHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentCommitterRawHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentDiffContentAddedHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentDiffContentHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentDiffContentRemovedHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentDiffEnormousHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentHeraldField' => 'HeraldField',
|
|
|
|
'DiffusionPreCommitContentMergeHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentMessageHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentPusherHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentPusherIsCommitterHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentPusherProjectsHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentRepositoryHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentRepositoryProjectsHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentRevisionAcceptedHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentRevisionHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentRevisionReviewersHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
|
|
|
'DiffusionPreCommitContentRevisionSubscribersHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
2015-07-08 21:26:00 +02:00
|
|
|
'DiffusionPreCommitRefChangeHeraldField' => 'DiffusionPreCommitRefHeraldField',
|
|
|
|
'DiffusionPreCommitRefHeraldField' => 'HeraldField',
|
2015-07-16 23:13:13 +02:00
|
|
|
'DiffusionPreCommitRefHeraldFieldGroup' => 'HeraldFieldGroup',
|
2015-07-08 21:26:00 +02:00
|
|
|
'DiffusionPreCommitRefNameHeraldField' => 'DiffusionPreCommitRefHeraldField',
|
|
|
|
'DiffusionPreCommitRefPusherHeraldField' => 'DiffusionPreCommitRefHeraldField',
|
|
|
|
'DiffusionPreCommitRefPusherProjectsHeraldField' => 'DiffusionPreCommitRefHeraldField',
|
|
|
|
'DiffusionPreCommitRefRepositoryHeraldField' => 'DiffusionPreCommitRefHeraldField',
|
|
|
|
'DiffusionPreCommitRefRepositoryProjectsHeraldField' => 'DiffusionPreCommitRefHeraldField',
|
|
|
|
'DiffusionPreCommitRefTypeHeraldField' => 'DiffusionPreCommitRefHeraldField',
|
2016-01-28 14:21:38 +01:00
|
|
|
'DiffusionPullEventGarbageCollector' => 'PhabricatorGarbageCollector',
|
2014-07-25 00:20:39 +02:00
|
|
|
'DiffusionPushCapability' => 'PhabricatorPolicyCapability',
|
2014-03-26 15:42:30 +01:00
|
|
|
'DiffusionPushEventViewController' => 'DiffusionPushLogController',
|
|
|
|
'DiffusionPushLogController' => 'DiffusionController',
|
2014-05-13 23:00:24 +02:00
|
|
|
'DiffusionPushLogListController' => 'DiffusionPushLogController',
|
|
|
|
'DiffusionPushLogListView' => 'AphrontView',
|
2015-05-31 16:36:54 +02:00
|
|
|
'DiffusionPythonExternalSymbolsSource' => 'DiffusionExternalSymbolsSource',
|
2013-04-30 19:54:02 +02:00
|
|
|
'DiffusionQuery' => 'PhabricatorQuery',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionQueryCommitsConduitAPIMethod' => 'DiffusionConduitAPIMethod',
|
|
|
|
'DiffusionQueryConduitAPIMethod' => 'DiffusionConduitAPIMethod',
|
|
|
|
'DiffusionQueryPathsConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2012-05-02 22:43:45 +02:00
|
|
|
'DiffusionRawDiffQuery' => 'DiffusionQuery',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionRawDiffQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2014-12-31 20:54:52 +01:00
|
|
|
'DiffusionReadmeView' => 'DiffusionView',
|
2015-12-10 22:17:11 +01:00
|
|
|
'DiffusionRefDatasource' => 'PhabricatorTypeaheadDatasource',
|
2014-05-13 22:52:33 +02:00
|
|
|
'DiffusionRefNotFoundException' => 'Exception',
|
2015-04-27 12:49:57 +02:00
|
|
|
'DiffusionRefTableController' => 'DiffusionController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionRefsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionRenameHistoryQuery' => 'Phobject',
|
2016-04-28 00:40:35 +02:00
|
|
|
'DiffusionRepositoryActionsManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2016-04-27 00:54:01 +02:00
|
|
|
'DiffusionRepositoryAutomationManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2016-04-17 02:33:27 +02:00
|
|
|
'DiffusionRepositoryBasicsManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2016-04-27 19:51:13 +02:00
|
|
|
'DiffusionRepositoryBranchesManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2015-01-01 17:07:26 +01:00
|
|
|
'DiffusionRepositoryByIDRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2016-04-24 18:04:27 +02:00
|
|
|
'DiffusionRepositoryClusterEngine' => 'Phobject',
|
2011-03-13 01:17:34 +01:00
|
|
|
'DiffusionRepositoryController' => 'DiffusionController',
|
2014-07-11 01:18:04 +02:00
|
|
|
'DiffusionRepositoryDatasource' => 'PhabricatorTypeaheadDatasource',
|
Accept and route VCS HTTP requests
Summary:
Mostly ripped from D7391, with some changes:
- Serve repositories at `/diffusion/X/`, with no special `/git/` or `/serve/` URI component.
- This requires a little bit of magic, but I got the magic working for Git, Mercurial and SVN, and it seems reasonable.
- I think having one URI for everything will make it easier for users to understand.
- One downside is that git will clone into `X` by default, but I think that's not a big deal, and we can work around that in the future easily enough.
- Accept HTTP requests for Git, SVN and Mercurial repositories.
- Auth logic is a little different in order to be more consistent with how other things work.
- Instead of AphrontBasicAuthResponse, added "VCSResponse". Mercurial can print strings we send it on the CLI if we're careful, so support that. I did a fair amount of digging and didn't have any luck with git or svn.
- Commands we don't know about are assumed to require "Push" capability by default.
No actual VCS data going over the wire yet.
Test Plan:
Ran a bunch of stuff like this:
$ hg clone http://local.aphront.com:8080/diffusion/P/
abort: HTTP Error 403: This repository is not available over HTTP.
...and got pretty reasonable-seeming errors in all cases. All this can do is produce errors for now.
Reviewers: hach-que, btrahan
Reviewed By: hach-que
CC: aran
Maniphest Tasks: T2230
Differential Revision: https://secure.phabricator.com/D7417
2013-10-26 16:56:17 +02:00
|
|
|
'DiffusionRepositoryDefaultController' => 'DiffusionController',
|
2016-05-09 17:10:21 +02:00
|
|
|
'DiffusionRepositoryDocumentationManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2016-05-09 23:24:21 +02:00
|
|
|
'DiffusionRepositoryEditActivateController' => 'DiffusionRepositoryManageController',
|
2016-04-17 01:45:19 +02:00
|
|
|
'DiffusionRepositoryEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
2016-05-09 23:24:21 +02:00
|
|
|
'DiffusionRepositoryEditController' => 'DiffusionRepositoryManageController',
|
|
|
|
'DiffusionRepositoryEditDangerousController' => 'DiffusionRepositoryManageController',
|
|
|
|
'DiffusionRepositoryEditDeleteController' => 'DiffusionRepositoryManageController',
|
2016-04-17 01:45:19 +02:00
|
|
|
'DiffusionRepositoryEditEngine' => 'PhabricatorEditEngine',
|
2016-05-09 23:24:21 +02:00
|
|
|
'DiffusionRepositoryEditUpdateController' => 'DiffusionRepositoryManageController',
|
2016-04-17 02:33:27 +02:00
|
|
|
'DiffusionRepositoryHistoryManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2014-05-08 19:08:37 +02:00
|
|
|
'DiffusionRepositoryListController' => 'DiffusionController',
|
2016-04-11 19:17:46 +02:00
|
|
|
'DiffusionRepositoryManageController' => 'DiffusionController',
|
2016-05-09 23:24:21 +02:00
|
|
|
'DiffusionRepositoryManagePanelsController' => 'DiffusionRepositoryManageController',
|
2016-04-11 19:17:46 +02:00
|
|
|
'DiffusionRepositoryManagementPanel' => 'Phobject',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionRepositoryPath' => 'Phobject',
|
2016-04-17 02:33:27 +02:00
|
|
|
'DiffusionRepositoryPoliciesManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2014-01-18 01:10:56 +01:00
|
|
|
'DiffusionRepositoryRef' => 'Phobject',
|
2014-08-04 16:55:43 +02:00
|
|
|
'DiffusionRepositoryRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2016-04-17 01:45:19 +02:00
|
|
|
'DiffusionRepositorySearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
2016-04-26 14:54:51 +02:00
|
|
|
'DiffusionRepositoryStagingManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2016-04-17 14:10:18 +02:00
|
|
|
'DiffusionRepositoryStatusManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2016-04-26 14:43:35 +02:00
|
|
|
'DiffusionRepositoryStorageManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2016-05-11 02:13:11 +02:00
|
|
|
'DiffusionRepositorySubversionManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2016-04-27 19:32:43 +02:00
|
|
|
'DiffusionRepositorySymbolsManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionRepositoryTag' => 'Phobject',
|
2016-05-09 23:24:21 +02:00
|
|
|
'DiffusionRepositoryTestAutomationController' => 'DiffusionRepositoryManageController',
|
2016-05-01 15:59:22 +02:00
|
|
|
'DiffusionRepositoryURICredentialController' => 'DiffusionController',
|
2016-04-30 01:51:05 +02:00
|
|
|
'DiffusionRepositoryURIDisableController' => 'DiffusionController',
|
|
|
|
'DiffusionRepositoryURIEditController' => 'DiffusionController',
|
2016-04-28 19:40:35 +02:00
|
|
|
'DiffusionRepositoryURIViewController' => 'DiffusionController',
|
2016-01-12 15:45:17 +01:00
|
|
|
'DiffusionRepositoryURIsIndexEngineExtension' => 'PhabricatorIndexEngineExtension',
|
2016-04-17 17:17:49 +02:00
|
|
|
'DiffusionRepositoryURIsManagementPanel' => 'DiffusionRepositoryManagementPanel',
|
2016-04-29 23:10:04 +02:00
|
|
|
'DiffusionRepositoryURIsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DiffusionRequest' => 'Phobject',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionResolveRefsConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2013-12-19 20:05:17 +01:00
|
|
|
'DiffusionResolveUserQuery' => 'Phobject',
|
2013-10-26 19:46:09 +02:00
|
|
|
'DiffusionSSHWorkflow' => 'PhabricatorSSHWorkflow',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionSearchQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2013-11-07 02:55:46 +01:00
|
|
|
'DiffusionServeController' => 'DiffusionController',
|
2015-01-03 14:46:28 +01:00
|
|
|
'DiffusionSetPasswordSettingsPanel' => 'PhabricatorSettingsPanel',
|
2015-09-03 19:04:17 +02:00
|
|
|
'DiffusionSetupException' => 'Exception',
|
2016-04-19 00:22:52 +02:00
|
|
|
'DiffusionSubversionCommandEngine' => 'DiffusionCommandEngine',
|
2015-01-04 20:33:18 +01:00
|
|
|
'DiffusionSubversionSSHWorkflow' => 'DiffusionSSHWorkflow',
|
|
|
|
'DiffusionSubversionServeSSHWorkflow' => 'DiffusionSubversionSSHWorkflow',
|
2013-11-11 21:19:06 +01:00
|
|
|
'DiffusionSubversionWireProtocol' => 'Phobject',
|
|
|
|
'DiffusionSubversionWireProtocolTestCase' => 'PhabricatorTestCase',
|
2016-01-06 13:56:27 +01:00
|
|
|
'DiffusionSvnBlameQuery' => 'DiffusionBlameQuery',
|
2011-03-14 06:03:30 +01:00
|
|
|
'DiffusionSvnFileContentQuery' => 'DiffusionFileContentQuery',
|
2012-05-02 22:43:45 +02:00
|
|
|
'DiffusionSvnRawDiffQuery' => 'DiffusionRawDiffQuery',
|
2011-03-23 03:34:47 +01:00
|
|
|
'DiffusionSvnRequest' => 'DiffusionRequest',
|
2011-09-05 19:43:24 +02:00
|
|
|
'DiffusionSymbolController' => 'DiffusionController',
|
2014-07-18 00:48:36 +02:00
|
|
|
'DiffusionSymbolDatasource' => 'PhabricatorTypeaheadDatasource',
|
2012-08-01 21:36:47 +02:00
|
|
|
'DiffusionSymbolQuery' => 'PhabricatorOffsetPagedQuery',
|
2012-04-19 18:39:19 +02:00
|
|
|
'DiffusionTagListController' => 'DiffusionController',
|
2012-04-18 17:02:08 +02:00
|
|
|
'DiffusionTagListView' => 'DiffusionView',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionTagsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
|
2016-04-29 22:10:37 +02:00
|
|
|
'DiffusionURIEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
2016-04-28 17:33:44 +02:00
|
|
|
'DiffusionURIEditEngine' => 'PhabricatorEditEngine',
|
|
|
|
'DiffusionURIEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-05-20 01:37:39 +02:00
|
|
|
'DiffusionURITestCase' => 'PhutilTestCase',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'DiffusionUpdateCoverageConduitAPIMethod' => 'DiffusionConduitAPIMethod',
|
2011-03-13 01:17:34 +01:00
|
|
|
'DiffusionView' => 'AphrontView',
|
Port Diviner Core to Phabricator
Summary:
This implements most/all of the difficult parts of Diviner on top of Phabricator instead of as standalone components. See T988. In particular, here are the things I want to fix:
**Performance** The Diviner parser works in two stages. The first stage breaks source files into "Atoms". The second stage renders atoms into a display format (e.g., HTML). Diviner currently has a good caching story on the first step of the pipeline, but zero caching in the second step. This means it's very slow, even for a fairly small project like Phabricator. We must re-render every piece of documentation every time, instead of only changed documentation. Most of this diff concerns itself with addressing this problem. There's a fairly large explanatory comment about it, but the trickiest part is that when an atom changes, other atoms (defined in other places) may also change -- for example, if `class B extends A`, editing A should dirty B, even if B is in an entirely different file. We perform analysis in two stages to propagate these changes: first detecting direct changes, then detecting indirect changes. This isn't completely implemented -- we need to propagate 'extends' through more levels -- but I believe it's structurally correct and good enough until we actually document classes.
**Inheritance** Diviner currently has a very weak story on inheritance. I want to inherit a lot more metas/docs. If an interface documents a method, we should just pull that documentation in to every implementation by default (implementations can still override it if they want). It can be shown in grey or something, but it should be desirable and correct to omit documentation of a method implementation when you are implementing a parent. Similarly, I want to pull in inherited methods and @tasks and such. This diff sets up for that, by formalizing "extends" relationships between atoms.
**Overspecialization** Diviner currently specializes atoms (FileAtom, FunctionAtom, ClassAtom, etc.). This is pretty much not useful, because Atomizers (which produce the atoms) need to be highly specialized, and Renderers/Publishers (which consume the atoms) also need to be highly specialized. Nothing interesting actually lives in the atom specializations, and we don't benefit from having them -- it just costs us generality in storage/caches for them. In the new code, I've used a single Atom class to represent any type of atom.
**URIs** We have fairly hideous URIs right now, which are very cumbersome For in-app doc links, I want to provide nice URIs ("/h/notfications" or similar) which are stable redirects, and probably add remarkup for it: !{notifications} or similar. This diff isn't related to that since it's too premature.
**Search** Once we have a database generation target, we can index the documentation.
**Design** Chad has some nice mocks.
Test Plan: Ran `bin/diviner generate`, `bin/diviner generate --clean`. Saw appropriate graph propagation after edits. This diff doesn't do anything very useful yet.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4340
2013-01-07 23:04:23 +01:00
|
|
|
'DivinerArticleAtomizer' => 'DivinerAtomizer',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DivinerAtom' => 'Phobject',
|
2013-02-18 00:40:00 +01:00
|
|
|
'DivinerAtomCache' => 'DivinerDiskCache',
|
2013-06-01 00:14:39 +02:00
|
|
|
'DivinerAtomController' => 'DivinerController',
|
2014-05-08 19:08:37 +02:00
|
|
|
'DivinerAtomListController' => 'DivinerController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DivinerAtomPHIDType' => 'PhabricatorPHIDType',
|
2013-05-31 19:52:25 +02:00
|
|
|
'DivinerAtomQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DivinerAtomRef' => 'Phobject',
|
2013-05-31 19:52:25 +02:00
|
|
|
'DivinerAtomSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
Port Diviner Core to Phabricator
Summary:
This implements most/all of the difficult parts of Diviner on top of Phabricator instead of as standalone components. See T988. In particular, here are the things I want to fix:
**Performance** The Diviner parser works in two stages. The first stage breaks source files into "Atoms". The second stage renders atoms into a display format (e.g., HTML). Diviner currently has a good caching story on the first step of the pipeline, but zero caching in the second step. This means it's very slow, even for a fairly small project like Phabricator. We must re-render every piece of documentation every time, instead of only changed documentation. Most of this diff concerns itself with addressing this problem. There's a fairly large explanatory comment about it, but the trickiest part is that when an atom changes, other atoms (defined in other places) may also change -- for example, if `class B extends A`, editing A should dirty B, even if B is in an entirely different file. We perform analysis in two stages to propagate these changes: first detecting direct changes, then detecting indirect changes. This isn't completely implemented -- we need to propagate 'extends' through more levels -- but I believe it's structurally correct and good enough until we actually document classes.
**Inheritance** Diviner currently has a very weak story on inheritance. I want to inherit a lot more metas/docs. If an interface documents a method, we should just pull that documentation in to every implementation by default (implementations can still override it if they want). It can be shown in grey or something, but it should be desirable and correct to omit documentation of a method implementation when you are implementing a parent. Similarly, I want to pull in inherited methods and @tasks and such. This diff sets up for that, by formalizing "extends" relationships between atoms.
**Overspecialization** Diviner currently specializes atoms (FileAtom, FunctionAtom, ClassAtom, etc.). This is pretty much not useful, because Atomizers (which produce the atoms) need to be highly specialized, and Renderers/Publishers (which consume the atoms) also need to be highly specialized. Nothing interesting actually lives in the atom specializations, and we don't benefit from having them -- it just costs us generality in storage/caches for them. In the new code, I've used a single Atom class to represent any type of atom.
**URIs** We have fairly hideous URIs right now, which are very cumbersome For in-app doc links, I want to provide nice URIs ("/h/notfications" or similar) which are stable redirects, and probably add remarkup for it: !{notifications} or similar. This diff isn't related to that since it's too premature.
**Search** Once we have a database generation target, we can index the documentation.
**Design** Chad has some nice mocks.
Test Plan: Ran `bin/diviner generate`, `bin/diviner generate --clean`. Saw appropriate graph propagation after edits. This diff doesn't do anything very useful yet.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4340
2013-01-07 23:04:23 +01:00
|
|
|
'DivinerAtomizeWorkflow' => 'DivinerWorkflow',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DivinerAtomizer' => 'Phobject',
|
2013-06-04 20:15:34 +02:00
|
|
|
'DivinerBookController' => 'DivinerController',
|
2015-06-19 10:06:53 +02:00
|
|
|
'DivinerBookDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerBookEditController' => 'DivinerController',
|
2013-09-10 18:39:50 +02:00
|
|
|
'DivinerBookItemView' => 'AphrontTagView',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DivinerBookPHIDType' => 'PhabricatorPHIDType',
|
2013-05-31 19:52:25 +02:00
|
|
|
'DivinerBookQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'DivinerController' => 'PhabricatorController',
|
2013-05-20 19:18:26 +02:00
|
|
|
'DivinerDAO' => 'PhabricatorLiskDAO',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
Move Diviner further toward usability
Summary:
- Complete the "project" -> "book" stuff. This is cleaner conceptually and keeps us from having yet another meaning for the word "project".
- Normalize symbols during atomization. This simplifies publishing a great deal, and allows static documentation to link to dynamic documentation and vice versa, because the canonical names of symbols are agreed upon (we can tweak the actual algorithm).
- Give articles a specifiable name distinct from the title, and default to something like "support" instead of "Get Help! Get Support!" so URIs end up more readable (not "Get_Help!_Get_Support!").
- Have the atomizers set book information on atoms.
- Implement very basic publishers. Publishers are basically glue code between the atomization process and the rendering process -- the two we'll have initially are "static" (publish to files on disk) and "phabricator" (or similar -- publish into the database).
- Handle duplicate symbol definitions in the atomize and publish pipelines. This fixes the issue where a project defines two functions named "idx()" and we currently tell them not to do that and break. Realistically, this is common in the real world and we should just roll our eyes and do the legwork to generate documentation as best we can.
- Particularly, dirty all atoms with the same name as a dirty atom (e.g., if 'function f()' is updated, regnerate the documentation for all functions named f() in the book).
- When publishing, we publish these at "function/f/@1", "function/f/@2". The base page will offer to disambiguate ("There are 8 functions named 'f' in this codebase, which one do you want?").
- Implement a very very basic renderer. This generates the actual HTML (or text, or XML, or whatever else) for the documentation, which the publisher dumps onto disk or into a database or whatever.
- The atomize workflow actually needs to depend on books, at least sort of, so make it load config and use it properly.
- Propagate multilevel dirties through the graph. If "C extends B" and "B extends A", we should regenerate C when A changes. Prior to this diff, we would regnerate B only.
Test Plan: Generated some documentation. Named two articles "feedback", generated docs, saw "article/feedback/@1/" and "article/feedback/@2/" created.
Reviewers: btrahan, vrana, chad
Reviewed By: chad
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4896
2013-02-18 00:39:36 +01:00
|
|
|
'DivinerDefaultRenderer' => 'DivinerRenderer',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DivinerDiskCache' => 'Phobject',
|
Port Diviner Core to Phabricator
Summary:
This implements most/all of the difficult parts of Diviner on top of Phabricator instead of as standalone components. See T988. In particular, here are the things I want to fix:
**Performance** The Diviner parser works in two stages. The first stage breaks source files into "Atoms". The second stage renders atoms into a display format (e.g., HTML). Diviner currently has a good caching story on the first step of the pipeline, but zero caching in the second step. This means it's very slow, even for a fairly small project like Phabricator. We must re-render every piece of documentation every time, instead of only changed documentation. Most of this diff concerns itself with addressing this problem. There's a fairly large explanatory comment about it, but the trickiest part is that when an atom changes, other atoms (defined in other places) may also change -- for example, if `class B extends A`, editing A should dirty B, even if B is in an entirely different file. We perform analysis in two stages to propagate these changes: first detecting direct changes, then detecting indirect changes. This isn't completely implemented -- we need to propagate 'extends' through more levels -- but I believe it's structurally correct and good enough until we actually document classes.
**Inheritance** Diviner currently has a very weak story on inheritance. I want to inherit a lot more metas/docs. If an interface documents a method, we should just pull that documentation in to every implementation by default (implementations can still override it if they want). It can be shown in grey or something, but it should be desirable and correct to omit documentation of a method implementation when you are implementing a parent. Similarly, I want to pull in inherited methods and @tasks and such. This diff sets up for that, by formalizing "extends" relationships between atoms.
**Overspecialization** Diviner currently specializes atoms (FileAtom, FunctionAtom, ClassAtom, etc.). This is pretty much not useful, because Atomizers (which produce the atoms) need to be highly specialized, and Renderers/Publishers (which consume the atoms) also need to be highly specialized. Nothing interesting actually lives in the atom specializations, and we don't benefit from having them -- it just costs us generality in storage/caches for them. In the new code, I've used a single Atom class to represent any type of atom.
**URIs** We have fairly hideous URIs right now, which are very cumbersome For in-app doc links, I want to provide nice URIs ("/h/notfications" or similar) which are stable redirects, and probably add remarkup for it: !{notifications} or similar. This diff isn't related to that since it's too premature.
**Search** Once we have a database generation target, we can index the documentation.
**Design** Chad has some nice mocks.
Test Plan: Ran `bin/diviner generate`, `bin/diviner generate --clean`. Saw appropriate graph propagation after edits. This diff doesn't do anything very useful yet.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4340
2013-01-07 23:04:23 +01:00
|
|
|
'DivinerFileAtomizer' => 'DivinerAtomizer',
|
2013-07-28 22:07:30 +02:00
|
|
|
'DivinerFindController' => 'DivinerController',
|
Port Diviner Core to Phabricator
Summary:
This implements most/all of the difficult parts of Diviner on top of Phabricator instead of as standalone components. See T988. In particular, here are the things I want to fix:
**Performance** The Diviner parser works in two stages. The first stage breaks source files into "Atoms". The second stage renders atoms into a display format (e.g., HTML). Diviner currently has a good caching story on the first step of the pipeline, but zero caching in the second step. This means it's very slow, even for a fairly small project like Phabricator. We must re-render every piece of documentation every time, instead of only changed documentation. Most of this diff concerns itself with addressing this problem. There's a fairly large explanatory comment about it, but the trickiest part is that when an atom changes, other atoms (defined in other places) may also change -- for example, if `class B extends A`, editing A should dirty B, even if B is in an entirely different file. We perform analysis in two stages to propagate these changes: first detecting direct changes, then detecting indirect changes. This isn't completely implemented -- we need to propagate 'extends' through more levels -- but I believe it's structurally correct and good enough until we actually document classes.
**Inheritance** Diviner currently has a very weak story on inheritance. I want to inherit a lot more metas/docs. If an interface documents a method, we should just pull that documentation in to every implementation by default (implementations can still override it if they want). It can be shown in grey or something, but it should be desirable and correct to omit documentation of a method implementation when you are implementing a parent. Similarly, I want to pull in inherited methods and @tasks and such. This diff sets up for that, by formalizing "extends" relationships between atoms.
**Overspecialization** Diviner currently specializes atoms (FileAtom, FunctionAtom, ClassAtom, etc.). This is pretty much not useful, because Atomizers (which produce the atoms) need to be highly specialized, and Renderers/Publishers (which consume the atoms) also need to be highly specialized. Nothing interesting actually lives in the atom specializations, and we don't benefit from having them -- it just costs us generality in storage/caches for them. In the new code, I've used a single Atom class to represent any type of atom.
**URIs** We have fairly hideous URIs right now, which are very cumbersome For in-app doc links, I want to provide nice URIs ("/h/notfications" or similar) which are stable redirects, and probably add remarkup for it: !{notifications} or similar. This diff isn't related to that since it's too premature.
**Search** Once we have a database generation target, we can index the documentation.
**Design** Chad has some nice mocks.
Test Plan: Ran `bin/diviner generate`, `bin/diviner generate --clean`. Saw appropriate graph propagation after edits. This diff doesn't do anything very useful yet.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4340
2013-01-07 23:04:23 +01:00
|
|
|
'DivinerGenerateWorkflow' => 'DivinerWorkflow',
|
2013-05-21 00:52:54 +02:00
|
|
|
'DivinerLiveAtom' => 'DivinerDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DivinerLiveBook' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DivinerDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-06-16 23:09:53 +02:00
|
|
|
'PhabricatorProjectInterface',
|
2015-02-11 23:39:06 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2015-06-16 23:09:53 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2013-05-20 19:18:26 +02:00
|
|
|
),
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerLiveBookEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-12-21 18:02:55 +01:00
|
|
|
'DivinerLiveBookFulltextEngine' => 'PhabricatorFulltextEngine',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerLiveBookTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'DivinerLiveBookTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-05-20 19:18:26 +02:00
|
|
|
'DivinerLivePublisher' => 'DivinerPublisher',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DivinerLiveSymbol' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DivinerDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorMarkupInterface',
|
2015-02-11 23:39:06 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2013-05-31 19:52:25 +02:00
|
|
|
),
|
2015-12-21 18:02:55 +01:00
|
|
|
'DivinerLiveSymbolFulltextEngine' => 'PhabricatorFulltextEngine',
|
2014-03-05 22:07:50 +01:00
|
|
|
'DivinerMainController' => 'DivinerController',
|
2013-08-27 12:14:00 +02:00
|
|
|
'DivinerPHPAtomizer' => 'DivinerAtomizer',
|
|
|
|
'DivinerParameterTableView' => 'AphrontTagView',
|
2013-02-18 00:40:00 +01:00
|
|
|
'DivinerPublishCache' => 'DivinerDiskCache',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DivinerPublisher' => 'Phobject',
|
|
|
|
'DivinerRenderer' => 'Phobject',
|
2013-08-27 12:14:00 +02:00
|
|
|
'DivinerReturnTableView' => 'AphrontTagView',
|
2015-06-16 23:09:53 +02:00
|
|
|
'DivinerSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-09-05 21:29:07 +02:00
|
|
|
'DivinerSectionView' => 'AphrontTagView',
|
Move Diviner further toward usability
Summary:
- Complete the "project" -> "book" stuff. This is cleaner conceptually and keeps us from having yet another meaning for the word "project".
- Normalize symbols during atomization. This simplifies publishing a great deal, and allows static documentation to link to dynamic documentation and vice versa, because the canonical names of symbols are agreed upon (we can tweak the actual algorithm).
- Give articles a specifiable name distinct from the title, and default to something like "support" instead of "Get Help! Get Support!" so URIs end up more readable (not "Get_Help!_Get_Support!").
- Have the atomizers set book information on atoms.
- Implement very basic publishers. Publishers are basically glue code between the atomization process and the rendering process -- the two we'll have initially are "static" (publish to files on disk) and "phabricator" (or similar -- publish into the database).
- Handle duplicate symbol definitions in the atomize and publish pipelines. This fixes the issue where a project defines two functions named "idx()" and we currently tell them not to do that and break. Realistically, this is common in the real world and we should just roll our eyes and do the legwork to generate documentation as best we can.
- Particularly, dirty all atoms with the same name as a dirty atom (e.g., if 'function f()' is updated, regnerate the documentation for all functions named f() in the book).
- When publishing, we publish these at "function/f/@1", "function/f/@2". The base page will offer to disambiguate ("There are 8 functions named 'f' in this codebase, which one do you want?").
- Implement a very very basic renderer. This generates the actual HTML (or text, or XML, or whatever else) for the documentation, which the publisher dumps onto disk or into a database or whatever.
- The atomize workflow actually needs to depend on books, at least sort of, so make it load config and use it properly.
- Propagate multilevel dirties through the graph. If "C extends B" and "B extends A", we should regenerate C when A changes. Prior to this diff, we would regnerate B only.
Test Plan: Generated some documentation. Named two articles "feedback", generated docs, saw "article/feedback/@1/" and "article/feedback/@2/" created.
Reviewers: btrahan, vrana, chad
Reviewed By: chad
CC: aran
Maniphest Tasks: T988
Differential Revision: https://secure.phabricator.com/D4896
2013-02-18 00:39:36 +01:00
|
|
|
'DivinerStaticPublisher' => 'DivinerPublisher',
|
2014-08-04 16:55:43 +02:00
|
|
|
'DivinerSymbolRemarkupRule' => 'PhutilRemarkupRule',
|
2013-12-27 22:15:40 +01:00
|
|
|
'DivinerWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-01-03 00:25:25 +01:00
|
|
|
'DoorkeeperAsanaFeedWorker' => 'DoorkeeperFeedWorker',
|
2015-06-08 03:27:19 +02:00
|
|
|
'DoorkeeperAsanaRemarkupRule' => 'DoorkeeperRemarkupRule',
|
2013-06-25 00:54:54 +02:00
|
|
|
'DoorkeeperBridge' => 'Phobject',
|
|
|
|
'DoorkeeperBridgeAsana' => 'DoorkeeperBridge',
|
2016-03-09 15:30:22 +01:00
|
|
|
'DoorkeeperBridgeGitHub' => 'DoorkeeperBridge',
|
|
|
|
'DoorkeeperBridgeGitHubIssue' => 'DoorkeeperBridgeGitHub',
|
Bridge GitHub users into Phabricator and attribute actions to them
Summary:
Ref T10538. Ref T10537. This creates PHIDs which represent GitHub users, and uses them as the actors for synchronized comments.
I've just made them Doorkeeper objects. There are three major kinds of objects they //could// possibly be:
- Nuance requestor objects.
- External account objects.
- Doorkeeper objects.
I don't think we actually need distinct nuance requestor objects. These don't really do anything right now, and were originally created before Doorkeeper. I think Doorkeeper is a superset of nuance requestor functionality, and better developed and more flexible.
Likewise, doorkeeper objects are much more flexible than external account objects, and it's nice to imagine that we can import from Twootfeed or whatever without needing to build full OAuth for it. I also like less stuff touching auth code, when possible.
Making these separate from external accounts does make it a bit harder to reconcile external users with internal users, but I think that's OK, and that it's generally desirable to show the real source of a piece of content. That is, if I wrote a comment on GitHub but also have a Phabricator account, I think it's good to show "epriestley (GitHub)" (the GitHub user) as the author, not "epriestley" (the Phabricator user). I think this is generally less confusing overall, and we can add more linkage later to make it clearer.
Test Plan:
{F1194104}
{F1194105}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10537, T10538
Differential Revision: https://secure.phabricator.com/D15541
2016-03-28 21:01:18 +02:00
|
|
|
'DoorkeeperBridgeGitHubUser' => 'DoorkeeperBridgeGitHub',
|
2013-09-04 02:27:38 +02:00
|
|
|
'DoorkeeperBridgeJIRA' => 'DoorkeeperBridge',
|
2014-05-18 14:45:21 +02:00
|
|
|
'DoorkeeperBridgeJIRATestCase' => 'PhabricatorTestCase',
|
2016-03-25 13:29:19 +01:00
|
|
|
'DoorkeeperBridgedObjectCurtainExtension' => 'PHUICurtainExtension',
|
2013-06-25 00:54:36 +02:00
|
|
|
'DoorkeeperDAO' => 'PhabricatorLiskDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DoorkeeperExternalObject' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DoorkeeperDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-06-25 00:54:36 +02:00
|
|
|
),
|
Bridge GitHub users into Phabricator and attribute actions to them
Summary:
Ref T10538. Ref T10537. This creates PHIDs which represent GitHub users, and uses them as the actors for synchronized comments.
I've just made them Doorkeeper objects. There are three major kinds of objects they //could// possibly be:
- Nuance requestor objects.
- External account objects.
- Doorkeeper objects.
I don't think we actually need distinct nuance requestor objects. These don't really do anything right now, and were originally created before Doorkeeper. I think Doorkeeper is a superset of nuance requestor functionality, and better developed and more flexible.
Likewise, doorkeeper objects are much more flexible than external account objects, and it's nice to imagine that we can import from Twootfeed or whatever without needing to build full OAuth for it. I also like less stuff touching auth code, when possible.
Making these separate from external accounts does make it a bit harder to reconcile external users with internal users, but I think that's OK, and that it's generally desirable to show the real source of a piece of content. That is, if I wrote a comment on GitHub but also have a Phabricator account, I think it's good to show "epriestley (GitHub)" (the GitHub user) as the author, not "epriestley" (the Phabricator user). I think this is generally less confusing overall, and we can add more linkage later to make it clearer.
Test Plan:
{F1194104}
{F1194105}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10537, T10538
Differential Revision: https://secure.phabricator.com/D15541
2016-03-28 21:01:18 +02:00
|
|
|
'DoorkeeperExternalObjectPHIDType' => 'PhabricatorPHIDType',
|
2013-06-26 01:30:44 +02:00
|
|
|
'DoorkeeperExternalObjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DoorkeeperFeedStoryPublisher' => 'Phobject',
|
2013-09-11 00:22:01 +02:00
|
|
|
'DoorkeeperFeedWorker' => 'FeedPushWorker',
|
2013-06-25 00:55:08 +02:00
|
|
|
'DoorkeeperImportEngine' => 'Phobject',
|
2015-01-03 00:25:25 +01:00
|
|
|
'DoorkeeperJIRAFeedWorker' => 'DoorkeeperFeedWorker',
|
2015-06-08 03:27:19 +02:00
|
|
|
'DoorkeeperJIRARemarkupRule' => 'DoorkeeperRemarkupRule',
|
2014-04-02 21:03:59 +02:00
|
|
|
'DoorkeeperMissingLinkException' => 'Exception',
|
2013-06-25 00:54:54 +02:00
|
|
|
'DoorkeeperObjectRef' => 'Phobject',
|
2013-09-04 02:27:38 +02:00
|
|
|
'DoorkeeperRemarkupRule' => 'PhutilRemarkupRule',
|
2014-09-18 20:15:49 +02:00
|
|
|
'DoorkeeperSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-11-25 23:54:35 +01:00
|
|
|
'DoorkeeperTagView' => 'AphrontView',
|
2013-06-25 00:55:08 +02:00
|
|
|
'DoorkeeperTagsController' => 'PhabricatorController',
|
Implement a rough AlmanacService blueprint in Drydock
Summary:
Ref T9253. Broadly, this realigns Allocator behavior to be more consistent and straightforward and amenable to intended future changes.
This attempts to make language more consistent: resources are "allocated" and leases are "acquired".
This prepares for (but does not implement) optimistic "slot locking", as discussed in D10304. Although I suspect some blueprints will need to perform other locking eventually, this does feel like a good fit for most of the locking blueprints need to do.
In particular, I've made the blueprint operations on `$resource` and `$lease` objects more purposeful: they need to invoke an activator on the appropriate object to be implemented correctly. Before they invoke this activator method, they configure the object. In a future diff, this configuration will include specifying slot locks that the lease or resource must acquire. So the API will be something like:
$lease
->setActivateWhenAcquired(true)
->needSlotLock('x')
->needSlotLock('y')
->acquireOnResource($resource);
In the common case where slot locks are a good fit, I think this should make correct blueprint implementation very straightforward.
This prepares for (but does not implement) resources and leases which need significant setup steps. I've basically carved out two modes:
- The "activate immediately" mode, as here, immediately opens the resource or activates the lease. This is appropriate if little or no setup is required. I expect many leases to operate in this mode, although I expect many resources will operate in the other mode.
- The "allocate now, activate later" mode, which is not fully implemented yet. This will queue setup workers when the allocator exits. Overall, this will work very similarly to Harbormaster.
- This new structure makes it acceptable for blueprints to sleep as long as they want during resource allocation and lease acquisition, so long as they are not waiting on anything which needs to be completed by the queue. Putting a `sleep(15 * 60)` in your EC2Blueprint to wait for EC2 to bring a machine up will perform worse than using delayed activation, but won't deadlock the queue or block any locks.
Overall, this flow is more similar to Harbormaster's flow. Having consistency between Harbormaster's model and Drydock's model is good, and I think Harbormaster's model is also simply much better than Drydock's (what exists today in Drydock was implemented a long time ago, and we had more support and infrastructure by the time Harbormaster was implemented, as well as a more clearly defined problem).
The particular strength of Harbormaster is that objects always (or almost always, at least) have a single, clearly defined writer. Ensuring objects have only one writer prevents races and makes reasoning about everything easier.
Drydock does not currently have a clearly defined single writer, but this moves us in that direction. We'll probably need more primitives eventually to flesh this out, like Harbormaster's command queue for messaging objects which you can't write to.
This blueprint was originally implemented in D13843. This makes a few changes to the blueprint itself:
- A bunch of code from that (e.g., interfaces) doesn't exist yet.
- I let the blueprint have multiple services. This simplifies the code a little and seems like it costs us nothing.
This also removes `bin/drydock create-resource`, which no longer makes sense to expose. It won't get locking, leasing, etc., correct, and can not be made correct.
NOTE: This technically works but doesn't do anything useful yet.
Test Plan: Used `bin/drydock lease --type host` to acquire leases against these blueprints.
Reviewers: hach-que, chad
Reviewed By: hach-que, chad
Subscribers: Mnkras
Maniphest Tasks: T9253
Differential Revision: https://secure.phabricator.com/D14117
2015-09-21 13:43:53 +02:00
|
|
|
'DrydockAlmanacServiceHostBlueprintImplementation' => 'DrydockBlueprintImplementation',
|
2012-03-27 05:54:26 +02:00
|
|
|
'DrydockApacheWebrootInterface' => 'DrydockWebrootInterface',
|
Rough cut of "Blueprint Authorizations"
Summary:
Ref T9519. This is like 80% of the way there and doesn't fully work yet, but roughly shows the shape of things to come. Here's how it works:
First, there's a new custom field type for blueprints which works like a normal typeahead but has some extra logic. It's implemented this way to make it easy to add to Blueprints in Drydock and Build Plans in Harbormaster. Here, I've added a "Use Blueprints" field to the "WorkingCopy" blueprint, so you can control which hosts the working copies are permitted to allocate on:
{F869865}
This control has a bit of custom rendering logic. Instead of rendering a normal list of PHIDs, it renders an annotated list with icons:
{F869866}
These icons show whether the blueprint on the other size of the authorization has approved this object. Once you have a green checkmark, you're good to go.
On the blueprint side, things look like this:
{F869867}
This table shows all the objects which have asked for access to this blueprint. In this case it's showing that one object is approved to use the blueprint since I already approved it, but by default new requests come in here as "Authorization Requested" and someone has to go approve them.
You approve them from within the authorization detail screen:
{F869868}
You can use the "Approve" or "Decline" buttons to allow or prevent use of the blueprint.
This doesn't actually do anything yet -- objects don't need to be authorized in order to use blueprints quite yet. That will come in the next diff, I just wanted to get the UI in reasonable shape first.
The authorization also has a second piece of state, which is whether the request from the object is active or inactive. We use this to keep track of the authorization if the blueprint is (maybe temporarily) deleted.
For example, you might have a Build Plan that uses Blueprints A and B. For a couple days, you only want to use A, so you remove B from the "Use Blueprints: ..." field. Later, you can add B back and it will connect to its old authorization again, so you don't need to go re-approve things (and if you're declined, you stay declined instead of being able to request authorization over and over again). This should make working with authorizations a little easier and less labor intensive.
Stuff not in this diff:
- Actually preventing any allocations (next diff).
- Probably should have transactions for approve/decline, at least, at some point, so there's a log of who did approvals and when.
- Maybe should have a more clear/loud error state when no blueprints are approved?
- Should probably restrict the typeahead to specific blueprint types.
Test Plan:
- Added the field.
- Typed some stuff into it.
- Saw the UI update properly.
- Approved an authorization.
- Declined an authorization.
- Saw active authorizations on a blueprint page.
- Didn't see any inactive authroizations there.
- Clicked "View All Authorizations", saw all authorizations.
Reviewers: chad, hach-que
Reviewed By: chad
Maniphest Tasks: T9519
Differential Revision: https://secure.phabricator.com/D14251
2015-10-10 16:15:25 +02:00
|
|
|
'DrydockAuthorization' => array(
|
|
|
|
'DrydockDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'DrydockAuthorizationAuthorizeController' => 'DrydockController',
|
|
|
|
'DrydockAuthorizationListController' => 'DrydockController',
|
|
|
|
'DrydockAuthorizationListView' => 'AphrontView',
|
|
|
|
'DrydockAuthorizationPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'DrydockAuthorizationQuery' => 'DrydockQuery',
|
|
|
|
'DrydockAuthorizationSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'DrydockAuthorizationViewController' => 'DrydockController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DrydockBlueprint' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DrydockDAO',
|
2014-12-03 22:16:15 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
2014-08-12 00:39:00 +02:00
|
|
|
'PhabricatorCustomFieldInterface',
|
2016-03-03 13:17:24 +01:00
|
|
|
'PhabricatorNgramsInterface',
|
2016-03-03 14:52:21 +01:00
|
|
|
'PhabricatorProjectInterface',
|
2013-12-03 01:09:07 +01:00
|
|
|
),
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockBlueprintController' => 'DrydockController',
|
2014-08-12 00:39:00 +02:00
|
|
|
'DrydockBlueprintCoreCustomField' => array(
|
|
|
|
'DrydockBlueprintCustomField',
|
|
|
|
'PhabricatorStandardCustomFieldInterface',
|
|
|
|
),
|
|
|
|
'DrydockBlueprintCustomField' => 'PhabricatorCustomField',
|
2015-08-24 13:13:20 +02:00
|
|
|
'DrydockBlueprintDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-09-24 19:18:17 +02:00
|
|
|
'DrydockBlueprintDisableController' => 'DrydockBlueprintController',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockBlueprintEditController' => 'DrydockBlueprintController',
|
2016-03-03 13:34:47 +01:00
|
|
|
'DrydockBlueprintEditEngine' => 'PhabricatorEditEngine',
|
2014-01-09 21:19:54 +01:00
|
|
|
'DrydockBlueprintEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DrydockBlueprintImplementation' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'DrydockBlueprintImplementationTestCase' => 'PhabricatorTestCase',
|
2014-05-08 19:08:37 +02:00
|
|
|
'DrydockBlueprintListController' => 'DrydockBlueprintController',
|
2016-03-03 13:17:24 +01:00
|
|
|
'DrydockBlueprintNameNgrams' => 'PhabricatorSearchNgrams',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DrydockBlueprintPHIDType' => 'PhabricatorPHIDType',
|
2013-12-27 22:15:30 +01:00
|
|
|
'DrydockBlueprintQuery' => 'DrydockQuery',
|
2013-12-26 21:30:04 +01:00
|
|
|
'DrydockBlueprintSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-01-09 21:19:54 +01:00
|
|
|
'DrydockBlueprintTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'DrydockBlueprintTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockBlueprintViewController' => 'DrydockBlueprintController',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockCommand' => array(
|
|
|
|
'DrydockDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2016-03-07 00:13:40 +01:00
|
|
|
'DrydockCommandError' => 'Phobject',
|
Drydock Rough Cut
Summary:
Rough cut of Drydock. This is very basic and doesn't do much of use yet (it
//does// allocate EC2 machines as host resources and expose interfaces to them),
but I think the overall structure is more or less reasonable.
== Interfaces
Vision: Applications interact with Drydock resources through DrydockInterfaces,
like **command**, **filesystem** and **httpd** interfaces. Each interface allows
applications to perform some kind of operation on the resource, like executing
commands, reading/writing files, or configuring a web server. Interfaces have a
concrete, specific API:
// Filesystem Interface
$fs = $lease->getInterface('filesystem'); // Constants, some day?
$fs->writeFile('index.html', 'hello world!');
// Command Interface
$cmd = $lease->getInterface('command');
echo $cmd->execx('uptime');
// HTTPD Interface
$httpd = $lease->getInterface('httpd');
$httpd->restart();
Interfaces are mostly just stock, although installs might add new interfaces if
they expose different ways to interact with resources (for instance, a resource
might want to expose a new 'MongoDB' interface or whatever).
Currently: We have like part of a command interface.
== Leases
Vision: Leases keep track of which resources are in use, and what they're being
used for. They allow us to know when we need to allocate more resources (too
many sandcastles on the existing hosts, e.g.) and when we can release resources
(because they are no longer being used). They also give applications something
to hold while resources are being allocated.
// EXAMPLE: How this should work some day.
$allocator = new DrydockAllocator();
$allocator->setResourceType('sandcastle');
$allocator->setAttributes(
array(
'diffID' => $diff->getID(),
));
$lease = $allocator->allocate();
$diff->setSandcastleLeaseID($lease->getID());
// ...
if ($lease->getStatus() == DrydockLeaseStatus::STATUS_ACTIVE) {
$sandcastle_link = $lease->getInterface('httpd')->getURI('/');
} else {
$sandcastle_link = 'Still building your sandcastle...';
}
echo "Sandcastle for this diff: ".$sandcastle_link;
// EXAMPLE: How this actually works now.
$allocator = new DrydockAllocator();
$allocator->setResourceType('host');
// NOTE: Allocation is currently synchronous but will be task-driven soon.
$lease = $allocator->allocate();
Leases are completely stock, installs will not define new lease types.
Currently: Leases exist and work but are very very basic.
== Resources
Vision: Resources represent some actual thing we've put somewhere, whether it's
a host, a block of storage, a webroot, or whatever else. Applications interact
through resources by acquiring leases to them, and then getting interfaces
through these leases. The lease acquisition process has a side effect of
allocating new resources if a lease can't be acquired on existing resources
(e.g., the application wants storage but all storage resources are full) and
things are configured to autoscale.
Resources may themselves acquire leases in order to allocate. For instance, a
storage resource might first acquire a lease to a host resource. A 'test
scaffold' resource might lease a storage resource and a mysql resource.
Not all resources are auto-allocate: the entry-level version of Drydock is that
you manually allocate a couple boxes and configure them through the web console.
Then, e.g., 'storage' / 'webroot' resources allocate on top of them, but the
host pool itself does not autoscale.
Resources are completely stock, they are abstract shells representing any
arbitrary thing.
Currently: Resource exist ('host' only) but are very very basic.
== Blueprints
Vision: Blueprints contain instructions for building interfaces to, (possibly)
allocating, updating, managing, and destroying a specific type of resource in a
specific location. One way to think of them is that they are scripts for
creating and deleting resources. For example, the LocalHost, RemoteHost and
EC2Host blueprints can all manage 'host' resources.
Eventually, we will support more types of resources (storage, webroot,
sandcastle, test scaffold, phacility deployment) and more providers for resource
types, some of which will be in the Phabricator mainline and some of which will
be custom.
Blueprints are very custom and specific to application types, so installs will
define new blueprints if they are making significant use of Drydock.
Currently: They exist but have few capabilities. The stock blueprints do nearly
nothing useful. There is a technically functional blueprint for host allocation
in EC2.
== Allocator
This is just the actual code to execute the lease acquisition process.
Test Plan: Ran "drydock_control.php" script, it allocated a machine in EC2,
acquired a lease on it, interfaced with it, and then released the lease. Ran it
again, got a fresh lease on the existing resource.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D1454
2012-01-11 20:18:40 +01:00
|
|
|
'DrydockCommandInterface' => 'DrydockInterface',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockCommandQuery' => 'DrydockQuery',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockConsoleController' => 'DrydockController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DrydockConstants' => 'Phobject',
|
Drydock Rough Cut
Summary:
Rough cut of Drydock. This is very basic and doesn't do much of use yet (it
//does// allocate EC2 machines as host resources and expose interfaces to them),
but I think the overall structure is more or less reasonable.
== Interfaces
Vision: Applications interact with Drydock resources through DrydockInterfaces,
like **command**, **filesystem** and **httpd** interfaces. Each interface allows
applications to perform some kind of operation on the resource, like executing
commands, reading/writing files, or configuring a web server. Interfaces have a
concrete, specific API:
// Filesystem Interface
$fs = $lease->getInterface('filesystem'); // Constants, some day?
$fs->writeFile('index.html', 'hello world!');
// Command Interface
$cmd = $lease->getInterface('command');
echo $cmd->execx('uptime');
// HTTPD Interface
$httpd = $lease->getInterface('httpd');
$httpd->restart();
Interfaces are mostly just stock, although installs might add new interfaces if
they expose different ways to interact with resources (for instance, a resource
might want to expose a new 'MongoDB' interface or whatever).
Currently: We have like part of a command interface.
== Leases
Vision: Leases keep track of which resources are in use, and what they're being
used for. They allow us to know when we need to allocate more resources (too
many sandcastles on the existing hosts, e.g.) and when we can release resources
(because they are no longer being used). They also give applications something
to hold while resources are being allocated.
// EXAMPLE: How this should work some day.
$allocator = new DrydockAllocator();
$allocator->setResourceType('sandcastle');
$allocator->setAttributes(
array(
'diffID' => $diff->getID(),
));
$lease = $allocator->allocate();
$diff->setSandcastleLeaseID($lease->getID());
// ...
if ($lease->getStatus() == DrydockLeaseStatus::STATUS_ACTIVE) {
$sandcastle_link = $lease->getInterface('httpd')->getURI('/');
} else {
$sandcastle_link = 'Still building your sandcastle...';
}
echo "Sandcastle for this diff: ".$sandcastle_link;
// EXAMPLE: How this actually works now.
$allocator = new DrydockAllocator();
$allocator->setResourceType('host');
// NOTE: Allocation is currently synchronous but will be task-driven soon.
$lease = $allocator->allocate();
Leases are completely stock, installs will not define new lease types.
Currently: Leases exist and work but are very very basic.
== Resources
Vision: Resources represent some actual thing we've put somewhere, whether it's
a host, a block of storage, a webroot, or whatever else. Applications interact
through resources by acquiring leases to them, and then getting interfaces
through these leases. The lease acquisition process has a side effect of
allocating new resources if a lease can't be acquired on existing resources
(e.g., the application wants storage but all storage resources are full) and
things are configured to autoscale.
Resources may themselves acquire leases in order to allocate. For instance, a
storage resource might first acquire a lease to a host resource. A 'test
scaffold' resource might lease a storage resource and a mysql resource.
Not all resources are auto-allocate: the entry-level version of Drydock is that
you manually allocate a couple boxes and configure them through the web console.
Then, e.g., 'storage' / 'webroot' resources allocate on top of them, but the
host pool itself does not autoscale.
Resources are completely stock, they are abstract shells representing any
arbitrary thing.
Currently: Resource exist ('host' only) but are very very basic.
== Blueprints
Vision: Blueprints contain instructions for building interfaces to, (possibly)
allocating, updating, managing, and destroying a specific type of resource in a
specific location. One way to think of them is that they are scripts for
creating and deleting resources. For example, the LocalHost, RemoteHost and
EC2Host blueprints can all manage 'host' resources.
Eventually, we will support more types of resources (storage, webroot,
sandcastle, test scaffold, phacility deployment) and more providers for resource
types, some of which will be in the Phabricator mainline and some of which will
be custom.
Blueprints are very custom and specific to application types, so installs will
define new blueprints if they are making significant use of Drydock.
Currently: They exist but have few capabilities. The stock blueprints do nearly
nothing useful. There is a technically functional blueprint for host allocation
in EC2.
== Allocator
This is just the actual code to execute the lease acquisition process.
Test Plan: Ran "drydock_control.php" script, it allocated a machine in EC2,
acquired a lease on it, interfaced with it, and then released the lease. Ran it
again, got a fresh lease on the existing resource.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D1454
2012-01-11 20:18:40 +01:00
|
|
|
'DrydockController' => 'PhabricatorController',
|
2014-07-25 00:20:39 +02:00
|
|
|
'DrydockCreateBlueprintsCapability' => 'PhabricatorPolicyCapability',
|
Drydock Rough Cut
Summary:
Rough cut of Drydock. This is very basic and doesn't do much of use yet (it
//does// allocate EC2 machines as host resources and expose interfaces to them),
but I think the overall structure is more or less reasonable.
== Interfaces
Vision: Applications interact with Drydock resources through DrydockInterfaces,
like **command**, **filesystem** and **httpd** interfaces. Each interface allows
applications to perform some kind of operation on the resource, like executing
commands, reading/writing files, or configuring a web server. Interfaces have a
concrete, specific API:
// Filesystem Interface
$fs = $lease->getInterface('filesystem'); // Constants, some day?
$fs->writeFile('index.html', 'hello world!');
// Command Interface
$cmd = $lease->getInterface('command');
echo $cmd->execx('uptime');
// HTTPD Interface
$httpd = $lease->getInterface('httpd');
$httpd->restart();
Interfaces are mostly just stock, although installs might add new interfaces if
they expose different ways to interact with resources (for instance, a resource
might want to expose a new 'MongoDB' interface or whatever).
Currently: We have like part of a command interface.
== Leases
Vision: Leases keep track of which resources are in use, and what they're being
used for. They allow us to know when we need to allocate more resources (too
many sandcastles on the existing hosts, e.g.) and when we can release resources
(because they are no longer being used). They also give applications something
to hold while resources are being allocated.
// EXAMPLE: How this should work some day.
$allocator = new DrydockAllocator();
$allocator->setResourceType('sandcastle');
$allocator->setAttributes(
array(
'diffID' => $diff->getID(),
));
$lease = $allocator->allocate();
$diff->setSandcastleLeaseID($lease->getID());
// ...
if ($lease->getStatus() == DrydockLeaseStatus::STATUS_ACTIVE) {
$sandcastle_link = $lease->getInterface('httpd')->getURI('/');
} else {
$sandcastle_link = 'Still building your sandcastle...';
}
echo "Sandcastle for this diff: ".$sandcastle_link;
// EXAMPLE: How this actually works now.
$allocator = new DrydockAllocator();
$allocator->setResourceType('host');
// NOTE: Allocation is currently synchronous but will be task-driven soon.
$lease = $allocator->allocate();
Leases are completely stock, installs will not define new lease types.
Currently: Leases exist and work but are very very basic.
== Resources
Vision: Resources represent some actual thing we've put somewhere, whether it's
a host, a block of storage, a webroot, or whatever else. Applications interact
through resources by acquiring leases to them, and then getting interfaces
through these leases. The lease acquisition process has a side effect of
allocating new resources if a lease can't be acquired on existing resources
(e.g., the application wants storage but all storage resources are full) and
things are configured to autoscale.
Resources may themselves acquire leases in order to allocate. For instance, a
storage resource might first acquire a lease to a host resource. A 'test
scaffold' resource might lease a storage resource and a mysql resource.
Not all resources are auto-allocate: the entry-level version of Drydock is that
you manually allocate a couple boxes and configure them through the web console.
Then, e.g., 'storage' / 'webroot' resources allocate on top of them, but the
host pool itself does not autoscale.
Resources are completely stock, they are abstract shells representing any
arbitrary thing.
Currently: Resource exist ('host' only) but are very very basic.
== Blueprints
Vision: Blueprints contain instructions for building interfaces to, (possibly)
allocating, updating, managing, and destroying a specific type of resource in a
specific location. One way to think of them is that they are scripts for
creating and deleting resources. For example, the LocalHost, RemoteHost and
EC2Host blueprints can all manage 'host' resources.
Eventually, we will support more types of resources (storage, webroot,
sandcastle, test scaffold, phacility deployment) and more providers for resource
types, some of which will be in the Phabricator mainline and some of which will
be custom.
Blueprints are very custom and specific to application types, so installs will
define new blueprints if they are making significant use of Drydock.
Currently: They exist but have few capabilities. The stock blueprints do nearly
nothing useful. There is a technically functional blueprint for host allocation
in EC2.
== Allocator
This is just the actual code to execute the lease acquisition process.
Test Plan: Ran "drydock_control.php" script, it allocated a machine in EC2,
acquired a lease on it, interfaced with it, and then released the lease. Ran it
again, got a fresh lease on the existing resource.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D1454
2012-01-11 20:18:40 +01:00
|
|
|
'DrydockDAO' => 'PhabricatorLiskDAO',
|
2014-07-25 00:20:39 +02:00
|
|
|
'DrydockDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'DrydockDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2013-12-06 04:11:05 +01:00
|
|
|
'DrydockFilesystemInterface' => 'DrydockInterface',
|
2015-06-15 10:02:26 +02:00
|
|
|
'DrydockInterface' => 'Phobject',
|
2015-10-14 00:46:12 +02:00
|
|
|
'DrydockLandRepositoryOperation' => 'DrydockRepositoryOperationType',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DrydockLease' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DrydockDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-12-26 19:42:00 +01:00
|
|
|
),
|
2015-10-01 17:10:07 +02:00
|
|
|
'DrydockLeaseAcquiredLogType' => 'DrydockLogType',
|
|
|
|
'DrydockLeaseActivatedLogType' => 'DrydockLogType',
|
2015-10-01 17:11:42 +02:00
|
|
|
'DrydockLeaseActivationFailureLogType' => 'DrydockLogType',
|
|
|
|
'DrydockLeaseActivationYieldLogType' => 'DrydockLogType',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockLeaseController' => 'DrydockController',
|
2015-08-24 13:13:20 +02:00
|
|
|
'DrydockLeaseDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-10-01 17:10:07 +02:00
|
|
|
'DrydockLeaseDestroyedLogType' => 'DrydockLogType',
|
2014-05-13 21:14:33 +02:00
|
|
|
'DrydockLeaseListController' => 'DrydockLeaseController',
|
|
|
|
'DrydockLeaseListView' => 'AphrontView',
|
2015-10-13 02:02:35 +02:00
|
|
|
'DrydockLeaseNoAuthorizationsLogType' => 'DrydockLogType',
|
|
|
|
'DrydockLeaseNoBlueprintsLogType' => 'DrydockLogType',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DrydockLeasePHIDType' => 'PhabricatorPHIDType',
|
2013-12-27 22:15:30 +01:00
|
|
|
'DrydockLeaseQuery' => 'DrydockQuery',
|
2015-10-01 17:10:07 +02:00
|
|
|
'DrydockLeaseQueuedLogType' => 'DrydockLogType',
|
Make Drydock reclaim unused resources when it reaches a resource limit
Summary:
Fixes T9994. Currently, when Drydock can't allocate a new resource because some limit has been reached, it waits patiently for a resource to become available.
It is possible that no resource will ever become available. Particularly with "Working Copy" resources, the new lease may want a copy of `rB`, but the resource may already be maxed out on `rA`.
Right now, no process exists to automatically reclaim the unused `rA`.
When we encounter this situation, try to reclaim one of the other resources if it is just sitting there unused.
Specifically:
- Add a "reclaim" command which means "release this resource //if// it is completely unused".
- Add a `bin/drydock reclaim` to send this command to every active resource.
- When we try to acquire a resource and can't, but only because of some kind of limit / utilization problem, try to release an unused resource to free up some room.
Test Plan:
- Set "Working Copy" resource limit to 1.
- Ran "Test Configuration" in `rA`, which worked.
- Ran "Test Configuration" in `rB`, which hung forever.
- Applied patch.
- Ran "Test Configuration" in `rB`, saw it reclaim the `rA` resource, use the slot, then succeed.
- Ran "Test Configuration" in `rA` again, saw it grab the slot back.
- Ran `bin/drydock reclaim` and saw it reclaim a bunch of old orphaned resources.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9994
Differential Revision: https://secure.phabricator.com/D14819
2015-12-18 17:44:13 +01:00
|
|
|
'DrydockLeaseReclaimLogType' => 'DrydockLogType',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockLeaseReleaseController' => 'DrydockLeaseController',
|
2015-10-01 17:10:07 +02:00
|
|
|
'DrydockLeaseReleasedLogType' => 'DrydockLogType',
|
2013-12-26 19:42:00 +01:00
|
|
|
'DrydockLeaseSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
Drydock Rough Cut
Summary:
Rough cut of Drydock. This is very basic and doesn't do much of use yet (it
//does// allocate EC2 machines as host resources and expose interfaces to them),
but I think the overall structure is more or less reasonable.
== Interfaces
Vision: Applications interact with Drydock resources through DrydockInterfaces,
like **command**, **filesystem** and **httpd** interfaces. Each interface allows
applications to perform some kind of operation on the resource, like executing
commands, reading/writing files, or configuring a web server. Interfaces have a
concrete, specific API:
// Filesystem Interface
$fs = $lease->getInterface('filesystem'); // Constants, some day?
$fs->writeFile('index.html', 'hello world!');
// Command Interface
$cmd = $lease->getInterface('command');
echo $cmd->execx('uptime');
// HTTPD Interface
$httpd = $lease->getInterface('httpd');
$httpd->restart();
Interfaces are mostly just stock, although installs might add new interfaces if
they expose different ways to interact with resources (for instance, a resource
might want to expose a new 'MongoDB' interface or whatever).
Currently: We have like part of a command interface.
== Leases
Vision: Leases keep track of which resources are in use, and what they're being
used for. They allow us to know when we need to allocate more resources (too
many sandcastles on the existing hosts, e.g.) and when we can release resources
(because they are no longer being used). They also give applications something
to hold while resources are being allocated.
// EXAMPLE: How this should work some day.
$allocator = new DrydockAllocator();
$allocator->setResourceType('sandcastle');
$allocator->setAttributes(
array(
'diffID' => $diff->getID(),
));
$lease = $allocator->allocate();
$diff->setSandcastleLeaseID($lease->getID());
// ...
if ($lease->getStatus() == DrydockLeaseStatus::STATUS_ACTIVE) {
$sandcastle_link = $lease->getInterface('httpd')->getURI('/');
} else {
$sandcastle_link = 'Still building your sandcastle...';
}
echo "Sandcastle for this diff: ".$sandcastle_link;
// EXAMPLE: How this actually works now.
$allocator = new DrydockAllocator();
$allocator->setResourceType('host');
// NOTE: Allocation is currently synchronous but will be task-driven soon.
$lease = $allocator->allocate();
Leases are completely stock, installs will not define new lease types.
Currently: Leases exist and work but are very very basic.
== Resources
Vision: Resources represent some actual thing we've put somewhere, whether it's
a host, a block of storage, a webroot, or whatever else. Applications interact
through resources by acquiring leases to them, and then getting interfaces
through these leases. The lease acquisition process has a side effect of
allocating new resources if a lease can't be acquired on existing resources
(e.g., the application wants storage but all storage resources are full) and
things are configured to autoscale.
Resources may themselves acquire leases in order to allocate. For instance, a
storage resource might first acquire a lease to a host resource. A 'test
scaffold' resource might lease a storage resource and a mysql resource.
Not all resources are auto-allocate: the entry-level version of Drydock is that
you manually allocate a couple boxes and configure them through the web console.
Then, e.g., 'storage' / 'webroot' resources allocate on top of them, but the
host pool itself does not autoscale.
Resources are completely stock, they are abstract shells representing any
arbitrary thing.
Currently: Resource exist ('host' only) but are very very basic.
== Blueprints
Vision: Blueprints contain instructions for building interfaces to, (possibly)
allocating, updating, managing, and destroying a specific type of resource in a
specific location. One way to think of them is that they are scripts for
creating and deleting resources. For example, the LocalHost, RemoteHost and
EC2Host blueprints can all manage 'host' resources.
Eventually, we will support more types of resources (storage, webroot,
sandcastle, test scaffold, phacility deployment) and more providers for resource
types, some of which will be in the Phabricator mainline and some of which will
be custom.
Blueprints are very custom and specific to application types, so installs will
define new blueprints if they are making significant use of Drydock.
Currently: They exist but have few capabilities. The stock blueprints do nearly
nothing useful. There is a technically functional blueprint for host allocation
in EC2.
== Allocator
This is just the actual code to execute the lease acquisition process.
Test Plan: Ran "drydock_control.php" script, it allocated a machine in EC2,
acquired a lease on it, interfaced with it, and then released the lease. Ran it
again, got a fresh lease on the existing resource.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D1454
2012-01-11 20:18:40 +01:00
|
|
|
'DrydockLeaseStatus' => 'DrydockConstants',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockLeaseUpdateWorker' => 'DrydockWorker',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockLeaseViewController' => 'DrydockLeaseController',
|
2015-10-01 17:11:42 +02:00
|
|
|
'DrydockLeaseWaitingForResourcesLogType' => 'DrydockLogType',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DrydockLog' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DrydockDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-12-26 21:30:29 +01:00
|
|
|
),
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockLogController' => 'DrydockController',
|
2015-10-01 17:09:27 +02:00
|
|
|
'DrydockLogGarbageCollector' => 'PhabricatorGarbageCollector',
|
2014-05-13 21:14:33 +02:00
|
|
|
'DrydockLogListController' => 'DrydockLogController',
|
|
|
|
'DrydockLogListView' => 'AphrontView',
|
2013-12-27 22:15:30 +01:00
|
|
|
'DrydockLogQuery' => 'DrydockQuery',
|
2013-12-26 21:30:29 +01:00
|
|
|
'DrydockLogSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-10-01 17:10:07 +02:00
|
|
|
'DrydockLogType' => 'Phobject',
|
2015-09-21 13:46:02 +02:00
|
|
|
'DrydockManagementCommandWorkflow' => 'DrydockManagementWorkflow',
|
2012-11-01 23:30:14 +01:00
|
|
|
'DrydockManagementLeaseWorkflow' => 'DrydockManagementWorkflow',
|
Make Drydock reclaim unused resources when it reaches a resource limit
Summary:
Fixes T9994. Currently, when Drydock can't allocate a new resource because some limit has been reached, it waits patiently for a resource to become available.
It is possible that no resource will ever become available. Particularly with "Working Copy" resources, the new lease may want a copy of `rB`, but the resource may already be maxed out on `rA`.
Right now, no process exists to automatically reclaim the unused `rA`.
When we encounter this situation, try to reclaim one of the other resources if it is just sitting there unused.
Specifically:
- Add a "reclaim" command which means "release this resource //if// it is completely unused".
- Add a `bin/drydock reclaim` to send this command to every active resource.
- When we try to acquire a resource and can't, but only because of some kind of limit / utilization problem, try to release an unused resource to free up some room.
Test Plan:
- Set "Working Copy" resource limit to 1.
- Ran "Test Configuration" in `rA`, which worked.
- Ran "Test Configuration" in `rB`, which hung forever.
- Applied patch.
- Ran "Test Configuration" in `rB`, saw it reclaim the `rA` resource, use the slot, then succeed.
- Ran "Test Configuration" in `rA` again, saw it grab the slot back.
- Ran `bin/drydock reclaim` and saw it reclaim a bunch of old orphaned resources.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9994
Differential Revision: https://secure.phabricator.com/D14819
2015-12-18 17:44:13 +01:00
|
|
|
'DrydockManagementReclaimWorkflow' => 'DrydockManagementWorkflow',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockManagementReleaseLeaseWorkflow' => 'DrydockManagementWorkflow',
|
|
|
|
'DrydockManagementReleaseResourceWorkflow' => 'DrydockManagementWorkflow',
|
|
|
|
'DrydockManagementUpdateLeaseWorkflow' => 'DrydockManagementWorkflow',
|
|
|
|
'DrydockManagementUpdateResourceWorkflow' => 'DrydockManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'DrydockManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-10-14 00:45:59 +02:00
|
|
|
'DrydockObjectAuthorizationView' => 'AphrontView',
|
2013-12-27 22:15:30 +01:00
|
|
|
'DrydockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-10-14 00:46:12 +02:00
|
|
|
'DrydockRepositoryOperation' => array(
|
|
|
|
'DrydockDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2016-03-03 15:34:18 +01:00
|
|
|
'DrydockRepositoryOperationController' => 'DrydockController',
|
|
|
|
'DrydockRepositoryOperationDismissController' => 'DrydockRepositoryOperationController',
|
|
|
|
'DrydockRepositoryOperationListController' => 'DrydockRepositoryOperationController',
|
2015-10-14 00:46:12 +02:00
|
|
|
'DrydockRepositoryOperationPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'DrydockRepositoryOperationQuery' => 'DrydockQuery',
|
2015-10-17 03:47:05 +02:00
|
|
|
'DrydockRepositoryOperationSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2016-03-03 15:34:18 +01:00
|
|
|
'DrydockRepositoryOperationStatusController' => 'DrydockRepositoryOperationController',
|
2015-10-21 20:28:26 +02:00
|
|
|
'DrydockRepositoryOperationStatusView' => 'AphrontView',
|
2015-10-14 00:46:12 +02:00
|
|
|
'DrydockRepositoryOperationType' => 'Phobject',
|
|
|
|
'DrydockRepositoryOperationUpdateWorker' => 'DrydockWorker',
|
2016-03-03 15:34:18 +01:00
|
|
|
'DrydockRepositoryOperationViewController' => 'DrydockRepositoryOperationController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'DrydockResource' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'DrydockDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-11-27 22:32:51 +01:00
|
|
|
),
|
2015-10-01 17:11:42 +02:00
|
|
|
'DrydockResourceActivationFailureLogType' => 'DrydockLogType',
|
|
|
|
'DrydockResourceActivationYieldLogType' => 'DrydockLogType',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockResourceController' => 'DrydockController',
|
2015-08-24 13:13:20 +02:00
|
|
|
'DrydockResourceDatasource' => 'PhabricatorTypeaheadDatasource',
|
2014-05-13 21:14:33 +02:00
|
|
|
'DrydockResourceListController' => 'DrydockResourceController',
|
|
|
|
'DrydockResourceListView' => 'AphrontView',
|
2014-07-24 00:05:46 +02:00
|
|
|
'DrydockResourcePHIDType' => 'PhabricatorPHIDType',
|
2013-12-27 22:15:30 +01:00
|
|
|
'DrydockResourceQuery' => 'DrydockQuery',
|
Make Drydock reclaim unused resources when it reaches a resource limit
Summary:
Fixes T9994. Currently, when Drydock can't allocate a new resource because some limit has been reached, it waits patiently for a resource to become available.
It is possible that no resource will ever become available. Particularly with "Working Copy" resources, the new lease may want a copy of `rB`, but the resource may already be maxed out on `rA`.
Right now, no process exists to automatically reclaim the unused `rA`.
When we encounter this situation, try to reclaim one of the other resources if it is just sitting there unused.
Specifically:
- Add a "reclaim" command which means "release this resource //if// it is completely unused".
- Add a `bin/drydock reclaim` to send this command to every active resource.
- When we try to acquire a resource and can't, but only because of some kind of limit / utilization problem, try to release an unused resource to free up some room.
Test Plan:
- Set "Working Copy" resource limit to 1.
- Ran "Test Configuration" in `rA`, which worked.
- Ran "Test Configuration" in `rB`, which hung forever.
- Applied patch.
- Ran "Test Configuration" in `rB`, saw it reclaim the `rA` resource, use the slot, then succeed.
- Ran "Test Configuration" in `rA` again, saw it grab the slot back.
- Ran `bin/drydock reclaim` and saw it reclaim a bunch of old orphaned resources.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9994
Differential Revision: https://secure.phabricator.com/D14819
2015-12-18 17:44:13 +01:00
|
|
|
'DrydockResourceReclaimLogType' => 'DrydockLogType',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockResourceReleaseController' => 'DrydockResourceController',
|
2013-12-26 21:30:10 +01:00
|
|
|
'DrydockResourceSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
Drydock Rough Cut
Summary:
Rough cut of Drydock. This is very basic and doesn't do much of use yet (it
//does// allocate EC2 machines as host resources and expose interfaces to them),
but I think the overall structure is more or less reasonable.
== Interfaces
Vision: Applications interact with Drydock resources through DrydockInterfaces,
like **command**, **filesystem** and **httpd** interfaces. Each interface allows
applications to perform some kind of operation on the resource, like executing
commands, reading/writing files, or configuring a web server. Interfaces have a
concrete, specific API:
// Filesystem Interface
$fs = $lease->getInterface('filesystem'); // Constants, some day?
$fs->writeFile('index.html', 'hello world!');
// Command Interface
$cmd = $lease->getInterface('command');
echo $cmd->execx('uptime');
// HTTPD Interface
$httpd = $lease->getInterface('httpd');
$httpd->restart();
Interfaces are mostly just stock, although installs might add new interfaces if
they expose different ways to interact with resources (for instance, a resource
might want to expose a new 'MongoDB' interface or whatever).
Currently: We have like part of a command interface.
== Leases
Vision: Leases keep track of which resources are in use, and what they're being
used for. They allow us to know when we need to allocate more resources (too
many sandcastles on the existing hosts, e.g.) and when we can release resources
(because they are no longer being used). They also give applications something
to hold while resources are being allocated.
// EXAMPLE: How this should work some day.
$allocator = new DrydockAllocator();
$allocator->setResourceType('sandcastle');
$allocator->setAttributes(
array(
'diffID' => $diff->getID(),
));
$lease = $allocator->allocate();
$diff->setSandcastleLeaseID($lease->getID());
// ...
if ($lease->getStatus() == DrydockLeaseStatus::STATUS_ACTIVE) {
$sandcastle_link = $lease->getInterface('httpd')->getURI('/');
} else {
$sandcastle_link = 'Still building your sandcastle...';
}
echo "Sandcastle for this diff: ".$sandcastle_link;
// EXAMPLE: How this actually works now.
$allocator = new DrydockAllocator();
$allocator->setResourceType('host');
// NOTE: Allocation is currently synchronous but will be task-driven soon.
$lease = $allocator->allocate();
Leases are completely stock, installs will not define new lease types.
Currently: Leases exist and work but are very very basic.
== Resources
Vision: Resources represent some actual thing we've put somewhere, whether it's
a host, a block of storage, a webroot, or whatever else. Applications interact
through resources by acquiring leases to them, and then getting interfaces
through these leases. The lease acquisition process has a side effect of
allocating new resources if a lease can't be acquired on existing resources
(e.g., the application wants storage but all storage resources are full) and
things are configured to autoscale.
Resources may themselves acquire leases in order to allocate. For instance, a
storage resource might first acquire a lease to a host resource. A 'test
scaffold' resource might lease a storage resource and a mysql resource.
Not all resources are auto-allocate: the entry-level version of Drydock is that
you manually allocate a couple boxes and configure them through the web console.
Then, e.g., 'storage' / 'webroot' resources allocate on top of them, but the
host pool itself does not autoscale.
Resources are completely stock, they are abstract shells representing any
arbitrary thing.
Currently: Resource exist ('host' only) but are very very basic.
== Blueprints
Vision: Blueprints contain instructions for building interfaces to, (possibly)
allocating, updating, managing, and destroying a specific type of resource in a
specific location. One way to think of them is that they are scripts for
creating and deleting resources. For example, the LocalHost, RemoteHost and
EC2Host blueprints can all manage 'host' resources.
Eventually, we will support more types of resources (storage, webroot,
sandcastle, test scaffold, phacility deployment) and more providers for resource
types, some of which will be in the Phabricator mainline and some of which will
be custom.
Blueprints are very custom and specific to application types, so installs will
define new blueprints if they are making significant use of Drydock.
Currently: They exist but have few capabilities. The stock blueprints do nearly
nothing useful. There is a technically functional blueprint for host allocation
in EC2.
== Allocator
This is just the actual code to execute the lease acquisition process.
Test Plan: Ran "drydock_control.php" script, it allocated a machine in EC2,
acquired a lease on it, interfaced with it, and then released the lease. Ran it
again, got a fresh lease on the existing resource.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D1454
2012-01-11 20:18:40 +01:00
|
|
|
'DrydockResourceStatus' => 'DrydockConstants',
|
Add a command queue to Drydock to manage lease/resource release
Summary:
Ref T9252. Broadly, Drydock currently races on releasing objects from the "active" state. To reproduce this:
- Scatter some sleep()s pretty much anywhere in the release code.
- Release several times from web UI or CLI in quick succession.
Resources or leases will execute some release code twice or otherwise do inconsistent things.
(I didn't chase down a detailed reproduction scenario for this since inspection of the code makes it clear that there are no meaningful locks or mechanisms preventing this.)
Instead, add a Harbormaster-style command queue to resources and leases. When something wants to do a release, it adds a command to the queue and schedules a worker. The workers acquire a lock, then try to consume commands from the queue.
This guarantees that only one process is responsible for writes to active resource/leases.
This is the last major step to giving resources and leases a single writer during all states:
- Resource, Unsaved: AllocatorWorker
- Resource, Pending: ResourceWorker (Possible rename to "Allocated?")
- Resource, Open: This diff, ResourceUpdateWorker. (Likely rename to "Active").
- Resource, Closed/Broken: Future destruction worker. (Likely rename to "Released" / "Broken"; maybe remove "Broken").
- Resource, Destroyed: No writes.
- Lease, Unsaved: Whatever wants the lease.
- Lease, Pending: AllocatorWorker
- Lease, Acquired: LeaseWorker
- Lease, Active: This diff, LeaseUpdateWorker.
- Lease, Released/Broken: Future destruction worker (Maybe remove "Broken"?)
- Lease, Expired: No writes. (Likely rename to "Destroyed").
In most phases, we can already guarantee that there is a single writer without doing any extra work. This is more complicated in the "Active" case because the release buttons on the web UI, the release tools on the CLI, the lease requestor itself, the garbage collector, and any other release process cleaning up related objects may try to effect a release. All of these could race one another (and, in many cases, race other processes from other phases because all of these get to act immediately) as this code is currently written. Using a queue here lets us make sure there's only a single writer in this phase.
One thing which is notable is that whatever acquires a lease **can not write to it**! It is never the writer once it queues the lease for activation. It can not write to any resources, either. And, likewise, Blueprints can not write to resources while acquiring or releasing leases.
We may need to provide a mechinism so that blueprints and/or resource/lease holders get to attach some storage to resources/leases for bookkeeping. For example, a blueprint might need to keep some kind of cache on a resource to help it manage state. But I think we can cross that bridge when we come to it, and nothing else would need to write to this storage so it's technically straightforward to introduce such a mechanism if we need one.
Test Plan:
- Viewed buttons in web UI, checked enabled/disabled states.
- Clicked the buttons.
- Saw commands show up in the command queue.
- Saw some daemon stuff get scheduled.
- Ran CLI tools, saw commands get consumed and resources/leases release.
Reviewers: hach-que, chad
Reviewed By: chad
Maniphest Tasks: T9252
Differential Revision: https://secure.phabricator.com/D14143
2015-09-23 16:42:08 +02:00
|
|
|
'DrydockResourceUpdateWorker' => 'DrydockWorker',
|
2013-12-26 21:30:36 +01:00
|
|
|
'DrydockResourceViewController' => 'DrydockResourceController',
|
2013-12-06 04:11:05 +01:00
|
|
|
'DrydockSFTPFilesystemInterface' => 'DrydockFilesystemInterface',
|
Drydock Rough Cut
Summary:
Rough cut of Drydock. This is very basic and doesn't do much of use yet (it
//does// allocate EC2 machines as host resources and expose interfaces to them),
but I think the overall structure is more or less reasonable.
== Interfaces
Vision: Applications interact with Drydock resources through DrydockInterfaces,
like **command**, **filesystem** and **httpd** interfaces. Each interface allows
applications to perform some kind of operation on the resource, like executing
commands, reading/writing files, or configuring a web server. Interfaces have a
concrete, specific API:
// Filesystem Interface
$fs = $lease->getInterface('filesystem'); // Constants, some day?
$fs->writeFile('index.html', 'hello world!');
// Command Interface
$cmd = $lease->getInterface('command');
echo $cmd->execx('uptime');
// HTTPD Interface
$httpd = $lease->getInterface('httpd');
$httpd->restart();
Interfaces are mostly just stock, although installs might add new interfaces if
they expose different ways to interact with resources (for instance, a resource
might want to expose a new 'MongoDB' interface or whatever).
Currently: We have like part of a command interface.
== Leases
Vision: Leases keep track of which resources are in use, and what they're being
used for. They allow us to know when we need to allocate more resources (too
many sandcastles on the existing hosts, e.g.) and when we can release resources
(because they are no longer being used). They also give applications something
to hold while resources are being allocated.
// EXAMPLE: How this should work some day.
$allocator = new DrydockAllocator();
$allocator->setResourceType('sandcastle');
$allocator->setAttributes(
array(
'diffID' => $diff->getID(),
));
$lease = $allocator->allocate();
$diff->setSandcastleLeaseID($lease->getID());
// ...
if ($lease->getStatus() == DrydockLeaseStatus::STATUS_ACTIVE) {
$sandcastle_link = $lease->getInterface('httpd')->getURI('/');
} else {
$sandcastle_link = 'Still building your sandcastle...';
}
echo "Sandcastle for this diff: ".$sandcastle_link;
// EXAMPLE: How this actually works now.
$allocator = new DrydockAllocator();
$allocator->setResourceType('host');
// NOTE: Allocation is currently synchronous but will be task-driven soon.
$lease = $allocator->allocate();
Leases are completely stock, installs will not define new lease types.
Currently: Leases exist and work but are very very basic.
== Resources
Vision: Resources represent some actual thing we've put somewhere, whether it's
a host, a block of storage, a webroot, or whatever else. Applications interact
through resources by acquiring leases to them, and then getting interfaces
through these leases. The lease acquisition process has a side effect of
allocating new resources if a lease can't be acquired on existing resources
(e.g., the application wants storage but all storage resources are full) and
things are configured to autoscale.
Resources may themselves acquire leases in order to allocate. For instance, a
storage resource might first acquire a lease to a host resource. A 'test
scaffold' resource might lease a storage resource and a mysql resource.
Not all resources are auto-allocate: the entry-level version of Drydock is that
you manually allocate a couple boxes and configure them through the web console.
Then, e.g., 'storage' / 'webroot' resources allocate on top of them, but the
host pool itself does not autoscale.
Resources are completely stock, they are abstract shells representing any
arbitrary thing.
Currently: Resource exist ('host' only) but are very very basic.
== Blueprints
Vision: Blueprints contain instructions for building interfaces to, (possibly)
allocating, updating, managing, and destroying a specific type of resource in a
specific location. One way to think of them is that they are scripts for
creating and deleting resources. For example, the LocalHost, RemoteHost and
EC2Host blueprints can all manage 'host' resources.
Eventually, we will support more types of resources (storage, webroot,
sandcastle, test scaffold, phacility deployment) and more providers for resource
types, some of which will be in the Phabricator mainline and some of which will
be custom.
Blueprints are very custom and specific to application types, so installs will
define new blueprints if they are making significant use of Drydock.
Currently: They exist but have few capabilities. The stock blueprints do nearly
nothing useful. There is a technically functional blueprint for host allocation
in EC2.
== Allocator
This is just the actual code to execute the lease acquisition process.
Test Plan: Ran "drydock_control.php" script, it allocated a machine in EC2,
acquired a lease on it, interfaced with it, and then released the lease. Ran it
again, got a fresh lease on the existing resource.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D1454
2012-01-11 20:18:40 +01:00
|
|
|
'DrydockSSHCommandInterface' => 'DrydockCommandInterface',
|
2016-03-03 14:52:21 +01:00
|
|
|
'DrydockSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
Implement optimistic "slot locks" in Drydock
Summary:
See discussion in D10304. There's a lot of context there, but the general idea is:
- Blueprints should manage locks in a granular way during the actual allocation/acquisition phase.
- Optimistic "slot locks" might a pretty good primitive to make that easy to implement and reason about in most cases.
The way these locks work is that you just pick some name for the lock (like the PHID of a resource) and say that it needs to be acquired for the allocation/acquisition to work:
```
...
->needSlotLock("mylock(PHID-XYZQ-...)")
...
```
When you fire off the acquisition or allocation, it fails unless it could acquire the slot with that name. This is really simple (no explicit lock management) and a pretty good fit for most of the locking that blueprints and leases need to do.
If you need to do limit-based locks (e.g., maximum of 3 locks) you could acquire a lock like this:
```
mylock(whatever).slot(2)
```
Blueprints generally only contend with themselves, so it's normally OK for them to pick whatever strategy works best for them in naming locks.
This may not work as well if you have a huge number of slots (e.g., 100TB you want to give out in 1MB chunks), or other complex needs for locks (like you have to synchronize access to some external resource), but slot locks don't need to be the only mechanism that blueprints use. If they run into a problem that slot locks aren't a good fit for, they can use something else instead. For now, slot locks seem like a good fit for the problems we currently face and most of the problems I anticipate facing.
(The release workflows have other race issues which I'm not addressing here. They work fine if nothing races, but aren't race-safe.)
Test Plan:
To create a race where the same binding is allocated as a resource twice:
- Add `sleep(10)` near the beginning of `allocateResource()`, after the free bindings are loaded but before resources are allocated.
- (Comment out slot lock acquisition if you have this patch.)
- Run `bin/drydock lease ...` in two windows, within 10 seconds of one another.
This will reliably double-allocate the binding because both blueprints see a view of the world where the binding is free.
To verify the lock works, un-comment it (or apply this patch) and run the same test again. Now, the lock fails in one process and only one resource is allocated.
Reviewers: hach-que, chad
Reviewed By: hach-que, chad
Differential Revision: https://secure.phabricator.com/D14118
2015-09-21 13:45:25 +02:00
|
|
|
'DrydockSlotLock' => 'DrydockDAO',
|
2015-09-21 13:46:24 +02:00
|
|
|
'DrydockSlotLockException' => 'Exception',
|
2015-10-01 17:11:42 +02:00
|
|
|
'DrydockSlotLockFailureLogType' => 'DrydockLogType',
|
2015-10-27 19:04:02 +01:00
|
|
|
'DrydockTestRepositoryOperation' => 'DrydockRepositoryOperationType',
|
2012-03-27 05:54:26 +02:00
|
|
|
'DrydockWebrootInterface' => 'DrydockInterface',
|
2015-09-21 13:46:24 +02:00
|
|
|
'DrydockWorker' => 'PhabricatorWorker',
|
2013-12-03 01:09:07 +01:00
|
|
|
'DrydockWorkingCopyBlueprintImplementation' => 'DrydockBlueprintImplementation',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FeedConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'FeedPublishConduitAPIMethod' => 'FeedConduitAPIMethod',
|
2013-06-26 01:29:47 +02:00
|
|
|
'FeedPublisherHTTPWorker' => 'FeedPushWorker',
|
|
|
|
'FeedPublisherWorker' => 'FeedPushWorker',
|
|
|
|
'FeedPushWorker' => 'PhabricatorWorker',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FeedQueryConduitAPIMethod' => 'FeedConduitAPIMethod',
|
2015-06-10 15:08:57 +02:00
|
|
|
'FeedStoryNotificationGarbageCollector' => 'PhabricatorGarbageCollector',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'FileAllocateConduitAPIMethod' => 'FileConduitAPIMethod',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FileConduitAPIMethod' => 'ConduitAPIMethod',
|
2013-09-05 22:11:02 +02:00
|
|
|
'FileCreateMailReceiver' => 'PhabricatorMailReceiver',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FileDownloadConduitAPIMethod' => 'FileConduitAPIMethod',
|
|
|
|
'FileInfoConduitAPIMethod' => 'FileConduitAPIMethod',
|
2013-09-05 22:11:02 +02:00
|
|
|
'FileMailReceiver' => 'PhabricatorObjectMailReceiver',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'FileQueryChunksConduitAPIMethod' => 'FileConduitAPIMethod',
|
2015-04-01 17:39:50 +02:00
|
|
|
'FileReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'FileUploadChunkConduitAPIMethod' => 'FileConduitAPIMethod',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FileUploadConduitAPIMethod' => 'FileConduitAPIMethod',
|
|
|
|
'FileUploadHashConduitAPIMethod' => 'FileConduitAPIMethod',
|
2014-11-21 20:17:20 +01:00
|
|
|
'FilesDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'FlagConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'FlagDeleteConduitAPIMethod' => 'FlagConduitAPIMethod',
|
|
|
|
'FlagEditConduitAPIMethod' => 'FlagConduitAPIMethod',
|
|
|
|
'FlagQueryConduitAPIMethod' => 'FlagConduitAPIMethod',
|
2014-09-12 15:31:11 +02:00
|
|
|
'FundBacker' => array(
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
),
|
2014-10-06 23:19:08 +02:00
|
|
|
'FundBackerCart' => 'PhortuneCartImplementation',
|
2014-09-12 15:31:11 +02:00
|
|
|
'FundBackerEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'FundBackerListController' => 'FundController',
|
|
|
|
'FundBackerPHIDType' => 'PhabricatorPHIDType',
|
2014-10-06 19:30:06 +02:00
|
|
|
'FundBackerProduct' => 'PhortuneProductImplementation',
|
2014-09-12 15:31:11 +02:00
|
|
|
'FundBackerQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'FundBackerSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'FundBackerTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'FundBackerTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundController' => 'PhabricatorController',
|
|
|
|
'FundCreateInitiativesCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'FundDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'FundDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'FundInitiative' => array(
|
|
|
|
'FundDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorProjectInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorMentionableInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
),
|
2014-09-12 15:31:11 +02:00
|
|
|
'FundInitiativeBackController' => 'FundController',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundInitiativeCloseController' => 'FundController',
|
2016-04-01 00:29:42 +02:00
|
|
|
'FundInitiativeCommentController' => 'FundController',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundInitiativeEditController' => 'FundController',
|
|
|
|
'FundInitiativeEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-12-21 18:02:55 +01:00
|
|
|
'FundInitiativeFulltextEngine' => 'PhabricatorFulltextEngine',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundInitiativeListController' => 'FundController',
|
|
|
|
'FundInitiativePHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'FundInitiativeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'FundInitiativeRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-04-01 17:39:50 +02:00
|
|
|
'FundInitiativeReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundInitiativeSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'FundInitiativeTransaction' => 'PhabricatorApplicationTransaction',
|
2016-04-01 00:29:42 +02:00
|
|
|
'FundInitiativeTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'FundInitiativeTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'FundInitiativeViewController' => 'FundController',
|
2014-09-19 14:44:40 +02:00
|
|
|
'FundSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterArcLintBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
|
|
|
'HarbormasterArcUnitBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterArtifact' => 'Phobject',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterAutotargetsTestCase' => 'PhabricatorTestCase',
|
2014-07-17 23:48:54 +02:00
|
|
|
'HarbormasterBuild' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HarbormasterDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
),
|
2014-08-26 12:46:23 +02:00
|
|
|
'HarbormasterBuildAbortedException' => 'Exception',
|
Replace "Cancel Build" with "Stop", "Resume" and "Restart"
Summary:
Ref T1049. Currently you can cancel a build, but now that we're tracking a lot more state we can stop, resume, and restart builds.
When the user issues a command against a build, I'm writing it into an auxiliary queue (`HarbormasterBuildCommand`) and then reading them out in the worker. This is mostly to avoid race messes where we try to `save()` the object in multiple places: basically, the BuildEngine is the //only// thing that writes to Build objects, and it holds a lock while it does it.
Test Plan:
- Created a plan which runs "sleep 2" a bunch of times in a row.
- Stopped, resumed, and restarted it.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, chad
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7892
2014-01-06 21:32:20 +01:00
|
|
|
'HarbormasterBuildActionController' => 'HarbormasterController',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterBuildArcanistAutoplan' => 'HarbormasterBuildAutoplan',
|
2014-07-17 23:48:54 +02:00
|
|
|
'HarbormasterBuildArtifact' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HarbormasterDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
),
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterBuildArtifactPHIDType' => 'PhabricatorPHIDType',
|
2013-12-05 02:01:12 +01:00
|
|
|
'HarbormasterBuildArtifactQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterBuildAutoplan' => 'Phobject',
|
Replace "Cancel Build" with "Stop", "Resume" and "Restart"
Summary:
Ref T1049. Currently you can cancel a build, but now that we're tracking a lot more state we can stop, resume, and restart builds.
When the user issues a command against a build, I'm writing it into an auxiliary queue (`HarbormasterBuildCommand`) and then reading them out in the worker. This is mostly to avoid race messes where we try to `save()` the object in multiple places: basically, the BuildEngine is the //only// thing that writes to Build objects, and it holds a lock while it does it.
Test Plan:
- Created a plan which runs "sleep 2" a bunch of times in a row.
- Stopped, resumed, and restarted it.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, chad
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7892
2014-01-06 21:32:20 +01:00
|
|
|
'HarbormasterBuildCommand' => 'HarbormasterDAO',
|
2014-07-31 03:39:49 +02:00
|
|
|
'HarbormasterBuildDependencyDatasource' => 'PhabricatorTypeaheadDatasource',
|
2014-01-06 21:32:10 +01:00
|
|
|
'HarbormasterBuildEngine' => 'Phobject',
|
2014-08-01 00:08:28 +02:00
|
|
|
'HarbormasterBuildFailureException' => 'Exception',
|
2014-07-31 03:39:49 +02:00
|
|
|
'HarbormasterBuildGraph' => 'AbstractDirectedGraph',
|
2015-06-21 18:00:00 +02:00
|
|
|
'HarbormasterBuildLintMessage' => 'HarbormasterDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'HarbormasterBuildLog' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HarbormasterDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-11-09 03:09:03 +01:00
|
|
|
),
|
2016-03-01 21:10:27 +01:00
|
|
|
'HarbormasterBuildLogChunk' => 'HarbormasterDAO',
|
2016-03-01 21:22:14 +01:00
|
|
|
'HarbormasterBuildLogChunkIterator' => 'PhutilBufferedIterator',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildLogPHIDType' => 'PhabricatorPHIDType',
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterBuildLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-07-17 23:48:54 +02:00
|
|
|
'HarbormasterBuildMessage' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HarbormasterDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-03-26 00:11:28 +01:00
|
|
|
),
|
|
|
|
'HarbormasterBuildMessageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildPHIDType' => 'PhabricatorPHIDType',
|
2014-07-17 23:48:54 +02:00
|
|
|
'HarbormasterBuildPlan' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HarbormasterDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
2016-02-27 17:59:33 +01:00
|
|
|
'PhabricatorNgramsInterface',
|
2016-02-27 18:19:20 +01:00
|
|
|
'PhabricatorProjectInterface',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
),
|
2014-07-11 01:20:58 +02:00
|
|
|
'HarbormasterBuildPlanDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-10-26 20:38:21 +01:00
|
|
|
'HarbormasterBuildPlanDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'HarbormasterBuildPlanDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2016-02-27 04:12:55 +01:00
|
|
|
'HarbormasterBuildPlanEditEngine' => 'PhabricatorEditEngine',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildPlanEditor' => 'PhabricatorApplicationTransactionEditor',
|
2016-02-27 17:59:33 +01:00
|
|
|
'HarbormasterBuildPlanNameNgrams' => 'PhabricatorSearchNgrams',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildPlanPHIDType' => 'PhabricatorPHIDType',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildPlanQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'HarbormasterBuildPlanSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'HarbormasterBuildPlanTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'HarbormasterBuildPlanTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'HarbormasterBuildQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-10-02 15:32:08 +02:00
|
|
|
'HarbormasterBuildRequest' => 'Phobject',
|
2014-07-17 23:48:54 +02:00
|
|
|
'HarbormasterBuildStep' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HarbormasterDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorCustomFieldInterface',
|
Add build step implementation infrastructure and sleep build step.
Summary:
Depends on D7498.
This implements support for a "build step implementation". Build steps have an associated class name (which makes the class in PHP) and a details field, which is serialized JSON (same as PhabricatorRepository).
This also implements a SleepBuildStepImplementation which just pauses the build for a specified period of seconds.
Test Plan:
Inserted a build step with `insert into harbormaster_buildstep (phid, buildPlanPHID, className, details, dateCreated, dateModified) values ('', 'PHID-HMCP-zkh5w6czfbfpk2gxwdeo', 'SleepBuildStepImplementation', '{"seconds":5}', NOW(), NOW());` (adjusting the build plan PHID as appropriate).
Started the daemon and applied the build plan to a buildable, and saw the daemon take a 5 second delay after creating `SleepBuildStepImplementation`.
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley
CC: Korvin, epriestley, aran, chad
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7499
2013-11-05 22:34:14 +01:00
|
|
|
),
|
2014-07-17 23:48:54 +02:00
|
|
|
'HarbormasterBuildStepCoreCustomField' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HarbormasterBuildStepCustomField',
|
|
|
|
'PhabricatorStandardCustomFieldInterface',
|
2014-03-26 00:08:40 +01:00
|
|
|
),
|
|
|
|
'HarbormasterBuildStepCustomField' => 'PhabricatorCustomField',
|
|
|
|
'HarbormasterBuildStepEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterBuildStepGroup' => 'Phobject',
|
2015-06-15 10:02:26 +02:00
|
|
|
'HarbormasterBuildStepImplementation' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'HarbormasterBuildStepImplementationTestCase' => 'PhabricatorTestCase',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildStepPHIDType' => 'PhabricatorPHIDType',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildStepQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-03-26 00:08:40 +01:00
|
|
|
'HarbormasterBuildStepTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'HarbormasterBuildStepTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-07-17 23:48:54 +02:00
|
|
|
'HarbormasterBuildTarget' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HarbormasterDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-12-05 02:01:12 +01:00
|
|
|
),
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildTargetPHIDType' => 'PhabricatorPHIDType',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildTargetQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-05-15 16:02:30 +02:00
|
|
|
'HarbormasterBuildTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'HarbormasterBuildTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'HarbormasterBuildTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-06-21 18:00:00 +02:00
|
|
|
'HarbormasterBuildUnitMessage' => 'HarbormasterDAO',
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterBuildViewController' => 'HarbormasterController',
|
2014-01-06 21:32:10 +01:00
|
|
|
'HarbormasterBuildWorker' => 'HarbormasterWorker',
|
2014-07-17 23:48:54 +02:00
|
|
|
'HarbormasterBuildable' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HarbormasterDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'HarbormasterBuildableInterface',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
),
|
2014-01-06 23:12:15 +01:00
|
|
|
'HarbormasterBuildableActionController' => 'HarbormasterController',
|
2014-05-08 19:08:37 +02:00
|
|
|
'HarbormasterBuildableListController' => 'HarbormasterController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HarbormasterBuildablePHIDType' => 'PhabricatorPHIDType',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildableQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'HarbormasterBuildableSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-05-15 16:02:30 +02:00
|
|
|
'HarbormasterBuildableTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'HarbormasterBuildableTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'HarbormasterBuildableTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterBuildableViewController' => 'HarbormasterController',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterBuiltinBuildStepGroup' => 'HarbormasterBuildStepGroup',
|
2015-10-15 05:01:22 +02:00
|
|
|
'HarbormasterCircleCIBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
2015-10-15 18:07:31 +02:00
|
|
|
'HarbormasterCircleCIHookController' => 'HarbormasterController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'HarbormasterConduitAPIMethod' => 'ConduitAPIMethod',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterController' => 'PhabricatorController',
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterCreateArtifactConduitAPIMethod' => 'HarbormasterConduitAPIMethod',
|
2015-10-26 20:38:21 +01:00
|
|
|
'HarbormasterCreatePlansCapability' => 'PhabricatorPolicyCapability',
|
Remove PHID database, add Harbormaster database
Summary:
- We currently write every PHID we generate to a table. This was motivated by two concerns:
- **Understanding Data**: At Facebook, the data was sometimes kind of a mess. You could look at a random user in the ID tool and see 9000 assocs with random binary data attached to them, pointing at a zillion other objects with no idea how any of it got there. I originally created this table to have a canonical source of truth about PHID basics, at least. In practice, our data model has been really tidy and consistent, and we don't use any of the auxiliary data in this table (or even write it). The handle abstraction is powerful and covers essentially all of the useful data in the app, and we have human-readable types in the keys. So I don't think we have a real need here, and this table isn't serving it if we do.
- **Uniqueness**: With a unique key, we can be sure they're unique, even if we get astronomically unlucky and get a collision. But every table we use them in has a unique key anyway. So we actually get pretty much nothing here, except maybe some vague guarantee that we won't reallocate a key later if the original object is deleted. But it's hard to imagine any install will ever have a collision, given that the key space is 36^20 per object type.
- We also currently use PHIDs and Users in tests sometimes. This is silly and can break (see D2461).
- Drop the PHID database.
- Introduce a "Harbormaster" database (the eventual CI tool, after Drydock).
- Add a scratch table to the Harbormaster database for doing unit test meta-tests.
- Now, PHID generation does no writes, and unit tests are isolated from the application.
- @csilvers: This should slightly improve the performance of the large query-bound tail in D2457.
Test Plan: Ran unit tests. Ran storage upgrade.
Reviewers: btrahan, vrana, jungejason
Reviewed By: btrahan
CC: csilvers, aran, nh, edward
Differential Revision: https://secure.phabricator.com/D2466
2012-05-20 23:46:01 +02:00
|
|
|
'HarbormasterDAO' => 'PhabricatorLiskDAO',
|
2015-10-06 00:59:35 +02:00
|
|
|
'HarbormasterDrydockBuildStepGroup' => 'HarbormasterBuildStepGroup',
|
2015-09-25 19:43:32 +02:00
|
|
|
'HarbormasterDrydockCommandBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
2015-09-25 02:29:47 +02:00
|
|
|
'HarbormasterDrydockLeaseArtifact' => 'HarbormasterArtifact',
|
2015-09-25 19:43:32 +02:00
|
|
|
'HarbormasterExecFuture' => 'Future',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterExternalBuildStepGroup' => 'HarbormasterBuildStepGroup',
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterFileArtifact' => 'HarbormasterArtifact',
|
2014-03-26 00:09:21 +01:00
|
|
|
'HarbormasterHTTPRequestBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
2015-09-25 02:29:47 +02:00
|
|
|
'HarbormasterHostArtifact' => 'HarbormasterDrydockLeaseArtifact',
|
|
|
|
'HarbormasterLeaseWorkingCopyBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
2015-06-23 22:34:25 +02:00
|
|
|
'HarbormasterLintMessagesController' => 'HarbormasterController',
|
2015-06-21 19:11:53 +02:00
|
|
|
'HarbormasterLintPropertyView' => 'AphrontView',
|
2016-03-01 22:53:13 +01:00
|
|
|
'HarbormasterManagementArchiveLogsWorkflow' => 'HarbormasterManagementWorkflow',
|
2013-12-26 19:40:52 +01:00
|
|
|
'HarbormasterManagementBuildWorkflow' => 'HarbormasterManagementWorkflow',
|
2014-04-18 01:01:16 +02:00
|
|
|
'HarbormasterManagementUpdateWorkflow' => 'HarbormasterManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'HarbormasterManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-08-04 22:05:52 +02:00
|
|
|
'HarbormasterMessageType' => 'Phobject',
|
2012-07-09 19:39:14 +02:00
|
|
|
'HarbormasterObject' => 'HarbormasterDAO',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterOtherBuildStepGroup' => 'HarbormasterBuildStepGroup',
|
Replace "Cancel Build" with "Stop", "Resume" and "Restart"
Summary:
Ref T1049. Currently you can cancel a build, but now that we're tracking a lot more state we can stop, resume, and restart builds.
When the user issues a command against a build, I'm writing it into an auxiliary queue (`HarbormasterBuildCommand`) and then reading them out in the worker. This is mostly to avoid race messes where we try to `save()` the object in multiple places: basically, the BuildEngine is the //only// thing that writes to Build objects, and it holds a lock while it does it.
Test Plan:
- Created a plan which runs "sleep 2" a bunch of times in a row.
- Stopped, resumed, and restarted it.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, chad
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7892
2014-01-06 21:32:20 +01:00
|
|
|
'HarbormasterPlanController' => 'HarbormasterController',
|
2013-12-26 19:40:22 +01:00
|
|
|
'HarbormasterPlanDisableController' => 'HarbormasterPlanController',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterPlanEditController' => 'HarbormasterPlanController',
|
2014-05-08 19:08:37 +02:00
|
|
|
'HarbormasterPlanListController' => 'HarbormasterPlanController',
|
2016-02-27 04:12:55 +01:00
|
|
|
'HarbormasterPlanRunController' => 'HarbormasterPlanController',
|
Harbormaster v(-2)
Summary:
Ref T1049. I don't really want to sink too much time into this right now, but a seemingly reasonable architecture came to me in a dream. Here's a high-level overview of how things fit together:
- **"Build"**: In Harbormaster, "build" means any process we want to run against a working copy. It might actually be building an executable, but it might also be running lint, running unit tests, generating documentation, generating symbols, running a deploy, setting up a sandcastle, etc.
- `HarbormasterBuildable`: A "buildable" is some piece of code which build operations can run on. Generally, this is either a Differential diff or a Diffusion commit. The Buildable class just wraps those objects and provides a layer of abstraction. Currently, you can manually create a buildable from a commit. In the future, this will be done automatically.
- `HarbormasterBuildStep`: A "build step" is an individual build operation, like "run lint", "run unit", "build docs", etc. The step defines how to perform the operation (for example, "run unit tests by executing 'arc unit'"). In this diff, this barely exists.
- `HarbormasterBuildPlan`: This glues together build steps into groups or sequences. For example, you might want to "run unit", and then "deploy" if the tests pass. You can create a build plan which says "run step "unit tests", then run step "deploy" on success" or whatever. In the future, these will also contain triggers/conditions ("Automatically run this build plan against every commit") and probably be able to define failure actions ("If this plan fails, send someone an email"). Because build plans will run commands, only administrators can manage them.
- `HarbormasterBuild`: This is the concrete result of running a `BuildPlan` against a `Buildable`. It tracks the build status and collects results, so you can see if the build is running/successful/failed. A `Buildable` may have several `Build`s, because you can execute more than one `BuildPlan` against it. For example, you might have a "documentation" build plan which you run continuously against HEAD, but a "unit" build plan which you want to run against every commit.
- `HarbormasterBuildTarget`: This is the concrete result of running a `BuildStep` against a `Buildable`. These are children of `Build`. A step might be able to produce multiple targets, but generally this is something like "Unit Tests" or "Lint" and has an overall status, so you can see at a glance that unit tests were fine but lint had some issues.
- `HarbormasterBuildItem`: An optional subitem for a target. For lint, this might be an individual file. For unit tests, an individual test. For normal builds, an executable. For deploys, a server. For documentation generation, there might just not be subitems.
- `HarbormasterBuildLog`: Provides extra information, like command/execution transcripts. This is where stdout/stderr will get dumped, and general details and other messages.
- `HarbormasterBuildArtifact`: Stores side effects or results from build steps. For example, something which builds a binary might put the binary in "Files" and then put its PHID here. Unit tests might put coverage information here. Generally, any build step which produces some high-level output object can use this table to record its existence.
This diff implements almost nothing and does nothing useful, but puts most of these object relationships in place. The two major things you can't easily do with these objects are:
1) Run arbitrary cron jobs. Jenkins does this, but it feels tacked on and I don't know of anyone using it for that. We could create fake Buildables to get a similar effect, but if we need to do this I'd rather do it elsewhere in general. Build and cron/service/monitoring feel like pretty different problems to me.
2) Run parameterized/matrix steps (maybe?). Bamboo has this plan/stage/task/job breakdown where a build step can generate a zillion actual jobs, like "build client on x86", "build server on x86", "build client on ARM", "build server on ARM", etc. We can sort of do this by having a Step map to multiple Targets, but I haven't really thought about it too much and it may end up being not-great. I'd guess we have like an 80% chance of getting a clean implementation if/when we get there. I suspect no one actually needs this, or when they do they'll just implement a custom Step and it can be parameterized at that level. I'm not too worried about this overall.
The major difference between this and Jenkins/Bamboo/TravisCI is that all three of those are **plan-centric**: the primary object in the system is a build plan, and the dashboard shows you all your build plans and the current status. I don't think this is the right model. One disadvantage is that you basically end up with top-level messaging that says "Trunk is broken", not "Trunk was broken by commit af32f392f". Harbormaster is **buildable-centric**: the primary object in the system is stuff you can run build operations against (commits/branches/revisions), and actual build plans are secondary. The main view will be "recent commits on this branch, and whether they're good or not" -- which I think is what's most important in a larger/more complex product -- not the pass/fail status of all jobs. This also makes it easier and more natural to integrate with Differential and Diffusion, which both care about the overall status of the commit/revision, not the current status of jobs.
Test Plan: Poked around, but this doesn't really do anything yet.
Reviewers: btrahan
Reviewed By: btrahan
CC: zeeg, chad, aran, seporaitis
Maniphest Tasks: T1049
Differential Revision: https://secure.phabricator.com/D7368
2013-10-23 00:01:06 +02:00
|
|
|
'HarbormasterPlanViewController' => 'HarbormasterPlanController',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterPrototypeBuildStepGroup' => 'HarbormasterBuildStepGroup',
|
2014-03-26 00:09:51 +01:00
|
|
|
'HarbormasterPublishFragmentBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterQueryAutotargetsConduitAPIMethod' => 'HarbormasterConduitAPIMethod',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'HarbormasterQueryBuildablesConduitAPIMethod' => 'HarbormasterConduitAPIMethod',
|
|
|
|
'HarbormasterQueryBuildsConduitAPIMethod' => 'HarbormasterConduitAPIMethod',
|
2014-08-04 16:55:43 +02:00
|
|
|
'HarbormasterRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-07-30 21:22:35 +02:00
|
|
|
'HarbormasterRunBuildPlansHeraldAction' => 'HeraldAction',
|
2014-10-01 16:40:36 +02:00
|
|
|
'HarbormasterSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
Remove PHID database, add Harbormaster database
Summary:
- We currently write every PHID we generate to a table. This was motivated by two concerns:
- **Understanding Data**: At Facebook, the data was sometimes kind of a mess. You could look at a random user in the ID tool and see 9000 assocs with random binary data attached to them, pointing at a zillion other objects with no idea how any of it got there. I originally created this table to have a canonical source of truth about PHID basics, at least. In practice, our data model has been really tidy and consistent, and we don't use any of the auxiliary data in this table (or even write it). The handle abstraction is powerful and covers essentially all of the useful data in the app, and we have human-readable types in the keys. So I don't think we have a real need here, and this table isn't serving it if we do.
- **Uniqueness**: With a unique key, we can be sure they're unique, even if we get astronomically unlucky and get a collision. But every table we use them in has a unique key anyway. So we actually get pretty much nothing here, except maybe some vague guarantee that we won't reallocate a key later if the original object is deleted. But it's hard to imagine any install will ever have a collision, given that the key space is 36^20 per object type.
- We also currently use PHIDs and Users in tests sometimes. This is silly and can break (see D2461).
- Drop the PHID database.
- Introduce a "Harbormaster" database (the eventual CI tool, after Drydock).
- Add a scratch table to the Harbormaster database for doing unit test meta-tests.
- Now, PHID generation does no writes, and unit tests are isolated from the application.
- @csilvers: This should slightly improve the performance of the large query-bound tail in D2457.
Test Plan: Ran unit tests. Ran storage upgrade.
Reviewers: btrahan, vrana, jungejason
Reviewed By: btrahan
CC: csilvers, aran, nh, edward
Differential Revision: https://secure.phabricator.com/D2466
2012-05-20 23:46:01 +02:00
|
|
|
'HarbormasterScratchTable' => 'HarbormasterDAO',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'HarbormasterSendMessageConduitAPIMethod' => 'HarbormasterConduitAPIMethod',
|
2014-03-26 00:09:51 +01:00
|
|
|
'HarbormasterSleepBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
2016-02-27 04:12:55 +01:00
|
|
|
'HarbormasterStepAddController' => 'HarbormasterPlanController',
|
|
|
|
'HarbormasterStepDeleteController' => 'HarbormasterPlanController',
|
|
|
|
'HarbormasterStepEditController' => 'HarbormasterPlanController',
|
|
|
|
'HarbormasterStepViewController' => 'HarbormasterPlanController',
|
Add "Autoplans" to Harbormaster
Summary:
Ref T8095. Two general problems:
- I want Harbormaster to own all lint and unit test results.
- I don't want users to have to configure anything for `arc` to keep working automatically.
These are in conflict because generic lint/unit test ownership in Harbormaster requires that build targets exist which we can attach build results to. However, we can't currently create build targets on demand: Harbormaster assumes it is responsible for creating targets, then running code or making third-party service calls to actually run the builds.
I considered two broad approaches to let `arc` push results into Harbormaster without requiring administrators to configure some kind of "arc results" build plan:
# Add magic target PHIDs like `PHID-MAGIC-this-is-really-arc-unit`.
# Add new code to build real targets with real PHIDs.
(1) is probably a bit less work to get off the ground, but I think it's worse overall and very likely to create more problems in the long run. I particularly worry that it will lead to a small amount of special casing in a very large number of places, which seems more fragile.
(2) is more work upfront but I think does a better job of putting all the special casing in one place that we can, e.g., more reasonably unit test, and letting the rest of the code rarely/never care about this case since it's just dealing with normal plans/steps/targets as far as it can tell.
This diff introduces "autoplans", which are source templates for plans/steps. This let us "push" these targets into Harbormaster. Hypthetically, any process "like" arc can use autoplans to upload test/lint/etc results. In practice, probably only `arc` will ever use this, but I think it's still quite a bit cleaner than the alternative despite all the generality.
Workflow is basically:
- `arc` creates a diff.
- `arc` calls `harbormaster.queryautotargets`, passing the diff PHID and saying "I have some lint and unit results I want to stick on this thing".
- Harbormaster builds the plan, steps, and targets (if any of them don't already exist), and hands back the target PHIDs so `arc` has a completely standard-looking place to put results.
- `arc` uploads the test results to the right targets, as though Harbormaster had asked it to run unit/lint in the first place.
(This doesn't actually do any of that yet, just sets things up.)
I'll maybe doc turn that ^^^^^^ into a doc for posterity since I think it's hard to guess what an "autotarget" is, but I'm going to grab some lunch first.
Test Plan:
- Added unit tests to make sure we can build these things properly.
- Used `harbormaster.queryautotargets` to build autotargets for a bunch of diffs.
- Verified targets come up in "waiting for message" state.
- Verified plans and steps are not editable.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: hach-que, epriestley
Maniphest Tasks: T8095
Differential Revision: https://secure.phabricator.com/D13345
2015-06-21 18:04:21 +02:00
|
|
|
'HarbormasterTargetEngine' => 'Phobject',
|
2014-01-06 21:32:10 +01:00
|
|
|
'HarbormasterTargetWorker' => 'HarbormasterWorker',
|
2015-08-06 13:19:42 +02:00
|
|
|
'HarbormasterTestBuildStepGroup' => 'HarbormasterBuildStepGroup',
|
2014-03-26 00:09:21 +01:00
|
|
|
'HarbormasterThrowExceptionBuildStep' => 'HarbormasterBuildStepImplementation',
|
2013-11-10 00:02:07 +01:00
|
|
|
'HarbormasterUIEventListener' => 'PhabricatorEventListener',
|
Add `harbormaster.createartifact`
Summary:
Ref T8659. In the general case, this eventually allows build processes to do things like:
- Upload build results (like a ".app" or ".exe" or other binary).
- Pass complex results between build steps (e.g., build step A does something hard and build step B uses it to do something else).
Today, we're a long way away from having the infrastructure for that. However, it is useful to let third party build processes (like Jenkins) upload URIs that link back to the external build results.
This adds `harbormaster.createartifact` so they can do that. The only useful thing to do with this method today is have your Jenkins build do this:
params = array(
"uri": "https://jenkins.mycompany.com/build/23923/details/",
"name": "View Build Results in Jenkins",
"ui.external": true,
);
harbormaster.createartifact(target, 'uri', params);
Then (after the next diff) we'll show a link in Differential and a prominent link in Harbormaster. I didn't actually do the UI stuff in this diff since it's already pretty big.
This change moves a lot of code around, too:
- Adds PHIDs to artifacts.
- It modularizes build artifact types (currently "file", "host" and "URI").
- It formalizes build artifact parameters and construction:
- This lets me generate usable documentation about how to create artifacts.
- This prevents users from doing dangerous or policy-violating things.
- It does some other general modernization.
Test Plan:
{F715633}
{F715634}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T8659
Differential Revision: https://secure.phabricator.com/D13900
2015-08-15 16:28:56 +02:00
|
|
|
'HarbormasterURIArtifact' => 'HarbormasterArtifact',
|
2016-02-29 15:26:01 +01:00
|
|
|
'HarbormasterUnitMessageListController' => 'HarbormasterController',
|
|
|
|
'HarbormasterUnitMessageViewController' => 'HarbormasterController',
|
2015-06-21 19:37:55 +02:00
|
|
|
'HarbormasterUnitPropertyView' => 'AphrontView',
|
2016-02-29 15:15:13 +01:00
|
|
|
'HarbormasterUnitStatus' => 'Phobject',
|
2016-02-29 18:53:46 +01:00
|
|
|
'HarbormasterUnitSummaryView' => 'AphrontView',
|
2014-03-26 00:09:51 +01:00
|
|
|
'HarbormasterUploadArtifactBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
|
|
|
'HarbormasterWaitForPreviousBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
2014-01-06 21:32:10 +01:00
|
|
|
'HarbormasterWorker' => 'PhabricatorWorker',
|
2015-09-25 02:29:47 +02:00
|
|
|
'HarbormasterWorkingCopyArtifact' => 'HarbormasterDrydockLeaseArtifact',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldAction' => 'Phobject',
|
|
|
|
'HeraldActionGroup' => 'HeraldGroup',
|
2015-07-23 22:26:40 +02:00
|
|
|
'HeraldActionRecord' => 'HeraldDAO',
|
2015-06-15 10:02:26 +02:00
|
|
|
'HeraldAdapter' => 'Phobject',
|
2015-07-06 22:15:47 +02:00
|
|
|
'HeraldAlwaysField' => 'HeraldField',
|
|
|
|
'HeraldAnotherRuleField' => 'HeraldField',
|
2015-07-24 21:51:30 +02:00
|
|
|
'HeraldApplicationActionGroup' => 'HeraldActionGroup',
|
2014-10-01 16:53:12 +02:00
|
|
|
'HeraldApplyTranscript' => 'Phobject',
|
2015-07-16 23:13:13 +02:00
|
|
|
'HeraldBasicFieldGroup' => 'HeraldFieldGroup',
|
2015-07-30 21:22:35 +02:00
|
|
|
'HeraldCommitAdapter' => array(
|
|
|
|
'HeraldAdapter',
|
|
|
|
'HarbormasterBuildableAdapterInterface',
|
|
|
|
),
|
2011-03-22 21:22:40 +01:00
|
|
|
'HeraldCondition' => 'HeraldDAO',
|
2015-06-15 10:02:26 +02:00
|
|
|
'HeraldConditionTranscript' => 'Phobject',
|
2015-07-06 22:15:33 +02:00
|
|
|
'HeraldContentSourceField' => 'HeraldField',
|
2011-03-22 21:49:46 +01:00
|
|
|
'HeraldController' => 'PhabricatorController',
|
2011-03-22 21:22:40 +01:00
|
|
|
'HeraldDAO' => 'PhabricatorLiskDAO',
|
2014-08-20 23:26:29 +02:00
|
|
|
'HeraldDifferentialAdapter' => 'HeraldAdapter',
|
|
|
|
'HeraldDifferentialDiffAdapter' => 'HeraldDifferentialAdapter',
|
2015-07-30 21:22:35 +02:00
|
|
|
'HeraldDifferentialRevisionAdapter' => array(
|
|
|
|
'HeraldDifferentialAdapter',
|
|
|
|
'HarbormasterBuildableAdapterInterface',
|
|
|
|
),
|
2013-10-07 02:10:29 +02:00
|
|
|
'HeraldDisableController' => 'HeraldController',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldDoNothingAction' => 'HeraldAction',
|
2015-07-16 23:13:13 +02:00
|
|
|
'HeraldEditFieldGroup' => 'HeraldFieldGroup',
|
2015-06-15 10:02:26 +02:00
|
|
|
'HeraldEffect' => 'Phobject',
|
2015-07-16 23:12:00 +02:00
|
|
|
'HeraldEmptyFieldValue' => 'HeraldFieldValue',
|
2015-06-15 10:02:26 +02:00
|
|
|
'HeraldEngine' => 'Phobject',
|
2016-01-20 02:18:17 +01:00
|
|
|
'HeraldExactProjectsField' => 'HeraldField',
|
2015-07-06 22:15:33 +02:00
|
|
|
'HeraldField' => 'Phobject',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldFieldGroup' => 'HeraldGroup',
|
2015-07-07 15:05:02 +02:00
|
|
|
'HeraldFieldTestCase' => 'PhutilTestCase',
|
2015-07-16 23:12:00 +02:00
|
|
|
'HeraldFieldValue' => 'Phobject',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldGroup' => 'Phobject',
|
2013-08-06 20:23:01 +02:00
|
|
|
'HeraldInvalidActionException' => 'Exception',
|
2012-05-30 23:26:29 +02:00
|
|
|
'HeraldInvalidConditionException' => 'Exception',
|
2014-07-25 00:20:39 +02:00
|
|
|
'HeraldManageGlobalRulesCapability' => 'PhabricatorPolicyCapability',
|
2013-09-25 20:50:15 +02:00
|
|
|
'HeraldManiphestTaskAdapter' => 'HeraldAdapter',
|
2011-03-22 22:34:38 +01:00
|
|
|
'HeraldNewController' => 'HeraldController',
|
2015-07-06 22:15:47 +02:00
|
|
|
'HeraldNewObjectField' => 'HeraldField',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldNotifyActionGroup' => 'HeraldActionGroup',
|
2015-06-15 10:02:26 +02:00
|
|
|
'HeraldObjectTranscript' => 'Phobject',
|
2015-12-28 05:19:39 +01:00
|
|
|
'HeraldPhameBlogAdapter' => 'HeraldAdapter',
|
|
|
|
'HeraldPhamePostAdapter' => 'HeraldAdapter',
|
2013-08-15 22:10:45 +02:00
|
|
|
'HeraldPholioMockAdapter' => 'HeraldAdapter',
|
2015-08-08 19:22:18 +02:00
|
|
|
'HeraldPonderQuestionAdapter' => 'HeraldAdapter',
|
2014-01-03 21:24:28 +01:00
|
|
|
'HeraldPreCommitAdapter' => 'HeraldAdapter',
|
|
|
|
'HeraldPreCommitContentAdapter' => 'HeraldPreCommitAdapter',
|
|
|
|
'HeraldPreCommitRefAdapter' => 'HeraldPreCommitAdapter',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldPreventActionGroup' => 'HeraldActionGroup',
|
2015-07-06 22:15:47 +02:00
|
|
|
'HeraldProjectsField' => 'HeraldField',
|
2012-05-30 23:26:29 +02:00
|
|
|
'HeraldRecursiveConditionsException' => 'Exception',
|
2015-07-16 23:13:13 +02:00
|
|
|
'HeraldRelatedFieldGroup' => 'HeraldFieldGroup',
|
2014-08-04 16:55:43 +02:00
|
|
|
'HeraldRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-06-15 10:02:26 +02:00
|
|
|
'HeraldRepetitionPolicyConfig' => 'Phobject',
|
2014-07-17 23:48:54 +02:00
|
|
|
'HeraldRule' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HeraldDAO',
|
Transactions - deploy buildTransactionTimeline against a few more applications
Summary:
Ref T4712. Thus far, it seems that most "non-standard" things can be done pretty easily in the controller. Aside from deploying, this diff had to fix a few bugs / missing implementations of stuff.
(Notably, PhabricatorAuthProviderConfig, HeraldRule, PhabricatorSlowvotePoll, and AlmanacNetwork needed to implement PhabricatorApplicationTransactionInterface, PhabricatorAuthAuthProviderPHIDType had to be added, and a rendering bug in transactions of type PhabricatorOAuth2AuthProvider had to be fixed.)
Test Plan: Almanac - looked at binding, device, network, and service view controllers and verified timeline displayed properly. Herald - looked at a rule and verified timeline. Slowvote - looked at a vote and verified timeline. Auth - looked at an auth provider (Facebook) and verified proper display of transactions within timeline.
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10921
2014-12-02 23:33:59 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2015-11-16 20:27:12 +01:00
|
|
|
'PhabricatorSubscribableInterface',
|
2013-08-02 15:21:43 +02:00
|
|
|
),
|
2011-03-22 23:27:52 +01:00
|
|
|
'HeraldRuleController' => 'HeraldController',
|
2013-10-07 02:10:29 +02:00
|
|
|
'HeraldRuleEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-05-08 19:08:37 +02:00
|
|
|
'HeraldRuleListController' => 'HeraldController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'HeraldRulePHIDType' => 'PhabricatorPHIDType',
|
2013-08-02 15:38:17 +02:00
|
|
|
'HeraldRuleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-08-02 15:53:01 +02:00
|
|
|
'HeraldRuleSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2016-03-29 01:02:41 +02:00
|
|
|
'HeraldRuleSerializer' => 'Phobject',
|
2014-10-02 18:49:32 +02:00
|
|
|
'HeraldRuleTestCase' => 'PhabricatorTestCase',
|
2013-08-02 17:28:55 +02:00
|
|
|
'HeraldRuleTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'HeraldRuleTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2015-06-15 10:02:26 +02:00
|
|
|
'HeraldRuleTranscript' => 'Phobject',
|
|
|
|
'HeraldRuleTypeConfig' => 'Phobject',
|
2013-08-06 22:43:45 +02:00
|
|
|
'HeraldRuleViewController' => 'HeraldController',
|
2014-10-01 16:53:12 +02:00
|
|
|
'HeraldSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-07-16 23:12:00 +02:00
|
|
|
'HeraldSelectFieldValue' => 'HeraldFieldValue',
|
2015-07-06 22:15:47 +02:00
|
|
|
'HeraldSpaceField' => 'HeraldField',
|
|
|
|
'HeraldSubscribersField' => 'HeraldField',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldSupportActionGroup' => 'HeraldActionGroup',
|
2015-07-16 23:13:13 +02:00
|
|
|
'HeraldSupportFieldGroup' => 'HeraldFieldGroup',
|
2011-03-24 21:49:21 +01:00
|
|
|
'HeraldTestConsoleController' => 'HeraldController',
|
2015-07-16 23:12:00 +02:00
|
|
|
'HeraldTextFieldValue' => 'HeraldFieldValue',
|
2015-07-16 23:12:44 +02:00
|
|
|
'HeraldTokenizerFieldValue' => 'HeraldFieldValue',
|
2013-10-07 02:10:29 +02:00
|
|
|
'HeraldTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-07-17 23:48:54 +02:00
|
|
|
'HeraldTranscript' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'HeraldDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-08-21 00:04:34 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
2013-10-05 22:48:45 +02:00
|
|
|
),
|
2011-03-25 05:32:26 +01:00
|
|
|
'HeraldTranscriptController' => 'HeraldController',
|
2015-12-20 17:11:59 +01:00
|
|
|
'HeraldTranscriptDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension',
|
2014-01-15 19:02:24 +01:00
|
|
|
'HeraldTranscriptGarbageCollector' => 'PhabricatorGarbageCollector',
|
2014-05-09 21:25:52 +02:00
|
|
|
'HeraldTranscriptListController' => 'HeraldController',
|
2016-01-15 17:40:48 +01:00
|
|
|
'HeraldTranscriptPHIDType' => 'PhabricatorPHIDType',
|
2013-10-05 00:17:18 +02:00
|
|
|
'HeraldTranscriptQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-02-21 21:51:25 +01:00
|
|
|
'HeraldTranscriptSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-12-18 20:59:53 +01:00
|
|
|
'HeraldTranscriptTestCase' => 'PhabricatorTestCase',
|
2015-07-17 19:27:38 +02:00
|
|
|
'HeraldUtilityActionGroup' => 'HeraldActionGroup',
|
2015-06-15 10:02:26 +02:00
|
|
|
'Javelin' => 'Phobject',
|
2015-01-03 22:36:47 +01:00
|
|
|
'JavelinReactorUIExample' => 'PhabricatorUIExample',
|
2012-07-31 01:08:10 +02:00
|
|
|
'JavelinUIExample' => 'PhabricatorUIExample',
|
2011-09-07 23:01:13 +02:00
|
|
|
'JavelinViewExampleServerView' => 'AphrontView',
|
2015-01-03 22:36:47 +01:00
|
|
|
'JavelinViewUIExample' => 'PhabricatorUIExample',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadController' => 'PhabricatorController',
|
2014-07-25 00:20:39 +02:00
|
|
|
'LegalpadCreateDocumentsCapability' => 'PhabricatorPolicyCapability',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDAO' => 'PhabricatorLiskDAO',
|
2014-07-25 00:20:39 +02:00
|
|
|
'LegalpadDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'LegalpadDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2014-07-17 23:48:54 +02:00
|
|
|
'LegalpadDocument' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'LegalpadDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2013-07-03 20:15:45 +02:00
|
|
|
),
|
2014-07-17 23:48:54 +02:00
|
|
|
'LegalpadDocumentBody' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'LegalpadDAO',
|
|
|
|
'PhabricatorMarkupInterface',
|
2013-07-03 20:15:45 +02:00
|
|
|
),
|
|
|
|
'LegalpadDocumentCommentController' => 'LegalpadController',
|
2014-07-11 01:18:48 +02:00
|
|
|
'LegalpadDocumentDatasource' => 'PhabricatorTypeaheadDatasource',
|
2014-06-26 16:16:42 +02:00
|
|
|
'LegalpadDocumentDoneController' => 'LegalpadController',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDocumentEditController' => 'LegalpadController',
|
|
|
|
'LegalpadDocumentEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-05-09 21:25:52 +02:00
|
|
|
'LegalpadDocumentListController' => 'LegalpadController',
|
2014-06-26 03:38:07 +02:00
|
|
|
'LegalpadDocumentManageController' => 'LegalpadController',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDocumentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-08-04 16:55:43 +02:00
|
|
|
'LegalpadDocumentRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDocumentSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-07-10 20:46:39 +02:00
|
|
|
'LegalpadDocumentSignController' => 'LegalpadController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'LegalpadDocumentSignature' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'LegalpadDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-01-17 20:40:26 +01:00
|
|
|
),
|
2014-07-02 13:59:35 +02:00
|
|
|
'LegalpadDocumentSignatureAddController' => 'LegalpadController',
|
2014-01-17 20:40:26 +01:00
|
|
|
'LegalpadDocumentSignatureListController' => 'LegalpadController',
|
|
|
|
'LegalpadDocumentSignatureQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-06-29 01:36:37 +02:00
|
|
|
'LegalpadDocumentSignatureSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-01-15 02:17:18 +01:00
|
|
|
'LegalpadDocumentSignatureVerificationController' => 'LegalpadController',
|
2014-07-02 13:59:35 +02:00
|
|
|
'LegalpadDocumentSignatureViewController' => 'LegalpadController',
|
2015-04-01 20:01:21 +02:00
|
|
|
'LegalpadMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2015-01-01 01:15:34 +01:00
|
|
|
'LegalpadObjectNeedsSignatureEdgeType' => 'PhabricatorEdgeType',
|
2015-04-01 17:39:50 +02:00
|
|
|
'LegalpadReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2015-07-30 21:09:17 +02:00
|
|
|
'LegalpadRequireSignatureHeraldAction' => 'HeraldAction',
|
2014-09-19 14:44:40 +02:00
|
|
|
'LegalpadSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-01-01 01:15:34 +01:00
|
|
|
'LegalpadSignatureNeededByObjectEdgeType' => 'PhabricatorEdgeType',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'LegalpadTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'LegalpadTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'LegalpadTransactionView' => 'PhabricatorApplicationTransactionView',
|
Implement a more compact, general database-backed key-value cache
Summary:
See discussion in D4204. Facebook currently has a 314MB remarkup cache with a 55MB index, which is slow to access. Under the theory that this is an index size/quality problem (the current index is on a potentially-384-byte field, with many keys sharing prefixes), provide a more general index with fancy new features:
- It implements PhutilKeyValueCache, so it can be a component in cache stacks and supports TTL.
- It has a 12-byte hash-based key.
- It automatically compresses large blocks of data (most of what we store is highly-compressible HTML).
Test Plan:
- Basics:
- Loaded /paste/, saw caches generate and save.
- Reloaded /paste/, saw the page hit cache.
- GC:
- Ran GC daemon, saw nothing.
- Set maximum lifetime to 1 second, ran GC daemon, saw it collect the entire cache.
- Deflate:
- Selected row formats from the database, saw a mixture of 'raw' and 'deflate' storage.
- Used profiler to verify that 'deflate' is fast (12 calls @ 220us on my paste list).
- Ran unit tests
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran
Differential Revision: https://secure.phabricator.com/D4259
2012-12-21 23:17:56 +01:00
|
|
|
'LiskChunkTestCase' => 'PhabricatorTestCase',
|
2015-06-15 10:02:26 +02:00
|
|
|
'LiskDAO' => 'Phobject',
|
|
|
|
'LiskDAOSet' => 'Phobject',
|
2012-10-24 21:47:53 +02:00
|
|
|
'LiskDAOTestCase' => 'PhabricatorTestCase',
|
2012-05-30 23:26:29 +02:00
|
|
|
'LiskEphemeralObjectException' => 'Exception',
|
2012-05-02 21:42:23 +02:00
|
|
|
'LiskFixtureTestCase' => 'PhabricatorTestCase',
|
2011-04-30 19:11:59 +02:00
|
|
|
'LiskIsolationTestCase' => 'PhabricatorTestCase',
|
|
|
|
'LiskIsolationTestDAO' => 'LiskDAO',
|
2012-05-30 23:26:29 +02:00
|
|
|
'LiskIsolationTestDAOException' => 'Exception',
|
2012-07-26 22:09:36 +02:00
|
|
|
'LiskMigrationIterator' => 'PhutilBufferedIterator',
|
2013-06-21 21:55:07 +02:00
|
|
|
'LiskRawMigrationIterator' => 'PhutilBufferedIterator',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'MacroConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'MacroCreateMemeConduitAPIMethod' => 'MacroConduitAPIMethod',
|
|
|
|
'MacroQueryConduitAPIMethod' => 'MacroConduitAPIMethod',
|
2015-04-01 17:40:42 +02:00
|
|
|
'ManiphestAssignEmailCommand' => 'ManiphestEmailCommand',
|
2015-04-19 17:23:56 +02:00
|
|
|
'ManiphestAssigneeDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2012-02-24 22:00:48 +01:00
|
|
|
'ManiphestBatchEditController' => 'ManiphestController',
|
2014-07-25 00:20:39 +02:00
|
|
|
'ManiphestBulkEditCapability' => 'PhabricatorPolicyCapability',
|
2015-04-01 17:40:42 +02:00
|
|
|
'ManiphestClaimEmailCommand' => 'ManiphestEmailCommand',
|
|
|
|
'ManiphestCloseEmailCommand' => 'ManiphestEmailCommand',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestConduitAPIMethod' => 'ConduitAPIMethod',
|
2014-07-17 23:48:54 +02:00
|
|
|
'ManiphestConfiguredCustomField' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'ManiphestCustomField',
|
|
|
|
'PhabricatorStandardCustomFieldInterface',
|
2013-09-19 20:56:15 +02:00
|
|
|
),
|
2015-06-15 10:02:26 +02:00
|
|
|
'ManiphestConstants' => 'Phobject',
|
2011-02-08 19:53:59 +01:00
|
|
|
'ManiphestController' => 'PhabricatorController',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ManiphestCreateMailReceiver' => 'PhabricatorMailReceiver',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestCreateTaskConduitAPIMethod' => 'ManiphestConduitAPIMethod',
|
2013-09-11 00:31:48 +02:00
|
|
|
'ManiphestCustomField' => 'PhabricatorCustomField',
|
2013-09-16 23:06:41 +02:00
|
|
|
'ManiphestCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage',
|
2014-02-18 00:59:13 +01:00
|
|
|
'ManiphestCustomFieldStatusParser' => 'PhabricatorCustomFieldMonogramParser',
|
|
|
|
'ManiphestCustomFieldStatusParserTestCase' => 'PhabricatorTestCase',
|
2013-09-16 23:06:41 +02:00
|
|
|
'ManiphestCustomFieldStorage' => 'PhabricatorCustomFieldStorage',
|
|
|
|
'ManiphestCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage',
|
2011-02-08 19:53:59 +01:00
|
|
|
'ManiphestDAO' => 'PhabricatorLiskDAO',
|
2014-07-25 00:20:39 +02:00
|
|
|
'ManiphestDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'ManiphestDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'ManiphestEditAssignCapability' => 'PhabricatorPolicyCapability',
|
2015-12-03 23:32:40 +01:00
|
|
|
'ManiphestEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
|
|
|
'ManiphestEditEngine' => 'PhabricatorEditEngine',
|
2014-07-25 00:20:39 +02:00
|
|
|
'ManiphestEditPoliciesCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'ManiphestEditPriorityCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'ManiphestEditProjectsCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'ManiphestEditStatusCapability' => 'PhabricatorPolicyCapability',
|
2015-04-01 17:40:42 +02:00
|
|
|
'ManiphestEmailCommand' => 'MetaMTAEmailTransactionCommand',
|
2013-04-11 20:22:06 +02:00
|
|
|
'ManiphestExcelDefaultFormat' => 'ManiphestExcelFormat',
|
2015-06-15 10:02:26 +02:00
|
|
|
'ManiphestExcelFormat' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'ManiphestExcelFormatTestCase' => 'PhabricatorTestCase',
|
2012-02-29 06:07:12 +01:00
|
|
|
'ManiphestExportController' => 'ManiphestController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestGetTaskTransactionsConduitAPIMethod' => 'ManiphestConduitAPIMethod',
|
2015-12-24 20:20:18 +01:00
|
|
|
'ManiphestHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestInfoConduitAPIMethod' => 'ManiphestConduitAPIMethod',
|
2013-09-12 22:06:44 +02:00
|
|
|
'ManiphestNameIndex' => 'ManiphestDAO',
|
2016-02-12 02:32:44 +01:00
|
|
|
'ManiphestPointsConfigOptionType' => 'PhabricatorConfigJSONOptionType',
|
2015-12-06 01:35:36 +01:00
|
|
|
'ManiphestPriorityConfigOptionType' => 'PhabricatorConfigJSONOptionType',
|
2015-04-01 19:09:47 +02:00
|
|
|
'ManiphestPriorityEmailCommand' => 'ManiphestEmailCommand',
|
2015-12-21 15:55:23 +01:00
|
|
|
'ManiphestProjectNameFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestQueryConduitAPIMethod' => 'ManiphestConduitAPIMethod',
|
|
|
|
'ManiphestQueryStatusesConduitAPIMethod' => 'ManiphestConduitAPIMethod',
|
2014-08-04 16:55:43 +02:00
|
|
|
'ManiphestRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-04-01 17:40:42 +02:00
|
|
|
'ManiphestReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2012-02-08 18:47:14 +01:00
|
|
|
'ManiphestReportController' => 'ManiphestController',
|
2014-09-19 20:46:44 +02:00
|
|
|
'ManiphestSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-12-13 11:31:09 +01:00
|
|
|
'ManiphestSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
2014-03-25 22:05:36 +01:00
|
|
|
'ManiphestStatusConfigOptionType' => 'PhabricatorConfigJSONOptionType',
|
2015-04-01 19:09:47 +02:00
|
|
|
'ManiphestStatusEmailCommand' => 'ManiphestEmailCommand',
|
2012-04-02 21:12:04 +02:00
|
|
|
'ManiphestSubpriorityController' => 'ManiphestController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'ManiphestTask' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'ManiphestDAO',
|
2014-12-11 01:27:30 +01:00
|
|
|
'PhabricatorSubscribableInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorMarkupInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
2014-09-09 23:21:13 +02:00
|
|
|
'PhabricatorMentionableInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhrequentTrackableInterface',
|
|
|
|
'PhabricatorCustomFieldInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-08-08 00:44:12 +02:00
|
|
|
'PhabricatorProjectInterface',
|
2015-06-11 00:53:04 +02:00
|
|
|
'PhabricatorSpacesInterface',
|
2015-12-13 11:31:09 +01:00
|
|
|
'PhabricatorConduitResultInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2016-03-09 17:40:19 +01:00
|
|
|
'DoorkeeperBridgedObjectInterface',
|
2012-07-16 20:49:06 +02:00
|
|
|
),
|
2015-07-24 21:51:30 +02:00
|
|
|
'ManiphestTaskAssignHeraldAction' => 'HeraldAction',
|
|
|
|
'ManiphestTaskAssignOtherHeraldAction' => 'ManiphestTaskAssignHeraldAction',
|
|
|
|
'ManiphestTaskAssignSelfHeraldAction' => 'ManiphestTaskAssignHeraldAction',
|
2015-07-06 22:17:14 +02:00
|
|
|
'ManiphestTaskAssigneeHeraldField' => 'ManiphestTaskHeraldField',
|
|
|
|
'ManiphestTaskAuthorHeraldField' => 'ManiphestTaskHeraldField',
|
2015-06-14 00:44:03 +02:00
|
|
|
'ManiphestTaskAuthorPolicyRule' => 'PhabricatorPolicyRule',
|
2015-04-23 15:47:30 +02:00
|
|
|
'ManiphestTaskClosedStatusDatasource' => 'PhabricatorTypeaheadDatasource',
|
2014-12-28 15:10:49 +01:00
|
|
|
'ManiphestTaskDependedOnByTaskEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'ManiphestTaskDependsOnTaskEdgeType' => 'PhabricatorEdgeType',
|
2015-07-06 22:17:14 +02:00
|
|
|
'ManiphestTaskDescriptionHeraldField' => 'ManiphestTaskHeraldField',
|
2011-02-08 19:53:59 +01:00
|
|
|
'ManiphestTaskDetailController' => 'ManiphestController',
|
2015-06-23 22:36:16 +02:00
|
|
|
'ManiphestTaskEditBulkJobType' => 'PhabricatorWorkerBulkJobType',
|
2015-12-09 01:54:46 +01:00
|
|
|
'ManiphestTaskEditController' => 'ManiphestController',
|
2015-12-21 18:02:55 +01:00
|
|
|
'ManiphestTaskFulltextEngine' => 'PhabricatorFulltextEngine',
|
2014-07-18 00:42:06 +02:00
|
|
|
'ManiphestTaskHasCommitEdgeType' => 'PhabricatorEdgeType',
|
2015-01-02 00:11:41 +01:00
|
|
|
'ManiphestTaskHasMockEdgeType' => 'PhabricatorEdgeType',
|
2014-07-18 00:41:08 +02:00
|
|
|
'ManiphestTaskHasRevisionEdgeType' => 'PhabricatorEdgeType',
|
2015-07-06 22:17:14 +02:00
|
|
|
'ManiphestTaskHeraldField' => 'HeraldField',
|
2015-07-16 23:13:13 +02:00
|
|
|
'ManiphestTaskHeraldFieldGroup' => 'HeraldFieldGroup',
|
2014-05-16 04:17:38 +02:00
|
|
|
'ManiphestTaskListController' => 'ManiphestController',
|
2015-12-08 16:54:01 +01:00
|
|
|
'ManiphestTaskListHTTPParameterType' => 'AphrontListHTTPParameterType',
|
2011-07-04 22:04:22 +02:00
|
|
|
'ManiphestTaskListView' => 'ManiphestView',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ManiphestTaskMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2015-04-23 15:47:30 +02:00
|
|
|
'ManiphestTaskOpenStatusDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-12-08 16:54:01 +01:00
|
|
|
'ManiphestTaskPHIDResolver' => 'PhabricatorPHIDResolver',
|
2014-07-24 00:05:46 +02:00
|
|
|
'ManiphestTaskPHIDType' => 'PhabricatorPHIDType',
|
2016-02-09 00:24:52 +01:00
|
|
|
'ManiphestTaskPoints' => 'Phobject',
|
2011-07-04 22:04:22 +02:00
|
|
|
'ManiphestTaskPriority' => 'ManiphestConstants',
|
2014-07-11 01:20:40 +02:00
|
|
|
'ManiphestTaskPriorityDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-12-05 20:15:29 +01:00
|
|
|
'ManiphestTaskPriorityHeraldAction' => 'HeraldAction',
|
2015-07-06 22:17:14 +02:00
|
|
|
'ManiphestTaskPriorityHeraldField' => 'ManiphestTaskHeraldField',
|
2013-09-10 16:53:27 +02:00
|
|
|
'ManiphestTaskQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-05-16 04:17:38 +02:00
|
|
|
'ManiphestTaskResultListView' => 'ManiphestView',
|
2013-09-10 19:04:26 +02:00
|
|
|
'ManiphestTaskSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2011-07-04 22:04:22 +02:00
|
|
|
'ManiphestTaskStatus' => 'ManiphestConstants',
|
2014-11-12 21:54:29 +01:00
|
|
|
'ManiphestTaskStatusDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-04-23 15:47:30 +02:00
|
|
|
'ManiphestTaskStatusFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-12-05 19:51:34 +01:00
|
|
|
'ManiphestTaskStatusHeraldAction' => 'HeraldAction',
|
2015-07-06 22:17:14 +02:00
|
|
|
'ManiphestTaskStatusHeraldField' => 'ManiphestTaskHeraldField',
|
2014-03-25 22:04:51 +01:00
|
|
|
'ManiphestTaskStatusTestCase' => 'PhabricatorTestCase',
|
2015-03-21 01:38:25 +01:00
|
|
|
'ManiphestTaskTestCase' => 'PhabricatorTestCase',
|
2015-07-06 22:17:14 +02:00
|
|
|
'ManiphestTaskTitleHeraldField' => 'ManiphestTaskHeraldField',
|
2013-09-24 19:49:06 +02:00
|
|
|
'ManiphestTransaction' => 'PhabricatorApplicationTransaction',
|
2013-09-23 23:25:14 +02:00
|
|
|
'ManiphestTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2013-10-22 01:58:37 +02:00
|
|
|
'ManiphestTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
Migrate all Maniphest transaction data to new storage
Summary:
Ref T2217. This is the risky, hard part; everything after this should be smooth sailing. This is //mostly// clean, except:
- The old format would opportunistically combine a comment with some other transaction type if it could. We no longer do that, so:
- When migrating, "edit" + "comment" transactions need to be split in two.
- When editing now, we should no longer combine these transaction types.
- These changes are pretty straightforward and low-impact.
- This migration promotes "auxiliary field" data to the new CustomField/StandardField format, so that's not a straight migration either. The formats are very similar, though.
Broadly, this takes the same attack that the auth migration did: proxy all the code through to the new storage. `ManiphestTransaction` is now just an API on top of `ManiphestTransactionPro`, which is the new storage format. The two formats are very similar, so this was mostly a straight copy from one table to the other.
Test Plan:
- Without performing the migration, made a bunch of edits and comments on tasks and verified the new code works correctly.
- Droped the test data and performed the migration.
- Looked at the resulting data for obvious discrepancies.
- Looked at a bunch of tasks and their transaction history.
- Used Conduit to pull transaction data.
- Edited task description and clicked "View Details" on transaction.
- Used batch editor.
- Made a bunch more edits.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2217
Differential Revision: https://secure.phabricator.com/D7068
2013-09-23 23:25:28 +02:00
|
|
|
'ManiphestTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ManiphestUpdateConduitAPIMethod' => 'ManiphestConduitAPIMethod',
|
2011-07-04 22:04:22 +02:00
|
|
|
'ManiphestView' => 'AphrontView',
|
2015-04-01 17:40:00 +02:00
|
|
|
'MetaMTAEmailTransactionCommand' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'MetaMTAEmailTransactionCommandTestCase' => 'PhabricatorTestCase',
|
2014-02-03 19:51:31 +01:00
|
|
|
'MetaMTAMailReceivedGarbageCollector' => 'PhabricatorGarbageCollector',
|
|
|
|
'MetaMTAMailSentGarbageCollector' => 'PhabricatorGarbageCollector',
|
2015-08-14 13:31:42 +02:00
|
|
|
'MetaMTAReceivedMailStatus' => 'Phobject',
|
Skeleton for "Multimeter", a performance sampling application
Summary:
Ref T6930. This application collects and displays performance samples -- roughly, things Phabricator spent some kind of resource on. It will collect samples on different types of resources and events:
- Wall time (queries, service calls, pages)
- Bytes In / Bytes Out (requests)
- Implicit requests to CSS/JS (static resources)
I've started with the simplest case (static resources), since this can be used in an immediate, straghtforward way to improve packaging (look at which individual files have the most requests recently).
There's no aggregation yet and a lot of the data isn't collected properly. Future diffs will add more dimension data (controllers, users), more event and resource types (queries, service calls, wall time), and more display options (aggregation, sorting).
Test Plan: {F389344}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6930
Differential Revision: https://secure.phabricator.com/D12623
2015-05-01 22:19:43 +02:00
|
|
|
'MultimeterContext' => 'MultimeterDimension',
|
2015-06-15 10:02:26 +02:00
|
|
|
'MultimeterControl' => 'Phobject',
|
Skeleton for "Multimeter", a performance sampling application
Summary:
Ref T6930. This application collects and displays performance samples -- roughly, things Phabricator spent some kind of resource on. It will collect samples on different types of resources and events:
- Wall time (queries, service calls, pages)
- Bytes In / Bytes Out (requests)
- Implicit requests to CSS/JS (static resources)
I've started with the simplest case (static resources), since this can be used in an immediate, straghtforward way to improve packaging (look at which individual files have the most requests recently).
There's no aggregation yet and a lot of the data isn't collected properly. Future diffs will add more dimension data (controllers, users), more event and resource types (queries, service calls, wall time), and more display options (aggregation, sorting).
Test Plan: {F389344}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6930
Differential Revision: https://secure.phabricator.com/D12623
2015-05-01 22:19:43 +02:00
|
|
|
'MultimeterController' => 'PhabricatorController',
|
|
|
|
'MultimeterDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'MultimeterDimension' => 'MultimeterDAO',
|
|
|
|
'MultimeterEvent' => 'MultimeterDAO',
|
|
|
|
'MultimeterEventGarbageCollector' => 'PhabricatorGarbageCollector',
|
|
|
|
'MultimeterHost' => 'MultimeterDimension',
|
|
|
|
'MultimeterLabel' => 'MultimeterDimension',
|
|
|
|
'MultimeterSampleController' => 'MultimeterController',
|
|
|
|
'MultimeterViewer' => 'MultimeterDimension',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'NuanceConduitAPIMethod' => 'ConduitAPIMethod',
|
2015-08-23 16:19:35 +02:00
|
|
|
'NuanceConsoleController' => 'NuanceController',
|
2016-03-28 20:18:39 +02:00
|
|
|
'NuanceContentSource' => 'PhabricatorContentSource',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceController' => 'PhabricatorController',
|
|
|
|
'NuanceDAO' => 'PhabricatorLiskDAO',
|
2016-03-08 22:07:22 +01:00
|
|
|
'NuanceGitHubEventItemType' => 'NuanceItemType',
|
Split the GitHub import cursor into separate repository and issues event importers
Summary:
Ref T10538. The primary GitHub event activity stream does not report minor events (labels, milestones, etc).
GitHub has a second, similar activity stream which does report these events (the "Issues Events API").
Use two separate cursors: one consumes the primary stream; the second consumes the events stream.
One possible issue with this is that we may write events in a different order than they occurred, so GitHub shows "comment, label, close" but we show "comment, close, label" or similar. This is probably OK because the secondary API doesn't seem to have any very important events (e.g., it's probably fine if label changes are out-of-order), but we can conceivably put some buffer stage in between the two if it's an issue.
Test Plan: {F1164894}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10538
Differential Revision: https://secure.phabricator.com/D15446
2016-03-09 14:35:08 +01:00
|
|
|
'NuanceGitHubImportCursor' => 'NuanceImportCursor',
|
|
|
|
'NuanceGitHubIssuesImportCursor' => 'NuanceGitHubImportCursor',
|
2016-03-09 15:30:22 +01:00
|
|
|
'NuanceGitHubRawEvent' => 'Phobject',
|
2016-03-09 16:01:23 +01:00
|
|
|
'NuanceGitHubRawEventTestCase' => 'PhabricatorTestCase',
|
Split the GitHub import cursor into separate repository and issues event importers
Summary:
Ref T10538. The primary GitHub event activity stream does not report minor events (labels, milestones, etc).
GitHub has a second, similar activity stream which does report these events (the "Issues Events API").
Use two separate cursors: one consumes the primary stream; the second consumes the events stream.
One possible issue with this is that we may write events in a different order than they occurred, so GitHub shows "comment, label, close" but we show "comment, close, label" or similar. This is probably OK because the secondary API doesn't seem to have any very important events (e.g., it's probably fine if label changes are out-of-order), but we can conceivably put some buffer stage in between the two if it's an issue.
Test Plan: {F1164894}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10538
Differential Revision: https://secure.phabricator.com/D15446
2016-03-09 14:35:08 +01:00
|
|
|
'NuanceGitHubRepositoryImportCursor' => 'NuanceGitHubImportCursor',
|
2016-03-08 16:50:43 +01:00
|
|
|
'NuanceGitHubRepositorySourceDefinition' => 'NuanceSourceDefinition',
|
2016-03-08 14:59:24 +01:00
|
|
|
'NuanceImportCursor' => 'Phobject',
|
2016-03-08 17:51:45 +01:00
|
|
|
'NuanceImportCursorData' => array(
|
|
|
|
'NuanceDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2016-03-08 14:59:24 +01:00
|
|
|
'NuanceImportCursorDataQuery' => 'NuanceQuery',
|
|
|
|
'NuanceImportCursorPHIDType' => 'PhabricatorPHIDType',
|
2014-07-17 23:48:54 +02:00
|
|
|
'NuanceItem' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'NuanceDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-07-02 23:24:07 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2013-11-07 02:00:09 +01:00
|
|
|
),
|
2016-03-22 01:38:22 +01:00
|
|
|
'NuanceItemActionController' => 'NuanceController',
|
2016-03-22 14:51:22 +01:00
|
|
|
'NuanceItemCommand' => array(
|
|
|
|
'NuanceDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'NuanceItemCommandQuery' => 'NuanceQuery',
|
2016-03-08 17:51:45 +01:00
|
|
|
'NuanceItemController' => 'NuanceController',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceItemEditor' => 'PhabricatorApplicationTransactionEditor',
|
2016-03-08 17:51:45 +01:00
|
|
|
'NuanceItemListController' => 'NuanceItemController',
|
2016-03-09 13:01:17 +01:00
|
|
|
'NuanceItemManageController' => 'NuanceController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'NuanceItemPHIDType' => 'PhabricatorPHIDType',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceItemQuery' => 'NuanceQuery',
|
2016-03-08 17:51:45 +01:00
|
|
|
'NuanceItemSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceItemTransaction' => 'NuanceTransaction',
|
|
|
|
'NuanceItemTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'NuanceItemTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2016-03-08 22:07:22 +01:00
|
|
|
'NuanceItemType' => 'Phobject',
|
|
|
|
'NuanceItemUpdateWorker' => 'NuanceWorker',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceItemViewController' => 'NuanceController',
|
2016-03-08 15:27:26 +01:00
|
|
|
'NuanceManagementImportWorkflow' => 'NuanceManagementWorkflow',
|
2016-03-08 22:07:22 +01:00
|
|
|
'NuanceManagementUpdateWorkflow' => 'NuanceManagementWorkflow',
|
2016-03-08 15:27:26 +01:00
|
|
|
'NuanceManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2013-11-20 22:41:19 +01:00
|
|
|
'NuancePhabricatorFormSourceDefinition' => 'NuanceSourceDefinition',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-07-17 23:48:54 +02:00
|
|
|
'NuanceQueue' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'NuanceDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-06-05 19:44:02 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2013-11-07 02:00:09 +01:00
|
|
|
),
|
2016-03-08 00:18:55 +01:00
|
|
|
'NuanceQueueController' => 'NuanceController',
|
2015-08-24 18:21:56 +02:00
|
|
|
'NuanceQueueDatasource' => 'PhabricatorTypeaheadDatasource',
|
2016-03-08 00:18:55 +01:00
|
|
|
'NuanceQueueEditController' => 'NuanceQueueController',
|
2016-03-08 01:22:39 +01:00
|
|
|
'NuanceQueueEditEngine' => 'PhabricatorEditEngine',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceQueueEditor' => 'PhabricatorApplicationTransactionEditor',
|
2016-03-08 00:18:55 +01:00
|
|
|
'NuanceQueueListController' => 'NuanceQueueController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'NuanceQueuePHIDType' => 'PhabricatorPHIDType',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceQueueQuery' => 'NuanceQuery',
|
2015-06-05 19:49:35 +02:00
|
|
|
'NuanceQueueSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceQueueTransaction' => 'NuanceTransaction',
|
|
|
|
'NuanceQueueTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'NuanceQueueTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2016-03-08 00:18:55 +01:00
|
|
|
'NuanceQueueViewController' => 'NuanceQueueController',
|
2014-09-24 22:50:00 +02:00
|
|
|
'NuanceSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2014-07-17 23:48:54 +02:00
|
|
|
'NuanceSource' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'NuanceDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
2016-03-08 15:27:26 +01:00
|
|
|
'PhabricatorNgramsInterface',
|
2013-11-07 02:00:09 +01:00
|
|
|
),
|
2015-06-05 20:01:06 +02:00
|
|
|
'NuanceSourceActionController' => 'NuanceController',
|
2016-03-08 00:18:55 +01:00
|
|
|
'NuanceSourceController' => 'NuanceController',
|
2014-07-25 00:20:39 +02:00
|
|
|
'NuanceSourceDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'NuanceSourceDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2013-11-20 22:41:19 +01:00
|
|
|
'NuanceSourceDefinition' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'NuanceSourceDefinitionTestCase' => 'PhabricatorTestCase',
|
2016-03-08 00:18:55 +01:00
|
|
|
'NuanceSourceEditController' => 'NuanceSourceController',
|
2016-03-08 14:09:25 +01:00
|
|
|
'NuanceSourceEditEngine' => 'PhabricatorEditEngine',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceSourceEditor' => 'PhabricatorApplicationTransactionEditor',
|
2016-03-08 00:18:55 +01:00
|
|
|
'NuanceSourceListController' => 'NuanceSourceController',
|
2014-07-25 00:20:39 +02:00
|
|
|
'NuanceSourceManageCapability' => 'PhabricatorPolicyCapability',
|
2016-03-08 15:27:26 +01:00
|
|
|
'NuanceSourceNameNgrams' => 'PhabricatorSearchNgrams',
|
2014-07-24 00:05:46 +02:00
|
|
|
'NuanceSourcePHIDType' => 'PhabricatorPHIDType',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceSourceQuery' => 'NuanceQuery',
|
2015-06-05 19:44:18 +02:00
|
|
|
'NuanceSourceSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceSourceTransaction' => 'NuanceTransaction',
|
|
|
|
'NuanceSourceTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'NuanceSourceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2016-03-08 00:18:55 +01:00
|
|
|
'NuanceSourceViewController' => 'NuanceSourceController',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceTransaction' => 'PhabricatorApplicationTransaction',
|
2016-03-08 22:07:22 +01:00
|
|
|
'NuanceWorker' => 'PhabricatorWorker',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'OwnersConduitAPIMethod' => 'ConduitAPIMethod',
|
2015-11-29 18:33:36 +01:00
|
|
|
'OwnersEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
Detect package change and send out email
Summary:
For package creation and deletion, send email to all the owners For
package modification, detect important fields such as owners and paths, and then
send out emails to all owners (including deleted owners and current owners)
Also start using transaction for package creation/deletion/modification.
Test Plan:
- tested mail creation and deletion
- tested modification to auditing enabled, primary owners, owners, paths
Reviewers: epriestley, nh, vrana
Reviewed By: epriestley
CC: prithvi, aran, Koolvin
Differential Revision: https://secure.phabricator.com/D2470
2012-05-07 09:19:44 +02:00
|
|
|
'OwnersPackageReplyHandler' => 'PhabricatorMailReplyHandler',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'OwnersQueryConduitAPIMethod' => 'OwnersConduitAPIMethod',
|
2015-12-13 01:25:51 +01:00
|
|
|
'OwnersSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PHIDConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'PHIDInfoConduitAPIMethod' => 'PHIDConduitAPIMethod',
|
|
|
|
'PHIDLookupConduitAPIMethod' => 'PHIDConduitAPIMethod',
|
|
|
|
'PHIDQueryConduitAPIMethod' => 'PHIDConduitAPIMethod',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PHUI' => 'Phobject',
|
2015-02-08 02:06:28 +01:00
|
|
|
'PHUIActionPanelExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIActionPanelView' => 'AphrontTagView',
|
Make mobile navigation work properly by default in more cases
Summary:
Fixes T5752. This obsoletes a bunch of old patterns and I'll follow up on those with a big "go do a bunch of mechanical code changes" task. Major goals are:
- Don't load named queries multiple times on search pages.
- Don't require extra code to get standard navigation right on mobile.
- Reduce the amount of boilerplate in ListControllers.
- Reduce the amount of boilerplate around navigation/menus in all controllers.
Specifically, here's what this does:
- The StandardPage is now a smarter/more structured object with `setNavigation()` and `setCrumbs()` methods. More rendering decisions are delayed until the last possible moment.
- It uses this to automatically add crumb actions to the application menu.
- It uses this to automatically reuse one SearchEngine instead of running queries multiple times.
- The new preferred way to build responses is `$this->newPage()` (like `$this->newDialog()`), which has structured methods for adding stuff (`setTitle()`, etc).
- SearchEngine exposes a new convenience method so you don't have to do all the controller delegation stuff.
- Building menus is generally simpler.
Test Plan:
- Tested paste list, view, edit, comment, raw controllers for functionality, mobile menu, crumbs, navigation menu.
- Edited saved queries.
- Tested Differential, Maniphest (no changes).
- Verified the paste pages don't run any duplicate NamedQuery queries.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T5752
Differential Revision: https://secure.phabricator.com/D14382
2015-11-02 21:06:28 +01:00
|
|
|
'PHUIApplicationMenuView' => 'Phobject',
|
2015-07-10 00:12:11 +02:00
|
|
|
'PHUIBadgeBoxView' => 'AphrontTagView',
|
|
|
|
'PHUIBadgeExample' => 'PhabricatorUIExample',
|
2015-07-10 19:49:28 +02:00
|
|
|
'PHUIBadgeMiniView' => 'AphrontTagView',
|
2015-07-10 00:12:11 +02:00
|
|
|
'PHUIBadgeView' => 'AphrontTagView',
|
2015-12-21 16:35:45 +01:00
|
|
|
'PHUIBigInfoView' => 'AphrontTagView',
|
2013-04-18 20:34:02 +02:00
|
|
|
'PHUIBoxExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIBoxView' => 'AphrontTagView',
|
2014-02-10 20:11:36 +01:00
|
|
|
'PHUIButtonBarExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIButtonBarView' => 'AphrontTagView',
|
2013-06-13 03:23:35 +02:00
|
|
|
'PHUIButtonExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIButtonView' => 'AphrontTagView',
|
2015-05-04 01:57:18 +02:00
|
|
|
'PHUICalendarDayView' => 'AphrontView',
|
2014-02-24 19:04:23 +01:00
|
|
|
'PHUICalendarListView' => 'AphrontTagView',
|
2014-02-16 18:25:29 +01:00
|
|
|
'PHUICalendarMonthView' => 'AphrontView',
|
2015-04-27 15:42:32 +02:00
|
|
|
'PHUICalendarWidgetView' => 'AphrontTagView',
|
2013-06-19 00:35:14 +02:00
|
|
|
'PHUIColorPalletteExample' => 'PhabricatorUIExample',
|
2015-01-23 20:35:09 +01:00
|
|
|
'PHUICrumbView' => 'AphrontView',
|
|
|
|
'PHUICrumbsView' => 'AphrontView',
|
2016-03-05 23:45:56 +01:00
|
|
|
'PHUICurtainExtension' => 'Phobject',
|
|
|
|
'PHUICurtainPanelView' => 'AphrontTagView',
|
|
|
|
'PHUICurtainView' => 'AphrontTagView',
|
2015-03-06 14:11:29 +01:00
|
|
|
'PHUIDiffInlineCommentDetailView' => 'PHUIDiffInlineCommentView',
|
|
|
|
'PHUIDiffInlineCommentEditView' => 'PHUIDiffInlineCommentView',
|
2015-03-06 14:44:36 +01:00
|
|
|
'PHUIDiffInlineCommentRowScaffold' => 'AphrontView',
|
|
|
|
'PHUIDiffInlineCommentTableScaffold' => 'AphrontView',
|
2015-03-08 23:27:16 +01:00
|
|
|
'PHUIDiffInlineCommentUndoView' => 'PHUIDiffInlineCommentView',
|
2015-03-06 14:11:29 +01:00
|
|
|
'PHUIDiffInlineCommentView' => 'AphrontView',
|
2015-03-06 14:44:36 +01:00
|
|
|
'PHUIDiffOneUpInlineCommentRowScaffold' => 'PHUIDiffInlineCommentRowScaffold',
|
Allow inline comments to be individually hidden
Summary:
Ref T7447. Implements per-viewer comment hiding. Once a comment is obsolete or uninteresting, you can hide it completely.
This is sticky per-user.
My hope is that this will strike a better balance between concerns than some of the other approaches (conservative porting, summarization, hide-all).
Specifically, this adds a new action here:
{F435621}
Clicking it completely collapses the comment into a small icon on the previous line, and saves the comment state as hidden for you:
{F435626}
You can click the icon to reveal all hidden comments below the line.
Test Plan:
- Hid comments.
- Showed comments.
- Created, edited, deleted and submitted comments.
- Used Diffusion comments (hiding is not implemented there yet, but I'd plan to bring it there eventually if it works out in Differential).
Reviewers: btrahan, chad
Reviewed By: btrahan
Subscribers: jparise, yelirekim, epriestley
Maniphest Tasks: T7447
Differential Revision: https://secure.phabricator.com/D13009
2015-05-27 19:28:38 +02:00
|
|
|
'PHUIDiffRevealIconView' => 'AphrontView',
|
2015-08-15 20:43:12 +02:00
|
|
|
'PHUIDiffTableOfContentsItemView' => 'AphrontView',
|
|
|
|
'PHUIDiffTableOfContentsListView' => 'AphrontView',
|
2015-03-06 14:44:36 +01:00
|
|
|
'PHUIDiffTwoUpInlineCommentRowScaffold' => 'PHUIDiffInlineCommentRowScaffold',
|
2013-06-05 17:41:43 +02:00
|
|
|
'PHUIDocumentExample' => 'PhabricatorUIExample',
|
2015-11-30 17:47:46 +01:00
|
|
|
'PHUIDocumentSummaryView' => 'AphrontTagView',
|
2013-06-01 00:03:59 +02:00
|
|
|
'PHUIDocumentView' => 'AphrontTagView',
|
Redesign Diviner
Summary:
This implements `PHUIDocumentViewPro` which should move to be the base for all documents (Phame, Phriction, Legalpad, Diviner). Overall this feels really good to me, but I'd like to roll it out into Diviner specifically first to work through the issues and then move into other apps and drop `PHUIDocumentView` once everything is converted. Some features are:
- White Background, no border on page
- Table of Contents is move to hidden menu (more space for documentation)
- Property List sits under the document
Some design decisions above are in anticipation of Phriction v3 and Unbeta Phame, specifically commenting and maybe some cool new Remarkup text layout options for Phame.
Test Plan:
Went through tons of pages on Diviner on Desktop, Tablet, Mobile. Bounce back to Phriction to make sure DocumentView CSS changes actually look better there.
{F930518}
{F930519}
{F930520}
{F930521}
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: tycho.tatitscheff, joshuaspence, Korvin
Differential Revision: https://secure.phabricator.com/D14374
2015-11-01 17:56:46 +01:00
|
|
|
'PHUIDocumentViewPro' => 'AphrontTagView',
|
2013-04-25 00:18:58 +02:00
|
|
|
'PHUIFeedStoryExample' => 'PhabricatorUIExample',
|
2013-04-15 04:32:26 +02:00
|
|
|
'PHUIFeedStoryView' => 'AphrontView',
|
2013-05-24 21:38:27 +02:00
|
|
|
'PHUIFormDividerControl' => 'AphrontFormControl',
|
2013-05-31 02:32:12 +02:00
|
|
|
'PHUIFormFreeformDateControl' => 'AphrontFormControl',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PHUIFormIconSetControl' => 'AphrontFormControl',
|
2014-11-07 23:16:30 +01:00
|
|
|
'PHUIFormInsetView' => 'AphrontView',
|
2013-08-26 20:53:11 +02:00
|
|
|
'PHUIFormLayoutView' => 'AphrontView',
|
Add a basic multipage form
Summary:
Ref T2232. Very busy day on IRC so I feel like I've made 20 minutes of progress in 1-minute spurts here, but this adds the basics for a form that can have multiple pages and automatically handle pagination and reading to/from the request, objects and responses.
The UIExample is reasonably instructive. Basically, you make a form, add pages to the form, and add controls to the pages. The core flow control looks like this:
if ($request->isFormPost()) {
$form->readFromRequest($request); // (1)
if ($form->isComplete()) { // (2)
$response = $form->writeToResponse($response); // (3)
// Process result here. // (4)
}
} else {
$form->readFromObject($object); // (5)
}
The key parts are:
# This reads the form state from the request, including reading all the inactive pages.
# This tests if all pages are valid and the user just clicked "Done" on the last page.
# This produces a "response", which might be writing to an object (for simpler forms) or creating a transaction record (for more complex forms).
# Here, we would save the object or apply the transactions.
# When the user views the form for the first time, we preload all the values from some object (which might just be empty).
Ultimate goal here is to fix repository creation to not be a terrible pit of awfulness.
There are probably a lot of rough edges and missing features still, but this seems to not be totally crazy.
I'm using two submit buttons with different names which doesn't work on IE7 or something, but we can JS our way out of that if we need to.
Test Plan: Paged forward and backward through the form.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2232
Differential Revision: https://secure.phabricator.com/D6003
2013-05-23 23:39:01 +02:00
|
|
|
'PHUIFormMultiSubmitControl' => 'AphrontFormControl',
|
|
|
|
'PHUIFormPageView' => 'AphrontView',
|
2015-03-30 15:18:54 +02:00
|
|
|
'PHUIHandleListView' => 'AphrontTagView',
|
2014-06-26 17:49:44 +02:00
|
|
|
'PHUIHandleTagListView' => 'AphrontTagView',
|
2015-03-30 15:18:54 +02:00
|
|
|
'PHUIHandleView' => 'AphrontView',
|
2016-02-26 23:34:51 +01:00
|
|
|
'PHUIHeadThingView' => 'AphrontTagView',
|
2015-05-12 15:55:46 +02:00
|
|
|
'PHUIHeaderView' => 'AphrontTagView',
|
2016-02-03 17:26:30 +01:00
|
|
|
'PHUIHovercardUIExample' => 'PhabricatorUIExample',
|
2016-02-05 05:11:36 +01:00
|
|
|
'PHUIHovercardView' => 'AphrontTagView',
|
2016-01-16 06:37:36 +01:00
|
|
|
'PHUIIconCircleView' => 'AphrontTagView',
|
2013-04-20 02:44:20 +02:00
|
|
|
'PHUIIconExample' => 'PhabricatorUIExample',
|
2013-04-22 18:49:06 +02:00
|
|
|
'PHUIIconView' => 'AphrontTagView',
|
2014-06-18 23:09:37 +02:00
|
|
|
'PHUIImageMaskExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIImageMaskView' => 'AphrontTagView',
|
2015-03-01 23:45:56 +01:00
|
|
|
'PHUIInfoExample' => 'PhabricatorUIExample',
|
2013-10-25 20:09:06 +02:00
|
|
|
'PHUIInfoPanelExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIInfoPanelView' => 'AphrontView',
|
2015-03-01 23:45:56 +01:00
|
|
|
'PHUIInfoView' => 'AphrontView',
|
2013-06-06 00:03:56 +02:00
|
|
|
'PHUIListExample' => 'PhabricatorUIExample',
|
2013-06-05 17:41:43 +02:00
|
|
|
'PHUIListItemView' => 'AphrontTagView',
|
|
|
|
'PHUIListView' => 'AphrontTagView',
|
|
|
|
'PHUIListViewTestCase' => 'PhabricatorTestCase',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PHUIMainMenuView' => 'AphrontView',
|
2016-02-17 21:43:38 +01:00
|
|
|
'PHUIObjectBoxView' => 'AphrontTagView',
|
2013-09-09 23:14:34 +02:00
|
|
|
'PHUIObjectItemListExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIObjectItemListView' => 'AphrontTagView',
|
|
|
|
'PHUIObjectItemView' => 'AphrontTagView',
|
2015-02-02 21:13:48 +01:00
|
|
|
'PHUIPagedFormView' => 'AphrontView',
|
2015-06-02 23:34:04 +02:00
|
|
|
'PHUIPagerView' => 'AphrontView',
|
2013-08-07 19:58:09 +02:00
|
|
|
'PHUIPinboardItemView' => 'AphrontView',
|
|
|
|
'PHUIPinboardView' => 'AphrontView',
|
2013-10-11 16:53:56 +02:00
|
|
|
'PHUIPropertyGroupView' => 'AphrontTagView',
|
|
|
|
'PHUIPropertyListExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIPropertyListView' => 'AphrontView',
|
2013-08-05 19:46:39 +02:00
|
|
|
'PHUIRemarkupPreviewPanel' => 'AphrontTagView',
|
2015-10-15 19:20:19 +02:00
|
|
|
'PHUIRemarkupView' => 'AphrontView',
|
2016-02-08 23:37:31 +01:00
|
|
|
'PHUISegmentBarSegmentView' => 'AphrontTagView',
|
|
|
|
'PHUISegmentBarView' => 'AphrontTagView',
|
2015-06-05 23:20:25 +02:00
|
|
|
'PHUISpacesNamespaceContextView' => 'AphrontView',
|
2013-07-24 23:13:22 +02:00
|
|
|
'PHUIStatusItemView' => 'AphrontTagView',
|
|
|
|
'PHUIStatusListView' => 'AphrontTagView',
|
2014-01-14 23:09:52 +01:00
|
|
|
'PHUITagExample' => 'PhabricatorUIExample',
|
2014-06-26 17:49:44 +02:00
|
|
|
'PHUITagView' => 'AphrontTagView',
|
2014-02-12 18:02:05 +01:00
|
|
|
'PHUITimelineEventView' => 'AphrontView',
|
|
|
|
'PHUITimelineExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUITimelineView' => 'AphrontView',
|
2015-08-10 23:55:43 +02:00
|
|
|
'PHUITwoColumnView' => 'AphrontTagView',
|
2015-04-17 16:00:43 +02:00
|
|
|
'PHUITypeaheadExample' => 'PhabricatorUIExample',
|
2014-01-13 21:24:36 +01:00
|
|
|
'PHUIWorkboardView' => 'AphrontTagView',
|
|
|
|
'PHUIWorkpanelView' => 'AphrontTagView',
|
2013-11-23 00:23:10 +01:00
|
|
|
'PassphraseAbstractKey' => 'Phobject',
|
2014-08-16 14:41:03 +02:00
|
|
|
'PassphraseConduitAPIMethod' => 'ConduitAPIMethod',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseController' => 'PhabricatorController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PassphraseCredential' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PassphraseDAO',
|
2014-12-03 22:16:15 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
2015-07-18 21:40:23 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
2015-08-05 20:59:38 +02:00
|
|
|
'PhabricatorSubscribableInterface',
|
2014-08-08 17:10:29 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
2015-06-22 20:28:54 +02:00
|
|
|
'PhabricatorSpacesInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2013-11-20 18:13:35 +01:00
|
|
|
),
|
2015-06-22 20:28:33 +02:00
|
|
|
'PassphraseCredentialAuthorPolicyRule' => 'PhabricatorPolicyRule',
|
2014-08-16 14:41:03 +02:00
|
|
|
'PassphraseCredentialConduitController' => 'PassphraseController',
|
2013-11-21 21:35:36 +01:00
|
|
|
'PassphraseCredentialControl' => 'AphrontFormControl',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseCredentialCreateController' => 'PassphraseController',
|
|
|
|
'PassphraseCredentialDestroyController' => 'PassphraseController',
|
|
|
|
'PassphraseCredentialEditController' => 'PassphraseController',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PassphraseCredentialFulltextEngine' => 'PhabricatorFulltextEngine',
|
2014-05-09 21:25:52 +02:00
|
|
|
'PassphraseCredentialListController' => 'PassphraseController',
|
2014-05-03 03:05:19 +02:00
|
|
|
'PassphraseCredentialLockController' => 'PassphraseController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PassphraseCredentialPHIDType' => 'PhabricatorPHIDType',
|
2014-03-13 02:58:25 +01:00
|
|
|
'PassphraseCredentialPublicController' => 'PassphraseController',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseCredentialQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PassphraseCredentialRevealController' => 'PassphraseController',
|
|
|
|
'PassphraseCredentialSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'PassphraseCredentialTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PassphraseCredentialTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PassphraseCredentialTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PassphraseCredentialType' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PassphraseCredentialTypeTestCase' => 'PhabricatorTestCase',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseCredentialViewController' => 'PassphraseController',
|
|
|
|
'PassphraseDAO' => 'PhabricatorLiskDAO',
|
2015-06-22 20:28:33 +02:00
|
|
|
'PassphraseDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'PassphraseDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2015-06-16 22:44:51 +02:00
|
|
|
'PassphraseNoteCredentialType' => 'PassphraseCredentialType',
|
2015-06-14 06:11:55 +02:00
|
|
|
'PassphrasePasswordCredentialType' => 'PassphraseCredentialType',
|
2013-11-23 00:23:10 +01:00
|
|
|
'PassphrasePasswordKey' => 'PassphraseAbstractKey',
|
2014-08-16 14:41:03 +02:00
|
|
|
'PassphraseQueryConduitAPIMethod' => 'PassphraseConduitAPIMethod',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PassphraseRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-06-14 06:11:55 +02:00
|
|
|
'PassphraseSSHGeneratedKeyCredentialType' => 'PassphraseSSHPrivateKeyCredentialType',
|
2013-11-23 00:23:10 +01:00
|
|
|
'PassphraseSSHKey' => 'PassphraseAbstractKey',
|
2015-06-14 06:11:55 +02:00
|
|
|
'PassphraseSSHPrivateKeyCredentialType' => 'PassphraseCredentialType',
|
|
|
|
'PassphraseSSHPrivateKeyFileCredentialType' => 'PassphraseSSHPrivateKeyCredentialType',
|
|
|
|
'PassphraseSSHPrivateKeyTextCredentialType' => 'PassphraseSSHPrivateKeyCredentialType',
|
2014-09-24 22:50:57 +02:00
|
|
|
'PassphraseSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-11-20 18:13:35 +01:00
|
|
|
'PassphraseSecret' => 'PassphraseDAO',
|
2015-10-15 03:34:55 +02:00
|
|
|
'PassphraseTokenCredentialType' => 'PassphraseCredentialType',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PasteConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'PasteCreateConduitAPIMethod' => 'PasteConduitAPIMethod',
|
2013-07-30 22:26:55 +02:00
|
|
|
'PasteCreateMailReceiver' => 'PhabricatorMailReceiver',
|
2014-12-31 17:23:47 +01:00
|
|
|
'PasteDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PasteDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PasteEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
2013-03-13 14:44:27 +01:00
|
|
|
'PasteEmbedView' => 'AphrontView',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PasteInfoConduitAPIMethod' => 'PasteConduitAPIMethod',
|
2015-04-01 17:39:21 +02:00
|
|
|
'PasteMailReceiver' => 'PhabricatorObjectMailReceiver',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PasteQueryConduitAPIMethod' => 'PasteConduitAPIMethod',
|
2015-04-01 17:39:21 +02:00
|
|
|
'PasteReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PasteSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PeopleBrowseUserDirectoryCapability' => 'PhabricatorPolicyCapability',
|
2015-01-13 00:18:16 +01:00
|
|
|
'PeopleCreateUsersCapability' => 'PhabricatorPolicyCapability',
|
2016-02-03 17:26:30 +01:00
|
|
|
'PeopleHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension',
|
2014-02-03 19:51:41 +01:00
|
|
|
'PeopleUserLogGarbageCollector' => 'PhabricatorGarbageCollector',
|
2011-01-30 01:16:09 +01:00
|
|
|
'Phabricator404Controller' => 'PhabricatorController',
|
2013-01-01 23:09:29 +01:00
|
|
|
'PhabricatorAWSConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-10-04 04:05:47 +02:00
|
|
|
'PhabricatorAccessControlTestCase' => 'PhabricatorTestCase',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorAccessLog' => 'Phobject',
|
2013-01-01 23:09:17 +01:00
|
|
|
'PhabricatorAccessLogConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorAccountSettingsPanel' => 'PhabricatorSettingsPanel',
|
2012-08-15 19:45:06 +02:00
|
|
|
'PhabricatorActionListView' => 'AphrontView',
|
|
|
|
'PhabricatorActionView' => 'AphrontView',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorActivitySettingsPanel' => 'PhabricatorSettingsPanel',
|
2015-01-03 13:48:19 +01:00
|
|
|
'PhabricatorAdministratorsPolicyRule' => 'PhabricatorPolicyRule',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorAjaxRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
|
2014-10-03 14:52:41 +02:00
|
|
|
'PhabricatorAlmanacApplication' => 'PhabricatorApplication',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorAmazonAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
2012-08-22 00:01:20 +02:00
|
|
|
'PhabricatorAnchorView' => 'AphrontView',
|
2014-06-05 21:13:44 +02:00
|
|
|
'PhabricatorAphlictManagementDebugWorkflow' => 'PhabricatorAphlictManagementWorkflow',
|
|
|
|
'PhabricatorAphlictManagementRestartWorkflow' => 'PhabricatorAphlictManagementWorkflow',
|
|
|
|
'PhabricatorAphlictManagementStartWorkflow' => 'PhabricatorAphlictManagementWorkflow',
|
|
|
|
'PhabricatorAphlictManagementStatusWorkflow' => 'PhabricatorAphlictManagementWorkflow',
|
|
|
|
'PhabricatorAphlictManagementStopWorkflow' => 'PhabricatorAphlictManagementWorkflow',
|
|
|
|
'PhabricatorAphlictManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorAphlictSetupCheck' => 'PhabricatorSetupCheck',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorAphrontBarUIExample' => 'PhabricatorUIExample',
|
Provide hasChildren() to replace isEmptyContent()
Summary:
Fixes T3698. Sometimes views need to render differently depending on whether they contain content or not. The existing approach for this is `isEmptyContent()`, which doesn't work well and is sort of hacky (it implies double-rendering content, which is not always free or side-effect free).
Instead, provide a test for an element without children. This test is powerful enough to catch the easy cases of `null`, etc., and just do the expected thing, but will not catch a View which is reduced upon rendering. Since this is rare and we have no actual need for it today, just accept that as a limitation.
Test Plan:
Viewed Timeline and Feed UI examples. Viewed Feed (feed), Pholio (timelineview), and Differential (old transactionview).
{F53915}
Reviewers: chad, btrahan
Reviewed By: chad
CC: aran
Maniphest Tasks: T3698
Differential Revision: https://secure.phabricator.com/D6718
2013-08-12 16:51:01 +02:00
|
|
|
'PhabricatorAphrontViewTestCase' => 'PhabricatorTestCase',
|
2013-10-02 22:13:07 +02:00
|
|
|
'PhabricatorAppSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorApplication' => array(
|
|
|
|
'Phobject',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorApplicationApplicationPHIDType' => 'PhabricatorPHIDType',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorApplicationConfigOptions' => 'Phobject',
|
2015-03-12 21:28:37 +01:00
|
|
|
'PhabricatorApplicationConfigurationPanel' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorApplicationConfigurationPanelTestCase' => 'PhabricatorTestCase',
|
2014-07-18 00:48:36 +02:00
|
|
|
'PhabricatorApplicationDatasource' => 'PhabricatorTypeaheadDatasource',
|
2013-01-24 21:13:31 +01:00
|
|
|
'PhabricatorApplicationDetailViewController' => 'PhabricatorApplicationsController',
|
2013-10-03 21:40:08 +02:00
|
|
|
'PhabricatorApplicationEditController' => 'PhabricatorApplicationsController',
|
2015-11-03 14:38:06 +01:00
|
|
|
'PhabricatorApplicationEditHTTPParameterHelpView' => 'AphrontView',
|
2015-04-01 16:36:16 +02:00
|
|
|
'PhabricatorApplicationEmailCommandsController' => 'PhabricatorApplicationsController',
|
2014-06-13 06:49:19 +02:00
|
|
|
'PhabricatorApplicationLaunchView' => 'AphrontTagView',
|
2015-03-12 21:28:37 +01:00
|
|
|
'PhabricatorApplicationPanelController' => 'PhabricatorApplicationsController',
|
2013-10-02 22:13:07 +02:00
|
|
|
'PhabricatorApplicationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-05-30 23:09:02 +02:00
|
|
|
'PhabricatorApplicationSearchController' => 'PhabricatorSearchBaseController',
|
2015-06-05 20:21:08 +02:00
|
|
|
'PhabricatorApplicationSearchEngine' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorApplicationSearchEngineTestCase' => 'PhabricatorTestCase',
|
2015-06-19 12:46:20 +02:00
|
|
|
'PhabricatorApplicationSearchResultView' => 'Phobject',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationStatusView' => 'AphrontView',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorApplicationTestCase' => 'PhabricatorTestCase',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorApplicationTransaction' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2012-12-11 23:00:21 +01:00
|
|
|
),
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorApplicationTransactionComment' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorMarkupInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2012-12-11 22:59:20 +01:00
|
|
|
),
|
2012-12-11 23:01:51 +01:00
|
|
|
'PhabricatorApplicationTransactionCommentEditController' => 'PhabricatorApplicationTransactionController',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionCommentEditor' => 'PhabricatorEditor',
|
2012-12-11 23:01:51 +01:00
|
|
|
'PhabricatorApplicationTransactionCommentHistoryController' => 'PhabricatorApplicationTransactionController',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionCommentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-05-05 19:55:58 +02:00
|
|
|
'PhabricatorApplicationTransactionCommentQuoteController' => 'PhabricatorApplicationTransactionController',
|
2014-08-08 00:21:32 +02:00
|
|
|
'PhabricatorApplicationTransactionCommentRawController' => 'PhabricatorApplicationTransactionController',
|
2014-05-05 19:55:32 +02:00
|
|
|
'PhabricatorApplicationTransactionCommentRemoveController' => 'PhabricatorApplicationTransactionController',
|
2012-12-21 14:51:33 +01:00
|
|
|
'PhabricatorApplicationTransactionCommentView' => 'AphrontView',
|
2012-12-11 23:01:51 +01:00
|
|
|
'PhabricatorApplicationTransactionController' => 'PhabricatorController',
|
2013-08-23 01:45:14 +02:00
|
|
|
'PhabricatorApplicationTransactionDetailController' => 'PhabricatorApplicationTransactionController',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionEditor' => 'PhabricatorEditor',
|
2012-12-11 23:00:21 +01:00
|
|
|
'PhabricatorApplicationTransactionFeedStory' => 'PhabricatorFeedStory',
|
Add ApplicationTransaction handling for transactions with no effect
Summary:
When a user submits an action with no effect (like an empty comment, an "abandon" on an already-accepted revision, or a "close, resolved" on a closed task) we want to alert them that their action isn't effective. These warnings fall into two general buckets:
- User is submitting two or more actions, and some aren't effective but some are. Prompt them to apply the effective actions only.
- A special case of this is where the only effective action is a comment. We provide tailored text ("Post Comment") in this case.
- User is submitting one action, which isn't effective. Tell them they're out of luck.
- A special case of this is an empty comment. We provide tailored text in this case.
By default, the transaction editor throws when transactions have no effect. The caller can then deal with this, or use `PhabricatorApplicationTransactionNoEffectResponse` to provide a standard dialog that gives the user information as above. For cases where we expect transactions to have no effect (notably, "edit" forms) we just continue on no-effect unconditionally.
Also fix an issue where new, combined or filtered transactions would not be represented properly in the Ajax response (i.e., return final transactions from `applyTransactions()`), and translate some strings.
Test Plan:
- Submitted empty and nonempy comments in Macro and Pholio.
- Submitted comments with new and existing "@mentions".
- Submitted edits in both applications.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T912, T2104
Differential Revision: https://secure.phabricator.com/D4160
2012-12-12 02:27:40 +01:00
|
|
|
'PhabricatorApplicationTransactionNoEffectException' => 'Exception',
|
|
|
|
'PhabricatorApplicationTransactionNoEffectResponse' => 'AphrontProxyResponse',
|
2015-06-02 02:16:27 +02:00
|
|
|
'PhabricatorApplicationTransactionPublishWorker' => 'PhabricatorWorker',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-12-22 20:32:07 +01:00
|
|
|
'PhabricatorApplicationTransactionRemarkupPreviewController' => 'PhabricatorApplicationTransactionController',
|
2015-04-01 17:39:21 +02:00
|
|
|
'PhabricatorApplicationTransactionReplyHandler' => 'PhabricatorMailReplyHandler',
|
2012-12-11 23:02:29 +01:00
|
|
|
'PhabricatorApplicationTransactionResponse' => 'AphrontProxyResponse',
|
2014-12-02 22:10:29 +01:00
|
|
|
'PhabricatorApplicationTransactionShowOlderController' => 'PhabricatorApplicationTransactionController',
|
2014-03-05 19:44:21 +01:00
|
|
|
'PhabricatorApplicationTransactionStructureException' => 'Exception',
|
2015-03-09 20:15:54 +01:00
|
|
|
'PhabricatorApplicationTransactionTemplatedCommentQuery' => 'PhabricatorApplicationTransactionCommentQuery',
|
2013-02-17 15:37:02 +01:00
|
|
|
'PhabricatorApplicationTransactionTextDiffDetailView' => 'AphrontView',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorApplicationTransactionTransactionPHIDType' => 'PhabricatorPHIDType',
|
2013-09-19 00:31:58 +02:00
|
|
|
'PhabricatorApplicationTransactionValidationError' => 'Phobject',
|
|
|
|
'PhabricatorApplicationTransactionValidationException' => 'Exception',
|
2015-01-20 22:59:17 +01:00
|
|
|
'PhabricatorApplicationTransactionValidationResponse' => 'AphrontProxyResponse',
|
2014-04-29 18:42:54 +02:00
|
|
|
'PhabricatorApplicationTransactionValueController' => 'PhabricatorApplicationTransactionController',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorApplicationTransactionView' => 'AphrontView',
|
2013-01-29 18:14:03 +01:00
|
|
|
'PhabricatorApplicationUninstallController' => 'PhabricatorApplicationsController',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorApplicationsApplication' => 'PhabricatorApplication',
|
2013-01-19 22:46:48 +01:00
|
|
|
'PhabricatorApplicationsController' => 'PhabricatorController',
|
2014-05-09 21:25:52 +02:00
|
|
|
'PhabricatorApplicationsListController' => 'PhabricatorApplicationsController',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorAsanaAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
Initial Asana sync for Differential
Summary:
Ref T2852. This is highly incomplete but seems structurally sound. Some additional context is available in the Google doc.
- Add a workspace ID configuration. Without it, nothing else activates.
- Add a worker which reacts to feed stories.
- Feed stories about things which aren't Differential objects are ignored.
- We load the revision, or fail permanently if we can't.
- We get all the related user PHIDs (author, reviewers, CCs).
- We check if any of them have linked Asana accounts, or fail permanently if they don't.
- We check for an "ASANATASK" edge from the revision.
- If we do not find one, we create a new task.
- If we do find one, we load the task.
- If we succeed, we check the chronological key of the most recent synchronized feed story ("cursor").
- If this story is the same or newer, we update the task to synchronize it to the current state of the revision.
- If we fail to load the task, we fail permanently ("asana task has been deleted").
- We then publish the actual story text to the task.
Not in yet:
- Updating followers requires separate API calls which we don't do yet.
- No subtasks yet.
- No sync of open/closed state.
Test Plan: {F47546}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2852
Differential Revision: https://secure.phabricator.com/D6302
2013-06-26 01:33:16 +02:00
|
|
|
'PhabricatorAsanaConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorAsanaSubtaskHasObjectEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorAsanaTaskHasObjectEdgeType' => 'PhabricatorEdgeType',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorAuditActionConstants' => 'Phobject',
|
2012-02-25 00:04:53 +01:00
|
|
|
'PhabricatorAuditAddCommentController' => 'PhabricatorAuditController',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorAuditApplication' => 'PhabricatorApplication',
|
2012-10-10 19:18:23 +02:00
|
|
|
'PhabricatorAuditCommentEditor' => 'PhabricatorEditor',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorAuditCommitStatusConstants' => 'Phobject',
|
Add Basic Auditing Functionalities
Summary:
add basic auditing functionalities. For the related commits for a
package, we detect the following conditions which might be suspicious to the
owners of the package:
* no revision specified
* revision not found
* author not match
* reviewedby not match
* owners not involved
* commit author not recognized
The owners of the package can change the status of the audit entries by
accepting it or specify concern.
The owner can turn on/off the auditing for a package.
Test Plan:
* verified that non-owner cannot see the details of the audit and cannot modify
it
* verified that all the audit reasons can be detected
* tested dropdown filtering and package search
* verified really normal change not detected
* verified accept/concern a commit
* tested enable/disable a package for auditing
* verified one audit applies to all <commit, packages> to the packages the
auditor owns
* verified that re-parsing a commit won't have effect if there exists a
relationship for <commit, package> already
Reviewers: epriestley, nh
Reviewed By: epriestley
CC: aran, benmathews, btrahan, mpodobnik, prithvi, TomL, epriestley
Differential Revision: 1242
2011-12-18 00:52:54 +01:00
|
|
|
'PhabricatorAuditController' => 'PhabricatorController',
|
2014-08-02 09:06:25 +02:00
|
|
|
'PhabricatorAuditEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorAuditInlineComment' => array(
|
|
|
|
'Phobject',
|
|
|
|
'PhabricatorInlineCommentInterface',
|
|
|
|
),
|
2014-05-08 18:18:02 +02:00
|
|
|
'PhabricatorAuditListController' => 'PhabricatorAuditController',
|
2012-02-24 22:02:14 +01:00
|
|
|
'PhabricatorAuditListView' => 'AphrontView',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorAuditMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2013-08-05 19:35:01 +02:00
|
|
|
'PhabricatorAuditManagementDeleteWorkflow' => 'PhabricatorAuditManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorAuditManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2012-02-27 22:00:23 +01:00
|
|
|
'PhabricatorAuditPreviewController' => 'PhabricatorAuditController',
|
2015-04-01 17:39:50 +02:00
|
|
|
'PhabricatorAuditReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorAuditStatusConstants' => 'Phobject',
|
2014-07-25 02:59:43 +02:00
|
|
|
'PhabricatorAuditTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorAuditTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'PhabricatorAuditTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-07-29 00:01:43 +02:00
|
|
|
'PhabricatorAuditTransactionView' => 'PhabricatorApplicationTransactionView',
|
2013-06-17 16:08:50 +02:00
|
|
|
'PhabricatorAuthAccountView' => 'AphrontView',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorAuthApplication' => 'PhabricatorApplication',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorAuthAuthFactorPHIDType' => 'PhabricatorPHIDType',
|
Transactions - deploy buildTransactionTimeline against a few more applications
Summary:
Ref T4712. Thus far, it seems that most "non-standard" things can be done pretty easily in the controller. Aside from deploying, this diff had to fix a few bugs / missing implementations of stuff.
(Notably, PhabricatorAuthProviderConfig, HeraldRule, PhabricatorSlowvotePoll, and AlmanacNetwork needed to implement PhabricatorApplicationTransactionInterface, PhabricatorAuthAuthProviderPHIDType had to be added, and a rendering bug in transactions of type PhabricatorOAuth2AuthProvider had to be fixed.)
Test Plan: Almanac - looked at binding, device, network, and service view controllers and verified timeline displayed properly. Herald - looked at a rule and verified timeline. Slowvote - looked at a vote and verified timeline. Auth - looked at an auth provider (Facebook) and verified proper display of transactions within timeline.
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10921
2014-12-02 23:33:59 +01:00
|
|
|
'PhabricatorAuthAuthProviderPHIDType' => 'PhabricatorPHIDType',
|
2015-02-11 00:44:21 +01:00
|
|
|
'PhabricatorAuthConduitAPIMethod' => 'ConduitAPIMethod',
|
2013-06-17 15:12:45 +02:00
|
|
|
'PhabricatorAuthConfirmLinkController' => 'PhabricatorAuthController',
|
2011-01-26 22:21:12 +01:00
|
|
|
'PhabricatorAuthController' => 'PhabricatorController',
|
2013-06-17 19:48:41 +02:00
|
|
|
'PhabricatorAuthDAO' => 'PhabricatorLiskDAO',
|
2013-06-17 19:54:08 +02:00
|
|
|
'PhabricatorAuthDisableController' => 'PhabricatorAuthProviderConfigController',
|
2014-04-28 02:31:11 +02:00
|
|
|
'PhabricatorAuthDowngradeSessionController' => 'PhabricatorAuthController',
|
2013-06-17 19:52:38 +02:00
|
|
|
'PhabricatorAuthEditController' => 'PhabricatorAuthProviderConfigController',
|
2014-04-28 18:27:11 +02:00
|
|
|
'PhabricatorAuthFactor' => 'Phobject',
|
|
|
|
'PhabricatorAuthFactorConfig' => 'PhabricatorAuthDAO',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorAuthFactorTestCase' => 'PhabricatorTestCase',
|
2014-05-01 19:23:02 +02:00
|
|
|
'PhabricatorAuthFinishController' => 'PhabricatorAuthController',
|
2014-04-28 02:31:11 +02:00
|
|
|
'PhabricatorAuthHighSecurityRequiredException' => 'Exception',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorAuthHighSecurityToken' => 'Phobject',
|
2015-02-11 15:05:53 +01:00
|
|
|
'PhabricatorAuthInvite' => array(
|
|
|
|
'PhabricatorUserDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
Add email invites to Phabricator (logic only)
Summary:
Ref T7152. This builds the core of email invites and implements all the hard logic for them, covering it with a pile of tests.
There's no UI to create these yet, so users can't actually get invites (and administrators can't send them).
This stuff is a complicated mess because there are so many interactions between accounts, email addresses, email verification, email primary-ness, and user verification. However, I think I got it right and got test coverage everwhere.
The degree to which this is exception-driven is a little icky, but I think it's a reasonable way to get the testability we want while still making it hard for callers to get the flow wrong. In particular, I expect there to be at least two callers (one invite flow in the upstream, and one derived invite flow in Instances) so I believe there is merit in burying as much of this logic inside the Engine as is reasonably possible.
Test Plan: Unit tests only.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T7152
Differential Revision: https://secure.phabricator.com/D11723
2015-02-10 01:12:36 +01:00
|
|
|
'PhabricatorAuthInviteAccountException' => 'PhabricatorAuthInviteDialogException',
|
2015-02-11 15:05:53 +01:00
|
|
|
'PhabricatorAuthInviteAction' => 'Phobject',
|
|
|
|
'PhabricatorAuthInviteActionTableView' => 'AphrontView',
|
Add email invites to Phabricator (logic only)
Summary:
Ref T7152. This builds the core of email invites and implements all the hard logic for them, covering it with a pile of tests.
There's no UI to create these yet, so users can't actually get invites (and administrators can't send them).
This stuff is a complicated mess because there are so many interactions between accounts, email addresses, email verification, email primary-ness, and user verification. However, I think I got it right and got test coverage everwhere.
The degree to which this is exception-driven is a little icky, but I think it's a reasonable way to get the testability we want while still making it hard for callers to get the flow wrong. In particular, I expect there to be at least two callers (one invite flow in the upstream, and one derived invite flow in Instances) so I believe there is merit in burying as much of this logic inside the Engine as is reasonably possible.
Test Plan: Unit tests only.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T7152
Differential Revision: https://secure.phabricator.com/D11723
2015-02-10 01:12:36 +01:00
|
|
|
'PhabricatorAuthInviteController' => 'PhabricatorAuthController',
|
|
|
|
'PhabricatorAuthInviteDialogException' => 'PhabricatorAuthInviteException',
|
|
|
|
'PhabricatorAuthInviteEngine' => 'Phobject',
|
|
|
|
'PhabricatorAuthInviteException' => 'Exception',
|
|
|
|
'PhabricatorAuthInviteInvalidException' => 'PhabricatorAuthInviteDialogException',
|
|
|
|
'PhabricatorAuthInviteLoginException' => 'PhabricatorAuthInviteDialogException',
|
2015-02-11 15:05:53 +01:00
|
|
|
'PhabricatorAuthInvitePHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorAuthInviteQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
Add email invites to Phabricator (logic only)
Summary:
Ref T7152. This builds the core of email invites and implements all the hard logic for them, covering it with a pile of tests.
There's no UI to create these yet, so users can't actually get invites (and administrators can't send them).
This stuff is a complicated mess because there are so many interactions between accounts, email addresses, email verification, email primary-ness, and user verification. However, I think I got it right and got test coverage everwhere.
The degree to which this is exception-driven is a little icky, but I think it's a reasonable way to get the testability we want while still making it hard for callers to get the flow wrong. In particular, I expect there to be at least two callers (one invite flow in the upstream, and one derived invite flow in Instances) so I believe there is merit in burying as much of this logic inside the Engine as is reasonably possible.
Test Plan: Unit tests only.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T7152
Differential Revision: https://secure.phabricator.com/D11723
2015-02-10 01:12:36 +01:00
|
|
|
'PhabricatorAuthInviteRegisteredException' => 'PhabricatorAuthInviteException',
|
2015-02-11 15:05:53 +01:00
|
|
|
'PhabricatorAuthInviteSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
Add email invites to Phabricator (logic only)
Summary:
Ref T7152. This builds the core of email invites and implements all the hard logic for them, covering it with a pile of tests.
There's no UI to create these yet, so users can't actually get invites (and administrators can't send them).
This stuff is a complicated mess because there are so many interactions between accounts, email addresses, email verification, email primary-ness, and user verification. However, I think I got it right and got test coverage everwhere.
The degree to which this is exception-driven is a little icky, but I think it's a reasonable way to get the testability we want while still making it hard for callers to get the flow wrong. In particular, I expect there to be at least two callers (one invite flow in the upstream, and one derived invite flow in Instances) so I believe there is merit in burying as much of this logic inside the Engine as is reasonably possible.
Test Plan: Unit tests only.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T7152
Differential Revision: https://secure.phabricator.com/D11723
2015-02-10 01:12:36 +01:00
|
|
|
'PhabricatorAuthInviteTestCase' => 'PhabricatorTestCase',
|
|
|
|
'PhabricatorAuthInviteVerifyException' => 'PhabricatorAuthInviteDialogException',
|
2015-02-11 15:06:09 +01:00
|
|
|
'PhabricatorAuthInviteWorker' => 'PhabricatorWorker',
|
2013-06-17 15:12:45 +02:00
|
|
|
'PhabricatorAuthLinkController' => 'PhabricatorAuthController',
|
2013-06-20 00:00:37 +02:00
|
|
|
'PhabricatorAuthListController' => 'PhabricatorAuthProviderConfigController',
|
2013-06-16 19:14:07 +02:00
|
|
|
'PhabricatorAuthLoginController' => 'PhabricatorAuthController',
|
2015-09-04 19:34:39 +02:00
|
|
|
'PhabricatorAuthLoginHandler' => 'Phobject',
|
Implement "auth.logout" Conduit API method
Summary:
Ref T7303. Ref T7673. This implements an "auth.logout" which:
- terminates all web sessions;
- terminates the current OAuth token if called via OAuth; and
- may always be called via OAuth.
(Since it consumes an OAuth token, even a "malicious" OAuth application can't really be that much of a jerk with this: it can't continuously log you out, since calling the method once kills the token. The application would need to ask your permission again to get a fresh token.)
The primary goal here is to let Phacility instances call this against the Phacility upstream, so that when you log out of an instance it also logs you out of your Phacility account (possibly with a checkbox or something).
This also smooths over the session token code. Before this change, your sessions would get logged out but when you reloaded we'd tell you your session was invalid.
Instead, try to clear the invalid session before telling the user there's an issue. I think that ssentially 100% of invalid sessions are a result of something in this vein (e.g., forced logout via Settings) nowadays, since the session code is generally stable and sane and has been for a long time.
Test Plan:
- Called `auth.logout` via console, got a reasonable logout experience.
- Called `auth.logout` via OAuth.
- Tried to make another call, verified OAuth token had been invalidated.
- Verified web session had been invalidated.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T7303, T7673
Differential Revision: https://secure.phabricator.com/D15594
2016-04-03 18:06:26 +02:00
|
|
|
'PhabricatorAuthLogoutConduitAPIMethod' => 'PhabricatorAuthConduitAPIMethod',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PhabricatorAuthMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension',
|
Work around lack of PKCS8 support in OSX ssh-keygen
Summary:
Ref T4209. Ref T6240. Ref T6238. See D10401 for original discussion.
On OSX, `ssh-keygen` doesn't support PKCS8:
- When we hit an issue with this, raise a more tailored message about it.
- Allow the user to work around the problem with `auth cache-pkcs8 ...`, providing reasonable guidance / warnings.
In practice, this only really matters very much for one key, which I'm just going to make the services extension cache automatically. So it's sort of moot, but good to have around for weird cases and to make testing easier.
Test Plan: Hit error, cached key, got clean asymmetric auth.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T4209, T6240, T6238
Differential Revision: https://secure.phabricator.com/D11021
2014-12-20 01:36:40 +01:00
|
|
|
'PhabricatorAuthManagementCachePKCS8Workflow' => 'PhabricatorAuthManagementWorkflow',
|
2013-06-17 22:26:25 +02:00
|
|
|
'PhabricatorAuthManagementLDAPWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2014-04-30 23:30:00 +02:00
|
|
|
'PhabricatorAuthManagementListFactorsWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2013-06-17 19:55:05 +02:00
|
|
|
'PhabricatorAuthManagementRecoverWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2013-06-25 00:55:41 +02:00
|
|
|
'PhabricatorAuthManagementRefreshWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2014-04-30 23:30:00 +02:00
|
|
|
'PhabricatorAuthManagementStripWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2015-02-09 23:23:49 +01:00
|
|
|
'PhabricatorAuthManagementTrustOAuthClientWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2015-09-14 16:03:39 +02:00
|
|
|
'PhabricatorAuthManagementUnlimitWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2015-02-09 23:23:49 +01:00
|
|
|
'PhabricatorAuthManagementUntrustOAuthClientWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2015-02-11 23:39:06 +01:00
|
|
|
'PhabricatorAuthManagementVerifyWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorAuthManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2013-11-13 20:24:18 +01:00
|
|
|
'PhabricatorAuthNeedsApprovalController' => 'PhabricatorAuthController',
|
2014-06-04 01:50:27 +02:00
|
|
|
'PhabricatorAuthNeedsMultiFactorController' => 'PhabricatorAuthController',
|
2013-06-17 19:51:35 +02:00
|
|
|
'PhabricatorAuthNewController' => 'PhabricatorAuthProviderConfigController',
|
2013-06-19 10:33:27 +02:00
|
|
|
'PhabricatorAuthOldOAuthRedirectController' => 'PhabricatorAuthController',
|
Make password reset emails use one-time tokens
Summary:
Ref T4398. This code hadn't been touched in a while and had a few crufty bits.
**One Time Resets**: Currently, password reset (and similar links) are valid for about 48 hours, but we always use one token to generate them (it's bound to the account). This isn't horrible, but it could be better, and it produces a lot of false positives on HackerOne.
Instead, use TemporaryTokens to make each link one-time only and good for no more than 24 hours.
**Coupling of Email Verification and One-Time Login**: Currently, one-time login links ("password reset links") are tightly bound to an email address, and using a link verifies that email address.
This is convenient for "Welcome" emails, so the user doesn't need to go through two rounds of checking email in order to login, then very their email, then actually get access to Phabricator.
However, for other types of these links (like those generated by `bin/auth recover`) there's no need to do any email verification.
Instead, make the email verification part optional, and use it on welcome links but not other types of links.
**Message Customization**: These links can come out of several workflows: welcome, password reset, username change, or `bin/auth recover`. Add a hint to the URI so the text on the page can be customized a bit to help users through the workflow.
**Reset Emails Going to Main Account Email**: Previously, we would send password reset email to the user's primary account email. However, since we verify email coming from reset links this isn't correct and could allow a user to verify an email without actually controlling it.
Since the user needs a real account in the first place this does not seem useful on its own, but might be a component in some other attack. The user might also no longer have access to their primary account, in which case this wouldn't be wrong, but would not be very useful.
Mitigate this in two ways:
- First, send to the actual email address the user entered, not the primary account email address.
- Second, don't let these links verify emails: they're just login links. This primarily makes it more difficult for an attacker to add someone else's email to their account, send them a reset link, get them to login and implicitly verify the email by not reading very carefully, and then figure out something interesting to do (there's currently no followup attack here, but allowing this does seem undesirable).
**Password Reset Without Old Password**: After a user logs in via email, we send them to the password settings panel (if passwords are enabled) with a code that lets them set a new password without knowing the old one.
Previously, this code was static and based on the email address. Instead, issue a one-time code.
**Jump Into Hisec**: Normally, when a user who has multi-factor auth on their account logs in, we prompt them for factors but don't put them in high security. You usually don't want to go do high-security stuff immediately after login, and it would be confusing and annoying if normal logins gave you a "YOU ARE IN HIGH SECURITY" alert bubble.
However, if we're taking you to the password reset screen, we //do// want to put the user in high security, since that screen requires high security. If we don't do this, the user gets two factor prompts in a row.
To accomplish this, we set a cookie when we know we're sending the user into a high security workflow. This cookie makes login finalization upgrade all the way from "partial" to "high security", instead of stopping halfway at "normal". This is safe because the user has just passed a factor check; the only reason we don't normally do this is to reduce annoyance.
**Some UI Cleanup**: Some of this was using really old UI. Modernize it a bit.
Test Plan:
- **One Time Resets**
- Used a reset link.
- Tried to reuse a reset link, got denied.
- Verified each link is different.
- **Coupling of Email Verification and One-Time Login**
- Verified that `bin/auth`, password reset, and username change links do not have an email verifying URI component.
- Tried to tack one on, got denied.
- Used the welcome email link to login + verify.
- Tried to mutate the URI to not verify, or verify something else: got denied.
- **Message Customization**
- Viewed messages on the different workflows. They seemed OK.
- **Reset Emails Going to Main Account Email**
- Sent password reset email to non-primary email.
- Received email at specified address.
- Verified it does not verify the address.
- **Password Reset Without Old Password**
- Reset password without knowledge of old one after email reset.
- Tried to do that without a key, got denied.
- Tried to reuse a key, got denied.
- **Jump Into Hisec**
- Logged in with MFA user, got factor'd, jumped directly into hisec.
- Logged in with non-MFA user, no factors, normal password reset.
- **Some UI Cleanup**
- Viewed new UI.
- **Misc**
- Created accounts, logged in with welcome link, got verified.
- Changed a username, used link to log back in.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T4398
Differential Revision: https://secure.phabricator.com/D9252
2014-05-22 19:41:00 +02:00
|
|
|
'PhabricatorAuthOneTimeLoginController' => 'PhabricatorAuthController',
|
2016-03-16 13:17:41 +01:00
|
|
|
'PhabricatorAuthOneTimeLoginTemporaryTokenType' => 'PhabricatorAuthTemporaryTokenType',
|
|
|
|
'PhabricatorAuthPasswordResetTemporaryTokenType' => 'PhabricatorAuthTemporaryTokenType',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorAuthProvider' => 'Phobject',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorAuthProviderConfig' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorAuthDAO',
|
Transactions - deploy buildTransactionTimeline against a few more applications
Summary:
Ref T4712. Thus far, it seems that most "non-standard" things can be done pretty easily in the controller. Aside from deploying, this diff had to fix a few bugs / missing implementations of stuff.
(Notably, PhabricatorAuthProviderConfig, HeraldRule, PhabricatorSlowvotePoll, and AlmanacNetwork needed to implement PhabricatorApplicationTransactionInterface, PhabricatorAuthAuthProviderPHIDType had to be added, and a rendering bug in transactions of type PhabricatorOAuth2AuthProvider had to be fixed.)
Test Plan: Almanac - looked at binding, device, network, and service view controllers and verified timeline displayed properly. Herald - looked at a rule and verified timeline. Slowvote - looked at a vote and verified timeline. Auth - looked at an auth provider (Facebook) and verified proper display of transactions within timeline.
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10921
2014-12-02 23:33:59 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
2013-06-17 19:49:18 +02:00
|
|
|
),
|
2013-06-17 19:50:43 +02:00
|
|
|
'PhabricatorAuthProviderConfigController' => 'PhabricatorAuthController',
|
2013-06-17 19:52:38 +02:00
|
|
|
'PhabricatorAuthProviderConfigEditor' => 'PhabricatorApplicationTransactionEditor',
|
2013-06-17 19:49:18 +02:00
|
|
|
'PhabricatorAuthProviderConfigQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-06-17 19:48:41 +02:00
|
|
|
'PhabricatorAuthProviderConfigTransaction' => 'PhabricatorApplicationTransaction',
|
2013-06-17 19:49:18 +02:00
|
|
|
'PhabricatorAuthProviderConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-02-11 00:44:21 +01:00
|
|
|
'PhabricatorAuthQueryPublicKeysConduitAPIMethod' => 'PhabricatorAuthConduitAPIMethod',
|
New Registration Workflow
Summary:
Currently, registration and authentication are pretty messy. Two concrete problems:
- The `PhabricatorLDAPRegistrationController` and `PhabricatorOAuthDefaultRegistrationController` controllers are giant copy/pastes of one another. This is really bad.
- We can't practically implement OpenID because we can't reissue the authentication request.
Additionally, the OAuth registration controller can be replaced wholesale by config, which is a huge API surface area and a giant mess.
Broadly, the problem right now is that registration does too much: we hand it some set of indirect credentials (like OAuth tokens) and expect it to take those the entire way to a registered user. Instead, break registration into smaller steps:
- User authenticates with remote service.
- Phabricator pulls information (remote account ID, username, email, real name, profile picture, etc) from the remote service and saves it as `PhabricatorUserCredentials`.
- Phabricator hands the `PhabricatorUserCredentials` to the registration form, which is agnostic about where they originate from: it can process LDAP credentials, OAuth credentials, plain old email credentials, HTTP basic auth credentials, etc.
This doesn't do anything yet -- there is no way to create credentials objects (and no storage patch), but I wanted to get any initial feedback, especially about the event call for T2394. In particular, I think the implementation would look something like this:
$profile = $event->getValue('profile')
$username = $profile->getDefaultUsername();
$is_employee = is_this_a_facebook_employee($username);
if (!$is_employee) {
throw new Exception("You are not employed at Facebook.");
}
$fbid = get_fbid_for_facebook_username($username);
$profile->setDefaultEmail($fbid);
$profile->setCanEditUsername(false);
$profile->setCanEditEmail(false);
$profile->setCanEditRealName(false);
$profile->setShouldVerifyEmail(true);
Seem reasonable?
Test Plan: N/A yet, probably fatals.
Reviewers: vrana, btrahan, codeblock, chad
Reviewed By: btrahan
CC: aran, asherkin, nh, wez
Maniphest Tasks: T1536, T2394
Differential Revision: https://secure.phabricator.com/D4647
2013-06-16 19:13:49 +02:00
|
|
|
'PhabricatorAuthRegisterController' => 'PhabricatorAuthController',
|
2014-08-04 21:04:13 +02:00
|
|
|
'PhabricatorAuthRevokeTokenController' => 'PhabricatorAuthController',
|
2014-11-06 21:37:22 +01:00
|
|
|
'PhabricatorAuthSSHKey' => array(
|
|
|
|
'PhabricatorAuthDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-12-19 20:48:24 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2014-11-06 21:37:22 +01:00
|
|
|
),
|
2014-11-11 17:18:26 +01:00
|
|
|
'PhabricatorAuthSSHKeyController' => 'PhabricatorAuthController',
|
|
|
|
'PhabricatorAuthSSHKeyDeleteController' => 'PhabricatorAuthSSHKeyController',
|
|
|
|
'PhabricatorAuthSSHKeyEditController' => 'PhabricatorAuthSSHKeyController',
|
|
|
|
'PhabricatorAuthSSHKeyGenerateController' => 'PhabricatorAuthSSHKeyController',
|
2015-12-19 20:55:59 +01:00
|
|
|
'PhabricatorAuthSSHKeyPHIDType' => 'PhabricatorPHIDType',
|
Add a query/policy layer on top of SSH keys for Almanac
Summary:
Ref T5833. Currently, SSH keys are associated only with users, and are a bit un-modern. I want to let Almanac Devices have SSH keys so devices in a cluster can identify to one another.
For example, with hosted installs, initialization will go something like this:
- A request comes in for `company.phacility.com`.
- A SiteSource (from D10787) makes a Conduit call to Almanac on the master install to check if `company` is a valid install and pull config if it is.
- This call can be signed with an SSH key which identifies a trusted Almanac Device.
In the cluster case, a web host can make an authenticated call to a repository host with similar key signing.
To move toward this, put a proper Query class on top of SSH key access (this diff). In following diffs, I'll:
- Rename `userPHID` to `objectPHID`.
- Move this to the `auth` database.
- Provide UI for device/key association.
An alternative approach would be to build some kind of special token layer in Conduit, but I think that would be a lot harder to manage in the hosting case. This gives us a more direct attack on trusting requests from machines and recognizing machines as first (well, sort of second-class) actors without needing things like fake user accounts.
Test Plan:
- Added and removed SSH keys.
- Added and removed SSH keys from a bot account.
- Tried to edit an unonwned SSH key (denied).
- Ran `bin/ssh-auth`, got sensible output.
- Ran `bin/ssh-auth-key`, got sensible output.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10790
2014-11-06 21:37:02 +01:00
|
|
|
'PhabricatorAuthSSHKeyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-11-11 17:20:08 +01:00
|
|
|
'PhabricatorAuthSSHKeyTableView' => 'AphrontView',
|
Add a query/policy layer on top of SSH keys for Almanac
Summary:
Ref T5833. Currently, SSH keys are associated only with users, and are a bit un-modern. I want to let Almanac Devices have SSH keys so devices in a cluster can identify to one another.
For example, with hosted installs, initialization will go something like this:
- A request comes in for `company.phacility.com`.
- A SiteSource (from D10787) makes a Conduit call to Almanac on the master install to check if `company` is a valid install and pull config if it is.
- This call can be signed with an SSH key which identifies a trusted Almanac Device.
In the cluster case, a web host can make an authenticated call to a repository host with similar key signing.
To move toward this, put a proper Query class on top of SSH key access (this diff). In following diffs, I'll:
- Rename `userPHID` to `objectPHID`.
- Move this to the `auth` database.
- Provide UI for device/key association.
An alternative approach would be to build some kind of special token layer in Conduit, but I think that would be a lot harder to manage in the hosting case. This gives us a more direct attack on trusting requests from machines and recognizing machines as first (well, sort of second-class) actors without needing things like fake user accounts.
Test Plan:
- Added and removed SSH keys.
- Added and removed SSH keys from a bot account.
- Tried to edit an unonwned SSH key (denied).
- Ran `bin/ssh-auth`, got sensible output.
- Ran `bin/ssh-auth-key`, got sensible output.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5833
Differential Revision: https://secure.phabricator.com/D10790
2014-11-06 21:37:02 +01:00
|
|
|
'PhabricatorAuthSSHPublicKey' => 'Phobject',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorAuthSession' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorAuthDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-01-14 20:05:45 +01:00
|
|
|
),
|
2014-01-14 22:22:27 +01:00
|
|
|
'PhabricatorAuthSessionEngine' => 'Phobject',
|
2016-04-03 19:04:10 +02:00
|
|
|
'PhabricatorAuthSessionEngineExtension' => 'Phobject',
|
|
|
|
'PhabricatorAuthSessionEngineExtensionModule' => 'PhabricatorConfigModule',
|
2014-01-15 22:56:16 +01:00
|
|
|
'PhabricatorAuthSessionGarbageCollector' => 'PhabricatorGarbageCollector',
|
2014-01-14 20:05:45 +01:00
|
|
|
'PhabricatorAuthSessionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorAuthSetupCheck' => 'PhabricatorSetupCheck',
|
2013-06-16 19:15:16 +02:00
|
|
|
'PhabricatorAuthStartController' => 'PhabricatorAuthController',
|
2016-03-16 14:17:31 +01:00
|
|
|
'PhabricatorAuthTOTPKeyTemporaryTokenType' => 'PhabricatorAuthTemporaryTokenType',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorAuthTemporaryToken' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorAuthDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
Add "temporary tokens" to auth, for SMS codes, TOTP codes, reset codes, etc
Summary:
Ref T4398. We have several auth-related systems which require (or are improved by) the ability to hand out one-time codes which expire after a short period of time.
In particular, these are:
- SMS multi-factor: we need to be able to hand out one-time codes for this in order to prove the user has the phone.
- Password reset emails: we use a time-based rotating token right now, but we could improve this with a one-time token, so once you reset your password the link is dead.
- TOTP auth: we don't need to verify/invalidate keys, but can improve security by doing so.
This adds a generic one-time code storage table, and strengthens the TOTP enrollment process by using it. Specifically, you can no longer edit the enrollment form (the one with a QR code) to force your own key as the TOTP key: only keys Phabricator generated are accepted. This has no practical security impact, but generally helps raise the barrier potential attackers face.
Followup changes will use this for reset emails, then implement SMS multi-factor.
Test Plan:
- Enrolled in TOTP multi-factor auth.
- Submitted an error in the form, saw the same key presented.
- Edited the form with web tools to provide a different key, saw it reject and the server generate an alternate.
- Change the expiration to 5 seconds instead of 1 hour, submitted the form over and over again, saw it cycle the key after 5 seconds.
- Looked at the database and saw the tokens I expected.
- Ran the GC and saw all the 5-second expiry tokens get cleaned up.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T4398
Differential Revision: https://secure.phabricator.com/D9217
2014-05-20 20:43:45 +02:00
|
|
|
),
|
|
|
|
'PhabricatorAuthTemporaryTokenGarbageCollector' => 'PhabricatorGarbageCollector',
|
|
|
|
'PhabricatorAuthTemporaryTokenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2016-03-16 13:17:41 +01:00
|
|
|
'PhabricatorAuthTemporaryTokenType' => 'Phobject',
|
2016-03-16 14:17:31 +01:00
|
|
|
'PhabricatorAuthTemporaryTokenTypeModule' => 'PhabricatorConfigModule',
|
2014-03-17 23:02:01 +01:00
|
|
|
'PhabricatorAuthTerminateSessionController' => 'PhabricatorAuthController',
|
2014-04-30 23:30:31 +02:00
|
|
|
'PhabricatorAuthTryFactorAction' => 'PhabricatorSystemAction',
|
2013-06-17 15:12:45 +02:00
|
|
|
'PhabricatorAuthUnlinkController' => 'PhabricatorAuthController',
|
2013-06-16 19:15:33 +02:00
|
|
|
'PhabricatorAuthValidateController' => 'PhabricatorAuthController',
|
2013-01-07 21:48:39 +01:00
|
|
|
'PhabricatorAuthenticationConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2014-05-23 00:19:28 +02:00
|
|
|
'PhabricatorAutoEventListener' => 'PhabricatorEventListener',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgeHasRecipientEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorBadgesApplication' => 'PhabricatorApplication',
|
2015-12-09 22:26:26 +01:00
|
|
|
'PhabricatorBadgesArchiveController' => 'PhabricatorBadgesController',
|
2016-01-13 20:33:46 +01:00
|
|
|
'PhabricatorBadgesAward' => array(
|
|
|
|
'PhabricatorBadgesDAO',
|
|
|
|
'PhabricatorDestructibleInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2016-03-31 22:39:06 +02:00
|
|
|
'PhabricatorBadgesAwardController' => 'PhabricatorBadgesController',
|
2016-01-13 20:33:46 +01:00
|
|
|
'PhabricatorBadgesAwardQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesBadge' => array(
|
|
|
|
'PhabricatorBadgesDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
2015-07-28 16:57:15 +02:00
|
|
|
'PhabricatorTokenReceiverInterface',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2016-04-05 20:21:44 +02:00
|
|
|
'PhabricatorConduitResultInterface',
|
2016-04-07 21:12:34 +02:00
|
|
|
'PhabricatorNgramsInterface',
|
2015-07-22 22:37:20 +02:00
|
|
|
),
|
2016-04-07 21:12:34 +02:00
|
|
|
'PhabricatorBadgesBadgeNameNgrams' => 'PhabricatorSearchNgrams',
|
2015-07-24 19:56:08 +02:00
|
|
|
'PhabricatorBadgesCommentController' => 'PhabricatorBadgesController',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesController' => 'PhabricatorController',
|
|
|
|
'PhabricatorBadgesCreateCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'PhabricatorBadgesDAO' => 'PhabricatorLiskDAO',
|
2016-04-09 20:40:02 +02:00
|
|
|
'PhabricatorBadgesDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
2016-04-05 20:21:44 +02:00
|
|
|
'PhabricatorBadgesEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
2016-01-06 22:13:52 +01:00
|
|
|
'PhabricatorBadgesEditController' => 'PhabricatorBadgesController',
|
2016-01-01 17:12:13 +01:00
|
|
|
'PhabricatorBadgesEditEngine' => 'PhabricatorEditEngine',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesEditRecipientsController' => 'PhabricatorBadgesController',
|
|
|
|
'PhabricatorBadgesEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorBadgesIconSet' => 'PhabricatorIconSet',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesListController' => 'PhabricatorBadgesController',
|
2015-07-25 22:34:43 +02:00
|
|
|
'PhabricatorBadgesMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesPHIDType' => 'PhabricatorPHIDType',
|
2016-03-31 02:07:27 +02:00
|
|
|
'PhabricatorBadgesQuality' => 'Phobject',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2016-03-02 20:05:26 +01:00
|
|
|
'PhabricatorBadgesRecipientsListView' => 'AphrontView',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesRemoveRecipientsController' => 'PhabricatorBadgesController',
|
2015-07-25 22:34:43 +02:00
|
|
|
'PhabricatorBadgesReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2016-04-05 20:21:44 +02:00
|
|
|
'PhabricatorBadgesSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'PhabricatorBadgesTransaction' => 'PhabricatorApplicationTransaction',
|
2015-07-24 19:56:08 +02:00
|
|
|
'PhabricatorBadgesTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorBadgesTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PhabricatorBadgesViewController' => 'PhabricatorBadgesController',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorBarePageUIExample' => 'PhabricatorUIExample',
|
2012-10-16 19:33:47 +02:00
|
|
|
'PhabricatorBarePageView' => 'AphrontPageView',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorBaseURISetupCheck' => 'PhabricatorSetupCheck',
|
2014-02-18 20:03:56 +01:00
|
|
|
'PhabricatorBcryptPasswordHasher' => 'PhabricatorPasswordHasher',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorBinariesSetupCheck' => 'PhabricatorSetupCheck',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorBitbucketAuthProvider' => 'PhabricatorOAuth1AuthProvider',
|
Begin lifting column layout logic out of ColumnPositionQuery
Summary:
Ref T10010. This is a precursor to D15171, which I'll eventually rebuild on top of these changes.
Currently, ColumnPositionQuery does a lot of "column layout" stuff that's very similar to the Milestone/Subproject stuff that needs to happen in D15171. The current approach there ended up splitting this layout stuff across two unrelated classes (ColumnPositionQuery + BoardViewController), neither of which is a particularly great place to do it -- the Query is too low-level, and the Controller is too high-level.
Instead, introduce a new "LayoutEngine" which does all this layout stuff. Swap two of the four places that we query this stuff over to the new engine:
- "Project (Column)" on tasks.
- Transaction generation when moving cards.
These sites aren't swapped by this diff, but will be by the next one:
- Actually applying transactions.
- Main layout for boards (this could swap easily now, but applying transactions currently relies on position writes having taken place, so it can't swap until the other one swaps).
Once everything is swapped over, I should be able to add the D15171 logic to LayoutEngine instead of BoardViewController and end up with a cleaner approach overall.
One particularly benefit is that //looking// at a board won't do a bunch of position writes anymore, which wasn't a big deal, but which I was a bit uneasy with.
Test Plan:
- Viewed tasks that are on boards, saw column annotations in project list.
- Moved cards between columns on a board.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10010
Differential Revision: https://secure.phabricator.com/D15174
2016-02-03 18:39:17 +01:00
|
|
|
'PhabricatorBoardLayoutEngine' => 'Phobject',
|
2016-02-06 22:02:13 +01:00
|
|
|
'PhabricatorBoardRenderingEngine' => 'Phobject',
|
2016-02-10 14:59:46 +01:00
|
|
|
'PhabricatorBoardResponseEngine' => 'Phobject',
|
2016-04-27 01:02:57 +02:00
|
|
|
'PhabricatorBoolEditField' => 'PhabricatorEditField',
|
First pass at decoupling Phabricator bot behavior from the protocol it's running on, this pulls the connection, reading, and writing functionalities out of the bot itself and into the adapter.
Summary:
Ugh, just wrote out a huge message, only to lose it with a fat-fingered ctrl-c. Le sigh.
First pass at decoupling the bot from the protocol. Noticeably absent is the command/message coupling. After this design pass I'll give that a go. Could use some advice, thinking that handlers should only create messages (which can be public or private) and not open ended, undefined 'commands'. The problem being that there needs to be some consistant api if we want handlers to be protocol agnostic. Perhaps that's a pipedream, what are your thoughts?
Secondly, a few notes, design review requests on the changes i did make:
# Config. For now i'm passing config through to the adapter. This was mainly to remain backwards compatible on the config. I was thinking it should probably be namespaced into it's own subobject though to distinguish the adapter config from the bot config.
# Adapter selection. This flavor is the one-bot-daemon, config specified protocol version. The upside is that in the future they won't have to run different daemons for this stuff, just have different config, and the door is open for multiple protocol adapters down the road if need be. The downside is that I had to rename the daemon (non-backwards compatible change) and there will need to be some sort of runtime evaluation for instatiation of the adapter. For now I just have a crude switch, but I was thinking of just taking the string they supply as the class name (ala `try { new $clasName(); } catch...`) so as to allow for homegrown adapters, but I wasn't sure how such runtime magic would go over. Also, an alternative would be to make the PhabricatorBot class a non-abstract non-final base class and have the adapters be accompanied by a bot class that just defines their adapter as a property. The upside of which is backwards compatibility (welcome back PhabricatorIRCBot) and perhaps a little bit clearer plugin path for homegrowners.
# Logging. You'll notice I commented out two very important logging lines in the irc adapter. This isn't intended to remain commented out, but I'm not sure what the best way is to get logging at this layer. I'm wary of just composing the daemon back down into the adapter (bi-directional object composition makes my skin crawl), but something needs to happen, obviously. Advice?
That's it. After the feedback on the above, you can either merge down, or wait until i finish the command/message refactor if you don't think the diff will grow too large. Up to you, this all functions as is.
Test Plan: Ran an irc bot, connected, read input, and wrote output including handler integration.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4757
2013-02-06 03:45:20 +01:00
|
|
|
'PhabricatorBot' => 'PhabricatorDaemon',
|
2013-02-14 14:13:38 +01:00
|
|
|
'PhabricatorBotChannel' => 'PhabricatorBotTarget',
|
First pass at decoupling Phabricator bot behavior from the protocol it's running on, this pulls the connection, reading, and writing functionalities out of the bot itself and into the adapter.
Summary:
Ugh, just wrote out a huge message, only to lose it with a fat-fingered ctrl-c. Le sigh.
First pass at decoupling the bot from the protocol. Noticeably absent is the command/message coupling. After this design pass I'll give that a go. Could use some advice, thinking that handlers should only create messages (which can be public or private) and not open ended, undefined 'commands'. The problem being that there needs to be some consistant api if we want handlers to be protocol agnostic. Perhaps that's a pipedream, what are your thoughts?
Secondly, a few notes, design review requests on the changes i did make:
# Config. For now i'm passing config through to the adapter. This was mainly to remain backwards compatible on the config. I was thinking it should probably be namespaced into it's own subobject though to distinguish the adapter config from the bot config.
# Adapter selection. This flavor is the one-bot-daemon, config specified protocol version. The upside is that in the future they won't have to run different daemons for this stuff, just have different config, and the door is open for multiple protocol adapters down the road if need be. The downside is that I had to rename the daemon (non-backwards compatible change) and there will need to be some sort of runtime evaluation for instatiation of the adapter. For now I just have a crude switch, but I was thinking of just taking the string they supply as the class name (ala `try { new $clasName(); } catch...`) so as to allow for homegrown adapters, but I wasn't sure how such runtime magic would go over. Also, an alternative would be to make the PhabricatorBot class a non-abstract non-final base class and have the adapters be accompanied by a bot class that just defines their adapter as a property. The upside of which is backwards compatibility (welcome back PhabricatorIRCBot) and perhaps a little bit clearer plugin path for homegrowners.
# Logging. You'll notice I commented out two very important logging lines in the irc adapter. This isn't intended to remain commented out, but I'm not sure what the best way is to get logging at this layer. I'm wary of just composing the daemon back down into the adapter (bi-directional object composition makes my skin crawl), but something needs to happen, obviously. Advice?
That's it. After the feedback on the above, you can either merge down, or wait until i finish the command/message refactor if you don't think the diff will grow too large. Up to you, this all functions as is.
Test Plan: Ran an irc bot, connected, read input, and wrote output including handler integration.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4757
2013-02-06 03:45:20 +01:00
|
|
|
'PhabricatorBotDebugLogHandler' => 'PhabricatorBotHandler',
|
|
|
|
'PhabricatorBotFeedNotificationHandler' => 'PhabricatorBotHandler',
|
2015-05-18 00:20:11 +02:00
|
|
|
'PhabricatorBotFlowdockProtocolAdapter' => 'PhabricatorStreamingProtocolAdapter',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorBotHandler' => 'Phobject',
|
First pass at decoupling Phabricator bot behavior from the protocol it's running on, this pulls the connection, reading, and writing functionalities out of the bot itself and into the adapter.
Summary:
Ugh, just wrote out a huge message, only to lose it with a fat-fingered ctrl-c. Le sigh.
First pass at decoupling the bot from the protocol. Noticeably absent is the command/message coupling. After this design pass I'll give that a go. Could use some advice, thinking that handlers should only create messages (which can be public or private) and not open ended, undefined 'commands'. The problem being that there needs to be some consistant api if we want handlers to be protocol agnostic. Perhaps that's a pipedream, what are your thoughts?
Secondly, a few notes, design review requests on the changes i did make:
# Config. For now i'm passing config through to the adapter. This was mainly to remain backwards compatible on the config. I was thinking it should probably be namespaced into it's own subobject though to distinguish the adapter config from the bot config.
# Adapter selection. This flavor is the one-bot-daemon, config specified protocol version. The upside is that in the future they won't have to run different daemons for this stuff, just have different config, and the door is open for multiple protocol adapters down the road if need be. The downside is that I had to rename the daemon (non-backwards compatible change) and there will need to be some sort of runtime evaluation for instatiation of the adapter. For now I just have a crude switch, but I was thinking of just taking the string they supply as the class name (ala `try { new $clasName(); } catch...`) so as to allow for homegrown adapters, but I wasn't sure how such runtime magic would go over. Also, an alternative would be to make the PhabricatorBot class a non-abstract non-final base class and have the adapters be accompanied by a bot class that just defines their adapter as a property. The upside of which is backwards compatibility (welcome back PhabricatorIRCBot) and perhaps a little bit clearer plugin path for homegrowners.
# Logging. You'll notice I commented out two very important logging lines in the irc adapter. This isn't intended to remain commented out, but I'm not sure what the best way is to get logging at this layer. I'm wary of just composing the daemon back down into the adapter (bi-directional object composition makes my skin crawl), but something needs to happen, obviously. Advice?
That's it. After the feedback on the above, you can either merge down, or wait until i finish the command/message refactor if you don't think the diff will grow too large. Up to you, this all functions as is.
Test Plan: Ran an irc bot, connected, read input, and wrote output including handler integration.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4757
2013-02-06 03:45:20 +01:00
|
|
|
'PhabricatorBotLogHandler' => 'PhabricatorBotHandler',
|
|
|
|
'PhabricatorBotMacroHandler' => 'PhabricatorBotHandler',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorBotMessage' => 'Phobject',
|
First pass at decoupling Phabricator bot behavior from the protocol it's running on, this pulls the connection, reading, and writing functionalities out of the bot itself and into the adapter.
Summary:
Ugh, just wrote out a huge message, only to lose it with a fat-fingered ctrl-c. Le sigh.
First pass at decoupling the bot from the protocol. Noticeably absent is the command/message coupling. After this design pass I'll give that a go. Could use some advice, thinking that handlers should only create messages (which can be public or private) and not open ended, undefined 'commands'. The problem being that there needs to be some consistant api if we want handlers to be protocol agnostic. Perhaps that's a pipedream, what are your thoughts?
Secondly, a few notes, design review requests on the changes i did make:
# Config. For now i'm passing config through to the adapter. This was mainly to remain backwards compatible on the config. I was thinking it should probably be namespaced into it's own subobject though to distinguish the adapter config from the bot config.
# Adapter selection. This flavor is the one-bot-daemon, config specified protocol version. The upside is that in the future they won't have to run different daemons for this stuff, just have different config, and the door is open for multiple protocol adapters down the road if need be. The downside is that I had to rename the daemon (non-backwards compatible change) and there will need to be some sort of runtime evaluation for instatiation of the adapter. For now I just have a crude switch, but I was thinking of just taking the string they supply as the class name (ala `try { new $clasName(); } catch...`) so as to allow for homegrown adapters, but I wasn't sure how such runtime magic would go over. Also, an alternative would be to make the PhabricatorBot class a non-abstract non-final base class and have the adapters be accompanied by a bot class that just defines their adapter as a property. The upside of which is backwards compatibility (welcome back PhabricatorIRCBot) and perhaps a little bit clearer plugin path for homegrowners.
# Logging. You'll notice I commented out two very important logging lines in the irc adapter. This isn't intended to remain commented out, but I'm not sure what the best way is to get logging at this layer. I'm wary of just composing the daemon back down into the adapter (bi-directional object composition makes my skin crawl), but something needs to happen, obviously. Advice?
That's it. After the feedback on the above, you can either merge down, or wait until i finish the command/message refactor if you don't think the diff will grow too large. Up to you, this all functions as is.
Test Plan: Ran an irc bot, connected, read input, and wrote output including handler integration.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4757
2013-02-06 03:45:20 +01:00
|
|
|
'PhabricatorBotObjectNameHandler' => 'PhabricatorBotHandler',
|
|
|
|
'PhabricatorBotSymbolHandler' => 'PhabricatorBotHandler',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorBotTarget' => 'Phobject',
|
2013-02-14 14:13:38 +01:00
|
|
|
'PhabricatorBotUser' => 'PhabricatorBotTarget',
|
First pass at decoupling Phabricator bot behavior from the protocol it's running on, this pulls the connection, reading, and writing functionalities out of the bot itself and into the adapter.
Summary:
Ugh, just wrote out a huge message, only to lose it with a fat-fingered ctrl-c. Le sigh.
First pass at decoupling the bot from the protocol. Noticeably absent is the command/message coupling. After this design pass I'll give that a go. Could use some advice, thinking that handlers should only create messages (which can be public or private) and not open ended, undefined 'commands'. The problem being that there needs to be some consistant api if we want handlers to be protocol agnostic. Perhaps that's a pipedream, what are your thoughts?
Secondly, a few notes, design review requests on the changes i did make:
# Config. For now i'm passing config through to the adapter. This was mainly to remain backwards compatible on the config. I was thinking it should probably be namespaced into it's own subobject though to distinguish the adapter config from the bot config.
# Adapter selection. This flavor is the one-bot-daemon, config specified protocol version. The upside is that in the future they won't have to run different daemons for this stuff, just have different config, and the door is open for multiple protocol adapters down the road if need be. The downside is that I had to rename the daemon (non-backwards compatible change) and there will need to be some sort of runtime evaluation for instatiation of the adapter. For now I just have a crude switch, but I was thinking of just taking the string they supply as the class name (ala `try { new $clasName(); } catch...`) so as to allow for homegrown adapters, but I wasn't sure how such runtime magic would go over. Also, an alternative would be to make the PhabricatorBot class a non-abstract non-final base class and have the adapters be accompanied by a bot class that just defines their adapter as a property. The upside of which is backwards compatibility (welcome back PhabricatorIRCBot) and perhaps a little bit clearer plugin path for homegrowners.
# Logging. You'll notice I commented out two very important logging lines in the irc adapter. This isn't intended to remain commented out, but I'm not sure what the best way is to get logging at this layer. I'm wary of just composing the daemon back down into the adapter (bi-directional object composition makes my skin crawl), but something needs to happen, obviously. Advice?
That's it. After the feedback on the above, you can either merge down, or wait until i finish the command/message refactor if you don't think the diff will grow too large. Up to you, this all functions as is.
Test Plan: Ran an irc bot, connected, read input, and wrote output including handler integration.
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2462
Differential Revision: https://secure.phabricator.com/D4757
2013-02-06 03:45:20 +01:00
|
|
|
'PhabricatorBotWhatsNewHandler' => 'PhabricatorBotHandler',
|
2015-02-11 22:02:35 +01:00
|
|
|
'PhabricatorBritishEnglishTranslation' => 'PhutilTranslation',
|
Make SQL patch management DAG-based and provide namespace support
Summary:
This addresses three issues with the current patch management system:
# Two people developing at the same time often pick the same SQL patch number, and then have to go rename it. The system catches this, but it's silly.
# Second/third-party developers can't use the same system to manage auxiliary storage they may want to add.
# There's no way to build mock databases for unit tests that need to do reads.
To resolve these things, you can now name your patches whatever you want and conflicts are just merge conflicts, which are less of a pain to fix than filename conflicts.
Dependencies are now a DAG, with implicit dependencies created on the prior patch if no dependencies are specified. Developers can add new concrete subclasses of `PhabricatorSQLPatchList` to add storage management, and define the dependency branchpoint of their patches so they apply in the correct order (although, generally, they should not depend on the mainline patches, presumably).
The commands `storage upgrade --namespace test1234` and `storage destroy --namespace test1234` will allow unit tests to build and destroy MySQL storage.
A "quickstart" mode allows an upgrade from scratch in ~1200ms. Destruction takes about 200ms. These seem like fairily reasonable costs to actually use in tests. Building from scratch patch-by-patch takes about 6000ms.
Test Plan:
- Created new databases from scratch with and without quickstart in a separate test namespace. Pointed the webapp at the test namespaces, browsed around, everything looked good.
- Compared quickstart and no-quickstart dump states, they're identical except for mysqldump timestamps and a few similar things.
- Upgraded a legacy database to the new storage format.
- Destroyed / dumped storage.
Reviewers: edward, vrana, btrahan, jungejason
Reviewed By: btrahan
CC: aran, nh
Maniphest Tasks: T140, T345
Differential Revision: https://secure.phabricator.com/D2323
2012-04-30 16:54:00 +02:00
|
|
|
'PhabricatorBuiltinPatchList' => 'PhabricatorSQLPatchList',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorBulkContentSource' => 'PhabricatorContentSource',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorBusyUIExample' => 'PhabricatorUIExample',
|
Add a generic multistep Markup cache
Summary:
The immediate issue this addresses is T1366, adding a rendering cache to Phriction. For wiki pages with code blocks especially, rerendering them each time is expensive.
The broader issue is that out markup caches aren't very good right now. They have three major problems:
**Problem 1: the data is stored in the wrong place.** We currently store remarkup caches on objects. This means we're always loading it and passing it around even when we don't need it, can't genericize cache management code (e.g., have one simple script to drop/GC caches), need to update authoritative rows to clear caches, and can't genericize rendering code since each object is different.
To solve this, I created a dedicated cache database that I plan to move all markup caches to use.
**Problem 2: time-variant rules break when cached.** Some rules like `**bold**` are time-invariant and always produce the same output, but some rules like `{Tnnn}` and `@username` are variant and may render differently (because a task was closed or a user is on vacation). Currently, we cache the raw output, so these time-variant rules get locked at whatever values they had when they were first rendered. This is the main reason Phriction doesn't have a cache right now -- I wanted `{Tnnn}` rules to reflect open/closed tasks.
To solve this, I split markup into a "preprocessing" phase (which does all the parsing and evaluates all time-invariant rules) and a "postprocessing" phase (which evaluates time-variant rules only). The preprocessing phase is most of the expense (and, notably, includes syntax highlighting) so this is nearly as good as caching the final output. I did most of the work here in D737 / D738, but we never moved to use it in Phabricator -- we currently just do the two operations serially in all cases.
This diff splits them apart and caches the output of preprocessing only, so we benefit from caching but also get accurate time-variant rendering.
**Problem 3: cache access isn't batched/pipelined optimally.** When we're rendering a list of markup blocks, we should be able to batch datafetching better than we do. D738 helped with this (fetching is batched within a single hunk of markup) and this improves batching on cache access. We could still do better here, but this is at least a step forward.
Also fixes a bug with generating a link in the Phriction history interface ($uri gets clobbered).
I'm using PHP serialization instead of JSON serialization because Remarkup does some stuff with non-ascii characters that might not survive JSON.
Test Plan:
- Created a Phriction document and verified that previews don't go to cache (no rows appear in the cache table).
- Verified that published documents come out of cache.
- Verified that caches generate/regenerate correctly, time-variant rules render properly and old documents hit the right caches.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1366
Differential Revision: https://secure.phabricator.com/D2945
2012-07-10 00:20:56 +02:00
|
|
|
'PhabricatorCacheDAO' => 'PhabricatorLiskDAO',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorCacheGeneralGarbageCollector' => 'PhabricatorGarbageCollector',
|
2013-12-27 22:15:48 +01:00
|
|
|
'PhabricatorCacheManagementPurgeWorkflow' => 'PhabricatorCacheManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorCacheManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorCacheMarkupGarbageCollector' => 'PhabricatorGarbageCollector',
|
2014-09-18 17:36:22 +02:00
|
|
|
'PhabricatorCacheSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-04-08 20:31:01 +02:00
|
|
|
'PhabricatorCacheSetupCheck' => 'PhabricatorSetupCheck',
|
2015-04-07 23:38:03 +02:00
|
|
|
'PhabricatorCacheSpec' => 'Phobject',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorCacheTTLGarbageCollector' => 'PhabricatorGarbageCollector',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorCaches' => 'Phobject',
|
2015-06-05 02:27:31 +02:00
|
|
|
'PhabricatorCachesTestCase' => 'PhabricatorTestCase',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorCalendarApplication' => 'PhabricatorApplication',
|
Build a basic calendar view
Summary:
This is a very small step toward building a Status and possibly an Oncall tool.
Build a calendar view which renders months.
Much of my hesitance to bang these tools out is that dealing with
dates/calendaring is basically horrible, so I'm trying to ease into it.
This calendar is locale-aware and all that jazz.
Test Plan:
- See:
https://secure.phabricator.com/file/view/PHID-FILE-c07a9c663a7d040d2529/
- Verified that months have the right number of days, today is the right day
of the week, months begin on the day after previous months end on, etc.
Reviewed By: aran
Reviewers: jungejason, tuomaspelkonen, aran
Commenters: cwbeck, jungejason
CC: blair, aran, epriestley, cwbeck, jungejason
Differential Revision: 791
2011-08-08 03:26:31 +02:00
|
|
|
'PhabricatorCalendarController' => 'PhabricatorController',
|
2012-05-03 09:21:47 +02:00
|
|
|
'PhabricatorCalendarDAO' => 'PhabricatorLiskDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorCalendarEvent' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorCalendarDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-06-22 22:27:37 +02:00
|
|
|
'PhabricatorProjectInterface',
|
2015-04-27 23:27:34 +02:00
|
|
|
'PhabricatorMarkupInterface',
|
2015-04-28 15:26:48 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-04-28 20:43:56 +02:00
|
|
|
'PhabricatorSubscribableInterface',
|
Canceling calendar events should deactivate the event
Summary: Closes T7943, Canceling calendar event should deactivate the event instead of destroying data.
Test Plan: Create an event, cancel it, see changed status icon, query for active events, event should not appear, query for deactivated events, event should appear in results.
Reviewers: #blessed_reviewers, epriestley
Reviewed By: #blessed_reviewers, epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T7943
Differential Revision: https://secure.phabricator.com/D12604
2015-04-29 17:39:39 +02:00
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
|
|
|
'PhabricatorMentionableInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
Events should offer Spaces as the view policy options
Summary: Ref T8687, Events should offer Spaces as the view policy options
Test Plan: Create event, choose default Space, save, edit, choose different Space, save, new policy should be reflected on Event.
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin
Maniphest Tasks: T8687
Differential Revision: https://secure.phabricator.com/D13459
2015-06-27 19:26:24 +02:00
|
|
|
'PhabricatorSpacesInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2014-02-06 19:07:42 +01:00
|
|
|
),
|
Canceling calendar events should deactivate the event
Summary: Closes T7943, Canceling calendar event should deactivate the event instead of destroying data.
Test Plan: Create an event, cancel it, see changed status icon, query for active events, event should not appear, query for deactivated events, event should appear in results.
Reviewers: #blessed_reviewers, epriestley
Reviewed By: #blessed_reviewers, epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T7943
Differential Revision: https://secure.phabricator.com/D12604
2015-04-29 17:39:39 +02:00
|
|
|
'PhabricatorCalendarEventCancelController' => 'PhabricatorCalendarController',
|
2015-05-01 02:38:04 +02:00
|
|
|
'PhabricatorCalendarEventCommentController' => 'PhabricatorCalendarController',
|
2015-05-24 04:47:23 +02:00
|
|
|
'PhabricatorCalendarEventDragController' => 'PhabricatorCalendarController',
|
2014-02-06 19:10:07 +01:00
|
|
|
'PhabricatorCalendarEventEditController' => 'PhabricatorCalendarController',
|
2015-04-28 15:26:48 +02:00
|
|
|
'PhabricatorCalendarEventEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-05-02 04:01:29 +02:00
|
|
|
'PhabricatorCalendarEventEmailCommand' => 'MetaMTAEmailTransactionCommand',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorCalendarEventFulltextEngine' => 'PhabricatorFulltextEngine',
|
2015-04-29 22:51:09 +02:00
|
|
|
'PhabricatorCalendarEventInvitee' => array(
|
|
|
|
'PhabricatorCalendarDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhabricatorCalendarEventInviteeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-04-30 03:18:27 +02:00
|
|
|
'PhabricatorCalendarEventJoinController' => 'PhabricatorCalendarController',
|
2014-05-08 18:18:02 +02:00
|
|
|
'PhabricatorCalendarEventListController' => 'PhabricatorCalendarController',
|
2015-05-01 22:26:07 +02:00
|
|
|
'PhabricatorCalendarEventMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorCalendarEventPHIDType' => 'PhabricatorPHIDType',
|
2014-02-06 19:07:42 +01:00
|
|
|
'PhabricatorCalendarEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-05-02 04:01:29 +02:00
|
|
|
'PhabricatorCalendarEventRSVPEmailCommand' => 'PhabricatorCalendarEventEmailCommand',
|
2014-02-06 19:10:18 +01:00
|
|
|
'PhabricatorCalendarEventSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-04-28 15:26:48 +02:00
|
|
|
'PhabricatorCalendarEventTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorCalendarEventTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'PhabricatorCalendarEventTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-02-19 01:25:16 +01:00
|
|
|
'PhabricatorCalendarEventViewController' => 'PhabricatorCalendarController',
|
2012-05-03 09:21:47 +02:00
|
|
|
'PhabricatorCalendarHoliday' => 'PhabricatorCalendarDAO',
|
2012-05-03 21:16:09 +02:00
|
|
|
'PhabricatorCalendarHolidayTestCase' => 'PhabricatorTestCase',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorCalendarIconSet' => 'PhabricatorIconSet',
|
2015-04-27 23:27:34 +02:00
|
|
|
'PhabricatorCalendarRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-05-01 22:26:07 +02:00
|
|
|
'PhabricatorCalendarReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2015-04-28 01:35:55 +02:00
|
|
|
'PhabricatorCalendarSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-05-18 00:20:11 +02:00
|
|
|
'PhabricatorCampfireProtocolAdapter' => 'PhabricatorStreamingProtocolAdapter',
|
2014-10-13 20:17:23 +02:00
|
|
|
'PhabricatorCelerityApplication' => 'PhabricatorApplication',
|
2014-09-22 10:50:20 +02:00
|
|
|
'PhabricatorCelerityTestCase' => 'PhabricatorTestCase',
|
2014-01-20 22:14:04 +01:00
|
|
|
'PhabricatorChangeParserTestCase' => 'PhabricatorWorkingCopyTestCase',
|
2012-03-13 05:39:05 +01:00
|
|
|
'PhabricatorChangesetResponse' => 'AphrontProxyResponse',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorChatLogApplication' => 'PhabricatorApplication',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorChatLogChannel' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorChatLogDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-02-14 13:10:42 +01:00
|
|
|
),
|
2012-02-17 19:21:38 +01:00
|
|
|
'PhabricatorChatLogChannelListController' => 'PhabricatorChatLogController',
|
|
|
|
'PhabricatorChatLogChannelLogController' => 'PhabricatorChatLogController',
|
2013-02-22 15:59:17 +01:00
|
|
|
'PhabricatorChatLogChannelQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2012-02-17 19:21:38 +01:00
|
|
|
'PhabricatorChatLogController' => 'PhabricatorController',
|
|
|
|
'PhabricatorChatLogDAO' => 'PhabricatorLiskDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorChatLogEvent' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorChatLogDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2012-06-02 23:00:08 +02:00
|
|
|
),
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorChatLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'PhabricatorChunkedFileStorageEngine' => 'PhabricatorFileStorageEngine',
|
Add `cluster.addresses` and require membership before accepting cluster authentication tokens
Summary:
Ref T2783. Ref T6706.
- Add `cluster.addresses`. This is a whitelist of CIDR blocks which define cluster hosts.
- When we recieve a request that has a cluster-based authentication token, require the cluster to be configured and require the remote address to be a cluster member before we accept it.
- This provides a general layer of security for these mechanisms.
- In particular, it means they do not work by default on unconfigured hosts.
- When cluster addresses are configured, and we receive a request //to// an address not on the list, reject it.
- This provides a general layer of security for getting the Ops side of cluster configuration correct.
- If cluster nodes have public IPs and are listening on them, we'll reject requests.
- Basically, this means that any requests which bypass the LB get rejected.
Test Plan:
- With addresses not configured, tried to make requests; rejected for using a cluster auth mechanism.
- With addresses configred wrong, tried to make requests; rejected for sending from (or to) an address outside of the cluster.
- With addresses configured correctly, made valid requests.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6706, T2783
Differential Revision: https://secure.phabricator.com/D11159
2015-01-03 00:13:41 +01:00
|
|
|
'PhabricatorClusterConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2016-04-09 14:41:08 +02:00
|
|
|
'PhabricatorClusterDatabasesConfigOptionType' => 'PhabricatorConfigJSONOptionType',
|
2016-04-10 14:10:06 +02:00
|
|
|
'PhabricatorClusterException' => 'Exception',
|
|
|
|
'PhabricatorClusterExceptionHandler' => 'PhabricatorRequestExceptionHandler',
|
Automatically degrade to read-only mode when unable to connect to the master
Summary:
Ref T4571. If we fail to connect to the master, automatically try to degrade into a temporary read-only mode ("UNREACHABLE") for the remainder of the request, if possible.
If the request was something like "load the homepage", that'll work fine. If it was something like "submit a comment", there's nothing we can do and we just have to fail.
Detecting this condition imposes a performance penalty: every request checks the connection and gives the database a long time to respond, since we don't want to drop writes unless we have to. So the degraded mode works, but it's really slow, and may perpetuate the problem if the root issue is load-related.
This lays the groundwork for improving this case by degrading futher into a "SEVERED" mode which will persist across requests. In the future, if several requests in a short period of time fail, we'll sever the database host and refuse to try to connect to it for a little while, connecting directly to replicas instead (basically, we're "health checking" the master, like a load balancer would health check a web application server). This will give us a better (much faster) degraded mode in a major service disruption, and reduce load on the master if the root cause is load-related, giving it a better chance of recovering on its own.
Test Plan:
- Disabled master in config by changing the host/username, got degraded automatically to UNREACAHBLE mode immediately.
- Faked full SEVERED mode, requests hit replicas and put me in the mode properly.
- Made stuff work, hit some good pages.
- Hit some non-cluster pages.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4571
Differential Revision: https://secure.phabricator.com/D15674
2016-04-10 14:51:34 +02:00
|
|
|
'PhabricatorClusterImpossibleWriteException' => 'PhabricatorClusterException',
|
2016-04-10 14:10:06 +02:00
|
|
|
'PhabricatorClusterImproperWriteException' => 'PhabricatorClusterException',
|
Automatically degrade to read-only mode when unable to connect to the master
Summary:
Ref T4571. If we fail to connect to the master, automatically try to degrade into a temporary read-only mode ("UNREACHABLE") for the remainder of the request, if possible.
If the request was something like "load the homepage", that'll work fine. If it was something like "submit a comment", there's nothing we can do and we just have to fail.
Detecting this condition imposes a performance penalty: every request checks the connection and gives the database a long time to respond, since we don't want to drop writes unless we have to. So the degraded mode works, but it's really slow, and may perpetuate the problem if the root issue is load-related.
This lays the groundwork for improving this case by degrading futher into a "SEVERED" mode which will persist across requests. In the future, if several requests in a short period of time fail, we'll sever the database host and refuse to try to connect to it for a little while, connecting directly to replicas instead (basically, we're "health checking" the master, like a load balancer would health check a web application server). This will give us a better (much faster) degraded mode in a major service disruption, and reduce load on the master if the root cause is load-related, giving it a better chance of recovering on its own.
Test Plan:
- Disabled master in config by changing the host/username, got degraded automatically to UNREACAHBLE mode immediately.
- Faked full SEVERED mode, requests hit replicas and put me in the mode properly.
- Made stuff work, hit some good pages.
- Hit some non-cluster pages.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4571
Differential Revision: https://secure.phabricator.com/D15674
2016-04-10 14:51:34 +02:00
|
|
|
'PhabricatorClusterStrandedException' => 'PhabricatorClusterException',
|
2016-04-06 13:37:01 +02:00
|
|
|
'PhabricatorColumnsEditField' => 'PhabricatorPHIDListEditField',
|
2015-11-29 19:05:41 +01:00
|
|
|
'PhabricatorCommentEditEngineExtension' => 'PhabricatorEditEngineExtension',
|
2015-11-18 23:11:21 +01:00
|
|
|
'PhabricatorCommentEditField' => 'PhabricatorEditField',
|
|
|
|
'PhabricatorCommentEditType' => 'PhabricatorEditType',
|
2014-03-12 19:30:33 +01:00
|
|
|
'PhabricatorCommitBranchesField' => 'PhabricatorCommitCustomField',
|
|
|
|
'PhabricatorCommitCustomField' => 'PhabricatorCustomField',
|
2015-05-25 13:49:12 +02:00
|
|
|
'PhabricatorCommitMergedCommitsField' => 'PhabricatorCommitCustomField',
|
2015-05-25 14:43:42 +02:00
|
|
|
'PhabricatorCommitRepositoryField' => 'PhabricatorCommitCustomField',
|
2014-04-27 18:43:05 +02:00
|
|
|
'PhabricatorCommitSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-03-12 19:30:52 +01:00
|
|
|
'PhabricatorCommitTagsField' => 'PhabricatorCommitCustomField',
|
2014-01-23 23:01:18 +01:00
|
|
|
'PhabricatorCommonPasswords' => 'Phobject',
|
2011-01-24 18:00:29 +01:00
|
|
|
'PhabricatorConduitAPIController' => 'PhabricatorConduitController',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorConduitApplication' => 'PhabricatorApplication',
|
2011-06-14 21:17:14 +02:00
|
|
|
'PhabricatorConduitCertificateToken' => 'PhabricatorConduitDAO',
|
2015-12-14 23:36:47 +01:00
|
|
|
'PhabricatorConduitConnectionLog' => 'PhabricatorConduitDAO',
|
2011-01-24 18:00:29 +01:00
|
|
|
'PhabricatorConduitConsoleController' => 'PhabricatorConduitController',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorConduitContentSource' => 'PhabricatorContentSource',
|
2011-01-24 18:00:29 +01:00
|
|
|
'PhabricatorConduitController' => 'PhabricatorController',
|
|
|
|
'PhabricatorConduitDAO' => 'PhabricatorLiskDAO',
|
2015-12-15 18:11:11 +01:00
|
|
|
'PhabricatorConduitEditField' => 'PhabricatorEditField',
|
2014-05-08 19:08:37 +02:00
|
|
|
'PhabricatorConduitListController' => 'PhabricatorConduitController',
|
2011-01-24 18:00:29 +01:00
|
|
|
'PhabricatorConduitLogController' => 'PhabricatorConduitController',
|
2013-07-01 21:37:34 +02:00
|
|
|
'PhabricatorConduitLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-12-14 21:27:57 +01:00
|
|
|
'PhabricatorConduitLogSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorConduitMethodCallLog' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorConduitDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-07-01 21:37:34 +02:00
|
|
|
),
|
2013-07-01 21:36:34 +02:00
|
|
|
'PhabricatorConduitMethodQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorConduitRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorConduitResultInterface' => 'PhabricatorPHIDInterface',
|
2013-07-01 21:36:34 +02:00
|
|
|
'PhabricatorConduitSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-12-14 15:42:21 +01:00
|
|
|
'PhabricatorConduitSearchFieldSpecification' => 'Phobject',
|
Accept Conduit tokens as an authentication mechanism
Summary:
- Ref T5955. Accept the tokens introduced in D10985 as an authentication token.
- Ref T3628. Permit simple `curl`-compatible decoding of parameters.
Test Plan:
- Ran some sensible `curl` API commands:
```
epriestley@orbital ~/dev/phabricator $ curl -g "http://local.phacility.com/api/user.whoami?api.token=api-f7dfpoyelk4mmz6vxcueb6hcbtbk" ; echo
{"result":{"phid":"PHID-USER-cvfydnwadpdj7vdon36z","userName":"admin","realName":"asdf","image":"http:\/\/local.phacility.com\/res\/1410737307T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/local.phacility.com\/p\/admin\/","roles":["admin","verified","approved","activated"]},"error_code":null,"error_info":null}
```
```
epriestley@orbital ~/dev/phabricator $ curl -g "http://local.phacility.com/api/differential.query?api.token=api-f7dfpoyelk4mmz6vxcueb6hcbtbk&ids[]=1" ; echo
{"result":[{"id":"1","phid":"PHID-DREV-v3a67ixww3ccg5lqbxee","title":"zxcb","uri":"http:\/\/local.phacility.com\/D1","dateCreated":"1418405590","dateModified":"1418405590","authorPHID":"PHID-USER-cvfydnwadpdj7vdon36z","status":"0","statusName":"Needs Review","branch":null,"summary":"","testPlan":"zxcb","lineCount":"6","activeDiffPHID":"PHID-DIFF-pzbtc5rw6pe5j2kxtlr2","diffs":["1"],"commits":[],"reviewers":[],"ccs":[],"hashes":[],"auxiliary":{"phabricator:projects":[],"phabricator:depends-on":[],"organization.sqlmigration":null},"arcanistProjectPHID":null,"repositoryPHID":null,"sourcePath":null}],"error_code":null,"error_info":null}
```
- Ran older-style commands like `arc list` against the local install.
- Ran commands via web console.
- Added and ran a unit test to make sure nothing is using forbidden parameter names.
- Terminated a token and verified it no longer works.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T3628, T5955
Differential Revision: https://secure.phabricator.com/D10986
2014-12-15 20:14:41 +01:00
|
|
|
'PhabricatorConduitTestCase' => 'PhabricatorTestCase',
|
Add Conduit Tokens to make authentication in Conduit somewhat more sane
Summary:
Ref T5955. Summary of intended changes:
**Improve Granularity of Authorization**: Currently, users have one Conduit Certificate. This isn't very flexible, and means that you can't ever generate an API token with limited permissions or IP block controls (see T6706). This moves toward a world where you can generate multiple tokens, revoke them individually, and assign disparate privileges to them.
**Standardize Token Management**: This moves Conduit to work the same way that sessions, OAuth authorizations, and temporary tokens already work, instead of being this crazy bizarre mess.
**Make Authentication Faster**: Authentication currently requires a handshake (conduit.connect) to establish a session, like the web UI. This is unnecessary from a security point of view and puts an extra round trip in front of all Conduit activity. Essentially no other API anywhere works like this.
**Make Authentication Simpler**: The handshake is complex, and involves deriving hashes. The session is also complex, and creates issues like T4377. Handshake and session management require different inputs.
**Make Token Management Simpler**: The certificate is this huge long thing right now, which is not necessary from a security perspective. There are separate Arcanist handshake tokens, but they have a different set of issues. We can move forward to a token management world where neither of these problems exist.
**Lower Protocol Barrier**: The simplest possible API client is very complex right now. It should be `curl`. Simplifying authentication is a necessary step toward this.
**Unblock T2783**: T2783 is blocked on nodes in the cluster making authenticated API calls to other nodes. This provides a simpler way forward than the handshake mess (or enormous-hack-mess) which would currently be required.
Test Plan:
- Generated tokens.
- Generated tokens for a bot account.
- Terminated tokens (and for a bot account).
- Terminated all tokens (and for a bot account).
- Ran GC and saw it reap all the expired tokens.
NOTE: These tokens can not actually be used to authenticate yet!
{F249658}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5955
Differential Revision: https://secure.phabricator.com/D10985
2014-12-15 20:14:23 +01:00
|
|
|
'PhabricatorConduitToken' => array(
|
|
|
|
'PhabricatorConduitDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2011-06-14 21:17:14 +02:00
|
|
|
'PhabricatorConduitTokenController' => 'PhabricatorConduitController',
|
Add Conduit Tokens to make authentication in Conduit somewhat more sane
Summary:
Ref T5955. Summary of intended changes:
**Improve Granularity of Authorization**: Currently, users have one Conduit Certificate. This isn't very flexible, and means that you can't ever generate an API token with limited permissions or IP block controls (see T6706). This moves toward a world where you can generate multiple tokens, revoke them individually, and assign disparate privileges to them.
**Standardize Token Management**: This moves Conduit to work the same way that sessions, OAuth authorizations, and temporary tokens already work, instead of being this crazy bizarre mess.
**Make Authentication Faster**: Authentication currently requires a handshake (conduit.connect) to establish a session, like the web UI. This is unnecessary from a security point of view and puts an extra round trip in front of all Conduit activity. Essentially no other API anywhere works like this.
**Make Authentication Simpler**: The handshake is complex, and involves deriving hashes. The session is also complex, and creates issues like T4377. Handshake and session management require different inputs.
**Make Token Management Simpler**: The certificate is this huge long thing right now, which is not necessary from a security perspective. There are separate Arcanist handshake tokens, but they have a different set of issues. We can move forward to a token management world where neither of these problems exist.
**Lower Protocol Barrier**: The simplest possible API client is very complex right now. It should be `curl`. Simplifying authentication is a necessary step toward this.
**Unblock T2783**: T2783 is blocked on nodes in the cluster making authenticated API calls to other nodes. This provides a simpler way forward than the handshake mess (or enormous-hack-mess) which would currently be required.
Test Plan:
- Generated tokens.
- Generated tokens for a bot account.
- Terminated tokens (and for a bot account).
- Terminated all tokens (and for a bot account).
- Ran GC and saw it reap all the expired tokens.
NOTE: These tokens can not actually be used to authenticate yet!
{F249658}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5955
Differential Revision: https://secure.phabricator.com/D10985
2014-12-15 20:14:23 +01:00
|
|
|
'PhabricatorConduitTokenEditController' => 'PhabricatorConduitController',
|
2014-12-15 20:14:53 +01:00
|
|
|
'PhabricatorConduitTokenHandshakeController' => 'PhabricatorConduitController',
|
Add Conduit Tokens to make authentication in Conduit somewhat more sane
Summary:
Ref T5955. Summary of intended changes:
**Improve Granularity of Authorization**: Currently, users have one Conduit Certificate. This isn't very flexible, and means that you can't ever generate an API token with limited permissions or IP block controls (see T6706). This moves toward a world where you can generate multiple tokens, revoke them individually, and assign disparate privileges to them.
**Standardize Token Management**: This moves Conduit to work the same way that sessions, OAuth authorizations, and temporary tokens already work, instead of being this crazy bizarre mess.
**Make Authentication Faster**: Authentication currently requires a handshake (conduit.connect) to establish a session, like the web UI. This is unnecessary from a security point of view and puts an extra round trip in front of all Conduit activity. Essentially no other API anywhere works like this.
**Make Authentication Simpler**: The handshake is complex, and involves deriving hashes. The session is also complex, and creates issues like T4377. Handshake and session management require different inputs.
**Make Token Management Simpler**: The certificate is this huge long thing right now, which is not necessary from a security perspective. There are separate Arcanist handshake tokens, but they have a different set of issues. We can move forward to a token management world where neither of these problems exist.
**Lower Protocol Barrier**: The simplest possible API client is very complex right now. It should be `curl`. Simplifying authentication is a necessary step toward this.
**Unblock T2783**: T2783 is blocked on nodes in the cluster making authenticated API calls to other nodes. This provides a simpler way forward than the handshake mess (or enormous-hack-mess) which would currently be required.
Test Plan:
- Generated tokens.
- Generated tokens for a bot account.
- Terminated tokens (and for a bot account).
- Terminated all tokens (and for a bot account).
- Ran GC and saw it reap all the expired tokens.
NOTE: These tokens can not actually be used to authenticate yet!
{F249658}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5955
Differential Revision: https://secure.phabricator.com/D10985
2014-12-15 20:14:23 +01:00
|
|
|
'PhabricatorConduitTokenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorConduitTokenTerminateController' => 'PhabricatorConduitController',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorConduitTokensSettingsPanel' => 'PhabricatorSettingsPanel',
|
2013-01-16 20:10:41 +01:00
|
|
|
'PhabricatorConfigAllController' => 'PhabricatorConfigController',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorConfigApplication' => 'PhabricatorApplication',
|
2015-04-07 23:28:20 +02:00
|
|
|
'PhabricatorConfigCacheController' => 'PhabricatorConfigController',
|
2016-04-10 00:21:29 +02:00
|
|
|
'PhabricatorConfigClusterDatabasesController' => 'PhabricatorConfigController',
|
2016-04-13 21:07:48 +02:00
|
|
|
'PhabricatorConfigClusterNotificationsController' => 'PhabricatorConfigController',
|
2016-04-20 20:06:13 +02:00
|
|
|
'PhabricatorConfigClusterRepositoriesController' => 'PhabricatorConfigController',
|
2015-10-02 01:58:43 +02:00
|
|
|
'PhabricatorConfigCollectorsModule' => 'PhabricatorConfigModule',
|
2014-09-18 17:22:54 +02:00
|
|
|
'PhabricatorConfigColumnSchema' => 'PhabricatorConfigStorageSchema',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorConfigConfigPHIDType' => 'PhabricatorPHIDType',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigController' => 'PhabricatorController',
|
2014-10-02 18:51:20 +02:00
|
|
|
'PhabricatorConfigCoreSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2014-09-18 17:22:18 +02:00
|
|
|
'PhabricatorConfigDatabaseController' => 'PhabricatorConfigController',
|
2014-09-19 20:46:30 +02:00
|
|
|
'PhabricatorConfigDatabaseIssueController' => 'PhabricatorConfigDatabaseController',
|
2014-09-18 17:22:54 +02:00
|
|
|
'PhabricatorConfigDatabaseSchema' => 'PhabricatorConfigStorageSchema',
|
Add database configuration source to the source stack
Summary:
Read configuration from the new database source.
This adds an extra MySQL connect + query to every page. They're very cheap so I think we can suffer them for now, but I'd like to put cache in front of this at some point. The difficulties are:
- If we use APC, multi-frontend installs (Facebook) can't dirty it (major problem), and the CLI can't dirty it (fine for now, maybe a major problem later).
- If we use Memcache, we need to add config stuff.
- We could use APC in all non-Facebook installs if we can make it dirtyable from the CLI, but I don't see a reasonable way to do that.
- We don't have any other caches which are faster than the database.
So I'll probably implement Memcache support at some point, although this is a lame excuse for it.
Test Plan: Added some config values via web UI, saw them active on the install.
Reviewers: btrahan, codeblock, vrana
Reviewed By: codeblock
CC: aran
Maniphest Tasks: T2221
Differential Revision: https://secure.phabricator.com/D4296
2013-01-18 00:10:21 +01:00
|
|
|
'PhabricatorConfigDatabaseSource' => 'PhabricatorConfigProxySource',
|
2014-09-19 20:46:30 +02:00
|
|
|
'PhabricatorConfigDatabaseStatusController' => 'PhabricatorConfigDatabaseController',
|
2013-01-01 23:10:33 +01:00
|
|
|
'PhabricatorConfigDefaultSource' => 'PhabricatorConfigProxySource',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigDictionarySource' => 'PhabricatorConfigSource',
|
2015-07-21 02:08:37 +02:00
|
|
|
'PhabricatorConfigEdgeModule' => 'PhabricatorConfigModule',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigEditController' => 'PhabricatorConfigController',
|
2013-01-02 03:14:41 +01:00
|
|
|
'PhabricatorConfigEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorConfigEntry' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorConfigEntryDAO',
|
2014-12-03 21:28:53 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
2013-07-22 00:04:21 +02:00
|
|
|
),
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigEntryDAO' => 'PhabricatorLiskDAO',
|
2013-07-22 00:04:21 +02:00
|
|
|
'PhabricatorConfigEntryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigFileSource' => 'PhabricatorConfigProxySource',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorConfigGroupController' => 'PhabricatorConfigController',
|
2015-11-04 14:05:10 +01:00
|
|
|
'PhabricatorConfigHTTPParameterTypesModule' => 'PhabricatorConfigModule',
|
2015-01-01 15:51:44 +01:00
|
|
|
'PhabricatorConfigHistoryController' => 'PhabricatorConfigController',
|
2014-11-01 16:25:05 +01:00
|
|
|
'PhabricatorConfigIgnoreController' => 'PhabricatorConfigController',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorConfigIssueListController' => 'PhabricatorConfigController',
|
|
|
|
'PhabricatorConfigIssueViewController' => 'PhabricatorConfigController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorConfigJSON' => 'Phobject',
|
2014-03-25 22:05:36 +01:00
|
|
|
'PhabricatorConfigJSONOptionType' => 'PhabricatorConfigOptionType',
|
2014-09-18 17:32:21 +02:00
|
|
|
'PhabricatorConfigKeySchema' => 'PhabricatorConfigStorageSchema',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigListController' => 'PhabricatorConfigController',
|
Add a local configuration source and a non-environmental ENV config source
Summary:
See discussion in T2221. Before we can move configuration to the database, we have a bootstrapping problem: we need database credentials to live //somewhere// if we can't guess them (and we can only really guess localhost / root / no password).
Some options for this are:
- Have them live in ENV variables.
- These are often somewhat unfamiliar to users.
- Scripts would become a huge pain -- you'd have to dump a bunch of stuff into ENV.
- Some environments have limited ability to set ENV vars.
- SSH is also a pain.
- Have them live in a normal config file.
- This probably isn't really too awful, but:
- Since we deploy/upgrade with git, we can't currently let them edit a file which already exists, or their working copy will become dirty.
- So they have to copy or create a file, then edit it.
- The biggest issue I have with this is that it will be difficult to give specific, easily-followed directions from Setup. The instructions need to be like "Copy template.conf.php to real.conf.php, then edit these keys: x, y, z". This isn't as easy to follow as "run script Y".
- Have them live in an abnormal config file with script access (this diff).
- I think this is a little better than a normal config file, because we can tell users 'run phabricator/bin/config set mysql.user phabricator' and such, which is easier to follow than editing a config file.
I think this is only a marginal improvement over a normal config file and am open to arguments against this approach, but I think it will be a little easier for users to deal with than a normal config file. In most cases they should only need to store three values in this file -- db user/host/pass -- since once we have those we can bootstrap everything else. Normal config files also aren't going away for more advanced users, we're just offering a simple alternative for most users.
This also adds an ENVIRONMENT file as an alternative to PHABRICATOR_ENV. This is just a simple way to specify the environment if you don't have convenient access to env vars.
Test Plan: Ran `config set x y`, verified writes. Wrote to ENVIRONMENT, ran `PHABRICATOR_ENV= ./bin/repository`.
Reviewers: btrahan, vrana, codeblock
Reviewed By: codeblock
CC: aran
Maniphest Tasks: T2221
Differential Revision: https://secure.phabricator.com/D4294
2012-12-30 15:16:15 +01:00
|
|
|
'PhabricatorConfigLocalSource' => 'PhabricatorConfigProxySource',
|
2013-01-22 00:27:42 +01:00
|
|
|
'PhabricatorConfigManagementDeleteWorkflow' => 'PhabricatorConfigManagementWorkflow',
|
|
|
|
'PhabricatorConfigManagementGetWorkflow' => 'PhabricatorConfigManagementWorkflow',
|
|
|
|
'PhabricatorConfigManagementListWorkflow' => 'PhabricatorConfigManagementWorkflow',
|
2014-10-09 01:15:05 +02:00
|
|
|
'PhabricatorConfigManagementMigrateWorkflow' => 'PhabricatorConfigManagementWorkflow',
|
Add a local configuration source and a non-environmental ENV config source
Summary:
See discussion in T2221. Before we can move configuration to the database, we have a bootstrapping problem: we need database credentials to live //somewhere// if we can't guess them (and we can only really guess localhost / root / no password).
Some options for this are:
- Have them live in ENV variables.
- These are often somewhat unfamiliar to users.
- Scripts would become a huge pain -- you'd have to dump a bunch of stuff into ENV.
- Some environments have limited ability to set ENV vars.
- SSH is also a pain.
- Have them live in a normal config file.
- This probably isn't really too awful, but:
- Since we deploy/upgrade with git, we can't currently let them edit a file which already exists, or their working copy will become dirty.
- So they have to copy or create a file, then edit it.
- The biggest issue I have with this is that it will be difficult to give specific, easily-followed directions from Setup. The instructions need to be like "Copy template.conf.php to real.conf.php, then edit these keys: x, y, z". This isn't as easy to follow as "run script Y".
- Have them live in an abnormal config file with script access (this diff).
- I think this is a little better than a normal config file, because we can tell users 'run phabricator/bin/config set mysql.user phabricator' and such, which is easier to follow than editing a config file.
I think this is only a marginal improvement over a normal config file and am open to arguments against this approach, but I think it will be a little easier for users to deal with than a normal config file. In most cases they should only need to store three values in this file -- db user/host/pass -- since once we have those we can bootstrap everything else. Normal config files also aren't going away for more advanced users, we're just offering a simple alternative for most users.
This also adds an ENVIRONMENT file as an alternative to PHABRICATOR_ENV. This is just a simple way to specify the environment if you don't have convenient access to env vars.
Test Plan: Ran `config set x y`, verified writes. Wrote to ENVIRONMENT, ran `PHABRICATOR_ENV= ./bin/repository`.
Reviewers: btrahan, vrana, codeblock
Reviewed By: codeblock
CC: aran
Maniphest Tasks: T2221
Differential Revision: https://secure.phabricator.com/D4294
2012-12-30 15:16:15 +01:00
|
|
|
'PhabricatorConfigManagementSetWorkflow' => 'PhabricatorConfigManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorConfigManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-07-21 02:08:37 +02:00
|
|
|
'PhabricatorConfigModule' => 'Phobject',
|
|
|
|
'PhabricatorConfigModuleController' => 'PhabricatorConfigController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorConfigOption' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'Phobject',
|
|
|
|
'PhabricatorMarkupInterface',
|
2013-01-01 23:09:29 +01:00
|
|
|
),
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorConfigOptionType' => 'Phobject',
|
2015-07-21 02:08:37 +02:00
|
|
|
'PhabricatorConfigPHIDModule' => 'PhabricatorConfigModule',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigProxySource' => 'PhabricatorConfigSource',
|
2015-09-10 23:18:52 +02:00
|
|
|
'PhabricatorConfigPurgeCacheController' => 'PhabricatorConfigController',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorConfigRequestExceptionHandlerModule' => 'PhabricatorConfigModule',
|
Improve top-level exception handling
Summary:
Fixes T6692. Addresses two main issues:
- The write guard would sometimes not get disposed of on exception pathways, generating an unnecessary secondary error which was just a symptom of the original root error.
- This was generally confusing and reduced the quality of reports we received because users would report the symptomatic error sometimes instead of the real error.
- Instead, reflow the handling so that we always dispose of the write guard if we create one.
- If we missed the Controller-level error page generation (normally, a nice page with full CSS, etc), we'd jump straight to Startup-level error page generation (very basic plain text).
- A large class of errors occur too early or too late to be handled by Controller-level pages, but many of these errors are not fundamental, and the plain text page is excessively severe.
- Provide a mid-level simple HTML error page for errors which can't get full CSS, but also aren't so fundamental that we have no recourse but plain text.
Test Plan:
Mid-level errors now produce an intentional-looking error page:
{F259885}
Verified that setup errors still render properly.
@chad, feel free to tweak the exception page -- I just did a rough pass on it. Like the setup error stuff, it doesn't have Celerity, so we can't use `{$colors}` and no other CSS will be loaded.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley, chad
Maniphest Tasks: T6692
Differential Revision: https://secure.phabricator.com/D11126
2015-01-02 19:49:27 +01:00
|
|
|
'PhabricatorConfigResponse' => 'AphrontStandaloneHTMLResponse',
|
2014-09-18 17:22:18 +02:00
|
|
|
'PhabricatorConfigSchemaQuery' => 'Phobject',
|
2014-09-18 17:22:54 +02:00
|
|
|
'PhabricatorConfigSchemaSpec' => 'Phobject',
|
|
|
|
'PhabricatorConfigServerSchema' => 'PhabricatorConfigStorageSchema',
|
2015-07-21 02:08:37 +02:00
|
|
|
'PhabricatorConfigSiteModule' => 'PhabricatorConfigModule',
|
2014-11-06 00:30:40 +01:00
|
|
|
'PhabricatorConfigSiteSource' => 'PhabricatorConfigProxySource',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorConfigSource' => 'Phobject',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigStackSource' => 'PhabricatorConfigSource',
|
2014-09-18 17:22:54 +02:00
|
|
|
'PhabricatorConfigStorageSchema' => 'Phobject',
|
|
|
|
'PhabricatorConfigTableSchema' => 'PhabricatorConfigStorageSchema',
|
2013-01-02 03:14:41 +01:00
|
|
|
'PhabricatorConfigTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-01-02 03:15:03 +01:00
|
|
|
'PhabricatorConfigValidationException' => 'Exception',
|
2015-10-24 17:13:22 +02:00
|
|
|
'PhabricatorConfigVersionsModule' => 'PhabricatorConfigModule',
|
2014-06-23 18:37:51 +02:00
|
|
|
'PhabricatorConfigWelcomeController' => 'PhabricatorConfigController',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorConpherenceApplication' => 'PhabricatorApplication',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorConpherencePreferencesSettingsPanel' => 'PhabricatorSettingsPanel',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorConpherenceThreadPHIDType' => 'PhabricatorPHIDType',
|
2014-10-13 20:17:09 +02:00
|
|
|
'PhabricatorConsoleApplication' => 'PhabricatorApplication',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorConsoleContentSource' => 'PhabricatorContentSource',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorContentSource' => 'Phobject',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorContentSourceModule' => 'PhabricatorConfigModule',
|
Track content sources (email, web, conduit, mobile) for replies
Summary:
When an object is updated, record the content source for the update. This mostly
isn't terribly useful but one concrete thing I want to do with it is let admins
audit via-email replies more easily since there are a bunch of options which let
you do hyjinx if you intentionally configure them insecurely. I think having a
little more auditability around this feature is generally good. At some point
I'm going to turn this into a link admins can click to see details.
It also allows us to see how frequently different mechanisms are used, and lets
you see if someone is at their desk or on a mobile or whatever, at least
indirectly.
The "tablet" and "mobile" sources are currently unused but I figured I'd throw
them in anyway. SMS support should definitely happen at some point.
Not 100% sure about the design for this, I might change it to plain text at some
point.
Test Plan: Updated objects and saw update sources rendered.
Reviewers: jungejason, tuomaspelkonen, aran
Reviewed By: jungejason
CC: aran, epriestley, jungejason
Differential Revision: 844
2011-08-22 19:25:45 +02:00
|
|
|
'PhabricatorContentSourceView' => 'AphrontView',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorContributedToObjectEdgeType' => 'PhabricatorEdgeType',
|
2011-01-23 02:48:55 +01:00
|
|
|
'PhabricatorController' => 'AphrontController',
|
2014-01-23 23:01:35 +01:00
|
|
|
'PhabricatorCookies' => 'Phobject',
|
2013-01-02 03:22:48 +01:00
|
|
|
'PhabricatorCoreConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorCountdown' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorCountdownDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-07-18 21:19:32 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-07-23 19:56:00 +02:00
|
|
|
'PhabricatorTokenReceiverInterface',
|
2015-07-15 19:17:51 +02:00
|
|
|
'PhabricatorSpacesInterface',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorProjectInterface',
|
2013-05-23 15:47:54 +02:00
|
|
|
),
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorCountdownApplication' => 'PhabricatorApplication',
|
2011-06-13 01:06:17 +02:00
|
|
|
'PhabricatorCountdownController' => 'PhabricatorController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorCountdownCountdownPHIDType' => 'PhabricatorPHIDType',
|
2011-06-13 01:06:17 +02:00
|
|
|
'PhabricatorCountdownDAO' => 'PhabricatorLiskDAO',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorCountdownDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhabricatorCountdownDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2011-06-13 01:06:17 +02:00
|
|
|
'PhabricatorCountdownDeleteController' => 'PhabricatorCountdownController',
|
|
|
|
'PhabricatorCountdownEditController' => 'PhabricatorCountdownController',
|
2016-04-07 20:06:26 +02:00
|
|
|
'PhabricatorCountdownEditEngine' => 'PhabricatorEditEngine',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorCountdownEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-05-08 19:08:37 +02:00
|
|
|
'PhabricatorCountdownListController' => 'PhabricatorCountdownController',
|
2015-07-26 00:47:07 +02:00
|
|
|
'PhabricatorCountdownMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2013-07-22 23:42:25 +02:00
|
|
|
'PhabricatorCountdownQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorCountdownRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorCountdownReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
|
|
|
'PhabricatorCountdownSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-07-23 15:16:19 +02:00
|
|
|
'PhabricatorCountdownSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorCountdownTransaction' => 'PhabricatorApplicationTransaction',
|
2015-07-25 00:40:55 +02:00
|
|
|
'PhabricatorCountdownTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2015-07-22 22:35:34 +02:00
|
|
|
'PhabricatorCountdownTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2016-02-26 23:34:51 +01:00
|
|
|
'PhabricatorCountdownView' => 'AphrontView',
|
2011-06-13 01:06:17 +02:00
|
|
|
'PhabricatorCountdownViewController' => 'PhabricatorCountdownController',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorCredentialsUsedByObjectEdgeType' => 'PhabricatorEdgeType',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorCursorPagedPolicyAwareQuery' => 'PhabricatorPolicyAwareQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorCustomField' => 'Phobject',
|
|
|
|
'PhabricatorCustomFieldAttachment' => 'Phobject',
|
2013-06-07 21:36:18 +02:00
|
|
|
'PhabricatorCustomFieldConfigOptionType' => 'PhabricatorConfigOptionType',
|
Begin generalizing custom fields
Summary:
Ref T1703. We have currently have two custom field implementations (Maniphest, Differential) and are about to add a third (User, see D6122). I'd like to generalize custom fields before doing a third implementation, so we don't back ourselves into the ApplicationTransactions corner we have with Maniphest/Differential/Audit.
For the most part, the existing custom fields work well and can be directly generalized. There are three specific things I want to improve, though:
- Integration with ApplicationSearch: Custom fields aren't indexable. ApplicationSearch is now online and seems stable and good. D5278 provides a template for a backend which can integrate with ApplicationSearch, and ApplicationSearch solves many of the other UI problems implied by exposing custom fields into search (principally, giant pages full of query fields). Generally, I want to provide stronger builtin integration between custom fields and ApplicationSearch.
- Integration with ApplicationTransactions: Likewise, custom fields should support more native integrations with ApplicationTransactions, which are also online and seem stable and well designed.
- Selection and sorting: Selecting and sorting custom fields is a huge mess right now. I want to move this into config now that we have the UI to support it, and move away from requiring users to subclass a ton of stuff just to add a field.
For ApplicationSearch, I've adopted and generalized D5278.
For ApplicationTransactions, I haven't made any specific affordances yet.
For selection and sorting, I've partially implemented config-based selection and sorting. It will work like this:
- We add a new configuration value, like `differential.fields`. In the UI, this is a draggable list of supported fields. Fields can be reordered, and most fields can be disabled.
- We load every avialable field to populate this list. New fields will appear at the bottom.
- There are two downsides to this approach:
- If we add fields in the upstream at a later date, they will appear at the end of the list if an install has customized list order or disabled fields, even if we insert them elsewhere in the upstream.
- If we reorder fields in the upstream, the reordering will not be reflected in install which have customized the order/availability.
- I think these are both acceptable costs. We only incur them if an admin edits this config, which implies they'll know how to fix it if they want to.
- We can fix both of these problems with a straightforward configuration migration if we want to bother.
- There are numerous upsides to this approach:
- We can delete a bunch of code and replace it with simple configuration.
- In general, we don't need the "selector" classes anymore.
- Users can enable available-but-disabled fields with one click.
- Users can add fields by putting their implementations in `src/extensions/` with zero subclassing or libphutil stuff.
- Generally, it's super easy for users to understand.
This doesn't actually do anything yet and will probably see some adjustments before anything starts running it.
Test Plan: Static checks only, this code isn't reachable yet.
Reviewers: chad, seporaitis
Reviewed By: chad
CC: aran
Maniphest Tasks: T1703
Differential Revision: https://secure.phabricator.com/D6147
2013-06-06 23:52:40 +02:00
|
|
|
'PhabricatorCustomFieldDataNotAvailableException' => 'Exception',
|
2015-11-29 19:47:16 +01:00
|
|
|
'PhabricatorCustomFieldEditEngineExtension' => 'PhabricatorEditEngineExtension',
|
|
|
|
'PhabricatorCustomFieldEditField' => 'PhabricatorEditField',
|
|
|
|
'PhabricatorCustomFieldEditType' => 'PhabricatorEditType',
|
2015-12-21 15:31:31 +01:00
|
|
|
'PhabricatorCustomFieldFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension',
|
2015-07-06 22:15:58 +02:00
|
|
|
'PhabricatorCustomFieldHeraldField' => 'HeraldField',
|
2015-07-16 23:13:13 +02:00
|
|
|
'PhabricatorCustomFieldHeraldFieldGroup' => 'HeraldFieldGroup',
|
Begin generalizing custom fields
Summary:
Ref T1703. We have currently have two custom field implementations (Maniphest, Differential) and are about to add a third (User, see D6122). I'd like to generalize custom fields before doing a third implementation, so we don't back ourselves into the ApplicationTransactions corner we have with Maniphest/Differential/Audit.
For the most part, the existing custom fields work well and can be directly generalized. There are three specific things I want to improve, though:
- Integration with ApplicationSearch: Custom fields aren't indexable. ApplicationSearch is now online and seems stable and good. D5278 provides a template for a backend which can integrate with ApplicationSearch, and ApplicationSearch solves many of the other UI problems implied by exposing custom fields into search (principally, giant pages full of query fields). Generally, I want to provide stronger builtin integration between custom fields and ApplicationSearch.
- Integration with ApplicationTransactions: Likewise, custom fields should support more native integrations with ApplicationTransactions, which are also online and seem stable and well designed.
- Selection and sorting: Selecting and sorting custom fields is a huge mess right now. I want to move this into config now that we have the UI to support it, and move away from requiring users to subclass a ton of stuff just to add a field.
For ApplicationSearch, I've adopted and generalized D5278.
For ApplicationTransactions, I haven't made any specific affordances yet.
For selection and sorting, I've partially implemented config-based selection and sorting. It will work like this:
- We add a new configuration value, like `differential.fields`. In the UI, this is a draggable list of supported fields. Fields can be reordered, and most fields can be disabled.
- We load every avialable field to populate this list. New fields will appear at the bottom.
- There are two downsides to this approach:
- If we add fields in the upstream at a later date, they will appear at the end of the list if an install has customized list order or disabled fields, even if we insert them elsewhere in the upstream.
- If we reorder fields in the upstream, the reordering will not be reflected in install which have customized the order/availability.
- I think these are both acceptable costs. We only incur them if an admin edits this config, which implies they'll know how to fix it if they want to.
- We can fix both of these problems with a straightforward configuration migration if we want to bother.
- There are numerous upsides to this approach:
- We can delete a bunch of code and replace it with simple configuration.
- In general, we don't need the "selector" classes anymore.
- Users can enable available-but-disabled fields with one click.
- Users can add fields by putting their implementations in `src/extensions/` with zero subclassing or libphutil stuff.
- Generally, it's super easy for users to understand.
This doesn't actually do anything yet and will probably see some adjustments before anything starts running it.
Test Plan: Static checks only, this code isn't reachable yet.
Reviewers: chad, seporaitis
Reviewed By: chad
CC: aran
Maniphest Tasks: T1703
Differential Revision: https://secure.phabricator.com/D6147
2013-06-06 23:52:40 +02:00
|
|
|
'PhabricatorCustomFieldImplementationIncompleteException' => 'Exception',
|
|
|
|
'PhabricatorCustomFieldIndexStorage' => 'PhabricatorLiskDAO',
|
Support configuration-driven custom fields
Summary:
Ref T1702. Ref T3718. There are a couple of things going on here:
**PhabricatorCustomFieldList**: I added `PhabricatorCustomFieldList`, which is just a convenience class for dealing with lists of fields. Often, current field code does something like this inline in a Controller:
foreach ($fields as $field) {
// do some junk
}
Often, that junk has some slightly subtle implications. Move all of it to `$list->doSomeJunk()` methods (like `appendFieldsToForm()`, `loadFieldsFromStorage()`) to reduce code duplication and prevent errors. This additionally moves an existing list-convenience method there, out of `PhabricatorPropertyListView`.
**PhabricatorUserConfiguredCustomFieldStorage**: Adds `PhabricatorUserConfiguredCustomFieldStorage` for storing custom field data (like "ICQ Handle", "Phone Number", "Desk", "Favorite Flower", etc).
**Configuration-Driven Custom Fields**: Previously, I was thinking about doing these with interfaces, but as I thought about it more I started to dislike that approach. Instead, I built proxies into `PhabricatorCustomField`. Basically, this means that fields (like a custom, configuration-driven "Favorite Flower" field) can just use some other Field to actually provide their implementation (like a "standard" field which knows how to render text areas). The previous approach would have involed subclasssing the "standard" field and implementing an interface, but that would mean that every application would have at least two "base" fields and generally just seemed bleh as I worked through it.
The cost of this approach is that we need a bunch of `proxy` junk in the base class, but that's a one-time cost and I think it simplifies all the implementations and makes them a lot less magical (e.g., all of the custom fields now extend the right base field classes).
**Fixed Some Bugs**: Some of this code hadn't really been run yet and had minor bugs.
Test Plan:
{F54240}
{F54241}
{F54242}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1702, T1703, T3718
Differential Revision: https://secure.phabricator.com/D6749
2013-08-14 17:10:16 +02:00
|
|
|
'PhabricatorCustomFieldList' => 'Phobject',
|
Modularize parser for "Closes task X as Y"
Summary:
Ref T3886. Ref T3872. Ref T1812. We have several parsers which look for textual references to other objects, like:
Closes Tx.
Depends on Dy.
Reverts Dz.
Currently, these are pretty hard coded, don't get all the edge cases right, and don't generalize well. They're also implemented in the middle of Differential's field code. So I want to:
- Share more code so that, e.g., "Tx, Ty" always works (only some rules support it right now);
- fix bugs in the parser, like T3872;
- make this a modular, extensible process which runs against custom fields, not a builtin part of fields;
- make the internals more flexible to accommodate custom stuff like T1812.
This implements the "Verbs optional-noun Object, Optional Other Objects optional-as-something." grammar in a general way so subclasses can just plug in their keywords. Runtime code doesn't touch this yet.
Test Plan: Ran unit tests.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3872, T1812, T3886
Differential Revision: https://secure.phabricator.com/D8261
2014-02-18 00:53:47 +01:00
|
|
|
'PhabricatorCustomFieldMonogramParser' => 'Phobject',
|
2013-06-06 23:53:07 +02:00
|
|
|
'PhabricatorCustomFieldNotAttachedException' => 'Exception',
|
Support configuration-driven custom fields
Summary:
Ref T1702. Ref T3718. There are a couple of things going on here:
**PhabricatorCustomFieldList**: I added `PhabricatorCustomFieldList`, which is just a convenience class for dealing with lists of fields. Often, current field code does something like this inline in a Controller:
foreach ($fields as $field) {
// do some junk
}
Often, that junk has some slightly subtle implications. Move all of it to `$list->doSomeJunk()` methods (like `appendFieldsToForm()`, `loadFieldsFromStorage()`) to reduce code duplication and prevent errors. This additionally moves an existing list-convenience method there, out of `PhabricatorPropertyListView`.
**PhabricatorUserConfiguredCustomFieldStorage**: Adds `PhabricatorUserConfiguredCustomFieldStorage` for storing custom field data (like "ICQ Handle", "Phone Number", "Desk", "Favorite Flower", etc).
**Configuration-Driven Custom Fields**: Previously, I was thinking about doing these with interfaces, but as I thought about it more I started to dislike that approach. Instead, I built proxies into `PhabricatorCustomField`. Basically, this means that fields (like a custom, configuration-driven "Favorite Flower" field) can just use some other Field to actually provide their implementation (like a "standard" field which knows how to render text areas). The previous approach would have involed subclasssing the "standard" field and implementing an interface, but that would mean that every application would have at least two "base" fields and generally just seemed bleh as I worked through it.
The cost of this approach is that we need a bunch of `proxy` junk in the base class, but that's a one-time cost and I think it simplifies all the implementations and makes them a lot less magical (e.g., all of the custom fields now extend the right base field classes).
**Fixed Some Bugs**: Some of this code hadn't really been run yet and had minor bugs.
Test Plan:
{F54240}
{F54241}
{F54242}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1702, T1703, T3718
Differential Revision: https://secure.phabricator.com/D6749
2013-08-14 17:10:16 +02:00
|
|
|
'PhabricatorCustomFieldNotProxyException' => 'Exception',
|
Begin generalizing custom fields
Summary:
Ref T1703. We have currently have two custom field implementations (Maniphest, Differential) and are about to add a third (User, see D6122). I'd like to generalize custom fields before doing a third implementation, so we don't back ourselves into the ApplicationTransactions corner we have with Maniphest/Differential/Audit.
For the most part, the existing custom fields work well and can be directly generalized. There are three specific things I want to improve, though:
- Integration with ApplicationSearch: Custom fields aren't indexable. ApplicationSearch is now online and seems stable and good. D5278 provides a template for a backend which can integrate with ApplicationSearch, and ApplicationSearch solves many of the other UI problems implied by exposing custom fields into search (principally, giant pages full of query fields). Generally, I want to provide stronger builtin integration between custom fields and ApplicationSearch.
- Integration with ApplicationTransactions: Likewise, custom fields should support more native integrations with ApplicationTransactions, which are also online and seem stable and well designed.
- Selection and sorting: Selecting and sorting custom fields is a huge mess right now. I want to move this into config now that we have the UI to support it, and move away from requiring users to subclass a ton of stuff just to add a field.
For ApplicationSearch, I've adopted and generalized D5278.
For ApplicationTransactions, I haven't made any specific affordances yet.
For selection and sorting, I've partially implemented config-based selection and sorting. It will work like this:
- We add a new configuration value, like `differential.fields`. In the UI, this is a draggable list of supported fields. Fields can be reordered, and most fields can be disabled.
- We load every avialable field to populate this list. New fields will appear at the bottom.
- There are two downsides to this approach:
- If we add fields in the upstream at a later date, they will appear at the end of the list if an install has customized list order or disabled fields, even if we insert them elsewhere in the upstream.
- If we reorder fields in the upstream, the reordering will not be reflected in install which have customized the order/availability.
- I think these are both acceptable costs. We only incur them if an admin edits this config, which implies they'll know how to fix it if they want to.
- We can fix both of these problems with a straightforward configuration migration if we want to bother.
- There are numerous upsides to this approach:
- We can delete a bunch of code and replace it with simple configuration.
- In general, we don't need the "selector" classes anymore.
- Users can enable available-but-disabled fields with one click.
- Users can add fields by putting their implementations in `src/extensions/` with zero subclassing or libphutil stuff.
- Generally, it's super easy for users to understand.
This doesn't actually do anything yet and will probably see some adjustments before anything starts running it.
Test Plan: Static checks only, this code isn't reachable yet.
Reviewers: chad, seporaitis
Reviewed By: chad
CC: aran
Maniphest Tasks: T1703
Differential Revision: https://secure.phabricator.com/D6147
2013-06-06 23:52:40 +02:00
|
|
|
'PhabricatorCustomFieldNumericIndexStorage' => 'PhabricatorCustomFieldIndexStorage',
|
2015-12-13 01:25:51 +01:00
|
|
|
'PhabricatorCustomFieldSearchEngineExtension' => 'PhabricatorSearchEngineExtension',
|
Begin generalizing custom fields
Summary:
Ref T1703. We have currently have two custom field implementations (Maniphest, Differential) and are about to add a third (User, see D6122). I'd like to generalize custom fields before doing a third implementation, so we don't back ourselves into the ApplicationTransactions corner we have with Maniphest/Differential/Audit.
For the most part, the existing custom fields work well and can be directly generalized. There are three specific things I want to improve, though:
- Integration with ApplicationSearch: Custom fields aren't indexable. ApplicationSearch is now online and seems stable and good. D5278 provides a template for a backend which can integrate with ApplicationSearch, and ApplicationSearch solves many of the other UI problems implied by exposing custom fields into search (principally, giant pages full of query fields). Generally, I want to provide stronger builtin integration between custom fields and ApplicationSearch.
- Integration with ApplicationTransactions: Likewise, custom fields should support more native integrations with ApplicationTransactions, which are also online and seem stable and well designed.
- Selection and sorting: Selecting and sorting custom fields is a huge mess right now. I want to move this into config now that we have the UI to support it, and move away from requiring users to subclass a ton of stuff just to add a field.
For ApplicationSearch, I've adopted and generalized D5278.
For ApplicationTransactions, I haven't made any specific affordances yet.
For selection and sorting, I've partially implemented config-based selection and sorting. It will work like this:
- We add a new configuration value, like `differential.fields`. In the UI, this is a draggable list of supported fields. Fields can be reordered, and most fields can be disabled.
- We load every avialable field to populate this list. New fields will appear at the bottom.
- There are two downsides to this approach:
- If we add fields in the upstream at a later date, they will appear at the end of the list if an install has customized list order or disabled fields, even if we insert them elsewhere in the upstream.
- If we reorder fields in the upstream, the reordering will not be reflected in install which have customized the order/availability.
- I think these are both acceptable costs. We only incur them if an admin edits this config, which implies they'll know how to fix it if they want to.
- We can fix both of these problems with a straightforward configuration migration if we want to bother.
- There are numerous upsides to this approach:
- We can delete a bunch of code and replace it with simple configuration.
- In general, we don't need the "selector" classes anymore.
- Users can enable available-but-disabled fields with one click.
- Users can add fields by putting their implementations in `src/extensions/` with zero subclassing or libphutil stuff.
- Generally, it's super easy for users to understand.
This doesn't actually do anything yet and will probably see some adjustments before anything starts running it.
Test Plan: Static checks only, this code isn't reachable yet.
Reviewers: chad, seporaitis
Reviewed By: chad
CC: aran
Maniphest Tasks: T1703
Differential Revision: https://secure.phabricator.com/D6147
2013-06-06 23:52:40 +02:00
|
|
|
'PhabricatorCustomFieldStorage' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorCustomFieldStringIndexStorage' => 'PhabricatorCustomFieldIndexStorage',
|
2015-02-25 21:00:36 +01:00
|
|
|
'PhabricatorCustomHeaderConfigType' => 'PhabricatorConfigOptionType',
|
2011-03-07 07:29:22 +01:00
|
|
|
'PhabricatorDaemon' => 'PhutilDaemon',
|
2016-04-15 21:00:34 +02:00
|
|
|
'PhabricatorDaemonBulkJobController' => 'PhabricatorDaemonController',
|
|
|
|
'PhabricatorDaemonBulkJobListController' => 'PhabricatorDaemonBulkJobController',
|
|
|
|
'PhabricatorDaemonBulkJobMonitorController' => 'PhabricatorDaemonBulkJobController',
|
|
|
|
'PhabricatorDaemonBulkJobViewController' => 'PhabricatorDaemonBulkJobController',
|
2011-03-10 22:48:29 +01:00
|
|
|
'PhabricatorDaemonConsoleController' => 'PhabricatorDaemonController',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorDaemonContentSource' => 'PhabricatorContentSource',
|
2011-03-10 22:48:29 +01:00
|
|
|
'PhabricatorDaemonController' => 'PhabricatorController',
|
2011-03-15 21:38:14 +01:00
|
|
|
'PhabricatorDaemonDAO' => 'PhabricatorLiskDAO',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorDaemonEventListener' => 'PhabricatorEventListener',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorDaemonLog' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorDaemonDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-07-23 21:11:34 +02:00
|
|
|
),
|
2011-03-15 21:38:14 +01:00
|
|
|
'PhabricatorDaemonLogEvent' => 'PhabricatorDaemonDAO',
|
2014-06-18 00:33:08 +02:00
|
|
|
'PhabricatorDaemonLogEventGarbageCollector' => 'PhabricatorGarbageCollector',
|
2013-07-23 21:30:58 +02:00
|
|
|
'PhabricatorDaemonLogEventViewController' => 'PhabricatorDaemonController',
|
2011-05-03 02:05:22 +02:00
|
|
|
'PhabricatorDaemonLogEventsView' => 'AphrontView',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorDaemonLogGarbageCollector' => 'PhabricatorGarbageCollector',
|
2011-05-03 02:05:22 +02:00
|
|
|
'PhabricatorDaemonLogListController' => 'PhabricatorDaemonController',
|
|
|
|
'PhabricatorDaemonLogListView' => 'AphrontView',
|
2013-07-23 21:11:34 +02:00
|
|
|
'PhabricatorDaemonLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2011-03-15 21:38:14 +01:00
|
|
|
'PhabricatorDaemonLogViewController' => 'PhabricatorDaemonController',
|
2013-07-19 00:28:56 +02:00
|
|
|
'PhabricatorDaemonManagementDebugWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
|
|
|
'PhabricatorDaemonManagementLaunchWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
|
|
|
'PhabricatorDaemonManagementListWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
2013-07-23 21:48:45 +02:00
|
|
|
'PhabricatorDaemonManagementLogWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
2015-02-27 20:38:42 +01:00
|
|
|
'PhabricatorDaemonManagementReloadWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
2013-07-19 00:28:56 +02:00
|
|
|
'PhabricatorDaemonManagementRestartWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
|
|
|
'PhabricatorDaemonManagementStartWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
|
|
|
'PhabricatorDaemonManagementStatusWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
|
|
|
'PhabricatorDaemonManagementStopWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorDaemonManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-11-10 22:34:34 +01:00
|
|
|
'PhabricatorDaemonOverseerModule' => 'PhutilDaemonOverseerModule',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorDaemonReference' => 'Phobject',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorDaemonTaskGarbageCollector' => 'PhabricatorGarbageCollector',
|
2014-12-30 19:00:06 +01:00
|
|
|
'PhabricatorDaemonTasksTableView' => 'AphrontView',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDaemonsApplication' => 'PhabricatorApplication',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorDaemonsSetupCheck' => 'PhabricatorSetupCheck',
|
2015-01-20 01:54:23 +01:00
|
|
|
'PhabricatorDailyRoutineTriggerClock' => 'PhabricatorTriggerClock',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorDashboard' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorDashboardDAO',
|
2014-12-03 22:16:15 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
2015-07-18 21:19:17 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
2014-08-18 22:15:13 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
2015-07-21 21:01:19 +02:00
|
|
|
'PhabricatorProjectInterface',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
),
|
2014-04-30 23:28:55 +02:00
|
|
|
'PhabricatorDashboardAddPanelController' => 'PhabricatorDashboardController',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDashboardApplication' => 'PhabricatorApplication',
|
2015-12-09 21:17:03 +01:00
|
|
|
'PhabricatorDashboardArchiveController' => 'PhabricatorDashboardController',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardController' => 'PhabricatorController',
|
2014-06-13 06:49:19 +02:00
|
|
|
'PhabricatorDashboardCopyController' => 'PhabricatorDashboardController',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardDAO' => 'PhabricatorLiskDAO',
|
2015-01-02 00:11:59 +01:00
|
|
|
'PhabricatorDashboardDashboardHasPanelEdgeType' => 'PhabricatorEdgeType',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorDashboardDashboardPHIDType' => 'PhabricatorPHIDType',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardEditController' => 'PhabricatorDashboardController',
|
2014-05-20 01:09:31 +02:00
|
|
|
'PhabricatorDashboardInstall' => 'PhabricatorDashboardDAO',
|
|
|
|
'PhabricatorDashboardInstallController' => 'PhabricatorDashboardController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorDashboardLayoutConfig' => 'Phobject',
|
2014-05-08 19:08:37 +02:00
|
|
|
'PhabricatorDashboardListController' => 'PhabricatorDashboardController',
|
Make the default view of dashboards be just the dashboard
Summary: Fixes T4985, add manage page, change view page to show only panels. Arguably, PhabricatorDashboardArrangeController is no longer necessary. Also, still trying to figure out if I updated all flows that involve "arrange/{id}". Probably missed some. Also not sure of the Manage Dashboard icon. Please advise.
Test Plan: Create dashboard, add panels, "view/{id}" should show just panels, Manage Dashboard should show timeline and edit links.
Reviewers: #blessed_reviewers, epriestley, chad
Reviewed By: #blessed_reviewers, epriestley
Subscribers: epriestley, Korvin
Maniphest Tasks: T4985
Differential Revision: https://secure.phabricator.com/D9258
2014-05-22 19:59:46 +02:00
|
|
|
'PhabricatorDashboardManageController' => 'PhabricatorDashboardController',
|
2014-05-16 04:12:40 +02:00
|
|
|
'PhabricatorDashboardMovePanelController' => 'PhabricatorDashboardController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorDashboardPanel' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorDashboardDAO',
|
2014-12-03 22:16:15 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorCustomFieldInterface',
|
2015-07-18 21:19:17 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
2015-07-21 21:01:19 +02:00
|
|
|
'PhabricatorProjectInterface',
|
2014-08-18 22:15:13 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
2014-04-30 23:29:41 +02:00
|
|
|
),
|
2014-07-02 02:50:28 +02:00
|
|
|
'PhabricatorDashboardPanelArchiveController' => 'PhabricatorDashboardController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorDashboardPanelCoreCustomField' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorDashboardPanelCustomField',
|
|
|
|
'PhabricatorStandardCustomFieldInterface',
|
2014-02-03 19:52:15 +01:00
|
|
|
),
|
2014-04-30 23:29:41 +02:00
|
|
|
'PhabricatorDashboardPanelCustomField' => 'PhabricatorCustomField',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardPanelEditController' => 'PhabricatorDashboardController',
|
2015-01-02 00:11:59 +01:00
|
|
|
'PhabricatorDashboardPanelHasDashboardEdgeType' => 'PhabricatorEdgeType',
|
2014-05-08 19:08:37 +02:00
|
|
|
'PhabricatorDashboardPanelListController' => 'PhabricatorDashboardController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorDashboardPanelPHIDType' => 'PhabricatorPHIDType',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardPanelQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-04-30 23:28:37 +02:00
|
|
|
'PhabricatorDashboardPanelRenderController' => 'PhabricatorDashboardController',
|
|
|
|
'PhabricatorDashboardPanelRenderingEngine' => 'Phobject',
|
2014-06-12 22:22:20 +02:00
|
|
|
'PhabricatorDashboardPanelSearchApplicationCustomField' => 'PhabricatorStandardCustomField',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardPanelSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-06-16 21:27:12 +02:00
|
|
|
'PhabricatorDashboardPanelSearchQueryCustomField' => 'PhabricatorStandardCustomField',
|
2014-06-18 00:32:55 +02:00
|
|
|
'PhabricatorDashboardPanelTabsCustomField' => 'PhabricatorStandardCustomField',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardPanelTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorDashboardPanelTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhabricatorDashboardPanelTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-04-30 23:28:20 +02:00
|
|
|
'PhabricatorDashboardPanelType' => 'Phobject',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardPanelViewController' => 'PhabricatorDashboardController',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-01-04 20:32:07 +01:00
|
|
|
'PhabricatorDashboardQueryPanelType' => 'PhabricatorDashboardPanelType',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorDashboardRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2014-05-19 23:04:26 +02:00
|
|
|
'PhabricatorDashboardRemovePanelController' => 'PhabricatorDashboardController',
|
2014-04-30 23:29:14 +02:00
|
|
|
'PhabricatorDashboardRenderingEngine' => 'Phobject',
|
2014-09-18 20:15:38 +02:00
|
|
|
'PhabricatorDashboardSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
Add initial skeleton for Dashboard application
Summary:
Ref T3583. General idea here is:
- Users will be able to create `DashboardPanel`s, which are things like the jump nav, or a minifeed, or recent assigned tasks, or recent tokens given, or whatever else.
- The `DashboardPanel`s can be combined into `Dashboard`s, which select specific panels and arrange them in some layout (and maybe have a few other options eventually).
- Then, you'll be able to set a specific `Dashboard` for your home page, and maybe for project home pages. But you can also use `Dashboard`s on their own if you just like dashboards.
My plan is pretty much:
- Put in basic infrastructure for dashboards (this diff).
- Add basic create/edit (next few diffs).
- Once dashboards sort of work, do the homepage integration.
This diff does very little: you can't create dashboards or panels yet, and thus there are no dashboards to look at. This is all skeleton code, pretty much.
IMPORTANT: We need an icon bwahahahahaha
Test Plan:
omg si purrfect
{F106367}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T3583
Differential Revision: https://secure.phabricator.com/D8109
2014-01-30 20:43:24 +01:00
|
|
|
'PhabricatorDashboardSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-01-04 20:32:07 +01:00
|
|
|
'PhabricatorDashboardTabsPanelType' => 'PhabricatorDashboardPanelType',
|
|
|
|
'PhabricatorDashboardTextPanelType' => 'PhabricatorDashboardPanelType',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorDashboardTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhabricatorDashboardTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-05-20 01:09:31 +02:00
|
|
|
'PhabricatorDashboardUninstallController' => 'PhabricatorDashboardController',
|
2014-02-03 19:52:15 +01:00
|
|
|
'PhabricatorDashboardViewController' => 'PhabricatorDashboardController',
|
2015-04-07 23:38:03 +02:00
|
|
|
'PhabricatorDataCacheSpec' => 'PhabricatorCacheSpec',
|
2013-07-21 18:27:00 +02:00
|
|
|
'PhabricatorDataNotAttachedException' => 'Exception',
|
Automatically sever databases after prolonged unreachability
Summary:
Ref T4571. When a database goes down briefly, we fall back to replicas.
However, this fallback is slow (not good for users) and keeps sending a lot of traffic to the master (might be bad if the root cause is load-related).
Keep track of recent connections and fully degrade into "severed" mode if we see a sequence of failures over a reasonable period of time. In this mode, we send much less traffic to the master (faster for users; less load for the database).
We do send a little bit of traffic still, and if the master recovers we'll recover back into normal mode seeing several connections in a row succeed.
This is similar to what most load balancers do when pulling web servers in and out of pools.
For now, the specific numbers are:
- We do at most one health check every 3 seconds.
- If 5 checks in a row fail or succeed, we sever or un-sever the database (so it takes about 15 seconds to switch modes).
- If the database is currently marked unhealthy, we reduce timeouts and retries when connecting to it.
Test Plan:
- Configured a bad `master`.
- Browsed around for a bit, initially saw "unrechable master" errors.
- After about 15 seconds, saw "major interruption" errors instead.
- Fixed the config for `master`.
- Browsed around for a while longer.
- After about 15 seconds, things recovered.
- Used "Cluster Databases" console to keep an eye on health checks: it now shows how many recent health checks were good:
{F1213397}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4571
Differential Revision: https://secure.phabricator.com/D15677
2016-04-10 23:18:09 +02:00
|
|
|
'PhabricatorDatabaseHealthRecord' => 'Phobject',
|
2016-04-10 00:21:29 +02:00
|
|
|
'PhabricatorDatabaseRef' => 'Phobject',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorDatabaseSetupCheck' => 'PhabricatorSetupCheck',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorDatasourceEditField' => 'PhabricatorTokenizerEditField',
|
2015-12-04 18:30:53 +01:00
|
|
|
'PhabricatorDatasourceEditType' => 'PhabricatorPHIDListEditType',
|
2015-05-17 02:21:37 +02:00
|
|
|
'PhabricatorDateTimeSettingsPanel' => 'PhabricatorSettingsPanel',
|
2013-03-04 22:45:51 +01:00
|
|
|
'PhabricatorDebugController' => 'PhabricatorController',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorDefaultRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
|
2016-05-05 03:24:59 +02:00
|
|
|
'PhabricatorDefaultSyntaxStyle' => 'PhabricatorSyntaxStyle',
|
2015-06-22 22:11:37 +02:00
|
|
|
'PhabricatorDesktopNotificationsSettingsPanel' => 'PhabricatorSettingsPanel',
|
2014-05-02 03:23:31 +02:00
|
|
|
'PhabricatorDestructionEngine' => 'Phobject',
|
2015-12-20 16:44:03 +01:00
|
|
|
'PhabricatorDestructionEngineExtension' => 'Phobject',
|
|
|
|
'PhabricatorDestructionEngineExtensionModule' => 'PhabricatorConfigModule',
|
2013-01-01 23:09:17 +01:00
|
|
|
'PhabricatorDeveloperConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorDeveloperPreferencesSettingsPanel' => 'PhabricatorSettingsPanel',
|
2015-03-09 20:40:29 +01:00
|
|
|
'PhabricatorDiffInlineCommentQuery' => 'PhabricatorApplicationTransactionCommentQuery',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorDiffPreferencesSettingsPanel' => 'PhabricatorSettingsPanel',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorDifferenceEngine' => 'Phobject',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDifferentialApplication' => 'PhabricatorApplication',
|
2016-01-08 13:59:31 +01:00
|
|
|
'PhabricatorDifferentialAttachCommitWorkflow' => 'PhabricatorDifferentialManagementWorkflow',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorDifferentialConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2016-01-08 13:35:17 +01:00
|
|
|
'PhabricatorDifferentialExtractWorkflow' => 'PhabricatorDifferentialManagementWorkflow',
|
|
|
|
'PhabricatorDifferentialManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2013-05-06 23:11:26 +02:00
|
|
|
'PhabricatorDifferentialRevisionTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDiffusionApplication' => 'PhabricatorApplication',
|
2013-01-16 18:08:13 +01:00
|
|
|
'PhabricatorDiffusionConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-05-12 19:06:54 +02:00
|
|
|
'PhabricatorDisabledUserController' => 'PhabricatorAuthController',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorDisplayPreferencesSettingsPanel' => 'PhabricatorSettingsPanel',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorDisqusAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
2016-01-14 23:34:21 +01:00
|
|
|
'PhabricatorDividerProfilePanel' => 'PhabricatorProfilePanel',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDivinerApplication' => 'PhabricatorApplication',
|
|
|
|
'PhabricatorDoorkeeperApplication' => 'PhabricatorApplication',
|
2011-02-06 01:57:21 +01:00
|
|
|
'PhabricatorDraft' => 'PhabricatorDraftDAO',
|
|
|
|
'PhabricatorDraftDAO' => 'PhabricatorLiskDAO',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorDrydockApplication' => 'PhabricatorApplication',
|
Add an assocations-like "Edges" framework
Summary:
We have a lot of cases where we store object relationships, but it's all kind of messy and custom. Some particular problems:
- We go to great lengths to enforce order stability in Differential revisions, but the implementation is complex and inelegant.
- Some relationships are stored on-object, so we can't pull the inverses easily. For example, Maniphest shows child tasks but not parent tasks.
- I want to add more of these and don't want to continue building custom stuff.
- UIs like the "attach stuff to other stuff" UI need custom branches for each object type.
- Stuff like "allow commits to close tasks" is notrivial because of nonstandard metadata storage.
Provide an association-like "edge" framework to fix these problems. This is nearly identical to associations, with a few differences:
- I put edge metadata in a separate table and don't load it by default, to keep edge rows small and allow large metadata if necessary. The on-edge metadata seemed to get abused a lot at Facebook.
- I put a 'seq' column on the edges to ensure they have an explicit, stable ordering within a source and type.
This isn't actually used anywhere yet, but my first target is attaching commits to tasks for T904.
Test Plan: Made a mock page that used Editor and Query. Verified adding and removing edges, overwriting edges, writing and loading edge data, sequence number generation.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, 20after4
Differential Revision: https://secure.phabricator.com/D2088
2012-04-05 00:30:21 +02:00
|
|
|
'PhabricatorEdgeConfig' => 'PhabricatorEdgeConstants',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorEdgeConstants' => 'Phobject',
|
Allow edges to be configured to prevent cycles
Summary:
Certain types of things we should be storing in edges (notably, Task X depends on Task Y) should always be acyclic. Allow `PhabricatorEdgeEditor` to enforce this, since we can't correctly enforce it outside of the editor without being vulnerable to races.
Each edge type can be marked acyclic. If an edge type is acyclic, we perform additional steps when writing new edges of that type:
- We acquire a global lock on the edge type before performing any reads or writes. This ensures we can't produce a cycle as a result of a race where two edits add edges which independently do not produce a cycle, but do produce a cycle when combined.
- After performing writes but before committing transactions, we load the edge graph for each acyclic type and verify that it is, in fact, acyclic. If we detect cycles, we abort the edit.
- When we're done, we release the edge type locks.
This is a relatively high-complexity change, but gives us a simple way to flag an edge type as acyclic in a robust way.
Test Plan: Ran unit tests.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1162
Differential Revision: https://secure.phabricator.com/D2940
2012-07-09 19:39:38 +02:00
|
|
|
'PhabricatorEdgeCycleException' => 'Exception',
|
2015-12-04 18:30:53 +01:00
|
|
|
'PhabricatorEdgeEditType' => 'PhabricatorPHIDListEditType',
|
2014-07-18 00:41:42 +02:00
|
|
|
'PhabricatorEdgeEditor' => 'Phobject',
|
Allow edges to be configured to prevent cycles
Summary:
Certain types of things we should be storing in edges (notably, Task X depends on Task Y) should always be acyclic. Allow `PhabricatorEdgeEditor` to enforce this, since we can't correctly enforce it outside of the editor without being vulnerable to races.
Each edge type can be marked acyclic. If an edge type is acyclic, we perform additional steps when writing new edges of that type:
- We acquire a global lock on the edge type before performing any reads or writes. This ensures we can't produce a cycle as a result of a race where two edits add edges which independently do not produce a cycle, but do produce a cycle when combined.
- After performing writes but before committing transactions, we load the edge graph for each acyclic type and verify that it is, in fact, acyclic. If we detect cycles, we abort the edit.
- When we're done, we release the edge type locks.
This is a relatively high-complexity change, but gives us a simple way to flag an edge type as acyclic in a robust way.
Test Plan: Ran unit tests.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1162
Differential Revision: https://secure.phabricator.com/D2940
2012-07-09 19:39:38 +02:00
|
|
|
'PhabricatorEdgeGraph' => 'AbstractDirectedGraph',
|
Add an assocations-like "Edges" framework
Summary:
We have a lot of cases where we store object relationships, but it's all kind of messy and custom. Some particular problems:
- We go to great lengths to enforce order stability in Differential revisions, but the implementation is complex and inelegant.
- Some relationships are stored on-object, so we can't pull the inverses easily. For example, Maniphest shows child tasks but not parent tasks.
- I want to add more of these and don't want to continue building custom stuff.
- UIs like the "attach stuff to other stuff" UI need custom branches for each object type.
- Stuff like "allow commits to close tasks" is notrivial because of nonstandard metadata storage.
Provide an association-like "edge" framework to fix these problems. This is nearly identical to associations, with a few differences:
- I put edge metadata in a separate table and don't load it by default, to keep edge rows small and allow large metadata if necessary. The on-edge metadata seemed to get abused a lot at Facebook.
- I put a 'seq' column on the edges to ensure they have an explicit, stable ordering within a source and type.
This isn't actually used anywhere yet, but my first target is attaching commits to tasks for T904.
Test Plan: Made a mock page that used Editor and Query. Verified adding and removing edges, overwriting edges, writing and loading edge data, sequence number generation.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, 20after4
Differential Revision: https://secure.phabricator.com/D2088
2012-04-05 00:30:21 +02:00
|
|
|
'PhabricatorEdgeQuery' => 'PhabricatorQuery',
|
Allow edges to be configured to prevent cycles
Summary:
Certain types of things we should be storing in edges (notably, Task X depends on Task Y) should always be acyclic. Allow `PhabricatorEdgeEditor` to enforce this, since we can't correctly enforce it outside of the editor without being vulnerable to races.
Each edge type can be marked acyclic. If an edge type is acyclic, we perform additional steps when writing new edges of that type:
- We acquire a global lock on the edge type before performing any reads or writes. This ensures we can't produce a cycle as a result of a race where two edits add edges which independently do not produce a cycle, but do produce a cycle when combined.
- After performing writes but before committing transactions, we load the edge graph for each acyclic type and verify that it is, in fact, acyclic. If we detect cycles, we abort the edit.
- When we're done, we release the edge type locks.
This is a relatively high-complexity change, but gives us a simple way to flag an edge type as acyclic in a robust way.
Test Plan: Ran unit tests.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1162
Differential Revision: https://secure.phabricator.com/D2940
2012-07-09 19:39:38 +02:00
|
|
|
'PhabricatorEdgeTestCase' => 'PhabricatorTestCase',
|
2014-07-18 00:40:37 +02:00
|
|
|
'PhabricatorEdgeType' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorEdgeTypeTestCase' => 'PhabricatorTestCase',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorEdgesDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngine' => array(
|
|
|
|
'Phobject',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhabricatorEditEngineAPIMethod' => 'ConduitAPIMethod',
|
2016-04-06 14:59:09 +02:00
|
|
|
'PhabricatorEditEngineColumnsCommentAction' => 'PhabricatorEditEngineCommentAction',
|
2015-12-15 15:57:32 +01:00
|
|
|
'PhabricatorEditEngineCommentAction' => 'Phobject',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfiguration' => array(
|
|
|
|
'PhabricatorSearchDAO',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2015-11-19 23:16:44 +01:00
|
|
|
'PhabricatorEditEngineConfigurationDefaultCreateController' => 'PhabricatorEditEngineController',
|
2015-11-18 19:38:12 +01:00
|
|
|
'PhabricatorEditEngineConfigurationDefaultsController' => 'PhabricatorEditEngineController',
|
2015-11-19 23:16:44 +01:00
|
|
|
'PhabricatorEditEngineConfigurationDisableController' => 'PhabricatorEditEngineController',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfigurationEditController' => 'PhabricatorEditEngineController',
|
|
|
|
'PhabricatorEditEngineConfigurationEditEngine' => 'PhabricatorEditEngine',
|
|
|
|
'PhabricatorEditEngineConfigurationEditor' => 'PhabricatorApplicationTransactionEditor',
|
Allow EditEngine forms to be marked as "edit" forms
Summary:
Ref T9132. Ref T9908. This attempts to move us forward on answering this question:
> Which form gets used when a user clicks "Edit Task"?
One answer is "the same form that was used to create the task". There are several problems with that:
- The form might not exist anymore.
- The user might not have permission to see it.
- Some of the fields might be hidden, essentially preventing them from being edited.
- We have to store the value somewhere and old tasks won't have a value.
- Any instructions on the form probably don't apply to edits.
One answer is "force the default, full form". That's not as problematic, but it means we have no ability to create limited access users who see fewer fields.
The answer in this diff is:
- Forms can be marked as "edit forms".
- We take the user to the first edit form they have permission to see, from a master list.
This allows you to create several forms like:
- Advanced Edit Form (say, all fields -- visible to administrators).
- Basic Edit Form (say, no policies -- visible to trusted users).
- Noob Edit Form (say, no policies, priorities, or status -- visible to everyone).
Then you can give everyone access to "noob", some people access to "basic", and a few people access to "advanced".
This might only be part of the answer. In particular, you can still //use// any edit form you can see, so we could do these things in the future:
- Give you an option to switch to a different form if you want.
- Save the form the task was created with, and use that form by default.
If we do pursue those, we can fall back to this behavior if there's a problem with them (e.g., original form doesn't exist or wasn't recorded).
There's also no "reorder" UI yet, that'll be coming in the next diff.
I'm also going to try to probably make the "create" and "edit" stuff a little more consistent / less weird in a bit.
Test Plan: Marked various forms as edit forms or not edit forms, made edits, hit permissions errors, etc.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132, T9908
Differential Revision: https://secure.phabricator.com/D14702
2015-12-08 02:11:35 +01:00
|
|
|
'PhabricatorEditEngineConfigurationIsEditController' => 'PhabricatorEditEngineController',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfigurationListController' => 'PhabricatorEditEngineController',
|
2015-11-18 19:50:09 +01:00
|
|
|
'PhabricatorEditEngineConfigurationLockController' => 'PhabricatorEditEngineController',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfigurationPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorEditEngineConfigurationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-11-17 18:33:06 +01:00
|
|
|
'PhabricatorEditEngineConfigurationReorderController' => 'PhabricatorEditEngineController',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfigurationSaveController' => 'PhabricatorEditEngineController',
|
|
|
|
'PhabricatorEditEngineConfigurationSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-12-08 15:14:47 +01:00
|
|
|
'PhabricatorEditEngineConfigurationSortController' => 'PhabricatorEditEngineController',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineConfigurationTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorEditEngineConfigurationTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PhabricatorEditEngineConfigurationViewController' => 'PhabricatorEditEngineController',
|
|
|
|
'PhabricatorEditEngineController' => 'PhabricatorApplicationTransactionController',
|
2015-11-29 19:05:41 +01:00
|
|
|
'PhabricatorEditEngineExtension' => 'Phobject',
|
|
|
|
'PhabricatorEditEngineExtensionModule' => 'PhabricatorConfigModule',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineListController' => 'PhabricatorEditEngineController',
|
2016-02-09 00:24:52 +01:00
|
|
|
'PhabricatorEditEnginePointsCommentAction' => 'PhabricatorEditEngineCommentAction',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorEditEngineQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorEditEngineSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-12-15 15:57:32 +01:00
|
|
|
'PhabricatorEditEngineSelectCommentAction' => 'PhabricatorEditEngineCommentAction',
|
|
|
|
'PhabricatorEditEngineTokenizerCommentAction' => 'PhabricatorEditEngineCommentAction',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorEditField' => 'Phobject',
|
2016-05-02 14:35:05 +02:00
|
|
|
'PhabricatorEditPage' => 'Phobject',
|
2015-11-03 17:45:00 +01:00
|
|
|
'PhabricatorEditType' => 'Phobject',
|
2012-10-23 04:06:56 +02:00
|
|
|
'PhabricatorEditor' => 'Phobject',
|
2015-12-21 19:25:28 +01:00
|
|
|
'PhabricatorElasticFulltextStorageEngine' => 'PhabricatorFulltextStorageEngine',
|
2015-05-19 22:59:58 +02:00
|
|
|
'PhabricatorElasticSearchSetupCheck' => 'PhabricatorSetupCheck',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorEmailAddressesSettingsPanel' => 'PhabricatorSettingsPanel',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorEmailContentSource' => 'PhabricatorContentSource',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorEmailFormatSettingsPanel' => 'PhabricatorSettingsPanel',
|
2011-01-31 20:55:26 +01:00
|
|
|
'PhabricatorEmailLoginController' => 'PhabricatorAuthController',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorEmailPreferencesSettingsPanel' => 'PhabricatorSettingsPanel',
|
2013-07-11 03:53:09 +02:00
|
|
|
'PhabricatorEmailVerificationController' => 'PhabricatorAuthController',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorEmbedFileRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2014-09-29 17:31:00 +02:00
|
|
|
'PhabricatorEmojiRemarkupRule' => 'PhutilRemarkupRule',
|
2013-03-01 20:28:02 +01:00
|
|
|
'PhabricatorEmptyQueryException' => 'Exception',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorEnv' => 'Phobject',
|
2012-01-12 01:07:36 +01:00
|
|
|
'PhabricatorEnvTestCase' => 'PhabricatorTestCase',
|
2016-04-07 20:06:26 +02:00
|
|
|
'PhabricatorEpochEditField' => 'PhabricatorEditField',
|
2011-11-10 02:23:33 +01:00
|
|
|
'PhabricatorEvent' => 'PhutilEvent',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorEventEngine' => 'Phobject',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorEventListener' => 'PhutilEventListener',
|
2011-11-10 02:23:33 +01:00
|
|
|
'PhabricatorEventType' => 'PhutilEventType',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorExampleEventListener' => 'PhabricatorEventListener',
|
2016-01-21 13:25:38 +01:00
|
|
|
'PhabricatorExecFutureFileUploadSource' => 'PhabricatorFileUploadSource',
|
2013-01-03 00:52:30 +01:00
|
|
|
'PhabricatorExtendingPhabricatorConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorExtensionsSetupCheck' => 'PhabricatorSetupCheck',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorExternalAccount' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorUserDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-06-17 21:14:00 +02:00
|
|
|
),
|
|
|
|
'PhabricatorExternalAccountQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorExternalAccountsSettingsPanel' => 'PhabricatorSettingsPanel',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorExtraConfigSetupCheck' => 'PhabricatorSetupCheck',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorFacebookAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
2012-07-27 22:46:01 +02:00
|
|
|
'PhabricatorFactAggregate' => 'PhabricatorFactDAO',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorFactApplication' => 'PhabricatorApplication',
|
2012-07-30 19:44:08 +02:00
|
|
|
'PhabricatorFactChartController' => 'PhabricatorFactController',
|
2012-07-27 22:46:01 +02:00
|
|
|
'PhabricatorFactController' => 'PhabricatorController',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactCountEngine' => 'PhabricatorFactEngine',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorFactCursor' => 'PhabricatorFactDAO',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorFactDaemon' => 'PhabricatorDaemon',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorFactEngine' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorFactEngineTestCase' => 'PhabricatorTestCase',
|
2012-07-27 22:46:01 +02:00
|
|
|
'PhabricatorFactHomeController' => 'PhabricatorFactController',
|
|
|
|
'PhabricatorFactLastUpdatedEngine' => 'PhabricatorFactEngine',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactManagementAnalyzeWorkflow' => 'PhabricatorFactManagementWorkflow',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorFactManagementCursorsWorkflow' => 'PhabricatorFactManagementWorkflow',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactManagementDestroyWorkflow' => 'PhabricatorFactManagementWorkflow',
|
|
|
|
'PhabricatorFactManagementListWorkflow' => 'PhabricatorFactManagementWorkflow',
|
|
|
|
'PhabricatorFactManagementStatusWorkflow' => 'PhabricatorFactManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorFactManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactRaw' => 'PhabricatorFactDAO',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorFactSimpleSpec' => 'PhabricatorFactSpec',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorFactSpec' => 'Phobject',
|
Add a basic "fact" application
Summary:
Basic "Fact" application with some storage, part of a daemon, and a control binary.
= Goals =
The general idea is that we have various statistics we'd like to compute, like the frequency of image macros, reviewer responsiveness, task close rates, etc. Computing these on page load is expensive and messy. By building an ETL pipeline and running it in a daemon, we can precompute statistics and just pull them out of "stats" tables.
One way to do this is just to completely hard-code everything, e.g. have a daemon that runs every hour which issues a big-ass query and dumps results into a table per-fact or per fact-group. But this has a bunch of drawbacks: adding new stuff to the pipeline is a pain, various fact aggregators can't share much code, updates are slow and expensive, we can never build generic graphs on top of it, etc.
I'm hoping to build an ETL pipeline which is generic enough that we can use it for most things we're interested in without needing schema changes, and so that installs can use it also without needing schema changes, while still being specific enough that it's fast and we can build useful stuff on top of it. I'm not sure if this will actually work, but it would be cool if it does so I'm starting pretty generally and we'll see how far I get. I haven't built this exact sort of thing before so I might be way off.
I'm basing the whole thing on analyzing entire objects, not analyzing changes to objects. So each part of the pipeline is handed an object and told "analyze this", not handed a change. It pretty much deletes all the old data about that thing and then writes new data. I think this is simpler to implement and understand, and it protects us from all sorts of weird issues where we end up with some kind of garbage in the DB and have to wipe the whole thing.
= Facts =
The general idea is that we extract "facts" out of objects, and then the various view interfaces just report those facts. This change has on type of fact, a "raw fact", which is directly derived from an object. These facts are concerete and relate specifically to the object they are derived from. Some examples of such facts might be:
D123 has 9 comments.
D123 uses macro "psyduck" 15 times.
D123 adds 35 lines.
D123 has 5 files.
D123 has 1 object.
D123 has 1 object of type "DREV".
D123 was created at epoch timestamp 89812351235.
D123 was accepted by @alincoln at epoch timestamp 8397981839.
The fact storage looks like this:
<factType, objectPHID, objectA, valueX, valueY, epoch>
Currently, we supprot one optional secondary key (like a user PHID or macro PHID), two optional integer values, and an optional timestamp. We might add more later. Each fact type can use these fields if it wants. Some facts use them, others don't. For instance, this diff adds a "N:*" fact, which is just the count of total objects in the system. These facts just look like:
<"N:*", "PHID-xxxx-yyyy", ...>
...where all other fields are ignored. But some of the more complex facts might look like:
<"DREV:accept", "PHID-DREV-xxxx", "PHID-USER-yyyy", ..., ..., nnnn> # User 'yyyy' accepted at epoch 'nnnn'.
<"FILE:macro", "PHID-DREV-xxxx", "PHID-MACR-yyyy", 17, ..., ...> # Object 'xxxx' uses macro 'yyyy' 17 times.
Facts have no uniqueness constraints. For @vrana's reviewer responsiveness stuff, we can insert multiple rows for each reviewer, e.g.
<"DREV:reviewed", "PHID-DREV-xxxx", "PHID-USER-yyyy", nnnn, ..., mmmm> # User 'yyyy' reviewed revision 'xxxx' after 'nnnn' seconds at 'mmmm'.
The second value (valueY) is mostly because we need it if we sample anything (valueX = observed value, valueY = sample rate) but there might be other uses. We might need to add "objectB" at some point too -- currently we can't represent a fact like "User X used macro Y on revision Z", so it would be impossible to compute macro use rates //for a specific user// based on this schema. I think we can start here though and see how far we get.
= Aggregated Facts =
These aren't implemented yet, but the idea is that we can then take the "raw facts" and compute derived/aggregated/rollup facts based on the raw fact table. For example, the "count" fact can be aggregated to arrive at a count of all objects in the system. This stuff will live in a separate table which does have uniqueness constraints, and come in the next diff.
We might need some kind of time series facts too, not sure about that. I think most of our use cases today are covered by raw facts + aggregated facts.
Test Plan: Ran `bin/fact` commands and verified they seemed to do reasonable things.
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran, majak
Maniphest Tasks: T1562
Differential Revision: https://secure.phabricator.com/D3078
2012-07-27 22:34:21 +02:00
|
|
|
'PhabricatorFactUpdateIterator' => 'PhutilBufferedIterator',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorFaxContentSource' => 'PhabricatorContentSource',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorFeedApplication' => 'PhabricatorApplication',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorFeedBuilder' => 'Phobject',
|
2013-01-15 02:49:32 +01:00
|
|
|
'PhabricatorFeedConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-07-05 17:35:18 +02:00
|
|
|
'PhabricatorFeedController' => 'PhabricatorController',
|
|
|
|
'PhabricatorFeedDAO' => 'PhabricatorLiskDAO',
|
2013-07-13 02:04:02 +02:00
|
|
|
'PhabricatorFeedDetailController' => 'PhabricatorFeedController',
|
2014-05-08 17:24:47 +02:00
|
|
|
'PhabricatorFeedListController' => 'PhabricatorFeedController',
|
2013-06-26 01:29:47 +02:00
|
|
|
'PhabricatorFeedManagementRepublishWorkflow' => 'PhabricatorFeedManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorFeedManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorFeedQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-08-05 23:10:41 +02:00
|
|
|
'PhabricatorFeedSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-08-26 23:36:35 +02:00
|
|
|
'PhabricatorFeedStory' => array(
|
2015-06-15 10:02:26 +02:00
|
|
|
'Phobject',
|
2014-08-26 23:36:35 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorMarkupInterface',
|
|
|
|
),
|
2011-07-05 17:35:18 +02:00
|
|
|
'PhabricatorFeedStoryData' => 'PhabricatorFeedDAO',
|
2012-06-08 15:31:30 +02:00
|
|
|
'PhabricatorFeedStoryNotification' => 'PhabricatorFeedDAO',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorFeedStoryPublisher' => 'Phobject',
|
2011-07-05 17:35:18 +02:00
|
|
|
'PhabricatorFeedStoryReference' => 'PhabricatorFeedDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorFile' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorFileDAO',
|
2014-12-03 22:16:15 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-08-20 00:53:15 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
2012-10-31 17:57:46 +01:00
|
|
|
),
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorFileBundleLoader' => 'Phobject',
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'PhabricatorFileChunk' => array(
|
|
|
|
'PhabricatorFileDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
|
|
|
),
|
2015-03-14 16:29:30 +01:00
|
|
|
'PhabricatorFileChunkIterator' => array(
|
|
|
|
'Phobject',
|
|
|
|
'Iterator',
|
|
|
|
),
|
Add a chunking storage engine for files
Summary:
Ref T7149. This isn't complete and isn't active yet, but does basically work. I'll shore it up in the next few diffs.
The new workflow goes like this:
> Client, file.allocate(): I'd like to upload a file with length L, metadata M, and hash H.
Then the server returns `upload` (a boolean) and `filePHID` (a PHID). These mean:
| upload | filePHID | means |
|---|---|---|
| false | false | Server can't accept file.
| false | true | File data already known, file created from hash.
| true | false | Just upload normally.
| true | true | Query chunks to start or resume a chunked upload.
All but the last case are uninteresting and work like exising uploads with `file.uploadhash` (which we can eventually deprecate).
In the last case:
> Client, file.querychunks(): Give me a list of chunks that I should upload.
This returns all the chunks for the file. Chunks have a start byte, an end byte, and a "complete" flag to indicate that the server already has the data.
Then, the client fills in chunks by sending them:
> Client, file.uploadchunk(): Here is the data for one chunk.
This stuff doesn't work yet or has some caveats:
- I haven't tested resume much.
- Files need an "isPartial()" flag for partial uploads, and the UI needs to respect it.
- The JS client needs to become chunk-aware.
- Chunk size is set crazy low to make testing easier.
- Some debugging flags that I'll remove soon-ish.
- Downloading works, but still streams the whole file into memory.
- This storage engine is disabled by default (hardcoded as a unit test engine) because it's still sketchy.
- Need some code to remove the "isParital" flag when the last chunk is uploaded.
- Maybe do checksumming on chunks.
Test Plan:
- Hacked up `arc upload` (see next diff) to be chunk-aware and uploaded a readme in 18 32-byte chunks. Then downloaded it. Got the same file back that I uploaded.
- File UI now shows some basic chunk info for chunked files:
{F336434}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: joshuaspence, epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12060
2015-03-13 19:30:02 +01:00
|
|
|
'PhabricatorFileChunkQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-09-05 22:11:02 +02:00
|
|
|
'PhabricatorFileCommentController' => 'PhabricatorFileController',
|
2013-10-17 18:32:34 +02:00
|
|
|
'PhabricatorFileComposeController' => 'PhabricatorFileController',
|
2011-01-23 03:33:00 +01:00
|
|
|
'PhabricatorFileController' => 'PhabricatorController',
|
|
|
|
'PhabricatorFileDAO' => 'PhabricatorLiskDAO',
|
Move ALL files to serve from the alternate file domain, not just files without
"Content-Disposition: attachment"
Summary:
We currently serve some files off the primary domain (with "Content-Disposition:
attachment" + a CSRF check) and some files off the alternate domain (without
either).
This is not sufficient, because some UAs (like the iPad) ignore
"Content-Disposition: attachment". So there's an attack that goes like this:
- Alice uploads xss.html
- Alice says to Bob "hey download this file on your iPad"
- Bob clicks "Download" on Phabricator on his iPad, gets XSS'd.
NOTE: This removes the CSRF check for downloading files. The check is nice to
have but only raises the barrier to entry slightly. Between iPad / sniffing /
flash bytecode attacks, single-domain installs are simply insecure. We could
restore the check at some point in conjunction with a derived authentication
cookie (i.e., a mini-session-token which is only useful for downloading files),
but that's a lot of complexity to drop all at once.
(Because files are now authenticated only by knowing the PHID and secret key,
this also fixes the "no profile pictures in public feed while logged out"
issue.)
Test Plan: Viewed, info'd, and downloaded files
Reviewers: btrahan, arice, alok
Reviewed By: arice
CC: aran, epriestley
Maniphest Tasks: T843
Differential Revision: https://secure.phabricator.com/D1608
2012-02-14 23:52:27 +01:00
|
|
|
'PhabricatorFileDataController' => 'PhabricatorFileController',
|
2012-01-16 22:26:44 +01:00
|
|
|
'PhabricatorFileDeleteController' => 'PhabricatorFileController',
|
2011-05-22 20:55:10 +02:00
|
|
|
'PhabricatorFileDropUploadController' => 'PhabricatorFileController',
|
2014-08-02 23:45:50 +02:00
|
|
|
'PhabricatorFileEditController' => 'PhabricatorFileController',
|
2013-09-05 22:11:02 +02:00
|
|
|
'PhabricatorFileEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorFileFilePHIDType' => 'PhabricatorPHIDType',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorFileHasObjectEdgeType' => 'PhabricatorEdgeType',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorFileIconSetSelectController' => 'PhabricatorFileController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorFileImageMacro' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorFileDAO',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
2015-07-27 16:51:37 +02:00
|
|
|
'PhabricatorTokenReceiverInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
),
|
2015-05-12 15:16:18 +02:00
|
|
|
'PhabricatorFileImageTransform' => 'PhabricatorFileTransform',
|
Move ALL files to serve from the alternate file domain, not just files without
"Content-Disposition: attachment"
Summary:
We currently serve some files off the primary domain (with "Content-Disposition:
attachment" + a CSRF check) and some files off the alternate domain (without
either).
This is not sufficient, because some UAs (like the iPad) ignore
"Content-Disposition: attachment". So there's an attack that goes like this:
- Alice uploads xss.html
- Alice says to Bob "hey download this file on your iPad"
- Bob clicks "Download" on Phabricator on his iPad, gets XSS'd.
NOTE: This removes the CSRF check for downloading files. The check is nice to
have but only raises the barrier to entry slightly. Between iPad / sniffing /
flash bytecode attacks, single-domain installs are simply insecure. We could
restore the check at some point in conjunction with a derived authentication
cookie (i.e., a mini-session-token which is only useful for downloading files),
but that's a lot of complexity to drop all at once.
(Because files are now authenticated only by knowing the PHID and secret key,
this also fixes the "no profile pictures in public feed while logged out"
issue.)
Test Plan: Viewed, info'd, and downloaded files
Reviewers: btrahan, arice, alok
Reviewed By: arice
CC: aran, epriestley
Maniphest Tasks: T843
Differential Revision: https://secure.phabricator.com/D1608
2012-02-14 23:52:27 +01:00
|
|
|
'PhabricatorFileInfoController' => 'PhabricatorFileController',
|
2012-10-23 04:06:56 +02:00
|
|
|
'PhabricatorFileLinkView' => 'AphrontView',
|
2014-05-08 19:08:37 +02:00
|
|
|
'PhabricatorFileListController' => 'PhabricatorFileController',
|
2012-10-31 17:57:46 +01:00
|
|
|
'PhabricatorFileQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-09-19 14:44:40 +02:00
|
|
|
'PhabricatorFileSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-05-31 19:51:05 +02:00
|
|
|
'PhabricatorFileSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2011-01-23 03:33:00 +01:00
|
|
|
'PhabricatorFileStorageBlob' => 'PhabricatorFileDAO',
|
2012-05-30 23:26:29 +02:00
|
|
|
'PhabricatorFileStorageConfigurationException' => 'Exception',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorFileStorageEngine' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorFileStorageEngineTestCase' => 'PhabricatorTestCase',
|
2014-01-15 19:02:31 +01:00
|
|
|
'PhabricatorFileTemporaryGarbageCollector' => 'PhabricatorGarbageCollector',
|
2013-02-06 22:37:42 +01:00
|
|
|
'PhabricatorFileTestCase' => 'PhabricatorTestCase',
|
2013-05-06 19:30:24 +02:00
|
|
|
'PhabricatorFileTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2015-05-12 15:16:18 +02:00
|
|
|
'PhabricatorFileThumbnailTransform' => 'PhabricatorFileImageTransform',
|
2013-09-05 22:11:02 +02:00
|
|
|
'PhabricatorFileTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorFileTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'PhabricatorFileTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-05-12 15:16:18 +02:00
|
|
|
'PhabricatorFileTransform' => 'Phobject',
|
2011-05-22 23:40:51 +02:00
|
|
|
'PhabricatorFileTransformController' => 'PhabricatorFileController',
|
2015-05-12 15:16:18 +02:00
|
|
|
'PhabricatorFileTransformListController' => 'PhabricatorFileController',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorFileTransformTestCase' => 'PhabricatorTestCase',
|
2011-01-23 03:33:00 +01:00
|
|
|
'PhabricatorFileUploadController' => 'PhabricatorFileController',
|
2013-05-26 22:45:24 +02:00
|
|
|
'PhabricatorFileUploadDialogController' => 'PhabricatorFileController',
|
2012-05-30 23:26:29 +02:00
|
|
|
'PhabricatorFileUploadException' => 'Exception',
|
2016-01-21 13:25:38 +01:00
|
|
|
'PhabricatorFileUploadSource' => 'Phobject',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorFileinfoSetupCheck' => 'PhabricatorSetupCheck',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorFilesApplication' => 'PhabricatorApplication',
|
2015-03-12 21:28:53 +01:00
|
|
|
'PhabricatorFilesApplicationStorageEnginePanel' => 'PhabricatorApplicationConfigurationPanel',
|
2016-01-18 21:58:19 +01:00
|
|
|
'PhabricatorFilesBuiltinFile' => 'Phobject',
|
|
|
|
'PhabricatorFilesComposeIconBuiltinFile' => 'PhabricatorFilesBuiltinFile',
|
2013-01-14 02:01:00 +01:00
|
|
|
'PhabricatorFilesConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-03-13 19:30:13 +01:00
|
|
|
'PhabricatorFilesManagementCatWorkflow' => 'PhabricatorFilesManagementWorkflow',
|
2014-08-21 20:47:59 +02:00
|
|
|
'PhabricatorFilesManagementCompactWorkflow' => 'PhabricatorFilesManagementWorkflow',
|
2012-10-25 20:36:38 +02:00
|
|
|
'PhabricatorFilesManagementEnginesWorkflow' => 'PhabricatorFilesManagementWorkflow',
|
|
|
|
'PhabricatorFilesManagementMigrateWorkflow' => 'PhabricatorFilesManagementWorkflow',
|
2013-05-29 15:28:57 +02:00
|
|
|
'PhabricatorFilesManagementPurgeWorkflow' => 'PhabricatorFilesManagementWorkflow',
|
2013-05-17 19:00:31 +02:00
|
|
|
'PhabricatorFilesManagementRebuildWorkflow' => 'PhabricatorFilesManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorFilesManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2016-01-18 21:58:19 +01:00
|
|
|
'PhabricatorFilesOnDiskBuiltinFile' => 'PhabricatorFilesBuiltinFile',
|
2015-03-26 19:11:52 +01:00
|
|
|
'PhabricatorFilesOutboundRequestAction' => 'PhabricatorSystemAction',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorFlag' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorFlagDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-08-14 01:17:42 +02:00
|
|
|
),
|
2015-07-18 14:54:26 +02:00
|
|
|
'PhabricatorFlagAddFlagHeraldAction' => 'HeraldAction',
|
2012-03-28 01:22:40 +02:00
|
|
|
'PhabricatorFlagColor' => 'PhabricatorFlagConstants',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorFlagConstants' => 'Phobject',
|
2012-03-28 01:22:40 +02:00
|
|
|
'PhabricatorFlagController' => 'PhabricatorController',
|
|
|
|
'PhabricatorFlagDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorFlagDeleteController' => 'PhabricatorFlagController',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorFlagDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension',
|
2012-03-28 01:22:40 +02:00
|
|
|
'PhabricatorFlagEditController' => 'PhabricatorFlagController',
|
2014-05-08 19:08:37 +02:00
|
|
|
'PhabricatorFlagListController' => 'PhabricatorFlagController',
|
2013-08-14 01:17:42 +02:00
|
|
|
'PhabricatorFlagQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-08-14 01:27:26 +02:00
|
|
|
'PhabricatorFlagSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'PhabricatorFlagSelectControl' => 'AphrontFormControl',
|
2013-10-26 00:58:17 +02:00
|
|
|
'PhabricatorFlaggableInterface' => 'PhabricatorPHIDInterface',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorFlagsApplication' => 'PhabricatorApplication',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorFlagsUIEventListener' => 'PhabricatorEventListener',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextEngine' => 'Phobject',
|
2015-12-21 15:31:31 +01:00
|
|
|
'PhabricatorFulltextEngineExtension' => 'Phobject',
|
|
|
|
'PhabricatorFulltextEngineExtensionModule' => 'PhabricatorConfigModule',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextIndexEngineExtension' => 'PhabricatorIndexEngineExtension',
|
2015-12-21 19:25:28 +01:00
|
|
|
'PhabricatorFulltextStorageEngine' => 'Phobject',
|
Scaffolding for Fund
Summary:
Ref T5835. This is all pretty boilerplate, and does not interact with Phortune at all yet.
You can create "Initiatives", which have a title and description, and support most of the expected infrastructure (policies, transactions, mentions, edges, appsearch, remakrup, etc).
Only notable decisions:
- Initiatives have an explicit owner. I think it's good to have a single clearly-responsible user behind an initiative.
- I think that's it?
Test Plan:
- Created an initiative.
- Edited an initiative.
- Changed application policy defaults.
- Searched for initiatives.
- Subscribed to an initiative.
- Opened/closed an initiative.
- Used `I123` and `{I123}` in remarkup.
- Destroyed an initiative.
Reviewers: chad, btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5835
Differential Revision: https://secure.phabricator.com/D10481
2014-09-11 22:38:58 +02:00
|
|
|
'PhabricatorFundApplication' => 'PhabricatorApplication',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorGDSetupCheck' => 'PhabricatorSetupCheck',
|
2014-01-15 19:02:24 +01:00
|
|
|
'PhabricatorGarbageCollector' => 'Phobject',
|
2015-10-02 18:17:24 +02:00
|
|
|
'PhabricatorGarbageCollectorManagementCollectWorkflow' => 'PhabricatorGarbageCollectorManagementWorkflow',
|
|
|
|
'PhabricatorGarbageCollectorManagementSetPolicyWorkflow' => 'PhabricatorGarbageCollectorManagementWorkflow',
|
|
|
|
'PhabricatorGarbageCollectorManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorGestureUIExample' => 'PhabricatorUIExample',
|
2014-01-17 00:31:52 +01:00
|
|
|
'PhabricatorGitGraphStream' => 'PhabricatorRepositoryGraphStream',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorGitHubAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
2012-06-27 22:59:12 +02:00
|
|
|
'PhabricatorGlobalLock' => 'PhutilLock',
|
Modernize file uploads
Summary:
Modernizes file uploads. In particular:
- Adds a mobile menu, with an "Upload File" item.
- Adds crumbs to the list view, detail view and upload view.
- Adds "Upload File" action to crumbs.
- Moves upload file to a separate page.
- Removes the combined upload file + recent files page.
- Makes upload file use a normal file control by default (works on mobile).
- Home page, file list and file upload page are now global drop targets which accept files dropped anywhere on them. Dragging a file into the window shows a mask and an instructional message.
- User education on this is a little weak but I think that's a big can of worms?
- Fixes a bug where dropping multiple files into a Remarkup text area produced bad results (resolves T2190).
T879 is related, although it's specifically about Maniphest. I've declined to make global drop targets yet there because there are multiple drop targets on the page with different meanings. That UI needs updating in general.
@chad, do we have an "upload" icon (counterpart to "download")?
Test Plan: Uploaded files in Maniphest, Differential, Files, and from Home. Dragged and dropped multiple files into Differential. Used crumbs, mobile.
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2190
Differential Revision: https://secure.phabricator.com/D4200
2012-12-17 01:34:01 +01:00
|
|
|
'PhabricatorGlobalUploadTargetView' => 'AphrontView',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorGoogleAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
2015-11-04 14:05:10 +01:00
|
|
|
'PhabricatorHTTPParameterTypeTableView' => 'AphrontView',
|
2015-03-30 03:22:27 +02:00
|
|
|
'PhabricatorHandleList' => array(
|
|
|
|
'Phobject',
|
|
|
|
'Iterator',
|
|
|
|
'ArrayAccess',
|
|
|
|
'Countable',
|
|
|
|
),
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorHandleObjectSelectorDataView' => 'Phobject',
|
2015-03-30 03:22:27 +02:00
|
|
|
'PhabricatorHandlePool' => 'Phobject',
|
|
|
|
'PhabricatorHandlePoolTestCase' => 'PhabricatorTestCase',
|
2013-07-21 16:03:10 +02:00
|
|
|
'PhabricatorHandleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2016-03-17 21:24:03 +01:00
|
|
|
'PhabricatorHandleRemarkupRule' => 'PhutilRemarkupRule',
|
2015-12-08 16:54:01 +01:00
|
|
|
'PhabricatorHandlesEditField' => 'PhabricatorPHIDListEditField',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorHarbormasterApplication' => 'PhabricatorApplication',
|
2013-11-09 03:09:03 +01:00
|
|
|
'PhabricatorHarbormasterConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-04-02 22:42:22 +02:00
|
|
|
'PhabricatorHash' => 'Phobject',
|
2012-12-21 14:43:33 +01:00
|
|
|
'PhabricatorHashTestCase' => 'PhabricatorTestCase',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorHelpApplication' => 'PhabricatorApplication',
|
2011-05-28 20:36:00 +02:00
|
|
|
'PhabricatorHelpController' => 'PhabricatorController',
|
2015-04-01 17:13:12 +02:00
|
|
|
'PhabricatorHelpDocumentationController' => 'PhabricatorHelpController',
|
2014-03-17 21:00:37 +01:00
|
|
|
'PhabricatorHelpEditorProtocolController' => 'PhabricatorHelpController',
|
2011-05-28 20:36:00 +02:00
|
|
|
'PhabricatorHelpKeyboardShortcutController' => 'PhabricatorHelpController',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PhabricatorHelpMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorHeraldApplication' => 'PhabricatorApplication',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorHeraldContentSource' => 'PhabricatorContentSource',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorHighSecurityRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorHomeApplication' => 'PhabricatorApplication',
|
2014-01-26 21:26:13 +01:00
|
|
|
'PhabricatorHomeController' => 'PhabricatorController',
|
|
|
|
'PhabricatorHomeMainController' => 'PhabricatorHomeController',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorHomePreferencesSettingsPanel' => 'PhabricatorSettingsPanel',
|
2014-01-29 05:18:01 +01:00
|
|
|
'PhabricatorHomeQuickCreateController' => 'PhabricatorHomeController',
|
2015-12-24 20:20:18 +01:00
|
|
|
'PhabricatorHovercardEngineExtension' => 'Phobject',
|
|
|
|
'PhabricatorHovercardEngineExtensionModule' => 'PhabricatorConfigModule',
|
2014-05-25 18:54:12 +02:00
|
|
|
'PhabricatorHunksManagementMigrateWorkflow' => 'PhabricatorHunksManagementWorkflow',
|
|
|
|
'PhabricatorHunksManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-12-13 19:11:40 +01:00
|
|
|
'PhabricatorIDsSearchEngineExtension' => 'PhabricatorSearchEngineExtension',
|
|
|
|
'PhabricatorIDsSearchField' => 'PhabricatorSearchField',
|
2015-05-18 00:20:11 +02:00
|
|
|
'PhabricatorIRCProtocolAdapter' => 'PhabricatorProtocolAdapter',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorIconRemarkupRule' => 'PhutilRemarkupRule',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorIconSet' => 'Phobject',
|
2015-12-27 15:45:53 +01:00
|
|
|
'PhabricatorIconSetEditField' => 'PhabricatorEditField',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorIconSetIcon' => 'Phobject',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorImageMacroRemarkupRule' => 'PhutilRemarkupRule',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorImageTransformer' => 'Phobject',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorImagemagickSetupCheck' => 'PhabricatorSetupCheck',
|
2015-12-20 17:54:29 +01:00
|
|
|
'PhabricatorIndexEngine' => 'Phobject',
|
2015-12-21 15:07:41 +01:00
|
|
|
'PhabricatorIndexEngineExtension' => 'Phobject',
|
|
|
|
'PhabricatorIndexEngineExtensionModule' => 'PhabricatorConfigModule',
|
2011-10-20 03:26:21 +02:00
|
|
|
'PhabricatorInfrastructureTestCase' => 'PhabricatorTestCase',
|
Add inline comments to Diffusion/Audit
Summary:
- Add inline comments to Audits, like Differential.
- Creates new storage for the comments in the Audits database.
- Creates a new PhabricatorAuditInlineComment class, similar to DifferentialInlineComment.
- Defines an Interface which Differential and Audit comments conform to.
- Makes consumers of DifferentialInlineComments consume objects which implement that interface instead.
- Adds save
NOTE: Some features are still missing! Wanted to cut this off before it got crazy:
- Inline comments aren't shown in the main comment list.
- Inline comments aren't shown in the emails.
- Inline comments aren't previewed.
I'll followup with those but this was getting pretty big.
@vrana, does the SQL change look correct?
Test Plan:
- Created, edited, deleted, replied to, reloaded and saved inline comments in Diffusion, on the left and right side of diffs.
- Created, edited, deleted, replied to, reloaded and saved inline comments in Differentila, on the left and right side of primary and diff-versus-diff diffs.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran, epriestley
Maniphest Tasks: T904
Differential Revision: https://secure.phabricator.com/D1898
2012-03-14 20:56:01 +01:00
|
|
|
'PhabricatorInlineCommentController' => 'PhabricatorController',
|
2012-10-24 02:34:43 +02:00
|
|
|
'PhabricatorInlineCommentInterface' => 'PhabricatorMarkupInterface',
|
2012-07-23 20:01:28 +02:00
|
|
|
'PhabricatorInlineCommentPreviewController' => 'PhabricatorController',
|
2012-03-20 03:45:16 +01:00
|
|
|
'PhabricatorInlineSummaryView' => 'AphrontView',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorInstructionsEditField' => 'PhabricatorEditField',
|
2014-02-05 20:02:41 +01:00
|
|
|
'PhabricatorInternationalizationManagementExtractWorkflow' => 'PhabricatorInternationalizationManagementWorkflow',
|
|
|
|
'PhabricatorInternationalizationManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorInvalidConfigSetupCheck' => 'PhabricatorSetupCheck',
|
2014-02-18 18:31:30 +01:00
|
|
|
'PhabricatorIteratedMD5PasswordHasher' => 'PhabricatorPasswordHasher',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorIteratedMD5PasswordHasherTestCase' => 'PhabricatorTestCase',
|
2016-03-18 14:22:37 +01:00
|
|
|
'PhabricatorIteratorFileUploadSource' => 'PhabricatorFileUploadSource',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorJIRAAuthProvider' => 'PhabricatorOAuth1AuthProvider',
|
Bring Javelin into Phabricator via git submodule, not copy-and-paste
Summary:
Javelin is currently embedded in Phabricator via copy-and-paste of prebuilt
packages. This is not so great.
Pull it in as a submodule instead and make all the Phabriator resources declare
proper dependency trees. Add Javelin linting.
Test Plan:
I tried to run through pretty much all the JS functionality on the site. This is
still a high-risk change, but I did a pretty thorough test
Differential: inline comments, revealing diffs, list tokenizers, comment
preview, editing/deleting comments, add review action.
Maniphest: list tokenizer, comment actions
Herald: rule editing, tokenizers, add/remove rows
Reviewed By: tomo
Reviewers: aran, tomo, mroch, jungejason, tuomaspelkonen
CC: aran, tomo, epriestley
Differential Revision: 223
2011-05-04 00:11:55 +02:00
|
|
|
'PhabricatorJavelinLinter' => 'ArcanistLinter',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorJiraIssueHasObjectEdgeType' => 'PhabricatorEdgeType',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorJumpNavHandler' => 'Phobject',
|
Implement a more compact, general database-backed key-value cache
Summary:
See discussion in D4204. Facebook currently has a 314MB remarkup cache with a 55MB index, which is slow to access. Under the theory that this is an index size/quality problem (the current index is on a potentially-384-byte field, with many keys sharing prefixes), provide a more general index with fancy new features:
- It implements PhutilKeyValueCache, so it can be a component in cache stacks and supports TTL.
- It has a 12-byte hash-based key.
- It automatically compresses large blocks of data (most of what we store is highly-compressible HTML).
Test Plan:
- Basics:
- Loaded /paste/, saw caches generate and save.
- Reloaded /paste/, saw the page hit cache.
- GC:
- Ran GC daemon, saw nothing.
- Set maximum lifetime to 1 second, ran GC daemon, saw it collect the entire cache.
- Deflate:
- Selected row formats from the database, saw a mixture of 'raw' and 'deflate' storage.
- Used profiler to verify that 'deflate' is fast (12 calls @ 220us on my paste list).
- Ran unit tests
Reviewers: vrana, btrahan
Reviewed By: vrana
CC: aran
Differential Revision: https://secure.phabricator.com/D4259
2012-12-21 23:17:56 +01:00
|
|
|
'PhabricatorKeyValueDatabaseCache' => 'PhutilKeyValueCache',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorLDAPAuthProvider' => 'PhabricatorAuthProvider',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorLegalpadApplication' => 'PhabricatorApplication',
|
2013-07-04 01:37:05 +02:00
|
|
|
'PhabricatorLegalpadConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorLegalpadDocumentPHIDType' => 'PhabricatorPHIDType',
|
2015-01-03 13:48:19 +01:00
|
|
|
'PhabricatorLegalpadSignaturePolicyRule' => 'PhabricatorPolicyRule',
|
2015-01-06 21:38:08 +01:00
|
|
|
'PhabricatorLibraryTestCase' => 'PhutilLibraryTestCase',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorLinkProfilePanel' => 'PhabricatorProfilePanel',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorLipsumArtist' => 'Phobject',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorLipsumContentSource' => 'PhabricatorContentSource',
|
2013-04-12 23:07:15 +02:00
|
|
|
'PhabricatorLipsumGenerateWorkflow' => 'PhabricatorLipsumManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorLipsumManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2013-04-16 17:19:45 +02:00
|
|
|
'PhabricatorLipsumMondrianArtist' => 'PhabricatorLipsumArtist',
|
2011-01-23 02:48:55 +01:00
|
|
|
'PhabricatorLiskDAO' => 'LiskDAO',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorLiskFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorLiskSearchEngineExtension' => 'PhabricatorSearchEngineExtension',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorLiskSerializer' => 'Phobject',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorListFilterUIExample' => 'PhabricatorUIExample',
|
2011-07-20 07:48:38 +02:00
|
|
|
'PhabricatorLocalDiskFileStorageEngine' => 'PhabricatorFileStorageEngine',
|
Improve time localization code
Summary:
- We throw on a missing date right now, in the DateTime constructor. This can
happen in reasonable cases and this is display code, so handle it more
gracefully (see T520).
- This stuff is a little slow and we sometimes render many hundreds of dates
per page. I've been seeing it in profiles on and off. Memoize timezones to
improve performance.
- Some minor code duplication that would have become less-minor with the
constructor change, consolidate the logic.
- Add some unit tests and a little documentation.
Test Plan:
- Ran unit tests.
- Profiled 1,000 calls to phabricator_datetime(), cost dropped from ~49ms to
~19ms with addition of memoization. This is still slower than I'd like but I
don't think there's an easy way to squeeze it down further.
Reviewers: ajtrichards, jungejason, nh, tuomaspelkonen, aran
Reviewed By: ajtrichards
CC: aran, ajtrichards, epriestley
Differential Revision: 966
2011-09-27 18:03:55 +02:00
|
|
|
'PhabricatorLocalTimeTestCase' => 'PhabricatorTestCase',
|
2015-06-03 19:49:27 +02:00
|
|
|
'PhabricatorLocaleScopeGuard' => 'Phobject',
|
|
|
|
'PhabricatorLocaleScopeGuardTestCase' => 'PhabricatorTestCase',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorLogTriggerAction' => 'PhabricatorTriggerAction',
|
2011-01-31 03:52:29 +01:00
|
|
|
'PhabricatorLogoutController' => 'PhabricatorAuthController',
|
2015-01-03 13:48:19 +01:00
|
|
|
'PhabricatorLunarPhasePolicyRule' => 'PhabricatorPolicyRule',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorMacroApplication' => 'PhabricatorApplication',
|
2013-09-28 01:01:37 +02:00
|
|
|
'PhabricatorMacroAudioController' => 'PhabricatorMacroController',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorMacroCommentController' => 'PhabricatorMacroController',
|
2013-01-16 19:52:30 +01:00
|
|
|
'PhabricatorMacroConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2012-10-01 23:04:03 +02:00
|
|
|
'PhabricatorMacroController' => 'PhabricatorController',
|
2014-07-11 01:18:15 +02:00
|
|
|
'PhabricatorMacroDatasource' => 'PhabricatorTypeaheadDatasource',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorMacroDisableController' => 'PhabricatorMacroController',
|
2012-10-01 23:04:03 +02:00
|
|
|
'PhabricatorMacroEditController' => 'PhabricatorMacroController',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorMacroEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-05-09 21:25:52 +02:00
|
|
|
'PhabricatorMacroListController' => 'PhabricatorMacroController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorMacroMacroPHIDType' => 'PhabricatorPHIDType',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorMacroMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhabricatorMacroManageCapability' => 'PhabricatorPolicyCapability',
|
2013-01-20 03:43:35 +01:00
|
|
|
'PhabricatorMacroMemeController' => 'PhabricatorMacroController',
|
2013-01-22 03:46:04 +01:00
|
|
|
'PhabricatorMacroMemeDialogController' => 'PhabricatorMacroController',
|
Adding some filters and queries to Macro application
Summary:
Fixes T2778
Introduces `PhabricatorMacroQuery`, which should consolidate all queries regarding macros
Adds `PolicyInterface` to `PhabricatorImageMacro`, as else the query would fail (we should consider adding it to the ApplicationTransaction instead, if that was ever planned)
Adds `Active Macros` filter, making it the default
Adds `My Macros` filter. You may ask why it overwrites `$authors`. Well, I did not want the page jump to the conclusion that it is a search result. It //is// one more or less, but the filter would jump to `seach` instead of `my`. If you want `My Macros` removed, tell me. It is useful only to heavy-macro-uploaders-and-users though. Five or six people in `http://secure.phabricator.(org|com)`, and an estimated dozen and a half at bigger installs.
Test Plan: created multiple macros from multiple authors, disabled them at will. browsed around, verified that Macros only appeared in the right filters and that nothing else broke.
Reviewers: epriestley, chad, btrahan
CC: aran, Korvin
Maniphest Tasks: T2778
Differential Revision: https://secure.phabricator.com/D5409
2013-03-22 17:46:21 +01:00
|
|
|
'PhabricatorMacroQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-04-01 17:39:50 +02:00
|
|
|
'PhabricatorMacroReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2013-05-30 23:09:37 +02:00
|
|
|
'PhabricatorMacroSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
Modernize Macro application
Summary: Adds feed, email, notifications, comments, partial editing, subscriptions, enable/disable, flags and crumbs to Macro.
Test Plan:
{F26839}
{F26840}
{F26841}
{F26842}
{F26843}
{F26844}
{F26845}
Reviewers: vrana, btrahan, chad
Reviewed By: vrana
CC: aran
Maniphest Tasks: T2157, T175, T2104
Differential Revision: https://secure.phabricator.com/D4141
2012-12-11 23:01:03 +01:00
|
|
|
'PhabricatorMacroTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorMacroTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'PhabricatorMacroTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PhabricatorMacroViewController' => 'PhabricatorMacroController',
|
2015-08-15 19:54:33 +02:00
|
|
|
'PhabricatorMailEmailHeraldField' => 'HeraldField',
|
|
|
|
'PhabricatorMailEmailHeraldFieldGroup' => 'HeraldFieldGroup',
|
|
|
|
'PhabricatorMailEmailSubjectHeraldField' => 'PhabricatorMailEmailHeraldField',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorMailImplementationAdapter' => 'Phobject',
|
2011-02-10 02:39:55 +01:00
|
|
|
'PhabricatorMailImplementationAmazonSESAdapter' => 'PhabricatorMailImplementationPHPMailerLiteAdapter',
|
2014-01-21 19:36:33 +01:00
|
|
|
'PhabricatorMailImplementationMailgunAdapter' => 'PhabricatorMailImplementationAdapter',
|
2012-12-09 11:36:40 +01:00
|
|
|
'PhabricatorMailImplementationPHPMailerAdapter' => 'PhabricatorMailImplementationAdapter',
|
2011-01-26 18:33:31 +01:00
|
|
|
'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'PhabricatorMailImplementationAdapter',
|
2011-05-26 19:00:26 +02:00
|
|
|
'PhabricatorMailImplementationSendGridAdapter' => 'PhabricatorMailImplementationAdapter',
|
Fix a threading issue with Amazon SES
Summary:
Amazon SES does not allow us to set a Message-ID header, which means
that threads are incorrect in Mail.app (and presumably other applications
which respect In-Reply-To and References) because the initial email does not
have anything which attaches it to the rest of the thread. To fix this, never
rely on Message-ID if the mailer doesn't support Message-ID.
(In the Amazon SES case, Amazon generates its own Message-ID which we can't
know ahead of time).
I additionally used all the Lisk isolation from the other tests to make this
testable and wrote tests for it.
I also moved the idea of a thread ID lower in the stack and out of
DifferentialMail, which should not be responsible for implementation details.
NOTE: If you push this, it will cause a one-time break of threading for
everyone using Outlook since I've changed the seed for generating Thread-Index.
I feel like this is okay to avoid introducing more complexity here.
Test Plan:
Created and then updated a revision, messages delivered over Amazon
SES threaded correctly in Mail.app. Verified headers. Unit tests.
Reviewed By: rm
Reviewers: aran, tuomaspelkonen, jungejason, rm
Commenters: aran
CC: aran, rm, epriestley
Differential Revision: 195
2011-04-30 20:47:00 +02:00
|
|
|
'PhabricatorMailImplementationTestAdapter' => 'PhabricatorMailImplementationAdapter',
|
2013-12-27 22:15:48 +01:00
|
|
|
'PhabricatorMailManagementListInboundWorkflow' => 'PhabricatorMailManagementWorkflow',
|
|
|
|
'PhabricatorMailManagementListOutboundWorkflow' => 'PhabricatorMailManagementWorkflow',
|
|
|
|
'PhabricatorMailManagementReceiveTestWorkflow' => 'PhabricatorMailManagementWorkflow',
|
|
|
|
'PhabricatorMailManagementResendWorkflow' => 'PhabricatorMailManagementWorkflow',
|
|
|
|
'PhabricatorMailManagementSendTestWorkflow' => 'PhabricatorMailManagementWorkflow',
|
|
|
|
'PhabricatorMailManagementShowInboundWorkflow' => 'PhabricatorMailManagementWorkflow',
|
|
|
|
'PhabricatorMailManagementShowOutboundWorkflow' => 'PhabricatorMailManagementWorkflow',
|
2015-08-06 20:32:17 +02:00
|
|
|
'PhabricatorMailManagementVolumeWorkflow' => 'PhabricatorMailManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorMailManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-08-15 19:54:33 +02:00
|
|
|
'PhabricatorMailOutboundMailHeraldAdapter' => 'HeraldAdapter',
|
|
|
|
'PhabricatorMailOutboundRoutingHeraldAction' => 'HeraldAction',
|
|
|
|
'PhabricatorMailOutboundRoutingSelfEmailHeraldAction' => 'PhabricatorMailOutboundRoutingHeraldAction',
|
|
|
|
'PhabricatorMailOutboundRoutingSelfNotificationHeraldAction' => 'PhabricatorMailOutboundRoutingHeraldAction',
|
2015-08-14 13:31:42 +02:00
|
|
|
'PhabricatorMailOutboundStatus' => 'Phobject',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorMailReceiver' => 'Phobject',
|
2013-05-15 00:04:17 +02:00
|
|
|
'PhabricatorMailReceiverTestCase' => 'PhabricatorTestCase',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorMailReplyHandler' => 'Phobject',
|
2015-08-15 19:54:33 +02:00
|
|
|
'PhabricatorMailRoutingRule' => 'Phobject',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorMailSetupCheck' => 'PhabricatorSetupCheck',
|
Build separate mail for each recipient, honoring recipient access levels
Summary:
Ref T6367. Removes `multiplexMail()`!
We can't pass a single body into a function which splits it anymore: we need to split recipients first, then build bodies for each recipient list. This lets us build separate bodies for each recipient's individual translation/access levels.
The new logic does this:
- First, split recipients into groups called "targets".
- Each target corresponds to one actual mail we're going to build.
- Each target has a viewer (whose translation / access levels will be used to generate the mail).
- Each target has a to/cc list (the users who we'll ultimately send the mail to).
- For each target, build a custom mail body based on the viewer's access levels and settings (language prefs not actually implemented).
- Then, deliver the mail.
Test Plan:
- Read new config help.
Then did a bunch of testing, primarily with `bin/mail list-outbound` and `bin/mail show-outbound` (to review generated mail), `bin/phd debug taskmaster` (to run daemons freely) and `bin/worker execute --id <id>` (to repeatedly test a specific piece of code after identifying an issue).
With `one-mail-per-recipient` on (default):
- Sent mail to multiple users.
- Verified mail showed up in `mail list-outbound`.
- Examined mail with `mail show-outbound`.
- Added a project that a subscriber could not see.
- Verified it was not present in `X-Phabricator-Projects`.
- Verified it was rendered as "Restricted Project" for the non-permissioned viewer.
- Added a subscriber, then changed the object policy so they could not see it and sent mail.
- Verified I received mail but the other user did not.
- Enabled public replies and verified mail generated with public addresses.
- Disabld public replies and verified mail generated with private addresses.
With `one-mail-per-recipient` off:
- Verified that one mail is sent to all recipients.
- Verified users who can not see the object are still filtered.
- Verified that partially-visible projects are completely visible in the mail (this violates policies, as documented, as the best available compromise).
- Enabled public replies and verified the mail generated with "Reply To".
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: carlsverre, epriestley
Maniphest Tasks: T6367
Differential Revision: https://secure.phabricator.com/D13131
2015-06-02 23:29:30 +02:00
|
|
|
'PhabricatorMailTarget' => 'Phobject',
|
2014-01-21 19:36:33 +01:00
|
|
|
'PhabricatorMailgunConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PhabricatorMainMenuBarExtension' => 'Phobject',
|
2012-07-31 01:09:14 +02:00
|
|
|
'PhabricatorMainMenuSearchView' => 'AphrontView',
|
|
|
|
'PhabricatorMainMenuView' => 'AphrontView',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorManiphestApplication' => 'PhabricatorApplication',
|
2013-01-11 19:24:35 +01:00
|
|
|
'PhabricatorManiphestConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-04-25 03:17:30 +02:00
|
|
|
'PhabricatorManiphestTaskTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
Add a generic multistep Markup cache
Summary:
The immediate issue this addresses is T1366, adding a rendering cache to Phriction. For wiki pages with code blocks especially, rerendering them each time is expensive.
The broader issue is that out markup caches aren't very good right now. They have three major problems:
**Problem 1: the data is stored in the wrong place.** We currently store remarkup caches on objects. This means we're always loading it and passing it around even when we don't need it, can't genericize cache management code (e.g., have one simple script to drop/GC caches), need to update authoritative rows to clear caches, and can't genericize rendering code since each object is different.
To solve this, I created a dedicated cache database that I plan to move all markup caches to use.
**Problem 2: time-variant rules break when cached.** Some rules like `**bold**` are time-invariant and always produce the same output, but some rules like `{Tnnn}` and `@username` are variant and may render differently (because a task was closed or a user is on vacation). Currently, we cache the raw output, so these time-variant rules get locked at whatever values they had when they were first rendered. This is the main reason Phriction doesn't have a cache right now -- I wanted `{Tnnn}` rules to reflect open/closed tasks.
To solve this, I split markup into a "preprocessing" phase (which does all the parsing and evaluates all time-invariant rules) and a "postprocessing" phase (which evaluates time-variant rules only). The preprocessing phase is most of the expense (and, notably, includes syntax highlighting) so this is nearly as good as caching the final output. I did most of the work here in D737 / D738, but we never moved to use it in Phabricator -- we currently just do the two operations serially in all cases.
This diff splits them apart and caches the output of preprocessing only, so we benefit from caching but also get accurate time-variant rendering.
**Problem 3: cache access isn't batched/pipelined optimally.** When we're rendering a list of markup blocks, we should be able to batch datafetching better than we do. D738 helped with this (fetching is batched within a single hunk of markup) and this improves batching on cache access. We could still do better here, but this is at least a step forward.
Also fixes a bug with generating a link in the Phriction history interface ($uri gets clobbered).
I'm using PHP serialization instead of JSON serialization because Remarkup does some stuff with non-ascii characters that might not survive JSON.
Test Plan:
- Created a Phriction document and verified that previews don't go to cache (no rows appear in the cache table).
- Verified that published documents come out of cache.
- Verified that caches generate/regenerate correctly, time-variant rules render properly and old documents hit the right caches.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1366
Differential Revision: https://secure.phabricator.com/D2945
2012-07-10 00:20:56 +02:00
|
|
|
'PhabricatorMarkupCache' => 'PhabricatorCacheDAO',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorMarkupEngine' => 'Phobject',
|
|
|
|
'PhabricatorMarkupOneOff' => array(
|
|
|
|
'Phobject',
|
|
|
|
'PhabricatorMarkupInterface',
|
|
|
|
),
|
2013-08-05 19:46:39 +02:00
|
|
|
'PhabricatorMarkupPreviewController' => 'PhabricatorController',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorMemeRemarkupRule' => 'PhutilRemarkupRule',
|
|
|
|
'PhabricatorMentionRemarkupRule' => 'PhutilRemarkupRule',
|
2014-01-17 00:31:52 +01:00
|
|
|
'PhabricatorMercurialGraphStream' => 'PhabricatorRepositoryGraphStream',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorMetaMTAActor' => 'Phobject',
|
2013-07-11 00:17:38 +02:00
|
|
|
'PhabricatorMetaMTAActorQuery' => 'PhabricatorQuery',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorMetaMTAApplication' => 'PhabricatorApplication',
|
2015-01-20 01:07:26 +01:00
|
|
|
'PhabricatorMetaMTAApplicationEmail' => array(
|
|
|
|
'PhabricatorMetaMTADAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-06-11 19:15:49 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2015-06-11 19:23:56 +02:00
|
|
|
'PhabricatorSpacesInterface',
|
2015-01-20 01:07:26 +01:00
|
|
|
),
|
2015-01-28 23:35:42 +01:00
|
|
|
'PhabricatorMetaMTAApplicationEmailDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-06-11 19:15:49 +02:00
|
|
|
'PhabricatorMetaMTAApplicationEmailEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-07-06 22:16:26 +02:00
|
|
|
'PhabricatorMetaMTAApplicationEmailHeraldField' => 'HeraldField',
|
2015-01-20 01:07:26 +01:00
|
|
|
'PhabricatorMetaMTAApplicationEmailPHIDType' => 'PhabricatorPHIDType',
|
2015-03-12 21:28:37 +01:00
|
|
|
'PhabricatorMetaMTAApplicationEmailPanel' => 'PhabricatorApplicationConfigurationPanel',
|
2015-01-20 01:07:26 +01:00
|
|
|
'PhabricatorMetaMTAApplicationEmailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-06-11 19:15:49 +02:00
|
|
|
'PhabricatorMetaMTAApplicationEmailTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorMetaMTAApplicationEmailTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorMetaMTAAttachment' => 'Phobject',
|
2013-01-17 00:06:39 +01:00
|
|
|
'PhabricatorMetaMTAConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-01-26 02:40:21 +01:00
|
|
|
'PhabricatorMetaMTAController' => 'PhabricatorController',
|
|
|
|
'PhabricatorMetaMTADAO' => 'PhabricatorLiskDAO',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorMetaMTAEmailBodyParser' => 'Phobject',
|
2011-06-01 17:33:14 +02:00
|
|
|
'PhabricatorMetaMTAEmailBodyParserTestCase' => 'PhabricatorTestCase',
|
2015-07-24 17:19:47 +02:00
|
|
|
'PhabricatorMetaMTAEmailHeraldAction' => 'HeraldAction',
|
|
|
|
'PhabricatorMetaMTAEmailOthersHeraldAction' => 'PhabricatorMetaMTAEmailHeraldAction',
|
|
|
|
'PhabricatorMetaMTAEmailSelfHeraldAction' => 'PhabricatorMetaMTAEmailHeraldAction',
|
When we fail to process mail, tell the user about it
Summary:
Ref T4371. Ref T4699. Fixes T3994.
Currently, we're very conservative about sending errors back to users. A concern I had about this was that mistakes could lead to email loops, massive amounts of email spam, etc. Because of this, I was pretty hesitant about replying to email with more email when I wrote this stuff.
However, this was a long time ago. We now have Message-ID deduplication, "X-Phabricator-Sent-This-Mail", generally better mail infrastructure, and rate limiting. Together, these mechanisms should reasonably prevent anything crazy (primarily, infinite email loops) from happening.
Thus:
- When we hit any processing error after receiving a mail, try to send the author a reply with details about what went wrong. These are limited to 6 per hour per address.
- Rewrite most of the errors to be more detailed and informative.
- Rewrite most of the errors in a user-facing voice ("You sent this mail..." instead of "This mail was sent..").
- Remove the redundant, less sophisticated code which does something similar in Differential.
Test Plan:
- Using `scripts/mail/mail_receiver.php`, artificially received a pile of mail.
- Hit a bunch of different errors.
- Saw reasonable error mail get sent to me.
- Saw other reasonable error mail get rate limited.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T3994, T4371, T4699
Differential Revision: https://secure.phabricator.com/D8692
2014-04-04 03:43:18 +02:00
|
|
|
'PhabricatorMetaMTAErrorMailAction' => 'PhabricatorSystemAction',
|
2015-06-22 22:46:26 +02:00
|
|
|
'PhabricatorMetaMTAMail' => array(
|
|
|
|
'PhabricatorMetaMTADAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorMetaMTAMailBody' => 'Phobject',
|
2012-07-17 04:01:43 +02:00
|
|
|
'PhabricatorMetaMTAMailBodyTestCase' => 'PhabricatorTestCase',
|
2015-06-23 20:37:14 +02:00
|
|
|
'PhabricatorMetaMTAMailHasRecipientEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorMetaMTAMailListController' => 'PhabricatorMetaMTAController',
|
2015-06-22 22:46:26 +02:00
|
|
|
'PhabricatorMetaMTAMailPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorMetaMTAMailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-06-23 20:37:14 +02:00
|
|
|
'PhabricatorMetaMTAMailSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorMetaMTAMailSection' => 'Phobject',
|
Fix a threading issue with Amazon SES
Summary:
Amazon SES does not allow us to set a Message-ID header, which means
that threads are incorrect in Mail.app (and presumably other applications
which respect In-Reply-To and References) because the initial email does not
have anything which attaches it to the rest of the thread. To fix this, never
rely on Message-ID if the mailer doesn't support Message-ID.
(In the Amazon SES case, Amazon generates its own Message-ID which we can't
know ahead of time).
I additionally used all the Lisk isolation from the other tests to make this
testable and wrote tests for it.
I also moved the idea of a thread ID lower in the stack and out of
DifferentialMail, which should not be responsible for implementation details.
NOTE: If you push this, it will cause a one-time break of threading for
everyone using Outlook since I've changed the seed for generating Thread-Index.
I feel like this is okay to avoid introducing more complexity here.
Test Plan:
Created and then updated a revision, messages delivered over Amazon
SES threaded correctly in Mail.app. Verified headers. Unit tests.
Reviewed By: rm
Reviewers: aran, tuomaspelkonen, jungejason, rm
Commenters: aran
CC: aran, rm, epriestley
Differential Revision: 195
2011-04-30 20:47:00 +02:00
|
|
|
'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase',
|
2015-06-23 20:37:14 +02:00
|
|
|
'PhabricatorMetaMTAMailViewController' => 'PhabricatorMetaMTAController',
|
2014-07-18 00:44:29 +02:00
|
|
|
'PhabricatorMetaMTAMailableDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-04-23 12:34:33 +02:00
|
|
|
'PhabricatorMetaMTAMailableFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2014-01-21 19:36:33 +01:00
|
|
|
'PhabricatorMetaMTAMailgunReceiveController' => 'PhabricatorMetaMTAController',
|
2014-02-01 23:35:55 +01:00
|
|
|
'PhabricatorMetaMTAMemberQuery' => 'PhabricatorQuery',
|
2013-08-30 17:21:50 +02:00
|
|
|
'PhabricatorMetaMTAPermanentFailureException' => 'Exception',
|
2011-05-05 08:09:42 +02:00
|
|
|
'PhabricatorMetaMTAReceivedMail' => 'PhabricatorMetaMTADAO',
|
2013-05-14 01:32:19 +02:00
|
|
|
'PhabricatorMetaMTAReceivedMailProcessingException' => 'Exception',
|
|
|
|
'PhabricatorMetaMTAReceivedMailTestCase' => 'PhabricatorTestCase',
|
2014-09-24 22:50:00 +02:00
|
|
|
'PhabricatorMetaMTASchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2011-05-30 20:07:05 +02:00
|
|
|
'PhabricatorMetaMTASendGridReceiveController' => 'PhabricatorMetaMTAController',
|
2012-02-28 02:11:25 +01:00
|
|
|
'PhabricatorMetaMTAWorker' => 'PhabricatorWorker',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorMetronomicTriggerClock' => 'PhabricatorTriggerClock',
|
2016-01-15 00:29:21 +01:00
|
|
|
'PhabricatorMotivatorProfilePanel' => 'PhabricatorProfilePanel',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorMultiColumnUIExample' => 'PhabricatorUIExample',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorMultiFactorSettingsPanel' => 'PhabricatorSettingsPanel',
|
Skeleton for "Multimeter", a performance sampling application
Summary:
Ref T6930. This application collects and displays performance samples -- roughly, things Phabricator spent some kind of resource on. It will collect samples on different types of resources and events:
- Wall time (queries, service calls, pages)
- Bytes In / Bytes Out (requests)
- Implicit requests to CSS/JS (static resources)
I've started with the simplest case (static resources), since this can be used in an immediate, straghtforward way to improve packaging (look at which individual files have the most requests recently).
There's no aggregation yet and a lot of the data isn't collected properly. Future diffs will add more dimension data (controllers, users), more event and resource types (queries, service calls, wall time), and more display options (aggregation, sorting).
Test Plan: {F389344}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6930
Differential Revision: https://secure.phabricator.com/D12623
2015-05-01 22:19:43 +02:00
|
|
|
'PhabricatorMultimeterApplication' => 'PhabricatorApplication',
|
Allow installs to require email verification
Summary:
Allow installs to require users to verify email addresses before they can use Phabricator. If a user logs in without a verified email address, they're given instructions to verify their address.
This isn't too useful on its own since we don't actually have arbitrary email registration, but the next step is to allow installs to restrict email to only some domains (e.g., @mycompany.com).
Test Plan:
- Verification
- Set verification requirement to `true`.
- Tried to use Phabricator with an unverified account, was told to verify.
- Tried to use Conduit, was given a verification error.
- Verified account, used Phabricator.
- Unverified account, reset password, verified implicit verification, used Phabricator.
- People Admin Interface
- Viewed as admin. Clicked "Administrate User".
- Viewed as non-admin
- Sanity Checks
- Used Conduit normally from web/CLI with a verified account.
- Logged in/out.
- Sent password reset email.
- Created a new user.
- Logged in with an unverified user but with the configuration set to off.
Reviewers: btrahan, vrana, jungejason
Reviewed By: btrahan
CC: aran, csilvers
Maniphest Tasks: T1184
Differential Revision: https://secure.phabricator.com/D2520
2012-05-21 21:47:38 +02:00
|
|
|
'PhabricatorMustVerifyEmailController' => 'PhabricatorAuthController',
|
2013-01-03 15:01:14 +01:00
|
|
|
'PhabricatorMySQLConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-07-20 07:48:38 +02:00
|
|
|
'PhabricatorMySQLFileStorageEngine' => 'PhabricatorFileStorageEngine',
|
2015-12-21 19:25:28 +01:00
|
|
|
'PhabricatorMySQLFulltextStorageEngine' => 'PhabricatorFulltextStorageEngine',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorMySQLSetupCheck' => 'PhabricatorSetupCheck',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorNamedQuery' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorSearchDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-05-27 22:40:43 +02:00
|
|
|
),
|
|
|
|
'PhabricatorNamedQueryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-08-26 21:14:28 +02:00
|
|
|
'PhabricatorNavigationRemarkupRule' => 'PhutilRemarkupRule',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorNeverTriggerClock' => 'PhabricatorTriggerClock',
|
Implement basic ngram search for Owners Package names
Summary:
Ref T9979. This uses ngrams (specifically, trigrams) to build a reasonably efficient index for substring matching. Specifically, for a package like "Example", with ID 123, we store rows like this:
```
< ex, 123>
<exa, 123>
<xam, 123>
<amp, 123>
<mpl, 123>
<ple, 123>
<le , 123>
```
When the user searches for `exam`, we join this table for packages with tokens `exa` and `xam`. MySQL can do this a lot more efficiently than it can process a `LIKE "%exam%"` query against a huge table.
When the user searches for a one-letter or two-letter string, we only search the beginnings of words. This is probably what they want, the only thing we can do quickly, and a reasonable/expected behavior for typeaheads.
Test Plan:
- Ran storage upgrades and search indexer.
- Searched for stuff with "name contains".
- Used typehaead and got sensible results.
- Searched for `aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz` and saw only 16 joins.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9979
Differential Revision: https://secure.phabricator.com/D14846
2015-12-21 21:22:07 +01:00
|
|
|
'PhabricatorNgramsIndexEngineExtension' => 'PhabricatorIndexEngineExtension',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorNotificationBuilder' => 'Phobject',
|
2012-06-20 22:51:19 +02:00
|
|
|
'PhabricatorNotificationClearController' => 'PhabricatorNotificationController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorNotificationClient' => 'Phobject',
|
2013-01-03 18:29:19 +01:00
|
|
|
'PhabricatorNotificationConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2012-06-08 15:31:30 +02:00
|
|
|
'PhabricatorNotificationController' => 'PhabricatorController',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorNotificationDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension',
|
2012-06-12 02:49:32 +02:00
|
|
|
'PhabricatorNotificationIndividualController' => 'PhabricatorNotificationController',
|
2012-06-18 23:07:38 +02:00
|
|
|
'PhabricatorNotificationListController' => 'PhabricatorNotificationController',
|
2012-06-11 18:37:06 +02:00
|
|
|
'PhabricatorNotificationPanelController' => 'PhabricatorNotificationController',
|
2012-10-24 02:34:43 +02:00
|
|
|
'PhabricatorNotificationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-08-16 20:14:32 +02:00
|
|
|
'PhabricatorNotificationSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2016-04-13 21:07:48 +02:00
|
|
|
'PhabricatorNotificationServerRef' => 'Phobject',
|
|
|
|
'PhabricatorNotificationServersConfigOptionType' => 'PhabricatorConfigJSONOptionType',
|
2014-06-24 01:26:16 +02:00
|
|
|
'PhabricatorNotificationStatusView' => 'AphrontTagView',
|
2014-02-18 01:00:33 +01:00
|
|
|
'PhabricatorNotificationTestController' => 'PhabricatorNotificationController',
|
2015-06-22 22:11:37 +02:00
|
|
|
'PhabricatorNotificationTestFeedStory' => 'PhabricatorFeedStory',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorNotificationUIExample' => 'PhabricatorUIExample',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorNotificationsApplication' => 'PhabricatorApplication',
|
|
|
|
'PhabricatorNuanceApplication' => 'PhabricatorApplication',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorOAuth1AuthProvider' => 'PhabricatorOAuthAuthProvider',
|
2016-03-16 14:36:04 +01:00
|
|
|
'PhabricatorOAuth1SecretTemporaryTokenType' => 'PhabricatorAuthTemporaryTokenType',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorOAuth2AuthProvider' => 'PhabricatorOAuthAuthProvider',
|
|
|
|
'PhabricatorOAuthAuthProvider' => 'PhabricatorAuthProvider',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorOAuthClientAuthorization' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorOAuthServerDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-03-18 21:27:55 +01:00
|
|
|
),
|
|
|
|
'PhabricatorOAuthClientAuthorizationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-07-21 16:05:17 +02:00
|
|
|
'PhabricatorOAuthClientController' => 'PhabricatorOAuthServerController',
|
2016-04-05 18:40:22 +02:00
|
|
|
'PhabricatorOAuthClientDisableController' => 'PhabricatorOAuthClientController',
|
2014-07-21 16:05:17 +02:00
|
|
|
'PhabricatorOAuthClientEditController' => 'PhabricatorOAuthClientController',
|
|
|
|
'PhabricatorOAuthClientListController' => 'PhabricatorOAuthClientController',
|
2015-01-15 02:27:45 +01:00
|
|
|
'PhabricatorOAuthClientSecretController' => 'PhabricatorOAuthClientController',
|
2016-04-03 16:25:33 +02:00
|
|
|
'PhabricatorOAuthClientTestController' => 'PhabricatorOAuthClientController',
|
2014-07-21 16:05:17 +02:00
|
|
|
'PhabricatorOAuthClientViewController' => 'PhabricatorOAuthClientController',
|
OAuth - Phabricator OAuth server and Phabricator client for new Phabricator OAuth Server
Summary:
adds a Phabricator OAuth server, which has three big commands:
- auth - allows $user to authorize a given client or application. if $user has already authorized, it hands an authoization code back to $redirect_uri
- token - given a valid authorization code, this command returns an authorization token
- whoami - Conduit.whoami, all nice and purdy relative to the oauth server.
Also has a "test" handler, which I used to create some test data. T850 will
delete this as it adds the ability to create this data in the Phabricator
product.
This diff also adds the corresponding client in Phabricator for the Phabricator
OAuth Server. (Note that clients are known as "providers" in the Phabricator
codebase but client makes more sense relative to the server nomenclature)
Also, related to make this work well
- clean up the diagnostics page by variabilizing the provider-specific
information and extending the provider classes as appropriate.
- augment Conduit.whoami for more full-featured OAuth support, at least where
the Phabricator client is concerned
What's missing here... See T844, T848, T849, T850, and T852.
Test Plan:
- created a dummy client via the test handler. setup development.conf to have
have proper variables for this dummy client. went through authorization and
de-authorization flows
- viewed the diagnostics page for all known oauth providers and saw
provider-specific debugging information
Reviewers: epriestley
CC: aran, epriestley
Maniphest Tasks: T44, T797
Differential Revision: https://secure.phabricator.com/D1595
2012-02-04 01:21:40 +01:00
|
|
|
'PhabricatorOAuthResponse' => 'AphrontResponse',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorOAuthServer' => 'Phobject',
|
OAuth - Phabricator OAuth server and Phabricator client for new Phabricator OAuth Server
Summary:
adds a Phabricator OAuth server, which has three big commands:
- auth - allows $user to authorize a given client or application. if $user has already authorized, it hands an authoization code back to $redirect_uri
- token - given a valid authorization code, this command returns an authorization token
- whoami - Conduit.whoami, all nice and purdy relative to the oauth server.
Also has a "test" handler, which I used to create some test data. T850 will
delete this as it adds the ability to create this data in the Phabricator
product.
This diff also adds the corresponding client in Phabricator for the Phabricator
OAuth Server. (Note that clients are known as "providers" in the Phabricator
codebase but client makes more sense relative to the server nomenclature)
Also, related to make this work well
- clean up the diagnostics page by variabilizing the provider-specific
information and extending the provider classes as appropriate.
- augment Conduit.whoami for more full-featured OAuth support, at least where
the Phabricator client is concerned
What's missing here... See T844, T848, T849, T850, and T852.
Test Plan:
- created a dummy client via the test handler. setup development.conf to have
have proper variables for this dummy client. went through authorization and
de-authorization flows
- viewed the diagnostics page for all known oauth providers and saw
provider-specific debugging information
Reviewers: epriestley
CC: aran, epriestley
Maniphest Tasks: T44, T797
Differential Revision: https://secure.phabricator.com/D1595
2012-02-04 01:21:40 +01:00
|
|
|
'PhabricatorOAuthServerAccessToken' => 'PhabricatorOAuthServerDAO',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorOAuthServerApplication' => 'PhabricatorApplication',
|
2015-09-03 19:05:23 +02:00
|
|
|
'PhabricatorOAuthServerAuthController' => 'PhabricatorOAuthServerController',
|
OAuth - Phabricator OAuth server and Phabricator client for new Phabricator OAuth Server
Summary:
adds a Phabricator OAuth server, which has three big commands:
- auth - allows $user to authorize a given client or application. if $user has already authorized, it hands an authoization code back to $redirect_uri
- token - given a valid authorization code, this command returns an authorization token
- whoami - Conduit.whoami, all nice and purdy relative to the oauth server.
Also has a "test" handler, which I used to create some test data. T850 will
delete this as it adds the ability to create this data in the Phabricator
product.
This diff also adds the corresponding client in Phabricator for the Phabricator
OAuth Server. (Note that clients are known as "providers" in the Phabricator
codebase but client makes more sense relative to the server nomenclature)
Also, related to make this work well
- clean up the diagnostics page by variabilizing the provider-specific
information and extending the provider classes as appropriate.
- augment Conduit.whoami for more full-featured OAuth support, at least where
the Phabricator client is concerned
What's missing here... See T844, T848, T849, T850, and T852.
Test Plan:
- created a dummy client via the test handler. setup development.conf to have
have proper variables for this dummy client. went through authorization and
de-authorization flows
- viewed the diagnostics page for all known oauth providers and saw
provider-specific debugging information
Reviewers: epriestley
CC: aran, epriestley
Maniphest Tasks: T44, T797
Differential Revision: https://secure.phabricator.com/D1595
2012-02-04 01:21:40 +01:00
|
|
|
'PhabricatorOAuthServerAuthorizationCode' => 'PhabricatorOAuthServerDAO',
|
2014-03-18 21:28:19 +01:00
|
|
|
'PhabricatorOAuthServerAuthorizationsSettingsPanel' => 'PhabricatorSettingsPanel',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorOAuthServerClient' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorOAuthServerDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2016-04-04 18:27:42 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-01-14 21:14:22 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2014-03-18 21:27:55 +01:00
|
|
|
),
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorOAuthServerClientAuthorizationPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorOAuthServerClientPHIDType' => 'PhabricatorPHIDType',
|
2014-03-18 21:27:55 +01:00
|
|
|
'PhabricatorOAuthServerClientQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-03-18 21:31:04 +01:00
|
|
|
'PhabricatorOAuthServerClientSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2012-02-22 19:21:39 +01:00
|
|
|
'PhabricatorOAuthServerController' => 'PhabricatorController',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhabricatorOAuthServerCreateClientsCapability' => 'PhabricatorPolicyCapability',
|
OAuth - Phabricator OAuth server and Phabricator client for new Phabricator OAuth Server
Summary:
adds a Phabricator OAuth server, which has three big commands:
- auth - allows $user to authorize a given client or application. if $user has already authorized, it hands an authoization code back to $redirect_uri
- token - given a valid authorization code, this command returns an authorization token
- whoami - Conduit.whoami, all nice and purdy relative to the oauth server.
Also has a "test" handler, which I used to create some test data. T850 will
delete this as it adds the ability to create this data in the Phabricator
product.
This diff also adds the corresponding client in Phabricator for the Phabricator
OAuth Server. (Note that clients are known as "providers" in the Phabricator
codebase but client makes more sense relative to the server nomenclature)
Also, related to make this work well
- clean up the diagnostics page by variabilizing the provider-specific
information and extending the provider classes as appropriate.
- augment Conduit.whoami for more full-featured OAuth support, at least where
the Phabricator client is concerned
What's missing here... See T844, T848, T849, T850, and T852.
Test Plan:
- created a dummy client via the test handler. setup development.conf to have
have proper variables for this dummy client. went through authorization and
de-authorization flows
- viewed the diagnostics page for all known oauth providers and saw
provider-specific debugging information
Reviewers: epriestley
CC: aran, epriestley
Maniphest Tasks: T44, T797
Differential Revision: https://secure.phabricator.com/D1595
2012-02-04 01:21:40 +01:00
|
|
|
'PhabricatorOAuthServerDAO' => 'PhabricatorLiskDAO',
|
2016-04-04 18:27:42 +02:00
|
|
|
'PhabricatorOAuthServerEditEngine' => 'PhabricatorEditEngine',
|
|
|
|
'PhabricatorOAuthServerEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorOAuthServerScope' => 'Phobject',
|
OAuthServer polish and random sauce
Summary:
This diff makes the OAuthServer more compliant with the spec by
- making it return well-formatted error codes with error types from the spec.
- making it respect the "state" variable, which is a transparent variable the
client passes and the server passes back
- making it be super, duper compliant with respect to redirect uris
-- if specified in authorization step, check if its valid relative to the client
registered URI and if so save it
-- if specified in authorization step, check if its been specified in the access
step and error if it doesn't match or doesn't exist
-- note we don't make any use of it in the access step which seems strange but
hey, that's what the spec says!
This diff makes the OAuthServer suck less by
- making the "cancel" button do something in the user authorization flow
- making the client list view and client edit view be a bit more usable around
client secrets
- fixing a few bugs I managed to introduce along the way
Test Plan:
- create a test phabricator client, updated my conf, and then linked and
unlinked phabricator to itself
- wrote some tests for PhabricatorOAuthServer -- they pass!
-- these validate the various validate URI checks
- tried a few important authorization calls
--
http://phabricator.dev/oauthserver/auth/?client_id=X&state=test&redirect_uri=http://www.evil.com
--- verified error'd from mismatching redirect uri's
--- verified state parameter in response
--- verified did not redirect to client redirect uri
-- http://phabricator.dev/oauthserver/auth/?client_id=X w/ existing
authorization
--- got redirected to proper client url with error that response_type not
specified
-- http://phabricator.dev/oauthserver/auth/?client_id=X&response_type=code w/
existing authorization
--- got redirected to proper client url with pertinent code!
- tried a few important access calls
-- verified appropriate errors if missing any required parameters
-- verified good access code with appropriate other variables resulted in an
access token
- verified that if redirect_uri set correctly in authorization required for
access and errors if differs at all / only succeeds if exactly the same
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, epriestley, ajtrichards
Maniphest Tasks: T889, T906, T897
Differential Revision: https://secure.phabricator.com/D1727
2012-03-01 23:46:18 +01:00
|
|
|
'PhabricatorOAuthServerTestCase' => 'PhabricatorTestCase',
|
2015-09-03 19:05:23 +02:00
|
|
|
'PhabricatorOAuthServerTokenController' => 'PhabricatorOAuthServerController',
|
2016-04-04 18:27:42 +02:00
|
|
|
'PhabricatorOAuthServerTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorOAuthServerTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorObjectHandle' => array(
|
|
|
|
'Phobject',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorObjectHasAsanaSubtaskEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorObjectHasAsanaTaskEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorObjectHasContributorEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorObjectHasFileEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorObjectHasJiraIssueEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorObjectHasSubscriberEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorObjectHasUnsubscriberEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorObjectHasWatcherEdgeType' => 'PhabricatorEdgeType',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorObjectListQuery' => 'Phobject',
|
2014-03-08 02:44:44 +01:00
|
|
|
'PhabricatorObjectListQueryTestCase' => 'PhabricatorTestCase',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorObjectMailReceiver' => 'PhabricatorMailReceiver',
|
2013-05-17 12:49:29 +02:00
|
|
|
'PhabricatorObjectMailReceiverTestCase' => 'PhabricatorTestCase',
|
2015-01-01 05:40:26 +01:00
|
|
|
'PhabricatorObjectMentionedByObjectEdgeType' => 'PhabricatorEdgeType',
|
|
|
|
'PhabricatorObjectMentionsObjectEdgeType' => 'PhabricatorEdgeType',
|
2013-07-21 15:34:21 +02:00
|
|
|
'PhabricatorObjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorObjectRemarkupRule' => 'PhutilRemarkupRule',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorObjectSelectorDialog' => 'Phobject',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorObjectUsesCredentialsEdgeType' => 'PhabricatorEdgeType',
|
2012-03-27 05:54:26 +02:00
|
|
|
'PhabricatorOffsetPagedQuery' => 'PhabricatorQuery',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorOldWorldContentSource' => 'PhabricatorContentSource',
|
2015-01-16 00:57:45 +01:00
|
|
|
'PhabricatorOneTimeTriggerClock' => 'PhabricatorTriggerClock',
|
2015-04-07 23:38:03 +02:00
|
|
|
'PhabricatorOpcodeCacheSpec' => 'PhabricatorCacheSpec',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorOwnerPathQuery' => 'Phobject',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorOwnersApplication' => 'PhabricatorApplication',
|
2015-12-09 22:41:31 +01:00
|
|
|
'PhabricatorOwnersArchiveController' => 'PhabricatorOwnersController',
|
2013-01-16 19:52:30 +01:00
|
|
|
'PhabricatorOwnersConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-09-10 22:32:31 +02:00
|
|
|
'PhabricatorOwnersConfiguredCustomField' => array(
|
|
|
|
'PhabricatorOwnersCustomField',
|
|
|
|
'PhabricatorStandardCustomFieldInterface',
|
|
|
|
),
|
2011-04-03 23:48:36 +02:00
|
|
|
'PhabricatorOwnersController' => 'PhabricatorController',
|
2015-09-10 22:32:31 +02:00
|
|
|
'PhabricatorOwnersCustomField' => 'PhabricatorCustomField',
|
|
|
|
'PhabricatorOwnersCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage',
|
|
|
|
'PhabricatorOwnersCustomFieldStorage' => 'PhabricatorCustomFieldStorage',
|
|
|
|
'PhabricatorOwnersCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage',
|
2011-04-03 23:48:36 +02:00
|
|
|
'PhabricatorOwnersDAO' => 'PhabricatorLiskDAO',
|
2016-02-15 20:37:13 +01:00
|
|
|
'PhabricatorOwnersDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'PhabricatorOwnersDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2011-04-03 23:48:36 +02:00
|
|
|
'PhabricatorOwnersDetailController' => 'PhabricatorOwnersController',
|
2011-04-04 07:03:27 +02:00
|
|
|
'PhabricatorOwnersEditController' => 'PhabricatorOwnersController',
|
2011-04-03 23:48:36 +02:00
|
|
|
'PhabricatorOwnersListController' => 'PhabricatorOwnersController',
|
|
|
|
'PhabricatorOwnersOwner' => 'PhabricatorOwnersDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorOwnersPackage' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorOwnersDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-05-27 19:30:08 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-09-10 22:32:31 +02:00
|
|
|
'PhabricatorCustomFieldInterface',
|
2015-12-10 14:14:54 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2015-12-13 01:25:51 +01:00
|
|
|
'PhabricatorConduitResultInterface',
|
Implement basic ngram search for Owners Package names
Summary:
Ref T9979. This uses ngrams (specifically, trigrams) to build a reasonably efficient index for substring matching. Specifically, for a package like "Example", with ID 123, we store rows like this:
```
< ex, 123>
<exa, 123>
<xam, 123>
<amp, 123>
<mpl, 123>
<ple, 123>
<le , 123>
```
When the user searches for `exam`, we join this table for packages with tokens `exa` and `xam`. MySQL can do this a lot more efficiently than it can process a `LIKE "%exam%"` query against a huge table.
When the user searches for a one-letter or two-letter string, we only search the beginnings of words. This is probably what they want, the only thing we can do quickly, and a reasonable/expected behavior for typeaheads.
Test Plan:
- Ran storage upgrades and search indexer.
- Searched for stuff with "name contains".
- Used typehaead and got sensible results.
- Searched for `aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz` and saw only 16 joins.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9979
Differential Revision: https://secure.phabricator.com/D14846
2015-12-21 21:22:07 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
|
|
|
'PhabricatorNgramsInterface',
|
2012-08-08 21:25:11 +02:00
|
|
|
),
|
2014-07-11 01:21:21 +02:00
|
|
|
'PhabricatorOwnersPackageDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-11-29 18:33:36 +01:00
|
|
|
'PhabricatorOwnersPackageEditEngine' => 'PhabricatorEditEngine',
|
Implement basic ngram search for Owners Package names
Summary:
Ref T9979. This uses ngrams (specifically, trigrams) to build a reasonably efficient index for substring matching. Specifically, for a package like "Example", with ID 123, we store rows like this:
```
< ex, 123>
<exa, 123>
<xam, 123>
<amp, 123>
<mpl, 123>
<ple, 123>
<le , 123>
```
When the user searches for `exam`, we join this table for packages with tokens `exa` and `xam`. MySQL can do this a lot more efficiently than it can process a `LIKE "%exam%"` query against a huge table.
When the user searches for a one-letter or two-letter string, we only search the beginnings of words. This is probably what they want, the only thing we can do quickly, and a reasonable/expected behavior for typeaheads.
Test Plan:
- Ran storage upgrades and search indexer.
- Searched for stuff with "name contains".
- Used typehaead and got sensible results.
- Searched for `aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz` and saw only 16 joins.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9979
Differential Revision: https://secure.phabricator.com/D14846
2015-12-21 21:22:07 +01:00
|
|
|
'PhabricatorOwnersPackageFulltextEngine' => 'PhabricatorFulltextEngine',
|
2015-08-31 19:17:54 +02:00
|
|
|
'PhabricatorOwnersPackageFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
Implement basic ngram search for Owners Package names
Summary:
Ref T9979. This uses ngrams (specifically, trigrams) to build a reasonably efficient index for substring matching. Specifically, for a package like "Example", with ID 123, we store rows like this:
```
< ex, 123>
<exa, 123>
<xam, 123>
<amp, 123>
<mpl, 123>
<ple, 123>
<le , 123>
```
When the user searches for `exam`, we join this table for packages with tokens `exa` and `xam`. MySQL can do this a lot more efficiently than it can process a `LIKE "%exam%"` query against a huge table.
When the user searches for a one-letter or two-letter string, we only search the beginnings of words. This is probably what they want, the only thing we can do quickly, and a reasonable/expected behavior for typeaheads.
Test Plan:
- Ran storage upgrades and search indexer.
- Searched for stuff with "name contains".
- Used typehaead and got sensible results.
- Searched for `aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz` and saw only 16 joins.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9979
Differential Revision: https://secure.phabricator.com/D14846
2015-12-21 21:22:07 +01:00
|
|
|
'PhabricatorOwnersPackageNameNgrams' => 'PhabricatorSearchNgrams',
|
2015-08-31 19:17:54 +02:00
|
|
|
'PhabricatorOwnersPackageOwnerDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorOwnersPackagePHIDType' => 'PhabricatorPHIDType',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorOwnersPackageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-05-27 19:29:01 +02:00
|
|
|
'PhabricatorOwnersPackageSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2012-12-07 02:23:56 +01:00
|
|
|
'PhabricatorOwnersPackageTestCase' => 'PhabricatorTestCase',
|
2015-05-27 19:30:08 +02:00
|
|
|
'PhabricatorOwnersPackageTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorOwnersPackageTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhabricatorOwnersPackageTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2011-04-03 23:48:36 +02:00
|
|
|
'PhabricatorOwnersPath' => 'PhabricatorOwnersDAO',
|
2015-05-27 19:29:50 +02:00
|
|
|
'PhabricatorOwnersPathsController' => 'PhabricatorOwnersController',
|
2015-12-14 15:11:03 +01:00
|
|
|
'PhabricatorOwnersPathsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
|
2015-11-16 18:53:01 +01:00
|
|
|
'PhabricatorOwnersSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-07-06 14:52:04 +02:00
|
|
|
'PhabricatorOwnersSearchField' => 'PhabricatorSearchTokenizerField',
|
2013-01-09 15:05:34 +01:00
|
|
|
'PhabricatorPHDConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorPHID' => 'Phobject',
|
|
|
|
'PhabricatorPHIDConstants' => 'Phobject',
|
2015-11-29 22:24:47 +01:00
|
|
|
'PhabricatorPHIDListEditField' => 'PhabricatorEditField',
|
2015-12-04 18:30:53 +01:00
|
|
|
'PhabricatorPHIDListEditType' => 'PhabricatorEditType',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorPHIDResolver' => 'Phobject',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorPHIDType' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorPHIDTypeTestCase' => 'PhutilTestCase',
|
2015-12-13 19:11:40 +01:00
|
|
|
'PhabricatorPHIDsSearchField' => 'PhabricatorSearchField',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPHPASTApplication' => 'PhabricatorApplication',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorPHPConfigSetupCheck' => 'PhabricatorSetupCheck',
|
2013-01-15 21:03:44 +01:00
|
|
|
'PhabricatorPHPMailerConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorPagedFormUIExample' => 'PhabricatorUIExample',
|
|
|
|
'PhabricatorPagerUIExample' => 'PhabricatorUIExample',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPassphraseApplication' => 'PhabricatorApplication',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorPasswordAuthProvider' => 'PhabricatorAuthProvider',
|
2014-02-18 18:31:30 +01:00
|
|
|
'PhabricatorPasswordHasher' => 'Phobject',
|
|
|
|
'PhabricatorPasswordHasherTestCase' => 'PhabricatorTestCase',
|
|
|
|
'PhabricatorPasswordHasherUnavailableException' => 'Exception',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorPasswordSettingsPanel' => 'PhabricatorSettingsPanel',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorPaste' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPasteDAO',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
2014-09-09 23:21:13 +02:00
|
|
|
'PhabricatorMentionableInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorProjectInterface',
|
2014-09-25 22:42:38 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-06-05 02:45:24 +02:00
|
|
|
'PhabricatorSpacesInterface',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorConduitResultInterface',
|
2012-05-30 23:26:29 +02:00
|
|
|
),
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPasteApplication' => 'PhabricatorApplication',
|
2015-12-09 20:50:19 +01:00
|
|
|
'PhabricatorPasteArchiveController' => 'PhabricatorPasteController',
|
2013-07-30 22:26:55 +02:00
|
|
|
'PhabricatorPasteConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-12-14 15:01:04 +01:00
|
|
|
'PhabricatorPasteContentSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
|
2011-06-10 08:53:53 +02:00
|
|
|
'PhabricatorPasteController' => 'PhabricatorController',
|
|
|
|
'PhabricatorPasteDAO' => 'PhabricatorLiskDAO',
|
2012-08-24 22:19:14 +02:00
|
|
|
'PhabricatorPasteEditController' => 'PhabricatorPasteController',
|
Allow ApplicationEditor forms to be reconfigured
Summary:
Ref T9132. This diff doesn't do anything interesting, it just lays the groundwork for more interesting future diffs.
Broadly, the idea here is to let you create multiple views of each edit form. For example, we might create several different "Create Task" forms, like:
- "New Bug Report"
- "New Feature Request"
These would be views of the "Create Task" form, but with various adjustments:
- A form might have additional instructions ("how to file a good bug report").
- A form might have prefilled values for some fields (like particular projects, subscribers, or policies).
- A form might have some fields locked (so they can not be edited) or hidden.
- A form might have a different field order.
- A form might have a limited visibility policy, so only some users can access it.
This diff adds a new storage object (`EditEngineConfiguration`) to keep track of all those customizations and represent "a form which has been configured to look and work a certain way".
This doesn't let these configurations do anything useful/interesting, and you can't access them directly yet, it's just all the boring plumbing to enable more interesting behavior in the future.
Test Plan:
ApplicationEditor forms now let you manage available forms and edit the current form:
{F959025}
There's a new (bare bones) list of all available engines:
{F959030}
And if you jump into an engine, you can see all the forms for it:
{F959038}
The actual form configurations have standard detail/edit pages. The edit pages are themselves driven by ApplicationEditor, of course, so you can edit the form for editing forms.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9132
Differential Revision: https://secure.phabricator.com/D14453
2015-11-04 21:52:52 +01:00
|
|
|
'PhabricatorPasteEditEngine' => 'PhabricatorEditEngine',
|
2013-08-02 21:56:58 +02:00
|
|
|
'PhabricatorPasteEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-12-25 15:20:25 +01:00
|
|
|
'PhabricatorPasteFilenameContextFreeGrammar' => 'PhutilContextFreeGrammar',
|
2014-05-16 04:17:38 +02:00
|
|
|
'PhabricatorPasteListController' => 'PhabricatorPasteController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorPastePastePHIDType' => 'PhabricatorPHIDType',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorPasteQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-09-25 19:45:01 +02:00
|
|
|
'PhabricatorPasteRawController' => 'PhabricatorPasteController',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorPasteRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2014-09-24 22:50:57 +02:00
|
|
|
'PhabricatorPasteSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-04-14 15:53:20 +02:00
|
|
|
'PhabricatorPasteSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-10-20 21:07:04 +02:00
|
|
|
'PhabricatorPasteSnippet' => 'Phobject',
|
2013-04-29 21:10:53 +02:00
|
|
|
'PhabricatorPasteTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2013-08-02 21:56:58 +02:00
|
|
|
'PhabricatorPasteTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorPasteTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'PhabricatorPasteTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2011-06-10 08:53:53 +02:00
|
|
|
'PhabricatorPasteViewController' => 'PhabricatorPasteController',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorPathSetupCheck' => 'PhabricatorSetupCheck',
|
2015-04-24 00:44:27 +02:00
|
|
|
'PhabricatorPeopleAnyOwnerDatasource' => 'PhabricatorTypeaheadDatasource',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPeopleApplication' => 'PhabricatorApplication',
|
2013-11-13 20:24:18 +01:00
|
|
|
'PhabricatorPeopleApproveController' => 'PhabricatorPeopleController',
|
2016-01-14 15:47:06 +01:00
|
|
|
'PhabricatorPeopleCalendarController' => 'PhabricatorPeopleProfileController',
|
2011-01-24 03:09:16 +01:00
|
|
|
'PhabricatorPeopleController' => 'PhabricatorController',
|
2014-04-02 21:06:27 +02:00
|
|
|
'PhabricatorPeopleCreateController' => 'PhabricatorPeopleController',
|
2014-07-18 00:44:18 +02:00
|
|
|
'PhabricatorPeopleDatasource' => 'PhabricatorTypeaheadDatasource',
|
2014-04-02 21:05:07 +02:00
|
|
|
'PhabricatorPeopleDeleteController' => 'PhabricatorPeopleController',
|
2016-01-14 15:47:06 +01:00
|
|
|
'PhabricatorPeopleDetailsProfilePanel' => 'PhabricatorProfilePanel',
|
2013-11-13 20:24:18 +01:00
|
|
|
'PhabricatorPeopleDisableController' => 'PhabricatorPeopleController',
|
2014-04-02 21:05:49 +02:00
|
|
|
'PhabricatorPeopleEmpowerController' => 'PhabricatorPeopleController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorPeopleExternalPHIDType' => 'PhabricatorPHIDType',
|
2016-01-24 14:43:57 +01:00
|
|
|
'PhabricatorPeopleIconSet' => 'PhabricatorIconSet',
|
2015-02-11 15:05:53 +01:00
|
|
|
'PhabricatorPeopleInviteController' => 'PhabricatorPeopleController',
|
|
|
|
'PhabricatorPeopleInviteListController' => 'PhabricatorPeopleInviteController',
|
|
|
|
'PhabricatorPeopleInviteSendController' => 'PhabricatorPeopleInviteController',
|
2012-07-04 04:10:38 +02:00
|
|
|
'PhabricatorPeopleLdapController' => 'PhabricatorPeopleController',
|
2014-05-16 04:17:38 +02:00
|
|
|
'PhabricatorPeopleListController' => 'PhabricatorPeopleController',
|
2014-04-28 02:31:35 +02:00
|
|
|
'PhabricatorPeopleLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorPeopleLogSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-05-16 04:17:38 +02:00
|
|
|
'PhabricatorPeopleLogsController' => 'PhabricatorPeopleController',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PhabricatorPeopleMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension',
|
2016-01-24 16:07:17 +01:00
|
|
|
'PhabricatorPeopleManageProfilePanel' => 'PhabricatorProfilePanel',
|
2014-04-02 21:06:27 +02:00
|
|
|
'PhabricatorPeopleNewController' => 'PhabricatorPeopleController',
|
2015-04-23 12:07:24 +02:00
|
|
|
'PhabricatorPeopleNoOwnerDatasource' => 'PhabricatorTypeaheadDatasource',
|
|
|
|
'PhabricatorPeopleOwnerDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2011-01-24 03:09:16 +01:00
|
|
|
'PhabricatorPeopleProfileController' => 'PhabricatorPeopleController',
|
2016-01-14 15:47:06 +01:00
|
|
|
'PhabricatorPeopleProfileEditController' => 'PhabricatorPeopleProfileController',
|
2016-01-24 16:07:17 +01:00
|
|
|
'PhabricatorPeopleProfileManageController' => 'PhabricatorPeopleProfileController',
|
2016-01-14 15:47:06 +01:00
|
|
|
'PhabricatorPeopleProfilePanelEngine' => 'PhabricatorProfilePanelEngine',
|
|
|
|
'PhabricatorPeopleProfilePictureController' => 'PhabricatorPeopleProfileController',
|
|
|
|
'PhabricatorPeopleProfileViewController' => 'PhabricatorPeopleProfileController',
|
2013-05-31 19:51:53 +02:00
|
|
|
'PhabricatorPeopleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-04-02 21:05:19 +02:00
|
|
|
'PhabricatorPeopleRenameController' => 'PhabricatorPeopleController',
|
2013-05-31 19:51:20 +02:00
|
|
|
'PhabricatorPeopleSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-04-15 04:09:20 +02:00
|
|
|
'PhabricatorPeopleTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2015-06-08 22:35:57 +02:00
|
|
|
'PhabricatorPeopleTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-04-23 17:06:46 +02:00
|
|
|
'PhabricatorPeopleUserFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorPeopleUserPHIDType' => 'PhabricatorPHIDType',
|
2014-04-02 21:06:17 +02:00
|
|
|
'PhabricatorPeopleWelcomeController' => 'PhabricatorPeopleController',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorPersonaAuthProvider' => 'PhabricatorAuthProvider',
|
2015-01-09 01:28:04 +01:00
|
|
|
'PhabricatorPhabricatorAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPhameApplication' => 'PhabricatorApplication',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorPhameBlogPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorPhamePostPHIDType' => 'PhabricatorPHIDType',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPhluxApplication' => 'PhabricatorApplication',
|
|
|
|
'PhabricatorPholioApplication' => 'PhabricatorApplication',
|
2013-01-16 19:52:30 +01:00
|
|
|
'PhabricatorPholioConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-05-06 21:33:37 +02:00
|
|
|
'PhabricatorPholioMockTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPhortuneApplication' => 'PhabricatorApplication',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorPhortuneContentSource' => 'PhabricatorContentSource',
|
2015-01-30 20:29:05 +01:00
|
|
|
'PhabricatorPhortuneManagementInvoiceWorkflow' => 'PhabricatorPhortuneManagementWorkflow',
|
|
|
|
'PhabricatorPhortuneManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPhragmentApplication' => 'PhabricatorApplication',
|
|
|
|
'PhabricatorPhrequentApplication' => 'PhabricatorApplication',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhabricatorPhrequentConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPhrictionApplication' => 'PhabricatorApplication',
|
2013-01-15 15:31:53 +01:00
|
|
|
'PhabricatorPhrictionConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlApplication' => 'PhabricatorApplication',
|
2015-11-09 19:09:19 +01:00
|
|
|
'PhabricatorPhurlConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlController' => 'PhabricatorController',
|
|
|
|
'PhabricatorPhurlDAO' => 'PhabricatorLiskDAO',
|
2015-11-06 22:47:52 +01:00
|
|
|
'PhabricatorPhurlLinkRemarkupRule' => 'PhutilRemarkupRule',
|
|
|
|
'PhabricatorPhurlRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-11-09 19:09:19 +01:00
|
|
|
'PhabricatorPhurlShortURLController' => 'PhabricatorPhurlController',
|
|
|
|
'PhabricatorPhurlShortURLDefaultController' => 'PhabricatorPhurlController',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlURL' => array(
|
|
|
|
'PhabricatorPhurlDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorProjectInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
|
|
|
'PhabricatorMentionableInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorSpacesInterface',
|
|
|
|
),
|
2015-11-02 21:08:47 +01:00
|
|
|
'PhabricatorPhurlURLAccessController' => 'PhabricatorPhurlController',
|
2015-11-13 23:36:58 +01:00
|
|
|
'PhabricatorPhurlURLCommentController' => 'PhabricatorPhurlController',
|
2015-11-18 21:24:09 +01:00
|
|
|
'PhabricatorPhurlURLCreateCapability' => 'PhabricatorPolicyCapability',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlURLEditController' => 'PhabricatorPhurlController',
|
|
|
|
'PhabricatorPhurlURLEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhabricatorPhurlURLListController' => 'PhabricatorPhurlController',
|
2015-12-22 17:05:56 +01:00
|
|
|
'PhabricatorPhurlURLMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlURLPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorPhurlURLQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-12-22 17:05:56 +01:00
|
|
|
'PhabricatorPhurlURLReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2015-07-24 20:06:27 +02:00
|
|
|
'PhabricatorPhurlURLSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'PhabricatorPhurlURLTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorPhurlURLTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'PhabricatorPhurlURLTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PhabricatorPhurlURLViewController' => 'PhabricatorPhurlController',
|
2015-12-20 16:03:07 +01:00
|
|
|
'PhabricatorPirateEnglishTranslation' => 'PhutilTranslation',
|
2015-06-29 23:04:48 +02:00
|
|
|
'PhabricatorPlatformSite' => 'PhabricatorSite',
|
2016-02-09 00:24:52 +01:00
|
|
|
'PhabricatorPointsEditField' => 'PhabricatorEditField',
|
Add basic per-object privacy policies
Summary:
Provides a basic start for access policies. Objects expose various capabilities, like CAN_VIEW, CAN_EDIT, etc., and set a policy for each capability. We currently implement three policies, PUBLIC (anyone, including logged-out), USERS (any logged-in) and NOONE (nobody). There's also a way to provide automatic capability grants (e.g., the owner of an object can always see it, even if some capability is set to "NOONE"), but I'm not sure how great the implementation feels and it might change.
Most of the code here is providing a primitive for efficient policy-aware list queries. The problem with doing queries naively is that you have to do crazy amounts of filtering, e.g. to show the user page 6, you need to filter at least 600 objects (and likely more) before you can figure out which ones are 500-600 for them. You can't just do "LIMIT 500, 100" because that might have only 50 results, or no results. Instead, the query looks like "WHERE id > last_visible_id", and then we fetch additional pages as necessary to satisfy the request.
The general idea is that we move all data access to Query classes and have them do object filtering. The ID paging primitive allows efficient paging in most cases, and the executeOne() method provides a concise way to do policy checks for edit/view screens.
We'll probably end up with mostly broader policy UIs or configuration-based policies, but there are at least a few cases for per-object privacy (e.g., marking tasks as "Security", and restricting things to the members of projects) so I figured we'd start with a flexible primitive and the simplify it in the UI where we can.
Test Plan: Unit tests, played around in the UI with various policy settings.
Reviewers: btrahan, vrana, jungejason
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T603
Differential Revision: https://secure.phabricator.com/D2210
2012-04-14 19:13:29 +02:00
|
|
|
'PhabricatorPolicies' => 'PhabricatorPolicyConstants',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorPolicy' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-01-14 21:14:22 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2013-10-14 21:07:31 +02:00
|
|
|
),
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPolicyApplication' => 'PhabricatorApplication',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorPolicyAwareQuery' => 'PhabricatorOffsetPagedQuery',
|
|
|
|
'PhabricatorPolicyAwareTestQuery' => 'PhabricatorPolicyAwareQuery',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhabricatorPolicyCanEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'PhabricatorPolicyCanJoinCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'PhabricatorPolicyCanViewCapability' => 'PhabricatorPolicyCapability',
|
Allow applications to define new policy capabilities
Summary:
Ref T603. I want to let applications define new capabilities (like "can manage global rules" in Herald) and get full support for them, including reasonable error strings in the UI.
Currently, this is difficult for a couple of reasons. Partly this is just a code organization issue, which is easy to fix. The bigger thing is that we have a bunch of strings which depend on both the policy and capability, like: "You must be an administrator to view this object." "Administrator" is the policy, and "view" is the capability.
That means every new capability has to add a string for each policy, and every new policy (should we introduce any) needs to add a string for each capability. And we can't do any piecemeal "You must be a {$role} to {$action} this object" becuase it's impossible to translate.
Instead, make all the strings depend on //only// the policy, //only// the capability, or //only// the object type. This makes the dialogs read a little more strangely, but I think it's still pretty easy to understand, and it makes adding new stuff way way easier.
Also provide more context, and more useful exception messages.
Test Plan:
- See screenshots.
- Also triggered a policy exception and verified it was dramatically more useful than it used to be.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: chad, aran
Maniphest Tasks: T603
Differential Revision: https://secure.phabricator.com/D7260
2013-10-07 22:28:58 +02:00
|
|
|
'PhabricatorPolicyCapability' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorPolicyCapabilityTestCase' => 'PhabricatorTestCase',
|
2013-01-07 21:47:26 +01:00
|
|
|
'PhabricatorPolicyConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorPolicyConstants' => 'Phobject',
|
2013-09-27 17:43:41 +02:00
|
|
|
'PhabricatorPolicyController' => 'PhabricatorController',
|
2013-10-11 01:09:51 +02:00
|
|
|
'PhabricatorPolicyDAO' => 'PhabricatorLiskDAO',
|
2013-09-25 22:45:04 +02:00
|
|
|
'PhabricatorPolicyDataTestCase' => 'PhabricatorTestCase',
|
2013-10-09 23:05:10 +02:00
|
|
|
'PhabricatorPolicyEditController' => 'PhabricatorPolicyController',
|
2015-11-29 19:05:41 +01:00
|
|
|
'PhabricatorPolicyEditEngineExtension' => 'PhabricatorEditEngineExtension',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorPolicyEditField' => 'PhabricatorEditField',
|
2012-05-30 23:26:29 +02:00
|
|
|
'PhabricatorPolicyException' => 'Exception',
|
2013-09-27 17:43:41 +02:00
|
|
|
'PhabricatorPolicyExplainController' => 'PhabricatorPolicyController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorPolicyFilter' => 'Phobject',
|
2013-10-26 00:58:17 +02:00
|
|
|
'PhabricatorPolicyInterface' => 'PhabricatorPHIDInterface',
|
2013-09-29 18:06:41 +02:00
|
|
|
'PhabricatorPolicyManagementShowWorkflow' => 'PhabricatorPolicyManagementWorkflow',
|
2013-10-02 01:01:15 +02:00
|
|
|
'PhabricatorPolicyManagementUnlockWorkflow' => 'PhabricatorPolicyManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorPolicyManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2013-10-11 01:09:51 +02:00
|
|
|
'PhabricatorPolicyPHIDTypePolicy' => 'PhabricatorPHIDType',
|
2013-10-14 21:07:31 +02:00
|
|
|
'PhabricatorPolicyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorPolicyRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorPolicyRule' => 'Phobject',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorPolicySearchEngineExtension' => 'PhabricatorSearchEngineExtension',
|
Add basic per-object privacy policies
Summary:
Provides a basic start for access policies. Objects expose various capabilities, like CAN_VIEW, CAN_EDIT, etc., and set a policy for each capability. We currently implement three policies, PUBLIC (anyone, including logged-out), USERS (any logged-in) and NOONE (nobody). There's also a way to provide automatic capability grants (e.g., the owner of an object can always see it, even if some capability is set to "NOONE"), but I'm not sure how great the implementation feels and it might change.
Most of the code here is providing a primitive for efficient policy-aware list queries. The problem with doing queries naively is that you have to do crazy amounts of filtering, e.g. to show the user page 6, you need to filter at least 600 objects (and likely more) before you can figure out which ones are 500-600 for them. You can't just do "LIMIT 500, 100" because that might have only 50 results, or no results. Instead, the query looks like "WHERE id > last_visible_id", and then we fetch additional pages as necessary to satisfy the request.
The general idea is that we move all data access to Query classes and have them do object filtering. The ID paging primitive allows efficient paging in most cases, and the executeOne() method provides a concise way to do policy checks for edit/view screens.
We'll probably end up with mostly broader policy UIs or configuration-based policies, but there are at least a few cases for per-object privacy (e.g., marking tasks as "Security", and restricting things to the members of projects) so I figured we'd start with a flexible primitive and the simplify it in the UI where we can.
Test Plan: Unit tests, played around in the UI with various policy settings.
Reviewers: btrahan, vrana, jungejason
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T603
Differential Revision: https://secure.phabricator.com/D2210
2012-04-14 19:13:29 +02:00
|
|
|
'PhabricatorPolicyTestCase' => 'PhabricatorTestCase',
|
2015-05-11 23:23:35 +02:00
|
|
|
'PhabricatorPolicyTestObject' => array(
|
2015-06-15 10:02:26 +02:00
|
|
|
'Phobject',
|
2015-05-11 23:23:35 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorExtendedPolicyInterface',
|
|
|
|
),
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorPolicyType' => 'PhabricatorPolicyConstants',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorPonderApplication' => 'PhabricatorApplication',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProfilePanel' => 'Phobject',
|
|
|
|
'PhabricatorProfilePanelConfiguration' => array(
|
|
|
|
'PhabricatorSearchDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorExtendedPolicyInterface',
|
2016-01-13 00:06:43 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2016-01-12 19:27:39 +01:00
|
|
|
),
|
|
|
|
'PhabricatorProfilePanelConfigurationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorProfilePanelConfigurationTransaction' => 'PhabricatorApplicationTransaction',
|
2016-01-19 16:28:10 +01:00
|
|
|
'PhabricatorProfilePanelConfigurationTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2016-01-13 00:06:43 +01:00
|
|
|
'PhabricatorProfilePanelEditEngine' => 'PhabricatorEditEngine',
|
|
|
|
'PhabricatorProfilePanelEditor' => 'PhabricatorApplicationTransactionEditor',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProfilePanelEngine' => 'Phobject',
|
2016-01-13 00:06:43 +01:00
|
|
|
'PhabricatorProfilePanelIconSet' => 'PhabricatorIconSet',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProfilePanelPHIDType' => 'PhabricatorPHIDType',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorProject' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorProjectDAO',
|
2014-12-03 21:28:53 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
2015-12-23 12:42:51 +01:00
|
|
|
'PhabricatorExtendedPolicyInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorCustomFieldInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2015-12-27 11:44:07 +01:00
|
|
|
'PhabricatorConduitResultInterface',
|
2016-02-02 18:53:18 +01:00
|
|
|
'PhabricatorColumnProxyInterface',
|
2012-08-10 00:42:44 +02:00
|
|
|
),
|
2015-07-24 19:56:52 +02:00
|
|
|
'PhabricatorProjectAddHeraldAction' => 'PhabricatorProjectHeraldAction',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorProjectApplication' => 'PhabricatorApplication',
|
2014-02-10 23:30:47 +01:00
|
|
|
'PhabricatorProjectArchiveController' => 'PhabricatorProjectController',
|
2016-02-16 15:52:32 +01:00
|
|
|
'PhabricatorProjectBoardBackgroundController' => 'PhabricatorProjectBoardController',
|
Add a secret board view to Projects
Summary:
Ref T1344. This is //very// rough. Some UI issues:
- Empty states for the board and columns are junky.
- Column widths are crazy. I think we need to set them to fixed-width, since we may have an arbitrarily large number of columns?
- I don't think we have the header UI elements in M10 yet and that mock is pretty old, so I sort of very roughly approximated it.
- What should we do when you click a task title? Popping the whole task in a dialog is possible but needs a bunch of work to actually work. Might need to build "sheets" or something.
- Icons are slightly clipped for some reason.
- All the backend stuff is totally faked.
Generally, my plan is just to use these to implement all of T390. Specifically:
- "Kanban" projects will have "Backlog" on the left. You'll drag them toward the right as you make progress.
- "Milestone" projects will have "No Milestone" on the left, then "Milestone 9", "Milestone 8", etc.
- "Sprint" projects will have "Backlog" on the left, then "Sprint 31", "Sprint 30", etc.
So all of these things end up being pretty much exactly the same, with some minor text changes and new columns showing up on the left vs the right or whatever.
Test Plan: See screenshot.
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: chad, aran, sascha-egerer
Maniphest Tasks: T1344
Differential Revision: https://secure.phabricator.com/D7374
2013-10-22 06:11:36 +02:00
|
|
|
'PhabricatorProjectBoardController' => 'PhabricatorProjectController',
|
2016-02-08 20:24:32 +01:00
|
|
|
'PhabricatorProjectBoardDisableController' => 'PhabricatorProjectBoardController',
|
2014-08-05 22:40:41 +02:00
|
|
|
'PhabricatorProjectBoardImportController' => 'PhabricatorProjectBoardController',
|
2016-02-16 15:24:15 +01:00
|
|
|
'PhabricatorProjectBoardManageController' => 'PhabricatorProjectBoardController',
|
2014-07-12 04:27:07 +02:00
|
|
|
'PhabricatorProjectBoardReorderController' => 'PhabricatorProjectBoardController',
|
2014-03-26 22:40:47 +01:00
|
|
|
'PhabricatorProjectBoardViewController' => 'PhabricatorProjectBoardController',
|
2016-02-05 05:11:36 +01:00
|
|
|
'PhabricatorProjectCardView' => 'AphrontTagView',
|
2016-01-22 13:33:23 +01:00
|
|
|
'PhabricatorProjectColorsConfigOptionType' => 'PhabricatorConfigJSONOptionType',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorProjectColumn' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorProjectDAO',
|
2014-12-03 21:28:53 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2016-02-13 19:02:42 +01:00
|
|
|
'PhabricatorExtendedPolicyInterface',
|
Add a secret board view to Projects
Summary:
Ref T1344. This is //very// rough. Some UI issues:
- Empty states for the board and columns are junky.
- Column widths are crazy. I think we need to set them to fixed-width, since we may have an arbitrarily large number of columns?
- I don't think we have the header UI elements in M10 yet and that mock is pretty old, so I sort of very roughly approximated it.
- What should we do when you click a task title? Popping the whole task in a dialog is possible but needs a bunch of work to actually work. Might need to build "sheets" or something.
- Icons are slightly clipped for some reason.
- All the backend stuff is totally faked.
Generally, my plan is just to use these to implement all of T390. Specifically:
- "Kanban" projects will have "Backlog" on the left. You'll drag them toward the right as you make progress.
- "Milestone" projects will have "No Milestone" on the left, then "Milestone 9", "Milestone 8", etc.
- "Sprint" projects will have "Backlog" on the left, then "Sprint 31", "Sprint 30", etc.
So all of these things end up being pretty much exactly the same, with some minor text changes and new columns showing up on the left vs the right or whatever.
Test Plan: See screenshot.
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: chad, aran, sascha-egerer
Maniphest Tasks: T1344
Differential Revision: https://secure.phabricator.com/D7374
2013-10-22 06:11:36 +02:00
|
|
|
),
|
2014-03-26 22:40:47 +01:00
|
|
|
'PhabricatorProjectColumnDetailController' => 'PhabricatorProjectBoardController',
|
Allow columns to have a point limit
Summary:
Fixes T5885. This implements optional soft point limits for workboard columns, per traditional Kanban.
- Allow columns to have a point limit set.
- When a column has a point limit, show it in the header.
- If a column has too many points in it, show the column and point count in red.
@chad, this could probably use some design tweaks. In particular:
- I changed the color of "hidden" columns to avoid confusion with "overfull" columns. We might be able to find a better color.
- UI hints for overfull columns might need adjustment.
(After T4427, we'll let you sum some custom field instead of total number of tasks, which is why this is called "points" rather than "number of tasks".)
Test Plan:
{F190914}
Note that:
- "Pre-planning" has a limit, so it shows "4/12".
- "Planning" has a limit and is overfull, so it shows "5 / 4".
- Other columns do not have limits.
- "Post-planning" is a hidden column. This might be too muted now.
Transactions:
{F190915}
Error messages / edit screen:
{F190916}
Reviewers: btrahan, chad
Reviewed By: btrahan
Subscribers: chad, epriestley
Maniphest Tasks: T5885
Differential Revision: https://secure.phabricator.com/D10276
2014-08-15 20:16:08 +02:00
|
|
|
'PhabricatorProjectColumnEditController' => 'PhabricatorProjectBoardController',
|
2014-09-04 21:47:32 +02:00
|
|
|
'PhabricatorProjectColumnHideController' => 'PhabricatorProjectBoardController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorProjectColumnPHIDType' => 'PhabricatorPHIDType',
|
2014-08-07 00:09:09 +02:00
|
|
|
'PhabricatorProjectColumnPosition' => array(
|
|
|
|
'PhabricatorProjectDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhabricatorProjectColumnPositionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
Add a secret board view to Projects
Summary:
Ref T1344. This is //very// rough. Some UI issues:
- Empty states for the board and columns are junky.
- Column widths are crazy. I think we need to set them to fixed-width, since we may have an arbitrarily large number of columns?
- I don't think we have the header UI elements in M10 yet and that mock is pretty old, so I sort of very roughly approximated it.
- What should we do when you click a task title? Popping the whole task in a dialog is possible but needs a bunch of work to actually work. Might need to build "sheets" or something.
- Icons are slightly clipped for some reason.
- All the backend stuff is totally faked.
Generally, my plan is just to use these to implement all of T390. Specifically:
- "Kanban" projects will have "Backlog" on the left. You'll drag them toward the right as you make progress.
- "Milestone" projects will have "No Milestone" on the left, then "Milestone 9", "Milestone 8", etc.
- "Sprint" projects will have "Backlog" on the left, then "Sprint 31", "Sprint 30", etc.
So all of these things end up being pretty much exactly the same, with some minor text changes and new columns showing up on the left vs the right or whatever.
Test Plan: See screenshot.
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: chad, aran, sascha-egerer
Maniphest Tasks: T1344
Differential Revision: https://secure.phabricator.com/D7374
2013-10-22 06:11:36 +02:00
|
|
|
'PhabricatorProjectColumnQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-03-26 22:40:47 +01:00
|
|
|
'PhabricatorProjectColumnTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorProjectColumnTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhabricatorProjectColumnTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-02-10 23:31:34 +01:00
|
|
|
'PhabricatorProjectConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorProjectConfiguredCustomField' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorProjectStandardCustomField',
|
|
|
|
'PhabricatorStandardCustomFieldInterface',
|
2014-02-10 23:31:34 +01:00
|
|
|
),
|
2011-02-21 03:41:23 +01:00
|
|
|
'PhabricatorProjectController' => 'PhabricatorController',
|
2015-12-23 12:42:42 +01:00
|
|
|
'PhabricatorProjectCoreTestCase' => 'PhabricatorTestCase',
|
2016-02-06 23:05:15 +01:00
|
|
|
'PhabricatorProjectCoverController' => 'PhabricatorProjectController',
|
2014-02-10 23:31:34 +01:00
|
|
|
'PhabricatorProjectCustomField' => 'PhabricatorCustomField',
|
Add a secret board view to Projects
Summary:
Ref T1344. This is //very// rough. Some UI issues:
- Empty states for the board and columns are junky.
- Column widths are crazy. I think we need to set them to fixed-width, since we may have an arbitrarily large number of columns?
- I don't think we have the header UI elements in M10 yet and that mock is pretty old, so I sort of very roughly approximated it.
- What should we do when you click a task title? Popping the whole task in a dialog is possible but needs a bunch of work to actually work. Might need to build "sheets" or something.
- Icons are slightly clipped for some reason.
- All the backend stuff is totally faked.
Generally, my plan is just to use these to implement all of T390. Specifically:
- "Kanban" projects will have "Backlog" on the left. You'll drag them toward the right as you make progress.
- "Milestone" projects will have "No Milestone" on the left, then "Milestone 9", "Milestone 8", etc.
- "Sprint" projects will have "Backlog" on the left, then "Sprint 31", "Sprint 30", etc.
So all of these things end up being pretty much exactly the same, with some minor text changes and new columns showing up on the left vs the right or whatever.
Test Plan: See screenshot.
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: chad, aran, sascha-egerer
Maniphest Tasks: T1344
Differential Revision: https://secure.phabricator.com/D7374
2013-10-22 06:11:36 +02:00
|
|
|
'PhabricatorProjectCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage',
|
|
|
|
'PhabricatorProjectCustomFieldStorage' => 'PhabricatorCustomFieldStorage',
|
|
|
|
'PhabricatorProjectCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage',
|
2011-02-21 03:41:23 +01:00
|
|
|
'PhabricatorProjectDAO' => 'PhabricatorLiskDAO',
|
2014-07-11 02:28:29 +02:00
|
|
|
'PhabricatorProjectDatasource' => 'PhabricatorTypeaheadDatasource',
|
2016-02-12 15:19:26 +01:00
|
|
|
'PhabricatorProjectDefaultController' => 'PhabricatorProjectBoardController',
|
2014-02-10 23:31:57 +01:00
|
|
|
'PhabricatorProjectDescriptionField' => 'PhabricatorProjectStandardCustomField',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProjectDetailsProfilePanel' => 'PhabricatorProfilePanel',
|
2015-12-27 15:45:53 +01:00
|
|
|
'PhabricatorProjectEditController' => 'PhabricatorProjectController',
|
|
|
|
'PhabricatorProjectEditEngine' => 'PhabricatorEditEngine',
|
2014-02-17 05:17:52 +01:00
|
|
|
'PhabricatorProjectEditPictureController' => 'PhabricatorProjectController',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorProjectFulltextEngine' => 'PhabricatorFulltextEngine',
|
2015-07-24 19:56:52 +02:00
|
|
|
'PhabricatorProjectHeraldAction' => 'HeraldAction',
|
2016-01-20 02:18:17 +01:00
|
|
|
'PhabricatorProjectHeraldAdapter' => 'HeraldAdapter',
|
|
|
|
'PhabricatorProjectHeraldFieldGroup' => 'HeraldFieldGroup',
|
2016-02-11 23:55:44 +01:00
|
|
|
'PhabricatorProjectHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension',
|
2015-12-16 16:53:13 +01:00
|
|
|
'PhabricatorProjectIconSet' => 'PhabricatorIconSet',
|
2016-01-22 13:33:23 +01:00
|
|
|
'PhabricatorProjectIconsConfigOptionType' => 'PhabricatorConfigJSONOptionType',
|
2014-05-09 21:25:52 +02:00
|
|
|
'PhabricatorProjectListController' => 'PhabricatorProjectController',
|
2015-12-27 14:16:36 +01:00
|
|
|
'PhabricatorProjectListView' => 'AphrontView',
|
2015-12-27 15:56:15 +01:00
|
|
|
'PhabricatorProjectLockController' => 'PhabricatorProjectController',
|
2015-12-29 14:06:47 +01:00
|
|
|
'PhabricatorProjectLogicalAncestorDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-04-18 20:04:50 +02:00
|
|
|
'PhabricatorProjectLogicalDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-04-18 18:58:33 +02:00
|
|
|
'PhabricatorProjectLogicalOrNotDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-04-18 20:04:50 +02:00
|
|
|
'PhabricatorProjectLogicalUserDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
|
|
|
'PhabricatorProjectLogicalViewerDatasource' => 'PhabricatorTypeaheadDatasource',
|
2016-01-24 01:02:29 +01:00
|
|
|
'PhabricatorProjectManageController' => 'PhabricatorProjectController',
|
|
|
|
'PhabricatorProjectManageProfilePanel' => 'PhabricatorProfilePanel',
|
2015-12-23 12:12:20 +01:00
|
|
|
'PhabricatorProjectMaterializedMemberEdgeType' => 'PhabricatorEdgeType',
|
2016-01-20 01:27:36 +01:00
|
|
|
'PhabricatorProjectMemberListView' => 'PhabricatorProjectUserListView',
|
2015-01-02 00:10:58 +01:00
|
|
|
'PhabricatorProjectMemberOfProjectEdgeType' => 'PhabricatorEdgeType',
|
2016-01-20 01:27:36 +01:00
|
|
|
'PhabricatorProjectMembersAddController' => 'PhabricatorProjectController',
|
2015-04-18 18:26:04 +02:00
|
|
|
'PhabricatorProjectMembersDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-12-24 01:34:01 +01:00
|
|
|
'PhabricatorProjectMembersPolicyRule' => 'PhabricatorPolicyRule',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProjectMembersProfilePanel' => 'PhabricatorProfilePanel',
|
2014-03-20 03:30:27 +01:00
|
|
|
'PhabricatorProjectMembersRemoveController' => 'PhabricatorProjectController',
|
2016-01-20 01:27:36 +01:00
|
|
|
'PhabricatorProjectMembersViewController' => 'PhabricatorProjectController',
|
2014-01-13 21:24:36 +01:00
|
|
|
'PhabricatorProjectMoveController' => 'PhabricatorProjectController',
|
2015-12-24 14:29:57 +01:00
|
|
|
'PhabricatorProjectNameContextFreeGrammar' => 'PhutilContextFreeGrammar',
|
2015-04-18 18:58:33 +02:00
|
|
|
'PhabricatorProjectNoProjectsDatasource' => 'PhabricatorTypeaheadDatasource',
|
2014-07-18 00:42:19 +02:00
|
|
|
'PhabricatorProjectObjectHasProjectEdgeType' => 'PhabricatorEdgeType',
|
2014-07-18 00:45:07 +02:00
|
|
|
'PhabricatorProjectOrUserDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-08-31 19:17:54 +02:00
|
|
|
'PhabricatorProjectOrUserFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorProjectPHIDResolver' => 'PhabricatorPHIDResolver',
|
2016-01-13 00:06:43 +01:00
|
|
|
'PhabricatorProjectPanelController' => 'PhabricatorProjectController',
|
2016-02-09 02:31:21 +01:00
|
|
|
'PhabricatorProjectPointsProfilePanel' => 'PhabricatorProfilePanel',
|
2011-02-21 03:41:23 +01:00
|
|
|
'PhabricatorProjectProfileController' => 'PhabricatorProjectController',
|
2016-01-14 14:59:25 +01:00
|
|
|
'PhabricatorProjectProfilePanelEngine' => 'PhabricatorProfilePanelEngine',
|
2015-01-02 00:10:58 +01:00
|
|
|
'PhabricatorProjectProjectHasMemberEdgeType' => 'PhabricatorEdgeType',
|
2014-07-18 00:42:19 +02:00
|
|
|
'PhabricatorProjectProjectHasObjectEdgeType' => 'PhabricatorEdgeType',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorProjectProjectPHIDType' => 'PhabricatorPHIDType',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorProjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-07-24 19:56:52 +02:00
|
|
|
'PhabricatorProjectRemoveHeraldAction' => 'PhabricatorProjectHeraldAction',
|
2014-10-01 16:37:01 +02:00
|
|
|
'PhabricatorProjectSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-07-22 17:34:35 +02:00
|
|
|
'PhabricatorProjectSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-07-06 14:52:04 +02:00
|
|
|
'PhabricatorProjectSearchField' => 'PhabricatorSearchTokenizerField',
|
Replace subscribe/unsubscribe for projects with explicit mail setting
Summary:
Ref T10054. Ref T6113. Users can currently subscribe to projects, which causes them to receive:
# mail about project membership changes, description changes, etc; and
# mail to the project, e.g. when the project is added as a subscriber on a task, or a reviewer on a revision.
Almost no one cares about (1), and after D15061 you can use Herald to get this stuff if you really want it. (It will get progressively more annoying in the future with external membership sources causing automated project membership updates.)
A lot of users are confused about (2) and how it relates to membership, watching, etc, and most users who want (2) don't want (1).
Instead, add an explicit option for this and explain what it does.
This is fairly verbose but I've hidden it on the member/watch screen, which is now the "explain how projects work" screen, I guess.
Test Plan:
{F1064929}
{F1064930}
{F1064931}
- Disabled/enabled mail for a project.
- Sent mail to a project with mail disabled, verified I didn't get a copy.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T6113, T10054
Differential Revision: https://secure.phabricator.com/D15065
2016-01-20 03:56:15 +01:00
|
|
|
'PhabricatorProjectSilenceController' => 'PhabricatorProjectController',
|
|
|
|
'PhabricatorProjectSilencedEdgeType' => 'PhabricatorEdgeType',
|
2014-05-22 20:19:03 +02:00
|
|
|
'PhabricatorProjectSlug' => 'PhabricatorProjectDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorProjectStandardCustomField' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorProjectCustomField',
|
|
|
|
'PhabricatorStandardCustomFieldInterface',
|
2014-02-10 23:31:57 +01:00
|
|
|
),
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorProjectStatus' => 'Phobject',
|
2016-02-01 16:04:19 +01:00
|
|
|
'PhabricatorProjectSubprojectWarningController' => 'PhabricatorProjectController',
|
2015-12-27 13:47:08 +01:00
|
|
|
'PhabricatorProjectSubprojectsController' => 'PhabricatorProjectController',
|
2016-02-01 16:04:19 +01:00
|
|
|
'PhabricatorProjectSubprojectsProfilePanel' => 'PhabricatorProfilePanel',
|
2013-04-29 21:17:55 +02:00
|
|
|
'PhabricatorProjectTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2013-10-22 22:49:28 +02:00
|
|
|
'PhabricatorProjectTransaction' => 'PhabricatorApplicationTransaction',
|
2014-02-10 23:30:00 +01:00
|
|
|
'PhabricatorProjectTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
2013-10-22 22:49:37 +02:00
|
|
|
'PhabricatorProjectTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-06-04 02:19:40 +02:00
|
|
|
'PhabricatorProjectUIEventListener' => 'PhabricatorEventListener',
|
2012-01-25 20:51:20 +01:00
|
|
|
'PhabricatorProjectUpdateController' => 'PhabricatorProjectController',
|
2015-08-31 19:17:54 +02:00
|
|
|
'PhabricatorProjectUserFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2016-01-20 01:27:36 +01:00
|
|
|
'PhabricatorProjectUserListView' => 'AphrontView',
|
2015-01-12 19:04:01 +01:00
|
|
|
'PhabricatorProjectViewController' => 'PhabricatorProjectController',
|
2014-05-19 21:40:57 +02:00
|
|
|
'PhabricatorProjectWatchController' => 'PhabricatorProjectController',
|
2016-01-20 01:27:36 +01:00
|
|
|
'PhabricatorProjectWatcherListView' => 'PhabricatorProjectUserListView',
|
2016-02-16 15:52:32 +01:00
|
|
|
'PhabricatorProjectWorkboardBackgroundColor' => 'Phobject',
|
2016-01-12 19:27:39 +01:00
|
|
|
'PhabricatorProjectWorkboardProfilePanel' => 'PhabricatorProfilePanel',
|
2016-03-05 23:45:56 +01:00
|
|
|
'PhabricatorProjectsCurtainExtension' => 'PHUICurtainExtension',
|
2015-11-29 19:05:41 +01:00
|
|
|
'PhabricatorProjectsEditEngineExtension' => 'PhabricatorEditEngineExtension',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorProjectsEditField' => 'PhabricatorTokenizerEditField',
|
2015-12-21 15:31:31 +01:00
|
|
|
'PhabricatorProjectsFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension',
|
2016-01-24 16:19:54 +01:00
|
|
|
'PhabricatorProjectsMembersSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
|
2015-12-23 12:12:20 +01:00
|
|
|
'PhabricatorProjectsMembershipIndexEngineExtension' => 'PhabricatorIndexEngineExtension',
|
2015-01-03 13:48:19 +01:00
|
|
|
'PhabricatorProjectsPolicyRule' => 'PhabricatorPolicyRule',
|
2015-12-14 14:41:26 +01:00
|
|
|
'PhabricatorProjectsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
|
2015-12-13 13:12:34 +01:00
|
|
|
'PhabricatorProjectsSearchEngineExtension' => 'PhabricatorSearchEngineExtension',
|
2016-01-24 16:19:54 +01:00
|
|
|
'PhabricatorProjectsWatchersSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorProtocolAdapter' => 'Phobject',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorPygmentSetupCheck' => 'PhabricatorSetupCheck',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorQuery' => 'Phobject',
|
2015-04-18 16:53:43 +02:00
|
|
|
'PhabricatorQueryConstraint' => 'Phobject',
|
2015-04-11 21:10:35 +02:00
|
|
|
'PhabricatorQueryOrderItem' => 'Phobject',
|
|
|
|
'PhabricatorQueryOrderTestCase' => 'PhabricatorTestCase',
|
|
|
|
'PhabricatorQueryOrderVector' => array(
|
|
|
|
'Phobject',
|
|
|
|
'Iterator',
|
|
|
|
),
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorRateLimitRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
|
2013-01-03 18:17:38 +01:00
|
|
|
'PhabricatorRecaptchaConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-07-22 22:37:20 +02:00
|
|
|
'PhabricatorRecipientHasBadgeEdgeType' => 'PhabricatorEdgeType',
|
2011-04-04 19:29:46 +02:00
|
|
|
'PhabricatorRedirectController' => 'PhabricatorController',
|
Fix conservative CSRF token cycling limit
Summary:
We currently cycle CSRF tokens every hour and check for the last two valid ones.
This means that a form could go stale in as little as an hour, and is certainly
stale after two.
When a stale form is submitted, you basically get a terrible heisen-state where
some of your data might persist if you're lucky but more likely it all just
vanishes. The .js file below outlines some more details.
This is a pretty terrible UX and we don't need to be as conservative about CSRF
validation as we're being. Remedy this problem by:
- Accepting the last 6 CSRF tokens instead of the last 1 (i.e., pages are
valid for at least 6 hours, and for as long as 7).
- Using JS to refresh the CSRF token every 55 minutes (i.e., pages connected
to the internet are valid indefinitely).
- Showing the user an explicit message about what went wrong when CSRF
validation fails so the experience is less bewildering.
They should now only be able to submit with a bad CSRF token if:
- They load a page, disconnect from the internet for 7 hours, reconnect, and
submit the form within 55 minutes; or
- They are actually the victim of a CSRF attack.
We could eventually fix the first one by tracking reconnects, which might be
"free" once the notification server gets built. It will probably never be an
issue in practice.
Test Plan:
- Reduced CSRF cycle frequency to 2 seconds, submitted a form after 15
seconds, got the CSRF exception.
- Reduced csrf-refresh cycle frequency to 3 seconds, submitted a form after 15
seconds, got a clean form post.
- Added debugging code the the csrf refresh to make sure it was doing sensible
things (pulling different tokens, finding all the inputs).
Reviewed By: aran
Reviewers: tuomaspelkonen, jungejason, aran
CC: aran, epriestley
Differential Revision: 660
2011-07-13 23:05:18 +02:00
|
|
|
'PhabricatorRefreshCSRFController' => 'PhabricatorAuthController',
|
New Registration Workflow
Summary:
Currently, registration and authentication are pretty messy. Two concrete problems:
- The `PhabricatorLDAPRegistrationController` and `PhabricatorOAuthDefaultRegistrationController` controllers are giant copy/pastes of one another. This is really bad.
- We can't practically implement OpenID because we can't reissue the authentication request.
Additionally, the OAuth registration controller can be replaced wholesale by config, which is a huge API surface area and a giant mess.
Broadly, the problem right now is that registration does too much: we hand it some set of indirect credentials (like OAuth tokens) and expect it to take those the entire way to a registered user. Instead, break registration into smaller steps:
- User authenticates with remote service.
- Phabricator pulls information (remote account ID, username, email, real name, profile picture, etc) from the remote service and saves it as `PhabricatorUserCredentials`.
- Phabricator hands the `PhabricatorUserCredentials` to the registration form, which is agnostic about where they originate from: it can process LDAP credentials, OAuth credentials, plain old email credentials, HTTP basic auth credentials, etc.
This doesn't do anything yet -- there is no way to create credentials objects (and no storage patch), but I wanted to get any initial feedback, especially about the event call for T2394. In particular, I think the implementation would look something like this:
$profile = $event->getValue('profile')
$username = $profile->getDefaultUsername();
$is_employee = is_this_a_facebook_employee($username);
if (!$is_employee) {
throw new Exception("You are not employed at Facebook.");
}
$fbid = get_fbid_for_facebook_username($username);
$profile->setDefaultEmail($fbid);
$profile->setCanEditUsername(false);
$profile->setCanEditEmail(false);
$profile->setCanEditRealName(false);
$profile->setShouldVerifyEmail(true);
Seem reasonable?
Test Plan: N/A yet, probably fatals.
Reviewers: vrana, btrahan, codeblock, chad
Reviewed By: btrahan
CC: aran, asherkin, nh, wez
Maniphest Tasks: T1536, T2394
Differential Revision: https://secure.phabricator.com/D4647
2013-06-16 19:13:49 +02:00
|
|
|
'PhabricatorRegistrationProfile' => 'Phobject',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorReleephApplication' => 'PhabricatorApplication',
|
|
|
|
'PhabricatorReleephApplicationConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2012-09-19 21:27:28 +02:00
|
|
|
'PhabricatorRemarkupControl' => 'AphrontFormTextAreaControl',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorRemarkupCowsayBlockInterpreter' => 'PhutilRemarkupBlockInterpreter',
|
|
|
|
'PhabricatorRemarkupCustomBlockRule' => 'PhutilRemarkupBlockRule',
|
2013-10-25 02:26:07 +02:00
|
|
|
'PhabricatorRemarkupCustomInlineRule' => 'PhutilRemarkupRule',
|
2015-11-17 18:33:06 +01:00
|
|
|
'PhabricatorRemarkupEditField' => 'PhabricatorEditField',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorRemarkupFigletBlockInterpreter' => 'PhutilRemarkupBlockInterpreter',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorRemarkupUIExample' => 'PhabricatorUIExample',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorRepositoriesSetupCheck' => 'PhabricatorSetupCheck',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorRepository' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorRepositoryDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorMarkupInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
|
|
|
'PhabricatorProjectInterface',
|
2015-06-24 19:56:46 +02:00
|
|
|
'PhabricatorSpacesInterface',
|
2016-04-17 01:45:19 +02:00
|
|
|
'PhabricatorConduitResultInterface',
|
2012-12-19 20:07:06 +01:00
|
|
|
),
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorRepositoryAuditRequest' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorRepositoryDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-04-27 18:43:05 +02:00
|
|
|
),
|
2012-11-06 08:09:36 +01:00
|
|
|
'PhabricatorRepositoryBranch' => 'PhabricatorRepositoryDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorRepositoryCommit' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorRepositoryDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
2014-11-21 02:25:02 +01:00
|
|
|
'PhabricatorProjectInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorTokenReceiverInterface',
|
2014-08-02 09:06:13 +02:00
|
|
|
'PhabricatorSubscribableInterface',
|
2014-09-09 23:21:13 +02:00
|
|
|
'PhabricatorMentionableInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'HarbormasterBuildableInterface',
|
2015-10-15 05:01:22 +02:00
|
|
|
'HarbormasterCircleCIBuildableInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorCustomFieldInterface',
|
2014-08-04 21:03:58 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2013-02-27 17:04:54 +01:00
|
|
|
),
|
2011-03-11 18:34:22 +01:00
|
|
|
'PhabricatorRepositoryCommitChangeParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
|
|
|
'PhabricatorRepositoryCommitData' => 'PhabricatorRepositoryDAO',
|
2011-04-04 08:23:36 +02:00
|
|
|
'PhabricatorRepositoryCommitHeraldWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
2011-03-11 18:34:22 +01:00
|
|
|
'PhabricatorRepositoryCommitMessageParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
Add Related Commits for Owners
Summary:
For each commit, find the affected packages, and provide a way to
search by package.
Test Plan:
create commits that touch and don't touch two packages, and verify
that they display correctly in all the UI pages.
Reviewers: epriestley, blair, nh, tuomaspelkonen
Reviewed By: epriestley
CC: benmathews, aran, epriestley, btrahan, jungejason, mpodobnik, prithvi
Maniphest Tasks: T83
Differential Revision: 1208
2011-12-14 09:53:25 +01:00
|
|
|
'PhabricatorRepositoryCommitOwnersWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorRepositoryCommitPHIDType' => 'PhabricatorPHIDType',
|
2011-03-11 18:34:22 +01:00
|
|
|
'PhabricatorRepositoryCommitParserWorker' => 'PhabricatorWorker',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorRepositoryCommitRef' => 'Phobject',
|
2013-01-16 18:35:47 +01:00
|
|
|
'PhabricatorRepositoryConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-02-13 03:26:15 +01:00
|
|
|
'PhabricatorRepositoryDAO' => 'PhabricatorLiskDAO',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorRepositoryDiscoveryEngine' => 'PhabricatorRepositoryEngine',
|
2013-05-24 21:37:42 +02:00
|
|
|
'PhabricatorRepositoryEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorRepositoryEngine' => 'Phobject',
|
2011-03-11 18:34:22 +01:00
|
|
|
'PhabricatorRepositoryGitCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker',
|
|
|
|
'PhabricatorRepositoryGitCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker',
|
2016-03-17 20:49:18 +01:00
|
|
|
'PhabricatorRepositoryGitLFSRef' => array(
|
|
|
|
'PhabricatorRepositoryDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2016-03-18 15:16:24 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2016-03-17 20:49:18 +01:00
|
|
|
),
|
|
|
|
'PhabricatorRepositoryGitLFSRefQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorRepositoryGraphCache' => 'Phobject',
|
2014-01-17 00:31:52 +01:00
|
|
|
'PhabricatorRepositoryGraphStream' => 'Phobject',
|
Implement a chunked, APC-backed graph cache
Summary:
Ref T2683. This is a refinement and simplification of D5257. In particular:
- D5257 only cached the commit chain, not path changes. This meant that we had to go issue an awkward query (which was slow on Facebook's install) periodically while reading the cache. This was reasonable locally but killed performance at FB scale. Instead, we can include path information in the cache. It is very rare that this is large except in Subversion, and we do not need to use this cache in Subversion. In other VCSes, the scale of this data is quite small (a handful of bytes per commit on average).
- D5257 required a large, slow offline computation step. This relies on D9044 to populate parent data so we can build the cache online at will, and let it expire with normal LRU/LFU/whatever semantics. We need this parent data for other reasons anyway.
- D5257 separated graph chunks per-repository. This change assumes we'll be able to pull stuff from APC most of the time and that the cost of switching chunks is not very large, so we can just build one chunk cache across all repositories. This allows the cache to be simpler.
- D5257 needed an offline cache, and used a unique cache structure. Since this one can be built online it can mostly use normal cache code.
- This also supports online appends to the cache.
- Finally, this has a timeout to guarantee a ceiling on the worst case: the worst case is something like a query for a file that has never existed, in a repository which receives exactly 1 commit every time other repositories receive 4095 commits, on a cold cache. If we hit cases like this we can bail after warming the cache up a bit and fall back to asking the VCS for an answer.
This cache isn't perfect, but I believe it will give us substantial gains in the average case. It can often satisfy "average-looking" queries in 4-8ms, and pathological-ish queries in 20ms on my machine; `hg` usually can't even start up in less than 100ms. The major thing that's attractive about this approach is that it does not require anything external or complicated, and will "just work", even producing reasonble improvements for users without APC.
In followups, I'll modify queries to use this cache and see if it holds up in more realistic workloads.
Test Plan:
- Used `bin/repository cache` to examine the behavior of this cache.
- Did some profiling/testing from the web UI using `debug.php`.
- This //appears// to provide a reasonable fast way to issue this query very quickly in the average case, without the various issues that plagued D5257.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley, jhurwitz
Maniphest Tasks: T2683
Differential Revision: https://secure.phabricator.com/D9045
2014-05-10 19:10:13 +02:00
|
|
|
'PhabricatorRepositoryManagementCacheWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2016-04-25 16:45:10 +02:00
|
|
|
'PhabricatorRepositoryManagementClusterizeWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementDiscoverWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2013-11-06 20:26:41 +01:00
|
|
|
'PhabricatorRepositoryManagementImportingWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2015-07-16 23:11:33 +02:00
|
|
|
'PhabricatorRepositoryManagementListPathsWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementListWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2013-12-19 20:05:17 +01:00
|
|
|
'PhabricatorRepositoryManagementLookupUsersWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2013-11-06 20:26:24 +01:00
|
|
|
'PhabricatorRepositoryManagementMarkImportedWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2014-01-25 23:01:58 +01:00
|
|
|
'PhabricatorRepositoryManagementMirrorWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2015-07-16 23:11:33 +02:00
|
|
|
'PhabricatorRepositoryManagementMovePathsWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
Record parent relationships when discovering commits
Summary:
Ref T4455. This adds a `repository_parents` table which stores `<childCommitID, parentCommitID>` relationships.
For new commits, it is populated when commits are discovered.
For older commits, there's a `bin/repository parents` script to rebuild the data.
Right now, there's no UI suggestion that you should run the script. I haven't come up with a super clean way to do this, and this table will only improve performance for now, so it's not important that we get everyone to run the script right away. I'm just leaving it for the moment, and we can figure out how to tell admins to run it later.
The ultimate goal is to solve T2683, but solving T4455 gets us some stuff anyway (for example, we can serve `diffusion.commitparentsquery` faster out of this cache).
Test Plan:
- Used `bin/repository discover` to discover new commits in Git, SVN and Mercurial repositories.
- Used `bin/repository parents` to rebuild Git and Mercurial repositories (SVN repos just exit with a message).
- Verified that the table appears to be sensible.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: jhurwitz, epriestley
Maniphest Tasks: T4455
Differential Revision: https://secure.phabricator.com/D9044
2014-05-10 21:41:18 +02:00
|
|
|
'PhabricatorRepositoryManagementParentsWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementPullWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2014-01-16 21:05:30 +01:00
|
|
|
'PhabricatorRepositoryManagementRefsWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2015-01-06 20:42:15 +01:00
|
|
|
'PhabricatorRepositoryManagementReparseWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2016-04-20 15:54:53 +02:00
|
|
|
'PhabricatorRepositoryManagementThawWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2014-04-16 22:00:29 +02:00
|
|
|
'PhabricatorRepositoryManagementUpdateWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorRepositoryManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
Basic support for Mercurial in Diffusion
Summary: Change import script plus almost all the view stuff. Still some rough
edges but this seems to mostly work. Blame is currently unsupported but I think
everything else works properly.
Test Plan:
Imported the hg repository itself. It doesn't immediately seem completely
broken. Here are some screens:
https://secure.phabricator.com/file/view/PHID-FILE-1438b71cc7c4a2eb4569/
https://secure.phabricator.com/file/view/PHID-FILE-3cec4f72f39e7de2d041/
https://secure.phabricator.com/file/view/PHID-FILE-2ea4883f160e8e5098f9/
https://secure.phabricator.com/file/view/PHID-FILE-35f751a36ebf65399ade/
All the parsers were able to churn through it without errors.
Ran the new "reparse.php" script in various one-commit and repository modes.
Browsed/imported some git repos for good measure.
NOTE: The hg repository is only 15,000 commits and around 1,000 files.
Performance is okay but hg doesn't provide performant, native APIs to get some
data efficiently so we have to do some dumb stuff. If some of these interfaces
are cripplingly slow or whatever, let me know and we can start bundling some
Mercurial extensions with Arcanist.
Reviewers: Makinde, jungejason, nh, tuomaspelkonen, aran
Reviewed By: Makinde
CC: aran, Makinde, epriestley
Differential Revision: 960
2011-09-26 20:07:38 +02:00
|
|
|
'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker',
|
2011-09-16 18:37:15 +02:00
|
|
|
'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker',
|
2016-05-03 22:40:13 +02:00
|
|
|
'PhabricatorRepositoryMirror' => 'PhabricatorRepositoryDAO',
|
2014-01-25 23:01:58 +01:00
|
|
|
'PhabricatorRepositoryMirrorEngine' => 'PhabricatorRepositoryEngine',
|
Begin making change parsers testable
Summary:
Ref T4327. There are a bunch of other probably-related tasks too, some linked there.
We have some rare/unusual bugs in the change parsers, mostly in Subversion, but it's terrifying to touch them because they're complicated and fragile and have no test coverage.
To fix this stuff, I want to make them more testable. In particular, they basically end with this big INSERT right now. Instead, I'm going to make them return objects representing the data to be inserted, then have the common infrastructure do the insert. This gives us two benefits:
- Reduced code duplication on the insert;
- we can stop before the insert and have unit tests examine the objects.
This swaps the Git parser over, but doesn't swap the hg/svn parsers yet. I'll do those separately, the SVN one looks a bit tricky.
Test Plan:
- Used `scripts/repository/reparse.php` to reparse a Git commit, with `--trace`. Verified it looked the same as before and the SQL that was executed seemed reasonable.
- Did the same for `hg` / `svn` commits, to make sure I didn't derp anything. These aren't expected to do anything differently.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T4327
Differential Revision: https://secure.phabricator.com/D7980
2014-01-20 22:12:44 +01:00
|
|
|
'PhabricatorRepositoryParsedChange' => 'Phobject',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorRepositoryPullEngine' => 'PhabricatorRepositoryEngine',
|
2016-01-28 14:21:38 +01:00
|
|
|
'PhabricatorRepositoryPullEvent' => array(
|
|
|
|
'PhabricatorRepositoryDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhabricatorRepositoryPullEventPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorRepositoryPullEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
Run one daemon to pull all working copies, not one daemon per working copy
Summary:
Allow the pull daemon to take a list of repositories. By default, pull all repositories.
Make some effort to respect pull frequencies, although we'll necessarily suffer a bit if running with only one process.
NOTE: We still launch one discovery daemon per working copy, so this only cuts the daemon count in half.
Test Plan:
- Ran `phd debug pulllocal`, verified behavior.
- Ran `pull.php P MTEST SVNTEST --trace`, verified it pulled the repos and ran the right commands.
- Ran `phd repository-launch-master`, verified the right daemons launched, checked daemon console.
- Ran `phd repository-launch-readonly`, verified the right daemon launched, checked daemon console.
Reviewers: btrahan, csilvers, davidreuss
Reviewed By: csilvers
CC: aran
Differential Revision: https://secure.phabricator.com/D2418
2012-05-08 00:01:10 +02:00
|
|
|
'PhabricatorRepositoryPullLocalDaemon' => 'PhabricatorDaemon',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorRepositoryPushEvent' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorRepositoryDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-03-26 03:43:26 +01:00
|
|
|
),
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorRepositoryPushEventPHIDType' => 'PhabricatorPHIDType',
|
2014-03-26 03:43:26 +01:00
|
|
|
'PhabricatorRepositoryPushEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorRepositoryPushLog' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorRepositoryDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-12-05 20:56:14 +01:00
|
|
|
),
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorRepositoryPushLogPHIDType' => 'PhabricatorPHIDType',
|
2013-12-05 20:56:14 +01:00
|
|
|
'PhabricatorRepositoryPushLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorRepositoryPushLogSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-03-26 18:44:06 +01:00
|
|
|
'PhabricatorRepositoryPushMailWorker' => 'PhabricatorWorker',
|
|
|
|
'PhabricatorRepositoryPushReplyHandler' => 'PhabricatorMailReplyHandler',
|
2012-12-19 20:07:06 +01:00
|
|
|
'PhabricatorRepositoryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorRepositoryRefCursor' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorRepositoryDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-01-16 21:05:30 +01:00
|
|
|
),
|
2015-12-10 21:59:25 +01:00
|
|
|
'PhabricatorRepositoryRefCursorPHIDType' => 'PhabricatorPHIDType',
|
2014-01-16 21:05:30 +01:00
|
|
|
'PhabricatorRepositoryRefCursorQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorRepositoryRefEngine' => 'PhabricatorRepositoryEngine',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorRepositoryRepositoryPHIDType' => 'PhabricatorPHIDType',
|
2014-09-29 00:12:21 +02:00
|
|
|
'PhabricatorRepositorySchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-09-11 00:26:08 +02:00
|
|
|
'PhabricatorRepositorySearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-10-31 00:04:19 +01:00
|
|
|
'PhabricatorRepositoryStatusMessage' => 'PhabricatorRepositoryDAO',
|
2011-03-11 23:13:23 +01:00
|
|
|
'PhabricatorRepositorySvnCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker',
|
2011-03-11 18:34:22 +01:00
|
|
|
'PhabricatorRepositorySvnCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker',
|
2011-09-05 02:31:16 +02:00
|
|
|
'PhabricatorRepositorySymbol' => 'PhabricatorRepositoryDAO',
|
2011-12-23 17:11:11 +01:00
|
|
|
'PhabricatorRepositoryTestCase' => 'PhabricatorTestCase',
|
2013-05-24 21:37:42 +02:00
|
|
|
'PhabricatorRepositoryTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorRepositoryTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorRepositoryType' => 'Phobject',
|
2016-04-28 17:33:44 +02:00
|
|
|
'PhabricatorRepositoryURI' => array(
|
|
|
|
'PhabricatorRepositoryDAO',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorExtendedPolicyInterface',
|
2016-04-29 23:10:04 +02:00
|
|
|
'PhabricatorConduitResultInterface',
|
2016-04-28 17:33:44 +02:00
|
|
|
),
|
2016-01-12 15:45:17 +01:00
|
|
|
'PhabricatorRepositoryURIIndex' => 'PhabricatorRepositoryDAO',
|
2014-01-16 19:49:03 +01:00
|
|
|
'PhabricatorRepositoryURINormalizer' => 'Phobject',
|
|
|
|
'PhabricatorRepositoryURINormalizerTestCase' => 'PhabricatorTestCase',
|
2016-04-28 17:33:44 +02:00
|
|
|
'PhabricatorRepositoryURIPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorRepositoryURIQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-12-12 18:45:27 +01:00
|
|
|
'PhabricatorRepositoryURITestCase' => 'PhabricatorTestCase',
|
2016-04-28 17:33:44 +02:00
|
|
|
'PhabricatorRepositoryURITransaction' => 'PhabricatorApplicationTransaction',
|
2016-04-28 19:40:35 +02:00
|
|
|
'PhabricatorRepositoryURITransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-11-01 16:34:11 +01:00
|
|
|
'PhabricatorRepositoryVCSPassword' => 'PhabricatorRepositoryDAO',
|
2015-03-20 17:26:32 +01:00
|
|
|
'PhabricatorRepositoryVersion' => 'Phobject',
|
Move toward multi-master replicated repositories
Summary:
Ref T4292. This mostly implements the locking/versioning logic for multi-master repositories. It is only active on Git SSH pathways, and doesn't actually do anything useful yet: it just does bookkeeping so far.
When we read (e.g., `git fetch`) the logic goes like this:
- Get the read lock (unique to device + repository).
- Read all the versions of the repository on every other device.
- If any node has a newer version:
- Fetch the newer version.
- Increment our version to be the same as the version we fetched.
- Release the read lock.
- Actually do the fetch.
This makes sure that any time you do a read, you always read the most recently acknowledged write. You may have to wait for an internal fetch to happen (this isn't actually implemented yet) but the operation will always work like you expect it to.
When we write (e.g., `git push`) the logic goes like this:
- Get the write lock (unique to the repository).
- Do all the read steps so we're up to date.
- Mark a write pending.
- Do the actual write.
- Bump our version and mark our write finished.
- Release the write lock.
This allows you to write to any replica. Again, you might have to wait for a fetch first, but everything will work like you expect.
There's one notable failure mode here: if the network connection between the repository node and the database fails during the write, the write lock might be released even though a write is ongoing.
The "isWriting" column protects against that, by staying locked if we lose our connection to the database. This will currently "freeze" the repository (prevent any new writes) until an administrator can sort things out, since it'd dangerous to continue doing writes (we may lose data).
(Since we won't actually acknowledge the write, I think, we could probably smooth this out a bit and make it self-healing //most// of the time: basically, have the broken node rewind itself by updating from another good node. But that's a little more complex.)
Test Plan:
- Pushed changes to a cluster-mode repository.
- Viewed web interface, saw "writing" flag and version changes.
- Pulled changes.
- Faked various failures, got sensible states.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4292
Differential Revision: https://secure.phabricator.com/D15688
2016-04-11 20:58:02 +02:00
|
|
|
'PhabricatorRepositoryWorkingCopyVersion' => 'PhabricatorRepositoryDAO',
|
2015-09-03 19:04:42 +02:00
|
|
|
'PhabricatorRequestExceptionHandler' => 'AphrontRequestExceptionHandler',
|
2015-12-11 17:23:39 +01:00
|
|
|
'PhabricatorResourceSite' => 'PhabricatorSite',
|
2014-03-14 19:53:17 +01:00
|
|
|
'PhabricatorRobotsController' => 'PhabricatorController',
|
2011-07-31 22:54:58 +02:00
|
|
|
'PhabricatorS3FileStorageEngine' => 'PhabricatorFileStorageEngine',
|
2014-05-09 21:47:21 +02:00
|
|
|
'PhabricatorSMS' => 'PhabricatorSMSDAO',
|
|
|
|
'PhabricatorSMSConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
|
|
|
'PhabricatorSMSDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorSMSDemultiplexWorker' => 'PhabricatorSMSWorker',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorSMSImplementationAdapter' => 'Phobject',
|
2014-05-09 21:47:21 +02:00
|
|
|
'PhabricatorSMSImplementationTestBlackholeAdapter' => 'PhabricatorSMSImplementationAdapter',
|
|
|
|
'PhabricatorSMSImplementationTwilioAdapter' => 'PhabricatorSMSImplementationAdapter',
|
|
|
|
'PhabricatorSMSManagementListOutboundWorkflow' => 'PhabricatorSMSManagementWorkflow',
|
|
|
|
'PhabricatorSMSManagementSendTestWorkflow' => 'PhabricatorSMSManagementWorkflow',
|
|
|
|
'PhabricatorSMSManagementShowOutboundWorkflow' => 'PhabricatorSMSManagementWorkflow',
|
|
|
|
'PhabricatorSMSManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
|
|
|
'PhabricatorSMSSendWorker' => 'PhabricatorSMSWorker',
|
|
|
|
'PhabricatorSMSWorker' => 'PhabricatorWorker',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorSQLPatchList' => 'Phobject',
|
2014-03-13 02:17:11 +01:00
|
|
|
'PhabricatorSSHKeyGenerator' => 'Phobject',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorSSHKeysSettingsPanel' => 'PhabricatorSettingsPanel',
|
2013-12-06 02:00:48 +01:00
|
|
|
'PhabricatorSSHLog' => 'Phobject',
|
Generalize SSH passthru for repository hosting
Summary:
Ref T2230. In Git, we can determine if a command is read-only or read/write from the command itself, but this isn't the case in Mercurial or SVN.
For Mercurial and SVN, we need to proxy the protocol that's coming over the wire, look at each request from the client, and then check if it's a read or a write. To support this, provide a more flexible version of `passthruIO`.
The way this will work is:
- The SSH IO channel is wrapped in a `ProtocolChannel` which can parse the the incoming stream into message objects.
- The `willWriteCallback` will look at those messages and determine if they're reads or writes.
- If they're writes, it will check for write permission.
- If we're good to go, the message object is converted back into a byte stream and handed to the underlying command.
Test Plan: Executed `git clone`, `git clone --depth 3`, `git push` (against no-write repo, got error), `git push` (against valid repo).
Reviewers: btrahan
Reviewed By: btrahan
CC: hach-que, asherkin, aran
Maniphest Tasks: T2230
Differential Revision: https://secure.phabricator.com/D7551
2013-11-11 21:12:21 +01:00
|
|
|
'PhabricatorSSHPassthruCommand' => 'Phobject',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorSSHWorkflow' => 'PhabricatorManagementWorkflow',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorSavedQuery' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorSearchDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-05-27 22:41:20 +02:00
|
|
|
),
|
|
|
|
'PhabricatorSavedQueryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-01-20 01:55:23 +01:00
|
|
|
'PhabricatorScheduleTaskTriggerAction' => 'PhabricatorTriggerAction',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorScopedEnv' => 'Phobject',
|
|
|
|
'PhabricatorSearchAbstractDocument' => 'Phobject',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSearchApplication' => 'PhabricatorApplication',
|
2014-02-03 21:51:08 +01:00
|
|
|
'PhabricatorSearchApplicationSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-05-19 22:59:58 +02:00
|
|
|
'PhabricatorSearchApplicationStorageEnginePanel' => 'PhabricatorApplicationConfigurationPanel',
|
2012-03-10 00:46:25 +01:00
|
|
|
'PhabricatorSearchAttachController' => 'PhabricatorSearchBaseController',
|
2011-02-15 00:34:20 +01:00
|
|
|
'PhabricatorSearchBaseController' => 'PhabricatorController',
|
2015-06-07 16:31:28 +02:00
|
|
|
'PhabricatorSearchCheckboxesField' => 'PhabricatorSearchField',
|
2013-01-12 00:28:16 +01:00
|
|
|
'PhabricatorSearchConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2014-05-09 21:28:02 +02:00
|
|
|
'PhabricatorSearchController' => 'PhabricatorSearchBaseController',
|
2015-06-08 21:20:16 +02:00
|
|
|
'PhabricatorSearchCustomFieldProxyField' => 'PhabricatorSearchField',
|
2011-02-15 00:34:20 +01:00
|
|
|
'PhabricatorSearchDAO' => 'PhabricatorLiskDAO',
|
2014-07-18 00:48:36 +02:00
|
|
|
'PhabricatorSearchDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-06-08 21:20:16 +02:00
|
|
|
'PhabricatorSearchDatasourceField' => 'PhabricatorSearchTokenizerField',
|
2015-06-22 22:27:37 +02:00
|
|
|
'PhabricatorSearchDateControlField' => 'PhabricatorSearchField',
|
2015-06-05 20:21:08 +02:00
|
|
|
'PhabricatorSearchDateField' => 'PhabricatorSearchField',
|
2013-05-27 22:42:44 +02:00
|
|
|
'PhabricatorSearchDeleteController' => 'PhabricatorSearchBaseController',
|
2011-02-15 00:34:20 +01:00
|
|
|
'PhabricatorSearchDocument' => 'PhabricatorSearchDAO',
|
|
|
|
'PhabricatorSearchDocumentField' => 'PhabricatorSearchDAO',
|
2015-06-05 20:01:25 +02:00
|
|
|
'PhabricatorSearchDocumentFieldType' => 'Phobject',
|
2014-02-03 21:51:08 +01:00
|
|
|
'PhabricatorSearchDocumentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2011-02-15 00:34:20 +01:00
|
|
|
'PhabricatorSearchDocumentRelationship' => 'PhabricatorSearchDAO',
|
2015-04-23 00:25:34 +02:00
|
|
|
'PhabricatorSearchDocumentTypeDatasource' => 'PhabricatorTypeaheadDatasource',
|
2013-05-27 22:42:01 +02:00
|
|
|
'PhabricatorSearchEditController' => 'PhabricatorSearchBaseController',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorSearchEngineAPIMethod' => 'ConduitAPIMethod',
|
Implement an "Attachments" behavior for Conduit Search APIs
Summary:
Ref T9964. We have various kinds of secondary data on objects (like subscribers, projects, paste content, Owners paths, file attachments, etc) which is somewhat slow, or somewhat large, or both.
Some approaches to handling this in the API include:
- Always return all of it (very easy, but slow).
- Require users to make separate API calls to get each piece of data (very simple, but inefficient and really cumbersome to use).
- Implement a hierarchical query language like GraphQL (powerful, but very complex).
- Kind of mix-and-match a half-power query language and some extra calls? (fairly simple, not too terrible?)
We currently mix-and-match internally, with `->needStuff(true)`. This is not a general-purpose, full-power graph query language like GraphQL, and it occasionally does limit us.
For example, there is no way to do this sort of thing:
$conpherence_thread_query = id(new ConpherenceThreadQuery())
->setViewer($viewer)
// ...
->setNeedMessages(true)
->setWhenYouLoadTheMessagesTheyNeedProfilePictures(true);
However, we almost never actually need to do this and when we do want to do it we usually don't //really// want to do it, so I don't think this is a major limit to the practical power of the system for the kinds of things we really want to do with it.
Put another way, we have a lot of 1-level hierarchical queries (get pictures or repositories or projects or files or content for these objects) but few-to-no 2+ level queries (get files for these objects, then get all the projects for those files).
So even though 1-level hierarchies are not a beautiful, general-purpose, fully-abstract system, they've worked well so far in practice and I'm comfortable moving forward with them in the API.
If we do need N-level queries in the future, there is no technical reason we can't put GraphQL (or something similar) on top of this eventually, and this would represent a solid step toward that. However, I suspect we'll never need them.
Upshot: I'm pretty happy with "->needX()" for all practical purposes, so this is just adding a way to say "->needX()" to the API.
Specifically, you say:
```
{
"attachments": {
"subscribers": true,
}
}
```
...and get back subscriber data. In the future (or for certain attachments), `true` might become a dictionary of extra parameters, if necessary, and could do so without breaking the API.
Test Plan:
- Ran queries to get attachments.
{F1025449}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9964
Differential Revision: https://secure.phabricator.com/D14772
2015-12-14 13:58:34 +01:00
|
|
|
'PhabricatorSearchEngineAttachment' => 'Phobject',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorSearchEngineExtension' => 'Phobject',
|
|
|
|
'PhabricatorSearchEngineExtensionModule' => 'PhabricatorConfigModule',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorSearchEngineTestCase' => 'PhabricatorTestCase',
|
2015-06-05 20:21:08 +02:00
|
|
|
'PhabricatorSearchField' => 'Phobject',
|
2013-04-03 17:31:27 +02:00
|
|
|
'PhabricatorSearchHovercardController' => 'PhabricatorSearchBaseController',
|
Allow index extensions to skip indexing if the object has not changed
Summary:
Fixes T9890. This allows IndexExtensions to emit an object version.
Before we build indexes, we check if the indexed version is the same as the current version. If it is, we just don't call that extension.
T9890 has a case where this is useful: a script went crazy and posted thousands of comments to a single task.
Without versioning, that results in the same comments being indexed over and over again. With versioning, most of the queue could just exit without doing any work.
Test Plan:
- Added a `sleep(1)` to the actual indexing, used `bin/search index --background` to queue up a lot of tasks, ran them with `bin/phd debug task`, saw them complete very quickly with only one actual index operation performed.
- Used `bin/search index --trace` and `bin/search index --trace --background` to observe the behavior of queries against the index version store, which looked sensible.
- Made comments/transactions, saw versions update.
- Used `bin/remove destroy`, verified index versions were purged.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9890
Differential Revision: https://secure.phabricator.com/D14845
2015-12-21 20:04:08 +01:00
|
|
|
'PhabricatorSearchIndexVersion' => 'PhabricatorSearchDAO',
|
|
|
|
'PhabricatorSearchIndexVersionDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension',
|
Improve Search architecture
Summary:
The search indexing API has several problems right now:
- Always runs in-process.
- It would be nice to push this into the task queue for performance. However, the API currently passses an object all the way through (and some indexers depend on preloaded object attributes), so it can't be dumped into the task queue at any stage since we can't serialize it.
- Being able to use the task queue will also make rebuilding indexes faster.
- Instead, make the API phid-oriented.
- No uniform indexing API.
- Each "Editor" currently calls SomeCustomIndexer::indexThing(). This won't work with AbstractTransactions. The API is also just weird.
- Instead, provide a uniform API.
- No uniform CLI.
- We have `scripts/search/reindex_everything.php`, but it doesn't actually index everything. Each new document type needs to be separately added to it, leading to stuff like D3839. Third-party applications can't provide indexers.
- Instead, let indexers expose documents for indexing.
- Not application-oriented.
- All the indexers live in search/ right now, which isn't the right organization in an application-orietned view of the world.
- Instead, move indexers to applications and load them with SymbolLoader.
Test Plan:
- `bin/search index`
- Indexed one revision, one task.
- Indexed `--type TASK`, `--type DREV`, etc., for all types.
- Indexed `--all`.
- Added the word "saboteur" to a revision, task, wiki page, and question and then searched for it.
- Creating users is a pain; searched for a user after indexing.
- Creating commits is a pain; searched for a commit after indexing.
- Mocks aren't currently loadable in the result view, so their indexing is moot.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: 20after4, aran
Maniphest Tasks: T1991, T2104
Differential Revision: https://secure.phabricator.com/D4261
2012-12-21 23:21:31 +01:00
|
|
|
'PhabricatorSearchManagementIndexWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
2014-12-22 22:10:52 +01:00
|
|
|
'PhabricatorSearchManagementInitWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorSearchManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
Implement basic ngram search for Owners Package names
Summary:
Ref T9979. This uses ngrams (specifically, trigrams) to build a reasonably efficient index for substring matching. Specifically, for a package like "Example", with ID 123, we store rows like this:
```
< ex, 123>
<exa, 123>
<xam, 123>
<amp, 123>
<mpl, 123>
<ple, 123>
<le , 123>
```
When the user searches for `exam`, we join this table for packages with tokens `exa` and `xam`. MySQL can do this a lot more efficiently than it can process a `LIKE "%exam%"` query against a huge table.
When the user searches for a one-letter or two-letter string, we only search the beginnings of words. This is probably what they want, the only thing we can do quickly, and a reasonable/expected behavior for typeaheads.
Test Plan:
- Ran storage upgrades and search indexer.
- Searched for stuff with "name contains".
- Used typehaead and got sensible results.
- Searched for `aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz` and saw only 16 joins.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9979
Differential Revision: https://secure.phabricator.com/D14846
2015-12-21 21:22:07 +01:00
|
|
|
'PhabricatorSearchNgrams' => 'PhabricatorSearchDAO',
|
|
|
|
'PhabricatorSearchNgramsDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension',
|
2013-06-06 01:22:27 +02:00
|
|
|
'PhabricatorSearchOrderController' => 'PhabricatorSearchBaseController',
|
2015-06-08 21:21:48 +02:00
|
|
|
'PhabricatorSearchOrderField' => 'PhabricatorSearchField',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorSearchPreferencesSettingsPanel' => 'PhabricatorSettingsPanel',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorSearchRelationship' => 'Phobject',
|
Improve search result listing
Summary:
Make it prettier, paginate, add user pictures, show document types, clean some
stuff up a little. Plenty of room for improvement but this should make it a lot
more useful.
Test Plan:
Here's what the new one looks like:
https://secure.phabricator.com/file/view/PHID-FILE-edce2b83c2e3a121c2b7/
Reviewed By: jungejason
Reviewers: tomo, jungejason, aran, tuomaspelkonen, mroch
Commenters: tomo
CC: aran, tomo, jungejason, epriestley
Differential Revision: 545
2011-06-28 23:35:02 +02:00
|
|
|
'PhabricatorSearchResultView' => 'AphrontView',
|
2016-04-26 20:19:03 +02:00
|
|
|
'PhabricatorSearchSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2012-03-10 00:46:25 +01:00
|
|
|
'PhabricatorSearchSelectController' => 'PhabricatorSearchBaseController',
|
2015-06-08 21:20:16 +02:00
|
|
|
'PhabricatorSearchSelectField' => 'PhabricatorSearchField',
|
2015-06-05 20:21:08 +02:00
|
|
|
'PhabricatorSearchStringListField' => 'PhabricatorSearchField',
|
2015-06-08 21:20:53 +02:00
|
|
|
'PhabricatorSearchSubscribersField' => 'PhabricatorSearchTokenizerField',
|
2015-06-08 21:20:16 +02:00
|
|
|
'PhabricatorSearchTextField' => 'PhabricatorSearchField',
|
2015-06-07 16:32:09 +02:00
|
|
|
'PhabricatorSearchThreeStateField' => 'PhabricatorSearchField',
|
2015-06-05 20:21:08 +02:00
|
|
|
'PhabricatorSearchTokenizerField' => 'PhabricatorSearchField',
|
2014-01-14 22:22:56 +01:00
|
|
|
'PhabricatorSearchWorker' => 'PhabricatorWorker',
|
2013-01-03 14:45:23 +01:00
|
|
|
'PhabricatorSecurityConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorSecuritySetupCheck' => 'PhabricatorSetupCheck',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorSelectEditField' => 'PhabricatorEditField',
|
2013-01-15 21:04:05 +01:00
|
|
|
'PhabricatorSendGridConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorSessionsSettingsPanel' => 'PhabricatorSettingsPanel',
|
2014-04-03 20:22:38 +02:00
|
|
|
'PhabricatorSettingsAddEmailAction' => 'PhabricatorSystemAction',
|
2012-08-13 21:37:18 +02:00
|
|
|
'PhabricatorSettingsAdjustController' => 'PhabricatorController',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSettingsApplication' => 'PhabricatorApplication',
|
2012-08-13 21:37:18 +02:00
|
|
|
'PhabricatorSettingsMainController' => 'PhabricatorController',
|
2016-01-01 13:26:36 +01:00
|
|
|
'PhabricatorSettingsMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorSettingsPanel' => 'Phobject',
|
|
|
|
'PhabricatorSetupCheck' => 'Phobject',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhabricatorSetupCheckTestCase' => 'PhabricatorTestCase',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorSetupIssue' => 'Phobject',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorSetupIssueUIExample' => 'PhabricatorUIExample',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorSetupIssueView' => 'AphrontView',
|
2015-11-09 19:09:19 +01:00
|
|
|
'PhabricatorShortSite' => 'PhabricatorSite',
|
2015-11-03 17:45:00 +01:00
|
|
|
'PhabricatorSimpleEditType' => 'PhabricatorEditType',
|
2015-06-29 23:04:48 +02:00
|
|
|
'PhabricatorSite' => 'AphrontSite',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSlowvoteApplication' => 'PhabricatorApplication',
|
2011-07-08 20:13:11 +02:00
|
|
|
'PhabricatorSlowvoteChoice' => 'PhabricatorSlowvoteDAO',
|
2014-04-24 21:00:31 +02:00
|
|
|
'PhabricatorSlowvoteCloseController' => 'PhabricatorSlowvoteController',
|
2013-07-15 13:45:43 +02:00
|
|
|
'PhabricatorSlowvoteCommentController' => 'PhabricatorSlowvoteController',
|
2011-07-08 20:13:11 +02:00
|
|
|
'PhabricatorSlowvoteController' => 'PhabricatorController',
|
|
|
|
'PhabricatorSlowvoteDAO' => 'PhabricatorLiskDAO',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhabricatorSlowvoteDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2013-07-15 19:50:38 +02:00
|
|
|
'PhabricatorSlowvoteEditController' => 'PhabricatorSlowvoteController',
|
2013-07-15 13:45:43 +02:00
|
|
|
'PhabricatorSlowvoteEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-05-08 17:40:59 +02:00
|
|
|
'PhabricatorSlowvoteListController' => 'PhabricatorSlowvoteController',
|
2015-08-02 00:41:08 +02:00
|
|
|
'PhabricatorSlowvoteMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2011-07-08 20:13:11 +02:00
|
|
|
'PhabricatorSlowvoteOption' => 'PhabricatorSlowvoteDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorSlowvotePoll' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorSlowvoteDAO',
|
Transactions - deploy buildTransactionTimeline against a few more applications
Summary:
Ref T4712. Thus far, it seems that most "non-standard" things can be done pretty easily in the controller. Aside from deploying, this diff had to fix a few bugs / missing implementations of stuff.
(Notably, PhabricatorAuthProviderConfig, HeraldRule, PhabricatorSlowvotePoll, and AlmanacNetwork needed to implement PhabricatorApplicationTransactionInterface, PhabricatorAuthAuthProviderPHIDType had to be added, and a rendering bug in transactions of type PhabricatorOAuth2AuthProvider had to be fixed.)
Test Plan: Almanac - looked at binding, device, network, and service view controllers and verified timeline displayed properly. Herald - looked at a rule and verified timeline. Slowvote - looked at a vote and verified timeline. Auth - looked at an auth provider (Facebook) and verified proper display of transactions within timeline.
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10921
2014-12-02 23:33:59 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorProjectInterface',
|
2014-08-07 00:27:57 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
2015-07-14 16:45:38 +02:00
|
|
|
'PhabricatorSpacesInterface',
|
2013-07-13 19:41:30 +02:00
|
|
|
),
|
2011-07-08 20:13:11 +02:00
|
|
|
'PhabricatorSlowvotePollController' => 'PhabricatorSlowvoteController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorSlowvotePollPHIDType' => 'PhabricatorPHIDType',
|
2013-07-13 19:41:49 +02:00
|
|
|
'PhabricatorSlowvoteQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-08-02 00:41:08 +02:00
|
|
|
'PhabricatorSlowvoteReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2014-09-19 14:45:24 +02:00
|
|
|
'PhabricatorSlowvoteSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-07-13 19:41:49 +02:00
|
|
|
'PhabricatorSlowvoteSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-07-15 13:20:10 +02:00
|
|
|
'PhabricatorSlowvoteTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorSlowvoteTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'PhabricatorSlowvoteTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-05-04 00:48:59 +02:00
|
|
|
'PhabricatorSlowvoteVoteController' => 'PhabricatorSlowvoteController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorSlug' => 'Phobject',
|
2012-04-10 23:18:20 +02:00
|
|
|
'PhabricatorSlugTestCase' => 'PhabricatorTestCase',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorSortTableUIExample' => 'PhabricatorUIExample',
|
2012-08-15 19:45:06 +02:00
|
|
|
'PhabricatorSourceCodeView' => 'AphrontView',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorSpaceEditField' => 'PhabricatorEditField',
|
2015-06-01 23:54:18 +02:00
|
|
|
'PhabricatorSpacesApplication' => 'PhabricatorApplication',
|
2015-06-11 19:13:47 +02:00
|
|
|
'PhabricatorSpacesArchiveController' => 'PhabricatorSpacesController',
|
Add "Spaces", an application for managing policy namespaces
Summary: Ref T3820. This doesn't actually do anything yet, but dumps in all the plumbing.
Test Plan:
{F156989}
{F156990}
{F156991}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: eadler, wienczny, jdloft, devurandom, thz, hwinkel, 20after4, sascha-egerer, seporaitis, joshuaspence, chad, epriestley
Maniphest Tasks: T3820
Differential Revision: https://secure.phabricator.com/D9204
2015-06-01 20:28:38 +02:00
|
|
|
'PhabricatorSpacesCapabilityCreateSpaces' => 'PhabricatorPolicyCapability',
|
|
|
|
'PhabricatorSpacesCapabilityDefaultEdit' => 'PhabricatorPolicyCapability',
|
|
|
|
'PhabricatorSpacesCapabilityDefaultView' => 'PhabricatorPolicyCapability',
|
|
|
|
'PhabricatorSpacesController' => 'PhabricatorController',
|
|
|
|
'PhabricatorSpacesDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorSpacesEditController' => 'PhabricatorSpacesController',
|
|
|
|
'PhabricatorSpacesInterface' => 'PhabricatorPHIDInterface',
|
|
|
|
'PhabricatorSpacesListController' => 'PhabricatorSpacesController',
|
|
|
|
'PhabricatorSpacesNamespace' => array(
|
|
|
|
'PhabricatorSpacesDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-06-01 21:02:20 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
Add "Spaces", an application for managing policy namespaces
Summary: Ref T3820. This doesn't actually do anything yet, but dumps in all the plumbing.
Test Plan:
{F156989}
{F156990}
{F156991}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: eadler, wienczny, jdloft, devurandom, thz, hwinkel, 20after4, sascha-egerer, seporaitis, joshuaspence, chad, epriestley
Maniphest Tasks: T3820
Differential Revision: https://secure.phabricator.com/D9204
2015-06-01 20:28:38 +02:00
|
|
|
),
|
2015-06-05 20:21:45 +02:00
|
|
|
'PhabricatorSpacesNamespaceDatasource' => 'PhabricatorTypeaheadDatasource',
|
Add "Spaces", an application for managing policy namespaces
Summary: Ref T3820. This doesn't actually do anything yet, but dumps in all the plumbing.
Test Plan:
{F156989}
{F156990}
{F156991}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: eadler, wienczny, jdloft, devurandom, thz, hwinkel, 20after4, sascha-egerer, seporaitis, joshuaspence, chad, epriestley
Maniphest Tasks: T3820
Differential Revision: https://secure.phabricator.com/D9204
2015-06-01 20:28:38 +02:00
|
|
|
'PhabricatorSpacesNamespaceEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhabricatorSpacesNamespacePHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorSpacesNamespaceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorSpacesNamespaceSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'PhabricatorSpacesNamespaceTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorSpacesNamespaceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-07-03 22:03:33 +02:00
|
|
|
'PhabricatorSpacesNoAccessController' => 'PhabricatorSpacesController',
|
2015-06-05 23:19:40 +02:00
|
|
|
'PhabricatorSpacesRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-06-11 00:53:51 +02:00
|
|
|
'PhabricatorSpacesSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-12-11 17:45:56 +01:00
|
|
|
'PhabricatorSpacesSearchEngineExtension' => 'PhabricatorSearchEngineExtension',
|
2015-07-06 14:52:04 +02:00
|
|
|
'PhabricatorSpacesSearchField' => 'PhabricatorSearchTokenizerField',
|
2015-06-01 21:02:20 +02:00
|
|
|
'PhabricatorSpacesTestCase' => 'PhabricatorTestCase',
|
Add "Spaces", an application for managing policy namespaces
Summary: Ref T3820. This doesn't actually do anything yet, but dumps in all the plumbing.
Test Plan:
{F156989}
{F156990}
{F156991}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: eadler, wienczny, jdloft, devurandom, thz, hwinkel, 20after4, sascha-egerer, seporaitis, joshuaspence, chad, epriestley
Maniphest Tasks: T3820
Differential Revision: https://secure.phabricator.com/D9204
2015-06-01 20:28:38 +02:00
|
|
|
'PhabricatorSpacesViewController' => 'PhabricatorSpacesController',
|
2013-06-07 18:55:55 +02:00
|
|
|
'PhabricatorStandardCustomField' => 'PhabricatorCustomField',
|
Rough cut of "Blueprint Authorizations"
Summary:
Ref T9519. This is like 80% of the way there and doesn't fully work yet, but roughly shows the shape of things to come. Here's how it works:
First, there's a new custom field type for blueprints which works like a normal typeahead but has some extra logic. It's implemented this way to make it easy to add to Blueprints in Drydock and Build Plans in Harbormaster. Here, I've added a "Use Blueprints" field to the "WorkingCopy" blueprint, so you can control which hosts the working copies are permitted to allocate on:
{F869865}
This control has a bit of custom rendering logic. Instead of rendering a normal list of PHIDs, it renders an annotated list with icons:
{F869866}
These icons show whether the blueprint on the other size of the authorization has approved this object. Once you have a green checkmark, you're good to go.
On the blueprint side, things look like this:
{F869867}
This table shows all the objects which have asked for access to this blueprint. In this case it's showing that one object is approved to use the blueprint since I already approved it, but by default new requests come in here as "Authorization Requested" and someone has to go approve them.
You approve them from within the authorization detail screen:
{F869868}
You can use the "Approve" or "Decline" buttons to allow or prevent use of the blueprint.
This doesn't actually do anything yet -- objects don't need to be authorized in order to use blueprints quite yet. That will come in the next diff, I just wanted to get the UI in reasonable shape first.
The authorization also has a second piece of state, which is whether the request from the object is active or inactive. We use this to keep track of the authorization if the blueprint is (maybe temporarily) deleted.
For example, you might have a Build Plan that uses Blueprints A and B. For a couple days, you only want to use A, so you remove B from the "Use Blueprints: ..." field. Later, you can add B back and it will connect to its old authorization again, so you don't need to go re-approve things (and if you're declined, you stay declined instead of being able to request authorization over and over again). This should make working with authorizations a little easier and less labor intensive.
Stuff not in this diff:
- Actually preventing any allocations (next diff).
- Probably should have transactions for approve/decline, at least, at some point, so there's a log of who did approvals and when.
- Maybe should have a more clear/loud error state when no blueprints are approved?
- Should probably restrict the typeahead to specific blueprint types.
Test Plan:
- Added the field.
- Typed some stuff into it.
- Saw the UI update properly.
- Approved an authorization.
- Declined an authorization.
- Saw active authorizations on a blueprint page.
- Didn't see any inactive authroizations there.
- Clicked "View All Authorizations", saw all authorizations.
Reviewers: chad, hach-que
Reviewed By: chad
Maniphest Tasks: T9519
Differential Revision: https://secure.phabricator.com/D14251
2015-10-10 16:15:25 +02:00
|
|
|
'PhabricatorStandardCustomFieldBlueprints' => 'PhabricatorStandardCustomFieldTokenizer',
|
2013-09-17 01:03:51 +02:00
|
|
|
'PhabricatorStandardCustomFieldBool' => 'PhabricatorStandardCustomField',
|
2014-03-26 00:13:27 +01:00
|
|
|
'PhabricatorStandardCustomFieldCredential' => 'PhabricatorStandardCustomField',
|
2015-09-21 13:41:52 +02:00
|
|
|
'PhabricatorStandardCustomFieldDatasource' => 'PhabricatorStandardCustomFieldTokenizer',
|
2013-09-17 01:04:31 +02:00
|
|
|
'PhabricatorStandardCustomFieldDate' => 'PhabricatorStandardCustomField',
|
2013-09-17 23:22:04 +02:00
|
|
|
'PhabricatorStandardCustomFieldHeader' => 'PhabricatorStandardCustomField',
|
2013-09-17 01:03:24 +02:00
|
|
|
'PhabricatorStandardCustomFieldInt' => 'PhabricatorStandardCustomField',
|
2015-04-24 20:49:11 +02:00
|
|
|
'PhabricatorStandardCustomFieldLink' => 'PhabricatorStandardCustomField',
|
2013-09-17 01:04:46 +02:00
|
|
|
'PhabricatorStandardCustomFieldPHIDs' => 'PhabricatorStandardCustomField',
|
2013-09-17 01:04:18 +02:00
|
|
|
'PhabricatorStandardCustomFieldRemarkup' => 'PhabricatorStandardCustomField',
|
2013-09-17 01:04:08 +02:00
|
|
|
'PhabricatorStandardCustomFieldSelect' => 'PhabricatorStandardCustomField',
|
2013-09-17 01:03:24 +02:00
|
|
|
'PhabricatorStandardCustomFieldText' => 'PhabricatorStandardCustomField',
|
2015-09-21 13:41:52 +02:00
|
|
|
'PhabricatorStandardCustomFieldTokenizer' => 'PhabricatorStandardCustomFieldPHIDs',
|
|
|
|
'PhabricatorStandardCustomFieldUsers' => 'PhabricatorStandardCustomFieldTokenizer',
|
Make mobile navigation work properly by default in more cases
Summary:
Fixes T5752. This obsoletes a bunch of old patterns and I'll follow up on those with a big "go do a bunch of mechanical code changes" task. Major goals are:
- Don't load named queries multiple times on search pages.
- Don't require extra code to get standard navigation right on mobile.
- Reduce the amount of boilerplate in ListControllers.
- Reduce the amount of boilerplate around navigation/menus in all controllers.
Specifically, here's what this does:
- The StandardPage is now a smarter/more structured object with `setNavigation()` and `setCrumbs()` methods. More rendering decisions are delayed until the last possible moment.
- It uses this to automatically add crumb actions to the application menu.
- It uses this to automatically reuse one SearchEngine instead of running queries multiple times.
- The new preferred way to build responses is `$this->newPage()` (like `$this->newDialog()`), which has structured methods for adding stuff (`setTitle()`, etc).
- SearchEngine exposes a new convenience method so you don't have to do all the controller delegation stuff.
- Building menus is generally simpler.
Test Plan:
- Tested paste list, view, edit, comment, raw controllers for functionality, mobile menu, crumbs, navigation menu.
- Edited saved queries.
- Tested Differential, Maniphest (no changes).
- Verified the paste pages don't run any duplicate NamedQuery queries.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T5752
Differential Revision: https://secure.phabricator.com/D14382
2015-11-02 21:06:28 +01:00
|
|
|
'PhabricatorStandardPageView' => array(
|
|
|
|
'PhabricatorBarePageView',
|
|
|
|
'AphrontResponseProducerInterface',
|
|
|
|
),
|
2015-07-16 23:12:54 +02:00
|
|
|
'PhabricatorStandardSelectCustomFieldDatasource' => 'PhabricatorTypeaheadDatasource',
|
2016-03-03 13:34:47 +01:00
|
|
|
'PhabricatorStaticEditField' => 'PhabricatorEditField',
|
2011-04-08 20:13:29 +02:00
|
|
|
'PhabricatorStatusController' => 'PhabricatorController',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorStatusUIExample' => 'PhabricatorUIExample',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorStorageFixtureScopeGuard' => 'Phobject',
|
|
|
|
'PhabricatorStorageManagementAPI' => 'Phobject',
|
2014-10-01 17:16:31 +02:00
|
|
|
'PhabricatorStorageManagementAdjustWorkflow' => 'PhabricatorStorageManagementWorkflow',
|
Make SQL patch management DAG-based and provide namespace support
Summary:
This addresses three issues with the current patch management system:
# Two people developing at the same time often pick the same SQL patch number, and then have to go rename it. The system catches this, but it's silly.
# Second/third-party developers can't use the same system to manage auxiliary storage they may want to add.
# There's no way to build mock databases for unit tests that need to do reads.
To resolve these things, you can now name your patches whatever you want and conflicts are just merge conflicts, which are less of a pain to fix than filename conflicts.
Dependencies are now a DAG, with implicit dependencies created on the prior patch if no dependencies are specified. Developers can add new concrete subclasses of `PhabricatorSQLPatchList` to add storage management, and define the dependency branchpoint of their patches so they apply in the correct order (although, generally, they should not depend on the mainline patches, presumably).
The commands `storage upgrade --namespace test1234` and `storage destroy --namespace test1234` will allow unit tests to build and destroy MySQL storage.
A "quickstart" mode allows an upgrade from scratch in ~1200ms. Destruction takes about 200ms. These seem like fairily reasonable costs to actually use in tests. Building from scratch patch-by-patch takes about 6000ms.
Test Plan:
- Created new databases from scratch with and without quickstart in a separate test namespace. Pointed the webapp at the test namespaces, browsed around, everything looked good.
- Compared quickstart and no-quickstart dump states, they're identical except for mysqldump timestamps and a few similar things.
- Upgraded a legacy database to the new storage format.
- Destroyed / dumped storage.
Reviewers: edward, vrana, btrahan, jungejason
Reviewed By: btrahan
CC: aran, nh
Maniphest Tasks: T140, T345
Differential Revision: https://secure.phabricator.com/D2323
2012-04-30 16:54:00 +02:00
|
|
|
'PhabricatorStorageManagementDatabasesWorkflow' => 'PhabricatorStorageManagementWorkflow',
|
|
|
|
'PhabricatorStorageManagementDestroyWorkflow' => 'PhabricatorStorageManagementWorkflow',
|
|
|
|
'PhabricatorStorageManagementDumpWorkflow' => 'PhabricatorStorageManagementWorkflow',
|
2013-07-03 01:34:17 +02:00
|
|
|
'PhabricatorStorageManagementProbeWorkflow' => 'PhabricatorStorageManagementWorkflow',
|
2014-10-01 17:22:37 +02:00
|
|
|
'PhabricatorStorageManagementQuickstartWorkflow' => 'PhabricatorStorageManagementWorkflow',
|
Add a `storage renamespace` for mangling SQL dumpfiles into a new namespace
Summary:
Ref T7149. When users give us dumpfiles for import, they will almost inevitably use the `phabricator` namespace. They need to be renamed to use an instance namespace.
We can do this either by:
- importing the data first, then renaming; or
- renaming first, then importing.
This implements the second one, basically `storage renamespace --in dump.sql --from phabricator --to instancename > instance.sql`.
Renaming first is a little hackier since we have to `preg_match()` a SQL dump file, but I think it's better overall:
- With only one database, it lets you dump/import without downtime.
- If you have development stuff in a development environment in the `phabricator` namespace, you don't have to move it aside to do an import.
- No possibility that two people doing an import at the same time on the same box will collide with each other.
- You can do the rename once and then repeat the import process with the renamed dump more easily.
- No tricky stuff with modern Phabricator running against an old dump and the database names not matching up.
None of this is super important, but it just makes large dumps a bit easier to work with, and the dumpfile format is regular enough that this seems unlikely to ever really not work.
Test Plan: Renamespaced a dump, did a `diff -u`, saw all the relevant parts changed (and only those parts changed).
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T7149
Differential Revision: https://secure.phabricator.com/D12105
2015-03-18 02:29:01 +01:00
|
|
|
'PhabricatorStorageManagementRenamespaceWorkflow' => 'PhabricatorStorageManagementWorkflow',
|
2015-01-29 21:15:27 +01:00
|
|
|
'PhabricatorStorageManagementShellWorkflow' => 'PhabricatorStorageManagementWorkflow',
|
Make SQL patch management DAG-based and provide namespace support
Summary:
This addresses three issues with the current patch management system:
# Two people developing at the same time often pick the same SQL patch number, and then have to go rename it. The system catches this, but it's silly.
# Second/third-party developers can't use the same system to manage auxiliary storage they may want to add.
# There's no way to build mock databases for unit tests that need to do reads.
To resolve these things, you can now name your patches whatever you want and conflicts are just merge conflicts, which are less of a pain to fix than filename conflicts.
Dependencies are now a DAG, with implicit dependencies created on the prior patch if no dependencies are specified. Developers can add new concrete subclasses of `PhabricatorSQLPatchList` to add storage management, and define the dependency branchpoint of their patches so they apply in the correct order (although, generally, they should not depend on the mainline patches, presumably).
The commands `storage upgrade --namespace test1234` and `storage destroy --namespace test1234` will allow unit tests to build and destroy MySQL storage.
A "quickstart" mode allows an upgrade from scratch in ~1200ms. Destruction takes about 200ms. These seem like fairily reasonable costs to actually use in tests. Building from scratch patch-by-patch takes about 6000ms.
Test Plan:
- Created new databases from scratch with and without quickstart in a separate test namespace. Pointed the webapp at the test namespaces, browsed around, everything looked good.
- Compared quickstart and no-quickstart dump states, they're identical except for mysqldump timestamps and a few similar things.
- Upgraded a legacy database to the new storage format.
- Destroyed / dumped storage.
Reviewers: edward, vrana, btrahan, jungejason
Reviewed By: btrahan
CC: aran, nh
Maniphest Tasks: T140, T345
Differential Revision: https://secure.phabricator.com/D2323
2012-04-30 16:54:00 +02:00
|
|
|
'PhabricatorStorageManagementStatusWorkflow' => 'PhabricatorStorageManagementWorkflow',
|
|
|
|
'PhabricatorStorageManagementUpgradeWorkflow' => 'PhabricatorStorageManagementWorkflow',
|
2013-12-27 22:15:40 +01:00
|
|
|
'PhabricatorStorageManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorStoragePatch' => 'Phobject',
|
2014-09-24 22:50:00 +02:00
|
|
|
'PhabricatorStorageSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorStorageSetupCheck' => 'PhabricatorSetupCheck',
|
2015-05-18 00:20:11 +02:00
|
|
|
'PhabricatorStreamingProtocolAdapter' => 'PhabricatorProtocolAdapter',
|
2015-12-27 15:45:53 +01:00
|
|
|
'PhabricatorStringListEditField' => 'PhabricatorEditField',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorSubscribedToObjectEdgeType' => 'PhabricatorEdgeType',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorSubscribersEditField' => 'PhabricatorTokenizerEditField',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorSubscribersQuery' => 'PhabricatorQuery',
|
2015-01-16 00:57:45 +01:00
|
|
|
'PhabricatorSubscriptionTriggerClock' => 'PhabricatorTriggerClock',
|
2015-07-18 17:07:31 +02:00
|
|
|
'PhabricatorSubscriptionsAddSelfHeraldAction' => 'PhabricatorSubscriptionsHeraldAction',
|
|
|
|
'PhabricatorSubscriptionsAddSubscribersHeraldAction' => 'PhabricatorSubscriptionsHeraldAction',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSubscriptionsApplication' => 'PhabricatorApplication',
|
2016-03-05 23:45:56 +01:00
|
|
|
'PhabricatorSubscriptionsCurtainExtension' => 'PHUICurtainExtension',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorSubscriptionsEditController' => 'PhabricatorController',
|
2015-11-29 19:05:41 +01:00
|
|
|
'PhabricatorSubscriptionsEditEngineExtension' => 'PhabricatorEditEngineExtension',
|
2012-10-10 19:18:23 +02:00
|
|
|
'PhabricatorSubscriptionsEditor' => 'PhabricatorEditor',
|
2015-12-21 15:31:31 +01:00
|
|
|
'PhabricatorSubscriptionsFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension',
|
2015-07-18 17:07:31 +02:00
|
|
|
'PhabricatorSubscriptionsHeraldAction' => 'HeraldAction',
|
2014-03-14 19:22:00 +01:00
|
|
|
'PhabricatorSubscriptionsListController' => 'PhabricatorController',
|
2015-07-18 17:07:31 +02:00
|
|
|
'PhabricatorSubscriptionsRemoveSelfHeraldAction' => 'PhabricatorSubscriptionsHeraldAction',
|
|
|
|
'PhabricatorSubscriptionsRemoveSubscribersHeraldAction' => 'PhabricatorSubscriptionsHeraldAction',
|
Implement an "Attachments" behavior for Conduit Search APIs
Summary:
Ref T9964. We have various kinds of secondary data on objects (like subscribers, projects, paste content, Owners paths, file attachments, etc) which is somewhat slow, or somewhat large, or both.
Some approaches to handling this in the API include:
- Always return all of it (very easy, but slow).
- Require users to make separate API calls to get each piece of data (very simple, but inefficient and really cumbersome to use).
- Implement a hierarchical query language like GraphQL (powerful, but very complex).
- Kind of mix-and-match a half-power query language and some extra calls? (fairly simple, not too terrible?)
We currently mix-and-match internally, with `->needStuff(true)`. This is not a general-purpose, full-power graph query language like GraphQL, and it occasionally does limit us.
For example, there is no way to do this sort of thing:
$conpherence_thread_query = id(new ConpherenceThreadQuery())
->setViewer($viewer)
// ...
->setNeedMessages(true)
->setWhenYouLoadTheMessagesTheyNeedProfilePictures(true);
However, we almost never actually need to do this and when we do want to do it we usually don't //really// want to do it, so I don't think this is a major limit to the practical power of the system for the kinds of things we really want to do with it.
Put another way, we have a lot of 1-level hierarchical queries (get pictures or repositories or projects or files or content for these objects) but few-to-no 2+ level queries (get files for these objects, then get all the projects for those files).
So even though 1-level hierarchies are not a beautiful, general-purpose, fully-abstract system, they've worked well so far in practice and I'm comfortable moving forward with them in the API.
If we do need N-level queries in the future, there is no technical reason we can't put GraphQL (or something similar) on top of this eventually, and this would represent a solid step toward that. However, I suspect we'll never need them.
Upshot: I'm pretty happy with "->needX()" for all practical purposes, so this is just adding a way to say "->needX()" to the API.
Specifically, you say:
```
{
"attachments": {
"subscribers": true,
}
}
```
...and get back subscriber data. In the future (or for certain attachments), `true` might become a dictionary of extra parameters, if necessary, and could do so without breaking the API.
Test Plan:
- Ran queries to get attachments.
{F1025449}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9964
Differential Revision: https://secure.phabricator.com/D14772
2015-12-14 13:58:34 +01:00
|
|
|
'PhabricatorSubscriptionsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
|
2015-12-13 13:12:34 +01:00
|
|
|
'PhabricatorSubscriptionsSearchEngineExtension' => 'PhabricatorSearchEngineExtension',
|
2015-04-01 18:45:18 +02:00
|
|
|
'PhabricatorSubscriptionsSubscribeEmailCommand' => 'MetaMTAEmailTransactionCommand',
|
2015-06-14 00:45:17 +02:00
|
|
|
'PhabricatorSubscriptionsSubscribersPolicyRule' => 'PhabricatorPolicyRule',
|
2014-03-14 22:27:45 +01:00
|
|
|
'PhabricatorSubscriptionsTransactionController' => 'PhabricatorController',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorSubscriptionsUIEventListener' => 'PhabricatorEventListener',
|
2015-04-01 17:40:00 +02:00
|
|
|
'PhabricatorSubscriptionsUnsubscribeEmailCommand' => 'MetaMTAEmailTransactionCommand',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSupportApplication' => 'PhabricatorApplication',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorSyntaxHighlighter' => 'Phobject',
|
2013-01-10 18:56:36 +01:00
|
|
|
'PhabricatorSyntaxHighlightingConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2016-05-05 03:24:59 +02:00
|
|
|
'PhabricatorSyntaxStyle' => 'Phobject',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorSystemAction' => 'Phobject',
|
2014-04-03 20:22:38 +02:00
|
|
|
'PhabricatorSystemActionEngine' => 'Phobject',
|
|
|
|
'PhabricatorSystemActionGarbageCollector' => 'PhabricatorGarbageCollector',
|
|
|
|
'PhabricatorSystemActionLog' => 'PhabricatorSystemDAO',
|
|
|
|
'PhabricatorSystemActionRateLimitException' => 'Exception',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorSystemApplication' => 'PhabricatorApplication',
|
2014-04-03 20:22:38 +02:00
|
|
|
'PhabricatorSystemDAO' => 'PhabricatorLiskDAO',
|
2014-05-02 03:23:31 +02:00
|
|
|
'PhabricatorSystemDestructionGarbageCollector' => 'PhabricatorGarbageCollector',
|
|
|
|
'PhabricatorSystemDestructionLog' => 'PhabricatorSystemDAO',
|
2016-04-10 13:26:53 +02:00
|
|
|
'PhabricatorSystemReadOnlyController' => 'PhabricatorController',
|
2014-05-02 03:23:31 +02:00
|
|
|
'PhabricatorSystemRemoveDestroyWorkflow' => 'PhabricatorSystemRemoveWorkflow',
|
|
|
|
'PhabricatorSystemRemoveLogWorkflow' => 'PhabricatorSystemRemoveWorkflow',
|
|
|
|
'PhabricatorSystemRemoveWorkflow' => 'PhabricatorManagementWorkflow',
|
2014-06-20 20:49:41 +02:00
|
|
|
'PhabricatorSystemSelectEncodingController' => 'PhabricatorController',
|
|
|
|
'PhabricatorSystemSelectHighlightController' => 'PhabricatorController',
|
2015-01-06 12:56:03 +01:00
|
|
|
'PhabricatorTOTPAuthFactor' => 'PhabricatorAuthFactor',
|
|
|
|
'PhabricatorTOTPAuthFactorTestCase' => 'PhabricatorTestCase',
|
2011-03-10 22:48:29 +01:00
|
|
|
'PhabricatorTaskmasterDaemon' => 'PhabricatorDaemon',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorTestApplication' => 'PhabricatorApplication',
|
2015-05-20 01:37:39 +02:00
|
|
|
'PhabricatorTestCase' => 'PhutilTestCase',
|
2013-10-04 04:05:47 +02:00
|
|
|
'PhabricatorTestController' => 'PhabricatorController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorTestDataGenerator' => 'Phobject',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorTestNoCycleEdgeType' => 'PhabricatorEdgeType',
|
2013-02-06 22:37:42 +01:00
|
|
|
'PhabricatorTestStorageEngine' => 'PhabricatorFileStorageEngine',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorTestWorker' => 'PhabricatorWorker',
|
Implement a basic version of ApplicationEditor in Paste
Summary:
Ref T9132. Ref T4768. This is a rough v0 of ApplicationEditor, which replaces the edit workflow in Paste.
This mostly looks and works like ApplicationSearch, and is heavily modeled on it.
Roughly, we define a set of editable fields and the ApplicationEditor stuff builds everything else.
This has no functional changes, except:
- I removed "Fork Paste" since I don't think it's particularly useful now that pastes are editable. We could restore it if users miss it.
- Subscribers are now editable.
- Form field order is a little goofy (this will be fixed in a future diff).
- Subscribers and projects are now race-resistant.
The race-resistance works like this: instead of submitting just the new value ("subscribers=apple, dog") and doing a set operation ("set subscribers = apple, dog"), we submit the old and new values ("original=apple" + "new=apple, dog") then apply the user's changes as an add + remove ("add=dog", "remove=<none>"). This means that two users who do "Edit Paste" at around the same time and each add or remove a couple of subscribers won't overwrite each other, unless they actually add or remove the exact same subscribers (in which case their edits legitimately conflict). Previously, the last user to save would win, and whatever was in their field would overwrite the prior state, potentially losing the first user's edits.
Test Plan:
- Created pastes.
- Created pastes via API.
- Edited pastes.
- Edited every field.
- Opened a paste in two windows and did project/subscriber edits in each, saved in arbitrary order, had edits respected.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4768, T9132
Differential Revision: https://secure.phabricator.com/D14390
2015-11-03 03:58:32 +01:00
|
|
|
'PhabricatorTextAreaEditField' => 'PhabricatorEditField',
|
|
|
|
'PhabricatorTextEditField' => 'PhabricatorEditField',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorTime' => 'Phobject',
|
|
|
|
'PhabricatorTimeGuard' => 'Phobject',
|
2013-06-03 21:58:11 +02:00
|
|
|
'PhabricatorTimeTestCase' => 'PhabricatorTestCase',
|
2015-01-02 05:27:45 +01:00
|
|
|
'PhabricatorTimezoneSetupCheck' => 'PhabricatorSetupCheck',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorToken' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorTokenDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-02-15 16:47:14 +01:00
|
|
|
),
|
|
|
|
'PhabricatorTokenController' => 'PhabricatorController',
|
|
|
|
'PhabricatorTokenCount' => 'PhabricatorTokenDAO',
|
2013-03-04 20:47:58 +01:00
|
|
|
'PhabricatorTokenCountQuery' => 'PhabricatorOffsetPagedQuery',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenDAO' => 'PhabricatorLiskDAO',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorTokenDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenGiveController' => 'PhabricatorTokenController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorTokenGiven' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorTokenDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-02-15 16:47:14 +01:00
|
|
|
),
|
|
|
|
'PhabricatorTokenGivenController' => 'PhabricatorTokenController',
|
|
|
|
'PhabricatorTokenGivenEditor' => 'PhabricatorEditor',
|
2013-02-19 02:44:45 +01:00
|
|
|
'PhabricatorTokenGivenFeedStory' => 'PhabricatorFeedStory',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenGivenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-03-22 00:04:29 +01:00
|
|
|
'PhabricatorTokenLeaderController' => 'PhabricatorTokenController',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-03-22 00:04:29 +01:00
|
|
|
'PhabricatorTokenReceiverQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhabricatorTokenTokenPHIDType' => 'PhabricatorPHIDType',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorTokenUIEventListener' => 'PhabricatorEventListener',
|
2015-11-29 22:24:47 +01:00
|
|
|
'PhabricatorTokenizerEditField' => 'PhabricatorPHIDListEditField',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorTokensApplication' => 'PhabricatorApplication',
|
2016-03-05 23:45:56 +01:00
|
|
|
'PhabricatorTokensCurtainExtension' => 'PHUICurtainExtension',
|
2015-01-02 05:20:08 +01:00
|
|
|
'PhabricatorTokensSettingsPanel' => 'PhabricatorSettingsPanel',
|
2015-01-03 22:36:47 +01:00
|
|
|
'PhabricatorTooltipUIExample' => 'PhabricatorUIExample',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorTransactions' => 'Phobject',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorTransactionsApplication' => 'PhabricatorApplication',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorTransactionsDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension',
|
2015-12-21 16:08:17 +01:00
|
|
|
'PhabricatorTransactionsFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension',
|
2011-05-22 23:40:51 +02:00
|
|
|
'PhabricatorTransformedFile' => 'PhabricatorFileDAO',
|
2013-01-05 01:22:52 +01:00
|
|
|
'PhabricatorTranslationsConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorTriggerAction' => 'Phobject',
|
2015-01-16 00:57:45 +01:00
|
|
|
'PhabricatorTriggerClock' => 'Phobject',
|
|
|
|
'PhabricatorTriggerClockTestCase' => 'PhabricatorTestCase',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorTriggerDaemon' => 'PhabricatorDaemon',
|
2011-08-03 17:17:53 +02:00
|
|
|
'PhabricatorTrivialTestCase' => 'PhabricatorTestCase',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorTwitchAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
|
|
|
'PhabricatorTwitterAuthProvider' => 'PhabricatorOAuth1AuthProvider',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorTypeaheadApplication' => 'PhabricatorApplication',
|
2014-02-14 19:23:25 +01:00
|
|
|
'PhabricatorTypeaheadCompositeDatasource' => 'PhabricatorTypeaheadDatasource',
|
|
|
|
'PhabricatorTypeaheadDatasource' => 'Phobject',
|
2011-01-25 22:48:05 +01:00
|
|
|
'PhabricatorTypeaheadDatasourceController' => 'PhabricatorController',
|
2015-04-20 22:43:07 +02:00
|
|
|
'PhabricatorTypeaheadFunctionHelpController' => 'PhabricatorTypeaheadDatasourceController',
|
2015-04-17 00:30:41 +02:00
|
|
|
'PhabricatorTypeaheadInvalidTokenException' => 'Exception',
|
2014-02-14 19:23:25 +01:00
|
|
|
'PhabricatorTypeaheadModularDatasourceController' => 'PhabricatorTypeaheadDatasourceController',
|
|
|
|
'PhabricatorTypeaheadMonogramDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorTypeaheadResult' => 'Phobject',
|
2014-02-14 19:23:25 +01:00
|
|
|
'PhabricatorTypeaheadRuntimeCompositeDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
2015-04-15 18:16:26 +02:00
|
|
|
'PhabricatorTypeaheadTokenView' => 'AphrontTagView',
|
2013-12-07 19:46:09 +01:00
|
|
|
'PhabricatorUIConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorUIExample' => 'Phobject',
|
2012-09-11 18:56:40 +02:00
|
|
|
'PhabricatorUIExampleRenderController' => 'PhabricatorController',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorUIExamplesApplication' => 'PhabricatorApplication',
|
2015-02-11 22:02:35 +01:00
|
|
|
'PhabricatorUSEnglishTranslation' => 'PhutilTranslation',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorUnitTestContentSource' => 'PhabricatorContentSource',
|
2012-05-04 02:30:17 +02:00
|
|
|
'PhabricatorUnitsTestCase' => 'PhabricatorTestCase',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorUnknownContentSource' => 'PhabricatorContentSource',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorUnsubscribedFromObjectEdgeType' => 'PhabricatorEdgeType',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorUser' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorUserDAO',
|
|
|
|
'PhutilPerson',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorCustomFieldInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2014-11-11 17:18:26 +01:00
|
|
|
'PhabricatorSSHPublicKeyInterface',
|
2015-07-20 22:43:58 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
2015-06-08 22:35:57 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2013-06-07 18:55:55 +02:00
|
|
|
),
|
2013-06-07 19:22:45 +02:00
|
|
|
'PhabricatorUserBlurbField' => 'PhabricatorUserCustomField',
|
2016-02-11 23:55:44 +01:00
|
|
|
'PhabricatorUserCardView' => 'AphrontTagView',
|
2013-06-07 19:22:45 +02:00
|
|
|
'PhabricatorUserConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorUserConfiguredCustomField' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorUserCustomField',
|
|
|
|
'PhabricatorStandardCustomFieldInterface',
|
2012-06-15 03:08:06 +02:00
|
|
|
),
|
Support configuration-driven custom fields
Summary:
Ref T1702. Ref T3718. There are a couple of things going on here:
**PhabricatorCustomFieldList**: I added `PhabricatorCustomFieldList`, which is just a convenience class for dealing with lists of fields. Often, current field code does something like this inline in a Controller:
foreach ($fields as $field) {
// do some junk
}
Often, that junk has some slightly subtle implications. Move all of it to `$list->doSomeJunk()` methods (like `appendFieldsToForm()`, `loadFieldsFromStorage()`) to reduce code duplication and prevent errors. This additionally moves an existing list-convenience method there, out of `PhabricatorPropertyListView`.
**PhabricatorUserConfiguredCustomFieldStorage**: Adds `PhabricatorUserConfiguredCustomFieldStorage` for storing custom field data (like "ICQ Handle", "Phone Number", "Desk", "Favorite Flower", etc).
**Configuration-Driven Custom Fields**: Previously, I was thinking about doing these with interfaces, but as I thought about it more I started to dislike that approach. Instead, I built proxies into `PhabricatorCustomField`. Basically, this means that fields (like a custom, configuration-driven "Favorite Flower" field) can just use some other Field to actually provide their implementation (like a "standard" field which knows how to render text areas). The previous approach would have involed subclasssing the "standard" field and implementing an interface, but that would mean that every application would have at least two "base" fields and generally just seemed bleh as I worked through it.
The cost of this approach is that we need a bunch of `proxy` junk in the base class, but that's a one-time cost and I think it simplifies all the implementations and makes them a lot less magical (e.g., all of the custom fields now extend the right base field classes).
**Fixed Some Bugs**: Some of this code hadn't really been run yet and had minor bugs.
Test Plan:
{F54240}
{F54241}
{F54242}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1702, T1703, T3718
Differential Revision: https://secure.phabricator.com/D6749
2013-08-14 17:10:16 +02:00
|
|
|
'PhabricatorUserConfiguredCustomFieldStorage' => 'PhabricatorCustomFieldStorage',
|
|
|
|
'PhabricatorUserCustomField' => 'PhabricatorCustomField',
|
Integrate ApplicationSearch with CustomField
Summary:
Ref T2625. Ref T3794. Ref T418. Ref T1703.
This is a more general version of D5278. It expands CustomField support to include real integration with ApplicationSearch.
Broadly, custom fields may elect to:
- build indicies when objects are updated;
- populate ApplicationSearch forms with new controls;
- read inputs entered into those controls out of the request; and
- apply constraints to search queries.
Some utility/helper stuff is provided to make this easier. This part could be cleaner, but seems reasonable for a first cut. In particular, the Query and SearchEngine must manually call all the hooks right now instead of everything happening magically. I think that's fine for the moment; they're pretty easy to get right.
Test Plan:
I added a new searchable "Company" field to People:
{F58229}
This also cleaned up the disable/reorder view a little bit:
{F58230}
As it did before, this field appears on the edit screen:
{F58231}
However, because it has `search`, it also appears on the search screen:
{F58232}
When queried, it returns the expected results:
{F58233}
And the actually good bit of all this is that the query can take advantage of indexes:
mysql> explain SELECT * FROM `user` user JOIN `user_customfieldstringindex` `appsearch_0` ON `appsearch_0`.objectPHID = user.phid AND `appsearch_0`.indexKey = 'mk3Ndy476ge6' AND `appsearch_0`.indexValue IN ('phacility') ORDER BY user.id DESC LIMIT 101;
+----+-------------+-------------+--------+-------------------+----------+---------+------------------------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+--------+-------------------+----------+---------+------------------------------------------+------+----------------------------------------------+
| 1 | SIMPLE | appsearch_0 | ref | key_join,key_find | key_find | 232 | const,const | 1 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | user | eq_ref | phid | phid | 194 | phabricator2_user.appsearch_0.objectPHID | 1 | |
+----+-------------+-------------+--------+-------------------+----------+---------+------------------------------------------+------+----------------------------------------------+
2 rows in set (0.00 sec)
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T418, T1703, T2625, T3794
Differential Revision: https://secure.phabricator.com/D6992
2013-09-16 22:44:34 +02:00
|
|
|
'PhabricatorUserCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage',
|
|
|
|
'PhabricatorUserCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage',
|
2011-01-24 03:09:16 +01:00
|
|
|
'PhabricatorUserDAO' => 'PhabricatorLiskDAO',
|
2012-10-10 19:18:23 +02:00
|
|
|
'PhabricatorUserEditor' => 'PhabricatorEditor',
|
2014-02-23 19:19:35 +01:00
|
|
|
'PhabricatorUserEditorTestCase' => 'PhabricatorTestCase',
|
2012-05-07 19:29:33 +02:00
|
|
|
'PhabricatorUserEmail' => 'PhabricatorUserDAO',
|
2014-02-24 02:31:46 +01:00
|
|
|
'PhabricatorUserEmailTestCase' => 'PhabricatorTestCase',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorUserFulltextEngine' => 'PhabricatorFulltextEngine',
|
2016-01-24 14:43:57 +01:00
|
|
|
'PhabricatorUserIconField' => 'PhabricatorUserCustomField',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhabricatorUserLog' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorUserDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2014-04-28 02:31:35 +02:00
|
|
|
),
|
2014-04-28 02:32:09 +02:00
|
|
|
'PhabricatorUserLogView' => 'AphrontView',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorUserPHIDResolver' => 'PhabricatorPHIDResolver',
|
2011-03-31 04:21:09 +02:00
|
|
|
'PhabricatorUserPreferences' => 'PhabricatorUserDAO',
|
2011-02-20 03:28:41 +01:00
|
|
|
'PhabricatorUserProfile' => 'PhabricatorUserDAO',
|
2013-06-07 18:55:55 +02:00
|
|
|
'PhabricatorUserProfileEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhabricatorUserRealNameField' => 'PhabricatorUserCustomField',
|
2013-07-10 21:34:09 +02:00
|
|
|
'PhabricatorUserRolesField' => 'PhabricatorUserCustomField',
|
Generate expected schemata for User/People tables
Summary:
Ref T1191. Some notes here:
- Drops the old LDAP and OAuth info tables. These were migrated to the ExternalAccount table a very long time ago.
- Separates surplus/missing keys from other types of surplus/missing things. In the long run, my plan is to have only two notice levels:
- Error: something we can't fix (missing database, table, or column; overlong key).
- Warning: something we can fix (surplus anything, missing key, bad column type, bad key columns, bad uniqueness, bad collation or charset).
- For now, retaining three levels is helpful in generating all the expected scheamta.
Test Plan:
- Saw ~200 issues resolve, leaving ~1,300.
- Grepped for removed tables.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T1191
Differential Revision: https://secure.phabricator.com/D10580
2014-10-01 16:36:47 +02:00
|
|
|
'PhabricatorUserSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-07-10 14:09:59 +02:00
|
|
|
'PhabricatorUserSinceField' => 'PhabricatorUserCustomField',
|
2013-07-10 21:34:09 +02:00
|
|
|
'PhabricatorUserStatusField' => 'PhabricatorUserCustomField',
|
2012-01-16 16:30:28 +01:00
|
|
|
'PhabricatorUserTestCase' => 'PhabricatorTestCase',
|
2013-06-07 19:22:45 +02:00
|
|
|
'PhabricatorUserTitleField' => 'PhabricatorUserCustomField',
|
2013-06-06 23:53:07 +02:00
|
|
|
'PhabricatorUserTransaction' => 'PhabricatorApplicationTransaction',
|
2015-11-04 19:20:38 +01:00
|
|
|
'PhabricatorUsersEditField' => 'PhabricatorTokenizerEditField',
|
2015-01-03 13:48:19 +01:00
|
|
|
'PhabricatorUsersPolicyRule' => 'PhabricatorPolicyRule',
|
2015-07-06 14:52:04 +02:00
|
|
|
'PhabricatorUsersSearchField' => 'PhabricatorSearchTokenizerField',
|
Accept and route VCS HTTP requests
Summary:
Mostly ripped from D7391, with some changes:
- Serve repositories at `/diffusion/X/`, with no special `/git/` or `/serve/` URI component.
- This requires a little bit of magic, but I got the magic working for Git, Mercurial and SVN, and it seems reasonable.
- I think having one URI for everything will make it easier for users to understand.
- One downside is that git will clone into `X` by default, but I think that's not a big deal, and we can work around that in the future easily enough.
- Accept HTTP requests for Git, SVN and Mercurial repositories.
- Auth logic is a little different in order to be more consistent with how other things work.
- Instead of AphrontBasicAuthResponse, added "VCSResponse". Mercurial can print strings we send it on the CLI if we're careful, so support that. I did a fair amount of digging and didn't have any luck with git or svn.
- Commands we don't know about are assumed to require "Push" capability by default.
No actual VCS data going over the wire yet.
Test Plan:
Ran a bunch of stuff like this:
$ hg clone http://local.aphront.com:8080/diffusion/P/
abort: HTTP Error 403: This repository is not available over HTTP.
...and got pretty reasonable-seeming errors in all cases. All this can do is produce errors for now.
Reviewers: hach-que, btrahan
Reviewed By: hach-que
CC: aran
Maniphest Tasks: T2230
Differential Revision: https://secure.phabricator.com/D7417
2013-10-26 16:56:17 +02:00
|
|
|
'PhabricatorVCSResponse' => 'AphrontResponse',
|
2015-12-02 21:25:24 +01:00
|
|
|
'PhabricatorVersionedDraft' => 'PhabricatorDraftDAO',
|
2015-02-11 22:02:35 +01:00
|
|
|
'PhabricatorVeryWowEnglishTranslation' => 'PhutilTranslation',
|
2015-04-17 00:30:41 +02:00
|
|
|
'PhabricatorViewerDatasource' => 'PhabricatorTypeaheadDatasource',
|
2015-01-03 00:33:25 +01:00
|
|
|
'PhabricatorWatcherHasObjectEdgeType' => 'PhabricatorEdgeType',
|
2016-03-25 13:56:16 +01:00
|
|
|
'PhabricatorWebContentSource' => 'PhabricatorContentSource',
|
2014-07-22 13:04:13 +02:00
|
|
|
'PhabricatorWordPressAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhabricatorWorker' => 'Phobject',
|
2012-10-31 23:22:16 +01:00
|
|
|
'PhabricatorWorkerActiveTask' => 'PhabricatorWorkerTask',
|
|
|
|
'PhabricatorWorkerArchiveTask' => 'PhabricatorWorkerTask',
|
2014-12-24 00:45:42 +01:00
|
|
|
'PhabricatorWorkerArchiveTaskQuery' => 'PhabricatorQuery',
|
2015-06-23 22:36:16 +02:00
|
|
|
'PhabricatorWorkerBulkJob' => array(
|
|
|
|
'PhabricatorWorkerDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
|
|
|
),
|
|
|
|
'PhabricatorWorkerBulkJobCreateWorker' => 'PhabricatorWorkerBulkJobWorker',
|
|
|
|
'PhabricatorWorkerBulkJobEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhabricatorWorkerBulkJobPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorWorkerBulkJobQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorWorkerBulkJobSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'PhabricatorWorkerBulkJobTaskWorker' => 'PhabricatorWorkerBulkJobWorker',
|
|
|
|
'PhabricatorWorkerBulkJobTestCase' => 'PhabricatorTestCase',
|
|
|
|
'PhabricatorWorkerBulkJobTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorWorkerBulkJobTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PhabricatorWorkerBulkJobType' => 'Phobject',
|
|
|
|
'PhabricatorWorkerBulkJobWorker' => 'PhabricatorWorker',
|
|
|
|
'PhabricatorWorkerBulkTask' => 'PhabricatorWorkerDAO',
|
2011-03-10 22:48:29 +01:00
|
|
|
'PhabricatorWorkerDAO' => 'PhabricatorLiskDAO',
|
2015-12-20 17:11:59 +01:00
|
|
|
'PhabricatorWorkerDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension',
|
2012-11-01 19:30:16 +01:00
|
|
|
'PhabricatorWorkerLeaseQuery' => 'PhabricatorQuery',
|
2014-12-06 18:14:16 +01:00
|
|
|
'PhabricatorWorkerManagementCancelWorkflow' => 'PhabricatorWorkerManagementWorkflow',
|
2015-02-11 15:06:09 +01:00
|
|
|
'PhabricatorWorkerManagementExecuteWorkflow' => 'PhabricatorWorkerManagementWorkflow',
|
2014-11-24 20:10:15 +01:00
|
|
|
'PhabricatorWorkerManagementFloodWorkflow' => 'PhabricatorWorkerManagementWorkflow',
|
2014-12-06 18:14:16 +01:00
|
|
|
'PhabricatorWorkerManagementFreeWorkflow' => 'PhabricatorWorkerManagementWorkflow',
|
|
|
|
'PhabricatorWorkerManagementRetryWorkflow' => 'PhabricatorWorkerManagementWorkflow',
|
2014-11-24 20:10:15 +01:00
|
|
|
'PhabricatorWorkerManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorWorkerPermanentFailureException' => 'Exception',
|
2015-06-23 22:36:16 +02:00
|
|
|
'PhabricatorWorkerSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2011-03-10 22:48:29 +01:00
|
|
|
'PhabricatorWorkerTask' => 'PhabricatorWorkerDAO',
|
|
|
|
'PhabricatorWorkerTaskData' => 'PhabricatorWorkerDAO',
|
2011-03-27 07:55:18 +02:00
|
|
|
'PhabricatorWorkerTaskDetailController' => 'PhabricatorDaemonController',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorWorkerTestCase' => 'PhabricatorTestCase',
|
2015-01-20 01:55:38 +01:00
|
|
|
'PhabricatorWorkerTrigger' => array(
|
|
|
|
'PhabricatorWorkerDAO',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2015-01-20 22:32:43 +01:00
|
|
|
'PhabricatorPolicyInterface',
|
2015-01-20 01:55:38 +01:00
|
|
|
),
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorWorkerTriggerEvent' => 'PhabricatorWorkerDAO',
|
2015-01-20 20:31:32 +01:00
|
|
|
'PhabricatorWorkerTriggerManagementFireWorkflow' => 'PhabricatorWorkerTriggerManagementWorkflow',
|
|
|
|
'PhabricatorWorkerTriggerManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
Implement clock/trigger infrastructure for scheduling actions
Summary:
Ref T6881. Hopefully, this is the hard part.
This adds a new daemon (the "trigger" daemon) which processes triggers, schedules them, and then executes them at the scheduled time. The design is a little complicated, but has these goals:
- High resistance to race conditions: only the application writes to the trigger table; only the daemon writes to the event table. We won't lose events if someone saves a meeting at the same time as we're sending a reminder out for it.
- Execution guarantees: scheduled events are guaranteed to execute exactly once.
- Support for arbitrarily large queues: the daemon will make progress even if there are millions of triggers in queue. The cost to update the queue is proportional to the number of changes in it; the cost to process the queue is proportional to the number of events to execute.
- Relatively good observability: you can monitor the state of the trigger queue reasonably well from the web UI.
- Modular Infrastructure: this is a very low-level construct that Calendar, Phortune, etc., should be able to build on top of.
It doesn't have this stuff yet:
- Not very robust to bad actions: a misbehaving trigger can stop the queue fairly easily. This is OK for now since we aren't planning to make it part of any other applications for a while. We do still get execute-exaclty-once, but it might not happen for a long time (until someone goes and fixes the queue), when we could theoretically continue executing other events.
- Doesn't start automatically: normal users don't need to run this thing yet so I'm not starting it by default.
- Not super well tested: I've vetted the basics but haven't run real workloads through this yet.
- No sophisticated tooling: I added some basic stuff but it's missing some pieces we'll have to build sooner or later, e.g. `bin/trigger cancel` or whatever.
- Intentionally not realtime: This design puts execution guarantees far above realtime concerns, and will not give you precise event execution at 1-second resolution. I think this is the correct goal to pursue architecturally, and certainly correct for subscriptions and meeting reminders. Events which execute after they have become irrelevant can simply decline to do anything (like a meeting reminder which executes after the meeting is over).
In general, the expectation for applications is:
- When creating an object (like a calendar event) that needs to trigger a scheduled action, write a trigger (and save the PHID if you plan to update it later).
- The daemon will process the event and schedule the action efficiently, in a race-free way.
- If you want to move the action, update the trigger and the daemon will take care of it.
- Your action will eventually dump a task into the task queue, and the task daemons will actually perform it.
Test Plan:
Using a test script like this:
```
<?php
require_once 'scripts/__init_script__.php';
$trigger = id(new PhabricatorWorkerTrigger())
->setAction(
new PhabricatorLogTriggerAction(
array(
'message' => 'test',
)))
->setClock(
new PhabricatorMetronomicTriggerClock(
array(
'period' => 33,
)))
->save();
var_dump($trigger);
```
...I queued triggers and ran the daemon:
- Verified triggers fire;
- verified triggers reschedule;
- verified trigger events show up in the web UI;
- tried different periods;
- added some triggers while the daemon was running;
- examined `phd debug` output for anything suspicious.
It seems to work in trivial use case, at least.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T6881
Differential Revision: https://secure.phabricator.com/D11419
2015-01-16 21:13:31 +01:00
|
|
|
'PhabricatorWorkerTriggerPHIDType' => 'PhabricatorPHIDType',
|
2015-01-20 22:32:43 +01:00
|
|
|
'PhabricatorWorkerTriggerQuery' => 'PhabricatorPolicyAwareQuery',
|
2014-04-16 22:02:12 +02:00
|
|
|
'PhabricatorWorkerYieldException' => 'Exception',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorWorkingCopyDiscoveryTestCase' => 'PhabricatorWorkingCopyTestCase',
|
2013-05-13 04:05:52 +02:00
|
|
|
'PhabricatorWorkingCopyPullTestCase' => 'PhabricatorWorkingCopyTestCase',
|
|
|
|
'PhabricatorWorkingCopyTestCase' => 'PhabricatorTestCase',
|
2015-11-14 11:41:27 +01:00
|
|
|
'PhabricatorXHPASTDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorXHPASTParseTree' => 'PhabricatorXHPASTDAO',
|
2011-04-07 04:17:05 +02:00
|
|
|
'PhabricatorXHPASTViewController' => 'PhabricatorController',
|
|
|
|
'PhabricatorXHPASTViewFrameController' => 'PhabricatorXHPASTViewController',
|
|
|
|
'PhabricatorXHPASTViewFramesetController' => 'PhabricatorXHPASTViewController',
|
|
|
|
'PhabricatorXHPASTViewInputController' => 'PhabricatorXHPASTViewPanelController',
|
|
|
|
'PhabricatorXHPASTViewPanelController' => 'PhabricatorXHPASTViewController',
|
|
|
|
'PhabricatorXHPASTViewRunController' => 'PhabricatorXHPASTViewController',
|
|
|
|
'PhabricatorXHPASTViewStreamController' => 'PhabricatorXHPASTViewPanelController',
|
|
|
|
'PhabricatorXHPASTViewTreeController' => 'PhabricatorXHPASTViewPanelController',
|
2014-07-23 02:03:09 +02:00
|
|
|
'PhabricatorXHProfApplication' => 'PhabricatorApplication',
|
2011-02-02 22:48:52 +01:00
|
|
|
'PhabricatorXHProfController' => 'PhabricatorController',
|
2012-08-25 00:14:38 +02:00
|
|
|
'PhabricatorXHProfDAO' => 'PhabricatorLiskDAO',
|
2011-02-02 22:48:52 +01:00
|
|
|
'PhabricatorXHProfProfileController' => 'PhabricatorXHProfController',
|
2012-01-28 20:17:19 +01:00
|
|
|
'PhabricatorXHProfProfileSymbolView' => 'PhabricatorXHProfProfileView',
|
|
|
|
'PhabricatorXHProfProfileTopLevelView' => 'PhabricatorXHProfProfileView',
|
|
|
|
'PhabricatorXHProfProfileView' => 'AphrontView',
|
2012-08-25 00:14:38 +02:00
|
|
|
'PhabricatorXHProfSample' => 'PhabricatorXHProfDAO',
|
|
|
|
'PhabricatorXHProfSampleListController' => 'PhabricatorXHProfController',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PhabricatorYoutubeRemarkupRule' => 'PhutilRemarkupRule',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhameBlog' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhameDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorMarkupInterface',
|
2015-07-22 16:00:36 +02:00
|
|
|
'PhabricatorSubscribableInterface',
|
2015-07-22 16:04:21 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
2015-07-22 16:08:00 +02:00
|
|
|
'PhabricatorProjectInterface',
|
2015-11-28 22:01:11 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2015-06-03 23:24:21 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-12-28 12:58:43 +01:00
|
|
|
'PhabricatorConduitResultInterface',
|
2012-10-15 23:49:52 +02:00
|
|
|
),
|
2015-11-21 17:51:07 +01:00
|
|
|
'PhameBlogArchiveController' => 'PhameBlogController',
|
2015-11-05 23:53:24 +01:00
|
|
|
'PhameBlogController' => 'PhameController',
|
2015-11-07 20:57:34 +01:00
|
|
|
'PhameBlogCreateCapability' => 'PhabricatorPolicyCapability',
|
2015-12-28 12:57:03 +01:00
|
|
|
'PhameBlogEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
2015-11-05 23:53:24 +01:00
|
|
|
'PhameBlogEditController' => 'PhameBlogController',
|
2015-12-16 20:56:41 +01:00
|
|
|
'PhameBlogEditEngine' => 'PhabricatorEditEngine',
|
2015-05-15 02:05:58 +02:00
|
|
|
'PhameBlogEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-11-05 23:53:24 +01:00
|
|
|
'PhameBlogFeedController' => 'PhameBlogController',
|
|
|
|
'PhameBlogListController' => 'PhameBlogController',
|
2015-12-12 02:23:09 +01:00
|
|
|
'PhameBlogListView' => 'AphrontTagView',
|
2015-11-30 17:47:46 +01:00
|
|
|
'PhameBlogManageController' => 'PhameBlogController',
|
2015-11-28 21:42:36 +01:00
|
|
|
'PhameBlogProfilePictureController' => 'PhameBlogController',
|
2012-10-15 23:49:52 +02:00
|
|
|
'PhameBlogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-11-08 16:50:01 +01:00
|
|
|
'PhameBlogReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2015-12-28 12:58:43 +01:00
|
|
|
'PhameBlogSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
2015-07-22 22:31:47 +02:00
|
|
|
'PhameBlogSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-06-29 23:04:48 +02:00
|
|
|
'PhameBlogSite' => 'PhameSite',
|
2015-05-15 02:05:58 +02:00
|
|
|
'PhameBlogTransaction' => 'PhabricatorApplicationTransaction',
|
2015-11-08 16:50:01 +01:00
|
|
|
'PhameBlogTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
Remove skins from Phame
Summary:
Ref T9897. Purge a bunch of stuff:
- Remove skins.
- Remove all custom sites for skin resources.
- Remove "framed", "notlive", "preview", separate "live" controllers (see below).
- Merge "publish" and "unpublish" controllers into one.
New behavior:
- Blogs and posts have three views:
- "View": Internal view URI, which is a normal detail page.
- "Internal Live": Internal view URI which is a little prettier.
- "External Live": External view URI for an external domain.
Right now, the differences are pretty minor (basically, different crumbs/chrome). This mostly gives us room to put some milder flavor of skins back later (photography or more "presentation" elements, for example).
This removes 9 million lines of code so I probably missed a couple of things, but I think it's like 95% of the way there.
Test Plan:
Here are some examples of what the "view", "internal" and "external" views look like for blogs (posts are similar):
"View": Unchanged
{F1021634}
"Internal": No chrome or footer. Still write actions (edit, post commments). Has crumbs to get back into Phame.
{F1021635}
"External": No chrome or footer. No write actions. No Phabricator crumbs. No policy/status information.
{F1021638}
I figure we'll probably tweak these a bit to figure out what makes sense (like: maybe no actions on "internal, live"? and "external, live" probably needs a way to set a root "Company >" crumb?) but that they're reasonable-ish as a first cut?
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9897
Differential Revision: https://secure.phabricator.com/D14740
2015-12-11 16:07:45 +01:00
|
|
|
'PhameBlogViewController' => 'PhameLiveController',
|
2015-11-07 15:52:42 +01:00
|
|
|
'PhameConstants' => 'Phobject',
|
2012-04-12 22:09:04 +02:00
|
|
|
'PhameController' => 'PhabricatorController',
|
|
|
|
'PhameDAO' => 'PhabricatorLiskDAO',
|
2015-12-03 23:28:44 +01:00
|
|
|
'PhameDescriptionView' => 'AphrontTagView',
|
2015-12-12 22:19:21 +01:00
|
|
|
'PhameDraftListView' => 'AphrontTagView',
|
2015-12-01 01:25:59 +01:00
|
|
|
'PhameHomeController' => 'PhamePostController',
|
Remove skins from Phame
Summary:
Ref T9897. Purge a bunch of stuff:
- Remove skins.
- Remove all custom sites for skin resources.
- Remove "framed", "notlive", "preview", separate "live" controllers (see below).
- Merge "publish" and "unpublish" controllers into one.
New behavior:
- Blogs and posts have three views:
- "View": Internal view URI, which is a normal detail page.
- "Internal Live": Internal view URI which is a little prettier.
- "External Live": External view URI for an external domain.
Right now, the differences are pretty minor (basically, different crumbs/chrome). This mostly gives us room to put some milder flavor of skins back later (photography or more "presentation" elements, for example).
This removes 9 million lines of code so I probably missed a couple of things, but I think it's like 95% of the way there.
Test Plan:
Here are some examples of what the "view", "internal" and "external" views look like for blogs (posts are similar):
"View": Unchanged
{F1021634}
"Internal": No chrome or footer. Still write actions (edit, post commments). Has crumbs to get back into Phame.
{F1021635}
"External": No chrome or footer. No write actions. No Phabricator crumbs. No policy/status information.
{F1021638}
I figure we'll probably tweak these a bit to figure out what makes sense (like: maybe no actions on "internal, live"? and "external, live" probably needs a way to set a root "Company >" crumb?) but that they're reasonable-ish as a first cut?
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9897
Differential Revision: https://secure.phabricator.com/D14740
2015-12-11 16:07:45 +01:00
|
|
|
'PhameLiveController' => 'PhameController',
|
2015-12-31 22:08:33 +01:00
|
|
|
'PhameNextPostView' => 'AphrontTagView',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhamePost' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhameDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorMarkupInterface',
|
2015-07-22 16:04:21 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
2015-07-22 16:08:00 +02:00
|
|
|
'PhabricatorProjectInterface',
|
2015-05-15 22:07:45 +02:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-07-22 16:00:36 +02:00
|
|
|
'PhabricatorSubscribableInterface',
|
2015-11-28 22:01:11 +01:00
|
|
|
'PhabricatorDestructibleInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorTokenReceiverInterface',
|
2015-12-28 13:25:01 +01:00
|
|
|
'PhabricatorConduitResultInterface',
|
2012-10-15 23:50:12 +02:00
|
|
|
),
|
2015-11-10 06:20:35 +01:00
|
|
|
'PhamePostCommentController' => 'PhamePostController',
|
2015-11-05 23:53:24 +01:00
|
|
|
'PhamePostController' => 'PhameController',
|
2015-12-28 14:46:22 +01:00
|
|
|
'PhamePostEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
2015-11-05 23:53:24 +01:00
|
|
|
'PhamePostEditController' => 'PhamePostController',
|
2015-12-28 02:38:25 +01:00
|
|
|
'PhamePostEditEngine' => 'PhabricatorEditEngine',
|
2015-05-15 22:07:45 +02:00
|
|
|
'PhamePostEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-12-04 00:27:01 +01:00
|
|
|
'PhamePostHistoryController' => 'PhamePostController',
|
2015-11-05 23:53:24 +01:00
|
|
|
'PhamePostListController' => 'PhamePostController',
|
2015-12-01 01:25:59 +01:00
|
|
|
'PhamePostListView' => 'AphrontTagView',
|
2015-11-10 18:41:05 +01:00
|
|
|
'PhamePostMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2015-12-07 23:12:05 +01:00
|
|
|
'PhamePostMoveController' => 'PhamePostController',
|
2015-11-05 23:53:24 +01:00
|
|
|
'PhamePostPublishController' => 'PhamePostController',
|
2012-10-15 23:50:12 +02:00
|
|
|
'PhamePostQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-11-07 02:40:13 +01:00
|
|
|
'PhamePostReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2015-12-28 13:25:01 +01:00
|
|
|
'PhamePostSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
2015-07-22 16:30:52 +02:00
|
|
|
'PhamePostSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-05-15 22:07:45 +02:00
|
|
|
'PhamePostTransaction' => 'PhabricatorApplicationTransaction',
|
2015-11-10 06:20:35 +01:00
|
|
|
'PhamePostTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2015-05-15 22:07:45 +02:00
|
|
|
'PhamePostTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
Remove skins from Phame
Summary:
Ref T9897. Purge a bunch of stuff:
- Remove skins.
- Remove all custom sites for skin resources.
- Remove "framed", "notlive", "preview", separate "live" controllers (see below).
- Merge "publish" and "unpublish" controllers into one.
New behavior:
- Blogs and posts have three views:
- "View": Internal view URI, which is a normal detail page.
- "Internal Live": Internal view URI which is a little prettier.
- "External Live": External view URI for an external domain.
Right now, the differences are pretty minor (basically, different crumbs/chrome). This mostly gives us room to put some milder flavor of skins back later (photography or more "presentation" elements, for example).
This removes 9 million lines of code so I probably missed a couple of things, but I think it's like 95% of the way there.
Test Plan:
Here are some examples of what the "view", "internal" and "external" views look like for blogs (posts are similar):
"View": Unchanged
{F1021634}
"Internal": No chrome or footer. Still write actions (edit, post commments). Has crumbs to get back into Phame.
{F1021635}
"External": No chrome or footer. No write actions. No Phabricator crumbs. No policy/status information.
{F1021638}
I figure we'll probably tweak these a bit to figure out what makes sense (like: maybe no actions on "internal, live"? and "external, live" probably needs a way to set a root "Company >" crumb?) but that they're reasonable-ish as a first cut?
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T9897
Differential Revision: https://secure.phabricator.com/D14740
2015-12-11 16:07:45 +01:00
|
|
|
'PhamePostViewController' => 'PhameLiveController',
|
2014-09-24 22:50:57 +02:00
|
|
|
'PhameSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-06-29 23:04:48 +02:00
|
|
|
'PhameSite' => 'PhabricatorSite',
|
2013-03-21 02:01:52 +01:00
|
|
|
'PhluxController' => 'PhabricatorController',
|
|
|
|
'PhluxDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhluxEditController' => 'PhluxController',
|
|
|
|
'PhluxListController' => 'PhluxController',
|
|
|
|
'PhluxTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhluxTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhluxVariable' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhluxDAO',
|
2014-12-03 22:16:15 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-03-21 02:01:52 +01:00
|
|
|
),
|
|
|
|
'PhluxVariableEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhluxVariablePHIDType' => 'PhabricatorPHIDType',
|
2013-03-21 02:01:52 +01:00
|
|
|
'PhluxVariableQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhluxViewController' => 'PhluxController',
|
2013-10-22 02:00:50 +02:00
|
|
|
'PholioActionMenuEventListener' => 'PhabricatorEventListener',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioController' => 'PhabricatorController',
|
|
|
|
'PholioDAO' => 'PhabricatorLiskDAO',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PholioDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'PholioDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PholioImage' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PholioDAO',
|
|
|
|
'PhabricatorMarkupInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
),
|
2014-07-24 00:05:46 +02:00
|
|
|
'PholioImagePHIDType' => 'PhabricatorPHIDType',
|
2013-07-26 01:59:25 +02:00
|
|
|
'PholioImageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-07-19 00:04:08 +02:00
|
|
|
'PholioImageUploadController' => 'PholioController',
|
2013-02-08 16:24:17 +01:00
|
|
|
'PholioInlineController' => 'PholioController',
|
2014-06-15 03:41:45 +02:00
|
|
|
'PholioInlineListController' => 'PholioController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PholioMock' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PholioDAO',
|
|
|
|
'PhabricatorMarkupInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorApplicationTransactionInterface',
|
|
|
|
'PhabricatorProjectInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2015-06-11 00:52:49 +02:00
|
|
|
'PhabricatorSpacesInterface',
|
2015-06-23 19:05:15 +02:00
|
|
|
'PhabricatorMentionableInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
),
|
2015-12-09 21:56:27 +01:00
|
|
|
'PholioMockArchiveController' => 'PholioController',
|
2015-07-06 22:17:33 +02:00
|
|
|
'PholioMockAuthorHeraldField' => 'PholioMockHeraldField',
|
2012-11-22 02:27:20 +01:00
|
|
|
'PholioMockCommentController' => 'PholioController',
|
2015-07-06 22:17:33 +02:00
|
|
|
'PholioMockDescriptionHeraldField' => 'PholioMockHeraldField',
|
2012-11-22 02:23:28 +01:00
|
|
|
'PholioMockEditController' => 'PholioController',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PholioMockEditor' => 'PhabricatorApplicationTransactionEditor',
|
2013-03-07 17:23:40 +01:00
|
|
|
'PholioMockEmbedView' => 'AphrontView',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PholioMockFulltextEngine' => 'PhabricatorFulltextEngine',
|
2015-01-02 00:11:41 +01:00
|
|
|
'PholioMockHasTaskEdgeType' => 'PhabricatorEdgeType',
|
2015-07-06 22:17:33 +02:00
|
|
|
'PholioMockHeraldField' => 'HeraldField',
|
2015-07-16 23:13:13 +02:00
|
|
|
'PholioMockHeraldFieldGroup' => 'HeraldFieldGroup',
|
2013-01-20 18:29:34 +01:00
|
|
|
'PholioMockImagesView' => 'AphrontView',
|
2014-05-09 21:25:52 +02:00
|
|
|
'PholioMockListController' => 'PholioController',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PholioMockMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2015-07-06 22:17:33 +02:00
|
|
|
'PholioMockNameHeraldField' => 'PholioMockHeraldField',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PholioMockPHIDType' => 'PhabricatorPHIDType',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioMockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-07-22 21:21:15 +02:00
|
|
|
'PholioMockSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-06-15 06:12:19 +02:00
|
|
|
'PholioMockThumbGridView' => 'AphrontView',
|
Add very basic scaffolding for Pholio
Summary:
I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc.
Basic hierarchy is:
- **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas".
- **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed.
- **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits.
- **PixelComment**: Equivalent of an inline comment.
Test Plan: Created a fake object and viewed it.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran, davidreuss
Maniphest Tasks: T2097
Differential Revision: https://secure.phabricator.com/D3817
2012-11-22 02:22:36 +01:00
|
|
|
'PholioMockViewController' => 'PholioController',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PholioRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-04-01 17:39:50 +02:00
|
|
|
'PholioReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2014-10-01 16:52:26 +02:00
|
|
|
'PholioSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PholioTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PholioTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2012-12-11 23:00:21 +01:00
|
|
|
'PholioTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-03-10 04:23:50 +01:00
|
|
|
'PholioTransactionView' => 'PhabricatorApplicationTransactionView',
|
2013-07-19 00:04:08 +02:00
|
|
|
'PholioUploadedImageView' => 'AphrontView',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhortuneAccount' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhortuneDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
),
|
2014-10-10 01:59:03 +02:00
|
|
|
'PhortuneAccountEditController' => 'PhortuneController',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneAccountEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-10-11 00:00:06 +02:00
|
|
|
'PhortuneAccountHasMemberEdgeType' => 'PhabricatorEdgeType',
|
2014-10-10 01:59:03 +02:00
|
|
|
'PhortuneAccountListController' => 'PhortuneController',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortuneAccountPHIDType' => 'PhabricatorPHIDType',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneAccountQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhortuneAccountTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhortuneAccountTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PhortuneAccountViewController' => 'PhortuneController',
|
2015-04-20 19:05:22 +02:00
|
|
|
'PhortuneAdHocCart' => 'PhortuneCartImplementation',
|
|
|
|
'PhortuneAdHocProduct' => 'PhortuneProductImplementation',
|
2014-07-23 19:34:08 +02:00
|
|
|
'PhortuneCart' => array(
|
|
|
|
'PhortuneDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-23 19:34:08 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2014-10-10 20:29:13 +02:00
|
|
|
'PhortuneCartAcceptController' => 'PhortuneCartController',
|
2014-10-09 00:33:25 +02:00
|
|
|
'PhortuneCartCancelController' => 'PhortuneCartController',
|
2014-07-23 19:36:25 +02:00
|
|
|
'PhortuneCartCheckoutController' => 'PhortuneCartController',
|
|
|
|
'PhortuneCartController' => 'PhortuneController',
|
2014-10-13 20:16:27 +02:00
|
|
|
'PhortuneCartEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhortuneCartImplementation' => 'Phobject',
|
2014-10-08 23:40:02 +02:00
|
|
|
'PhortuneCartListController' => 'PhortuneController',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortuneCartPHIDType' => 'PhabricatorPHIDType',
|
2014-07-23 19:34:08 +02:00
|
|
|
'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-04-01 17:39:50 +02:00
|
|
|
'PhortuneCartReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2014-10-08 23:40:02 +02:00
|
|
|
'PhortuneCartSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-10-13 20:16:27 +02:00
|
|
|
'PhortuneCartTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhortuneCartTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2014-10-09 13:30:47 +02:00
|
|
|
'PhortuneCartUpdateController' => 'PhortuneCartController',
|
2014-07-23 19:36:25 +02:00
|
|
|
'PhortuneCartViewController' => 'PhortuneCartController',
|
2014-07-23 19:36:12 +02:00
|
|
|
'PhortuneCharge' => array(
|
|
|
|
'PhortuneDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2014-10-13 20:14:50 +02:00
|
|
|
'PhortuneChargeListController' => 'PhortuneController',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortuneChargePHIDType' => 'PhabricatorPHIDType',
|
2014-07-23 19:36:12 +02:00
|
|
|
'PhortuneChargeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-10-13 20:14:50 +02:00
|
|
|
'PhortuneChargeSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'PhortuneChargeTableView' => 'AphrontView',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhortuneConstants' => 'Phobject',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneController' => 'PhabricatorController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhortuneCreditCardForm' => 'Phobject',
|
2014-07-23 19:36:12 +02:00
|
|
|
'PhortuneCurrency' => 'Phobject',
|
2014-10-06 19:26:48 +02:00
|
|
|
'PhortuneCurrencySerializer' => 'PhabricatorLiskSerializer',
|
2013-05-07 03:04:45 +02:00
|
|
|
'PhortuneCurrencyTestCase' => 'PhabricatorTestCase',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneDAO' => 'PhabricatorLiskDAO',
|
2013-04-25 18:49:32 +02:00
|
|
|
'PhortuneErrCode' => 'PhortuneConstants',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
'PhortuneLandingController' => 'PhortuneController',
|
2014-10-11 00:00:06 +02:00
|
|
|
'PhortuneMemberHasAccountEdgeType' => 'PhabricatorEdgeType',
|
2014-10-13 20:13:50 +02:00
|
|
|
'PhortuneMemberHasMerchantEdgeType' => 'PhabricatorEdgeType',
|
Add Merchants to Phortune
Summary:
Ref T2787. Currently, you add payment providers (Stripe, Paypal, etc) in global configuration.
Generally, this approach is cumbersome, limiting, and often hard for users to figure out. It also doesn't provide a natural way to segment payment receivers or provide web access to administrative payment functions like issuing refunds, canceling orders, etc. I think that stuff definitely needs to be in the web UI, and the rule for access to it can't reasonably just be "all administrators" in a lot of reasonable cases.
The only real advantage is that it prevents an attacker from adjusting settings and pointing something at an account they control. But this attack can be mitigated through notifications, some sort of CLI-only merchant lock, payment accounts being relatively identifiable, etc.
So introduce "merchants", which are basically payable entities. An individual merchant will have attached Paypal, Stripe, etc., accounts, and access rules. When you buy something in an application, the merchant to pay is also specified. They also provide an umbrella for dealing with permissions down the line.
This may get a //little// cumbersome because if there are several merchants your saved card information is not shared across them. I think that will be fine in the normal case (most installs will have only one merchant). Even if it isn't and we leave providers global, I think introducing this is the right call from a web UI / permissions point of view. I'll play around with it in the next couple of diffs and figure out exactly where the line goes.
Test Plan: Listed, created, edited, viewed merchants.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D10648
2014-10-07 19:55:16 +02:00
|
|
|
'PhortuneMerchant' => array(
|
|
|
|
'PhortuneDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
Add Merchants to Phortune
Summary:
Ref T2787. Currently, you add payment providers (Stripe, Paypal, etc) in global configuration.
Generally, this approach is cumbersome, limiting, and often hard for users to figure out. It also doesn't provide a natural way to segment payment receivers or provide web access to administrative payment functions like issuing refunds, canceling orders, etc. I think that stuff definitely needs to be in the web UI, and the rule for access to it can't reasonably just be "all administrators" in a lot of reasonable cases.
The only real advantage is that it prevents an attacker from adjusting settings and pointing something at an account they control. But this attack can be mitigated through notifications, some sort of CLI-only merchant lock, payment accounts being relatively identifiable, etc.
So introduce "merchants", which are basically payable entities. An individual merchant will have attached Paypal, Stripe, etc., accounts, and access rules. When you buy something in an application, the merchant to pay is also specified. They also provide an umbrella for dealing with permissions down the line.
This may get a //little// cumbersome because if there are several merchants your saved card information is not shared across them. I think that will be fine in the normal case (most installs will have only one merchant). Even if it isn't and we leave providers global, I think introducing this is the right call from a web UI / permissions point of view. I'll play around with it in the next couple of diffs and figure out exactly where the line goes.
Test Plan: Listed, created, edited, viewed merchants.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D10648
2014-10-07 19:55:16 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhortuneMerchantCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'PhortuneMerchantController' => 'PhortuneController',
|
|
|
|
'PhortuneMerchantEditController' => 'PhortuneMerchantController',
|
|
|
|
'PhortuneMerchantEditor' => 'PhabricatorApplicationTransactionEditor',
|
2014-10-13 20:13:50 +02:00
|
|
|
'PhortuneMerchantHasMemberEdgeType' => 'PhabricatorEdgeType',
|
2015-04-20 19:05:22 +02:00
|
|
|
'PhortuneMerchantInvoiceCreateController' => 'PhortuneMerchantController',
|
Add Merchants to Phortune
Summary:
Ref T2787. Currently, you add payment providers (Stripe, Paypal, etc) in global configuration.
Generally, this approach is cumbersome, limiting, and often hard for users to figure out. It also doesn't provide a natural way to segment payment receivers or provide web access to administrative payment functions like issuing refunds, canceling orders, etc. I think that stuff definitely needs to be in the web UI, and the rule for access to it can't reasonably just be "all administrators" in a lot of reasonable cases.
The only real advantage is that it prevents an attacker from adjusting settings and pointing something at an account they control. But this attack can be mitigated through notifications, some sort of CLI-only merchant lock, payment accounts being relatively identifiable, etc.
So introduce "merchants", which are basically payable entities. An individual merchant will have attached Paypal, Stripe, etc., accounts, and access rules. When you buy something in an application, the merchant to pay is also specified. They also provide an umbrella for dealing with permissions down the line.
This may get a //little// cumbersome because if there are several merchants your saved card information is not shared across them. I think that will be fine in the normal case (most installs will have only one merchant). Even if it isn't and we leave providers global, I think introducing this is the right call from a web UI / permissions point of view. I'll play around with it in the next couple of diffs and figure out exactly where the line goes.
Test Plan: Listed, created, edited, viewed merchants.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D10648
2014-10-07 19:55:16 +02:00
|
|
|
'PhortuneMerchantListController' => 'PhortuneMerchantController',
|
|
|
|
'PhortuneMerchantPHIDType' => 'PhabricatorPHIDType',
|
|
|
|
'PhortuneMerchantQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhortuneMerchantSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'PhortuneMerchantTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhortuneMerchantTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PhortuneMerchantViewController' => 'PhortuneMerchantController',
|
2012-04-05 01:09:29 +02:00
|
|
|
'PhortuneMonthYearExpiryControl' => 'AphrontFormControl',
|
2014-10-13 20:14:50 +02:00
|
|
|
'PhortuneOrderTableView' => 'AphrontView',
|
2014-10-07 23:41:41 +02:00
|
|
|
'PhortunePayPalPaymentProvider' => 'PhortunePaymentProvider',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhortunePaymentMethod' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhortuneDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
Phortune v0
Summary:
Ref T2787. This does very little so far, but makes inroads on accounts and billing. This is mostly just modeled on what Stripe looks like. The objects are:
- **Account**: Has one or more authorized users, who can make manage the account. An example might be "Phacility", and the three of us would be able to manage it. A user may be associated with more than one account (e.g., a corporate account and a personal account) but the UI tries to simplify the common case of a single account.
- **Payment Method**: Something we can get sweet sweet money from; for now, a credit card registered with Stripe. Payment methods are associated with an account.
- **Product**: A good (one time charge) or service (recurring charge). This might be "t-shirt" or "enterprise plan" or "hourly support" or whatever else.
- **Purchase**: Represents a user purchasing a Product for an Account, using a Payment Method. e.g., you bought a shirt, or started a plan, or purchased support.
- **Charge**: Actual charges against payment methods. A Purchase can create more than one charge if it's a plan, or if the first charge fails and we re-bill.
This doesn't fully account for stuff like coupons/discounts yet but they should fit into the model without any issues.
This only implements `Account`, and that only partially.
Test Plan: {F37531}
Reviewers: chad, btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2787
Differential Revision: https://secure.phabricator.com/D5435
2013-03-28 17:10:34 +01:00
|
|
|
),
|
2014-08-11 21:07:35 +02:00
|
|
|
'PhortunePaymentMethodCreateController' => 'PhortuneController',
|
|
|
|
'PhortunePaymentMethodDisableController' => 'PhortuneController',
|
2013-03-28 17:11:42 +01:00
|
|
|
'PhortunePaymentMethodEditController' => 'PhortuneController',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortunePaymentMethodPHIDType' => 'PhabricatorPHIDType',
|
2013-03-28 17:11:42 +01:00
|
|
|
'PhortunePaymentMethodQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhortunePaymentProvider' => 'Phobject',
|
2014-10-07 23:41:41 +02:00
|
|
|
'PhortunePaymentProviderConfig' => array(
|
|
|
|
'PhortuneDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhortunePaymentProviderConfigEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhortunePaymentProviderConfigQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhortunePaymentProviderConfigTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhortunePaymentProviderConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PhortunePaymentProviderPHIDType' => 'PhabricatorPHIDType',
|
2015-06-15 10:07:06 +02:00
|
|
|
'PhortunePaymentProviderTestCase' => 'PhabricatorTestCase',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhortuneProduct' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhortuneDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-03-28 17:13:07 +01:00
|
|
|
),
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhortuneProductImplementation' => 'Phobject',
|
2013-03-28 17:13:07 +01:00
|
|
|
'PhortuneProductListController' => 'PhabricatorController',
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortuneProductPHIDType' => 'PhabricatorPHIDType',
|
2013-03-28 17:13:07 +01:00
|
|
|
'PhortuneProductQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-04-25 18:45:07 +02:00
|
|
|
'PhortuneProductViewController' => 'PhortuneController',
|
2014-10-07 23:41:41 +02:00
|
|
|
'PhortuneProviderActionController' => 'PhortuneController',
|
2014-10-08 17:31:24 +02:00
|
|
|
'PhortuneProviderDisableController' => 'PhortuneMerchantController',
|
2014-10-07 23:41:41 +02:00
|
|
|
'PhortuneProviderEditController' => 'PhortuneMerchantController',
|
2014-07-23 19:34:08 +02:00
|
|
|
'PhortunePurchase' => array(
|
|
|
|
'PhortuneDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2014-10-07 01:48:16 +02:00
|
|
|
'PhortunePurchasePHIDType' => 'PhabricatorPHIDType',
|
2014-07-23 19:34:08 +02:00
|
|
|
'PhortunePurchaseQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-10-01 16:52:26 +02:00
|
|
|
'PhortuneSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortuneStripePaymentProvider' => 'PhortunePaymentProvider',
|
2015-01-27 23:50:20 +01:00
|
|
|
'PhortuneSubscription' => array(
|
|
|
|
'PhortuneDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
),
|
2015-01-30 20:52:50 +01:00
|
|
|
'PhortuneSubscriptionCart' => 'PhortuneCartImplementation',
|
2015-02-01 21:31:46 +01:00
|
|
|
'PhortuneSubscriptionEditController' => 'PhortuneController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhortuneSubscriptionImplementation' => 'Phobject',
|
2015-01-27 23:50:20 +01:00
|
|
|
'PhortuneSubscriptionListController' => 'PhortuneController',
|
|
|
|
'PhortuneSubscriptionPHIDType' => 'PhabricatorPHIDType',
|
2015-01-30 20:52:50 +01:00
|
|
|
'PhortuneSubscriptionProduct' => 'PhortuneProductImplementation',
|
2015-01-27 23:50:20 +01:00
|
|
|
'PhortuneSubscriptionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhortuneSubscriptionSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'PhortuneSubscriptionTableView' => 'AphrontView',
|
2015-01-30 20:28:49 +01:00
|
|
|
'PhortuneSubscriptionViewController' => 'PhortuneController',
|
2015-01-30 20:29:05 +01:00
|
|
|
'PhortuneSubscriptionWorker' => 'PhabricatorWorker',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortuneTestPaymentProvider' => 'PhortunePaymentProvider',
|
2013-05-22 00:34:46 +02:00
|
|
|
'PhortuneWePayPaymentProvider' => 'PhortunePaymentProvider',
|
2013-12-07 02:43:49 +01:00
|
|
|
'PhragmentBrowseController' => 'PhragmentController',
|
2014-07-25 00:20:39 +02:00
|
|
|
'PhragmentCanCreateCapability' => 'PhabricatorPolicyCapability',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhragmentConduitAPIMethod' => 'ConduitAPIMethod',
|
2013-12-07 02:43:49 +01:00
|
|
|
'PhragmentController' => 'PhabricatorController',
|
|
|
|
'PhragmentCreateController' => 'PhragmentController',
|
|
|
|
'PhragmentDAO' => 'PhabricatorLiskDAO',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhragmentFragment' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhragmentDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-12-07 02:43:49 +01:00
|
|
|
),
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhragmentFragmentPHIDType' => 'PhabricatorPHIDType',
|
2013-12-07 02:43:49 +01:00
|
|
|
'PhragmentFragmentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhragmentFragmentVersion' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhragmentDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-12-07 02:43:49 +01:00
|
|
|
),
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhragmentFragmentVersionPHIDType' => 'PhabricatorPHIDType',
|
2013-12-07 02:43:49 +01:00
|
|
|
'PhragmentFragmentVersionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhragmentGetPatchConduitAPIMethod' => 'PhragmentConduitAPIMethod',
|
2013-12-07 02:56:55 +01:00
|
|
|
'PhragmentHistoryController' => 'PhragmentController',
|
2013-12-08 02:14:34 +01:00
|
|
|
'PhragmentPatchController' => 'PhragmentController',
|
2013-12-07 02:43:49 +01:00
|
|
|
'PhragmentPatchUtil' => 'Phobject',
|
2013-12-13 04:42:12 +01:00
|
|
|
'PhragmentPolicyController' => 'PhragmentController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhragmentQueryFragmentsConduitAPIMethod' => 'PhragmentConduitAPIMethod',
|
2013-12-08 21:57:53 +01:00
|
|
|
'PhragmentRevertController' => 'PhragmentController',
|
2014-10-01 16:52:26 +02:00
|
|
|
'PhragmentSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhragmentSnapshot' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhragmentDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-12-08 22:24:50 +01:00
|
|
|
),
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhragmentSnapshotChild' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhragmentDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-12-08 22:24:50 +01:00
|
|
|
),
|
|
|
|
'PhragmentSnapshotChildQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhragmentSnapshotCreateController' => 'PhragmentController',
|
|
|
|
'PhragmentSnapshotDeleteController' => 'PhragmentController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhragmentSnapshotPHIDType' => 'PhabricatorPHIDType',
|
2013-12-08 22:24:50 +01:00
|
|
|
'PhragmentSnapshotPromoteController' => 'PhragmentController',
|
|
|
|
'PhragmentSnapshotQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhragmentSnapshotViewController' => 'PhragmentController',
|
2013-12-07 02:56:55 +01:00
|
|
|
'PhragmentUpdateController' => 'PhragmentController',
|
2013-12-08 02:14:34 +01:00
|
|
|
'PhragmentVersionController' => 'PhragmentController',
|
2013-12-07 03:25:22 +01:00
|
|
|
'PhragmentZIPController' => 'PhragmentController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrequentConduitAPIMethod' => 'ConduitAPIMethod',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhrequentController' => 'PhabricatorController',
|
2016-03-11 03:11:12 +01:00
|
|
|
'PhrequentCurtainExtension' => 'PHUICurtainExtension',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhrequentDAO' => 'PhabricatorLiskDAO',
|
2014-05-09 21:25:52 +02:00
|
|
|
'PhrequentListController' => 'PhrequentController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrequentPopConduitAPIMethod' => 'PhrequentConduitAPIMethod',
|
|
|
|
'PhrequentPushConduitAPIMethod' => 'PhrequentConduitAPIMethod',
|
2013-10-01 22:04:47 +02:00
|
|
|
'PhrequentSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-10-18 21:47:36 +02:00
|
|
|
'PhrequentTimeBlock' => 'Phobject',
|
|
|
|
'PhrequentTimeBlockTestCase' => 'PhabricatorTestCase',
|
2014-07-17 02:12:38 +02:00
|
|
|
'PhrequentTimeSlices' => 'Phobject',
|
2013-03-31 13:52:35 +02:00
|
|
|
'PhrequentTrackController' => 'PhrequentController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrequentTrackingConduitAPIMethod' => 'PhrequentConduitAPIMethod',
|
Conduit APIs to start and stop tracking time in phrequent
Summary:
This adds methods to start and stop tracking any arbitrary PHID in phrequent. Currently, this uses copy-pasted code from PhrequentTrackController. I had to do this because the code to start/stop was not abstracted into a common class.
Once the code to start/stop working is extracted into a re-usable class, the conduit API can use this as well.
Test Plan: I called the functions with a PHID of a task and ensured that the fields in the phrequent database table was being updated correctly.
Reviewers: skyronic, #blessed_reviewers, epriestley
Reviewed By: #blessed_reviewers, epriestley
Subscribers: maxhodak, erik.fercak, aran, epriestley, Korvin
Maniphest Tasks: T3569, T3970
Differential Revision: https://secure.phabricator.com/D7326
2014-07-12 03:42:32 +02:00
|
|
|
'PhrequentTrackingEditor' => 'PhabricatorEditor',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhrequentUIEventListener' => 'PhabricatorEventListener',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhrequentUserTime' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhrequentDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
2013-10-01 22:04:47 +02:00
|
|
|
),
|
|
|
|
'PhrequentUserTimeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2011-12-17 18:19:08 +01:00
|
|
|
'PhrictionChangeType' => 'PhrictionConstants',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrictionConduitAPIMethod' => 'ConduitAPIMethod',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PhrictionConstants' => 'Phobject',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhrictionContent' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhrictionDAO',
|
|
|
|
'PhabricatorMarkupInterface',
|
Add a generic multistep Markup cache
Summary:
The immediate issue this addresses is T1366, adding a rendering cache to Phriction. For wiki pages with code blocks especially, rerendering them each time is expensive.
The broader issue is that out markup caches aren't very good right now. They have three major problems:
**Problem 1: the data is stored in the wrong place.** We currently store remarkup caches on objects. This means we're always loading it and passing it around even when we don't need it, can't genericize cache management code (e.g., have one simple script to drop/GC caches), need to update authoritative rows to clear caches, and can't genericize rendering code since each object is different.
To solve this, I created a dedicated cache database that I plan to move all markup caches to use.
**Problem 2: time-variant rules break when cached.** Some rules like `**bold**` are time-invariant and always produce the same output, but some rules like `{Tnnn}` and `@username` are variant and may render differently (because a task was closed or a user is on vacation). Currently, we cache the raw output, so these time-variant rules get locked at whatever values they had when they were first rendered. This is the main reason Phriction doesn't have a cache right now -- I wanted `{Tnnn}` rules to reflect open/closed tasks.
To solve this, I split markup into a "preprocessing" phase (which does all the parsing and evaluates all time-invariant rules) and a "postprocessing" phase (which evaluates time-variant rules only). The preprocessing phase is most of the expense (and, notably, includes syntax highlighting) so this is nearly as good as caching the final output. I did most of the work here in D737 / D738, but we never moved to use it in Phabricator -- we currently just do the two operations serially in all cases.
This diff splits them apart and caches the output of preprocessing only, so we benefit from caching but also get accurate time-variant rendering.
**Problem 3: cache access isn't batched/pipelined optimally.** When we're rendering a list of markup blocks, we should be able to batch datafetching better than we do. D738 helped with this (fetching is batched within a single hunk of markup) and this improves batching on cache access. We could still do better here, but this is at least a step forward.
Also fixes a bug with generating a link in the Phriction history interface ($uri gets clobbered).
I'm using PHP serialization instead of JSON serialization because Remarkup does some stuff with non-ascii characters that might not survive JSON.
Test Plan:
- Created a Phriction document and verified that previews don't go to cache (no rows appear in the cache table).
- Verified that published documents come out of cache.
- Verified that caches generate/regenerate correctly, time-variant rules render properly and old documents hit the right caches.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1366
Differential Revision: https://secure.phabricator.com/D2945
2012-07-10 00:20:56 +02:00
|
|
|
),
|
2012-07-16 20:49:06 +02:00
|
|
|
'PhrictionController' => 'PhabricatorController',
|
2014-11-07 20:46:25 +01:00
|
|
|
'PhrictionCreateConduitAPIMethod' => 'PhrictionConduitAPIMethod',
|
2012-07-16 20:49:06 +02:00
|
|
|
'PhrictionDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhrictionDeleteController' => 'PhrictionController',
|
|
|
|
'PhrictionDiffController' => 'PhrictionController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PhrictionDocument' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhrictionDAO',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorDestructibleInterface',
|
2014-11-12 03:29:36 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2013-01-12 00:28:16 +01:00
|
|
|
),
|
2015-07-06 22:17:50 +02:00
|
|
|
'PhrictionDocumentAuthorHeraldField' => 'PhrictionDocumentHeraldField',
|
|
|
|
'PhrictionDocumentContentHeraldField' => 'PhrictionDocumentHeraldField',
|
2011-07-11 17:54:22 +02:00
|
|
|
'PhrictionDocumentController' => 'PhrictionController',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhrictionDocumentFulltextEngine' => 'PhabricatorFulltextEngine',
|
2014-11-12 03:29:36 +01:00
|
|
|
'PhrictionDocumentHeraldAdapter' => 'HeraldAdapter',
|
2015-07-06 22:17:50 +02:00
|
|
|
'PhrictionDocumentHeraldField' => 'HeraldField',
|
2015-07-16 23:13:13 +02:00
|
|
|
'PhrictionDocumentHeraldFieldGroup' => 'HeraldFieldGroup',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PhrictionDocumentPHIDType' => 'PhabricatorPHIDType',
|
2015-07-06 22:17:50 +02:00
|
|
|
'PhrictionDocumentPathHeraldField' => 'PhrictionDocumentHeraldField',
|
2013-03-08 16:12:24 +01:00
|
|
|
'PhrictionDocumentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2011-12-17 18:19:08 +01:00
|
|
|
'PhrictionDocumentStatus' => 'PhrictionConstants',
|
2015-07-06 22:17:50 +02:00
|
|
|
'PhrictionDocumentTitleHeraldField' => 'PhrictionDocumentHeraldField',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrictionEditConduitAPIMethod' => 'PhrictionConduitAPIMethod',
|
2011-07-11 21:34:53 +02:00
|
|
|
'PhrictionEditController' => 'PhrictionController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrictionHistoryConduitAPIMethod' => 'PhrictionConduitAPIMethod',
|
2011-07-12 00:06:19 +02:00
|
|
|
'PhrictionHistoryController' => 'PhrictionController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'PhrictionInfoConduitAPIMethod' => 'PhrictionConduitAPIMethod',
|
2014-05-09 21:25:52 +02:00
|
|
|
'PhrictionListController' => 'PhrictionController',
|
2016-04-16 04:07:03 +02:00
|
|
|
'PhrictionMarkupPreviewController' => 'PhabricatorController',
|
2013-03-06 22:12:04 +01:00
|
|
|
'PhrictionMoveController' => 'PhrictionController',
|
2012-11-10 00:08:37 +01:00
|
|
|
'PhrictionNewController' => 'PhrictionController',
|
2013-02-26 23:57:41 +01:00
|
|
|
'PhrictionRemarkupRule' => 'PhutilRemarkupRule',
|
2015-04-01 17:39:50 +02:00
|
|
|
'PhrictionReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2014-10-01 16:52:26 +02:00
|
|
|
'PhrictionSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2013-07-28 03:26:42 +02:00
|
|
|
'PhrictionSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-10-30 16:59:21 +01:00
|
|
|
'PhrictionTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhrictionTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'PhrictionTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhrictionTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-01-13 20:46:29 +01:00
|
|
|
'PolicyLockOptionType' => 'PhabricatorConfigJSONOptionType',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderAddAnswerView' => 'AphrontView',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PonderAnswer' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PonderDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorMarkupInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
2014-08-25 20:41:40 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
2012-08-10 19:44:04 +02:00
|
|
|
),
|
2013-07-29 02:40:11 +02:00
|
|
|
'PonderAnswerCommentController' => 'PonderController',
|
2013-07-29 02:23:04 +02:00
|
|
|
'PonderAnswerEditController' => 'PonderController',
|
2013-09-19 00:15:25 +02:00
|
|
|
'PonderAnswerEditor' => 'PonderEditor',
|
2013-07-29 03:32:55 +02:00
|
|
|
'PonderAnswerHistoryController' => 'PonderController',
|
2015-08-17 19:22:54 +02:00
|
|
|
'PonderAnswerMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PonderAnswerPHIDType' => 'PhabricatorPHIDType',
|
2013-07-26 22:19:49 +02:00
|
|
|
'PonderAnswerQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-08-17 19:22:54 +02:00
|
|
|
'PonderAnswerReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderAnswerSaveController' => 'PonderController',
|
2015-08-14 18:25:02 +02:00
|
|
|
'PonderAnswerStatus' => 'PonderConstants',
|
2013-07-26 22:52:57 +02:00
|
|
|
'PonderAnswerTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PonderAnswerTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2013-07-29 01:17:51 +02:00
|
|
|
'PonderAnswerTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-08-11 19:42:40 +02:00
|
|
|
'PonderAnswerView' => 'AphrontTagView',
|
2015-06-15 10:02:26 +02:00
|
|
|
'PonderConstants' => 'Phobject',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderController' => 'PhabricatorController',
|
|
|
|
'PonderDAO' => 'PhabricatorLiskDAO',
|
2015-08-08 21:20:01 +02:00
|
|
|
'PonderDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2013-09-19 00:15:25 +02:00
|
|
|
'PonderEditor' => 'PhabricatorApplicationTransactionEditor',
|
2015-08-11 19:42:40 +02:00
|
|
|
'PonderFooterView' => 'AphrontTagView',
|
2015-08-08 21:20:01 +02:00
|
|
|
'PonderModerateCapability' => 'PhabricatorPolicyCapability',
|
2014-07-17 23:48:54 +02:00
|
|
|
'PonderQuestion' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PonderDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorMarkupInterface',
|
|
|
|
'PhabricatorSubscribableInterface',
|
|
|
|
'PhabricatorFlaggableInterface',
|
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorTokenReceiverInterface',
|
|
|
|
'PhabricatorProjectInterface',
|
2014-08-25 20:41:40 +02:00
|
|
|
'PhabricatorDestructibleInterface',
|
2015-08-05 18:38:14 +02:00
|
|
|
'PhabricatorSpacesInterface',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PhabricatorFulltextInterface',
|
2012-08-10 19:44:04 +02:00
|
|
|
),
|
2013-07-29 02:58:34 +02:00
|
|
|
'PonderQuestionCommentController' => 'PonderController',
|
2013-07-29 00:02:18 +02:00
|
|
|
'PonderQuestionEditController' => 'PonderController',
|
2013-09-19 00:15:25 +02:00
|
|
|
'PonderQuestionEditor' => 'PonderEditor',
|
2015-12-21 18:02:55 +01:00
|
|
|
'PonderQuestionFulltextEngine' => 'PhabricatorFulltextEngine',
|
2013-07-29 03:32:55 +02:00
|
|
|
'PonderQuestionHistoryController' => 'PonderController',
|
2014-05-09 21:25:52 +02:00
|
|
|
'PonderQuestionListController' => 'PonderController',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PonderQuestionMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2014-07-24 00:05:46 +02:00
|
|
|
'PonderQuestionPHIDType' => 'PhabricatorPHIDType',
|
upgrade diffusion to use modern header UI and fix a few quirks
Summary:
upgrades are CrumbsView, HeaderView, PropertyListView, and ActionListView. I had to modify CrumbsView stuff a bit to handle the "advanced" diffusion crumbs.
Quirks fixed include making file tree view show up in diffusion, the page not have extra space when the file tree is hidden, links no longer breaking once you visit files (since without the change the files always got "/" appended and thus 404'd), and a differential quirk where it read "next step:" and that colon is a no no,
Test Plan: played around in diffusion and differential
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin, chad
Maniphest Tasks: T2048, T2178
Differential Revision: https://secure.phabricator.com/D4169
2012-12-13 02:50:42 +01:00
|
|
|
'PonderQuestionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-04-01 17:39:50 +02:00
|
|
|
'PonderQuestionReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2013-07-18 21:40:51 +02:00
|
|
|
'PonderQuestionSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-07-28 03:37:17 +02:00
|
|
|
'PonderQuestionStatus' => 'PonderConstants',
|
|
|
|
'PonderQuestionStatusController' => 'PonderController',
|
2013-07-26 22:52:57 +02:00
|
|
|
'PonderQuestionTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PonderQuestionTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2013-07-29 00:02:18 +02:00
|
|
|
'PonderQuestionTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderQuestionViewController' => 'PonderController',
|
2014-08-04 16:55:43 +02:00
|
|
|
'PonderRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2014-10-01 16:37:14 +02:00
|
|
|
'PonderSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
2015-04-01 18:40:12 +02:00
|
|
|
'ProjectAddProjectsEmailCommand' => 'MetaMTAEmailTransactionCommand',
|
2015-06-15 10:02:26 +02:00
|
|
|
'ProjectBoardTaskCard' => 'Phobject',
|
2014-09-18 20:00:50 +02:00
|
|
|
'ProjectCanLockProjectsCapability' => 'PhabricatorPolicyCapability',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ProjectConduitAPIMethod' => 'ConduitAPIMethod',
|
2014-08-05 22:40:41 +02:00
|
|
|
'ProjectCreateConduitAPIMethod' => 'ProjectConduitAPIMethod',
|
2014-07-25 00:20:39 +02:00
|
|
|
'ProjectCreateProjectsCapability' => 'PhabricatorPolicyCapability',
|
2014-11-21 20:22:17 +01:00
|
|
|
'ProjectDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'ProjectDefaultJoinCapability' => 'PhabricatorPolicyCapability',
|
|
|
|
'ProjectDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
2015-12-27 15:45:53 +01:00
|
|
|
'ProjectEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ProjectQueryConduitAPIMethod' => 'ProjectConduitAPIMethod',
|
2014-08-04 16:55:43 +02:00
|
|
|
'ProjectRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2014-10-29 16:13:38 +01:00
|
|
|
'ProjectRemarkupRuleTestCase' => 'PhabricatorTestCase',
|
2015-05-16 01:33:31 +02:00
|
|
|
'ProjectReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2015-12-27 11:44:07 +01:00
|
|
|
'ProjectSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
2012-07-26 21:01:47 +02:00
|
|
|
'QueryFormattingTestCase' => 'PhabricatorTestCase',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephAuthorFieldSpecification' => 'ReleephFieldSpecification',
|
2014-07-17 23:48:54 +02:00
|
|
|
'ReleephBranch' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'ReleephDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
2013-07-21 18:27:00 +02:00
|
|
|
),
|
2014-04-13 01:53:51 +02:00
|
|
|
'ReleephBranchAccessController' => 'ReleephBranchController',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephBranchCommitFieldSpecification' => 'ReleephFieldSpecification',
|
2014-04-13 01:53:51 +02:00
|
|
|
'ReleephBranchController' => 'ReleephController',
|
|
|
|
'ReleephBranchCreateController' => 'ReleephProductController',
|
|
|
|
'ReleephBranchEditController' => 'ReleephBranchController',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephBranchEditor' => 'PhabricatorEditor',
|
2014-04-13 01:53:51 +02:00
|
|
|
'ReleephBranchHistoryController' => 'ReleephBranchController',
|
2013-07-21 17:44:53 +02:00
|
|
|
'ReleephBranchNamePreviewController' => 'ReleephController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'ReleephBranchPHIDType' => 'PhabricatorPHIDType',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephBranchPreviewView' => 'AphrontFormControl',
|
2013-07-21 18:27:00 +02:00
|
|
|
'ReleephBranchQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-08-17 03:55:35 +02:00
|
|
|
'ReleephBranchSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-06-15 10:02:26 +02:00
|
|
|
'ReleephBranchTemplate' => 'Phobject',
|
2013-08-20 18:31:27 +02:00
|
|
|
'ReleephBranchTransaction' => 'PhabricatorApplicationTransaction',
|
2013-08-20 19:11:52 +02:00
|
|
|
'ReleephBranchTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-07-08 17:10:58 +02:00
|
|
|
'ReleephBranchViewController' => 'ReleephBranchController',
|
2015-06-15 10:02:26 +02:00
|
|
|
'ReleephCommitFinder' => 'Phobject',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephCommitFinderException' => 'Exception',
|
|
|
|
'ReleephCommitMessageFieldSpecification' => 'ReleephFieldSpecification',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephConduitAPIMethod' => 'ConduitAPIMethod',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephController' => 'PhabricatorController',
|
|
|
|
'ReleephDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'ReleephDefaultFieldSelector' => 'ReleephFieldSelector',
|
2014-01-14 03:18:26 +01:00
|
|
|
'ReleephDependsOnFieldSpecification' => 'ReleephFieldSpecification',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephDiffChurnFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephDiffMessageFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephDiffSizeFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephFieldParseException' => 'Exception',
|
2015-06-15 10:02:26 +02:00
|
|
|
'ReleephFieldSelector' => 'Phobject',
|
2014-07-17 23:48:54 +02:00
|
|
|
'ReleephFieldSpecification' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorCustomField',
|
|
|
|
'PhabricatorMarkupInterface',
|
2013-08-14 17:58:54 +02:00
|
|
|
),
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephGetBranchesConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephIntentFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephLevelFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephOriginalCommitFieldSpecification' => 'ReleephFieldSpecification',
|
2014-03-29 17:14:44 +01:00
|
|
|
'ReleephProductActionController' => 'ReleephProductController',
|
|
|
|
'ReleephProductController' => 'ReleephController',
|
2014-04-14 21:06:56 +02:00
|
|
|
'ReleephProductCreateController' => 'ReleephProductController',
|
2014-03-29 17:16:40 +01:00
|
|
|
'ReleephProductEditController' => 'ReleephProductController',
|
2014-03-29 17:16:02 +01:00
|
|
|
'ReleephProductEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'ReleephProductHistoryController' => 'ReleephProductController',
|
2014-05-09 21:28:02 +02:00
|
|
|
'ReleephProductListController' => 'ReleephController',
|
2014-07-24 00:05:46 +02:00
|
|
|
'ReleephProductPHIDType' => 'PhabricatorPHIDType',
|
2014-04-20 20:51:02 +02:00
|
|
|
'ReleephProductQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2014-03-29 17:16:24 +01:00
|
|
|
'ReleephProductSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2014-03-29 17:15:09 +01:00
|
|
|
'ReleephProductTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'ReleephProductTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2015-07-08 17:10:58 +02:00
|
|
|
'ReleephProductViewController' => 'ReleephProductController',
|
2014-07-17 23:48:54 +02:00
|
|
|
'ReleephProject' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'ReleephDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
2013-03-22 14:29:37 +01:00
|
|
|
),
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephQueryBranchesConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
|
|
|
'ReleephQueryProductsConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
|
|
|
'ReleephQueryRequestsConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephReasonFieldSpecification' => 'ReleephFieldSpecification',
|
2014-07-17 23:48:54 +02:00
|
|
|
'ReleephRequest' => array(
|
2014-07-21 15:59:22 +02:00
|
|
|
'ReleephDAO',
|
Transactions - deploy buildTransactionTimeline to remaining applications
Summary:
Ref T4712. Specifically...
- Differential
- needed getApplicationTransactionViewObject() implemented
- Audit
- needed getApplicationTransactionViewObject() implemented
- Repository
- one object needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true)
- Ponder
- BONUS BUG FIX - leaving a comment on an answer had a bad redirect URI
- both PonderQuestion and PonderAnswer needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on both "history" controllers
- left a "TODO" on buildAnswers on the question view controller, which is non-standard and should be re-written eventually
- Phortune
- BONUS BUG FIX - fix new user "createNewAccount" code to not fatal
- PhortuneAccount, PhortuneMerchant, and PhortuneCart needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) on Account view, merchant view, and cart view controller
- Fund
- Legalpad
- Nuance
- NuanceSource needed PhabricatorApplicationTransactionInterface implemented
- Releeph (this product is kind of a mess...)
- HACKQUEST - had to manually create an arcanist project to even be able to make a "product" and get started...!
- BONUS BUG FIX - make sure to "setName" on product edit
- ReleephProject (should be ReleepProduct...?), ReleephBranch, and ReleepRequest needed PhabricatorApplicationTransactionInterface implemented
- Harbormaster
- HarbormasterBuildable, HarbormasterBuild, HarbormasterBuildPlan, and HarbormasterBuildStep all needed PhabricatorApplicationTransactionInterface implemented
- setShouldTerminate(true) all over the place
Test Plan: foreach application, viewed the timeline(s) and made sure they still rendered
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T4712
Differential Revision: https://secure.phabricator.com/D10925
2014-12-04 00:35:47 +01:00
|
|
|
'PhabricatorApplicationTransactionInterface',
|
2014-07-21 15:59:22 +02:00
|
|
|
'PhabricatorPolicyInterface',
|
|
|
|
'PhabricatorCustomFieldInterface',
|
2013-04-26 18:07:38 +02:00
|
|
|
),
|
2014-04-14 21:06:56 +02:00
|
|
|
'ReleephRequestActionController' => 'ReleephRequestController',
|
|
|
|
'ReleephRequestCommentController' => 'ReleephRequestController',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephRequestConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
2014-04-14 21:06:56 +02:00
|
|
|
'ReleephRequestController' => 'ReleephController',
|
|
|
|
'ReleephRequestDifferentialCreateController' => 'ReleephController',
|
|
|
|
'ReleephRequestEditController' => 'ReleephBranchController',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ReleephRequestMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2014-07-24 00:05:46 +02:00
|
|
|
'ReleephRequestPHIDType' => 'PhabricatorPHIDType',
|
2013-05-15 00:04:17 +02:00
|
|
|
'ReleephRequestQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2015-04-01 17:39:50 +02:00
|
|
|
'ReleephRequestReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
2013-08-15 00:38:52 +02:00
|
|
|
'ReleephRequestSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2015-06-15 10:02:26 +02:00
|
|
|
'ReleephRequestStatus' => 'Phobject',
|
2013-04-08 17:34:21 +02:00
|
|
|
'ReleephRequestTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'ReleephRequestTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'ReleephRequestTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'ReleephRequestTransactionalEditor' => 'PhabricatorApplicationTransactionEditor',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephRequestTypeaheadControl' => 'AphrontFormControl',
|
|
|
|
'ReleephRequestTypeaheadController' => 'PhabricatorTypeaheadDatasourceController',
|
2014-04-18 15:44:45 +02:00
|
|
|
'ReleephRequestView' => 'AphrontView',
|
2014-04-14 21:06:56 +02:00
|
|
|
'ReleephRequestViewController' => 'ReleephBranchController',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephRequestorFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephRevisionFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephSeverityFieldSpecification' => 'ReleephLevelFieldSpecification',
|
|
|
|
'ReleephSummaryFieldSpecification' => 'ReleephFieldSpecification',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'ReleephWorkCanPushConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
|
|
|
'ReleephWorkGetAuthorInfoConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
|
|
|
'ReleephWorkGetBranchCommitMessageConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
|
|
|
'ReleephWorkGetBranchConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
|
|
|
'ReleephWorkGetCommitMessageConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
|
|
|
'ReleephWorkNextRequestConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
|
|
|
'ReleephWorkRecordConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
|
|
|
'ReleephWorkRecordPickStatusConduitAPIMethod' => 'ReleephConduitAPIMethod',
|
|
|
|
'RemarkupProcessConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'RepositoryConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'RepositoryQueryConduitAPIMethod' => 'RepositoryConduitAPIMethod',
|
2013-11-09 03:09:03 +01:00
|
|
|
'ShellLogView' => 'AphrontView',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'SlowvoteConduitAPIMethod' => 'ConduitAPIMethod',
|
2013-04-16 17:18:52 +02:00
|
|
|
'SlowvoteEmbedView' => 'AphrontView',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'SlowvoteInfoConduitAPIMethod' => 'SlowvoteConduitAPIMethod',
|
2014-08-04 16:55:43 +02:00
|
|
|
'SlowvoteRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
2015-06-15 10:02:26 +02:00
|
|
|
'SubscriptionListDialogBuilder' => 'Phobject',
|
|
|
|
'SubscriptionListStringBuilder' => 'Phobject',
|
Rename Conduit classes
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method.
Test Plan:
```
> echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami
Waiting for JSON parameters on stdin...
{"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}}
```
Reviewers: epriestley, #blessed_reviewers
Reviewed By: epriestley, #blessed_reviewers
Subscribers: epriestley, Korvin, hach-que
Maniphest Tasks: T5655
Differential Revision: https://secure.phabricator.com/D9991
2014-07-25 02:54:15 +02:00
|
|
|
'TokenConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'TokenGiveConduitAPIMethod' => 'TokenConduitAPIMethod',
|
|
|
|
'TokenGivenConduitAPIMethod' => 'TokenConduitAPIMethod',
|
|
|
|
'TokenQueryConduitAPIMethod' => 'TokenConduitAPIMethod',
|
|
|
|
'UserConduitAPIMethod' => 'ConduitAPIMethod',
|
|
|
|
'UserDisableConduitAPIMethod' => 'UserConduitAPIMethod',
|
|
|
|
'UserEnableConduitAPIMethod' => 'UserConduitAPIMethod',
|
|
|
|
'UserFindConduitAPIMethod' => 'UserConduitAPIMethod',
|
|
|
|
'UserQueryConduitAPIMethod' => 'UserConduitAPIMethod',
|
|
|
|
'UserWhoAmIConduitAPIMethod' => 'UserConduitAPIMethod',
|
2011-01-16 22:51:39 +01:00
|
|
|
),
|
|
|
|
));
|