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.
|
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,
|
2011-01-16 22:51:39 +01:00
|
|
|
'class' =>
|
|
|
|
array(
|
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',
|
2013-07-16 22:31:20 +02:00
|
|
|
'AphrontAbstractAttachedFileView' => 'view/control/AphrontAbstractAttachedFileView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontCSRFException' => 'aphront/exception/AphrontCSRFException.php',
|
|
|
|
'AphrontCalendarEventView' => 'applications/calendar/view/AphrontCalendarEventView.php',
|
|
|
|
'AphrontCalendarMonthView' => 'applications/calendar/view/AphrontCalendarMonthView.php',
|
|
|
|
'AphrontContextBarView' => 'view/layout/AphrontContextBarView.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',
|
|
|
|
'AphrontErrorView' => 'view/form/AphrontErrorView.php',
|
|
|
|
'AphrontException' => 'aphront/exception/AphrontException.php',
|
|
|
|
'AphrontFileResponse' => 'aphront/response/AphrontFileResponse.php',
|
|
|
|
'AphrontFormCheckboxControl' => 'view/form/control/AphrontFormCheckboxControl.php',
|
|
|
|
'AphrontFormControl' => 'view/form/control/AphrontFormControl.php',
|
2013-02-06 23:03:52 +01:00
|
|
|
'AphrontFormCropControl' => 'view/form/control/AphrontFormCropControl.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontFormDateControl' => 'view/form/control/AphrontFormDateControl.php',
|
|
|
|
'AphrontFormDividerControl' => 'view/form/control/AphrontFormDividerControl.php',
|
|
|
|
'AphrontFormFileControl' => 'view/form/control/AphrontFormFileControl.php',
|
2012-06-26 17:14:15 +02:00
|
|
|
'AphrontFormImageControl' => 'view/form/control/AphrontFormImageControl.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontFormInsetView' => 'view/form/AphrontFormInsetView.php',
|
|
|
|
'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',
|
|
|
|
'AphrontFormToggleButtonsControl' => 'view/form/control/AphrontFormToggleButtonsControl.php',
|
|
|
|
'AphrontFormTokenizerControl' => 'view/form/control/AphrontFormTokenizerControl.php',
|
|
|
|
'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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontHTTPSink' => 'aphront/sink/AphrontHTTPSink.php',
|
|
|
|
'AphrontHTTPSinkTestCase' => 'aphront/sink/__tests__/AphrontHTTPSinkTestCase.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',
|
|
|
|
'AphrontMiniPanelView' => 'view/layout/AphrontMiniPanelView.php',
|
|
|
|
'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',
|
2013-03-08 02:23:30 +01:00
|
|
|
'AphrontNoteView' => 'view/widget/AphrontNoteView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontNullView' => 'view/AphrontNullView.php',
|
|
|
|
'AphrontPHPHTTPSink' => 'aphront/sink/AphrontPHPHTTPSink.php',
|
|
|
|
'AphrontPageView' => 'view/page/AphrontPageView.php',
|
|
|
|
'AphrontPagerView' => 'view/control/AphrontPagerView.php',
|
|
|
|
'AphrontPanelView' => 'view/layout/AphrontPanelView.php',
|
|
|
|
'AphrontPlainTextResponse' => 'aphront/response/AphrontPlainTextResponse.php',
|
2013-03-05 17:46:09 +01:00
|
|
|
'AphrontProgressBarView' => 'view/widget/bars/AphrontProgressBarView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontProxyResponse' => 'aphront/response/AphrontProxyResponse.php',
|
|
|
|
'AphrontRedirectResponse' => 'aphront/response/AphrontRedirectResponse.php',
|
|
|
|
'AphrontReloadResponse' => 'aphront/response/AphrontReloadResponse.php',
|
|
|
|
'AphrontRequest' => 'aphront/AphrontRequest.php',
|
|
|
|
'AphrontRequestFailureView' => 'view/page/AphrontRequestFailureView.php',
|
|
|
|
'AphrontRequestTestCase' => 'aphront/__tests__/AphrontRequestTestCase.php',
|
|
|
|
'AphrontResponse' => 'aphront/response/AphrontResponse.php',
|
|
|
|
'AphrontSideNavFilterView' => 'view/layout/AphrontSideNavFilterView.php',
|
|
|
|
'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',
|
2013-03-11 03:20:01 +01:00
|
|
|
'AphrontTwoColumnView' => 'view/layout/AphrontTwoColumnView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'AphrontTypeaheadTemplateView' => 'view/control/AphrontTypeaheadTemplateView.php',
|
|
|
|
'AphrontURIMapper' => 'aphront/AphrontURIMapper.php',
|
|
|
|
'AphrontUsageException' => 'aphront/exception/AphrontUsageException.php',
|
|
|
|
'AphrontView' => 'view/AphrontView.php',
|
|
|
|
'AphrontWebpageResponse' => 'aphront/response/AphrontWebpageResponse.php',
|
2013-10-22 02:00:21 +02:00
|
|
|
'AuditActionMenuEventListener' => 'applications/audit/events/AuditActionMenuEventListener.php',
|
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
|
|
|
'BuildStepImplementation' => 'applications/harbormaster/step/BuildStepImplementation.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'CelerityAPI' => 'infrastructure/celerity/CelerityAPI.php',
|
2012-10-17 17:37:05 +02:00
|
|
|
'CelerityPhabricatorResourceController' => 'infrastructure/celerity/CelerityPhabricatorResourceController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'CelerityResourceController' => 'infrastructure/celerity/CelerityResourceController.php',
|
|
|
|
'CelerityResourceGraph' => 'infrastructure/celerity/CelerityResourceGraph.php',
|
|
|
|
'CelerityResourceMap' => 'infrastructure/celerity/CelerityResourceMap.php',
|
|
|
|
'CelerityResourceTransformer' => 'infrastructure/celerity/CelerityResourceTransformer.php',
|
|
|
|
'CelerityResourceTransformerTestCase' => 'infrastructure/celerity/__tests__/CelerityResourceTransformerTestCase.php',
|
2012-11-24 01:19:06 +01:00
|
|
|
'CeleritySpriteGenerator' => 'infrastructure/celerity/CeleritySpriteGenerator.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'CelerityStaticResourceResponse' => 'infrastructure/celerity/CelerityStaticResourceResponse.php',
|
|
|
|
'ConduitAPIMethod' => 'applications/conduit/method/ConduitAPIMethod.php',
|
|
|
|
'ConduitAPIRequest' => 'applications/conduit/protocol/ConduitAPIRequest.php',
|
|
|
|
'ConduitAPIResponse' => 'applications/conduit/protocol/ConduitAPIResponse.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_arcanist_Method' => 'applications/arcanist/conduit/ConduitAPI_arcanist_Method.php',
|
|
|
|
'ConduitAPI_arcanist_projectinfo_Method' => 'applications/arcanist/conduit/ConduitAPI_arcanist_projectinfo_Method.php',
|
|
|
|
'ConduitAPI_audit_Method' => 'applications/audit/conduit/ConduitAPI_audit_Method.php',
|
|
|
|
'ConduitAPI_audit_query_Method' => 'applications/audit/conduit/ConduitAPI_audit_query_Method.php',
|
|
|
|
'ConduitAPI_chatlog_Method' => 'applications/chatlog/conduit/ConduitAPI_chatlog_Method.php',
|
|
|
|
'ConduitAPI_chatlog_query_Method' => 'applications/chatlog/conduit/ConduitAPI_chatlog_query_Method.php',
|
|
|
|
'ConduitAPI_chatlog_record_Method' => 'applications/chatlog/conduit/ConduitAPI_chatlog_record_Method.php',
|
|
|
|
'ConduitAPI_conduit_connect_Method' => 'applications/conduit/method/ConduitAPI_conduit_connect_Method.php',
|
|
|
|
'ConduitAPI_conduit_getcertificate_Method' => 'applications/conduit/method/ConduitAPI_conduit_getcertificate_Method.php',
|
|
|
|
'ConduitAPI_conduit_ping_Method' => 'applications/conduit/method/ConduitAPI_conduit_ping_Method.php',
|
2013-01-20 01:37:06 +01:00
|
|
|
'ConduitAPI_conduit_query_Method' => 'applications/conduit/method/ConduitAPI_conduit_query_Method.php',
|
2013-05-31 01:37:51 +02:00
|
|
|
'ConduitAPI_conpherence_Method' => 'applications/conpherence/conduit/ConduitAPI_conpherence_Method.php',
|
|
|
|
'ConduitAPI_conpherence_createthread_Method' => 'applications/conpherence/conduit/ConduitAPI_conpherence_createthread_Method.php',
|
2013-05-31 19:43:46 +02:00
|
|
|
'ConduitAPI_conpherence_querythread_Method' => 'applications/conpherence/conduit/ConduitAPI_conpherence_querythread_Method.php',
|
2013-05-31 20:27:49 +02:00
|
|
|
'ConduitAPI_conpherence_querytransaction_Method' => 'applications/conpherence/conduit/ConduitAPI_conpherence_querytransaction_Method.php',
|
2013-05-31 23:58:02 +02:00
|
|
|
'ConduitAPI_conpherence_updatethread_Method' => 'applications/conpherence/conduit/ConduitAPI_conpherence_updatethread_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_differential_Method' => 'applications/differential/conduit/ConduitAPI_differential_Method.php',
|
|
|
|
'ConduitAPI_differential_close_Method' => 'applications/differential/conduit/ConduitAPI_differential_close_Method.php',
|
|
|
|
'ConduitAPI_differential_createcomment_Method' => 'applications/differential/conduit/ConduitAPI_differential_createcomment_Method.php',
|
|
|
|
'ConduitAPI_differential_creatediff_Method' => 'applications/differential/conduit/ConduitAPI_differential_creatediff_Method.php',
|
|
|
|
'ConduitAPI_differential_createinline_Method' => 'applications/differential/conduit/ConduitAPI_differential_createinline_Method.php',
|
|
|
|
'ConduitAPI_differential_createrawdiff_Method' => 'applications/differential/conduit/ConduitAPI_differential_createrawdiff_Method.php',
|
|
|
|
'ConduitAPI_differential_createrevision_Method' => 'applications/differential/conduit/ConduitAPI_differential_createrevision_Method.php',
|
|
|
|
'ConduitAPI_differential_find_Method' => 'applications/differential/conduit/ConduitAPI_differential_find_Method.php',
|
|
|
|
'ConduitAPI_differential_finishpostponedlinters_Method' => 'applications/differential/conduit/ConduitAPI_differential_finishpostponedlinters_Method.php',
|
|
|
|
'ConduitAPI_differential_getalldiffs_Method' => 'applications/differential/conduit/ConduitAPI_differential_getalldiffs_Method.php',
|
|
|
|
'ConduitAPI_differential_getcommitmessage_Method' => 'applications/differential/conduit/ConduitAPI_differential_getcommitmessage_Method.php',
|
|
|
|
'ConduitAPI_differential_getcommitpaths_Method' => 'applications/differential/conduit/ConduitAPI_differential_getcommitpaths_Method.php',
|
|
|
|
'ConduitAPI_differential_getdiff_Method' => 'applications/differential/conduit/ConduitAPI_differential_getdiff_Method.php',
|
2013-10-03 02:03:53 +02:00
|
|
|
'ConduitAPI_differential_getrawdiff_Method' => 'applications/differential/conduit/ConduitAPI_differential_getrawdiff_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_differential_getrevision_Method' => 'applications/differential/conduit/ConduitAPI_differential_getrevision_Method.php',
|
|
|
|
'ConduitAPI_differential_getrevisioncomments_Method' => 'applications/differential/conduit/ConduitAPI_differential_getrevisioncomments_Method.php',
|
|
|
|
'ConduitAPI_differential_markcommitted_Method' => 'applications/differential/conduit/ConduitAPI_differential_markcommitted_Method.php',
|
|
|
|
'ConduitAPI_differential_parsecommitmessage_Method' => 'applications/differential/conduit/ConduitAPI_differential_parsecommitmessage_Method.php',
|
|
|
|
'ConduitAPI_differential_query_Method' => 'applications/differential/conduit/ConduitAPI_differential_query_Method.php',
|
2013-09-17 22:55:41 +02:00
|
|
|
'ConduitAPI_differential_querydiffs_Method' => 'applications/differential/conduit/ConduitAPI_differential_querydiffs_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_differential_setdiffproperty_Method' => 'applications/differential/conduit/ConduitAPI_differential_setdiffproperty_Method.php',
|
|
|
|
'ConduitAPI_differential_updaterevision_Method' => 'applications/differential/conduit/ConduitAPI_differential_updaterevision_Method.php',
|
|
|
|
'ConduitAPI_differential_updateunitresults_Method' => 'applications/differential/conduit/ConduitAPI_differential_updateunitresults_Method.php',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_diffusion_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_Method.php',
|
2013-05-01 23:44:28 +02:00
|
|
|
'ConduitAPI_diffusion_abstractquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_abstractquery_Method.php',
|
2013-05-01 23:56:36 +02:00
|
|
|
'ConduitAPI_diffusion_branchquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_branchquery_Method.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
|
|
|
'ConduitAPI_diffusion_browsequery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_browsequery_Method.php',
|
2013-05-18 01:54:10 +02:00
|
|
|
'ConduitAPI_diffusion_commitbranchesquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_commitbranchesquery_Method.php',
|
Diffusion - move commit parents query to conduit
Summary:
Ref T2784. Relatively complicated one as this bad boy is used in a repository daemon.
While testing, I noticed bugs in the expandshortname query stuff. Those variables are private to the parent class so they need some setX love.
Also, was unable to find links to the "before" stuff, but made them by hand by looking at some of these T2784 diffs, browsing a file at a specific revision, then hacking the "before" variable to be some known commit that also touched the file. This produced sensical results. On the process of doing that I upgraded a query to use the proper policy query.
Test Plan: In git, mercurial, svn, verified on a commit page the "parents" showed up correctly. played around with ?before parameter on specific file browse page, with commits known to have interesting history and stuff looked good
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2784
Differential Revision: https://secure.phabricator.com/D5988
2013-05-22 01:22:49 +02:00
|
|
|
'ConduitAPI_diffusion_commitparentsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_commitparentsquery_Method.php',
|
2013-09-09 23:25:08 +02:00
|
|
|
'ConduitAPI_diffusion_createcomment_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_createcomment_Method.php',
|
2013-05-14 22:53:32 +02:00
|
|
|
'ConduitAPI_diffusion_diffquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_diffquery_Method.php',
|
2013-05-01 23:44:28 +02:00
|
|
|
'ConduitAPI_diffusion_existsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_existsquery_Method.php',
|
2013-05-07 23:57:08 +02:00
|
|
|
'ConduitAPI_diffusion_filecontentquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_filecontentquery_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_diffusion_findsymbols_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_findsymbols_Method.php',
|
|
|
|
'ConduitAPI_diffusion_getcommits_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getcommits_Method.php',
|
|
|
|
'ConduitAPI_diffusion_getlintmessages_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getlintmessages_Method.php',
|
|
|
|
'ConduitAPI_diffusion_getrecentcommitsbypath_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getrecentcommitsbypath_Method.php',
|
2013-05-20 21:45:34 +02:00
|
|
|
'ConduitAPI_diffusion_historyquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_historyquery_Method.php',
|
2013-05-14 22:53:32 +02:00
|
|
|
'ConduitAPI_diffusion_lastmodifiedquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_lastmodifiedquery_Method.php',
|
2013-10-31 23:46:57 +01:00
|
|
|
'ConduitAPI_diffusion_looksoon_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_looksoon_Method.php',
|
2013-05-21 02:04:51 +02:00
|
|
|
'ConduitAPI_diffusion_mergedcommitsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_mergedcommitsquery_Method.php',
|
2013-05-14 22:53:32 +02:00
|
|
|
'ConduitAPI_diffusion_rawdiffquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_rawdiffquery_Method.php',
|
2013-05-21 22:47:06 +02:00
|
|
|
'ConduitAPI_diffusion_readmequery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_readmequery_Method.php',
|
2013-05-17 23:13:48 +02:00
|
|
|
'ConduitAPI_diffusion_refsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_refsquery_Method.php',
|
2013-11-04 23:13:07 +01:00
|
|
|
'ConduitAPI_diffusion_resolverefs_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_resolverefs_Method.php',
|
2013-05-17 23:11:20 +02:00
|
|
|
'ConduitAPI_diffusion_searchquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_searchquery_Method.php',
|
2013-05-11 00:22:35 +02:00
|
|
|
'ConduitAPI_diffusion_tagsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_tagsquery_Method.php',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_feed_Method' => 'applications/feed/conduit/ConduitAPI_feed_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_feed_publish_Method' => 'applications/feed/conduit/ConduitAPI_feed_publish_Method.php',
|
|
|
|
'ConduitAPI_feed_query_Method' => 'applications/feed/conduit/ConduitAPI_feed_query_Method.php',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_file_Method' => 'applications/files/conduit/ConduitAPI_file_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_file_download_Method' => 'applications/files/conduit/ConduitAPI_file_download_Method.php',
|
|
|
|
'ConduitAPI_file_info_Method' => 'applications/files/conduit/ConduitAPI_file_info_Method.php',
|
|
|
|
'ConduitAPI_file_upload_Method' => 'applications/files/conduit/ConduitAPI_file_upload_Method.php',
|
2013-02-11 15:30:02 +01:00
|
|
|
'ConduitAPI_file_uploadhash_Method' => 'applications/files/conduit/ConduitAPI_file_uploadhash_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_flag_Method' => 'applications/flag/conduit/ConduitAPI_flag_Method.php',
|
|
|
|
'ConduitAPI_flag_delete_Method' => 'applications/flag/conduit/ConduitAPI_flag_delete_Method.php',
|
|
|
|
'ConduitAPI_flag_edit_Method' => 'applications/flag/conduit/ConduitAPI_flag_edit_Method.php',
|
|
|
|
'ConduitAPI_flag_query_Method' => 'applications/flag/conduit/ConduitAPI_flag_query_Method.php',
|
|
|
|
'ConduitAPI_macro_Method' => 'applications/macro/conduit/ConduitAPI_macro_Method.php',
|
2013-06-08 00:08:34 +02:00
|
|
|
'ConduitAPI_macro_creatememe_Method' => 'applications/macro/conduit/ConduitAPI_macro_creatememe_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_macro_query_Method' => 'applications/macro/conduit/ConduitAPI_macro_query_Method.php',
|
|
|
|
'ConduitAPI_maniphest_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_Method.php',
|
|
|
|
'ConduitAPI_maniphest_createtask_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_createtask_Method.php',
|
|
|
|
'ConduitAPI_maniphest_find_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_find_Method.php',
|
|
|
|
'ConduitAPI_maniphest_gettasktransactions_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_gettasktransactions_Method.php',
|
|
|
|
'ConduitAPI_maniphest_info_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_info_Method.php',
|
|
|
|
'ConduitAPI_maniphest_query_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_query_Method.php',
|
|
|
|
'ConduitAPI_maniphest_update_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_update_Method.php',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_owners_Method' => 'applications/owners/conduit/ConduitAPI_owners_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_owners_query_Method' => 'applications/owners/conduit/ConduitAPI_owners_query_Method.php',
|
2012-08-24 22:20:20 +02:00
|
|
|
'ConduitAPI_paste_Method' => 'applications/paste/conduit/ConduitAPI_paste_Method.php',
|
|
|
|
'ConduitAPI_paste_create_Method' => 'applications/paste/conduit/ConduitAPI_paste_create_Method.php',
|
|
|
|
'ConduitAPI_paste_info_Method' => 'applications/paste/conduit/ConduitAPI_paste_info_Method.php',
|
|
|
|
'ConduitAPI_paste_query_Method' => 'applications/paste/conduit/ConduitAPI_paste_query_Method.php',
|
2013-11-03 00:31:30 +01:00
|
|
|
'ConduitAPI_phame_Method' => 'applications/phame/conduit/ConduitAPI_phame_Method.php',
|
|
|
|
'ConduitAPI_phame_query_Method' => 'applications/phame/conduit/ConduitAPI_phame_query_Method.php',
|
|
|
|
'ConduitAPI_phame_queryposts_Method' => 'applications/phame/conduit/ConduitAPI_phame_queryposts_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_phid_Method' => 'applications/phid/conduit/ConduitAPI_phid_Method.php',
|
|
|
|
'ConduitAPI_phid_info_Method' => 'applications/phid/conduit/ConduitAPI_phid_info_Method.php',
|
|
|
|
'ConduitAPI_phid_lookup_Method' => 'applications/phid/conduit/ConduitAPI_phid_lookup_Method.php',
|
|
|
|
'ConduitAPI_phid_query_Method' => 'applications/phid/conduit/ConduitAPI_phid_query_Method.php',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_phpast_Method' => 'applications/phpast/conduit/ConduitAPI_phpast_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_phpast_getast_Method' => 'applications/phpast/conduit/ConduitAPI_phpast_getast_Method.php',
|
|
|
|
'ConduitAPI_phpast_version_Method' => 'applications/phpast/conduit/ConduitAPI_phpast_version_Method.php',
|
|
|
|
'ConduitAPI_phriction_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_Method.php',
|
|
|
|
'ConduitAPI_phriction_edit_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_edit_Method.php',
|
|
|
|
'ConduitAPI_phriction_history_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_history_Method.php',
|
|
|
|
'ConduitAPI_phriction_info_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_info_Method.php',
|
|
|
|
'ConduitAPI_project_Method' => 'applications/project/conduit/ConduitAPI_project_Method.php',
|
|
|
|
'ConduitAPI_project_query_Method' => 'applications/project/conduit/ConduitAPI_project_query_Method.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ConduitAPI_releeph_Method' => 'applications/releeph/conduit/ConduitAPI_releeph_Method.php',
|
|
|
|
'ConduitAPI_releeph_getbranches_Method' => 'applications/releeph/conduit/ConduitAPI_releeph_getbranches_Method.php',
|
|
|
|
'ConduitAPI_releeph_projectinfo_Method' => 'applications/releeph/conduit/ConduitAPI_releeph_projectinfo_Method.php',
|
2013-04-26 18:07:38 +02:00
|
|
|
'ConduitAPI_releeph_queryrequests_Method' => 'applications/releeph/conduit/ConduitAPI_releeph_queryrequests_Method.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ConduitAPI_releeph_request_Method' => 'applications/releeph/conduit/ConduitAPI_releeph_request_Method.php',
|
|
|
|
'ConduitAPI_releephwork_canpush_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_canpush_Method.php',
|
|
|
|
'ConduitAPI_releephwork_getauthorinfo_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_getauthorinfo_Method.php',
|
|
|
|
'ConduitAPI_releephwork_getbranch_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_getbranch_Method.php',
|
|
|
|
'ConduitAPI_releephwork_getbranchcommitmessage_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_getbranchcommitmessage_Method.php',
|
|
|
|
'ConduitAPI_releephwork_getcommitmessage_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_getcommitmessage_Method.php',
|
|
|
|
'ConduitAPI_releephwork_getorigcommitmessage_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_getorigcommitmessage_Method.php',
|
|
|
|
'ConduitAPI_releephwork_nextrequest_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_nextrequest_Method.php',
|
|
|
|
'ConduitAPI_releephwork_record_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_record_Method.php',
|
|
|
|
'ConduitAPI_releephwork_recordpickstatus_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_recordpickstatus_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_remarkup_process_Method' => 'applications/remarkup/conduit/ConduitAPI_remarkup_process_Method.php',
|
|
|
|
'ConduitAPI_repository_Method' => 'applications/repository/conduit/ConduitAPI_repository_Method.php',
|
|
|
|
'ConduitAPI_repository_create_Method' => 'applications/repository/conduit/ConduitAPI_repository_create_Method.php',
|
|
|
|
'ConduitAPI_repository_query_Method' => 'applications/repository/conduit/ConduitAPI_repository_query_Method.php',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_slowvote_Method' => 'applications/slowvote/conduit/ConduitAPI_slowvote_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_slowvote_info_Method' => 'applications/slowvote/conduit/ConduitAPI_slowvote_info_Method.php',
|
2013-02-15 16:47:14 +01:00
|
|
|
'ConduitAPI_token_Method' => 'applications/tokens/conduit/ConduitAPI_token_Method.php',
|
|
|
|
'ConduitAPI_token_give_Method' => 'applications/tokens/conduit/ConduitAPI_token_give_Method.php',
|
|
|
|
'ConduitAPI_token_given_Method' => 'applications/tokens/conduit/ConduitAPI_token_given_Method.php',
|
|
|
|
'ConduitAPI_token_query_Method' => 'applications/tokens/conduit/ConduitAPI_token_query_Method.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'ConduitAPI_user_Method' => 'applications/people/conduit/ConduitAPI_user_Method.php',
|
|
|
|
'ConduitAPI_user_addstatus_Method' => 'applications/people/conduit/ConduitAPI_user_addstatus_Method.php',
|
|
|
|
'ConduitAPI_user_disable_Method' => 'applications/people/conduit/ConduitAPI_user_disable_Method.php',
|
|
|
|
'ConduitAPI_user_enable_Method' => 'applications/people/conduit/ConduitAPI_user_enable_Method.php',
|
|
|
|
'ConduitAPI_user_find_Method' => 'applications/people/conduit/ConduitAPI_user_find_Method.php',
|
|
|
|
'ConduitAPI_user_info_Method' => 'applications/people/conduit/ConduitAPI_user_info_Method.php',
|
|
|
|
'ConduitAPI_user_query_Method' => 'applications/people/conduit/ConduitAPI_user_query_Method.php',
|
|
|
|
'ConduitAPI_user_removestatus_Method' => 'applications/people/conduit/ConduitAPI_user_removestatus_Method.php',
|
|
|
|
'ConduitAPI_user_whoami_Method' => 'applications/people/conduit/ConduitAPI_user_whoami_Method.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ConduitException' => 'applications/conduit/protocol/ConduitException.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',
|
2013-10-22 02:00:21 +02:00
|
|
|
'ConpherenceActionMenuEventListener' => 'applications/conpherence/events/ConpherenceActionMenuEventListener.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',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ConpherenceCreateThreadMailReceiver' => 'applications/conpherence/mail/ConpherenceCreateThreadMailReceiver.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceDAO' => 'applications/conpherence/storage/ConpherenceDAO.php',
|
|
|
|
'ConpherenceEditor' => 'applications/conpherence/editor/ConpherenceEditor.php',
|
2013-03-08 19:40:06 +01:00
|
|
|
'ConpherenceFileWidgetView' => 'applications/conpherence/view/ConpherenceFileWidgetView.php',
|
2013-04-06 02:01:54 +02:00
|
|
|
'ConpherenceHovercardEventListener' => 'applications/conpherence/events/ConpherenceHovercardEventListener.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',
|
|
|
|
'ConpherenceNewController' => 'applications/conpherence/controller/ConpherenceNewController.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',
|
2013-01-26 01:03:54 +01:00
|
|
|
'ConpherenceReplyHandler' => 'applications/conpherence/mail/ConpherenceReplyHandler.php',
|
2013-03-26 21:30:35 +01:00
|
|
|
'ConpherenceSettings' => 'applications/conpherence/constants/ConpherenceSettings.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceThread' => 'applications/conpherence/storage/ConpherenceThread.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',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceThreadQuery' => 'applications/conpherence/query/ConpherenceThreadQuery.php',
|
2013-06-04 00:40:00 +02:00
|
|
|
'ConpherenceTimeUtil' => 'applications/conpherence/util/ConpherenceTimeUtil.php',
|
|
|
|
'ConpherenceTimeUtilTestCase' => 'applications/conpherence/__tests__/ConpherenceTimeUtilTestCase.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',
|
|
|
|
'ConpherenceTransactionType' => 'applications/conpherence/constants/ConpherenceTransactionType.php',
|
|
|
|
'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',
|
|
|
|
'ConpherenceViewController' => 'applications/conpherence/controller/ConpherenceViewController.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DarkConsoleController' => 'aphront/console/DarkConsoleController.php',
|
|
|
|
'DarkConsoleCore' => 'aphront/console/DarkConsoleCore.php',
|
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' => 'aphront/console/DarkConsoleDataController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DarkConsoleErrorLogPlugin' => 'aphront/console/plugin/DarkConsoleErrorLogPlugin.php',
|
|
|
|
'DarkConsoleErrorLogPluginAPI' => 'aphront/console/plugin/errorlog/DarkConsoleErrorLogPluginAPI.php',
|
|
|
|
'DarkConsoleEventPlugin' => 'aphront/console/plugin/DarkConsoleEventPlugin.php',
|
|
|
|
'DarkConsoleEventPluginAPI' => 'aphront/console/plugin/event/DarkConsoleEventPluginAPI.php',
|
|
|
|
'DarkConsolePlugin' => 'aphront/console/plugin/DarkConsolePlugin.php',
|
|
|
|
'DarkConsoleRequestPlugin' => 'aphront/console/plugin/DarkConsoleRequestPlugin.php',
|
|
|
|
'DarkConsoleServicesPlugin' => 'aphront/console/plugin/DarkConsoleServicesPlugin.php',
|
|
|
|
'DarkConsoleXHProfPlugin' => 'aphront/console/plugin/DarkConsoleXHProfPlugin.php',
|
|
|
|
'DarkConsoleXHProfPluginAPI' => 'aphront/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',
|
|
|
|
'DifferentialActionHasNoEffectException' => 'applications/differential/exception/DifferentialActionHasNoEffectException.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',
|
|
|
|
'DifferentialAffectedPath' => 'applications/differential/storage/DifferentialAffectedPath.php',
|
|
|
|
'DifferentialApplyPatchFieldSpecification' => 'applications/differential/field/specification/DifferentialApplyPatchFieldSpecification.php',
|
|
|
|
'DifferentialArcanistProjectFieldSpecification' => 'applications/differential/field/specification/DifferentialArcanistProjectFieldSpecification.php',
|
2013-07-10 01:22:33 +02:00
|
|
|
'DifferentialAsanaRepresentationFieldSpecification' => 'applications/differential/field/specification/DifferentialAsanaRepresentationFieldSpecification.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialAuditorsFieldSpecification' => 'applications/differential/field/specification/DifferentialAuditorsFieldSpecification.php',
|
|
|
|
'DifferentialAuthorFieldSpecification' => 'applications/differential/field/specification/DifferentialAuthorFieldSpecification.php',
|
|
|
|
'DifferentialAuxiliaryField' => 'applications/differential/storage/DifferentialAuxiliaryField.php',
|
|
|
|
'DifferentialBlameRevisionFieldSpecification' => 'applications/differential/field/specification/DifferentialBlameRevisionFieldSpecification.php',
|
|
|
|
'DifferentialBranchFieldSpecification' => 'applications/differential/field/specification/DifferentialBranchFieldSpecification.php',
|
|
|
|
'DifferentialCCWelcomeMail' => 'applications/differential/mail/DifferentialCCWelcomeMail.php',
|
|
|
|
'DifferentialCCsFieldSpecification' => 'applications/differential/field/specification/DifferentialCCsFieldSpecification.php',
|
2013-10-09 22:58:00 +02:00
|
|
|
'DifferentialCapabilityDefaultView' => 'applications/differential/capability/DifferentialCapabilityDefaultView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialChangeType' => 'applications/differential/constants/DifferentialChangeType.php',
|
|
|
|
'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',
|
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',
|
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',
|
|
|
|
'DifferentialComment' => 'applications/differential/storage/DifferentialComment.php',
|
|
|
|
'DifferentialCommentEditor' => 'applications/differential/editor/DifferentialCommentEditor.php',
|
|
|
|
'DifferentialCommentMail' => 'applications/differential/mail/DifferentialCommentMail.php',
|
|
|
|
'DifferentialCommentPreviewController' => 'applications/differential/controller/DifferentialCommentPreviewController.php',
|
Put all DifferentialComment loading behind DifferentialCommentQuery
Summary:
Ref T2222.
I'm thinking about how I want to approach the Asana sync, and I want to try to do T2222 first so that we can build it cleanly on top of ApplicationTransactions. I think we can at least walk down this road a little bit and if it turns out to be scary we can take another approach.
I was generally very happy with how the auth migration turned out (seemingly, it was almost completely clean), and want to pursue a similar strategy here. Basically:
- Wrap the new objects in the old objects for reads/writes.
- Migrate all the existing data to the new table.
- Everything hard is done; move things over a piece at a time at a leisurely pace in lots of smallish, relatively-easy-to-understand changes.
This deletes or abstracts all reads of the DifferentialComment table. In particular, these things are **deleted**:
- The script `undo_commits.php`, which I haven't pointed anyone at in a very long time.
- The `differential.getrevisionfeedback` Conduit method, which has been marked deprecated for a year or more.
- The `/stats/` interface in Differential, which should be rebuilt on Fact and has never been exposed in the UI. It does a ton of joins and such which are prohibitively difficult to migrate.
This leaves a small number of reading interfaces, which I replaced with a new `DifferentialCommentQuery`. Some future change will make this actually load transactions and wrap them with DifferentialComment interfaces.
Test Plan: Viewed a revision; made revision comments
Reviewers: btrahan
Reviewed By: btrahan
CC: edward, chad, aran
Maniphest Tasks: T2222
Differential Revision: https://secure.phabricator.com/D6260
2013-06-21 21:51:18 +02:00
|
|
|
'DifferentialCommentQuery' => 'applications/differential/query/DifferentialCommentQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialCommentSaveController' => 'applications/differential/controller/DifferentialCommentSaveController.php',
|
|
|
|
'DifferentialCommitsFieldSpecification' => 'applications/differential/field/specification/DifferentialCommitsFieldSpecification.php',
|
2012-12-12 01:34:08 +01:00
|
|
|
'DifferentialConflictsFieldSpecification' => 'applications/differential/field/specification/DifferentialConflictsFieldSpecification.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialController' => 'applications/differential/controller/DifferentialController.php',
|
2013-09-26 22:48:36 +02:00
|
|
|
'DifferentialCustomFieldNumericIndex' => 'applications/differential/storage/DifferentialCustomFieldNumericIndex.php',
|
|
|
|
'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',
|
|
|
|
'DifferentialDateCreatedFieldSpecification' => 'applications/differential/field/specification/DifferentialDateCreatedFieldSpecification.php',
|
|
|
|
'DifferentialDateModifiedFieldSpecification' => 'applications/differential/field/specification/DifferentialDateModifiedFieldSpecification.php',
|
|
|
|
'DifferentialDefaultFieldSelector' => 'applications/differential/field/selector/DifferentialDefaultFieldSelector.php',
|
|
|
|
'DifferentialDependenciesFieldSpecification' => 'applications/differential/field/specification/DifferentialDependenciesFieldSpecification.php',
|
2012-08-29 00:24:01 +02:00
|
|
|
'DifferentialDependsOnFieldSpecification' => 'applications/differential/field/specification/DifferentialDependsOnFieldSpecification.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialDiff' => 'applications/differential/storage/DifferentialDiff.php',
|
|
|
|
'DifferentialDiffContentMail' => 'applications/differential/mail/DifferentialDiffContentMail.php',
|
|
|
|
'DifferentialDiffCreateController' => 'applications/differential/controller/DifferentialDiffCreateController.php',
|
|
|
|
'DifferentialDiffProperty' => 'applications/differential/storage/DifferentialDiffProperty.php',
|
2013-07-01 21:38:42 +02:00
|
|
|
'DifferentialDiffQuery' => 'applications/differential/query/DifferentialDiffQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialDiffTableOfContentsView' => 'applications/differential/view/DifferentialDiffTableOfContentsView.php',
|
2012-11-21 21:30:38 +01:00
|
|
|
'DifferentialDiffTestCase' => 'applications/differential/storage/__tests__/DifferentialDiffTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialDiffViewController' => 'applications/differential/controller/DifferentialDiffViewController.php',
|
2013-07-03 20:29:57 +02:00
|
|
|
'DifferentialDiffViewPolicyFieldSpecification' => 'applications/differential/field/specification/DifferentialDiffViewPolicyFieldSpecification.php',
|
2013-07-26 17:56:35 +02:00
|
|
|
'DifferentialDoorkeeperRevisionFeedStoryPublisher' => 'applications/differential/doorkeeper/DifferentialDoorkeeperRevisionFeedStoryPublisher.php',
|
2013-09-26 23:17:11 +02:00
|
|
|
'DifferentialEditPolicyFieldSpecification' => 'applications/differential/field/specification/DifferentialEditPolicyFieldSpecification.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialException' => 'applications/differential/exception/DifferentialException.php',
|
|
|
|
'DifferentialExceptionMail' => 'applications/differential/mail/DifferentialExceptionMail.php',
|
|
|
|
'DifferentialExportPatchFieldSpecification' => 'applications/differential/field/specification/DifferentialExportPatchFieldSpecification.php',
|
|
|
|
'DifferentialFieldDataNotAvailableException' => 'applications/differential/field/exception/DifferentialFieldDataNotAvailableException.php',
|
|
|
|
'DifferentialFieldParseException' => 'applications/differential/field/exception/DifferentialFieldParseException.php',
|
|
|
|
'DifferentialFieldSelector' => 'applications/differential/field/selector/DifferentialFieldSelector.php',
|
|
|
|
'DifferentialFieldSpecification' => 'applications/differential/field/specification/DifferentialFieldSpecification.php',
|
|
|
|
'DifferentialFieldSpecificationIncompleteException' => 'applications/differential/field/exception/DifferentialFieldSpecificationIncompleteException.php',
|
|
|
|
'DifferentialFieldValidationException' => 'applications/differential/field/exception/DifferentialFieldValidationException.php',
|
2012-09-11 19:37:30 +02:00
|
|
|
'DifferentialFreeformFieldSpecification' => 'applications/differential/field/specification/DifferentialFreeformFieldSpecification.php',
|
2013-05-06 21:33:37 +02:00
|
|
|
'DifferentialFreeformFieldTestCase' => 'applications/differential/field/specification/__tests__/DifferentialFreeformFieldTestCase.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialGitSVNIDFieldSpecification' => 'applications/differential/field/specification/DifferentialGitSVNIDFieldSpecification.php',
|
|
|
|
'DifferentialHostFieldSpecification' => 'applications/differential/field/specification/DifferentialHostFieldSpecification.php',
|
2013-10-22 02:00:50 +02:00
|
|
|
'DifferentialHovercardEventListener' => 'applications/differential/event/DifferentialHovercardEventListener.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',
|
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',
|
|
|
|
'DifferentialInlineCommentEditView' => 'applications/differential/view/DifferentialInlineCommentEditView.php',
|
|
|
|
'DifferentialInlineCommentPreviewController' => 'applications/differential/controller/DifferentialInlineCommentPreviewController.php',
|
2013-06-21 21:54:56 +02:00
|
|
|
'DifferentialInlineCommentQuery' => 'applications/differential/query/DifferentialInlineCommentQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialInlineCommentView' => 'applications/differential/view/DifferentialInlineCommentView.php',
|
2013-09-04 02:27:51 +02:00
|
|
|
'DifferentialJIRAIssuesFieldSpecification' => 'applications/differential/field/specification/DifferentialJIRAIssuesFieldSpecification.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',
|
|
|
|
'DifferentialLandingToHostedGit' => 'applications/differential/landing/DifferentialLandingToHostedGit.php',
|
2013-11-08 20:37:57 +01:00
|
|
|
'DifferentialLandingToHostedMercurial' => 'applications/differential/landing/DifferentialLandingToHostedMercurial.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialLinesFieldSpecification' => 'applications/differential/field/specification/DifferentialLinesFieldSpecification.php',
|
|
|
|
'DifferentialLintFieldSpecification' => 'applications/differential/field/specification/DifferentialLintFieldSpecification.php',
|
|
|
|
'DifferentialLintStatus' => 'applications/differential/constants/DifferentialLintStatus.php',
|
|
|
|
'DifferentialLocalCommitsView' => 'applications/differential/view/DifferentialLocalCommitsView.php',
|
|
|
|
'DifferentialMail' => 'applications/differential/mail/DifferentialMail.php',
|
2012-06-06 19:52:17 +02:00
|
|
|
'DifferentialMailPhase' => 'applications/differential/constants/DifferentialMailPhase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialManiphestTasksFieldSpecification' => 'applications/differential/field/specification/DifferentialManiphestTasksFieldSpecification.php',
|
|
|
|
'DifferentialNewDiffMail' => 'applications/differential/mail/DifferentialNewDiffMail.php',
|
2013-11-06 22:59:06 +01:00
|
|
|
'DifferentialPHIDTypeDiff' => 'applications/differential/phid/DifferentialPHIDTypeDiff.php',
|
2013-07-21 17:11:37 +02:00
|
|
|
'DifferentialPHIDTypeRevision' => 'applications/differential/phid/DifferentialPHIDTypeRevision.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialPathFieldSpecification' => 'applications/differential/field/specification/DifferentialPathFieldSpecification.php',
|
|
|
|
'DifferentialPrimaryPaneView' => 'applications/differential/view/DifferentialPrimaryPaneView.php',
|
2013-10-05 16:54:42 +02:00
|
|
|
'DifferentialProjectReviewersFieldSpecification' => 'applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.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',
|
2013-09-26 23:17:11 +02:00
|
|
|
'DifferentialRepositoryFieldSpecification' => 'applications/differential/field/specification/DifferentialRepositoryFieldSpecification.php',
|
2013-09-27 00:28:42 +02:00
|
|
|
'DifferentialRepositoryLookup' => 'applications/differential/query/DifferentialRepositoryLookup.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialResultsTableView' => 'applications/differential/view/DifferentialResultsTableView.php',
|
|
|
|
'DifferentialRevertPlanFieldSpecification' => 'applications/differential/field/specification/DifferentialRevertPlanFieldSpecification.php',
|
|
|
|
'DifferentialReviewRequestMail' => 'applications/differential/mail/DifferentialReviewRequestMail.php',
|
|
|
|
'DifferentialReviewedByFieldSpecification' => 'applications/differential/field/specification/DifferentialReviewedByFieldSpecification.php',
|
2013-07-15 04:18:55 +02:00
|
|
|
'DifferentialReviewer' => 'applications/differential/storage/DifferentialReviewer.php',
|
2013-07-10 22:45:14 +02:00
|
|
|
'DifferentialReviewerStatus' => 'applications/differential/constants/DifferentialReviewerStatus.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialReviewersFieldSpecification' => 'applications/differential/field/specification/DifferentialReviewersFieldSpecification.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',
|
|
|
|
'DifferentialRevisionCommentListView' => 'applications/differential/view/DifferentialRevisionCommentListView.php',
|
|
|
|
'DifferentialRevisionCommentView' => 'applications/differential/view/DifferentialRevisionCommentView.php',
|
|
|
|
'DifferentialRevisionControlSystem' => 'applications/differential/constants/DifferentialRevisionControlSystem.php',
|
|
|
|
'DifferentialRevisionDetailRenderer' => 'applications/differential/controller/DifferentialRevisionDetailRenderer.php',
|
|
|
|
'DifferentialRevisionDetailView' => 'applications/differential/view/DifferentialRevisionDetailView.php',
|
|
|
|
'DifferentialRevisionEditController' => 'applications/differential/controller/DifferentialRevisionEditController.php',
|
|
|
|
'DifferentialRevisionEditor' => 'applications/differential/editor/DifferentialRevisionEditor.php',
|
|
|
|
'DifferentialRevisionIDFieldParserTestCase' => 'applications/differential/field/specification/__tests__/DifferentialRevisionIDFieldParserTestCase.php',
|
|
|
|
'DifferentialRevisionIDFieldSpecification' => 'applications/differential/field/specification/DifferentialRevisionIDFieldSpecification.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialRevisionQuery' => 'applications/differential/query/DifferentialRevisionQuery.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-06-01 21:10:26 +02:00
|
|
|
'DifferentialRevisionStatsView' => 'applications/differential/view/DifferentialRevisionStatsView.php',
|
2012-12-11 23:59:27 +01:00
|
|
|
'DifferentialRevisionStatus' => 'applications/differential/constants/DifferentialRevisionStatus.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialRevisionStatusFieldSpecification' => 'applications/differential/field/specification/DifferentialRevisionStatusFieldSpecification.php',
|
|
|
|
'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/DifferentialRevisionUpdateHistoryView.php',
|
|
|
|
'DifferentialRevisionViewController' => 'applications/differential/controller/DifferentialRevisionViewController.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
|
|
|
'DifferentialSearchIndexer' => 'applications/differential/search/DifferentialSearchIndexer.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialSubscribeController' => 'applications/differential/controller/DifferentialSubscribeController.php',
|
|
|
|
'DifferentialSummaryFieldSpecification' => 'applications/differential/field/specification/DifferentialSummaryFieldSpecification.php',
|
|
|
|
'DifferentialTasksAttacher' => 'applications/differential/DifferentialTasksAttacher.php',
|
|
|
|
'DifferentialTestPlanFieldSpecification' => 'applications/differential/field/specification/DifferentialTestPlanFieldSpecification.php',
|
|
|
|
'DifferentialTitleFieldSpecification' => 'applications/differential/field/specification/DifferentialTitleFieldSpecification.php',
|
2013-06-21 21:54:29 +02:00
|
|
|
'DifferentialTransaction' => 'applications/differential/storage/DifferentialTransaction.php',
|
|
|
|
'DifferentialTransactionComment' => 'applications/differential/storage/DifferentialTransactionComment.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DifferentialUnitFieldSpecification' => 'applications/differential/field/specification/DifferentialUnitFieldSpecification.php',
|
|
|
|
'DifferentialUnitStatus' => 'applications/differential/constants/DifferentialUnitStatus.php',
|
|
|
|
'DifferentialUnitTestResult' => 'applications/differential/constants/DifferentialUnitTestResult.php',
|
2013-09-26 23:17:11 +02:00
|
|
|
'DifferentialViewPolicyFieldSpecification' => 'applications/differential/field/specification/DifferentialViewPolicyFieldSpecification.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionBranchInformation' => 'applications/diffusion/data/DiffusionBranchInformation.php',
|
|
|
|
'DiffusionBranchTableController' => 'applications/diffusion/controller/DiffusionBranchTableController.php',
|
|
|
|
'DiffusionBranchTableView' => 'applications/diffusion/view/DiffusionBranchTableView.php',
|
|
|
|
'DiffusionBrowseController' => 'applications/diffusion/controller/DiffusionBrowseController.php',
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
'DiffusionBrowseDirectoryController' => 'applications/diffusion/controller/DiffusionBrowseDirectoryController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionBrowseFileController' => 'applications/diffusion/controller/DiffusionBrowseFileController.php',
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
'DiffusionBrowseMainController' => 'applications/diffusion/controller/DiffusionBrowseMainController.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',
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
'DiffusionBrowseSearchController' => 'applications/diffusion/controller/DiffusionBrowseSearchController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionBrowseTableView' => 'applications/diffusion/view/DiffusionBrowseTableView.php',
|
2013-10-26 02:46:08 +02:00
|
|
|
'DiffusionCapabilityCreateRepositories' => 'applications/diffusion/capability/DiffusionCapabilityCreateRepositories.php',
|
|
|
|
'DiffusionCapabilityDefaultEdit' => 'applications/diffusion/capability/DiffusionCapabilityDefaultEdit.php',
|
2013-10-26 04:12:52 +02:00
|
|
|
'DiffusionCapabilityDefaultPush' => 'applications/diffusion/capability/DiffusionCapabilityDefaultPush.php',
|
2013-10-26 02:46:08 +02:00
|
|
|
'DiffusionCapabilityDefaultView' => 'applications/diffusion/capability/DiffusionCapabilityDefaultView.php',
|
2013-10-26 04:12:52 +02:00
|
|
|
'DiffusionCapabilityPush' => 'applications/diffusion/capability/DiffusionCapabilityPush.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionChangeController' => 'applications/diffusion/controller/DiffusionChangeController.php',
|
|
|
|
'DiffusionCommentListView' => 'applications/diffusion/view/DiffusionCommentListView.php',
|
|
|
|
'DiffusionCommentView' => 'applications/diffusion/view/DiffusionCommentView.php',
|
2012-08-01 01:27:48 +02:00
|
|
|
'DiffusionCommitBranchesController' => 'applications/diffusion/controller/DiffusionCommitBranchesController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionCommitChangeTableView' => 'applications/diffusion/view/DiffusionCommitChangeTableView.php',
|
|
|
|
'DiffusionCommitController' => 'applications/diffusion/controller/DiffusionCommitController.php',
|
2012-08-08 19:03:41 +02:00
|
|
|
'DiffusionCommitEditController' => 'applications/diffusion/controller/DiffusionCommitEditController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionCommitParentsQuery.php',
|
2013-02-27 17:04:54 +01:00
|
|
|
'DiffusionCommitQuery' => 'applications/diffusion/query/DiffusionCommitQuery.php',
|
2012-08-01 01:27:48 +02:00
|
|
|
'DiffusionCommitTagsController' => 'applications/diffusion/controller/DiffusionCommitTagsController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionController' => 'applications/diffusion/controller/DiffusionController.php',
|
|
|
|
'DiffusionDiffController' => 'applications/diffusion/controller/DiffusionDiffController.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',
|
|
|
|
'DiffusionExternalController' => 'applications/diffusion/controller/DiffusionExternalController.php',
|
|
|
|
'DiffusionFileContent' => 'applications/diffusion/data/DiffusionFileContent.php',
|
|
|
|
'DiffusionFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionFileContentQuery.php',
|
2013-05-01 23:56:36 +02:00
|
|
|
'DiffusionGitBranch' => 'applications/diffusion/data/DiffusionGitBranch.php',
|
|
|
|
'DiffusionGitBranchTestCase' => 'applications/diffusion/data/__tests__/DiffusionGitBranchTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionGitCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionGitCommitParentsQuery.php',
|
|
|
|
'DiffusionGitFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionGitFileContentQuery.php',
|
|
|
|
'DiffusionGitRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionGitRawDiffQuery.php',
|
|
|
|
'DiffusionGitRequest' => 'applications/diffusion/request/DiffusionGitRequest.php',
|
2013-10-26 21:10:52 +02:00
|
|
|
'DiffusionGitResponse' => 'applications/diffusion/response/DiffusionGitResponse.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionHistoryController' => 'applications/diffusion/controller/DiffusionHistoryController.php',
|
|
|
|
'DiffusionHistoryTableView' => 'applications/diffusion/view/DiffusionHistoryTableView.php',
|
2013-04-06 02:01:54 +02:00
|
|
|
'DiffusionHovercardEventListener' => 'applications/diffusion/events/DiffusionHovercardEventListener.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionLastModifiedController' => 'applications/diffusion/controller/DiffusionLastModifiedController.php',
|
2012-11-08 20:11:44 +01:00
|
|
|
'DiffusionLintController' => 'applications/diffusion/controller/DiffusionLintController.php',
|
2012-11-09 01:13:21 +01:00
|
|
|
'DiffusionLintDetailsController' => 'applications/diffusion/controller/DiffusionLintDetailsController.php',
|
2012-11-09 03:37:15 +01:00
|
|
|
'DiffusionLintSaveRunner' => 'applications/diffusion/DiffusionLintSaveRunner.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',
|
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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionMercurialCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionMercurialCommitParentsQuery.php',
|
|
|
|
'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',
|
|
|
|
'DiffusionMercurialWireProtocol' => 'applications/diffusion/protocol/DiffusionMercurialWireProtocol.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',
|
|
|
|
'DiffusionPathValidateController' => 'applications/diffusion/controller/DiffusionPathValidateController.php',
|
|
|
|
'DiffusionQuery' => 'applications/diffusion/query/DiffusionQuery.php',
|
|
|
|
'DiffusionRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionRawDiffQuery.php',
|
2013-02-26 23:57:41 +01:00
|
|
|
'DiffusionRemarkupRule' => 'applications/diffusion/remarkup/DiffusionRemarkupRule.php',
|
2012-09-28 23:36:47 +02:00
|
|
|
'DiffusionRenameHistoryQuery' => 'applications/diffusion/query/DiffusionRenameHistoryQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionRepositoryController' => 'applications/diffusion/controller/DiffusionRepositoryController.php',
|
2013-07-14 16:37:17 +02:00
|
|
|
'DiffusionRepositoryCreateController' => 'applications/diffusion/controller/DiffusionRepositoryCreateController.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',
|
2013-10-25 22:58:15 +02:00
|
|
|
'DiffusionRepositoryEditActionsController' => 'applications/diffusion/controller/DiffusionRepositoryEditActionsController.php',
|
2013-09-22 01:23:35 +02:00
|
|
|
'DiffusionRepositoryEditActivateController' => 'applications/diffusion/controller/DiffusionRepositoryEditActivateController.php',
|
2013-05-24 21:37:42 +02:00
|
|
|
'DiffusionRepositoryEditBasicController' => 'applications/diffusion/controller/DiffusionRepositoryEditBasicController.php',
|
2013-10-25 22:57:14 +02:00
|
|
|
'DiffusionRepositoryEditBranchesController' => 'applications/diffusion/controller/DiffusionRepositoryEditBranchesController.php',
|
2013-05-24 21:37:42 +02:00
|
|
|
'DiffusionRepositoryEditController' => 'applications/diffusion/controller/DiffusionRepositoryEditController.php',
|
2013-10-29 22:23:30 +01:00
|
|
|
'DiffusionRepositoryEditDeleteController' => 'applications/diffusion/controller/DiffusionRepositoryEditDeleteController.php',
|
2013-05-25 15:30:38 +02:00
|
|
|
'DiffusionRepositoryEditEncodingController' => 'applications/diffusion/controller/DiffusionRepositoryEditEncodingController.php',
|
2013-10-26 05:13:38 +02:00
|
|
|
'DiffusionRepositoryEditHostingController' => 'applications/diffusion/controller/DiffusionRepositoryEditHostingController.php',
|
2013-10-29 20:20:26 +01:00
|
|
|
'DiffusionRepositoryEditLocalController' => 'applications/diffusion/controller/DiffusionRepositoryEditLocalController.php',
|
2013-10-26 00:58:58 +02:00
|
|
|
'DiffusionRepositoryEditMainController' => 'applications/diffusion/controller/DiffusionRepositoryEditMainController.php',
|
2013-09-23 21:53:41 +02:00
|
|
|
'DiffusionRepositoryEditPolicyController' => 'applications/diffusion/controller/DiffusionRepositoryEditPolicyController.php',
|
2013-10-25 22:58:03 +02:00
|
|
|
'DiffusionRepositoryEditSubversionController' => 'applications/diffusion/controller/DiffusionRepositoryEditSubversionController.php',
|
2013-09-11 00:24:44 +02:00
|
|
|
'DiffusionRepositoryListController' => 'applications/diffusion/controller/DiffusionRepositoryListController.php',
|
2013-11-02 01:39:35 +01:00
|
|
|
'DiffusionRepositoryNewController' => 'applications/diffusion/controller/DiffusionRepositoryNewController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionRepositoryPath' => 'applications/diffusion/data/DiffusionRepositoryPath.php',
|
2013-10-30 21:06:09 +01:00
|
|
|
'DiffusionRepositoryRef' => 'applications/diffusion/data/DiffusionRepositoryRef.php',
|
2013-05-01 23:56:36 +02:00
|
|
|
'DiffusionRepositoryTag' => 'applications/diffusion/data/DiffusionRepositoryTag.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionRequest' => 'applications/diffusion/request/DiffusionRequest.php',
|
2013-10-26 23:11:52 +02:00
|
|
|
'DiffusionSSHGitReceivePackWorkflow' => 'applications/diffusion/ssh/DiffusionSSHGitReceivePackWorkflow.php',
|
2013-10-26 19:46:09 +02:00
|
|
|
'DiffusionSSHGitUploadPackWorkflow' => 'applications/diffusion/ssh/DiffusionSSHGitUploadPackWorkflow.php',
|
|
|
|
'DiffusionSSHGitWorkflow' => 'applications/diffusion/ssh/DiffusionSSHGitWorkflow.php',
|
|
|
|
'DiffusionSSHWorkflow' => 'applications/diffusion/ssh/DiffusionSSHWorkflow.php',
|
2013-11-07 02:55:46 +01:00
|
|
|
'DiffusionServeController' => 'applications/diffusion/controller/DiffusionServeController.php',
|
2013-11-01 16:34:11 +01:00
|
|
|
'DiffusionSetPasswordPanel' => 'applications/diffusion/panel/DiffusionSetPasswordPanel.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DiffusionSetupException' => 'applications/diffusion/exception/DiffusionSetupException.php',
|
|
|
|
'DiffusionSvnCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionSvnCommitParentsQuery.php',
|
|
|
|
'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',
|
|
|
|
'DiffusionSymbolQuery' => 'applications/diffusion/query/DiffusionSymbolQuery.php',
|
|
|
|
'DiffusionTagListController' => 'applications/diffusion/controller/DiffusionTagListController.php',
|
|
|
|
'DiffusionTagListView' => 'applications/diffusion/view/DiffusionTagListView.php',
|
|
|
|
'DiffusionURITestCase' => 'applications/diffusion/request/__tests__/DiffusionURITestCase.php',
|
|
|
|
'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',
|
|
|
|
'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',
|
2013-09-10 18:39:50 +02:00
|
|
|
'DivinerBookItemView' => 'applications/diviner/view/DivinerBookItemView.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',
|
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',
|
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-31 19:52:25 +02:00
|
|
|
'DivinerLegacyController' => 'applications/diviner/controller/DivinerLegacyController.php',
|
2013-05-20 19:18:26 +02:00
|
|
|
'DivinerLiveAtom' => 'applications/diviner/storage/DivinerLiveAtom.php',
|
|
|
|
'DivinerLiveBook' => 'applications/diviner/storage/DivinerLiveBook.php',
|
|
|
|
'DivinerLivePublisher' => 'applications/diviner/publisher/DivinerLivePublisher.php',
|
|
|
|
'DivinerLiveSymbol' => 'applications/diviner/storage/DivinerLiveSymbol.php',
|
2013-07-30 15:49:13 +02:00
|
|
|
'DivinerPHIDTypeAtom' => 'applications/diviner/phid/DivinerPHIDTypeAtom.php',
|
2013-07-30 15:47:07 +02:00
|
|
|
'DivinerPHIDTypeBook' => 'applications/diviner/phid/DivinerPHIDTypeBook.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',
|
2013-02-18 00:40:44 +01:00
|
|
|
'DivinerRemarkupRuleSymbol' => 'applications/diviner/markup/DivinerRemarkupRuleSymbol.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
|
|
|
'DivinerRenderer' => 'applications/diviner/renderer/DivinerRenderer.php',
|
2013-08-27 12:14:00 +02:00
|
|
|
'DivinerReturnTableView' => 'applications/diviner/view/DivinerReturnTableView.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',
|
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',
|
2013-06-25 00:54:54 +02:00
|
|
|
'DoorkeeperBridge' => 'applications/doorkeeper/bridge/DoorkeeperBridge.php',
|
|
|
|
'DoorkeeperBridgeAsana' => 'applications/doorkeeper/bridge/DoorkeeperBridgeAsana.php',
|
2013-09-04 02:27:38 +02:00
|
|
|
'DoorkeeperBridgeJIRA' => 'applications/doorkeeper/bridge/DoorkeeperBridgeJIRA.php',
|
2013-06-25 00:54:36 +02:00
|
|
|
'DoorkeeperDAO' => 'applications/doorkeeper/storage/DoorkeeperDAO.php',
|
|
|
|
'DoorkeeperExternalObject' => 'applications/doorkeeper/storage/DoorkeeperExternalObject.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',
|
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
|
|
|
'DoorkeeperFeedWorkerAsana' => 'applications/doorkeeper/worker/DoorkeeperFeedWorkerAsana.php',
|
2013-09-06 01:51:20 +02:00
|
|
|
'DoorkeeperFeedWorkerJIRA' => 'applications/doorkeeper/worker/DoorkeeperFeedWorkerJIRA.php',
|
2013-06-25 00:55:08 +02:00
|
|
|
'DoorkeeperImportEngine' => 'applications/doorkeeper/engine/DoorkeeperImportEngine.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',
|
2013-06-25 00:55:08 +02:00
|
|
|
'DoorkeeperRemarkupRuleAsana' => 'applications/doorkeeper/remarkup/DoorkeeperRemarkupRuleAsana.php',
|
2013-09-04 02:27:38 +02:00
|
|
|
'DoorkeeperRemarkupRuleJIRA' => 'applications/doorkeeper/remarkup/DoorkeeperRemarkupRuleJIRA.php',
|
2013-06-25 00:55:08 +02:00
|
|
|
'DoorkeeperTagsController' => 'applications/doorkeeper/controller/DoorkeeperTagsController.php',
|
2012-11-02 00:53:17 +01:00
|
|
|
'DrydockAllocatorWorker' => 'applications/drydock/worker/DrydockAllocatorWorker.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockApacheWebrootInterface' => 'applications/drydock/interface/webroot/DrydockApacheWebrootInterface.php',
|
|
|
|
'DrydockBlueprint' => 'applications/drydock/blueprint/DrydockBlueprint.php',
|
2012-12-13 03:42:12 +01:00
|
|
|
'DrydockBlueprintScopeGuard' => 'applications/drydock/util/DrydockBlueprintScopeGuard.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockCommandInterface' => 'applications/drydock/interface/command/DrydockCommandInterface.php',
|
|
|
|
'DrydockConstants' => 'applications/drydock/constants/DrydockConstants.php',
|
|
|
|
'DrydockController' => 'applications/drydock/controller/DrydockController.php',
|
|
|
|
'DrydockDAO' => 'applications/drydock/storage/DrydockDAO.php',
|
|
|
|
'DrydockInterface' => 'applications/drydock/interface/DrydockInterface.php',
|
|
|
|
'DrydockLease' => 'applications/drydock/storage/DrydockLease.php',
|
|
|
|
'DrydockLeaseListController' => 'applications/drydock/controller/DrydockLeaseListController.php',
|
2012-12-17 22:53:32 +01:00
|
|
|
'DrydockLeaseQuery' => 'applications/drydock/query/DrydockLeaseQuery.php',
|
2012-12-15 00:42:58 +01:00
|
|
|
'DrydockLeaseReleaseController' => 'applications/drydock/controller/DrydockLeaseReleaseController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockLeaseStatus' => 'applications/drydock/constants/DrydockLeaseStatus.php',
|
2012-11-07 00:28:33 +01:00
|
|
|
'DrydockLeaseViewController' => 'applications/drydock/controller/DrydockLeaseViewController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockLocalCommandInterface' => 'applications/drydock/interface/command/DrydockLocalCommandInterface.php',
|
|
|
|
'DrydockLocalHostBlueprint' => 'applications/drydock/blueprint/DrydockLocalHostBlueprint.php',
|
|
|
|
'DrydockLog' => 'applications/drydock/storage/DrydockLog.php',
|
|
|
|
'DrydockLogController' => 'applications/drydock/controller/DrydockLogController.php',
|
|
|
|
'DrydockLogQuery' => 'applications/drydock/query/DrydockLogQuery.php',
|
2012-11-27 21:48:03 +01:00
|
|
|
'DrydockManagementCloseWorkflow' => 'applications/drydock/management/DrydockManagementCloseWorkflow.php',
|
2012-11-01 23:30:14 +01:00
|
|
|
'DrydockManagementLeaseWorkflow' => 'applications/drydock/management/DrydockManagementLeaseWorkflow.php',
|
2012-12-15 00:42:58 +01:00
|
|
|
'DrydockManagementReleaseWorkflow' => 'applications/drydock/management/DrydockManagementReleaseWorkflow.php',
|
2012-11-01 23:30:14 +01:00
|
|
|
'DrydockManagementWaitForLeaseWorkflow' => 'applications/drydock/management/DrydockManagementWaitForLeaseWorkflow.php',
|
|
|
|
'DrydockManagementWorkflow' => 'applications/drydock/management/DrydockManagementWorkflow.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockResource' => 'applications/drydock/storage/DrydockResource.php',
|
2012-11-27 21:48:03 +01:00
|
|
|
'DrydockResourceCloseController' => 'applications/drydock/controller/DrydockResourceCloseController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockResourceListController' => 'applications/drydock/controller/DrydockResourceListController.php',
|
2012-12-17 23:47:21 +01:00
|
|
|
'DrydockResourceQuery' => 'applications/drydock/query/DrydockResourceQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockResourceStatus' => 'applications/drydock/constants/DrydockResourceStatus.php',
|
2012-11-20 22:25:22 +01:00
|
|
|
'DrydockResourceViewController' => 'applications/drydock/controller/DrydockResourceViewController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'DrydockSSHCommandInterface' => 'applications/drydock/interface/command/DrydockSSHCommandInterface.php',
|
|
|
|
'DrydockWebrootInterface' => 'applications/drydock/interface/webroot/DrydockWebrootInterface.php',
|
2012-11-27 21:48:14 +01:00
|
|
|
'DrydockWorkingCopyBlueprint' => 'applications/drydock/blueprint/DrydockWorkingCopyBlueprint.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',
|
2013-09-05 22:11:02 +02:00
|
|
|
'FileCreateMailReceiver' => 'applications/files/mail/FileCreateMailReceiver.php',
|
|
|
|
'FileMailReceiver' => 'applications/files/mail/FileMailReceiver.php',
|
|
|
|
'FileReplyHandler' => 'applications/files/mail/FileReplyHandler.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',
|
|
|
|
'HarbormasterBuildArtifact' => 'applications/harbormaster/storage/build/HarbormasterBuildArtifact.php',
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterBuildCancelController' => 'applications/harbormaster/controller/HarbormasterBuildCancelController.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
|
|
|
'HarbormasterBuildItem' => 'applications/harbormaster/storage/build/HarbormasterBuildItem.php',
|
|
|
|
'HarbormasterBuildItemQuery' => 'applications/harbormaster/query/HarbormasterBuildItemQuery.php',
|
|
|
|
'HarbormasterBuildLog' => 'applications/harbormaster/storage/build/HarbormasterBuildLog.php',
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterBuildLogQuery' => 'applications/harbormaster/query/HarbormasterBuildLogQuery.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',
|
|
|
|
'HarbormasterBuildPlanEditor' => 'applications/harbormaster/editor/HarbormasterBuildPlanEditor.php',
|
|
|
|
'HarbormasterBuildPlanQuery' => 'applications/harbormaster/query/HarbormasterBuildPlanQuery.php',
|
|
|
|
'HarbormasterBuildPlanSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php',
|
|
|
|
'HarbormasterBuildPlanTransaction' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlanTransaction.php',
|
|
|
|
'HarbormasterBuildPlanTransactionComment' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlanTransactionComment.php',
|
|
|
|
'HarbormasterBuildPlanTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildPlanTransactionQuery.php',
|
|
|
|
'HarbormasterBuildQuery' => 'applications/harbormaster/query/HarbormasterBuildQuery.php',
|
|
|
|
'HarbormasterBuildStep' => 'applications/harbormaster/storage/configuration/HarbormasterBuildStep.php',
|
|
|
|
'HarbormasterBuildStepQuery' => 'applications/harbormaster/query/HarbormasterBuildStepQuery.php',
|
|
|
|
'HarbormasterBuildTarget' => 'applications/harbormaster/storage/build/HarbormasterBuildTarget.php',
|
|
|
|
'HarbormasterBuildTargetQuery' => 'applications/harbormaster/query/HarbormasterBuildTargetQuery.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',
|
2013-11-05 21:43:47 +01:00
|
|
|
'HarbormasterBuildableApplyController' => 'applications/harbormaster/controller/HarbormasterBuildableApplyController.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
|
|
|
'HarbormasterBuildableArtifactQuery' => 'applications/harbormaster/query/HarbormasterBuildableArtifactQuery.php',
|
|
|
|
'HarbormasterBuildableEditController' => 'applications/harbormaster/controller/HarbormasterBuildableEditController.php',
|
|
|
|
'HarbormasterBuildableListController' => 'applications/harbormaster/controller/HarbormasterBuildableListController.php',
|
|
|
|
'HarbormasterBuildableQuery' => 'applications/harbormaster/query/HarbormasterBuildableQuery.php',
|
|
|
|
'HarbormasterBuildableSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildableSearchEngine.php',
|
|
|
|
'HarbormasterBuildableViewController' => 'applications/harbormaster/controller/HarbormasterBuildableViewController.php',
|
|
|
|
'HarbormasterCapabilityManagePlans' => 'applications/harbormaster/capability/HarbormasterCapabilityManagePlans.php',
|
|
|
|
'HarbormasterController' => 'applications/harbormaster/controller/HarbormasterController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HarbormasterDAO' => 'applications/harbormaster/storage/HarbormasterDAO.php',
|
2013-11-09 16:16:12 +01:00
|
|
|
'HarbormasterHTTPRequestBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterHTTPRequestBuildStepImplementation.php',
|
2012-07-09 19:39:14 +02:00
|
|
|
'HarbormasterObject' => 'applications/harbormaster/storage/HarbormasterObject.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
|
|
|
'HarbormasterPHIDTypeBuild' => 'applications/harbormaster/phid/HarbormasterPHIDTypeBuild.php',
|
|
|
|
'HarbormasterPHIDTypeBuildItem' => 'applications/harbormaster/phid/HarbormasterPHIDTypeBuildItem.php',
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterPHIDTypeBuildLog' => 'applications/harbormaster/phid/HarbormasterPHIDTypeBuildLog.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
|
|
|
'HarbormasterPHIDTypeBuildPlan' => 'applications/harbormaster/phid/HarbormasterPHIDTypeBuildPlan.php',
|
|
|
|
'HarbormasterPHIDTypeBuildStep' => 'applications/harbormaster/phid/HarbormasterPHIDTypeBuildStep.php',
|
|
|
|
'HarbormasterPHIDTypeBuildTarget' => 'applications/harbormaster/phid/HarbormasterPHIDTypeBuildTarget.php',
|
|
|
|
'HarbormasterPHIDTypeBuildable' => 'applications/harbormaster/phid/HarbormasterPHIDTypeBuildable.php',
|
|
|
|
'HarbormasterPlanController' => 'applications/harbormaster/controller/HarbormasterPlanController.php',
|
|
|
|
'HarbormasterPlanEditController' => 'applications/harbormaster/controller/HarbormasterPlanEditController.php',
|
|
|
|
'HarbormasterPlanListController' => 'applications/harbormaster/controller/HarbormasterPlanListController.php',
|
|
|
|
'HarbormasterPlanViewController' => 'applications/harbormaster/controller/HarbormasterPlanViewController.php',
|
|
|
|
'HarbormasterRemarkupRule' => 'applications/harbormaster/remarkup/HarbormasterRemarkupRule.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HarbormasterScratchTable' => 'applications/harbormaster/storage/HarbormasterScratchTable.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',
|
2013-11-10 00:02:07 +01:00
|
|
|
'HarbormasterUIEventListener' => 'applications/harbormaster/event/HarbormasterUIEventListener.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldAction' => 'applications/herald/storage/HeraldAction.php',
|
2013-08-02 17:55:13 +02:00
|
|
|
'HeraldAdapter' => 'applications/herald/adapter/HeraldAdapter.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldApplyTranscript' => 'applications/herald/storage/transcript/HeraldApplyTranscript.php',
|
2013-10-09 22:44:41 +02:00
|
|
|
'HeraldCapabilityManageGlobalRules' => 'applications/herald/capability/HeraldCapabilityManageGlobalRules.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldCommitAdapter' => 'applications/herald/adapter/HeraldCommitAdapter.php',
|
|
|
|
'HeraldCondition' => 'applications/herald/storage/HeraldCondition.php',
|
|
|
|
'HeraldConditionTranscript' => 'applications/herald/storage/transcript/HeraldConditionTranscript.php',
|
|
|
|
'HeraldController' => 'applications/herald/controller/HeraldController.php',
|
|
|
|
'HeraldDAO' => 'applications/herald/storage/HeraldDAO.php',
|
|
|
|
'HeraldDifferentialRevisionAdapter' => 'applications/herald/adapter/HeraldDifferentialRevisionAdapter.php',
|
2013-10-07 02:10:29 +02:00
|
|
|
'HeraldDisableController' => 'applications/herald/controller/HeraldDisableController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldEditLogQuery' => 'applications/herald/query/HeraldEditLogQuery.php',
|
|
|
|
'HeraldEffect' => 'applications/herald/engine/HeraldEffect.php',
|
|
|
|
'HeraldEngine' => 'applications/herald/engine/HeraldEngine.php',
|
2013-08-06 20:23:01 +02:00
|
|
|
'HeraldInvalidActionException' => 'applications/herald/engine/exception/HeraldInvalidActionException.php',
|
|
|
|
'HeraldInvalidConditionException' => 'applications/herald/engine/exception/HeraldInvalidConditionException.php',
|
|
|
|
'HeraldInvalidFieldException' => 'applications/herald/engine/exception/HeraldInvalidFieldException.php',
|
2013-09-25 20:50:15 +02:00
|
|
|
'HeraldManiphestTaskAdapter' => 'applications/herald/adapter/HeraldManiphestTaskAdapter.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldNewController' => 'applications/herald/controller/HeraldNewController.php',
|
|
|
|
'HeraldObjectTranscript' => 'applications/herald/storage/transcript/HeraldObjectTranscript.php',
|
2013-08-02 15:11:25 +02:00
|
|
|
'HeraldPHIDTypeRule' => 'applications/herald/phid/HeraldPHIDTypeRule.php',
|
2013-08-15 22:10:45 +02:00
|
|
|
'HeraldPholioMockAdapter' => 'applications/herald/adapter/HeraldPholioMockAdapter.php',
|
2013-08-06 20:23:01 +02:00
|
|
|
'HeraldRecursiveConditionsException' => 'applications/herald/engine/exception/HeraldRecursiveConditionsException.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',
|
|
|
|
'HeraldRuleEdit' => 'applications/herald/storage/HeraldRuleEdit.php',
|
|
|
|
'HeraldRuleEditHistoryController' => 'applications/herald/controller/HeraldRuleEditHistoryController.php',
|
|
|
|
'HeraldRuleEditHistoryView' => 'applications/herald/view/HeraldRuleEditHistoryView.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',
|
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',
|
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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'HeraldTestConsoleController' => 'applications/herald/controller/HeraldTestConsoleController.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',
|
|
|
|
'HeraldTranscriptListController' => 'applications/herald/controller/HeraldTranscriptListController.php',
|
2013-10-05 00:17:18 +02:00
|
|
|
'HeraldTranscriptQuery' => 'applications/herald/query/HeraldTranscriptQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'Javelin' => 'infrastructure/javelin/Javelin.php',
|
|
|
|
'JavelinReactorExample' => 'applications/uiexample/examples/JavelinReactorExample.php',
|
2012-07-31 01:08:10 +02:00
|
|
|
'JavelinUIExample' => 'applications/uiexample/examples/JavelinUIExample.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'JavelinViewExample' => 'applications/uiexample/examples/JavelinViewExample.php',
|
|
|
|
'JavelinViewExampleServerView' => 'applications/uiexample/examples/JavelinViewExampleServerView.php',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadConstants' => 'applications/legalpad/constants/LegalpadConstants.php',
|
|
|
|
'LegalpadController' => 'applications/legalpad/controller/LegalpadController.php',
|
|
|
|
'LegalpadDAO' => 'applications/legalpad/storage/LegalpadDAO.php',
|
|
|
|
'LegalpadDocument' => 'applications/legalpad/storage/LegalpadDocument.php',
|
|
|
|
'LegalpadDocumentBody' => 'applications/legalpad/storage/LegalpadDocumentBody.php',
|
|
|
|
'LegalpadDocumentCommentController' => 'applications/legalpad/controller/LegalpadDocumentCommentController.php',
|
|
|
|
'LegalpadDocumentEditController' => 'applications/legalpad/controller/LegalpadDocumentEditController.php',
|
|
|
|
'LegalpadDocumentEditor' => 'applications/legalpad/editor/LegalpadDocumentEditor.php',
|
|
|
|
'LegalpadDocumentListController' => 'applications/legalpad/controller/LegalpadDocumentListController.php',
|
|
|
|
'LegalpadDocumentQuery' => 'applications/legalpad/query/LegalpadDocumentQuery.php',
|
|
|
|
'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',
|
|
|
|
'LegalpadDocumentViewController' => 'applications/legalpad/controller/LegalpadDocumentViewController.php',
|
2013-07-04 01:37:05 +02:00
|
|
|
'LegalpadMockMailReceiver' => 'applications/legalpad/mail/LegalpadMockMailReceiver.php',
|
|
|
|
'LegalpadReplyHandler' => 'applications/legalpad/mail/LegalpadReplyHandler.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',
|
|
|
|
'LegalpadTransactionType' => 'applications/legalpad/constants/LegalpadTransactionType.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',
|
2013-10-22 02:00:21 +02:00
|
|
|
'ManiphestActionMenuEventListener' => 'applications/maniphest/event/ManiphestActionMenuEventListener.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestBatchEditController' => 'applications/maniphest/controller/ManiphestBatchEditController.php',
|
Add capabilities for editing task triage details (priority, assignee, etc)
Summary:
This is primarily a client request, and a little bit use-case specific, but policies seem to be holding up well and I'm getting more comfortable about maintaining this. Much if it can run through ApplicationTransactions.
Allow the ability to edit status, policies, priorities, assignees and projects of a task to be restricted to some subset of users. Also allow bulk edit to be locked. This affects the editor itself and the edit, view and list interfaces.
Test Plan: As a restricted user, created, edited and commented on tasks. Tried to drag them around.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7357
2013-10-22 01:59:06 +02:00
|
|
|
'ManiphestCapabilityBulkEdit' => 'applications/maniphest/capability/ManiphestCapabilityBulkEdit.php',
|
2013-10-09 22:53:17 +02:00
|
|
|
'ManiphestCapabilityDefaultEdit' => 'applications/maniphest/capability/ManiphestCapabilityDefaultEdit.php',
|
|
|
|
'ManiphestCapabilityDefaultView' => 'applications/maniphest/capability/ManiphestCapabilityDefaultView.php',
|
Add capabilities for editing task triage details (priority, assignee, etc)
Summary:
This is primarily a client request, and a little bit use-case specific, but policies seem to be holding up well and I'm getting more comfortable about maintaining this. Much if it can run through ApplicationTransactions.
Allow the ability to edit status, policies, priorities, assignees and projects of a task to be restricted to some subset of users. Also allow bulk edit to be locked. This affects the editor itself and the edit, view and list interfaces.
Test Plan: As a restricted user, created, edited and commented on tasks. Tried to drag them around.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7357
2013-10-22 01:59:06 +02:00
|
|
|
'ManiphestCapabilityEditAssign' => 'applications/maniphest/capability/ManiphestCapabilityEditAssign.php',
|
|
|
|
'ManiphestCapabilityEditPolicies' => 'applications/maniphest/capability/ManiphestCapabilityEditPolicies.php',
|
|
|
|
'ManiphestCapabilityEditPriority' => 'applications/maniphest/capability/ManiphestCapabilityEditPriority.php',
|
|
|
|
'ManiphestCapabilityEditProjects' => 'applications/maniphest/capability/ManiphestCapabilityEditProjects.php',
|
|
|
|
'ManiphestCapabilityEditStatus' => 'applications/maniphest/capability/ManiphestCapabilityEditStatus.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',
|
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',
|
|
|
|
'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',
|
2012-07-03 00:42:06 +02:00
|
|
|
'ManiphestEdgeEventListener' => 'applications/maniphest/event/ManiphestEdgeEventListener.php',
|
2013-04-11 20:22:06 +02:00
|
|
|
'ManiphestExcelDefaultFormat' => 'applications/maniphest/export/ManiphestExcelDefaultFormat.php',
|
|
|
|
'ManiphestExcelFormat' => 'applications/maniphest/export/ManiphestExcelFormat.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestExportController' => 'applications/maniphest/controller/ManiphestExportController.php',
|
2013-04-03 19:05:48 +02:00
|
|
|
'ManiphestHovercardEventListener' => 'applications/maniphest/event/ManiphestHovercardEventListener.php',
|
2013-09-12 22:06:44 +02:00
|
|
|
'ManiphestNameIndex' => 'applications/maniphest/storage/ManiphestNameIndex.php',
|
|
|
|
'ManiphestNameIndexEventListener' => 'applications/maniphest/event/ManiphestNameIndexEventListener.php',
|
2013-07-21 21:05:28 +02:00
|
|
|
'ManiphestPHIDTypeTask' => 'applications/maniphest/phid/ManiphestPHIDTypeTask.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',
|
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
|
|
|
'ManiphestSearchIndexer' => 'applications/maniphest/search/ManiphestSearchIndexer.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestSubpriorityController' => 'applications/maniphest/controller/ManiphestSubpriorityController.php',
|
2013-05-04 00:47:39 +02:00
|
|
|
'ManiphestSubscribeController' => 'applications/maniphest/controller/ManiphestSubscribeController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestTask' => 'applications/maniphest/storage/ManiphestTask.php',
|
|
|
|
'ManiphestTaskDescriptionPreviewController' => 'applications/maniphest/controller/ManiphestTaskDescriptionPreviewController.php',
|
|
|
|
'ManiphestTaskDetailController' => 'applications/maniphest/controller/ManiphestTaskDetailController.php',
|
|
|
|
'ManiphestTaskEditController' => 'applications/maniphest/controller/ManiphestTaskEditController.php',
|
2013-09-13 18:50:46 +02:00
|
|
|
'ManiphestTaskListController' => 'applications/maniphest/controller/ManiphestTaskListController.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestTaskOwner' => 'applications/maniphest/constants/ManiphestTaskOwner.php',
|
|
|
|
'ManiphestTaskPriority' => 'applications/maniphest/constants/ManiphestTaskPriority.php',
|
|
|
|
'ManiphestTaskProject' => 'applications/maniphest/storage/ManiphestTaskProject.php',
|
|
|
|
'ManiphestTaskProjectsView' => 'applications/maniphest/view/ManiphestTaskProjectsView.php',
|
2013-09-12 22:02:55 +02:00
|
|
|
'ManiphestTaskQuery' => 'applications/maniphest/query/ManiphestTaskQuery.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',
|
|
|
|
'ManiphestTaskSubscriber' => 'applications/maniphest/storage/ManiphestTaskSubscriber.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',
|
|
|
|
'ManiphestTransactionPreviewController' => 'applications/maniphest/controller/ManiphestTransactionPreviewController.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'ManiphestTransactionSaveController' => 'applications/maniphest/controller/ManiphestTransactionSaveController.php',
|
|
|
|
'ManiphestView' => 'applications/maniphest/view/ManiphestView.php',
|
|
|
|
'MetaMTAConstants' => 'applications/metamta/constants/MetaMTAConstants.php',
|
|
|
|
'MetaMTANotificationType' => 'applications/metamta/constants/MetaMTANotificationType.php',
|
2013-05-14 01:32:19 +02:00
|
|
|
'MetaMTAReceivedMailStatus' => 'applications/metamta/constants/MetaMTAReceivedMailStatus.php',
|
2013-11-08 21:45:14 +01:00
|
|
|
'NuanceCapabilitySourceDefaultEdit' => 'applications/nuance/capability/NuanceCapabilitySourceDefaultEdit.php',
|
|
|
|
'NuanceCapabilitySourceDefaultView' => 'applications/nuance/capability/NuanceCapabilitySourceDefaultView.php',
|
|
|
|
'NuanceCapabilitySourceManage' => 'applications/nuance/capability/NuanceCapabilitySourceManage.php',
|
|
|
|
'NuanceConstants' => 'applications/nuance/constants/NuanceConstants.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceController' => 'applications/nuance/controller/NuanceController.php',
|
|
|
|
'NuanceDAO' => 'applications/nuance/storage/NuanceDAO.php',
|
|
|
|
'NuanceItem' => 'applications/nuance/storage/NuanceItem.php',
|
|
|
|
'NuanceItemEditController' => 'applications/nuance/controller/NuanceItemEditController.php',
|
|
|
|
'NuanceItemEditor' => 'applications/nuance/editor/NuanceItemEditor.php',
|
|
|
|
'NuanceItemQuery' => 'applications/nuance/query/NuanceItemQuery.php',
|
|
|
|
'NuanceItemTransaction' => 'applications/nuance/storage/NuanceItemTransaction.php',
|
|
|
|
'NuanceItemTransactionComment' => 'applications/nuance/storage/NuanceItemTransactionComment.php',
|
|
|
|
'NuanceItemTransactionQuery' => 'applications/nuance/query/NuanceItemTransactionQuery.php',
|
|
|
|
'NuanceItemViewController' => 'applications/nuance/controller/NuanceItemViewController.php',
|
|
|
|
'NuancePHIDTypeItem' => 'applications/nuance/phid/NuancePHIDTypeItem.php',
|
|
|
|
'NuancePHIDTypeQueue' => 'applications/nuance/phid/NuancePHIDTypeQueue.php',
|
|
|
|
'NuancePHIDTypeRequestor' => 'applications/nuance/phid/NuancePHIDTypeRequestor.php',
|
|
|
|
'NuancePHIDTypeSource' => 'applications/nuance/phid/NuancePHIDTypeSource.php',
|
|
|
|
'NuanceQuery' => 'applications/nuance/query/NuanceQuery.php',
|
|
|
|
'NuanceQueue' => 'applications/nuance/storage/NuanceQueue.php',
|
|
|
|
'NuanceQueueEditController' => 'applications/nuance/controller/NuanceQueueEditController.php',
|
|
|
|
'NuanceQueueEditor' => 'applications/nuance/editor/NuanceQueueEditor.php',
|
|
|
|
'NuanceQueueItem' => 'applications/nuance/storage/NuanceQueueItem.php',
|
|
|
|
'NuanceQueueQuery' => 'applications/nuance/query/NuanceQueueQuery.php',
|
|
|
|
'NuanceQueueTransaction' => 'applications/nuance/storage/NuanceQueueTransaction.php',
|
|
|
|
'NuanceQueueTransactionComment' => 'applications/nuance/storage/NuanceQueueTransactionComment.php',
|
|
|
|
'NuanceQueueTransactionQuery' => 'applications/nuance/query/NuanceQueueTransactionQuery.php',
|
|
|
|
'NuanceQueueViewController' => 'applications/nuance/controller/NuanceQueueViewController.php',
|
|
|
|
'NuanceRequestor' => 'applications/nuance/storage/NuanceRequestor.php',
|
|
|
|
'NuanceRequestorEditController' => 'applications/nuance/controller/NuanceRequestorEditController.php',
|
|
|
|
'NuanceRequestorEditor' => 'applications/nuance/editor/NuanceRequestorEditor.php',
|
|
|
|
'NuanceRequestorQuery' => 'applications/nuance/query/NuanceRequestorQuery.php',
|
|
|
|
'NuanceRequestorSource' => 'applications/nuance/storage/NuanceRequestorSource.php',
|
|
|
|
'NuanceRequestorTransaction' => 'applications/nuance/storage/NuanceRequestorTransaction.php',
|
|
|
|
'NuanceRequestorTransactionComment' => 'applications/nuance/storage/NuanceRequestorTransactionComment.php',
|
|
|
|
'NuanceRequestorTransactionQuery' => 'applications/nuance/query/NuanceRequestorTransactionQuery.php',
|
|
|
|
'NuanceRequestorViewController' => 'applications/nuance/controller/NuanceRequestorViewController.php',
|
|
|
|
'NuanceSource' => 'applications/nuance/storage/NuanceSource.php',
|
|
|
|
'NuanceSourceEditController' => 'applications/nuance/controller/NuanceSourceEditController.php',
|
|
|
|
'NuanceSourceEditor' => 'applications/nuance/editor/NuanceSourceEditor.php',
|
|
|
|
'NuanceSourceQuery' => 'applications/nuance/query/NuanceSourceQuery.php',
|
|
|
|
'NuanceSourceTransaction' => 'applications/nuance/storage/NuanceSourceTransaction.php',
|
|
|
|
'NuanceSourceTransactionComment' => 'applications/nuance/storage/NuanceSourceTransactionComment.php',
|
|
|
|
'NuanceSourceTransactionQuery' => 'applications/nuance/query/NuanceSourceTransactionQuery.php',
|
2013-11-08 21:45:14 +01:00
|
|
|
'NuanceSourceType' => 'applications/nuance/constants/NuanceSourceType.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceSourceViewController' => 'applications/nuance/controller/NuanceSourceViewController.php',
|
|
|
|
'NuanceTransaction' => 'applications/nuance/storage/NuanceTransaction.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'OwnersPackageReplyHandler' => 'applications/owners/mail/OwnersPackageReplyHandler.php',
|
2013-04-18 20:34:02 +02:00
|
|
|
'PHUI' => 'view/phui/PHUI.php',
|
|
|
|
'PHUIBoxExample' => 'applications/uiexample/examples/PHUIBoxExample.php',
|
|
|
|
'PHUIBoxView' => 'view/phui/PHUIBoxView.php',
|
2013-06-13 03:23:35 +02:00
|
|
|
'PHUIButtonExample' => 'applications/uiexample/examples/PHUIButtonExample.php',
|
|
|
|
'PHUIButtonView' => 'view/phui/PHUIButtonView.php',
|
2013-06-19 00:35:14 +02:00
|
|
|
'PHUIColorPalletteExample' => 'applications/uiexample/examples/PHUIColorPalletteExample.php',
|
2013-06-05 17:41:43 +02:00
|
|
|
'PHUIDocumentExample' => 'applications/uiexample/examples/PHUIDocumentExample.php',
|
2013-06-01 00:03:59 +02:00
|
|
|
'PHUIDocumentView' => 'view/phui/PHUIDocumentView.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',
|
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',
|
2013-09-17 18:12:37 +02:00
|
|
|
'PHUIHeaderView' => 'view/phui/PHUIHeaderView.php',
|
2013-04-20 02:44:20 +02:00
|
|
|
'PHUIIconExample' => 'applications/uiexample/examples/PHUIIconExample.php',
|
|
|
|
'PHUIIconView' => 'view/phui/PHUIIconView.php',
|
2013-10-25 20:09:06 +02:00
|
|
|
'PHUIInfoPanelExample' => 'applications/uiexample/examples/PHUIInfoPanelExample.php',
|
|
|
|
'PHUIInfoPanelView' => 'view/phui/PHUIInfoPanelView.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',
|
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',
|
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',
|
2013-07-24 23:13:22 +02:00
|
|
|
'PHUIStatusItemView' => 'view/phui/PHUIStatusItemView.php',
|
|
|
|
'PHUIStatusListView' => 'view/phui/PHUIStatusListView.php',
|
2013-04-22 23:28:23 +02:00
|
|
|
'PHUITextExample' => 'applications/uiexample/examples/PHUITextExample.php',
|
|
|
|
'PHUITextView' => 'view/phui/PHUITextView.php',
|
2013-09-06 23:06:12 +02:00
|
|
|
'PHUIWorkboardExample' => 'applications/uiexample/examples/PHUIWorkboardExample.php',
|
|
|
|
'PHUIWorkboardView' => 'view/phui/PHUIWorkboardView.php',
|
|
|
|
'PHUIWorkpanelView' => 'view/phui/PHUIWorkpanelView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PackageCreateMail' => 'applications/owners/mail/PackageCreateMail.php',
|
|
|
|
'PackageDeleteMail' => 'applications/owners/mail/PackageDeleteMail.php',
|
|
|
|
'PackageMail' => 'applications/owners/mail/PackageMail.php',
|
|
|
|
'PackageModifyMail' => 'applications/owners/mail/PackageModifyMail.php',
|
2013-10-16 19:35:52 +02:00
|
|
|
'PasteCapabilityDefaultView' => 'applications/paste/capability/PasteCapabilityDefaultView.php',
|
2013-07-30 22:26:55 +02:00
|
|
|
'PasteCreateMailReceiver' => 'applications/paste/mail/PasteCreateMailReceiver.php',
|
2013-03-13 14:44:27 +01:00
|
|
|
'PasteEmbedView' => 'applications/paste/view/PasteEmbedView.php',
|
2013-08-06 02:11:46 +02:00
|
|
|
'PasteMockMailReceiver' => 'applications/paste/mail/PasteMockMailReceiver.php',
|
|
|
|
'PasteReplyHandler' => 'applications/paste/mail/PasteReplyHandler.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorAccessLog' => 'infrastructure/PhabricatorAccessLog.php',
|
2013-01-01 23:09:17 +01:00
|
|
|
'PhabricatorAccessLogConfigOptions' => 'applications/config/option/PhabricatorAccessLogConfigOptions.php',
|
2013-04-05 16:40:27 +02:00
|
|
|
'PhabricatorActionHeaderExample' => 'applications/uiexample/examples/PhabricatorActionHeaderExample.php',
|
|
|
|
'PhabricatorActionHeaderView' => 'view/layout/PhabricatorActionHeaderView.php',
|
2012-10-03 19:21:39 +02:00
|
|
|
'PhabricatorActionListExample' => 'applications/uiexample/examples/PhabricatorActionListExample.php',
|
2012-08-15 19:45:06 +02:00
|
|
|
'PhabricatorActionListView' => 'view/layout/PhabricatorActionListView.php',
|
|
|
|
'PhabricatorActionView' => 'view/layout/PhabricatorActionView.php',
|
2013-01-25 01:11:30 +01:00
|
|
|
'PhabricatorAllCapsTranslation' => 'infrastructure/internationalization/PhabricatorAllCapsTranslation.php',
|
2012-08-22 00:01:20 +02:00
|
|
|
'PhabricatorAnchorView' => 'view/layout/PhabricatorAnchorView.php',
|
2013-03-05 17:46:09 +01:00
|
|
|
'PhabricatorAphrontBarExample' => 'applications/uiexample/examples/PhabricatorAphrontBarExample.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',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationApplications' => 'applications/meta/application/PhabricatorApplicationApplications.php',
|
|
|
|
'PhabricatorApplicationAudit' => 'applications/audit/application/PhabricatorApplicationAudit.php',
|
2012-08-05 23:12:43 +02:00
|
|
|
'PhabricatorApplicationAuth' => 'applications/auth/application/PhabricatorApplicationAuth.php',
|
2012-10-24 22:22:24 +02:00
|
|
|
'PhabricatorApplicationCalendar' => 'applications/calendar/application/PhabricatorApplicationCalendar.php',
|
2013-02-13 16:28:14 +01:00
|
|
|
'PhabricatorApplicationChatLog' => 'applications/chatlog/applications/PhabricatorApplicationChatLog.php',
|
2012-10-01 21:56:10 +02:00
|
|
|
'PhabricatorApplicationConduit' => 'applications/conduit/application/PhabricatorApplicationConduit.php',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorApplicationConfig' => 'applications/config/application/PhabricatorApplicationConfig.php',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorApplicationConfigOptions' => 'applications/config/option/PhabricatorApplicationConfigOptions.php',
|
2013-01-25 02:23:05 +01:00
|
|
|
'PhabricatorApplicationConpherence' => 'applications/conpherence/application/PhabricatorApplicationConpherence.php',
|
2012-10-01 21:56:02 +02:00
|
|
|
'PhabricatorApplicationCountdown' => 'applications/countdown/application/PhabricatorApplicationCountdown.php',
|
2012-08-14 00:27:45 +02:00
|
|
|
'PhabricatorApplicationDaemons' => 'applications/daemon/application/PhabricatorApplicationDaemons.php',
|
2013-01-24 21:13:31 +01:00
|
|
|
'PhabricatorApplicationDetailViewController' => 'applications/meta/controller/PhabricatorApplicationDetailViewController.php',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorApplicationDifferential' => 'applications/differential/application/PhabricatorApplicationDifferential.php',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationDiffusion' => 'applications/diffusion/application/PhabricatorApplicationDiffusion.php',
|
2012-08-14 00:28:41 +02:00
|
|
|
'PhabricatorApplicationDiviner' => 'applications/diviner/application/PhabricatorApplicationDiviner.php',
|
2013-06-25 00:55:08 +02:00
|
|
|
'PhabricatorApplicationDoorkeeper' => 'applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php',
|
2012-10-31 17:57:57 +01:00
|
|
|
'PhabricatorApplicationDrydock' => 'applications/drydock/application/PhabricatorApplicationDrydock.php',
|
2013-10-03 21:40:08 +02:00
|
|
|
'PhabricatorApplicationEditController' => 'applications/meta/controller/PhabricatorApplicationEditController.php',
|
2012-07-30 19:44:08 +02:00
|
|
|
'PhabricatorApplicationFact' => 'applications/fact/application/PhabricatorApplicationFact.php',
|
2013-01-11 01:06:29 +01:00
|
|
|
'PhabricatorApplicationFeed' => 'applications/feed/application/PhabricatorApplicationFeed.php',
|
2012-10-01 23:05:12 +02:00
|
|
|
'PhabricatorApplicationFiles' => 'applications/files/application/PhabricatorApplicationFiles.php',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationFlags' => 'applications/flag/application/PhabricatorApplicationFlags.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
|
|
|
'PhabricatorApplicationHarbormaster' => 'applications/harbormaster/application/PhabricatorApplicationHarbormaster.php',
|
2012-10-01 21:56:10 +02:00
|
|
|
'PhabricatorApplicationHerald' => 'applications/herald/application/PhabricatorApplicationHerald.php',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationLaunchView' => 'applications/meta/view/PhabricatorApplicationLaunchView.php',
|
2013-07-03 20:15:45 +02:00
|
|
|
'PhabricatorApplicationLegalpad' => 'applications/legalpad/application/PhabricatorApplicationLegalpad.php',
|
2012-10-01 23:04:03 +02:00
|
|
|
'PhabricatorApplicationMacro' => 'applications/macro/application/PhabricatorApplicationMacro.php',
|
2012-08-13 04:19:46 +02:00
|
|
|
'PhabricatorApplicationMailingLists' => 'applications/mailinglists/application/PhabricatorApplicationMailingLists.php',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorApplicationManiphest' => 'applications/maniphest/application/PhabricatorApplicationManiphest.php',
|
2012-08-13 21:37:06 +02:00
|
|
|
'PhabricatorApplicationMetaMTA' => 'applications/metamta/application/PhabricatorApplicationMetaMTA.php',
|
2013-11-07 02:00:09 +01:00
|
|
|
'PhabricatorApplicationNuance' => 'applications/nuance/application/PhabricatorApplicationNuance.php',
|
2012-10-01 21:56:33 +02:00
|
|
|
'PhabricatorApplicationOwners' => 'applications/owners/application/PhabricatorApplicationOwners.php',
|
2013-10-03 21:39:15 +02:00
|
|
|
'PhabricatorApplicationPHIDTypeApplication' => 'applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php',
|
2012-12-21 21:12:26 +01:00
|
|
|
'PhabricatorApplicationPHPAST' => 'applications/phpast/application/PhabricatorApplicationPHPAST.php',
|
2012-08-15 19:45:06 +02:00
|
|
|
'PhabricatorApplicationPaste' => 'applications/paste/application/PhabricatorApplicationPaste.php',
|
2012-08-05 23:12:43 +02:00
|
|
|
'PhabricatorApplicationPeople' => 'applications/people/application/PhabricatorApplicationPeople.php',
|
2012-10-02 00:37:02 +02:00
|
|
|
'PhabricatorApplicationPhame' => 'applications/phame/application/PhabricatorApplicationPhame.php',
|
2013-03-21 02:01:52 +01:00
|
|
|
'PhabricatorApplicationPhlux' => 'applications/phlux/application/PhabricatorApplicationPhlux.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
|
|
|
'PhabricatorApplicationPholio' => 'applications/pholio/application/PhabricatorApplicationPholio.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
|
|
|
'PhabricatorApplicationPhortune' => 'applications/phortune/application/PhabricatorApplicationPhortune.php',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhabricatorApplicationPhrequent' => 'applications/phrequent/application/PhabricatorApplicationPhrequent.php',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationPhriction' => 'applications/phriction/application/PhabricatorApplicationPhriction.php',
|
2013-09-27 17:43:41 +02:00
|
|
|
'PhabricatorApplicationPolicy' => 'applications/policy/application/PhabricatorApplicationPolicy.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PhabricatorApplicationPonder' => 'applications/ponder/application/PhabricatorApplicationPonder.php',
|
2012-08-07 20:54:49 +02:00
|
|
|
'PhabricatorApplicationProject' => 'applications/project/application/PhabricatorApplicationProject.php',
|
2013-10-02 22:13:07 +02:00
|
|
|
'PhabricatorApplicationQuery' => 'applications/meta/query/PhabricatorApplicationQuery.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'PhabricatorApplicationReleeph' => 'applications/releeph/application/PhabricatorApplicationReleeph.php',
|
|
|
|
'PhabricatorApplicationReleephConfigOptions' => 'applications/releeph/config/PhabricatorApplicationReleephConfigOptions.php',
|
2012-10-01 21:56:33 +02:00
|
|
|
'PhabricatorApplicationRepositories' => 'applications/repository/application/PhabricatorApplicationRepositories.php',
|
2013-04-15 15:43:39 +02:00
|
|
|
'PhabricatorApplicationSearch' => 'applications/search/application/PhabricatorApplicationSearch.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',
|
2013-05-30 23:09:02 +02:00
|
|
|
'PhabricatorApplicationSearchResultsControllerInterface' => 'applications/search/interface/PhabricatorApplicationSearchResultsControllerInterface.php',
|
2012-08-13 21:37:18 +02:00
|
|
|
'PhabricatorApplicationSettings' => 'applications/settings/application/PhabricatorApplicationSettings.php',
|
2012-10-01 21:56:02 +02:00
|
|
|
'PhabricatorApplicationSlowvote' => 'applications/slowvote/application/PhabricatorApplicationSlowvote.php',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationStatusView' => 'applications/meta/view/PhabricatorApplicationStatusView.php',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorApplicationSubscriptions' => 'applications/subscriptions/application/PhabricatorApplicationSubscriptions.php',
|
2013-10-04 04:05:47 +02:00
|
|
|
'PhabricatorApplicationTest' => 'applications/base/controller/__tests__/PhabricatorApplicationTest.php',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorApplicationTokens' => 'applications/tokens/application/PhabricatorApplicationTokens.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',
|
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',
|
2013-07-29 15:51:19 +02:00
|
|
|
'PhabricatorApplicationTransactionPHIDTypeTransaction' => 'applications/transactions/phid/PhabricatorApplicationTransactionPHIDTypeTransaction.php',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionQuery.php',
|
2012-12-11 23:02:29 +01:00
|
|
|
'PhabricatorApplicationTransactionResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionResponse.php',
|
2013-02-17 15:37:02 +01:00
|
|
|
'PhabricatorApplicationTransactionTextDiffDetailView' => 'applications/transactions/view/PhabricatorApplicationTransactionTextDiffDetailView.php',
|
2013-09-19 00:31:58 +02:00
|
|
|
'PhabricatorApplicationTransactionValidationError' => 'applications/transactions/error/PhabricatorApplicationTransactionValidationError.php',
|
|
|
|
'PhabricatorApplicationTransactionValidationException' => 'applications/transactions/exception/PhabricatorApplicationTransactionValidationException.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',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactions' => 'applications/transactions/application/PhabricatorApplicationTransactions.php',
|
2012-09-11 18:56:40 +02:00
|
|
|
'PhabricatorApplicationUIExamples' => 'applications/uiexample/application/PhabricatorApplicationUIExamples.php',
|
2013-01-29 18:14:03 +01:00
|
|
|
'PhabricatorApplicationUninstallController' => 'applications/meta/controller/PhabricatorApplicationUninstallController.php',
|
2013-04-02 18:52:52 +02:00
|
|
|
'PhabricatorApplicationXHProf' => 'applications/xhprof/application/PhabricatorApplicationXHProf.php',
|
2013-01-19 22:46:48 +01:00
|
|
|
'PhabricatorApplicationsController' => 'applications/meta/controller/PhabricatorApplicationsController.php',
|
|
|
|
'PhabricatorApplicationsListController' => 'applications/meta/controller/PhabricatorApplicationsListController.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorAuditActionConstants' => 'applications/audit/constants/PhabricatorAuditActionConstants.php',
|
|
|
|
'PhabricatorAuditAddCommentController' => 'applications/audit/controller/PhabricatorAuditAddCommentController.php',
|
|
|
|
'PhabricatorAuditComment' => 'applications/audit/storage/PhabricatorAuditComment.php',
|
|
|
|
'PhabricatorAuditCommentEditor' => 'applications/audit/editor/PhabricatorAuditCommentEditor.php',
|
|
|
|
'PhabricatorAuditCommitListView' => 'applications/audit/view/PhabricatorAuditCommitListView.php',
|
|
|
|
'PhabricatorAuditCommitQuery' => 'applications/audit/query/PhabricatorAuditCommitQuery.php',
|
|
|
|
'PhabricatorAuditCommitStatusConstants' => 'applications/audit/constants/PhabricatorAuditCommitStatusConstants.php',
|
|
|
|
'PhabricatorAuditController' => 'applications/audit/controller/PhabricatorAuditController.php',
|
|
|
|
'PhabricatorAuditDAO' => 'applications/audit/storage/PhabricatorAuditDAO.php',
|
|
|
|
'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',
|
|
|
|
'PhabricatorAuditQuery' => 'applications/audit/query/PhabricatorAuditQuery.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',
|
2013-06-17 16:08:50 +02:00
|
|
|
'PhabricatorAuthAccountView' => 'applications/auth/view/PhabricatorAuthAccountView.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',
|
2013-06-17 19:52:38 +02:00
|
|
|
'PhabricatorAuthEditController' => 'applications/auth/controller/config/PhabricatorAuthEditController.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',
|
2013-06-17 22:26:25 +02:00
|
|
|
'PhabricatorAuthManagementLDAPWorkflow' => 'applications/auth/management/PhabricatorAuthManagementLDAPWorkflow.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',
|
2013-06-17 19:55:05 +02:00
|
|
|
'PhabricatorAuthManagementWorkflow' => 'applications/auth/management/PhabricatorAuthManagementWorkflow.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',
|
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',
|
2013-06-16 19:18:34 +02:00
|
|
|
'PhabricatorAuthProviderLDAP' => 'applications/auth/provider/PhabricatorAuthProviderLDAP.php',
|
2013-06-16 19:15:16 +02:00
|
|
|
'PhabricatorAuthProviderOAuth' => 'applications/auth/provider/PhabricatorAuthProviderOAuth.php',
|
2013-09-03 14:53:08 +02:00
|
|
|
'PhabricatorAuthProviderOAuth1' => 'applications/auth/provider/PhabricatorAuthProviderOAuth1.php',
|
2013-09-03 14:53:21 +02:00
|
|
|
'PhabricatorAuthProviderOAuth1JIRA' => 'applications/auth/provider/PhabricatorAuthProviderOAuth1JIRA.php',
|
2013-09-03 14:53:08 +02:00
|
|
|
'PhabricatorAuthProviderOAuth1Twitter' => 'applications/auth/provider/PhabricatorAuthProviderOAuth1Twitter.php',
|
2013-06-20 20:19:11 +02:00
|
|
|
'PhabricatorAuthProviderOAuthAmazon' => 'applications/auth/provider/PhabricatorAuthProviderOAuthAmazon.php',
|
|
|
|
'PhabricatorAuthProviderOAuthAsana' => 'applications/auth/provider/PhabricatorAuthProviderOAuthAsana.php',
|
2013-06-16 19:16:14 +02:00
|
|
|
'PhabricatorAuthProviderOAuthDisqus' => 'applications/auth/provider/PhabricatorAuthProviderOAuthDisqus.php',
|
2013-06-16 19:15:16 +02:00
|
|
|
'PhabricatorAuthProviderOAuthFacebook' => 'applications/auth/provider/PhabricatorAuthProviderOAuthFacebook.php',
|
2013-06-16 19:17:29 +02:00
|
|
|
'PhabricatorAuthProviderOAuthGitHub' => 'applications/auth/provider/PhabricatorAuthProviderOAuthGitHub.php',
|
2013-06-16 19:18:04 +02:00
|
|
|
'PhabricatorAuthProviderOAuthGoogle' => 'applications/auth/provider/PhabricatorAuthProviderOAuthGoogle.php',
|
2013-08-08 22:34:30 +02:00
|
|
|
'PhabricatorAuthProviderOAuthTwitch' => 'applications/auth/provider/PhabricatorAuthProviderOAuthTwitch.php',
|
Add password authentication and registration to new registration
Summary:
Ref T1536. Ref T1930. Code is not reachable.
This provides password authentication and registration on the new provider/adapter framework.
I sort of cheated a little bit and don't really route any password logic through the adapter (instead, this provider uses an empty adapter and just sets the type/domain on it). I think the right way to do this //conceptually// is to treat username/passwords as an external black box which the adapter communicates with. However, this creates a lot of practical implementation and UX problems:
- There would basically be two steps -- in the first one, you interact with the "password black box", which behaves like an OAuth provider. This produces some ExternalAccount associated with the username/password pair, then we go into normal registration.
- In normal registration, we'd proceed normally.
This means:
- The registration flow would be split into two parts, one where you select a username/password (interacting with the black box) and one where you actually register (interacting with the generic flow). This is unusual and probably confusing for users.
- We would need to do a lot of re-hashing of passwords, since passwords currently depend on the username and user PHID, which won't exist yet during registration or the "black box" phase. This is a big mess I don't want to deal with.
- We hit a weird condition where two users complete step 1 with the same username but don't complete step 2 yet. The box knows about two different copies of the username, with two different passwords. When we arrive at step 2 the second time we have a lot of bad choices about how to reoslve it, most of which create security problems. The most stragihtforward and "pure" way to resolve the issues is to put password-auth usernames in a separate space, but this would be incredibly confusuing to users (your login name might not be the same as your username, which is bizarre).
- If we change this, we need to update all the other password-related code, which I don't want to bother with (at least for now).
Instead, let registration know about a "default" registration controller (which is always password, if enabled), and let it require a password. This gives us a much simpler (albeit slightly less pure) implementation:
- All the fields are on one form.
- Password adapter is just a shell.
- Password provider does the heavy lifting.
We might make this more pure at some point, but I'm generally pretty satisfied with this.
This doesn't implement the brute-force CAPTCHA protection, that will be coming soon.
Test Plan: Registered with password only and logged in with a password. Hit various error conditions.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, chad
Maniphest Tasks: T1536, T1930
Differential Revision: https://secure.phabricator.com/D6164
2013-06-16 19:15:49 +02:00
|
|
|
'PhabricatorAuthProviderPassword' => 'applications/auth/provider/PhabricatorAuthProviderPassword.php',
|
2013-10-14 23:34:57 +02:00
|
|
|
'PhabricatorAuthProviderPersona' => 'applications/auth/provider/PhabricatorAuthProviderPersona.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',
|
2013-06-16 19:15:16 +02:00
|
|
|
'PhabricatorAuthStartController' => 'applications/auth/controller/PhabricatorAuthStartController.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',
|
2012-10-16 19:33:47 +02:00
|
|
|
'PhabricatorBarePageExample' => 'applications/uiexample/examples/PhabricatorBarePageExample.php',
|
|
|
|
'PhabricatorBarePageView' => 'view/page/PhabricatorBarePageView.php',
|
2012-06-15 04:01:57 +02:00
|
|
|
'PhabricatorBaseEnglishTranslation' => 'infrastructure/internationalization/PhabricatorBaseEnglishTranslation.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
|
|
|
'PhabricatorBaseProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorBaseProtocolAdapter.php',
|
|
|
|
'PhabricatorBot' => 'infrastructure/daemon/bot/PhabricatorBot.php',
|
2013-02-16 05:24:23 +01:00
|
|
|
'PhabricatorBotBaseStreamingProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorBotBaseStreamingProtocolAdapter.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',
|
|
|
|
'PhabricatorBotDifferentialNotificationHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotDifferentialNotificationHandler.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',
|
2012-07-02 19:49:00 +02:00
|
|
|
'PhabricatorBuiltinPatchList' => 'infrastructure/storage/patch/PhabricatorBuiltinPatchList.php',
|
2013-07-04 05:24:28 +02:00
|
|
|
'PhabricatorBusyExample' => 'applications/uiexample/examples/PhabricatorBusyExample.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',
|
2013-05-20 19:16:35 +02:00
|
|
|
'PhabricatorCacheManagementPurgeWorkflow' => 'applications/cache/management/PhabricatorCacheManagementPurgeWorkflow.php',
|
|
|
|
'PhabricatorCacheManagementWorkflow' => 'applications/cache/management/PhabricatorCacheManagementWorkflow.php',
|
2012-12-25 15:09:51 +01:00
|
|
|
'PhabricatorCaches' => 'applications/cache/PhabricatorCaches.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCalendarBrowseController' => 'applications/calendar/controller/PhabricatorCalendarBrowseController.php',
|
|
|
|
'PhabricatorCalendarController' => 'applications/calendar/controller/PhabricatorCalendarController.php',
|
|
|
|
'PhabricatorCalendarDAO' => 'applications/calendar/storage/PhabricatorCalendarDAO.php',
|
2012-10-24 22:22:24 +02:00
|
|
|
'PhabricatorCalendarDeleteStatusController' => 'applications/calendar/controller/PhabricatorCalendarDeleteStatusController.php',
|
|
|
|
'PhabricatorCalendarEditStatusController' => 'applications/calendar/controller/PhabricatorCalendarEditStatusController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCalendarHoliday' => 'applications/calendar/storage/PhabricatorCalendarHoliday.php',
|
|
|
|
'PhabricatorCalendarHolidayTestCase' => 'applications/calendar/storage/__tests__/PhabricatorCalendarHolidayTestCase.php',
|
2012-10-24 22:22:24 +02:00
|
|
|
'PhabricatorCalendarViewStatusController' => 'applications/calendar/controller/PhabricatorCalendarViewStatusController.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorChangesetResponse' => 'infrastructure/diff/PhabricatorChangesetResponse.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',
|
2013-02-22 15:59:17 +01:00
|
|
|
'PhabricatorChatLogChannelQuery' => 'applications/chatlog/PhabricatorChatLogChannelQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorChatLogConstants' => 'applications/chatlog/constants/PhabricatorChatLogConstants.php',
|
|
|
|
'PhabricatorChatLogController' => 'applications/chatlog/controller/PhabricatorChatLogController.php',
|
|
|
|
'PhabricatorChatLogDAO' => 'applications/chatlog/storage/PhabricatorChatLogDAO.php',
|
|
|
|
'PhabricatorChatLogEvent' => 'applications/chatlog/storage/PhabricatorChatLogEvent.php',
|
|
|
|
'PhabricatorChatLogEventType' => 'applications/chatlog/constants/PhabricatorChatLogEventType.php',
|
|
|
|
'PhabricatorChatLogQuery' => 'applications/chatlog/PhabricatorChatLogQuery.php',
|
|
|
|
'PhabricatorConduitAPIController' => 'applications/conduit/controller/PhabricatorConduitAPIController.php',
|
|
|
|
'PhabricatorConduitCertificateToken' => 'applications/conduit/storage/PhabricatorConduitCertificateToken.php',
|
2013-05-19 13:16:09 +02:00
|
|
|
'PhabricatorConduitConfigOptions' => 'applications/conduit/config/PhabricatorConduitConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorConduitConnectionLog' => 'applications/conduit/storage/PhabricatorConduitConnectionLog.php',
|
|
|
|
'PhabricatorConduitConsoleController' => 'applications/conduit/controller/PhabricatorConduitConsoleController.php',
|
|
|
|
'PhabricatorConduitController' => 'applications/conduit/controller/PhabricatorConduitController.php',
|
|
|
|
'PhabricatorConduitDAO' => 'applications/conduit/storage/PhabricatorConduitDAO.php',
|
|
|
|
'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',
|
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',
|
|
|
|
'PhabricatorConduitSearchEngine' => 'applications/conduit/query/PhabricatorConduitSearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorConduitTokenController' => 'applications/conduit/controller/PhabricatorConduitTokenController.php',
|
2013-01-16 20:10:41 +01:00
|
|
|
'PhabricatorConfigAllController' => 'applications/config/controller/PhabricatorConfigAllController.php',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigController' => 'applications/config/controller/PhabricatorConfigController.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',
|
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',
|
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',
|
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',
|
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',
|
|
|
|
'PhabricatorConfigManagementSetWorkflow' => 'applications/config/management/PhabricatorConfigManagementSetWorkflow.php',
|
|
|
|
'PhabricatorConfigManagementWorkflow' => 'applications/config/management/PhabricatorConfigManagementWorkflow.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',
|
2013-07-22 00:04:21 +02:00
|
|
|
'PhabricatorConfigPHIDTypeConfig' => 'applications/config/phid/PhabricatorConfigPHIDTypeConfig.php',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigProxySource' => 'infrastructure/env/PhabricatorConfigProxySource.php',
|
2013-01-23 00:16:26 +01:00
|
|
|
'PhabricatorConfigResponse' => 'applications/config/response/PhabricatorConfigResponse.php',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigSource' => 'infrastructure/env/PhabricatorConfigSource.php',
|
|
|
|
'PhabricatorConfigStackSource' => 'infrastructure/env/PhabricatorConfigStackSource.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',
|
2013-07-26 21:07:47 +02:00
|
|
|
'PhabricatorConpherencePHIDTypeThread' => 'applications/conpherence/phid/PhabricatorConpherencePHIDTypeThread.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorContentSource' => 'applications/metamta/contentsource/PhabricatorContentSource.php',
|
|
|
|
'PhabricatorContentSourceView' => 'applications/metamta/contentsource/PhabricatorContentSourceView.php',
|
|
|
|
'PhabricatorController' => 'applications/base/controller/PhabricatorController.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',
|
2013-10-16 19:36:08 +02:00
|
|
|
'PhabricatorCountdownCapabilityDefaultView' => 'applications/countdown/capability/PhabricatorCountdownCapabilityDefaultView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCountdownController' => 'applications/countdown/controller/PhabricatorCountdownController.php',
|
|
|
|
'PhabricatorCountdownDAO' => 'applications/countdown/storage/PhabricatorCountdownDAO.php',
|
|
|
|
'PhabricatorCountdownDeleteController' => 'applications/countdown/controller/PhabricatorCountdownDeleteController.php',
|
|
|
|
'PhabricatorCountdownEditController' => 'applications/countdown/controller/PhabricatorCountdownEditController.php',
|
|
|
|
'PhabricatorCountdownListController' => 'applications/countdown/controller/PhabricatorCountdownListController.php',
|
2013-07-22 23:42:25 +02:00
|
|
|
'PhabricatorCountdownPHIDTypeCountdown' => 'applications/countdown/phid/PhabricatorCountdownPHIDTypeCountdown.php',
|
|
|
|
'PhabricatorCountdownQuery' => 'applications/countdown/query/PhabricatorCountdownQuery.php',
|
2013-02-26 23:57:41 +01:00
|
|
|
'PhabricatorCountdownRemarkupRule' => 'applications/countdown/remarkup/PhabricatorCountdownRemarkupRule.php',
|
2013-07-23 15:16:19 +02:00
|
|
|
'PhabricatorCountdownSearchEngine' => 'applications/countdown/query/PhabricatorCountdownSearchEngine.php',
|
|
|
|
'PhabricatorCountdownView' => 'applications/countdown/view/PhabricatorCountdownView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorCountdownViewController' => 'applications/countdown/controller/PhabricatorCountdownViewController.php',
|
2012-12-07 22:35:17 +01:00
|
|
|
'PhabricatorCrumbView' => 'view/layout/PhabricatorCrumbView.php',
|
|
|
|
'PhabricatorCrumbsView' => 'view/layout/PhabricatorCrumbsView.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',
|
|
|
|
'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',
|
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',
|
|
|
|
'PhabricatorCustomFieldStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldStorage.php',
|
|
|
|
'PhabricatorCustomFieldStringIndexStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldStringIndexStorage.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDaemon' => 'infrastructure/daemon/PhabricatorDaemon.php',
|
|
|
|
'PhabricatorDaemonCombinedLogController' => 'applications/daemon/controller/PhabricatorDaemonCombinedLogController.php',
|
|
|
|
'PhabricatorDaemonConsoleController' => 'applications/daemon/controller/PhabricatorDaemonConsoleController.php',
|
|
|
|
'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',
|
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',
|
|
|
|
'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',
|
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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDaemonReference' => 'infrastructure/daemon/control/PhabricatorDaemonReference.php',
|
2013-07-21 18:27:00 +02:00
|
|
|
'PhabricatorDataNotAttachedException' => 'infrastructure/storage/lisk/PhabricatorDataNotAttachedException.php',
|
2013-03-04 22:45:51 +01:00
|
|
|
'PhabricatorDebugController' => 'applications/system/PhabricatorDebugController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDefaultFileStorageEngineSelector' => 'applications/files/engineselector/PhabricatorDefaultFileStorageEngineSelector.php',
|
|
|
|
'PhabricatorDefaultSearchEngineSelector' => 'applications/search/selector/PhabricatorDefaultSearchEngineSelector.php',
|
2013-01-01 23:09:17 +01:00
|
|
|
'PhabricatorDeveloperConfigOptions' => 'applications/config/option/PhabricatorDeveloperConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDifferenceEngine' => 'infrastructure/diff/PhabricatorDifferenceEngine.php',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorDifferentialConfigOptions' => 'applications/differential/config/PhabricatorDifferentialConfigOptions.php',
|
2013-05-06 23:11:26 +02:00
|
|
|
'PhabricatorDifferentialRevisionTestDataGenerator' => 'applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php',
|
2013-01-16 18:08:13 +01:00
|
|
|
'PhabricatorDiffusionConfigOptions' => 'applications/diffusion/config/PhabricatorDiffusionConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDirectoryController' => 'applications/directory/controller/PhabricatorDirectoryController.php',
|
|
|
|
'PhabricatorDirectoryMainController' => 'applications/directory/controller/PhabricatorDirectoryMainController.php',
|
|
|
|
'PhabricatorDisabledUserController' => 'applications/auth/controller/PhabricatorDisabledUserController.php',
|
2013-01-01 23:09:29 +01:00
|
|
|
'PhabricatorDisqusConfigOptions' => 'applications/config/option/PhabricatorDisqusConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorDraft' => 'applications/draft/storage/PhabricatorDraft.php',
|
|
|
|
'PhabricatorDraftDAO' => 'applications/draft/storage/PhabricatorDraftDAO.php',
|
|
|
|
'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',
|
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',
|
2012-10-10 19:18:23 +02:00
|
|
|
'PhabricatorEditor' => 'infrastructure/PhabricatorEditor.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorEmailLoginController' => 'applications/auth/controller/PhabricatorEmailLoginController.php',
|
|
|
|
'PhabricatorEmailTokenController' => 'applications/auth/controller/PhabricatorEmailTokenController.php',
|
2013-07-11 03:53:09 +02:00
|
|
|
'PhabricatorEmailVerificationController' => 'applications/auth/controller/PhabricatorEmailVerificationController.php',
|
2013-03-01 20:28:02 +01:00
|
|
|
'PhabricatorEmptyQueryException' => 'infrastructure/query/PhabricatorEmptyQueryException.php',
|
2012-06-14 22:43:09 +02:00
|
|
|
'PhabricatorEnglishTranslation' => 'infrastructure/internationalization/PhabricatorEnglishTranslation.php',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorEnv' => 'infrastructure/env/PhabricatorEnv.php',
|
|
|
|
'PhabricatorEnvTestCase' => 'infrastructure/env/__tests__/PhabricatorEnvTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorErrorExample' => 'applications/uiexample/examples/PhabricatorErrorExample.php',
|
|
|
|
'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',
|
2013-01-03 00:52:30 +01:00
|
|
|
'PhabricatorExtendingPhabricatorConfigOptions' => 'applications/config/option/PhabricatorExtendingPhabricatorConfigOptions.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',
|
2012-07-27 22:46:01 +02:00
|
|
|
'PhabricatorFactAggregate' => 'applications/fact/storage/PhabricatorFactAggregate.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',
|
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',
|
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
|
|
|
'PhabricatorFeedConstants' => 'applications/feed/constants/PhabricatorFeedConstants.php',
|
|
|
|
'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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFeedPublicStreamController' => 'applications/feed/controller/PhabricatorFeedPublicStreamController.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',
|
2012-07-01 20:08:59 +02:00
|
|
|
'PhabricatorFeedStoryAggregate' => 'applications/feed/story/PhabricatorFeedStoryAggregate.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFeedStoryAudit' => 'applications/feed/story/PhabricatorFeedStoryAudit.php',
|
2012-06-20 15:03:44 +02:00
|
|
|
'PhabricatorFeedStoryCommit' => 'applications/feed/story/PhabricatorFeedStoryCommit.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFeedStoryData' => 'applications/feed/storage/PhabricatorFeedStoryData.php',
|
|
|
|
'PhabricatorFeedStoryDifferential' => 'applications/feed/story/PhabricatorFeedStoryDifferential.php',
|
2012-08-22 17:19:38 +02:00
|
|
|
'PhabricatorFeedStoryDifferentialAggregate' => 'applications/feed/story/PhabricatorFeedStoryDifferentialAggregate.php',
|
2012-07-01 20:08:59 +02:00
|
|
|
'PhabricatorFeedStoryManiphestAggregate' => 'applications/feed/story/PhabricatorFeedStoryManiphestAggregate.php',
|
2012-06-08 15:31:30 +02:00
|
|
|
'PhabricatorFeedStoryNotification' => 'applications/notification/storage/PhabricatorFeedStoryNotification.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFeedStoryPhriction' => 'applications/feed/story/PhabricatorFeedStoryPhriction.php',
|
|
|
|
'PhabricatorFeedStoryPublisher' => 'applications/feed/PhabricatorFeedStoryPublisher.php',
|
|
|
|
'PhabricatorFeedStoryReference' => 'applications/feed/storage/PhabricatorFeedStoryReference.php',
|
|
|
|
'PhabricatorFeedStoryStatus' => 'applications/feed/story/PhabricatorFeedStoryStatus.php',
|
|
|
|
'PhabricatorFeedStoryTypeConstants' => 'applications/feed/constants/PhabricatorFeedStoryTypeConstants.php',
|
|
|
|
'PhabricatorFile' => 'applications/files/storage/PhabricatorFile.php',
|
2013-09-30 21:21:33 +02:00
|
|
|
'PhabricatorFileBundleLoader' => 'applications/files/query/PhabricatorFileBundleLoader.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',
|
2013-09-05 22:11:02 +02:00
|
|
|
'PhabricatorFileEditor' => 'applications/files/editor/PhabricatorFileEditor.php',
|
2012-10-01 23:04:03 +02:00
|
|
|
'PhabricatorFileImageMacro' => 'applications/macro/storage/PhabricatorFileImageMacro.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileInfoController' => 'applications/files/controller/PhabricatorFileInfoController.php',
|
2012-10-23 04:06:56 +02:00
|
|
|
'PhabricatorFileLinkListView' => 'view/layout/PhabricatorFileLinkListView.php',
|
|
|
|
'PhabricatorFileLinkView' => 'view/layout/PhabricatorFileLinkView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileListController' => 'applications/files/controller/PhabricatorFileListController.php',
|
2013-07-22 17:02:56 +02:00
|
|
|
'PhabricatorFilePHIDTypeFile' => 'applications/files/phid/PhabricatorFilePHIDTypeFile.php',
|
2012-10-31 17:57:46 +01:00
|
|
|
'PhabricatorFileQuery' => 'applications/files/query/PhabricatorFileQuery.php',
|
2013-05-31 19:51:05 +02:00
|
|
|
'PhabricatorFileSearchEngine' => 'applications/files/query/PhabricatorFileSearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileShortcutController' => 'applications/files/controller/PhabricatorFileShortcutController.php',
|
|
|
|
'PhabricatorFileStorageBlob' => 'applications/files/storage/PhabricatorFileStorageBlob.php',
|
|
|
|
'PhabricatorFileStorageConfigurationException' => 'applications/files/exception/PhabricatorFileStorageConfigurationException.php',
|
|
|
|
'PhabricatorFileStorageEngine' => 'applications/files/engine/PhabricatorFileStorageEngine.php',
|
|
|
|
'PhabricatorFileStorageEngineSelector' => 'applications/files/engineselector/PhabricatorFileStorageEngineSelector.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',
|
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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFileTransformController' => 'applications/files/controller/PhabricatorFileTransformController.php',
|
|
|
|
'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',
|
2013-01-14 02:01:00 +01:00
|
|
|
'PhabricatorFilesConfigOptions' => 'applications/files/config/PhabricatorFilesConfigOptions.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFlag' => 'applications/flag/storage/PhabricatorFlag.php',
|
|
|
|
'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',
|
|
|
|
'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',
|
2012-08-24 22:19:47 +02:00
|
|
|
'PhabricatorFlagsUIEventListener' => 'applications/flag/events/PhabricatorFlagsUIEventListener.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorFormExample' => 'applications/uiexample/examples/PhabricatorFormExample.php',
|
2013-01-02 23:03:08 +01:00
|
|
|
'PhabricatorGarbageCollectorConfigOptions' => 'applications/config/option/PhabricatorGarbageCollectorConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorGarbageCollectorDaemon' => 'infrastructure/daemon/PhabricatorGarbageCollectorDaemon.php',
|
Add support for device swipe events
Summary:
Ref T2700. Allow JS to listen for swipes on devices.
There are a bunch of tricky cases here and I probably didn't get them all totally right, but this interaction broadly looks like this:
- We implement gesture recognition for the mouse in device modes (narrow browser), and for touch events from an actual device.
- The sigil `touchable` indicates that a node wants to react to touch events.
- When the user touches a `touchable` node, we start listening for moves. They might be tapping/clicking (in which case we don't care), but they might also be gesturing.
- Once the user moves their finger/pointer far enough away from the tap origin, we recognize it as a gesture. I hardcoded this at 20px; I wasn't able to find any "official" Apple value, but 20px seems like a common default.
- At this point, we look at where their finger has moved.
- If they moved it mostly up/down, we interpret the gesture as "scroll" and just stop listening. The device does its own thing.
- However, if they moved it mostly left/right, we interpret it as a "swipe". We start killing the moves so the device doesn't scroll.
- Once we've recognized that a gesture is underway, we send a "gesture.swipe.start" event and then "gesture.swipe.move" events for every move.
- When the user ends the gesture, we send "gesture.swipe.end".
- If the user cancels the gesture (currently, only by tapping with a second finger), we send "gesture.swipe.cancel".
- Gesture events have raw position data and some convenience fields.
Test Plan:
Wrote UI example and used it from the Desktop, iPhone simulator, and a real iphone.
- The code always seems to get "scroll" vs "swipe" correct (i.e., consistent with my intentions).
- The threshold feels pretty good to me.
- Tapping with a second finger cancels the action.
Reviewers: chad, btrahan
Reviewed By: chad
CC: aran
Maniphest Tasks: T2700
Differential Revision: https://secure.phabricator.com/D5308
2013-03-09 22:53:15 +01:00
|
|
|
'PhabricatorGestureExample' => 'applications/uiexample/examples/PhabricatorGestureExample.php',
|
2012-06-26 00:21:48 +02:00
|
|
|
'PhabricatorGitGraphStream' => 'applications/repository/daemon/PhabricatorGitGraphStream.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorHandleObjectSelectorDataView' => 'applications/phid/handle/view/PhabricatorHandleObjectSelectorDataView.php',
|
2013-07-21 16:03:10 +02:00
|
|
|
'PhabricatorHandleQuery' => 'applications/phid/query/PhabricatorHandleQuery.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorHelpController' => 'applications/help/controller/PhabricatorHelpController.php',
|
|
|
|
'PhabricatorHelpKeyboardShortcutController' => 'applications/help/controller/PhabricatorHelpKeyboardShortcutController.php',
|
2013-04-02 18:15:33 +02:00
|
|
|
'PhabricatorHovercardExample' => 'applications/uiexample/examples/PhabricatorHovercardExample.php',
|
|
|
|
'PhabricatorHovercardView' => 'view/widget/hovercard/PhabricatorHovercardView.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
|
|
|
'PhabricatorIRCBot' => 'infrastructure/daemon/bot/PhabricatorIRCBot.php',
|
|
|
|
'PhabricatorIRCProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorIRCProtocolAdapter.php',
|
|
|
|
'PhabricatorIRCProtocolHandler' => 'infrastructure/daemon/bot/handler/PhabricatorIRCProtocolHandler.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorImageTransformer' => 'applications/files/PhabricatorImageTransformer.php',
|
2012-05-30 23:26:29 +02:00
|
|
|
'PhabricatorInfrastructureTestCase' => 'infrastructure/__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',
|
|
|
|
'PhabricatorJavelinLinter' => 'infrastructure/lint/linter/PhabricatorJavelinLinter.php',
|
|
|
|
'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',
|
2013-07-04 01:37:05 +02:00
|
|
|
'PhabricatorLegalpadConfigOptions' => 'applications/legalpad/config/PhabricatorLegalpadConfigOptions.php',
|
2013-07-26 21:05:33 +02:00
|
|
|
'PhabricatorLegalpadPHIDTypeDocument' => 'applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorLintEngine' => 'infrastructure/lint/PhabricatorLintEngine.php',
|
2013-04-16 17:19:45 +02:00
|
|
|
'PhabricatorLipsumArtist' => 'applications/lipsum/image/PhabricatorLipsumArtist.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorLocalDiskFileStorageEngine' => 'applications/files/engine/PhabricatorLocalDiskFileStorageEngine.php',
|
|
|
|
'PhabricatorLocalTimeTestCase' => 'view/__tests__/PhabricatorLocalTimeTestCase.php',
|
|
|
|
'PhabricatorLogoutController' => 'applications/auth/controller/PhabricatorLogoutController.php',
|
2013-09-28 01:01:37 +02:00
|
|
|
'PhabricatorMacroAudioController' => 'applications/macro/controller/PhabricatorMacroAudioController.php',
|
2013-10-16 19:35:52 +02:00
|
|
|
'PhabricatorMacroCapabilityManage' => 'applications/macro/capability/PhabricatorMacroCapabilityManage.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',
|
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',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorMacroMailReceiver' => 'applications/macro/mail/PhabricatorMacroMailReceiver.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',
|
2013-07-24 23:06:10 +02:00
|
|
|
'PhabricatorMacroPHIDTypeMacro' => 'applications/macro/phid/PhabricatorMacroPHIDTypeMacro.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',
|
|
|
|
'PhabricatorMacroTransactionType' => 'applications/macro/constants/PhabricatorMacroTransactionType.php',
|
|
|
|
'PhabricatorMacroViewController' => 'applications/macro/controller/PhabricatorMacroViewController.php',
|
2013-03-01 02:15:09 +01:00
|
|
|
'PhabricatorMail' => 'applications/metamta/PhabricatorMail.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMailImplementationAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationAdapter.php',
|
|
|
|
'PhabricatorMailImplementationAmazonSESAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationAmazonSESAdapter.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',
|
2013-03-30 23:53:49 +01:00
|
|
|
'PhabricatorMailManagementWorkflow' => 'applications/metamta/management/PhabricatorMailManagementWorkflow.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',
|
2013-07-21 19:42:07 +02:00
|
|
|
'PhabricatorMailingListPHIDTypeList' => 'applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php',
|
|
|
|
'PhabricatorMailingListQuery' => 'applications/mailinglists/query/PhabricatorMailingListQuery.php',
|
|
|
|
'PhabricatorMailingListSearchEngine' => 'applications/mailinglists/query/PhabricatorMailingListSearchEngine.php',
|
2013-01-24 01:36:21 +01:00
|
|
|
'PhabricatorMailingListsController' => 'applications/mailinglists/controller/PhabricatorMailingListsController.php',
|
2012-08-13 04:19:46 +02:00
|
|
|
'PhabricatorMailingListsEditController' => 'applications/mailinglists/controller/PhabricatorMailingListsEditController.php',
|
|
|
|
'PhabricatorMailingListsListController' => 'applications/mailinglists/controller/PhabricatorMailingListsListController.php',
|
2012-07-31 01:09:14 +02:00
|
|
|
'PhabricatorMainMenuGroupView' => 'view/page/menu/PhabricatorMainMenuGroupView.php',
|
|
|
|
'PhabricatorMainMenuIconView' => 'view/page/menu/PhabricatorMainMenuIconView.php',
|
|
|
|
'PhabricatorMainMenuSearchView' => 'view/page/menu/PhabricatorMainMenuSearchView.php',
|
|
|
|
'PhabricatorMainMenuView' => 'view/page/menu/PhabricatorMainMenuView.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',
|
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',
|
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',
|
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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMetaMTAMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAMailTestCase.php',
|
2012-08-13 04:19:46 +02:00
|
|
|
'PhabricatorMetaMTAMailingList' => 'applications/mailinglists/storage/PhabricatorMetaMTAMailingList.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorMetaMTASendGridReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php',
|
|
|
|
'PhabricatorMetaMTAWorker' => 'applications/metamta/PhabricatorMetaMTAWorker.php',
|
2013-04-02 20:23:24 +02:00
|
|
|
'PhabricatorMultiColumnExample' => 'applications/uiexample/examples/PhabricatorMultiColumnExample.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',
|
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',
|
2013-03-08 02:23:30 +01:00
|
|
|
'PhabricatorNoteExample' => 'applications/uiexample/examples/PhabricatorNoteExample.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',
|
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',
|
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',
|
2012-06-08 15:31:30 +02:00
|
|
|
'PhabricatorNotificationQuery' => 'applications/notification/PhabricatorNotificationQuery.php',
|
2012-06-17 20:35:18 +02:00
|
|
|
'PhabricatorNotificationStatusController' => 'applications/notification/controller/PhabricatorNotificationStatusController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOAuthClientAuthorization' => 'applications/oauthserver/storage/PhabricatorOAuthClientAuthorization.php',
|
|
|
|
'PhabricatorOAuthClientAuthorizationBaseController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationBaseController.php',
|
|
|
|
'PhabricatorOAuthClientAuthorizationDeleteController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationDeleteController.php',
|
|
|
|
'PhabricatorOAuthClientAuthorizationEditController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationEditController.php',
|
|
|
|
'PhabricatorOAuthClientAuthorizationListController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationListController.php',
|
|
|
|
'PhabricatorOAuthClientAuthorizationQuery' => 'applications/oauthserver/query/PhabricatorOAuthClientAuthorizationQuery.php',
|
|
|
|
'PhabricatorOAuthClientBaseController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientBaseController.php',
|
|
|
|
'PhabricatorOAuthClientDeleteController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientDeleteController.php',
|
|
|
|
'PhabricatorOAuthClientEditController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientEditController.php',
|
|
|
|
'PhabricatorOAuthClientListController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientListController.php',
|
|
|
|
'PhabricatorOAuthClientViewController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientViewController.php',
|
|
|
|
'PhabricatorOAuthResponse' => 'applications/oauthserver/PhabricatorOAuthResponse.php',
|
|
|
|
'PhabricatorOAuthServer' => 'applications/oauthserver/PhabricatorOAuthServer.php',
|
|
|
|
'PhabricatorOAuthServerAccessToken' => 'applications/oauthserver/storage/PhabricatorOAuthServerAccessToken.php',
|
|
|
|
'PhabricatorOAuthServerAuthController' => 'applications/oauthserver/controller/PhabricatorOAuthServerAuthController.php',
|
|
|
|
'PhabricatorOAuthServerAuthorizationCode' => 'applications/oauthserver/storage/PhabricatorOAuthServerAuthorizationCode.php',
|
|
|
|
'PhabricatorOAuthServerClient' => 'applications/oauthserver/storage/PhabricatorOAuthServerClient.php',
|
|
|
|
'PhabricatorOAuthServerClientQuery' => 'applications/oauthserver/query/PhabricatorOAuthServerClientQuery.php',
|
|
|
|
'PhabricatorOAuthServerController' => 'applications/oauthserver/controller/PhabricatorOAuthServerController.php',
|
|
|
|
'PhabricatorOAuthServerDAO' => 'applications/oauthserver/storage/PhabricatorOAuthServerDAO.php',
|
|
|
|
'PhabricatorOAuthServerScope' => 'applications/oauthserver/PhabricatorOAuthServerScope.php',
|
|
|
|
'PhabricatorOAuthServerTestCase' => 'applications/oauthserver/__tests__/PhabricatorOAuthServerTestCase.php',
|
|
|
|
'PhabricatorOAuthServerTestController' => 'applications/oauthserver/controller/PhabricatorOAuthServerTestController.php',
|
|
|
|
'PhabricatorOAuthServerTokenController' => 'applications/oauthserver/controller/PhabricatorOAuthServerTokenController.php',
|
|
|
|
'PhabricatorObjectHandle' => 'applications/phid/PhabricatorObjectHandle.php',
|
|
|
|
'PhabricatorObjectHandleConstants' => 'applications/phid/handle/const/PhabricatorObjectHandleConstants.php',
|
|
|
|
'PhabricatorObjectHandleStatus' => 'applications/phid/handle/const/PhabricatorObjectHandleStatus.php',
|
2012-08-07 20:57:38 +02:00
|
|
|
'PhabricatorObjectListView' => 'view/control/PhabricatorObjectListView.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',
|
2013-07-21 15:34:21 +02:00
|
|
|
'PhabricatorObjectQuery' => 'applications/phid/query/PhabricatorObjectQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorObjectSelectorDialog' => 'view/control/PhabricatorObjectSelectorDialog.php',
|
|
|
|
'PhabricatorOffsetPagedQuery' => 'infrastructure/query/PhabricatorOffsetPagedQuery.php',
|
|
|
|
'PhabricatorOwnerPathQuery' => 'applications/owners/query/PhabricatorOwnerPathQuery.php',
|
2013-01-16 19:52:30 +01:00
|
|
|
'PhabricatorOwnersConfigOptions' => 'applications/owners/config/PhabricatorOwnersConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOwnersController' => 'applications/owners/controller/PhabricatorOwnersController.php',
|
|
|
|
'PhabricatorOwnersDAO' => 'applications/owners/storage/PhabricatorOwnersDAO.php',
|
|
|
|
'PhabricatorOwnersDeleteController' => 'applications/owners/controller/PhabricatorOwnersDeleteController.php',
|
|
|
|
'PhabricatorOwnersDetailController' => 'applications/owners/controller/PhabricatorOwnersDetailController.php',
|
|
|
|
'PhabricatorOwnersEditController' => 'applications/owners/controller/PhabricatorOwnersEditController.php',
|
|
|
|
'PhabricatorOwnersListController' => 'applications/owners/controller/PhabricatorOwnersListController.php',
|
|
|
|
'PhabricatorOwnersOwner' => 'applications/owners/storage/PhabricatorOwnersOwner.php',
|
2013-07-26 19:31:26 +02:00
|
|
|
'PhabricatorOwnersPHIDTypePackage' => 'applications/owners/phid/PhabricatorOwnersPHIDTypePackage.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOwnersPackage' => 'applications/owners/storage/PhabricatorOwnersPackage.php',
|
2012-11-19 21:53:41 +01:00
|
|
|
'PhabricatorOwnersPackagePathValidator' => 'applications/repository/worker/commitchangeparser/PhabricatorOwnersPackagePathValidator.php',
|
2012-08-08 21:25:11 +02:00
|
|
|
'PhabricatorOwnersPackageQuery' => 'applications/owners/query/PhabricatorOwnersPackageQuery.php',
|
2012-12-07 02:23:56 +01:00
|
|
|
'PhabricatorOwnersPackageTestCase' => 'applications/owners/storage/__tests__/PhabricatorOwnersPackageTestCase.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorOwnersPath' => 'applications/owners/storage/PhabricatorOwnersPath.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',
|
2013-07-21 15:34:21 +02:00
|
|
|
'PhabricatorPHIDType' => 'applications/phid/type/PhabricatorPHIDType.php',
|
2013-01-15 21:03:44 +01:00
|
|
|
'PhabricatorPHPMailerConfigOptions' => 'applications/config/option/PhabricatorPHPMailerConfigOptions.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
|
|
|
'PhabricatorPagedFormExample' => 'applications/uiexample/examples/PhabricatorPagedFormExample.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPaste' => 'applications/paste/storage/PhabricatorPaste.php',
|
2013-08-02 21:56:58 +02:00
|
|
|
'PhabricatorPasteCommentController' => 'applications/paste/controller/PhabricatorPasteCommentController.php',
|
2013-07-30 22:26:55 +02:00
|
|
|
'PhabricatorPasteConfigOptions' => 'applications/paste/config/PhabricatorPasteConfigOptions.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',
|
2013-08-02 21:56:58 +02:00
|
|
|
'PhabricatorPasteEditor' => 'applications/paste/editor/PhabricatorPasteEditor.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPasteListController' => 'applications/paste/controller/PhabricatorPasteListController.php',
|
2013-07-24 20:32:49 +02:00
|
|
|
'PhabricatorPastePHIDTypePaste' => 'applications/paste/phid/PhabricatorPastePHIDTypePaste.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorPasteQuery' => 'applications/paste/query/PhabricatorPasteQuery.php',
|
2013-02-26 23:57:41 +01:00
|
|
|
'PhabricatorPasteRemarkupRule' => 'applications/paste/remarkup/PhabricatorPasteRemarkupRule.php',
|
2013-04-14 15:53:20 +02:00
|
|
|
'PhabricatorPasteSearchEngine' => 'applications/paste/query/PhabricatorPasteSearchEngine.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',
|
|
|
|
'PhabricatorPeopleController' => 'applications/people/controller/PhabricatorPeopleController.php',
|
|
|
|
'PhabricatorPeopleEditController' => 'applications/people/controller/PhabricatorPeopleEditController.php',
|
2013-04-06 02:01:54 +02:00
|
|
|
'PhabricatorPeopleHovercardEventListener' => 'applications/people/event/PhabricatorPeopleHovercardEventListener.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',
|
|
|
|
'PhabricatorPeopleLogsController' => 'applications/people/controller/PhabricatorPeopleLogsController.php',
|
2013-07-24 23:12:39 +02:00
|
|
|
'PhabricatorPeoplePHIDTypeExternal' => 'applications/people/phid/PhabricatorPeoplePHIDTypeExternal.php',
|
2013-07-26 23:05:19 +02:00
|
|
|
'PhabricatorPeoplePHIDTypeUser' => 'applications/people/phid/PhabricatorPeoplePHIDTypeUser.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',
|
2013-07-10 01:23:54 +02:00
|
|
|
'PhabricatorPeopleProfilePictureController' => 'applications/people/controller/PhabricatorPeopleProfilePictureController.php',
|
2013-05-31 19:51:20 +02:00
|
|
|
'PhabricatorPeopleQuery' => 'applications/people/query/PhabricatorPeopleQuery.php',
|
|
|
|
'PhabricatorPeopleSearchEngine' => 'applications/people/query/PhabricatorPeopleSearchEngine.php',
|
2013-04-15 04:09:20 +02:00
|
|
|
'PhabricatorPeopleTestDataGenerator' => 'applications/people/lipsum/PhabricatorPeopleTestDataGenerator.php',
|
2013-01-16 00:36:49 +01:00
|
|
|
'PhabricatorPhameConfigOptions' => 'applications/phame/config/PhabricatorPhameConfigOptions.php',
|
2013-07-26 21:19:12 +02:00
|
|
|
'PhabricatorPhamePHIDTypeBlog' => 'applications/phame/phid/PhabricatorPhamePHIDTypeBlog.php',
|
2013-07-26 22:15:08 +02:00
|
|
|
'PhabricatorPhamePHIDTypePost' => 'applications/phame/phid/PhabricatorPhamePHIDTypePost.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',
|
2013-04-25 18:48:04 +02:00
|
|
|
'PhabricatorPhortuneConfigOptions' => 'applications/phortune/option/PhabricatorPhortuneConfigOptions.php',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhabricatorPhrequentConfigOptions' => 'applications/phrequent/config/PhabricatorPhrequentConfigOptions.php',
|
2013-01-15 15:31:53 +01:00
|
|
|
'PhabricatorPhrictionConfigOptions' => 'applications/phriction/config/PhabricatorPhrictionConfigOptions.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',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorPolicyAwareQuery' => 'infrastructure/query/policy/PhabricatorPolicyAwareQuery.php',
|
|
|
|
'PhabricatorPolicyAwareTestQuery' => 'applications/policy/__tests__/PhabricatorPolicyAwareTestQuery.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',
|
|
|
|
'PhabricatorPolicyCapabilityCanEdit' => 'applications/policy/capability/PhabricatorPolicyCapabilityCanEdit.php',
|
|
|
|
'PhabricatorPolicyCapabilityCanJoin' => 'applications/policy/capability/PhabricatorPolicyCapabilityCanJoin.php',
|
|
|
|
'PhabricatorPolicyCapabilityCanView' => 'applications/policy/capability/PhabricatorPolicyCapabilityCanView.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',
|
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',
|
2013-10-09 23:05:10 +02:00
|
|
|
'PhabricatorPolicyRule' => 'applications/policy/rule/PhabricatorPolicyRule.php',
|
|
|
|
'PhabricatorPolicyRuleAdministrators' => 'applications/policy/rule/PhabricatorPolicyRuleAdministrators.php',
|
|
|
|
'PhabricatorPolicyRuleLunarPhase' => 'applications/policy/rule/PhabricatorPolicyRuleLunarPhase.php',
|
|
|
|
'PhabricatorPolicyRuleProjects' => 'applications/policy/rule/PhabricatorPolicyRuleProjects.php',
|
|
|
|
'PhabricatorPolicyRuleUsers' => 'applications/policy/rule/PhabricatorPolicyRuleUsers.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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProject' => 'applications/project/storage/PhabricatorProject.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',
|
|
|
|
'PhabricatorProjectColumn' => 'applications/project/storage/PhabricatorProjectColumn.php',
|
|
|
|
'PhabricatorProjectColumnQuery' => 'applications/project/query/PhabricatorProjectColumnQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectConstants' => 'applications/project/constants/PhabricatorProjectConstants.php',
|
|
|
|
'PhabricatorProjectController' => 'applications/project/controller/PhabricatorProjectController.php',
|
|
|
|
'PhabricatorProjectCreateController' => 'applications/project/controller/PhabricatorProjectCreateController.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',
|
|
|
|
'PhabricatorProjectEditor' => 'applications/project/editor/PhabricatorProjectEditor.php',
|
2012-08-11 16:05:20 +02:00
|
|
|
'PhabricatorProjectEditorTestCase' => 'applications/project/editor/__tests__/PhabricatorProjectEditorTestCase.php',
|
2013-10-22 22:49:37 +02:00
|
|
|
'PhabricatorProjectHistoryController' => 'applications/project/controller/PhabricatorProjectHistoryController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectListController' => 'applications/project/controller/PhabricatorProjectListController.php',
|
2012-08-07 20:57:38 +02:00
|
|
|
'PhabricatorProjectMembersEditController' => 'applications/project/controller/PhabricatorProjectMembersEditController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectNameCollisionException' => 'applications/project/exception/PhabricatorProjectNameCollisionException.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
|
|
|
'PhabricatorProjectPHIDTypeColumn' => 'applications/project/phid/PhabricatorProjectPHIDTypeColumn.php',
|
2013-07-22 18:26:26 +02:00
|
|
|
'PhabricatorProjectPHIDTypeProject' => 'applications/project/phid/PhabricatorProjectPHIDTypeProject.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectProfile' => 'applications/project/storage/PhabricatorProjectProfile.php',
|
|
|
|
'PhabricatorProjectProfileController' => 'applications/project/controller/PhabricatorProjectProfileController.php',
|
|
|
|
'PhabricatorProjectProfileEditController' => 'applications/project/controller/PhabricatorProjectProfileEditController.php',
|
2013-10-17 18:32:34 +02:00
|
|
|
'PhabricatorProjectProfilePictureController' => 'applications/project/controller/PhabricatorProjectProfilePictureController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectQuery' => 'applications/project/query/PhabricatorProjectQuery.php',
|
2013-07-22 17:34:35 +02:00
|
|
|
'PhabricatorProjectSearchEngine' => 'applications/project/query/PhabricatorProjectSearchEngine.php',
|
2013-09-12 22:05:19 +02:00
|
|
|
'PhabricatorProjectSearchIndexer' => 'applications/project/search/PhabricatorProjectSearchIndexer.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectStatus' => 'applications/project/constants/PhabricatorProjectStatus.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',
|
2013-10-22 22:49:37 +02:00
|
|
|
'PhabricatorProjectTransactionQuery' => 'applications/project/query/PhabricatorProjectTransactionQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorProjectUpdateController' => 'applications/project/controller/PhabricatorProjectUpdateController.php',
|
|
|
|
'PhabricatorQuery' => 'infrastructure/query/PhabricatorQuery.php',
|
2013-01-03 18:17:38 +01:00
|
|
|
'PhabricatorRecaptchaConfigOptions' => 'applications/config/option/PhabricatorRecaptchaConfigOptions.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',
|
2013-10-17 04:12:14 +02:00
|
|
|
'PhabricatorRemarkupBlockInterpreterCowsay' => 'infrastructure/markup/interpreter/PhabricatorRemarkupBlockInterpreterCowsay.php',
|
|
|
|
'PhabricatorRemarkupBlockInterpreterFiglet' => 'infrastructure/markup/interpreter/PhabricatorRemarkupBlockInterpreterFiglet.php',
|
|
|
|
'PhabricatorRemarkupBlockInterpreterGraphviz' => 'infrastructure/markup/interpreter/PhabricatorRemarkupBlockInterpreterGraphviz.php',
|
2012-09-19 21:27:28 +02:00
|
|
|
'PhabricatorRemarkupControl' => 'view/form/control/PhabricatorRemarkupControl.php',
|
2013-10-25 02:26:07 +02:00
|
|
|
'PhabricatorRemarkupCustomBlockRule' => 'infrastructure/markup/rule/PhabricatorRemarkupCustomBlockRule.php',
|
|
|
|
'PhabricatorRemarkupCustomInlineRule' => 'infrastructure/markup/rule/PhabricatorRemarkupCustomInlineRule.php',
|
2013-02-26 23:57:41 +01:00
|
|
|
'PhabricatorRemarkupRuleEmbedFile' => 'applications/files/remarkup/PhabricatorRemarkupRuleEmbedFile.php',
|
|
|
|
'PhabricatorRemarkupRuleImageMacro' => 'applications/macro/remarkup/PhabricatorRemarkupRuleImageMacro.php',
|
|
|
|
'PhabricatorRemarkupRuleMeme' => 'applications/macro/remarkup/PhabricatorRemarkupRuleMeme.php',
|
|
|
|
'PhabricatorRemarkupRuleMention' => 'applications/people/remarkup/PhabricatorRemarkupRuleMention.php',
|
2013-02-26 23:59:31 +01:00
|
|
|
'PhabricatorRemarkupRuleObject' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleObject.php',
|
2012-07-02 19:44:37 +02:00
|
|
|
'PhabricatorRemarkupRuleYoutube' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleYoutube.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepository' => 'applications/repository/storage/PhabricatorRepository.php',
|
|
|
|
'PhabricatorRepositoryArcanistProject' => 'applications/repository/storage/PhabricatorRepositoryArcanistProject.php',
|
2012-10-04 22:25:58 +02:00
|
|
|
'PhabricatorRepositoryArcanistProjectDeleteController' => 'applications/repository/controller/PhabricatorRepositoryArcanistProjectDeleteController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryArcanistProjectEditController' => 'applications/repository/controller/PhabricatorRepositoryArcanistProjectEditController.php',
|
2013-07-26 23:33:31 +02:00
|
|
|
'PhabricatorRepositoryArcanistProjectQuery' => 'applications/repository/query/PhabricatorRepositoryArcanistProjectQuery.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'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',
|
|
|
|
'PhabricatorRepositoryCommitParserWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitParserWorker.php',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorRepositoryCommitRef' => 'applications/repository/engine/PhabricatorRepositoryCommitRef.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
|
|
|
'PhabricatorRepositoryCommitSearchIndexer' => 'applications/repository/search/PhabricatorRepositoryCommitSearchIndexer.php',
|
2013-01-16 18:35:47 +01:00
|
|
|
'PhabricatorRepositoryConfigOptions' => 'applications/repository/PhabricatorRepositoryConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryController' => 'applications/repository/controller/PhabricatorRepositoryController.php',
|
|
|
|
'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',
|
|
|
|
'PhabricatorRepositoryListController' => 'applications/repository/controller/PhabricatorRepositoryListController.php',
|
2012-10-26 01:23:41 +02:00
|
|
|
'PhabricatorRepositoryManagementDeleteWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementDeleteWorkflow.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',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementListWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementListWorkflow.php',
|
2013-11-06 20:26:24 +01:00
|
|
|
'PhabricatorRepositoryManagementMarkImportedWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMarkImportedWorkflow.php',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementPullWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementPullWorkflow.php',
|
|
|
|
'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-07-26 23:33:31 +02:00
|
|
|
'PhabricatorRepositoryPHIDTypeArcanistProject' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php',
|
2013-07-21 19:57:07 +02:00
|
|
|
'PhabricatorRepositoryPHIDTypeCommit' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php',
|
2013-07-22 19:45:12 +02:00
|
|
|
'PhabricatorRepositoryPHIDTypeRepository' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php',
|
2013-05-13 04:05:52 +02:00
|
|
|
'PhabricatorRepositoryPullEngine' => 'applications/repository/engine/PhabricatorRepositoryPullEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryPullLocalDaemon' => 'applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php',
|
2012-12-19 20:07:06 +01:00
|
|
|
'PhabricatorRepositoryQuery' => 'applications/repository/query/PhabricatorRepositoryQuery.php',
|
2013-09-11 00:26:08 +02:00
|
|
|
'PhabricatorRepositorySearchEngine' => 'applications/repository/query/PhabricatorRepositorySearchEngine.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorRepositoryShortcut' => 'applications/repository/storage/PhabricatorRepositoryShortcut.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',
|
2013-11-01 16:34:11 +01:00
|
|
|
'PhabricatorRepositoryVCSPassword' => 'applications/repository/storage/PhabricatorRepositoryVCSPassword.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorS3FileStorageEngine' => 'applications/files/engine/PhabricatorS3FileStorageEngine.php',
|
2012-07-02 19:49:00 +02:00
|
|
|
'PhabricatorSQLPatchList' => 'infrastructure/storage/patch/PhabricatorSQLPatchList.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',
|
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',
|
|
|
|
'PhabricatorSearchAttachController' => 'applications/search/controller/PhabricatorSearchAttachController.php',
|
|
|
|
'PhabricatorSearchBaseController' => 'applications/search/controller/PhabricatorSearchBaseController.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',
|
|
|
|
'PhabricatorSearchDAO' => 'applications/search/storage/PhabricatorSearchDAO.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',
|
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
|
|
|
'PhabricatorSearchDocumentIndexer' => 'applications/search/index/PhabricatorSearchDocumentIndexer.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchDocumentRelationship' => 'applications/search/storage/document/PhabricatorSearchDocumentRelationship.php',
|
2013-05-27 22:42:01 +02:00
|
|
|
'PhabricatorSearchEditController' => 'applications/search/controller/PhabricatorSearchEditController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchEngine' => 'applications/search/engine/PhabricatorSearchEngine.php',
|
|
|
|
'PhabricatorSearchEngineElastic' => 'applications/search/engine/PhabricatorSearchEngineElastic.php',
|
|
|
|
'PhabricatorSearchEngineMySQL' => 'applications/search/engine/PhabricatorSearchEngineMySQL.php',
|
|
|
|
'PhabricatorSearchEngineSelector' => 'applications/search/selector/PhabricatorSearchEngineSelector.php',
|
|
|
|
'PhabricatorSearchField' => 'applications/search/constants/PhabricatorSearchField.php',
|
2013-04-03 17:31:27 +02:00
|
|
|
'PhabricatorSearchHovercardController' => 'applications/search/controller/PhabricatorSearchHovercardController.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
|
|
|
'PhabricatorSearchIndexer' => 'applications/search/index/PhabricatorSearchIndexer.php',
|
|
|
|
'PhabricatorSearchManagementIndexWorkflow' => 'applications/search/management/PhabricatorSearchManagementIndexWorkflow.php',
|
|
|
|
'PhabricatorSearchManagementWorkflow' => 'applications/search/management/PhabricatorSearchManagementWorkflow.php',
|
2013-06-06 01:22:27 +02:00
|
|
|
'PhabricatorSearchOrderController' => 'applications/search/controller/PhabricatorSearchOrderController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSearchQuery' => 'applications/search/storage/PhabricatorSearchQuery.php',
|
|
|
|
'PhabricatorSearchRelationship' => 'applications/search/constants/PhabricatorSearchRelationship.php',
|
|
|
|
'PhabricatorSearchResultView' => 'applications/search/view/PhabricatorSearchResultView.php',
|
|
|
|
'PhabricatorSearchScope' => 'applications/search/constants/PhabricatorSearchScope.php',
|
|
|
|
'PhabricatorSearchSelectController' => 'applications/search/controller/PhabricatorSearchSelectController.php',
|
2013-01-03 14:45:23 +01:00
|
|
|
'PhabricatorSecurityConfigOptions' => 'applications/config/option/PhabricatorSecurityConfigOptions.php',
|
2013-01-15 21:04:05 +01:00
|
|
|
'PhabricatorSendGridConfigOptions' => 'applications/config/option/PhabricatorSendGridConfigOptions.php',
|
2012-08-13 21:37:18 +02:00
|
|
|
'PhabricatorSettingsAdjustController' => 'applications/settings/controller/PhabricatorSettingsAdjustController.php',
|
|
|
|
'PhabricatorSettingsMainController' => 'applications/settings/controller/PhabricatorSettingsMainController.php',
|
2012-08-13 21:37:26 +02:00
|
|
|
'PhabricatorSettingsPanel' => 'applications/settings/panel/PhabricatorSettingsPanel.php',
|
|
|
|
'PhabricatorSettingsPanelAccount' => 'applications/settings/panel/PhabricatorSettingsPanelAccount.php',
|
|
|
|
'PhabricatorSettingsPanelConduit' => 'applications/settings/panel/PhabricatorSettingsPanelConduit.php',
|
2013-03-26 21:30:35 +01:00
|
|
|
'PhabricatorSettingsPanelConpherencePreferences' => 'applications/settings/panel/PhabricatorSettingsPanelConpherencePreferences.php',
|
2013-07-28 05:18:58 +02:00
|
|
|
'PhabricatorSettingsPanelDeveloperPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelDeveloperPreferences.php',
|
2013-02-05 02:00:27 +01:00
|
|
|
'PhabricatorSettingsPanelDiffPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelDiffPreferences.php',
|
2012-08-13 21:37:26 +02:00
|
|
|
'PhabricatorSettingsPanelDisplayPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelDisplayPreferences.php',
|
|
|
|
'PhabricatorSettingsPanelEmailAddresses' => 'applications/settings/panel/PhabricatorSettingsPanelEmailAddresses.php',
|
|
|
|
'PhabricatorSettingsPanelEmailPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelEmailPreferences.php',
|
2013-06-17 15:12:45 +02:00
|
|
|
'PhabricatorSettingsPanelExternalAccounts' => 'applications/settings/panel/PhabricatorSettingsPanelExternalAccounts.php',
|
2013-01-16 18:00:11 +01:00
|
|
|
'PhabricatorSettingsPanelHomePreferences' => 'applications/settings/panel/PhabricatorSettingsPanelHomePreferences.php',
|
2012-08-13 21:37:26 +02:00
|
|
|
'PhabricatorSettingsPanelPassword' => 'applications/settings/panel/PhabricatorSettingsPanelPassword.php',
|
|
|
|
'PhabricatorSettingsPanelSSHKeys' => 'applications/settings/panel/PhabricatorSettingsPanelSSHKeys.php',
|
|
|
|
'PhabricatorSettingsPanelSearchPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelSearchPreferences.php',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorSetupCheck' => 'applications/config/check/PhabricatorSetupCheck.php',
|
|
|
|
'PhabricatorSetupCheckAPC' => 'applications/config/check/PhabricatorSetupCheckAPC.php',
|
2013-06-20 01:28:48 +02:00
|
|
|
'PhabricatorSetupCheckAuth' => 'applications/config/check/PhabricatorSetupCheckAuth.php',
|
2013-01-22 22:57:02 +01:00
|
|
|
'PhabricatorSetupCheckBaseURI' => 'applications/config/check/PhabricatorSetupCheckBaseURI.php',
|
Add setup checks for the availability of 'which' and 'diff' binaries
Summary:
Spent an hour or two helping a user figure this out. Make sure I never do that again.
If the webserver is configured with an empty or bogus PATH, binaries like 'which' and 'diff' (and 'git', and 'svn', etc.) may not be available. In most cases, this is fine, because we get an error like "sh: whatever-command not found", which is obvious to diagnose.
In the case of 'diff', we don't get this, because 'diff' is expected to exit with a nonzero code for differing files -- so we interpret the "sh: whatever-command not found" as "files differ" and then try to parse the empty output.
Explicitly check for 'which' (on Windows, 'where') and 'diff' during setup (I plan to refine the behavior around 'git', 'svn' and 'hg' at some point, but this is less pressing since the errors are trivial to support).
Test Plan: Faked failures on all modes, verified setup warnings look reasonable.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D6008
2013-05-23 23:42:07 +02:00
|
|
|
'PhabricatorSetupCheckBinaries' => 'applications/config/check/PhabricatorSetupCheckBinaries.php',
|
2013-01-23 01:16:24 +01:00
|
|
|
'PhabricatorSetupCheckDatabase' => 'applications/config/check/PhabricatorSetupCheckDatabase.php',
|
2013-01-23 00:16:26 +01:00
|
|
|
'PhabricatorSetupCheckExtensions' => 'applications/config/check/PhabricatorSetupCheckExtensions.php',
|
2013-01-01 23:09:17 +01:00
|
|
|
'PhabricatorSetupCheckExtraConfig' => 'applications/config/check/PhabricatorSetupCheckExtraConfig.php',
|
2013-05-17 19:00:40 +02:00
|
|
|
'PhabricatorSetupCheckFileinfo' => 'applications/config/check/PhabricatorSetupCheckFileinfo.php',
|
2013-01-19 17:41:45 +01:00
|
|
|
'PhabricatorSetupCheckGD' => 'applications/config/check/PhabricatorSetupCheckGD.php',
|
2013-02-08 18:14:28 +01:00
|
|
|
'PhabricatorSetupCheckImagemagick' => 'applications/config/check/PhabricatorSetupCheckImagemagick.php',
|
2013-01-02 03:15:03 +01:00
|
|
|
'PhabricatorSetupCheckInvalidConfig' => 'applications/config/check/PhabricatorSetupCheckInvalidConfig.php',
|
2013-01-18 22:28:30 +01:00
|
|
|
'PhabricatorSetupCheckMail' => 'applications/config/check/PhabricatorSetupCheckMail.php',
|
2013-01-19 17:41:45 +01:00
|
|
|
'PhabricatorSetupCheckMySQL' => 'applications/config/check/PhabricatorSetupCheckMySQL.php',
|
2013-01-23 01:15:54 +01:00
|
|
|
'PhabricatorSetupCheckPHPConfig' => 'applications/config/check/PhabricatorSetupCheckPHPConfig.php',
|
2013-01-22 23:45:19 +01:00
|
|
|
'PhabricatorSetupCheckPath' => 'applications/config/check/PhabricatorSetupCheckPath.php',
|
2013-02-28 18:17:01 +01:00
|
|
|
'PhabricatorSetupCheckPygment' => 'applications/config/check/PhabricatorSetupCheckPygment.php',
|
2013-10-30 21:07:09 +01:00
|
|
|
'PhabricatorSetupCheckRepositories' => 'applications/config/check/PhabricatorSetupCheckRepositories.php',
|
2013-01-19 17:39:27 +01:00
|
|
|
'PhabricatorSetupCheckStorage' => 'applications/config/check/PhabricatorSetupCheckStorage.php',
|
2012-12-31 02:04:38 +01:00
|
|
|
'PhabricatorSetupCheckTimezone' => 'applications/config/check/PhabricatorSetupCheckTimezone.php',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorSetupIssue' => 'applications/config/issue/PhabricatorSetupIssue.php',
|
2013-01-29 20:29:56 +01:00
|
|
|
'PhabricatorSetupIssueExample' => 'applications/uiexample/examples/PhabricatorSetupIssueExample.php',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorSetupIssueView' => 'applications/config/view/PhabricatorSetupIssueView.php',
|
2013-10-16 19:36:00 +02:00
|
|
|
'PhabricatorSlowvoteCapabilityDefaultView' => 'applications/slowvote/capability/PhabricatorSlowvoteCapabilityDefaultView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSlowvoteChoice' => 'applications/slowvote/storage/PhabricatorSlowvoteChoice.php',
|
|
|
|
'PhabricatorSlowvoteComment' => 'applications/slowvote/storage/PhabricatorSlowvoteComment.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',
|
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',
|
|
|
|
'PhabricatorSlowvoteOption' => 'applications/slowvote/storage/PhabricatorSlowvoteOption.php',
|
2013-07-21 15:34:21 +02:00
|
|
|
'PhabricatorSlowvotePHIDTypePoll' => 'applications/slowvote/phid/PhabricatorSlowvotePHIDTypePoll.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSlowvotePoll' => 'applications/slowvote/storage/PhabricatorSlowvotePoll.php',
|
|
|
|
'PhabricatorSlowvotePollController' => 'applications/slowvote/controller/PhabricatorSlowvotePollController.php',
|
2013-07-13 19:41:30 +02:00
|
|
|
'PhabricatorSlowvoteQuery' => 'applications/slowvote/query/PhabricatorSlowvoteQuery.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',
|
|
|
|
'PhabricatorSortTableExample' => 'applications/uiexample/examples/PhabricatorSortTableExample.php',
|
2012-08-15 19:45:06 +02:00
|
|
|
'PhabricatorSourceCodeView' => 'view/layout/PhabricatorSourceCodeView.php',
|
2013-09-17 01:03:24 +02:00
|
|
|
'PhabricatorStandardCustomField' => 'infrastructure/customfield/standard/PhabricatorStandardCustomField.php',
|
2013-09-17 01:03:51 +02:00
|
|
|
'PhabricatorStandardCustomFieldBool' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldBool.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',
|
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',
|
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',
|
2013-03-04 22:45:51 +01:00
|
|
|
'PhabricatorStatusController' => 'applications/system/PhabricatorStatusController.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',
|
|
|
|
'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',
|
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',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorSubscribableInterface' => 'applications/subscriptions/interface/PhabricatorSubscribableInterface.php',
|
|
|
|
'PhabricatorSubscribersQuery' => 'applications/subscriptions/query/PhabricatorSubscribersQuery.php',
|
|
|
|
'PhabricatorSubscriptionsEditController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsEditController.php',
|
|
|
|
'PhabricatorSubscriptionsEditor' => 'applications/subscriptions/editor/PhabricatorSubscriptionsEditor.php',
|
|
|
|
'PhabricatorSubscriptionsUIEventListener' => 'applications/subscriptions/events/PhabricatorSubscriptionsUIEventListener.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorSymbolNameLinter' => 'infrastructure/lint/hook/PhabricatorSymbolNameLinter.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',
|
2012-11-24 15:47:06 +01:00
|
|
|
'PhabricatorTagExample' => 'applications/uiexample/examples/PhabricatorTagExample.php',
|
|
|
|
'PhabricatorTagView' => 'view/layout/PhabricatorTagView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorTaskmasterDaemon' => 'infrastructure/daemon/workers/PhabricatorTaskmasterDaemon.php',
|
|
|
|
'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',
|
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',
|
2013-06-03 21:58:11 +02:00
|
|
|
'PhabricatorTime' => 'infrastructure/time/PhabricatorTime.php',
|
|
|
|
'PhabricatorTimeGuard' => 'infrastructure/time/PhabricatorTimeGuard.php',
|
|
|
|
'PhabricatorTimeTestCase' => 'infrastructure/time/__tests__/PhabricatorTimeTestCase.php',
|
2012-11-22 02:24:56 +01:00
|
|
|
'PhabricatorTimelineEventView' => 'view/layout/PhabricatorTimelineEventView.php',
|
|
|
|
'PhabricatorTimelineExample' => 'applications/uiexample/examples/PhabricatorTimelineExample.php',
|
|
|
|
'PhabricatorTimelineView' => 'view/layout/PhabricatorTimelineView.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',
|
|
|
|
'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-09-25 02:00:31 +02:00
|
|
|
'PhabricatorTokenPHIDTypeToken' => 'applications/tokens/phid/PhabricatorTokenPHIDTypeToken.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',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenUIEventListener' => 'applications/tokens/event/PhabricatorTokenUIEventListener.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorTransactionView' => 'view/layout/PhabricatorTransactionView.php',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorTransactions' => 'applications/transactions/constants/PhabricatorTransactions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorTransformedFile' => 'applications/files/storage/PhabricatorTransformedFile.php',
|
2012-06-14 22:43:09 +02:00
|
|
|
'PhabricatorTranslation' => 'infrastructure/internationalization/PhabricatorTranslation.php',
|
2013-01-05 01:22:52 +01:00
|
|
|
'PhabricatorTranslationsConfigOptions' => 'applications/config/option/PhabricatorTranslationsConfigOptions.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorTrivialTestCase' => 'infrastructure/testing/__tests__/PhabricatorTrivialTestCase.php',
|
2013-03-11 03:20:01 +01:00
|
|
|
'PhabricatorTwoColumnExample' => 'applications/uiexample/examples/PhabricatorTwoColumnExample.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorTypeaheadCommonDatasourceController' => 'applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php',
|
|
|
|
'PhabricatorTypeaheadDatasourceController' => 'applications/typeahead/controller/PhabricatorTypeaheadDatasourceController.php',
|
2012-08-01 21:36:19 +02:00
|
|
|
'PhabricatorTypeaheadResult' => 'applications/typeahead/storage/PhabricatorTypeaheadResult.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUIExample' => 'applications/uiexample/examples/PhabricatorUIExample.php',
|
|
|
|
'PhabricatorUIExampleRenderController' => 'applications/uiexample/controller/PhabricatorUIExampleRenderController.php',
|
|
|
|
'PhabricatorUIListFilterExample' => 'applications/uiexample/examples/PhabricatorUIListFilterExample.php',
|
2012-06-14 00:00:24 +02:00
|
|
|
'PhabricatorUINotificationExample' => 'applications/uiexample/examples/PhabricatorUINotificationExample.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUIPagerExample' => 'applications/uiexample/examples/PhabricatorUIPagerExample.php',
|
2013-07-24 23:13:22 +02:00
|
|
|
'PhabricatorUIStatusExample' => 'applications/uiexample/examples/PhabricatorUIStatusExample.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUITooltipExample' => 'applications/uiexample/examples/PhabricatorUITooltipExample.php',
|
|
|
|
'PhabricatorUnitsTestCase' => 'view/__tests__/PhabricatorUnitsTestCase.php',
|
|
|
|
'PhabricatorUser' => 'applications/people/storage/PhabricatorUser.php',
|
2013-06-07 19:22:45 +02:00
|
|
|
'PhabricatorUserBlurbField' => 'applications/people/customfield/PhabricatorUserBlurbField.php',
|
|
|
|
'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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUserEmail' => 'applications/people/storage/PhabricatorUserEmail.php',
|
|
|
|
'PhabricatorUserLog' => 'applications/people/storage/PhabricatorUserLog.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',
|
2012-08-13 21:37:18 +02:00
|
|
|
'PhabricatorUserSSHKey' => 'applications/settings/storage/PhabricatorUserSSHKey.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
|
|
|
'PhabricatorUserSearchIndexer' => 'applications/people/search/PhabricatorUserSearchIndexer.php',
|
2013-07-10 14:09:59 +02:00
|
|
|
'PhabricatorUserSinceField' => 'applications/people/customfield/PhabricatorUserSinceField.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorUserStatus' => 'applications/people/storage/PhabricatorUserStatus.php',
|
2013-07-10 21:34:09 +02:00
|
|
|
'PhabricatorUserStatusField' => 'applications/people/customfield/PhabricatorUserStatusField.php',
|
2012-10-24 22:22:24 +02:00
|
|
|
'PhabricatorUserStatusInvalidEpochException' => 'applications/people/exception/PhabricatorUserStatusInvalidEpochException.php',
|
|
|
|
'PhabricatorUserStatusOverlapException' => 'applications/people/exception/PhabricatorUserStatusOverlapException.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',
|
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',
|
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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhabricatorWorkerDAO' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerDAO.php',
|
2012-11-01 19:30:16 +01:00
|
|
|
'PhabricatorWorkerLeaseQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerLeaseQuery.php',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorWorkerPermanentFailureException' => 'infrastructure/daemon/workers/exception/PhabricatorWorkerPermanentFailureException.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',
|
|
|
|
'PhabricatorWorkerTaskUpdateController' => 'applications/daemon/controller/PhabricatorWorkerTaskUpdateController.php',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorWorkerTestCase' => 'infrastructure/daemon/workers/__tests__/PhabricatorWorkerTestCase.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',
|
2012-12-21 21:12:26 +01:00
|
|
|
'PhabricatorXHPASTViewController' => 'applications/phpast/controller/PhabricatorXHPASTViewController.php',
|
|
|
|
'PhabricatorXHPASTViewDAO' => 'applications/phpast/storage/PhabricatorXHPASTViewDAO.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',
|
|
|
|
'PhabricatorXHPASTViewParseTree' => 'applications/phpast/storage/PhabricatorXHPASTViewParseTree.php',
|
|
|
|
'PhabricatorXHPASTViewRunController' => 'applications/phpast/controller/PhabricatorXHPASTViewRunController.php',
|
|
|
|
'PhabricatorXHPASTViewStreamController' => 'applications/phpast/controller/PhabricatorXHPASTViewStreamController.php',
|
|
|
|
'PhabricatorXHPASTViewTreeController' => 'applications/phpast/controller/PhabricatorXHPASTViewTreeController.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',
|
Move skins toward modularization
Summary:
Two high-level things happening here:
- We no longer ever need to put meta-UI (content creation, editing, notices, etc.) on live blog views, since this is all in Phame now. I pulled this out.
- On the other hand, I pushed more routing/control logic into Skins and made the root skin a Controller instead of a View. This simplifies some of the code above skins, and the theory behind this is that it gives us greater flexibility to, e.g., put a glue layer between Phame and Wordpress templates or whatever else, and allows skins to handle routing and thus add pages like "About" or "Bio".
- I added a basic skin below the root skin which is more like the old root skin and has standard rendering hooks.
- "Ten Eleven" is a play on the popular (default?) Wordpress themes called "Twenty Ten", "Twenty Eleven" and "Twenty Twelve".
Test Plan: Viewed live blog and live posts. They aren't pretty, but they don't have extraneous resources.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1373
Differential Revision: https://secure.phabricator.com/D3714
2012-10-17 17:36:25 +02:00
|
|
|
'PhameBasicBlogSkin' => 'applications/phame/skins/PhameBasicBlogSkin.php',
|
2012-10-17 17:36:48 +02:00
|
|
|
'PhameBasicTemplateBlogSkin' => 'applications/phame/skins/PhameBasicTemplateBlogSkin.php',
|
2012-07-19 18:03:10 +02:00
|
|
|
'PhameBlog' => 'applications/phame/storage/PhameBlog.php',
|
|
|
|
'PhameBlogDeleteController' => 'applications/phame/controller/blog/PhameBlogDeleteController.php',
|
|
|
|
'PhameBlogEditController' => 'applications/phame/controller/blog/PhameBlogEditController.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',
|
|
|
|
'PhameBlogLiveController' => 'applications/phame/controller/blog/PhameBlogLiveController.php',
|
2012-07-19 18:03:10 +02:00
|
|
|
'PhameBlogQuery' => 'applications/phame/query/PhameBlogQuery.php',
|
Move skins toward modularization
Summary:
Two high-level things happening here:
- We no longer ever need to put meta-UI (content creation, editing, notices, etc.) on live blog views, since this is all in Phame now. I pulled this out.
- On the other hand, I pushed more routing/control logic into Skins and made the root skin a Controller instead of a View. This simplifies some of the code above skins, and the theory behind this is that it gives us greater flexibility to, e.g., put a glue layer between Phame and Wordpress templates or whatever else, and allows skins to handle routing and thus add pages like "About" or "Bio".
- I added a basic skin below the root skin which is more like the old root skin and has standard rendering hooks.
- "Ten Eleven" is a play on the popular (default?) Wordpress themes called "Twenty Ten", "Twenty Eleven" and "Twenty Twelve".
Test Plan: Viewed live blog and live posts. They aren't pretty, but they don't have extraneous resources.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1373
Differential Revision: https://secure.phabricator.com/D3714
2012-10-17 17:36:25 +02:00
|
|
|
'PhameBlogSkin' => 'applications/phame/skins/PhameBlogSkin.php',
|
2012-07-19 18:03:10 +02:00
|
|
|
'PhameBlogViewController' => 'applications/phame/controller/blog/PhameBlogViewController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhameController' => 'applications/phame/controller/PhameController.php',
|
|
|
|
'PhameDAO' => 'applications/phame/storage/PhameDAO.php',
|
|
|
|
'PhamePost' => 'applications/phame/storage/PhamePost.php',
|
|
|
|
'PhamePostDeleteController' => 'applications/phame/controller/post/PhamePostDeleteController.php',
|
|
|
|
'PhamePostEditController' => 'applications/phame/controller/post/PhamePostEditController.php',
|
2012-10-15 23:50:45 +02:00
|
|
|
'PhamePostFramedController' => 'applications/phame/controller/post/PhamePostFramedController.php',
|
2012-10-15 23:50:37 +02:00
|
|
|
'PhamePostListController' => 'applications/phame/controller/post/PhamePostListController.php',
|
2012-10-15 23:50:45 +02:00
|
|
|
'PhamePostNewController' => 'applications/phame/controller/post/PhamePostNewController.php',
|
2012-10-15 23:51:30 +02:00
|
|
|
'PhamePostNotLiveController' => 'applications/phame/controller/post/PhamePostNotLiveController.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhamePostPreviewController' => 'applications/phame/controller/post/PhamePostPreviewController.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',
|
2012-10-15 23:50:45 +02:00
|
|
|
'PhamePostUnpublishController' => 'applications/phame/controller/post/PhamePostUnpublishController.php',
|
Move skins toward modularization
Summary:
Two high-level things happening here:
- We no longer ever need to put meta-UI (content creation, editing, notices, etc.) on live blog views, since this is all in Phame now. I pulled this out.
- On the other hand, I pushed more routing/control logic into Skins and made the root skin a Controller instead of a View. This simplifies some of the code above skins, and the theory behind this is that it gives us greater flexibility to, e.g., put a glue layer between Phame and Wordpress templates or whatever else, and allows skins to handle routing and thus add pages like "About" or "Bio".
- I added a basic skin below the root skin which is more like the old root skin and has standard rendering hooks.
- "Ten Eleven" is a play on the popular (default?) Wordpress themes called "Twenty Ten", "Twenty Eleven" and "Twenty Twelve".
Test Plan: Viewed live blog and live posts. They aren't pretty, but they don't have extraneous resources.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1373
Differential Revision: https://secure.phabricator.com/D3714
2012-10-17 17:36:25 +02:00
|
|
|
'PhamePostView' => 'applications/phame/view/PhamePostView.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhamePostViewController' => 'applications/phame/controller/post/PhamePostViewController.php',
|
2012-10-17 17:37:05 +02:00
|
|
|
'PhameResourceController' => 'applications/phame/controller/PhameResourceController.php',
|
2012-10-17 17:36:48 +02:00
|
|
|
'PhameSkinSpecification' => 'applications/phame/skins/PhameSkinSpecification.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',
|
2013-07-24 23:06:50 +02:00
|
|
|
'PhluxPHIDTypeVariable' => 'applications/phlux/phid/PhluxPHIDTypeVariable.php',
|
2013-03-21 02:01:52 +01:00
|
|
|
'PhluxTransaction' => 'applications/phlux/storage/PhluxTransaction.php',
|
|
|
|
'PhluxTransactionQuery' => 'applications/phlux/query/PhluxTransactionQuery.php',
|
|
|
|
'PhluxVariable' => 'applications/phlux/storage/PhluxVariable.php',
|
|
|
|
'PhluxVariableEditor' => 'applications/phlux/editor/PhluxVariableEditor.php',
|
|
|
|
'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',
|
2012-11-22 02:27:44 +01:00
|
|
|
'PholioConstants' => 'applications/pholio/constants/PholioConstants.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',
|
|
|
|
'PholioImage' => 'applications/pholio/storage/PholioImage.php',
|
2013-07-26 01:59:25 +02:00
|
|
|
'PholioImageHistoryController' => 'applications/pholio/controller/PholioImageHistoryController.php',
|
|
|
|
'PholioImageQuery' => 'applications/pholio/query/PholioImageQuery.php',
|
2013-07-19 00:04:08 +02:00
|
|
|
'PholioImageUploadController' => 'applications/pholio/controller/PholioImageUploadController.php',
|
2013-02-22 15:39:08 +01:00
|
|
|
'PholioInlineCommentEditView' => 'applications/pholio/view/PholioInlineCommentEditView.php',
|
|
|
|
'PholioInlineCommentSaveView' => 'applications/pholio/view/PholioInlineCommentSaveView.php',
|
2013-02-19 23:12:33 +01:00
|
|
|
'PholioInlineCommentView' => 'applications/pholio/view/PholioInlineCommentView.php',
|
2013-02-08 16:24:17 +01:00
|
|
|
'PholioInlineController' => 'applications/pholio/controller/PholioInlineController.php',
|
2013-02-19 23:12:33 +01:00
|
|
|
'PholioInlineDeleteController' => 'applications/pholio/controller/PholioInlineDeleteController.php',
|
2013-02-22 15:39:08 +01:00
|
|
|
'PholioInlineEditController' => 'applications/pholio/controller/PholioInlineEditController.php',
|
2013-02-06 20:28:03 +01:00
|
|
|
'PholioInlineSaveController' => 'applications/pholio/controller/PholioInlineSaveController.php',
|
2013-03-20 13:36:53 +01:00
|
|
|
'PholioInlineThumbController' => 'applications/pholio/controller/PholioInlineThumbController.php',
|
2013-02-19 23:12:33 +01:00
|
|
|
'PholioInlineViewController' => 'applications/pholio/controller/PholioInlineViewController.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',
|
2012-11-22 02:27:20 +01:00
|
|
|
'PholioMockCommentController' => 'applications/pholio/controller/PholioMockCommentController.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',
|
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',
|
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',
|
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-07-26 01:59:25 +02:00
|
|
|
'PholioPHIDTypeImage' => 'applications/pholio/phid/PholioPHIDTypeImage.php',
|
2013-07-21 21:40:51 +02:00
|
|
|
'PholioPHIDTypeMock' => 'applications/pholio/phid/PholioPHIDTypeMock.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',
|
2012-12-21 23:21:50 +01:00
|
|
|
'PholioSearchIndexer' => 'applications/pholio/search/PholioSearchIndexer.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',
|
2012-11-22 02:27:44 +01:00
|
|
|
'PholioTransactionType' => 'applications/pholio/constants/PholioTransactionType.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',
|
2013-04-12 17:10:22 +02:00
|
|
|
'PhortuneAccountBuyController' => 'applications/phortune/controller/PhortuneAccountBuyController.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',
|
|
|
|
'PhortuneAccountQuery' => 'applications/phortune/query/PhortuneAccountQuery.php',
|
|
|
|
'PhortuneAccountTransaction' => 'applications/phortune/storage/PhortuneAccountTransaction.php',
|
|
|
|
'PhortuneAccountTransactionQuery' => 'applications/phortune/query/PhortuneAccountTransactionQuery.php',
|
|
|
|
'PhortuneAccountViewController' => 'applications/phortune/controller/PhortuneAccountViewController.php',
|
2013-04-25 18:48:04 +02:00
|
|
|
'PhortuneBalancedPaymentProvider' => 'applications/phortune/provider/PhortuneBalancedPaymentProvider.php',
|
2013-04-25 18:45:07 +02:00
|
|
|
'PhortuneCart' => 'applications/phortune/storage/PhortuneCart.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',
|
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',
|
|
|
|
'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',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhortuneMonthYearExpiryControl' => 'applications/phortune/control/PhortuneMonthYearExpiryControl.php',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortuneMultiplePaymentProvidersException' => 'applications/phortune/exception/PhortuneMultiplePaymentProvidersException.php',
|
|
|
|
'PhortuneNoPaymentProviderException' => 'applications/phortune/exception/PhortuneNoPaymentProviderException.php',
|
2013-04-25 18:46:59 +02:00
|
|
|
'PhortuneNotImplementedException' => 'applications/phortune/exception/PhortuneNotImplementedException.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',
|
2013-03-28 17:11:42 +01:00
|
|
|
'PhortunePaymentMethodEditController' => 'applications/phortune/controller/PhortunePaymentMethodEditController.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
|
|
|
'PhortunePaymentMethodListController' => 'applications/phortune/controller/PhortunePaymentMethodListController.php',
|
2013-03-28 17:11:42 +01:00
|
|
|
'PhortunePaymentMethodQuery' => 'applications/phortune/query/PhortunePaymentMethodQuery.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
|
|
|
'PhortunePaymentMethodViewController' => 'applications/phortune/controller/PhortunePaymentMethodViewController.php',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortunePaymentProvider' => 'applications/phortune/provider/PhortunePaymentProvider.php',
|
|
|
|
'PhortunePaymentProviderTestCase' => 'applications/phortune/provider/__tests__/PhortunePaymentProviderTestCase.php',
|
2013-05-06 20:44:24 +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
|
|
|
'PhortuneProduct' => 'applications/phortune/storage/PhortuneProduct.php',
|
2013-03-28 17:13:07 +01:00
|
|
|
'PhortuneProductEditController' => 'applications/phortune/controller/PhortuneProductEditController.php',
|
|
|
|
'PhortuneProductEditor' => 'applications/phortune/editor/PhortuneProductEditor.php',
|
|
|
|
'PhortuneProductListController' => 'applications/phortune/controller/PhortuneProductListController.php',
|
|
|
|
'PhortuneProductQuery' => 'applications/phortune/query/PhortuneProductQuery.php',
|
|
|
|
'PhortuneProductTransaction' => 'applications/phortune/storage/PhortuneProductTransaction.php',
|
|
|
|
'PhortuneProductTransactionQuery' => 'applications/phortune/query/PhortuneProductTransactionQuery.php',
|
|
|
|
'PhortuneProductViewController' => 'applications/phortune/controller/PhortuneProductViewController.php',
|
2013-05-06 20:44:24 +02:00
|
|
|
'PhortuneProviderController' => 'applications/phortune/controller/PhortuneProviderController.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',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortuneStripePaymentProvider' => 'applications/phortune/provider/PhortuneStripePaymentProvider.php',
|
|
|
|
'PhortuneTestExtraPaymentProvider' => 'applications/phortune/provider/__tests__/PhortuneTestExtraPaymentProvider.php',
|
|
|
|
'PhortuneTestPaymentProvider' => 'applications/phortune/provider/PhortuneTestPaymentProvider.php',
|
2013-05-22 00:34:46 +02:00
|
|
|
'PhortuneWePayPaymentProvider' => 'applications/phortune/provider/PhortuneWePayPaymentProvider.php',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhrequentController' => 'applications/phrequent/controller/PhrequentController.php',
|
|
|
|
'PhrequentDAO' => 'applications/phrequent/storage/PhrequentDAO.php',
|
|
|
|
'PhrequentListController' => 'applications/phrequent/controller/PhrequentListController.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',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhrequentTrackController' => 'applications/phrequent/controller/PhrequentTrackController.php',
|
|
|
|
'PhrequentTrackableInterface' => 'applications/phrequent/interface/PhrequentTrackableInterface.php',
|
|
|
|
'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
|
|
|
'PhrictionActionConstants' => 'applications/phriction/constants/PhrictionActionConstants.php',
|
2013-07-22 18:01:22 +02:00
|
|
|
'PhrictionActionMenuEventListener' => 'applications/phriction/event/PhrictionActionMenuEventListener.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'PhrictionChangeType' => 'applications/phriction/constants/PhrictionChangeType.php',
|
|
|
|
'PhrictionConstants' => 'applications/phriction/constants/PhrictionConstants.php',
|
|
|
|
'PhrictionContent' => 'applications/phriction/storage/PhrictionContent.php',
|
|
|
|
'PhrictionController' => 'applications/phriction/controller/PhrictionController.php',
|
|
|
|
'PhrictionDAO' => 'applications/phriction/storage/PhrictionDAO.php',
|
|
|
|
'PhrictionDeleteController' => 'applications/phriction/controller/PhrictionDeleteController.php',
|
|
|
|
'PhrictionDiffController' => 'applications/phriction/controller/PhrictionDiffController.php',
|
|
|
|
'PhrictionDocument' => 'applications/phriction/storage/PhrictionDocument.php',
|
|
|
|
'PhrictionDocumentController' => 'applications/phriction/controller/PhrictionDocumentController.php',
|
|
|
|
'PhrictionDocumentEditor' => 'applications/phriction/editor/PhrictionDocumentEditor.php',
|
|
|
|
'PhrictionDocumentPreviewController' => 'applications/phriction/controller/PhrictionDocumentPreviewController.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',
|
|
|
|
'PhrictionDocumentTestCase' => 'applications/phriction/storage/__tests__/PhrictionDocumentTestCase.php',
|
|
|
|
'PhrictionEditController' => 'applications/phriction/controller/PhrictionEditController.php',
|
|
|
|
'PhrictionHistoryController' => 'applications/phriction/controller/PhrictionHistoryController.php',
|
|
|
|
'PhrictionListController' => 'applications/phriction/controller/PhrictionListController.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',
|
2013-07-24 20:32:13 +02:00
|
|
|
'PhrictionPHIDTypeDocument' => 'applications/phriction/phid/PhrictionPHIDTypeDocument.php',
|
2013-02-26 23:57:41 +01:00
|
|
|
'PhrictionRemarkupRule' => 'applications/phriction/remarkup/PhrictionRemarkupRule.php',
|
2013-07-28 03:26:42 +02:00
|
|
|
'PhrictionSearchEngine' => 'applications/phriction/query/PhrictionSearchEngine.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
|
|
|
'PhrictionSearchIndexer' => 'applications/phriction/search/PhrictionSearchIndexer.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',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderAnswerQuery' => 'applications/ponder/query/PonderAnswerQuery.php',
|
|
|
|
'PonderAnswerSaveController' => 'applications/ponder/controller/PonderAnswerSaveController.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',
|
adding comments to ponder
Summary: This is pretty spartan, but it does the job.
Test Plan:
Patch, update storage, add some comment
to your favorite question or answer.
Reviewers: nh, vrana, epriestley
Reviewed By: epriestley
CC: aran, Korvin, starruler, syrneus, me.here, victorzarate7
Maniphest Tasks: T1645
Differential Revision: https://secure.phabricator.com/D3471
2012-09-11 21:13:20 +02:00
|
|
|
'PonderComment' => 'applications/ponder/storage/PonderComment.php',
|
|
|
|
'PonderCommentQuery' => 'applications/ponder/query/PonderCommentQuery.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',
|
2013-09-19 00:15:25 +02:00
|
|
|
'PonderEditor' => 'applications/ponder/editor/PonderEditor.php',
|
2013-07-26 22:19:49 +02:00
|
|
|
'PonderPHIDTypeAnswer' => 'applications/ponder/phid/PonderPHIDTypeAnswer.php',
|
2013-07-24 20:32:31 +02:00
|
|
|
'PonderPHIDTypeQuestion' => 'applications/ponder/phid/PonderPHIDTypeQuestion.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',
|
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',
|
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',
|
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
|
|
|
'PonderSearchIndexer' => 'applications/ponder/search/PonderSearchIndexer.php',
|
2013-09-19 00:15:25 +02:00
|
|
|
'PonderTransactionFeedStory' => 'applications/ponder/feed/PonderTransactionFeedStory.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderVotableInterface' => 'applications/ponder/storage/PonderVotableInterface.php',
|
|
|
|
'PonderVotableView' => 'applications/ponder/view/PonderVotableView.php',
|
2013-07-28 03:37:17 +02:00
|
|
|
'PonderVote' => 'applications/ponder/constants/PonderVote.php',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderVoteEditor' => 'applications/ponder/editor/PonderVoteEditor.php',
|
|
|
|
'PonderVoteSaveController' => 'applications/ponder/controller/PonderVoteSaveController.php',
|
2013-10-10 13:29:07 +02:00
|
|
|
'ProjectCapabilityCreateProjects' => 'applications/project/capability/ProjectCapabilityCreateProjects.php',
|
2013-05-18 11:46:39 +02:00
|
|
|
'ProjectRemarkupRule' => 'applications/project/remarkup/ProjectRemarkupRule.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',
|
|
|
|
'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',
|
|
|
|
'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',
|
|
|
|
'ReleephController' => 'applications/releeph/controller/ReleephController.php',
|
|
|
|
'ReleephDAO' => 'applications/releeph/storage/ReleephDAO.php',
|
|
|
|
'ReleephDefaultFieldSelector' => 'applications/releeph/field/selector/ReleephDefaultFieldSelector.php',
|
|
|
|
'ReleephDefaultUserView' => 'applications/releeph/view/user/ReleephDefaultUserView.php',
|
|
|
|
'ReleephDiffChurnFieldSpecification' => 'applications/releeph/field/specification/ReleephDiffChurnFieldSpecification.php',
|
|
|
|
'ReleephDiffMessageFieldSpecification' => 'applications/releeph/field/specification/ReleephDiffMessageFieldSpecification.php',
|
|
|
|
'ReleephDiffSizeFieldSpecification' => 'applications/releeph/field/specification/ReleephDiffSizeFieldSpecification.php',
|
|
|
|
'ReleephDifferentialRevisionDetailRenderer' => 'applications/releeph/differential/ReleephDifferentialRevisionDetailRenderer.php',
|
|
|
|
'ReleephFieldParseException' => 'applications/releeph/field/exception/ReleephFieldParseException.php',
|
|
|
|
'ReleephFieldSelector' => 'applications/releeph/field/selector/ReleephFieldSelector.php',
|
|
|
|
'ReleephFieldSpecification' => 'applications/releeph/field/specification/ReleephFieldSpecification.php',
|
|
|
|
'ReleephIntentFieldSpecification' => 'applications/releeph/field/specification/ReleephIntentFieldSpecification.php',
|
|
|
|
'ReleephLevelFieldSpecification' => 'applications/releeph/field/specification/ReleephLevelFieldSpecification.php',
|
|
|
|
'ReleephOriginalCommitFieldSpecification' => 'applications/releeph/field/specification/ReleephOriginalCommitFieldSpecification.php',
|
2013-07-21 18:27:00 +02:00
|
|
|
'ReleephPHIDTypeBranch' => 'applications/releeph/phid/ReleephPHIDTypeBranch.php',
|
2013-07-21 17:41:38 +02:00
|
|
|
'ReleephPHIDTypeProject' => 'applications/releeph/phid/ReleephPHIDTypeProject.php',
|
|
|
|
'ReleephPHIDTypeRequest' => 'applications/releeph/phid/ReleephPHIDTypeRequest.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephProject' => 'applications/releeph/storage/ReleephProject.php',
|
|
|
|
'ReleephProjectActionController' => 'applications/releeph/controller/project/ReleephProjectActionController.php',
|
2013-07-21 17:42:10 +02:00
|
|
|
'ReleephProjectController' => 'applications/releeph/controller/ReleephProjectController.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephProjectCreateController' => 'applications/releeph/controller/project/ReleephProjectCreateController.php',
|
|
|
|
'ReleephProjectEditController' => 'applications/releeph/controller/project/ReleephProjectEditController.php',
|
2013-08-20 19:00:25 +02:00
|
|
|
'ReleephProjectHistoryController' => 'applications/releeph/controller/project/ReleephProjectHistoryController.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephProjectListController' => 'applications/releeph/controller/project/ReleephProjectListController.php',
|
2013-03-22 14:29:37 +01:00
|
|
|
'ReleephProjectQuery' => 'applications/releeph/query/ReleephProjectQuery.php',
|
2013-07-21 17:44:53 +02:00
|
|
|
'ReleephProjectSearchEngine' => 'applications/releeph/query/ReleephProjectSearchEngine.php',
|
2013-08-20 18:31:27 +02:00
|
|
|
'ReleephProjectTransaction' => 'applications/releeph/storage/ReleephProjectTransaction.php',
|
2013-08-20 19:00:25 +02:00
|
|
|
'ReleephProjectTransactionQuery' => 'applications/releeph/query/ReleephProjectTransactionQuery.php',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephProjectViewController' => 'applications/releeph/controller/project/ReleephProjectViewController.php',
|
|
|
|
'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',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephRequestDifferentialCreateController' => 'applications/releeph/controller/request/ReleephRequestDifferentialCreateController.php',
|
|
|
|
'ReleephRequestEditController' => 'applications/releeph/controller/request/ReleephRequestEditController.php',
|
|
|
|
'ReleephRequestHeaderListView' => 'applications/releeph/view/request/header/ReleephRequestHeaderListView.php',
|
|
|
|
'ReleephRequestHeaderView' => 'applications/releeph/view/request/header/ReleephRequestHeaderView.php',
|
|
|
|
'ReleephRequestIntentsView' => 'applications/releeph/view/request/ReleephRequestIntentsView.php',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ReleephRequestMailReceiver' => 'applications/releeph/mail/ReleephRequestMailReceiver.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-03-15 12:28:43 +01:00
|
|
|
'ReleephRequestStatusView' => 'applications/releeph/view/request/ReleephRequestStatusView.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',
|
|
|
|
'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',
|
|
|
|
'ReleephStatusFieldSpecification' => 'applications/releeph/field/specification/ReleephStatusFieldSpecification.php',
|
|
|
|
'ReleephSummaryFieldSpecification' => 'applications/releeph/field/specification/ReleephSummaryFieldSpecification.php',
|
|
|
|
'ReleephUserView' => 'applications/releeph/view/user/ReleephUserView.php',
|
2013-11-09 03:19:48 +01:00
|
|
|
'RemoteCommandBuildStepImplementation' => 'applications/harbormaster/step/RemoteCommandBuildStepImplementation.php',
|
2013-11-09 03:09:03 +01:00
|
|
|
'ShellLogView' => 'applications/harbormaster/view/ShellLogView.php',
|
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
|
|
|
'SleepBuildStepImplementation' => 'applications/harbormaster/step/SleepBuildStepImplementation.php',
|
2013-04-16 17:18:52 +02:00
|
|
|
'SlowvoteEmbedView' => 'applications/slowvote/view/SlowvoteEmbedView.php',
|
|
|
|
'SlowvoteRemarkupRule' => 'applications/slowvote/remarkup/SlowvoteRemarkupRule.php',
|
2013-11-09 03:09:03 +01:00
|
|
|
'VariableBuildStepImplementation' => 'applications/harbormaster/step/VariableBuildStepImplementation.php',
|
2011-01-16 22:51:39 +01:00
|
|
|
),
|
|
|
|
'function' =>
|
|
|
|
array(
|
2012-06-01 21:10:26 +02:00
|
|
|
'_phabricator_date_format' => 'view/viewutils.php',
|
2013-09-04 02:27:38 +02:00
|
|
|
'_phabricator_time_format' => 'view/viewutils.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'celerity_generate_unique_node_id' => 'infrastructure/celerity/api.php',
|
|
|
|
'celerity_get_resource_uri' => 'infrastructure/celerity/api.php',
|
|
|
|
'celerity_register_resource_map' => 'infrastructure/celerity/map.php',
|
2013-04-06 02:01:35 +02:00
|
|
|
'implode_selected_handle_links' => 'applications/phid/handle/view/render.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_bytes' => 'view/viewutils.php',
|
|
|
|
'phabricator_format_local_time' => 'view/viewutils.php',
|
|
|
|
'phabricator_format_relative_time' => 'view/viewutils.php',
|
2012-06-01 21:39:29 +02:00
|
|
|
'phabricator_format_relative_time_detailed' => 'view/viewutils.php',
|
2012-06-01 21:10:26 +02:00
|
|
|
'phabricator_format_units_generic' => 'view/viewutils.php',
|
|
|
|
'phabricator_on_relative_date' => 'view/viewutils.php',
|
|
|
|
'phabricator_parse_bytes' => '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',
|
|
|
|
'require_celerity_resource' => 'infrastructure/celerity/api.php',
|
2011-01-16 22:51:39 +01:00
|
|
|
),
|
2012-05-30 23:26:29 +02:00
|
|
|
'xmap' =>
|
2011-01-16 22:51:39 +01:00
|
|
|
array(
|
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',
|
2013-07-16 22:31:20 +02:00
|
|
|
'AphrontAbstractAttachedFileView' => 'AphrontView',
|
2011-01-25 20:57:47 +01:00
|
|
|
'AphrontAjaxResponse' => 'AphrontResponse',
|
2013-03-05 17:46:09 +01:00
|
|
|
'AphrontBarView' => 'AphrontView',
|
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',
|
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
|
|
|
'AphrontCalendarMonthView' => 'AphrontView',
|
Tweak style on "Create Another Task" button
Summary:
Not totally sure I'm in love with this but I think it's somewhat non-terrible,
despite the lack of lens flare.
Also made "Cancel" take you back to the task if you got to "Create" from "Create
Another Task".
Test Plan:
- Style:
https://secure.phabricator.com/file/view/PHID-FILE-ad37d3c1f3b2c7a7a7d1/
- Hit "Cancel" from "Create Another", got sent back to task.
- Hit "Cancel" from normal create, got sent back to list.
- Tried to save an invalid task after making changes to CC/Projects, changes
were preserved.
Reviewed By: codeblock
Reviewers: hunterbridges, jungejason, tuomaspelkonen, aran, codeblock
CC: aran, epriestley, codeblock
Differential Revision: 736
2011-07-27 19:46:22 +02:00
|
|
|
'AphrontContextBarView' => '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',
|
|
|
|
'AphrontDialogView' => 'AphrontView',
|
|
|
|
'AphrontErrorView' => 'AphrontView',
|
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',
|
2013-02-06 23:03:52 +01:00
|
|
|
'AphrontFormCropControl' => 'AphrontFormControl',
|
2012-04-04 21:14:10 +02:00
|
|
|
'AphrontFormDateControl' => 'AphrontFormControl',
|
2011-02-05 02:53:14 +01:00
|
|
|
'AphrontFormDividerControl' => 'AphrontFormControl',
|
2011-01-23 03:33:00 +01:00
|
|
|
'AphrontFormFileControl' => 'AphrontFormControl',
|
2012-06-26 17:14:15 +02:00
|
|
|
'AphrontFormImageControl' => 'AphrontFormControl',
|
2012-03-16 01:10:19 +01:00
|
|
|
'AphrontFormInsetView' => 'AphrontView',
|
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',
|
2011-04-04 00:50:06 +02:00
|
|
|
'AphrontFormToggleButtonsControl' => 'AphrontFormControl',
|
2011-01-25 22:48:05 +01:00
|
|
|
'AphrontFormTokenizerControl' => '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',
|
2012-02-06 18:59:34 +01:00
|
|
|
'AphrontHTTPSinkTestCase' => 'PhabricatorTestCase',
|
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',
|
2012-02-15 01:23:53 +01:00
|
|
|
'AphrontMiniPanelView' => 'AphrontView',
|
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',
|
2013-03-08 02:23:30 +01:00
|
|
|
'AphrontNoteView' => 'AphrontView',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontNullView' => 'AphrontView',
|
2012-02-06 18:59:34 +01:00
|
|
|
'AphrontPHPHTTPSink' => 'AphrontHTTPSink',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontPageView' => 'AphrontView',
|
2011-04-01 02:06:33 +02:00
|
|
|
'AphrontPagerView' => 'AphrontView',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontPanelView' => 'AphrontView',
|
2012-01-15 20:06:13 +01:00
|
|
|
'AphrontPlainTextResponse' => 'AphrontResponse',
|
2013-03-05 17:46:09 +01:00
|
|
|
'AphrontProgressBarView' => 'AphrontBarView',
|
2012-03-13 05:39:05 +01:00
|
|
|
'AphrontProxyResponse' => 'AphrontResponse',
|
2011-01-16 22:51:39 +01:00
|
|
|
'AphrontRedirectResponse' => 'AphrontResponse',
|
2011-05-16 20:43:39 +02:00
|
|
|
'AphrontReloadResponse' => 'AphrontRedirectResponse',
|
2011-01-30 18:15:01 +01:00
|
|
|
'AphrontRequestFailureView' => 'AphrontView',
|
2012-01-04 06:57:45 +01:00
|
|
|
'AphrontRequestTestCase' => 'PhabricatorTestCase',
|
2011-12-17 02:08:18 +01:00
|
|
|
'AphrontSideNavFilterView' => 'AphrontView',
|
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',
|
2013-03-11 03:20:01 +01:00
|
|
|
'AphrontTwoColumnView' => 'AphrontView',
|
2011-04-04 04:20:47 +02:00
|
|
|
'AphrontTypeaheadTemplateView' => 'AphrontView',
|
2012-04-24 03:36:25 +02:00
|
|
|
'AphrontUsageException' => 'AphrontException',
|
2013-03-09 22:52:21 +01:00
|
|
|
'AphrontView' =>
|
|
|
|
array(
|
|
|
|
0 => 'Phobject',
|
|
|
|
1 => 'PhutilSafeHTMLProducerInterface',
|
|
|
|
),
|
2012-11-29 08:57:13 +01:00
|
|
|
'AphrontWebpageResponse' => 'AphrontHTMLResponse',
|
2013-10-22 02:00:21 +02:00
|
|
|
'AuditActionMenuEventListener' => 'PhabricatorEventListener',
|
2012-10-17 17:37:05 +02:00
|
|
|
'CelerityPhabricatorResourceController' => 'CelerityResourceController',
|
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',
|
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',
|
2013-07-01 21:36:34 +02:00
|
|
|
'ConduitAPIMethod' =>
|
|
|
|
array(
|
|
|
|
0 => 'Phobject',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2011-09-16 20:42:45 +02:00
|
|
|
'ConduitAPI_arcanist_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_arcanist_projectinfo_Method' => 'ConduitAPI_arcanist_Method',
|
2012-03-07 00:12:27 +01:00
|
|
|
'ConduitAPI_audit_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_audit_query_Method' => 'ConduitAPI_audit_Method',
|
2012-02-17 19:21:38 +01:00
|
|
|
'ConduitAPI_chatlog_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_chatlog_query_Method' => 'ConduitAPI_chatlog_Method',
|
|
|
|
'ConduitAPI_chatlog_record_Method' => 'ConduitAPI_chatlog_Method',
|
2011-01-24 20:30:10 +01:00
|
|
|
'ConduitAPI_conduit_connect_Method' => 'ConduitAPIMethod',
|
2011-06-14 21:17:14 +02:00
|
|
|
'ConduitAPI_conduit_getcertificate_Method' => 'ConduitAPIMethod',
|
2011-02-19 07:36:32 +01:00
|
|
|
'ConduitAPI_conduit_ping_Method' => 'ConduitAPIMethod',
|
2013-01-20 01:37:06 +01:00
|
|
|
'ConduitAPI_conduit_query_Method' => 'ConduitAPIMethod',
|
2013-05-31 01:37:51 +02:00
|
|
|
'ConduitAPI_conpherence_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_conpherence_createthread_Method' => 'ConduitAPI_conpherence_Method',
|
2013-05-31 19:43:46 +02:00
|
|
|
'ConduitAPI_conpherence_querythread_Method' => 'ConduitAPI_conpherence_Method',
|
2013-05-31 20:27:49 +02:00
|
|
|
'ConduitAPI_conpherence_querytransaction_Method' => 'ConduitAPI_conpherence_Method',
|
2013-05-31 23:58:02 +02:00
|
|
|
'ConduitAPI_conpherence_updatethread_Method' => 'ConduitAPI_conpherence_Method',
|
2012-06-20 21:35:04 +02:00
|
|
|
'ConduitAPI_differential_Method' => 'ConduitAPIMethod',
|
2012-04-24 02:40:57 +02:00
|
|
|
'ConduitAPI_differential_close_Method' => 'ConduitAPIMethod',
|
2011-11-18 18:16:40 +01:00
|
|
|
'ConduitAPI_differential_createcomment_Method' => 'ConduitAPIMethod',
|
2011-01-24 20:01:53 +01:00
|
|
|
'ConduitAPI_differential_creatediff_Method' => 'ConduitAPIMethod',
|
2012-07-19 05:01:23 +02:00
|
|
|
'ConduitAPI_differential_createinline_Method' => 'ConduitAPI_differential_Method',
|
2012-06-20 21:35:04 +02:00
|
|
|
'ConduitAPI_differential_createrawdiff_Method' => 'ConduitAPI_differential_Method',
|
2011-02-06 22:49:23 +01:00
|
|
|
'ConduitAPI_differential_createrevision_Method' => 'ConduitAPIMethod',
|
2011-02-06 23:43:06 +01:00
|
|
|
'ConduitAPI_differential_find_Method' => 'ConduitAPIMethod',
|
2012-06-15 02:09:24 +02:00
|
|
|
'ConduitAPI_differential_finishpostponedlinters_Method' => 'ConduitAPIMethod',
|
2011-04-21 00:29:02 +02:00
|
|
|
'ConduitAPI_differential_getalldiffs_Method' => 'ConduitAPIMethod',
|
2011-02-09 18:41:26 +01:00
|
|
|
'ConduitAPI_differential_getcommitmessage_Method' => 'ConduitAPIMethod',
|
2011-02-19 07:28:03 +01:00
|
|
|
'ConduitAPI_differential_getcommitpaths_Method' => 'ConduitAPIMethod',
|
2011-02-19 07:15:28 +01:00
|
|
|
'ConduitAPI_differential_getdiff_Method' => 'ConduitAPIMethod',
|
2013-10-03 02:03:53 +02:00
|
|
|
'ConduitAPI_differential_getrawdiff_Method' => 'ConduitAPIMethod',
|
2011-04-21 01:38:16 +02:00
|
|
|
'ConduitAPI_differential_getrevision_Method' => 'ConduitAPIMethod',
|
2012-07-19 05:01:23 +02:00
|
|
|
'ConduitAPI_differential_getrevisioncomments_Method' => 'ConduitAPI_differential_Method',
|
2011-02-09 18:48:26 +01:00
|
|
|
'ConduitAPI_differential_markcommitted_Method' => 'ConduitAPIMethod',
|
2011-02-06 22:42:00 +01:00
|
|
|
'ConduitAPI_differential_parsecommitmessage_Method' => 'ConduitAPIMethod',
|
2011-12-02 01:57:06 +01:00
|
|
|
'ConduitAPI_differential_query_Method' => 'ConduitAPIMethod',
|
2013-09-17 22:55:41 +02:00
|
|
|
'ConduitAPI_differential_querydiffs_Method' => 'ConduitAPIMethod',
|
2011-01-24 21:07:34 +01:00
|
|
|
'ConduitAPI_differential_setdiffproperty_Method' => 'ConduitAPIMethod',
|
2011-02-06 23:00:32 +01:00
|
|
|
'ConduitAPI_differential_updaterevision_Method' => 'ConduitAPIMethod',
|
2011-06-09 01:16:59 +02:00
|
|
|
'ConduitAPI_differential_updateunitresults_Method' => 'ConduitAPIMethod',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_diffusion_Method' => 'ConduitAPIMethod',
|
2013-05-01 23:44:28 +02:00
|
|
|
'ConduitAPI_diffusion_abstractquery_Method' => 'ConduitAPI_diffusion_Method',
|
2013-05-01 23:56:36 +02:00
|
|
|
'ConduitAPI_diffusion_branchquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
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
|
|
|
'ConduitAPI_diffusion_browsequery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-05-18 01:54:10 +02:00
|
|
|
'ConduitAPI_diffusion_commitbranchesquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
Diffusion - move commit parents query to conduit
Summary:
Ref T2784. Relatively complicated one as this bad boy is used in a repository daemon.
While testing, I noticed bugs in the expandshortname query stuff. Those variables are private to the parent class so they need some setX love.
Also, was unable to find links to the "before" stuff, but made them by hand by looking at some of these T2784 diffs, browsing a file at a specific revision, then hacking the "before" variable to be some known commit that also touched the file. This produced sensical results. On the process of doing that I upgraded a query to use the proper policy query.
Test Plan: In git, mercurial, svn, verified on a commit page the "parents" showed up correctly. played around with ?before parameter on specific file browse page, with commits known to have interesting history and stuff looked good
Reviewers: epriestley
Reviewed By: epriestley
CC: aran, Korvin
Maniphest Tasks: T2784
Differential Revision: https://secure.phabricator.com/D5988
2013-05-22 01:22:49 +02:00
|
|
|
'ConduitAPI_diffusion_commitparentsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-09-09 23:25:08 +02:00
|
|
|
'ConduitAPI_diffusion_createcomment_Method' => 'ConduitAPI_diffusion_Method',
|
2013-05-14 22:53:32 +02:00
|
|
|
'ConduitAPI_diffusion_diffquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-05-01 23:44:28 +02:00
|
|
|
'ConduitAPI_diffusion_existsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-05-07 23:57:08 +02:00
|
|
|
'ConduitAPI_diffusion_filecontentquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_diffusion_findsymbols_Method' => 'ConduitAPI_diffusion_Method',
|
|
|
|
'ConduitAPI_diffusion_getcommits_Method' => 'ConduitAPI_diffusion_Method',
|
|
|
|
'ConduitAPI_diffusion_getlintmessages_Method' => 'ConduitAPI_diffusion_Method',
|
|
|
|
'ConduitAPI_diffusion_getrecentcommitsbypath_Method' => 'ConduitAPI_diffusion_Method',
|
2013-05-20 21:45:34 +02:00
|
|
|
'ConduitAPI_diffusion_historyquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-05-14 22:53:32 +02:00
|
|
|
'ConduitAPI_diffusion_lastmodifiedquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-10-31 23:46:57 +01:00
|
|
|
'ConduitAPI_diffusion_looksoon_Method' => 'ConduitAPI_diffusion_Method',
|
2013-05-21 02:04:51 +02:00
|
|
|
'ConduitAPI_diffusion_mergedcommitsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-05-14 22:53:32 +02:00
|
|
|
'ConduitAPI_diffusion_rawdiffquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-05-21 22:47:06 +02:00
|
|
|
'ConduitAPI_diffusion_readmequery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-05-17 23:13:48 +02:00
|
|
|
'ConduitAPI_diffusion_refsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-11-04 23:13:07 +01:00
|
|
|
'ConduitAPI_diffusion_resolverefs_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-05-17 23:11:20 +02:00
|
|
|
'ConduitAPI_diffusion_searchquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-05-11 00:22:35 +02:00
|
|
|
'ConduitAPI_diffusion_tagsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_feed_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_feed_publish_Method' => 'ConduitAPI_feed_Method',
|
|
|
|
'ConduitAPI_feed_query_Method' => 'ConduitAPI_feed_Method',
|
|
|
|
'ConduitAPI_file_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_file_download_Method' => 'ConduitAPI_file_Method',
|
|
|
|
'ConduitAPI_file_info_Method' => 'ConduitAPI_file_Method',
|
|
|
|
'ConduitAPI_file_upload_Method' => 'ConduitAPI_file_Method',
|
|
|
|
'ConduitAPI_file_uploadhash_Method' => 'ConduitAPI_file_Method',
|
2012-03-28 01:22:40 +02:00
|
|
|
'ConduitAPI_flag_Method' => 'ConduitAPIMethod',
|
2012-08-02 21:25:01 +02:00
|
|
|
'ConduitAPI_flag_delete_Method' => 'ConduitAPI_flag_Method',
|
2012-08-03 20:41:33 +02:00
|
|
|
'ConduitAPI_flag_edit_Method' => 'ConduitAPI_flag_Method',
|
2012-03-28 01:22:40 +02:00
|
|
|
'ConduitAPI_flag_query_Method' => 'ConduitAPI_flag_Method',
|
2012-03-09 21:40:03 +01:00
|
|
|
'ConduitAPI_macro_Method' => 'ConduitAPIMethod',
|
2013-06-08 00:08:34 +02:00
|
|
|
'ConduitAPI_macro_creatememe_Method' => 'ConduitAPI_macro_Method',
|
2012-03-09 21:40:03 +01:00
|
|
|
'ConduitAPI_macro_query_Method' => 'ConduitAPI_macro_Method',
|
2011-08-18 00:19:48 +02:00
|
|
|
'ConduitAPI_maniphest_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_maniphest_createtask_Method' => 'ConduitAPI_maniphest_Method',
|
2012-06-29 18:17:19 +02:00
|
|
|
'ConduitAPI_maniphest_find_Method' => 'ConduitAPI_maniphest_query_Method',
|
2012-01-11 04:51:55 +01:00
|
|
|
'ConduitAPI_maniphest_gettasktransactions_Method' => 'ConduitAPI_maniphest_Method',
|
2011-08-18 00:19:48 +02:00
|
|
|
'ConduitAPI_maniphest_info_Method' => 'ConduitAPI_maniphest_Method',
|
2012-06-29 18:17:19 +02:00
|
|
|
'ConduitAPI_maniphest_query_Method' => 'ConduitAPI_maniphest_Method',
|
2012-01-06 04:02:50 +01:00
|
|
|
'ConduitAPI_maniphest_update_Method' => 'ConduitAPI_maniphest_Method',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_owners_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_owners_query_Method' => 'ConduitAPI_owners_Method',
|
2011-07-30 03:31:14 +02:00
|
|
|
'ConduitAPI_paste_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_paste_create_Method' => 'ConduitAPI_paste_Method',
|
|
|
|
'ConduitAPI_paste_info_Method' => 'ConduitAPI_paste_Method',
|
2012-08-24 22:20:20 +02:00
|
|
|
'ConduitAPI_paste_query_Method' => 'ConduitAPI_paste_Method',
|
2013-11-03 00:31:30 +01:00
|
|
|
'ConduitAPI_phame_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_phame_query_Method' => 'ConduitAPI_phame_Method',
|
|
|
|
'ConduitAPI_phame_queryposts_Method' => 'ConduitAPI_phame_Method',
|
2011-08-30 21:03:58 +02:00
|
|
|
'ConduitAPI_phid_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_phid_info_Method' => 'ConduitAPI_phid_Method',
|
2012-08-03 20:41:33 +02:00
|
|
|
'ConduitAPI_phid_lookup_Method' => 'ConduitAPI_phid_Method',
|
2012-02-15 03:26:27 +01:00
|
|
|
'ConduitAPI_phid_query_Method' => 'ConduitAPI_phid_Method',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_phpast_Method' => 'ConduitAPIMethod',
|
2013-03-13 23:15:58 +01:00
|
|
|
'ConduitAPI_phpast_getast_Method' => 'ConduitAPI_phpast_Method',
|
|
|
|
'ConduitAPI_phpast_version_Method' => 'ConduitAPI_phpast_Method',
|
2011-08-26 21:50:28 +02:00
|
|
|
'ConduitAPI_phriction_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_phriction_edit_Method' => 'ConduitAPI_phriction_Method',
|
|
|
|
'ConduitAPI_phriction_history_Method' => 'ConduitAPI_phriction_Method',
|
|
|
|
'ConduitAPI_phriction_info_Method' => 'ConduitAPI_phriction_Method',
|
2012-01-18 01:29:35 +01:00
|
|
|
'ConduitAPI_project_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_project_query_Method' => 'ConduitAPI_project_Method',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ConduitAPI_releeph_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_releeph_getbranches_Method' => 'ConduitAPI_releeph_Method',
|
|
|
|
'ConduitAPI_releeph_projectinfo_Method' => 'ConduitAPI_releeph_Method',
|
2013-04-26 18:07:38 +02:00
|
|
|
'ConduitAPI_releeph_queryrequests_Method' => 'ConduitAPI_releeph_Method',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ConduitAPI_releeph_request_Method' => 'ConduitAPI_releeph_Method',
|
|
|
|
'ConduitAPI_releephwork_canpush_Method' => 'ConduitAPI_releeph_Method',
|
|
|
|
'ConduitAPI_releephwork_getauthorinfo_Method' => 'ConduitAPI_releeph_Method',
|
|
|
|
'ConduitAPI_releephwork_getbranch_Method' => 'ConduitAPI_releeph_Method',
|
|
|
|
'ConduitAPI_releephwork_getbranchcommitmessage_Method' => 'ConduitAPI_releeph_Method',
|
|
|
|
'ConduitAPI_releephwork_getcommitmessage_Method' => 'ConduitAPI_releeph_Method',
|
|
|
|
'ConduitAPI_releephwork_getorigcommitmessage_Method' => 'ConduitAPI_releeph_Method',
|
|
|
|
'ConduitAPI_releephwork_nextrequest_Method' => 'ConduitAPI_releeph_Method',
|
|
|
|
'ConduitAPI_releephwork_record_Method' => 'ConduitAPI_releeph_Method',
|
|
|
|
'ConduitAPI_releephwork_recordpickstatus_Method' => 'ConduitAPI_releeph_Method',
|
2012-02-03 01:42:29 +01:00
|
|
|
'ConduitAPI_remarkup_process_Method' => 'ConduitAPIMethod',
|
2012-05-05 01:16:22 +02:00
|
|
|
'ConduitAPI_repository_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_repository_create_Method' => 'ConduitAPI_repository_Method',
|
|
|
|
'ConduitAPI_repository_query_Method' => 'ConduitAPI_repository_Method',
|
2013-03-13 15:09:05 +01:00
|
|
|
'ConduitAPI_slowvote_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_slowvote_info_Method' => 'ConduitAPI_slowvote_Method',
|
2013-02-15 16:47:14 +01:00
|
|
|
'ConduitAPI_token_Method' => 'ConduitAPIMethod',
|
|
|
|
'ConduitAPI_token_give_Method' => 'ConduitAPI_token_Method',
|
|
|
|
'ConduitAPI_token_given_Method' => 'ConduitAPI_token_Method',
|
|
|
|
'ConduitAPI_token_query_Method' => 'ConduitAPI_token_Method',
|
2011-08-30 21:03:58 +02:00
|
|
|
'ConduitAPI_user_Method' => 'ConduitAPIMethod',
|
2012-05-04 00:47:34 +02:00
|
|
|
'ConduitAPI_user_addstatus_Method' => 'ConduitAPI_user_Method',
|
2012-05-18 20:51:24 +02:00
|
|
|
'ConduitAPI_user_disable_Method' => 'ConduitAPI_user_Method',
|
2012-06-19 23:36:08 +02:00
|
|
|
'ConduitAPI_user_enable_Method' => 'ConduitAPI_user_Method',
|
2011-08-30 21:03:58 +02:00
|
|
|
'ConduitAPI_user_find_Method' => 'ConduitAPI_user_Method',
|
|
|
|
'ConduitAPI_user_info_Method' => 'ConduitAPI_user_Method',
|
2012-05-07 22:35:09 +02:00
|
|
|
'ConduitAPI_user_query_Method' => 'ConduitAPI_user_Method',
|
2012-05-05 20:29:09 +02:00
|
|
|
'ConduitAPI_user_removestatus_Method' => 'ConduitAPI_user_Method',
|
2011-08-30 21:03:58 +02:00
|
|
|
'ConduitAPI_user_whoami_Method' => 'ConduitAPI_user_Method',
|
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',
|
2012-05-30 23:26:29 +02:00
|
|
|
'ConduitException' => 'Exception',
|
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',
|
2013-10-22 02:00:21 +02:00
|
|
|
'ConpherenceActionMenuEventListener' => 'PhabricatorEventListener',
|
2013-01-26 01:03:54 +01:00
|
|
|
'ConpherenceConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceController' => 'PhabricatorController',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ConpherenceCreateThreadMailReceiver' => 'PhabricatorMailReceiver',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'ConpherenceEditor' => 'PhabricatorApplicationTransactionEditor',
|
2013-04-02 18:32:40 +02:00
|
|
|
'ConpherenceFileWidgetView' => 'ConpherenceWidgetView',
|
2013-10-22 02:00:21 +02:00
|
|
|
'ConpherenceHovercardEventListener' => 'PhabricatorEventListener',
|
2013-04-01 21:43:07 +02:00
|
|
|
'ConpherenceLayoutView' => 'AphrontView',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceListController' => 'ConpherenceController',
|
|
|
|
'ConpherenceMenuItemView' => 'AphrontTagView',
|
|
|
|
'ConpherenceNewController' => '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',
|
2013-01-26 01:03:54 +01:00
|
|
|
'ConpherenceReplyHandler' => 'PhabricatorMailReplyHandler',
|
2013-03-26 21:30:35 +01:00
|
|
|
'ConpherenceSettings' => 'ConpherenceConstants',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceThread' =>
|
|
|
|
array(
|
|
|
|
0 => 'ConpherenceDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2013-04-01 21:50:39 +02:00
|
|
|
'ConpherenceThreadListView' => 'AphrontView',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ConpherenceThreadMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceThreadQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-06-04 00:40:00 +02:00
|
|
|
'ConpherenceTimeUtilTestCase' => 'PhabricatorTestCase',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'ConpherenceTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'ConpherenceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'ConpherenceTransactionType' => 'ConpherenceConstants',
|
|
|
|
'ConpherenceTransactionView' => 'AphrontView',
|
2013-04-10 20:37:04 +02:00
|
|
|
'ConpherenceUpdateActions' => 'ConpherenceConstants',
|
2013-01-25 02:23:05 +01:00
|
|
|
'ConpherenceUpdateController' => 'ConpherenceController',
|
|
|
|
'ConpherenceViewController' => 'ConpherenceController',
|
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',
|
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',
|
2011-09-30 21:54:17 +02:00
|
|
|
'DarkConsoleEventPlugin' => 'DarkConsolePlugin',
|
2013-10-22 02:00:21 +02:00
|
|
|
'DarkConsoleEventPluginAPI' => 'PhabricatorEventListener',
|
2011-02-02 22:48:52 +01:00
|
|
|
'DarkConsoleRequestPlugin' => 'DarkConsolePlugin',
|
|
|
|
'DarkConsoleServicesPlugin' => 'DarkConsolePlugin',
|
|
|
|
'DarkConsoleXHProfPlugin' => 'DarkConsolePlugin',
|
2012-05-30 23:26:29 +02:00
|
|
|
'DefaultDatabaseConfigurationProvider' => 'DatabaseConfigurationProvider',
|
Improve behavior when user submits a no-op action in Differential
Summary:
See T730 and the slightly-less-pretty version of this in D1398.
When a user takes an action in Differential that has no effect (for instance,
accepting an already-accepted revision), prompt them:
Action Has No Effect
You can not accept this revision because it has already been accepted.
Do you want to post the feedback anyway, as a normal comment?
[Cancel] [Post as Comment]
If they have no comment text, the dialog only says "Cancel".
I think this is probably the best way to balance all the concerns here -- it
might occasionally be a little annoying, but that should be rare, and it should
never be confusing (the current workflow is extremely confusing).
This also fixes the issue where you can add all sorts of CCs who are already
part of the revision, either explicitly or via mentions.
Test Plan:
Posted some has-effect and has-no-effect comments, made different
choices in the dialog, everything seems to work OK?
Reviewers: vrana, btrahan, jungejason
Reviewed By: vrana
CC: aran, vrana
Maniphest Tasks: T730
Differential Revision: https://secure.phabricator.com/D1403
2012-01-14 20:39:22 +01:00
|
|
|
'DifferentialActionHasNoEffectException' => 'DifferentialException',
|
2013-10-22 02:00:21 +02:00
|
|
|
'DifferentialActionMenuEventListener' => 'PhabricatorEventListener',
|
2011-01-30 20:02:22 +01:00
|
|
|
'DifferentialAddCommentView' => 'AphrontView',
|
2011-09-14 19:59:52 +02:00
|
|
|
'DifferentialAffectedPath' => 'DifferentialDAO',
|
2011-08-14 20:29:56 +02:00
|
|
|
'DifferentialApplyPatchFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-08-14 21:33:54 +02:00
|
|
|
'DifferentialArcanistProjectFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-07-10 01:22:33 +02:00
|
|
|
'DifferentialAsanaRepresentationFieldSpecification' => 'DifferentialFieldSpecification',
|
2012-03-07 00:10:35 +01:00
|
|
|
'DifferentialAuditorsFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-08-14 21:33:54 +02:00
|
|
|
'DifferentialAuthorFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-08-10 20:29:08 +02:00
|
|
|
'DifferentialAuxiliaryField' => 'DifferentialDAO',
|
2011-08-11 00:36:18 +02:00
|
|
|
'DifferentialBlameRevisionFieldSpecification' => 'DifferentialFieldSpecification',
|
2012-02-07 01:34:25 +01:00
|
|
|
'DifferentialBranchFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-01-26 02:17:19 +01:00
|
|
|
'DifferentialCCWelcomeMail' => 'DifferentialReviewRequestMail',
|
2011-08-14 22:55:30 +02:00
|
|
|
'DifferentialCCsFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-10-09 22:58:00 +02:00
|
|
|
'DifferentialCapabilityDefaultView' => 'PhabricatorPolicyCapability',
|
2011-01-24 20:01:53 +01:00
|
|
|
'DifferentialChangeset' => 'DifferentialDAO',
|
2011-01-24 22:18:41 +01:00
|
|
|
'DifferentialChangesetDetailView' => 'AphrontView',
|
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',
|
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',
|
|
|
|
'DifferentialChangesetParserTestCase' => 'PhabricatorTestCase',
|
|
|
|
'DifferentialChangesetTestRenderer' => 'DifferentialChangesetRenderer',
|
|
|
|
'DifferentialChangesetTwoUpRenderer' => 'DifferentialChangesetHTMLRenderer',
|
|
|
|
'DifferentialChangesetTwoUpTestRenderer' => 'DifferentialChangesetTestRenderer',
|
2011-01-25 00:52:35 +01:00
|
|
|
'DifferentialChangesetViewController' => 'DifferentialController',
|
2012-10-24 02:34:43 +02:00
|
|
|
'DifferentialComment' =>
|
|
|
|
array(
|
|
|
|
0 => 'DifferentialDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
|
|
|
),
|
2012-10-10 19:18:23 +02:00
|
|
|
'DifferentialCommentEditor' => 'PhabricatorEditor',
|
2011-01-30 21:08:40 +01:00
|
|
|
'DifferentialCommentMail' => 'DifferentialMail',
|
2011-02-01 03:05:20 +01:00
|
|
|
'DifferentialCommentPreviewController' => 'DifferentialController',
|
Put all DifferentialComment loading behind DifferentialCommentQuery
Summary:
Ref T2222.
I'm thinking about how I want to approach the Asana sync, and I want to try to do T2222 first so that we can build it cleanly on top of ApplicationTransactions. I think we can at least walk down this road a little bit and if it turns out to be scary we can take another approach.
I was generally very happy with how the auth migration turned out (seemingly, it was almost completely clean), and want to pursue a similar strategy here. Basically:
- Wrap the new objects in the old objects for reads/writes.
- Migrate all the existing data to the new table.
- Everything hard is done; move things over a piece at a time at a leisurely pace in lots of smallish, relatively-easy-to-understand changes.
This deletes or abstracts all reads of the DifferentialComment table. In particular, these things are **deleted**:
- The script `undo_commits.php`, which I haven't pointed anyone at in a very long time.
- The `differential.getrevisionfeedback` Conduit method, which has been marked deprecated for a year or more.
- The `/stats/` interface in Differential, which should be rebuilt on Fact and has never been exposed in the UI. It does a ton of joins and such which are prohibitively difficult to migrate.
This leaves a small number of reading interfaces, which I replaced with a new `DifferentialCommentQuery`. Some future change will make this actually load transactions and wrap them with DifferentialComment interfaces.
Test Plan: Viewed a revision; made revision comments
Reviewers: btrahan
Reviewed By: btrahan
CC: edward, chad, aran
Maniphest Tasks: T2222
Differential Revision: https://secure.phabricator.com/D6260
2013-06-21 21:51:18 +02:00
|
|
|
'DifferentialCommentQuery' => 'PhabricatorOffsetPagedQuery',
|
2011-01-30 21:08:40 +01:00
|
|
|
'DifferentialCommentSaveController' => 'DifferentialController',
|
2011-08-14 21:33:54 +02:00
|
|
|
'DifferentialCommitsFieldSpecification' => 'DifferentialFieldSpecification',
|
2012-12-12 01:34:08 +01:00
|
|
|
'DifferentialConflictsFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-01-24 22:18:41 +01:00
|
|
|
'DifferentialController' => 'PhabricatorController',
|
2013-09-26 22:48:36 +02:00
|
|
|
'DifferentialCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage',
|
|
|
|
'DifferentialCustomFieldStorage' => 'PhabricatorCustomFieldStorage',
|
|
|
|
'DifferentialCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage',
|
2011-01-24 20:01:53 +01:00
|
|
|
'DifferentialDAO' => 'PhabricatorLiskDAO',
|
2012-02-20 14:38:21 +01:00
|
|
|
'DifferentialDateCreatedFieldSpecification' => 'DifferentialFieldSpecification',
|
|
|
|
'DifferentialDateModifiedFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-08-10 20:29:08 +02:00
|
|
|
'DifferentialDefaultFieldSelector' => 'DifferentialFieldSelector',
|
2011-08-14 21:33:54 +02:00
|
|
|
'DifferentialDependenciesFieldSpecification' => 'DifferentialFieldSpecification',
|
2012-08-29 00:24:01 +02:00
|
|
|
'DifferentialDependsOnFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-07-01 21:38:42 +02:00
|
|
|
'DifferentialDiff' =>
|
|
|
|
array(
|
|
|
|
0 => 'DifferentialDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2011-01-26 02:17:19 +01:00
|
|
|
'DifferentialDiffContentMail' => 'DifferentialMail',
|
2011-02-05 21:20:18 +01:00
|
|
|
'DifferentialDiffCreateController' => 'DifferentialController',
|
2011-01-24 21:07:34 +01:00
|
|
|
'DifferentialDiffProperty' => 'DifferentialDAO',
|
2013-07-01 21:38:42 +02:00
|
|
|
'DifferentialDiffQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2011-01-24 22:18:41 +01:00
|
|
|
'DifferentialDiffTableOfContentsView' => 'AphrontView',
|
2012-11-21 21:30:38 +01:00
|
|
|
'DifferentialDiffTestCase' => 'ArcanistPhutilTestCase',
|
2011-01-24 22:18:41 +01:00
|
|
|
'DifferentialDiffViewController' => 'DifferentialController',
|
2013-07-03 20:29:57 +02:00
|
|
|
'DifferentialDiffViewPolicyFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-07-26 17:56:35 +02:00
|
|
|
'DifferentialDoorkeeperRevisionFeedStoryPublisher' => 'DoorkeeperFeedStoryPublisher',
|
2013-09-26 23:17:11 +02:00
|
|
|
'DifferentialEditPolicyFieldSpecification' => 'DifferentialFieldSpecification',
|
2012-05-30 23:26:29 +02:00
|
|
|
'DifferentialException' => 'Exception',
|
2011-05-01 04:40:05 +02:00
|
|
|
'DifferentialExceptionMail' => 'DifferentialMail',
|
2011-08-14 20:29:56 +02:00
|
|
|
'DifferentialExportPatchFieldSpecification' => 'DifferentialFieldSpecification',
|
2012-05-30 23:26:29 +02:00
|
|
|
'DifferentialFieldDataNotAvailableException' => 'Exception',
|
|
|
|
'DifferentialFieldParseException' => 'Exception',
|
|
|
|
'DifferentialFieldSpecificationIncompleteException' => 'Exception',
|
|
|
|
'DifferentialFieldValidationException' => 'Exception',
|
2012-09-11 19:37:30 +02:00
|
|
|
'DifferentialFreeformFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-05-06 21:33:37 +02:00
|
|
|
'DifferentialFreeformFieldTestCase' => 'PhabricatorTestCase',
|
2011-08-15 03:52:09 +02:00
|
|
|
'DifferentialGitSVNIDFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-08-14 20:29:56 +02:00
|
|
|
'DifferentialHostFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-10-22 02:00:21 +02:00
|
|
|
'DifferentialHovercardEventListener' => 'PhabricatorEventListener',
|
2011-01-24 20:01:53 +01:00
|
|
|
'DifferentialHunk' => 'DifferentialDAO',
|
2013-01-09 22:11:17 +01:00
|
|
|
'DifferentialHunkParserTestCase' => 'PhabricatorTestCase',
|
2012-06-27 19:44:29 +02:00
|
|
|
'DifferentialHunkTestCase' => 'ArcanistPhutilTestCase',
|
2013-10-19 23:23:19 +02:00
|
|
|
'DifferentialInlineComment' => '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',
|
2012-02-29 23:28:48 +01:00
|
|
|
'DifferentialInlineCommentEditView' => 'AphrontView',
|
2012-07-23 20:01:28 +02:00
|
|
|
'DifferentialInlineCommentPreviewController' => 'PhabricatorInlineCommentPreviewController',
|
2013-06-21 21:54:56 +02:00
|
|
|
'DifferentialInlineCommentQuery' => 'PhabricatorOffsetPagedQuery',
|
2011-02-02 01:42:36 +01:00
|
|
|
'DifferentialInlineCommentView' => 'AphrontView',
|
2013-09-04 02:27:51 +02:00
|
|
|
'DifferentialJIRAIssuesFieldSpecification' => 'DifferentialFieldSpecification',
|
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',
|
|
|
|
'DifferentialLandingToHostedGit' => 'DifferentialLandingStrategy',
|
2013-11-08 20:37:57 +01:00
|
|
|
'DifferentialLandingToHostedMercurial' => 'DifferentialLandingStrategy',
|
2011-08-14 20:29:56 +02:00
|
|
|
'DifferentialLinesFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-08-14 22:55:30 +02:00
|
|
|
'DifferentialLintFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-08-30 20:34:07 +02:00
|
|
|
'DifferentialLocalCommitsView' => 'AphrontView',
|
2013-03-01 02:15:09 +01:00
|
|
|
'DifferentialMail' => 'PhabricatorMail',
|
2011-08-14 21:33:54 +02:00
|
|
|
'DifferentialManiphestTasksFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-01-26 02:17:19 +01:00
|
|
|
'DifferentialNewDiffMail' => 'DifferentialReviewRequestMail',
|
2013-11-06 22:59:06 +01:00
|
|
|
'DifferentialPHIDTypeDiff' => 'PhabricatorPHIDType',
|
2013-07-21 17:11:37 +02:00
|
|
|
'DifferentialPHIDTypeRevision' => 'PhabricatorPHIDType',
|
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',
|
2011-08-14 20:29:56 +02:00
|
|
|
'DifferentialPathFieldSpecification' => 'DifferentialFieldSpecification',
|
2012-12-06 20:33:04 +01:00
|
|
|
'DifferentialPrimaryPaneView' => 'AphrontView',
|
2013-10-05 16:54:42 +02:00
|
|
|
'DifferentialProjectReviewersFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-03-15 12:28:43 +01:00
|
|
|
'DifferentialReleephRequestFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-02-27 16:18:30 +01:00
|
|
|
'DifferentialRemarkupRule' => 'PhabricatorRemarkupRuleObject',
|
2011-05-10 01:31:26 +02:00
|
|
|
'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler',
|
2013-09-26 23:17:11 +02:00
|
|
|
'DifferentialRepositoryFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-09-27 00:28:42 +02:00
|
|
|
'DifferentialRepositoryLookup' => 'Phobject',
|
2012-05-01 19:15:56 +02:00
|
|
|
'DifferentialResultsTableView' => 'AphrontView',
|
2011-08-11 00:36:18 +02:00
|
|
|
'DifferentialRevertPlanFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-01-26 02:17:19 +01:00
|
|
|
'DifferentialReviewRequestMail' => 'DifferentialMail',
|
2011-08-15 03:52:09 +02:00
|
|
|
'DifferentialReviewedByFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-08-14 22:55:30 +02:00
|
|
|
'DifferentialReviewersFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-10-05 16:54:42 +02:00
|
|
|
'DifferentialReviewersView' => 'AphrontView',
|
2013-02-15 16:47:14 +01:00
|
|
|
'DifferentialRevision' =>
|
|
|
|
array(
|
|
|
|
0 => 'DifferentialDAO',
|
|
|
|
1 => 'PhabricatorTokenReceiverInterface',
|
|
|
|
2 => 'PhabricatorPolicyInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
3 => 'PhabricatorFlaggableInterface',
|
|
|
|
4 => 'PhrequentTrackableInterface',
|
2013-02-15 16:47:14 +01:00
|
|
|
),
|
2011-01-30 19:37:36 +01:00
|
|
|
'DifferentialRevisionCommentListView' => 'AphrontView',
|
|
|
|
'DifferentialRevisionCommentView' => 'AphrontView',
|
2011-01-27 23:55:52 +01:00
|
|
|
'DifferentialRevisionDetailView' => 'AphrontView',
|
2011-01-25 22:26:09 +01:00
|
|
|
'DifferentialRevisionEditController' => 'DifferentialController',
|
2012-10-10 19:18:23 +02:00
|
|
|
'DifferentialRevisionEditor' => 'PhabricatorEditor',
|
Emit full URIs to identify Differential revisions
Summary:
- Previously, used IDs like "33" to match a commit to a Differential revision.
This has a namespacing problem because we now have an arbitrarily large number
of Phabricator installs in the world, and they may want to track commits from
other installs.
- In Differential, parse raw IDs or full URIs. Emit only full URIs.
- In Repositories, parse only full URIs.
- This might cause a few commits to not be picked up in rare circumstances.
Users can fix them with "arc mark-committed". This should be exceedingly rare
because of hash matching.
- There are some caveats for reparsing older repositories, see comments
inline. I don't think there's much broad impact here.
Test Plan:
- Created a new revision, got a full URI.
- Updated revision, worked correctly.
- Ran unit tests.
- Monkeyed with "Differential Revision" field.
- Reviewers: btrahan, jungejason
Reviewers: btrahan, jungejason
Reviewed By: jungejason
CC: aran, epriestley, jungejason
Maniphest Tasks: T54, T692
Differential Revision: 1250
2011-12-21 00:40:24 +01:00
|
|
|
'DifferentialRevisionIDFieldParserTestCase' => 'PhabricatorTestCase',
|
2011-08-15 03:52:09 +02:00
|
|
|
'DifferentialRevisionIDFieldSpecification' => 'DifferentialFieldSpecification',
|
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',
|
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
|
|
|
'DifferentialRevisionListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'DifferentialController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2011-10-02 20:42:41 +02:00
|
|
|
'DifferentialRevisionListView' => 'AphrontView',
|
2013-05-14 19:57:41 +02:00
|
|
|
'DifferentialRevisionMailReceiver' => 'PhabricatorObjectMailReceiver',
|
[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',
|
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',
|
2012-02-19 05:16:35 +01:00
|
|
|
'DifferentialRevisionStatsView' => 'AphrontView',
|
2011-08-14 22:55:30 +02:00
|
|
|
'DifferentialRevisionStatusFieldSpecification' => 'DifferentialFieldSpecification',
|
2011-01-27 23:55:52 +01:00
|
|
|
'DifferentialRevisionUpdateHistoryView' => 'AphrontView',
|
|
|
|
'DifferentialRevisionViewController' => 'DifferentialController',
|
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
|
|
|
'DifferentialSearchIndexer' => 'PhabricatorSearchDocumentIndexer',
|
2011-02-19 23:36:13 +01:00
|
|
|
'DifferentialSubscribeController' => 'DifferentialController',
|
2012-09-11 19:37:30 +02:00
|
|
|
'DifferentialSummaryFieldSpecification' => 'DifferentialFreeformFieldSpecification',
|
2011-08-14 23:28:08 +02:00
|
|
|
'DifferentialTestPlanFieldSpecification' => 'DifferentialFieldSpecification',
|
2012-09-11 19:37:30 +02:00
|
|
|
'DifferentialTitleFieldSpecification' => 'DifferentialFreeformFieldSpecification',
|
2013-06-21 21:54:29 +02:00
|
|
|
'DifferentialTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'DifferentialTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2011-08-14 22:55:30 +02:00
|
|
|
'DifferentialUnitFieldSpecification' => 'DifferentialFieldSpecification',
|
2013-09-26 23:17:11 +02:00
|
|
|
'DifferentialViewPolicyFieldSpecification' => 'DifferentialFieldSpecification',
|
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',
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
'DiffusionBrowseDirectoryController' => 'DiffusionBrowseController',
|
|
|
|
'DiffusionBrowseFileController' => 'DiffusionBrowseController',
|
|
|
|
'DiffusionBrowseMainController' => 'DiffusionBrowseController',
|
|
|
|
'DiffusionBrowseSearchController' => 'DiffusionBrowseController',
|
2011-03-13 01:17:34 +01:00
|
|
|
'DiffusionBrowseTableView' => 'DiffusionView',
|
2013-10-26 02:46:08 +02:00
|
|
|
'DiffusionCapabilityCreateRepositories' => 'PhabricatorPolicyCapability',
|
|
|
|
'DiffusionCapabilityDefaultEdit' => 'PhabricatorPolicyCapability',
|
2013-10-26 04:12:52 +02:00
|
|
|
'DiffusionCapabilityDefaultPush' => 'PhabricatorPolicyCapability',
|
2013-10-26 02:46:08 +02:00
|
|
|
'DiffusionCapabilityDefaultView' => 'PhabricatorPolicyCapability',
|
2013-10-26 04:12:52 +02:00
|
|
|
'DiffusionCapabilityPush' => 'PhabricatorPolicyCapability',
|
2011-03-14 06:03:30 +01:00
|
|
|
'DiffusionChangeController' => 'DiffusionController',
|
2012-02-24 23:14:39 +01:00
|
|
|
'DiffusionCommentListView' => 'AphrontView',
|
|
|
|
'DiffusionCommentView' => 'AphrontView',
|
2012-08-01 01:27:48 +02:00
|
|
|
'DiffusionCommitBranchesController' => 'DiffusionController',
|
2011-03-13 01:17:34 +01:00
|
|
|
'DiffusionCommitChangeTableView' => 'DiffusionView',
|
2011-03-11 18:34:22 +01:00
|
|
|
'DiffusionCommitController' => 'DiffusionController',
|
2012-08-08 19:03:41 +02:00
|
|
|
'DiffusionCommitEditController' => 'DiffusionController',
|
2012-03-26 21:21:48 +02:00
|
|
|
'DiffusionCommitParentsQuery' => 'DiffusionQuery',
|
2013-02-27 17:04:54 +01:00
|
|
|
'DiffusionCommitQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2012-08-01 01:27:48 +02:00
|
|
|
'DiffusionCommitTagsController' => 'DiffusionController',
|
2011-03-08 00:13:36 +01:00
|
|
|
'DiffusionController' => 'PhabricatorController',
|
2011-03-31 02:36:16 +02:00
|
|
|
'DiffusionDiffController' => 'DiffusionController',
|
2013-07-26 19:31:35 +02:00
|
|
|
'DiffusionDoorkeeperCommitFeedStoryPublisher' => 'DoorkeeperFeedStoryPublisher',
|
2012-02-03 01:42:29 +01:00
|
|
|
'DiffusionEmptyResultView' => 'DiffusionView',
|
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',
|
2012-03-27 05:54:26 +02:00
|
|
|
'DiffusionFileContentQuery' => 'DiffusionQuery',
|
2013-05-01 23:56:36 +02:00
|
|
|
'DiffusionGitBranchTestCase' => 'PhabricatorTestCase',
|
2012-03-26 21:21:48 +02:00
|
|
|
'DiffusionGitCommitParentsQuery' => 'DiffusionCommitParentsQuery',
|
2011-03-08 18:54:55 +01:00
|
|
|
'DiffusionGitFileContentQuery' => 'DiffusionFileContentQuery',
|
2012-05-02 22:43:45 +02:00
|
|
|
'DiffusionGitRawDiffQuery' => 'DiffusionRawDiffQuery',
|
2011-03-08 23:29:02 +01:00
|
|
|
'DiffusionGitRequest' => 'DiffusionRequest',
|
2013-10-26 21:10:52 +02:00
|
|
|
'DiffusionGitResponse' => 'AphrontResponse',
|
2011-03-09 02:31:44 +01:00
|
|
|
'DiffusionHistoryController' => 'DiffusionController',
|
2011-03-13 01:17:34 +01:00
|
|
|
'DiffusionHistoryTableView' => 'DiffusionView',
|
2013-10-22 02:00:21 +02:00
|
|
|
'DiffusionHovercardEventListener' => 'PhabricatorEventListener',
|
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',
|
2011-03-31 08:27:06 +02:00
|
|
|
'DiffusionLastModifiedController' => 'DiffusionController',
|
2012-11-08 20:11:44 +01:00
|
|
|
'DiffusionLintController' => 'DiffusionController',
|
2012-11-09 01:13:21 +01:00
|
|
|
'DiffusionLintDetailsController' => 'DiffusionController',
|
2013-10-30 21:06:09 +01:00
|
|
|
'DiffusionLowLevelGitRefQuery' => 'DiffusionLowLevelQuery',
|
2013-11-04 21:15:32 +01:00
|
|
|
'DiffusionLowLevelMercurialBranchesQuery' => 'DiffusionLowLevelQuery',
|
2013-10-30 21:06:09 +01:00
|
|
|
'DiffusionLowLevelQuery' => 'Phobject',
|
2013-11-04 23:13:07 +01:00
|
|
|
'DiffusionLowLevelResolveRefsQuery' => 'DiffusionLowLevelQuery',
|
2012-03-26 21:21:48 +02:00
|
|
|
'DiffusionMercurialCommitParentsQuery' => 'DiffusionCommitParentsQuery',
|
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',
|
2011-04-04 04:20:47 +02:00
|
|
|
'DiffusionPathCompleteController' => 'DiffusionController',
|
2011-09-14 20:23:39 +02:00
|
|
|
'DiffusionPathQueryTestCase' => 'PhabricatorTestCase',
|
2011-04-04 04:20:47 +02:00
|
|
|
'DiffusionPathValidateController' => 'DiffusionController',
|
2013-04-30 19:54:02 +02:00
|
|
|
'DiffusionQuery' => 'PhabricatorQuery',
|
2012-05-02 22:43:45 +02:00
|
|
|
'DiffusionRawDiffQuery' => 'DiffusionQuery',
|
2013-02-27 17:04:54 +01:00
|
|
|
'DiffusionRemarkupRule' => 'PhabricatorRemarkupRuleObject',
|
2011-03-13 01:17:34 +01:00
|
|
|
'DiffusionRepositoryController' => 'DiffusionController',
|
2013-10-26 00:58:58 +02:00
|
|
|
'DiffusionRepositoryCreateController' => 'DiffusionRepositoryEditController',
|
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',
|
2013-10-26 00:58:58 +02:00
|
|
|
'DiffusionRepositoryEditActionsController' => 'DiffusionRepositoryEditController',
|
|
|
|
'DiffusionRepositoryEditActivateController' => 'DiffusionRepositoryEditController',
|
|
|
|
'DiffusionRepositoryEditBasicController' => 'DiffusionRepositoryEditController',
|
|
|
|
'DiffusionRepositoryEditBranchesController' => 'DiffusionRepositoryEditController',
|
2013-05-24 21:37:42 +02:00
|
|
|
'DiffusionRepositoryEditController' => 'DiffusionController',
|
2013-10-29 20:26:07 +01:00
|
|
|
'DiffusionRepositoryEditDeleteController' => 'DiffusionRepositoryEditController',
|
2013-10-26 00:58:58 +02:00
|
|
|
'DiffusionRepositoryEditEncodingController' => 'DiffusionRepositoryEditController',
|
2013-10-26 05:13:38 +02:00
|
|
|
'DiffusionRepositoryEditHostingController' => 'DiffusionRepositoryEditController',
|
2013-10-29 20:20:26 +01:00
|
|
|
'DiffusionRepositoryEditLocalController' => 'DiffusionRepositoryEditController',
|
2013-10-26 00:58:58 +02:00
|
|
|
'DiffusionRepositoryEditMainController' => 'DiffusionRepositoryEditController',
|
|
|
|
'DiffusionRepositoryEditPolicyController' => 'DiffusionRepositoryEditController',
|
|
|
|
'DiffusionRepositoryEditSubversionController' => 'DiffusionRepositoryEditController',
|
2013-09-11 00:26:08 +02:00
|
|
|
'DiffusionRepositoryListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'DiffusionController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-11-02 01:39:35 +01:00
|
|
|
'DiffusionRepositoryNewController' => 'DiffusionController',
|
2013-10-26 23:11:52 +02:00
|
|
|
'DiffusionSSHGitReceivePackWorkflow' => 'DiffusionSSHGitWorkflow',
|
2013-10-26 19:46:09 +02:00
|
|
|
'DiffusionSSHGitUploadPackWorkflow' => 'DiffusionSSHGitWorkflow',
|
|
|
|
'DiffusionSSHGitWorkflow' => 'DiffusionSSHWorkflow',
|
|
|
|
'DiffusionSSHWorkflow' => 'PhabricatorSSHWorkflow',
|
2013-11-07 02:55:46 +01:00
|
|
|
'DiffusionServeController' => 'DiffusionController',
|
2013-11-01 16:34:11 +01:00
|
|
|
'DiffusionSetPasswordPanel' => 'PhabricatorSettingsPanel',
|
2012-05-12 03:29:14 +02:00
|
|
|
'DiffusionSetupException' => 'AphrontUsageException',
|
2012-03-26 21:21:48 +02:00
|
|
|
'DiffusionSvnCommitParentsQuery' => 'DiffusionCommitParentsQuery',
|
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',
|
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',
|
Fix many encoding and architecture problems in Diffusion request and URI handling
Summary:
Diffusion request/uri handling is currently a big, hastily ported mess. In particular, it has:
- Tons and tons of duplicated code.
- Bugs with handling unusual branch and file names.
- An excessively large (and yet insufficiently expressive) API on DiffusionRequest, including a nonsensical concrete base class.
- Other tools were doing hacky things like passing ":" branch names.
This diff attempts to fix these issues.
- Make the base class abstract (it was concrete ONLY for "/diffusion/").
- Move all URI generation to DiffusionRequest. Make the core static. Add unit tests.
- Delete the 300 copies of URI generation code throughout Diffusion.
- Move all URI parsing to DiffusionRequest. Make the core static. Add unit tests.
- Add an appropriate static initializer for other callers.
- Convert all code calling `newFromAphrontRequestDictionary` outside of Diffusion to the new `newFromDictionary` API.
- Refactor static initializers to be sensibly-sized.
- Refactor derived DiffusionRequest classes to remove duplicated code.
- Properly encode branch names (fixes branches with "/", see <https://github.com/facebook/phabricator/issues/100>).
- Properly encode path names (fixes issues in D1742).
- Properly escape delimiter characters ";" and "$" in path names so files like "$100" are not interpreted as "line 100".
- Fix a couple warnings.
- Fix a couple lint issues.
- Fix a bug where we would not parse filenames with spaces in them correctly in the Git browse query.
- Fix a bug where Git change queries would fail unnecessarily.
- Provide or improve some documentation.
This thing is pretty gigantic but also kind of hard to split up. If it's unreasonably difficult to review, let me know and I can take a stab at it though.
This supplants D1742.
Test Plan:
- Used home, repository, branch, browse, change, history, diff (ajax), lastmodified (ajax) views of Diffusion.
- Used Owners typeaheads and search.
- Used diffusion.getrecentcommitsbypath method.
- Pushed a change to an absurdly-named file on an absurdly-named branch, everything worked properly.
{F9185}
Reviewers: nh, vrana, btrahan
Reviewed By: btrahan
CC: aran, epriestley
Differential Revision: https://secure.phabricator.com/D1921
2012-03-20 03:52:14 +01:00
|
|
|
'DiffusionURITestCase' => 'ArcanistPhutilTestCase',
|
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',
|
2013-02-18 00:40:00 +01:00
|
|
|
'DivinerAtomCache' => 'DivinerDiskCache',
|
2013-06-01 00:14:39 +02:00
|
|
|
'DivinerAtomController' => 'DivinerController',
|
2013-05-31 19:52:25 +02:00
|
|
|
'DivinerAtomListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'DivinerController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
|
|
|
'DivinerAtomQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'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',
|
2013-06-04 20:15:34 +02:00
|
|
|
'DivinerBookController' => 'DivinerController',
|
2013-09-10 18:39:50 +02:00
|
|
|
'DivinerBookItemView' => 'AphrontTagView',
|
2013-05-31 19:52:25 +02:00
|
|
|
'DivinerBookQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'DivinerController' => 'PhabricatorController',
|
2013-05-20 19:18:26 +02:00
|
|
|
'DivinerDAO' => 'PhabricatorLiskDAO',
|
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',
|
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-31 19:52:25 +02:00
|
|
|
'DivinerLegacyController' => 'DivinerController',
|
2013-05-21 00:52:54 +02:00
|
|
|
'DivinerLiveAtom' => 'DivinerDAO',
|
2013-05-20 19:18:26 +02:00
|
|
|
'DivinerLiveBook' =>
|
|
|
|
array(
|
|
|
|
0 => 'DivinerDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'DivinerLivePublisher' => 'DivinerPublisher',
|
2013-05-31 19:52:25 +02:00
|
|
|
'DivinerLiveSymbol' =>
|
|
|
|
array(
|
|
|
|
0 => 'DivinerDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
2013-06-07 18:55:55 +02:00
|
|
|
2 => 'PhabricatorMarkupInterface',
|
2013-05-31 19:52:25 +02:00
|
|
|
),
|
2013-07-30 15:49:13 +02:00
|
|
|
'DivinerPHIDTypeAtom' => 'PhabricatorPHIDType',
|
2013-07-30 15:47:07 +02:00
|
|
|
'DivinerPHIDTypeBook' => 'PhabricatorPHIDType',
|
2013-08-27 12:14:00 +02:00
|
|
|
'DivinerPHPAtomizer' => 'DivinerAtomizer',
|
|
|
|
'DivinerParameterTableView' => 'AphrontTagView',
|
2013-02-18 00:40:00 +01:00
|
|
|
'DivinerPublishCache' => 'DivinerDiskCache',
|
2013-02-18 00:40:44 +01:00
|
|
|
'DivinerRemarkupRuleSymbol' => 'PhutilRemarkupRule',
|
2013-08-27 12:14:00 +02:00
|
|
|
'DivinerReturnTableView' => 'AphrontTagView',
|
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',
|
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' => 'PhutilArgumentWorkflow',
|
2013-06-25 00:54:54 +02:00
|
|
|
'DoorkeeperBridge' => 'Phobject',
|
|
|
|
'DoorkeeperBridgeAsana' => 'DoorkeeperBridge',
|
2013-09-04 02:27:38 +02:00
|
|
|
'DoorkeeperBridgeJIRA' => 'DoorkeeperBridge',
|
2013-06-25 00:54:36 +02:00
|
|
|
'DoorkeeperDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'DoorkeeperExternalObject' =>
|
|
|
|
array(
|
|
|
|
0 => 'DoorkeeperDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2013-06-26 01:30:44 +02:00
|
|
|
'DoorkeeperExternalObjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-09-11 00:22:01 +02:00
|
|
|
'DoorkeeperFeedWorker' => 'FeedPushWorker',
|
|
|
|
'DoorkeeperFeedWorkerAsana' => 'DoorkeeperFeedWorker',
|
|
|
|
'DoorkeeperFeedWorkerJIRA' => 'DoorkeeperFeedWorker',
|
2013-06-25 00:55:08 +02:00
|
|
|
'DoorkeeperImportEngine' => 'Phobject',
|
2013-06-25 00:54:54 +02:00
|
|
|
'DoorkeeperObjectRef' => 'Phobject',
|
2013-09-04 02:27:38 +02:00
|
|
|
'DoorkeeperRemarkupRule' => 'PhutilRemarkupRule',
|
|
|
|
'DoorkeeperRemarkupRuleAsana' => 'DoorkeeperRemarkupRule',
|
|
|
|
'DoorkeeperRemarkupRuleJIRA' => 'DoorkeeperRemarkupRule',
|
2013-06-25 00:55:08 +02:00
|
|
|
'DoorkeeperTagsController' => 'PhabricatorController',
|
2012-01-24 01:58:38 +01:00
|
|
|
'DrydockAllocatorWorker' => 'PhabricatorWorker',
|
2012-03-27 05:54:26 +02:00
|
|
|
'DrydockApacheWebrootInterface' => 'DrydockWebrootInterface',
|
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',
|
|
|
|
'DrydockController' => 'PhabricatorController',
|
|
|
|
'DrydockDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'DrydockLease' => 'DrydockDAO',
|
|
|
|
'DrydockLeaseListController' => 'DrydockController',
|
2012-12-17 22:53:32 +01:00
|
|
|
'DrydockLeaseQuery' => 'PhabricatorOffsetPagedQuery',
|
2012-12-15 00:42:58 +01:00
|
|
|
'DrydockLeaseReleaseController' => 'DrydockController',
|
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',
|
2012-11-07 00:28:33 +01:00
|
|
|
'DrydockLeaseViewController' => 'DrydockController',
|
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
|
|
|
'DrydockLocalCommandInterface' => 'DrydockCommandInterface',
|
|
|
|
'DrydockLocalHostBlueprint' => 'DrydockBlueprint',
|
2012-03-27 05:54:26 +02:00
|
|
|
'DrydockLog' => 'DrydockDAO',
|
|
|
|
'DrydockLogController' => 'DrydockController',
|
|
|
|
'DrydockLogQuery' => 'PhabricatorOffsetPagedQuery',
|
2012-11-27 21:48:03 +01:00
|
|
|
'DrydockManagementCloseWorkflow' => 'DrydockManagementWorkflow',
|
2012-11-01 23:30:14 +01:00
|
|
|
'DrydockManagementLeaseWorkflow' => 'DrydockManagementWorkflow',
|
2012-12-15 00:42:58 +01:00
|
|
|
'DrydockManagementReleaseWorkflow' => 'DrydockManagementWorkflow',
|
2012-11-01 23:30:14 +01:00
|
|
|
'DrydockManagementWaitForLeaseWorkflow' => 'DrydockManagementWorkflow',
|
|
|
|
'DrydockManagementWorkflow' => 'PhutilArgumentWorkflow',
|
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
|
|
|
'DrydockResource' => 'DrydockDAO',
|
2012-11-27 21:48:03 +01:00
|
|
|
'DrydockResourceCloseController' => 'DrydockController',
|
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
|
|
|
'DrydockResourceListController' => 'DrydockController',
|
2012-12-17 23:47:21 +01:00
|
|
|
'DrydockResourceQuery' => 'PhabricatorOffsetPagedQuery',
|
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',
|
2012-11-20 22:25:22 +01:00
|
|
|
'DrydockResourceViewController' => 'DrydockController',
|
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',
|
2012-03-27 05:54:26 +02:00
|
|
|
'DrydockWebrootInterface' => 'DrydockInterface',
|
2012-11-27 21:48:14 +01:00
|
|
|
'DrydockWorkingCopyBlueprint' => 'DrydockBlueprint',
|
2013-06-26 01:29:47 +02:00
|
|
|
'FeedPublisherHTTPWorker' => 'FeedPushWorker',
|
|
|
|
'FeedPublisherWorker' => 'FeedPushWorker',
|
|
|
|
'FeedPushWorker' => 'PhabricatorWorker',
|
2013-09-05 22:11:02 +02:00
|
|
|
'FileCreateMailReceiver' => 'PhabricatorMailReceiver',
|
|
|
|
'FileMailReceiver' => 'PhabricatorObjectMailReceiver',
|
|
|
|
'FileReplyHandler' => 'PhabricatorMailReplyHandler',
|
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' =>
|
|
|
|
array(
|
|
|
|
0 => 'HarbormasterDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'HarbormasterBuildArtifact' =>
|
|
|
|
array(
|
|
|
|
0 => 'HarbormasterDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterBuildCancelController' => 'HarbormasterController',
|
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
|
|
|
'HarbormasterBuildItem' => 'HarbormasterDAO',
|
|
|
|
'HarbormasterBuildItemQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterBuildLog' =>
|
|
|
|
array(
|
|
|
|
0 => 'HarbormasterDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'HarbormasterBuildLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
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' =>
|
|
|
|
array(
|
|
|
|
0 => 'HarbormasterDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
2 => 'PhabricatorSubscribableInterface',
|
|
|
|
),
|
|
|
|
'HarbormasterBuildPlanEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'HarbormasterBuildPlanQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'HarbormasterBuildPlanSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'HarbormasterBuildPlanTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'HarbormasterBuildPlanTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'HarbormasterBuildPlanTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'HarbormasterBuildQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
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
|
|
|
'HarbormasterBuildStep' =>
|
|
|
|
array(
|
|
|
|
0 => 'HarbormasterDAO',
|
|
|
|
1 => '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
|
|
|
'HarbormasterBuildStepQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'HarbormasterBuildTarget' => 'HarbormasterDAO',
|
|
|
|
'HarbormasterBuildTargetQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterBuildViewController' => 'HarbormasterController',
|
2013-11-05 21:43:47 +01:00
|
|
|
'HarbormasterBuildWorker' => 'PhabricatorWorker',
|
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' =>
|
|
|
|
array(
|
|
|
|
0 => 'HarbormasterDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2013-11-05 21:43:47 +01:00
|
|
|
'HarbormasterBuildableApplyController' => 'HarbormasterController',
|
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
|
|
|
'HarbormasterBuildableArtifactQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'HarbormasterBuildableEditController' => 'HarbormasterController',
|
|
|
|
'HarbormasterBuildableListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'HarbormasterController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
|
|
|
'HarbormasterBuildableQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'HarbormasterBuildableSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'HarbormasterBuildableViewController' => 'HarbormasterController',
|
|
|
|
'HarbormasterCapabilityManagePlans' => 'PhabricatorPolicyCapability',
|
|
|
|
'HarbormasterController' => 'PhabricatorController',
|
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',
|
2013-11-09 16:16:12 +01:00
|
|
|
'HarbormasterHTTPRequestBuildStepImplementation' => 'VariableBuildStepImplementation',
|
2012-07-09 19:39:14 +02:00
|
|
|
'HarbormasterObject' => 'HarbormasterDAO',
|
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
|
|
|
'HarbormasterPHIDTypeBuild' => 'PhabricatorPHIDType',
|
|
|
|
'HarbormasterPHIDTypeBuildItem' => 'PhabricatorPHIDType',
|
2013-11-09 03:09:03 +01:00
|
|
|
'HarbormasterPHIDTypeBuildLog' => '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
|
|
|
'HarbormasterPHIDTypeBuildPlan' => 'PhabricatorPHIDType',
|
|
|
|
'HarbormasterPHIDTypeBuildStep' => 'PhabricatorPHIDType',
|
|
|
|
'HarbormasterPHIDTypeBuildTarget' => 'PhabricatorPHIDType',
|
|
|
|
'HarbormasterPHIDTypeBuildable' => 'PhabricatorPHIDType',
|
|
|
|
'HarbormasterPlanController' => 'PhabricatorController',
|
|
|
|
'HarbormasterPlanEditController' => 'HarbormasterPlanController',
|
|
|
|
'HarbormasterPlanListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'HarbormasterPlanController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
|
|
|
'HarbormasterPlanViewController' => 'HarbormasterPlanController',
|
|
|
|
'HarbormasterRemarkupRule' => 'PhabricatorRemarkupRuleObject',
|
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',
|
2013-11-05 22:54:03 +01:00
|
|
|
'HarbormasterStepAddController' => 'HarbormasterController',
|
|
|
|
'HarbormasterStepDeleteController' => 'HarbormasterController',
|
|
|
|
'HarbormasterStepEditController' => 'HarbormasterController',
|
2013-11-10 00:02:07 +01:00
|
|
|
'HarbormasterUIEventListener' => 'PhabricatorEventListener',
|
2011-03-22 21:22:40 +01:00
|
|
|
'HeraldAction' => 'HeraldDAO',
|
|
|
|
'HeraldApplyTranscript' => 'HeraldDAO',
|
2013-10-09 22:44:41 +02:00
|
|
|
'HeraldCapabilityManageGlobalRules' => 'PhabricatorPolicyCapability',
|
2013-08-02 17:38:17 +02:00
|
|
|
'HeraldCommitAdapter' => 'HeraldAdapter',
|
2011-03-22 21:22:40 +01:00
|
|
|
'HeraldCondition' => 'HeraldDAO',
|
2011-03-22 21:49:46 +01:00
|
|
|
'HeraldController' => 'PhabricatorController',
|
2011-03-22 21:22:40 +01:00
|
|
|
'HeraldDAO' => 'PhabricatorLiskDAO',
|
2013-08-02 17:38:17 +02:00
|
|
|
'HeraldDifferentialRevisionAdapter' => 'HeraldAdapter',
|
2013-10-07 02:10:29 +02:00
|
|
|
'HeraldDisableController' => 'HeraldController',
|
General Herald refactoring pass
Summary:
**Who can delete global rules?**: I discussed this with @jungejason. The current behavior is that the rule author or any administrator can delete a global rule, but this
isn't consistent with who can edit a rule (anyone) and doesn't really make much sense (it's an artifact of the global/personal split). I proposed that anyone can delete a
rule but we don't actually delete them, and log the deletion. However, when it came time to actually write the code for this I backed off a bit and continued actually
deleting the rules -- I think this does a reasonable job of balancing accountability with complexity. So the new impelmentation is:
- Personal rules can be deleted only by their owners.
- Global rules can be deleted by any user.
- All deletes are logged.
- Logs are more detailed.
- All logged actions can be viewed in aggregate.
**Minor Cleanup**
- Merged `HomeController` and `AllController`.
- Moved most queries to Query classes.
- Use AphrontFormSelectControl::renderSelectTag() where appropriate (this is a fairly recent addition).
- Use an AphrontErrorView to render the dry run notice (this didn't exist when I ported).
- Reenable some transaction code (this works again now).
- Removed the ability for admins to change rule authors (this was a little buggy, messy, and doesn't make tons of sense after the personal/global rule split).
- Rules which depend on other rules now display the right options (all global rules, all your personal rules for personal rules).
- Fix a bug in AphrontTableView where the "no data" cell would be rendered too wide if some columns are not visible.
- Allow selectFilter() in AphrontNavFilterView to be called without a 'default' argument.
Test Plan:
- Browsed, created, edited, deleted personal and gules.
- Verified generated logs.
- Did some dry runs.
- Verified transcript list and transcript details.
- Created/edited all/any rules; created/edited once/every time rules.
- Filtered admin views by users.
Reviewers: jungejason, btrahan
Reviewed By: btrahan
CC: aran, epriestley
Differential Revision: https://secure.phabricator.com/D2040
2012-03-30 19:49:55 +02:00
|
|
|
'HeraldEditLogQuery' => 'PhabricatorOffsetPagedQuery',
|
2013-08-06 20:23:01 +02:00
|
|
|
'HeraldInvalidActionException' => 'Exception',
|
2012-05-30 23:26:29 +02:00
|
|
|
'HeraldInvalidConditionException' => 'Exception',
|
|
|
|
'HeraldInvalidFieldException' => 'Exception',
|
2013-09-25 20:50:15 +02:00
|
|
|
'HeraldManiphestTaskAdapter' => 'HeraldAdapter',
|
2011-03-22 22:34:38 +01:00
|
|
|
'HeraldNewController' => 'HeraldController',
|
2013-08-02 15:11:25 +02:00
|
|
|
'HeraldPHIDTypeRule' => 'PhabricatorPHIDType',
|
2013-08-15 22:10:45 +02:00
|
|
|
'HeraldPholioMockAdapter' => 'HeraldAdapter',
|
2012-05-30 23:26:29 +02:00
|
|
|
'HeraldRecursiveConditionsException' => 'Exception',
|
2013-08-02 15:21:43 +02:00
|
|
|
'HeraldRule' =>
|
|
|
|
array(
|
|
|
|
0 => 'HeraldDAO',
|
2013-10-25 21:52:00 +02:00
|
|
|
1 => 'PhabricatorFlaggableInterface',
|
|
|
|
2 => 'PhabricatorPolicyInterface',
|
2013-08-02 15:21:43 +02:00
|
|
|
),
|
2011-03-22 23:27:52 +01:00
|
|
|
'HeraldRuleController' => 'HeraldController',
|
2012-01-30 20:51:23 +01:00
|
|
|
'HeraldRuleEdit' => 'HeraldDAO',
|
|
|
|
'HeraldRuleEditHistoryController' => 'HeraldController',
|
|
|
|
'HeraldRuleEditHistoryView' => 'AphrontView',
|
2013-10-07 02:10:29 +02:00
|
|
|
'HeraldRuleEditor' => 'PhabricatorApplicationTransactionEditor',
|
2013-08-02 15:53:01 +02:00
|
|
|
'HeraldRuleListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'HeraldController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-08-02 15:38:17 +02:00
|
|
|
'HeraldRuleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-08-02 15:53:01 +02:00
|
|
|
'HeraldRuleSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-08-02 17:28:55 +02:00
|
|
|
'HeraldRuleTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'HeraldRuleTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2013-08-06 22:43:45 +02:00
|
|
|
'HeraldRuleViewController' => 'HeraldController',
|
2011-03-24 21:49:21 +01:00
|
|
|
'HeraldTestConsoleController' => 'HeraldController',
|
2013-10-07 02:10:29 +02:00
|
|
|
'HeraldTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-10-05 22:48:45 +02:00
|
|
|
'HeraldTranscript' =>
|
|
|
|
array(
|
|
|
|
0 => 'HeraldDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2011-03-25 05:32:26 +01:00
|
|
|
'HeraldTranscriptController' => 'HeraldController',
|
|
|
|
'HeraldTranscriptListController' => 'HeraldController',
|
2013-10-05 00:17:18 +02:00
|
|
|
'HeraldTranscriptQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2011-09-07 23:01:13 +02:00
|
|
|
'JavelinReactorExample' => 'PhabricatorUIExample',
|
2012-07-31 01:08:10 +02:00
|
|
|
'JavelinUIExample' => 'PhabricatorUIExample',
|
2011-09-07 23:01:13 +02:00
|
|
|
'JavelinViewExample' => 'PhabricatorUIExample',
|
|
|
|
'JavelinViewExampleServerView' => 'AphrontView',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadController' => 'PhabricatorController',
|
|
|
|
'LegalpadDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'LegalpadDocument' =>
|
|
|
|
array(
|
|
|
|
0 => 'LegalpadDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
2 => 'PhabricatorSubscribableInterface',
|
|
|
|
3 => 'PhabricatorApplicationTransactionInterface',
|
|
|
|
),
|
|
|
|
'LegalpadDocumentBody' =>
|
|
|
|
array(
|
|
|
|
0 => 'LegalpadDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
|
|
|
),
|
|
|
|
'LegalpadDocumentCommentController' => 'LegalpadController',
|
|
|
|
'LegalpadDocumentEditController' => 'LegalpadController',
|
|
|
|
'LegalpadDocumentEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'LegalpadDocumentListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'LegalpadController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
|
|
|
'LegalpadDocumentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'LegalpadDocumentSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-07-10 20:46:39 +02:00
|
|
|
'LegalpadDocumentSignController' => 'LegalpadController',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadDocumentSignature' => 'LegalpadDAO',
|
|
|
|
'LegalpadDocumentViewController' => 'LegalpadController',
|
2013-07-04 01:37:05 +02:00
|
|
|
'LegalpadMockMailReceiver' => 'PhabricatorObjectMailReceiver',
|
|
|
|
'LegalpadReplyHandler' => 'PhabricatorMailReplyHandler',
|
2013-07-03 20:15:45 +02:00
|
|
|
'LegalpadTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'LegalpadTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'LegalpadTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'LegalpadTransactionType' => 'LegalpadConstants',
|
|
|
|
'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',
|
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',
|
2013-10-22 02:00:21 +02:00
|
|
|
'ManiphestActionMenuEventListener' => 'PhabricatorEventListener',
|
2012-02-24 22:00:48 +01:00
|
|
|
'ManiphestBatchEditController' => 'ManiphestController',
|
Add capabilities for editing task triage details (priority, assignee, etc)
Summary:
This is primarily a client request, and a little bit use-case specific, but policies seem to be holding up well and I'm getting more comfortable about maintaining this. Much if it can run through ApplicationTransactions.
Allow the ability to edit status, policies, priorities, assignees and projects of a task to be restricted to some subset of users. Also allow bulk edit to be locked. This affects the editor itself and the edit, view and list interfaces.
Test Plan: As a restricted user, created, edited and commented on tasks. Tried to drag them around.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7357
2013-10-22 01:59:06 +02:00
|
|
|
'ManiphestCapabilityBulkEdit' => 'PhabricatorPolicyCapability',
|
2013-10-09 22:53:17 +02:00
|
|
|
'ManiphestCapabilityDefaultEdit' => 'PhabricatorPolicyCapability',
|
|
|
|
'ManiphestCapabilityDefaultView' => 'PhabricatorPolicyCapability',
|
Add capabilities for editing task triage details (priority, assignee, etc)
Summary:
This is primarily a client request, and a little bit use-case specific, but policies seem to be holding up well and I'm getting more comfortable about maintaining this. Much if it can run through ApplicationTransactions.
Allow the ability to edit status, policies, priorities, assignees and projects of a task to be restricted to some subset of users. Also allow bulk edit to be locked. This affects the editor itself and the edit, view and list interfaces.
Test Plan: As a restricted user, created, edited and commented on tasks. Tried to drag them around.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7357
2013-10-22 01:59:06 +02:00
|
|
|
'ManiphestCapabilityEditAssign' => 'PhabricatorPolicyCapability',
|
|
|
|
'ManiphestCapabilityEditPolicies' => 'PhabricatorPolicyCapability',
|
|
|
|
'ManiphestCapabilityEditPriority' => 'PhabricatorPolicyCapability',
|
|
|
|
'ManiphestCapabilityEditProjects' => 'PhabricatorPolicyCapability',
|
|
|
|
'ManiphestCapabilityEditStatus' => 'PhabricatorPolicyCapability',
|
2013-09-19 20:56:15 +02:00
|
|
|
'ManiphestConfiguredCustomField' =>
|
|
|
|
array(
|
|
|
|
0 => 'ManiphestCustomField',
|
|
|
|
1 => 'PhabricatorStandardCustomFieldInterface',
|
|
|
|
),
|
2011-02-08 19:53:59 +01:00
|
|
|
'ManiphestController' => 'PhabricatorController',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ManiphestCreateMailReceiver' => 'PhabricatorMailReceiver',
|
2013-09-11 00:31:48 +02:00
|
|
|
'ManiphestCustomField' => 'PhabricatorCustomField',
|
2013-09-16 23:06:41 +02:00
|
|
|
'ManiphestCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage',
|
|
|
|
'ManiphestCustomFieldStorage' => 'PhabricatorCustomFieldStorage',
|
|
|
|
'ManiphestCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage',
|
2011-02-08 19:53:59 +01:00
|
|
|
'ManiphestDAO' => 'PhabricatorLiskDAO',
|
2013-10-22 02:00:21 +02:00
|
|
|
'ManiphestEdgeEventListener' => 'PhabricatorEventListener',
|
2013-04-11 20:22:06 +02:00
|
|
|
'ManiphestExcelDefaultFormat' => 'ManiphestExcelFormat',
|
2012-02-29 06:07:12 +01:00
|
|
|
'ManiphestExportController' => 'ManiphestController',
|
2013-10-22 02:00:21 +02:00
|
|
|
'ManiphestHovercardEventListener' => 'PhabricatorEventListener',
|
2013-09-12 22:06:44 +02:00
|
|
|
'ManiphestNameIndex' => 'ManiphestDAO',
|
2013-10-22 02:00:21 +02:00
|
|
|
'ManiphestNameIndexEventListener' => 'PhabricatorEventListener',
|
2013-07-21 21:05:28 +02:00
|
|
|
'ManiphestPHIDTypeTask' => 'PhabricatorPHIDType',
|
2013-02-27 16:18:30 +01:00
|
|
|
'ManiphestRemarkupRule' => 'PhabricatorRemarkupRuleObject',
|
2011-05-10 01:31:26 +02:00
|
|
|
'ManiphestReplyHandler' => 'PhabricatorMailReplyHandler',
|
2012-02-08 18:47:14 +01:00
|
|
|
'ManiphestReportController' => 'ManiphestController',
|
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
|
|
|
'ManiphestSearchIndexer' => 'PhabricatorSearchDocumentIndexer',
|
2012-04-02 21:12:04 +02:00
|
|
|
'ManiphestSubpriorityController' => 'ManiphestController',
|
2013-05-04 00:49:29 +02:00
|
|
|
'ManiphestSubscribeController' => 'ManiphestController',
|
2012-07-16 20:49:06 +02:00
|
|
|
'ManiphestTask' =>
|
|
|
|
array(
|
|
|
|
0 => 'ManiphestDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
2013-02-15 23:01:27 +01:00
|
|
|
2 => 'PhabricatorPolicyInterface',
|
|
|
|
3 => 'PhabricatorTokenReceiverInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
4 => 'PhabricatorFlaggableInterface',
|
|
|
|
5 => 'PhrequentTrackableInterface',
|
|
|
|
6 => 'PhabricatorCustomFieldInterface',
|
2012-07-16 20:49:06 +02:00
|
|
|
),
|
2012-01-25 20:23:00 +01:00
|
|
|
'ManiphestTaskDescriptionPreviewController' => 'ManiphestController',
|
2011-02-08 19:53:59 +01:00
|
|
|
'ManiphestTaskDetailController' => 'ManiphestController',
|
2011-02-20 23:15:53 +01:00
|
|
|
'ManiphestTaskEditController' => 'ManiphestController',
|
2013-09-13 18:50:46 +02:00
|
|
|
'ManiphestTaskListController' =>
|
2013-09-10 19:04:26 +02:00
|
|
|
array(
|
|
|
|
0 => 'ManiphestController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2011-07-04 22:04:22 +02:00
|
|
|
'ManiphestTaskListView' => 'ManiphestView',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ManiphestTaskMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2011-07-04 22:04:22 +02:00
|
|
|
'ManiphestTaskOwner' => 'ManiphestConstants',
|
|
|
|
'ManiphestTaskPriority' => 'ManiphestConstants',
|
2011-06-30 01:16:33 +02:00
|
|
|
'ManiphestTaskProject' => 'ManiphestDAO',
|
2012-04-02 19:27:31 +02:00
|
|
|
'ManiphestTaskProjectsView' => 'ManiphestView',
|
2013-09-10 16:53:27 +02:00
|
|
|
'ManiphestTaskQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-09-10 19:04:26 +02:00
|
|
|
'ManiphestTaskSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2011-07-04 22:04:22 +02:00
|
|
|
'ManiphestTaskStatus' => 'ManiphestConstants',
|
2011-07-07 19:24:49 +02:00
|
|
|
'ManiphestTaskSubscriber' => 'ManiphestDAO',
|
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',
|
2011-05-10 17:29:28 +02:00
|
|
|
'ManiphestTransactionPreviewController' => 'ManiphestController',
|
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',
|
2011-02-08 19:53:59 +01:00
|
|
|
'ManiphestTransactionSaveController' => 'ManiphestController',
|
2011-07-04 22:04:22 +02:00
|
|
|
'ManiphestView' => 'AphrontView',
|
Add email preferences to receive fewer less-important notifications
Summary:
A few similar requests have come in across several tools and use cases that I
think this does a reasonable job of resolving.
We currently send one email for each update an object receives, but these aren't
always appreciated:
- Asana does post-commit review via Differential, so the "committed" mails are
useless.
- Quora wants to make project category edits to bugs without spamming people
attached to them.
- Some users in general are very sensitive to email volumes, and this gives us
a good way to reduce the volumes without incurring the complexity of
delayed-send-batching.
The technical mechanism is basically:
- Mail may optionally have "mail tags", which indicate content in the mail
(e.g., "maniphest-priority, maniphest-cc, maniphest-comment" for a mail which
contains a priority change, a CC change, and a comment).
- If a mail has tags, remove any recipients who have opted out of all the
tags.
- Some tags can't be opted out of via the UI, so this ensures that important
email is still delivered (e.g., cc + assign + comment is always delivered
because you can't opt out of "assign" or "comment").
Test Plan:
- Disabled all mail tags in the web UI.
- Used test console to send myself mail with an opt-outable tag, it was
immediately dropped.
- Used test console to send myself mail with an opt-outable tag and a custom
tag, it was delivered.
- Made Differential updates affecting CCs with and without comments, got
appropriate delivery.
- Made Maniphest updates affecting project, priority and CCs with and without
comments, got appropriate delivery.
- Verified mail headers in all cases.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, epriestley, moskov
Maniphest Tasks: T616, T855
Differential Revision: https://secure.phabricator.com/D1635
2012-02-18 07:57:07 +01:00
|
|
|
'MetaMTANotificationType' => 'MetaMTAConstants',
|
2013-05-14 01:32:19 +02:00
|
|
|
'MetaMTAReceivedMailStatus' => 'MetaMTAConstants',
|
2013-11-08 21:45:14 +01:00
|
|
|
'NuanceCapabilitySourceDefaultEdit' => 'PhabricatorPolicyCapability',
|
|
|
|
'NuanceCapabilitySourceDefaultView' => 'PhabricatorPolicyCapability',
|
|
|
|
'NuanceCapabilitySourceManage' => 'PhabricatorPolicyCapability',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceController' => 'PhabricatorController',
|
|
|
|
'NuanceDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'NuanceItem' =>
|
|
|
|
array(
|
|
|
|
0 => 'NuanceDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'NuanceItemEditController' => 'NuanceController',
|
|
|
|
'NuanceItemEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'NuanceItemQuery' => 'NuanceQuery',
|
|
|
|
'NuanceItemTransaction' => 'NuanceTransaction',
|
|
|
|
'NuanceItemTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'NuanceItemTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'NuanceItemViewController' => 'NuanceController',
|
|
|
|
'NuancePHIDTypeItem' => 'PhabricatorPHIDType',
|
|
|
|
'NuancePHIDTypeQueue' => 'PhabricatorPHIDType',
|
|
|
|
'NuancePHIDTypeRequestor' => 'PhabricatorPHIDType',
|
|
|
|
'NuancePHIDTypeSource' => 'PhabricatorPHIDType',
|
|
|
|
'NuanceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'NuanceQueue' =>
|
|
|
|
array(
|
|
|
|
0 => 'NuanceDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'NuanceQueueEditController' => 'NuanceController',
|
|
|
|
'NuanceQueueEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'NuanceQueueItem' => 'NuanceDAO',
|
|
|
|
'NuanceQueueQuery' => 'NuanceQuery',
|
|
|
|
'NuanceQueueTransaction' => 'NuanceTransaction',
|
|
|
|
'NuanceQueueTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'NuanceQueueTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'NuanceQueueViewController' => 'NuanceController',
|
|
|
|
'NuanceRequestor' => 'NuanceDAO',
|
|
|
|
'NuanceRequestorEditController' => 'NuanceController',
|
|
|
|
'NuanceRequestorEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'NuanceRequestorQuery' => 'NuanceQuery',
|
|
|
|
'NuanceRequestorSource' => 'NuanceDAO',
|
|
|
|
'NuanceRequestorTransaction' => 'NuanceTransaction',
|
|
|
|
'NuanceRequestorTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'NuanceRequestorTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'NuanceRequestorViewController' => 'NuanceController',
|
|
|
|
'NuanceSource' =>
|
|
|
|
array(
|
|
|
|
0 => 'NuanceDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'NuanceSourceEditController' => 'NuanceController',
|
|
|
|
'NuanceSourceEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'NuanceSourceQuery' => 'NuanceQuery',
|
|
|
|
'NuanceSourceTransaction' => 'NuanceTransaction',
|
|
|
|
'NuanceSourceTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'NuanceSourceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-11-08 21:45:14 +01:00
|
|
|
'NuanceSourceType' => 'NuanceConstants',
|
2013-11-07 02:00:09 +01:00
|
|
|
'NuanceSourceViewController' => 'NuanceController',
|
|
|
|
'NuanceTransaction' => 'PhabricatorApplicationTransaction',
|
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',
|
2013-04-18 20:34:02 +02:00
|
|
|
'PHUIBoxExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIBoxView' => 'AphrontTagView',
|
2013-06-13 03:23:35 +02:00
|
|
|
'PHUIButtonExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIButtonView' => 'AphrontTagView',
|
2013-06-19 00:35:14 +02:00
|
|
|
'PHUIColorPalletteExample' => 'PhabricatorUIExample',
|
2013-06-05 17:41:43 +02:00
|
|
|
'PHUIDocumentExample' => 'PhabricatorUIExample',
|
2013-06-01 00:03:59 +02:00
|
|
|
'PHUIDocumentView' => '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',
|
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',
|
2013-09-17 18:12:37 +02:00
|
|
|
'PHUIHeaderView' => 'AphrontView',
|
2013-04-20 02:44:20 +02:00
|
|
|
'PHUIIconExample' => 'PhabricatorUIExample',
|
2013-04-22 18:49:06 +02:00
|
|
|
'PHUIIconView' => 'AphrontTagView',
|
2013-10-25 20:09:06 +02:00
|
|
|
'PHUIInfoPanelExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIInfoPanelView' => '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',
|
2013-09-25 20:23:29 +02:00
|
|
|
'PHUIObjectBoxView' => 'AphrontView',
|
2013-09-09 23:14:34 +02:00
|
|
|
'PHUIObjectItemListExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIObjectItemListView' => 'AphrontTagView',
|
|
|
|
'PHUIObjectItemView' => 'AphrontTagView',
|
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' => 'AphrontTagView',
|
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',
|
2013-07-24 23:13:22 +02:00
|
|
|
'PHUIStatusItemView' => 'AphrontTagView',
|
|
|
|
'PHUIStatusListView' => 'AphrontTagView',
|
2013-04-22 23:28:23 +02:00
|
|
|
'PHUITextExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUITextView' => 'AphrontTagView',
|
2013-09-06 23:06:12 +02:00
|
|
|
'PHUIWorkboardExample' => 'PhabricatorUIExample',
|
|
|
|
'PHUIWorkboardView' => 'AphrontView',
|
|
|
|
'PHUIWorkpanelView' => 'AphrontView',
|
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
|
|
|
'PackageCreateMail' => 'PackageMail',
|
|
|
|
'PackageDeleteMail' => 'PackageMail',
|
2013-03-01 02:15:09 +01:00
|
|
|
'PackageMail' => 'PhabricatorMail',
|
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
|
|
|
'PackageModifyMail' => 'PackageMail',
|
2013-10-16 19:35:52 +02:00
|
|
|
'PasteCapabilityDefaultView' => 'PhabricatorPolicyCapability',
|
2013-07-30 22:26:55 +02:00
|
|
|
'PasteCreateMailReceiver' => 'PhabricatorMailReceiver',
|
2013-03-13 14:44:27 +01:00
|
|
|
'PasteEmbedView' => 'AphrontView',
|
2013-08-06 02:11:46 +02:00
|
|
|
'PasteMockMailReceiver' => 'PhabricatorObjectMailReceiver',
|
|
|
|
'PasteReplyHandler' => 'PhabricatorMailReplyHandler',
|
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',
|
2013-01-01 23:09:17 +01:00
|
|
|
'PhabricatorAccessLogConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-04-05 16:40:27 +02:00
|
|
|
'PhabricatorActionHeaderExample' => 'PhabricatorUIExample',
|
|
|
|
'PhabricatorActionHeaderView' => 'AphrontView',
|
2012-10-03 19:21:39 +02:00
|
|
|
'PhabricatorActionListExample' => 'PhabricatorUIExample',
|
2012-08-15 19:45:06 +02:00
|
|
|
'PhabricatorActionListView' => 'AphrontView',
|
|
|
|
'PhabricatorActionView' => 'AphrontView',
|
2013-01-25 01:11:30 +01:00
|
|
|
'PhabricatorAllCapsTranslation' => 'PhabricatorTranslation',
|
2012-08-22 00:01:20 +02:00
|
|
|
'PhabricatorAnchorView' => 'AphrontView',
|
2013-03-05 17:46:09 +01:00
|
|
|
'PhabricatorAphrontBarExample' => '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',
|
|
|
|
'PhabricatorApplication' => 'PhabricatorPolicyInterface',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationApplications' => 'PhabricatorApplication',
|
|
|
|
'PhabricatorApplicationAudit' => 'PhabricatorApplication',
|
2012-08-05 23:12:43 +02:00
|
|
|
'PhabricatorApplicationAuth' => 'PhabricatorApplication',
|
2012-10-24 22:22:24 +02:00
|
|
|
'PhabricatorApplicationCalendar' => 'PhabricatorApplication',
|
2013-02-13 16:28:14 +01:00
|
|
|
'PhabricatorApplicationChatLog' => 'PhabricatorApplication',
|
2012-10-01 21:56:10 +02:00
|
|
|
'PhabricatorApplicationConduit' => 'PhabricatorApplication',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorApplicationConfig' => 'PhabricatorApplication',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorApplicationConfigOptions' => 'Phobject',
|
2013-01-25 02:23:05 +01:00
|
|
|
'PhabricatorApplicationConpherence' => 'PhabricatorApplication',
|
2012-10-01 21:56:02 +02:00
|
|
|
'PhabricatorApplicationCountdown' => 'PhabricatorApplication',
|
2012-08-14 00:27:45 +02:00
|
|
|
'PhabricatorApplicationDaemons' => 'PhabricatorApplication',
|
2013-01-24 21:13:31 +01:00
|
|
|
'PhabricatorApplicationDetailViewController' => 'PhabricatorApplicationsController',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorApplicationDifferential' => 'PhabricatorApplication',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationDiffusion' => 'PhabricatorApplication',
|
2012-08-14 00:28:41 +02:00
|
|
|
'PhabricatorApplicationDiviner' => 'PhabricatorApplication',
|
2013-06-25 00:55:08 +02:00
|
|
|
'PhabricatorApplicationDoorkeeper' => 'PhabricatorApplication',
|
2012-10-31 17:57:57 +01:00
|
|
|
'PhabricatorApplicationDrydock' => 'PhabricatorApplication',
|
2013-10-03 21:40:08 +02:00
|
|
|
'PhabricatorApplicationEditController' => 'PhabricatorApplicationsController',
|
2012-07-30 19:44:08 +02:00
|
|
|
'PhabricatorApplicationFact' => 'PhabricatorApplication',
|
2013-01-11 01:06:29 +01:00
|
|
|
'PhabricatorApplicationFeed' => 'PhabricatorApplication',
|
2012-10-01 23:05:12 +02:00
|
|
|
'PhabricatorApplicationFiles' => 'PhabricatorApplication',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationFlags' => 'PhabricatorApplication',
|
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
|
|
|
'PhabricatorApplicationHarbormaster' => 'PhabricatorApplication',
|
2012-10-01 21:56:10 +02:00
|
|
|
'PhabricatorApplicationHerald' => 'PhabricatorApplication',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationLaunchView' => 'AphrontView',
|
2013-07-03 20:15:45 +02:00
|
|
|
'PhabricatorApplicationLegalpad' => 'PhabricatorApplication',
|
2012-10-01 23:04:03 +02:00
|
|
|
'PhabricatorApplicationMacro' => 'PhabricatorApplication',
|
2012-08-13 04:19:46 +02:00
|
|
|
'PhabricatorApplicationMailingLists' => 'PhabricatorApplication',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorApplicationManiphest' => 'PhabricatorApplication',
|
2012-08-13 21:37:06 +02:00
|
|
|
'PhabricatorApplicationMetaMTA' => 'PhabricatorApplication',
|
2013-11-07 02:00:09 +01:00
|
|
|
'PhabricatorApplicationNuance' => 'PhabricatorApplication',
|
2012-10-01 21:56:33 +02:00
|
|
|
'PhabricatorApplicationOwners' => 'PhabricatorApplication',
|
2013-10-03 21:39:15 +02:00
|
|
|
'PhabricatorApplicationPHIDTypeApplication' => 'PhabricatorPHIDType',
|
2012-10-01 21:56:33 +02:00
|
|
|
'PhabricatorApplicationPHPAST' => 'PhabricatorApplication',
|
2012-08-15 19:45:06 +02:00
|
|
|
'PhabricatorApplicationPaste' => 'PhabricatorApplication',
|
2012-08-05 23:12:43 +02:00
|
|
|
'PhabricatorApplicationPeople' => 'PhabricatorApplication',
|
2012-10-02 00:37:02 +02:00
|
|
|
'PhabricatorApplicationPhame' => 'PhabricatorApplication',
|
2013-03-21 02:01:52 +01:00
|
|
|
'PhabricatorApplicationPhlux' => 'PhabricatorApplication',
|
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
|
|
|
'PhabricatorApplicationPholio' => 'PhabricatorApplication',
|
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
|
|
|
'PhabricatorApplicationPhortune' => 'PhabricatorApplication',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhabricatorApplicationPhrequent' => 'PhabricatorApplication',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationPhriction' => 'PhabricatorApplication',
|
2013-09-27 17:43:41 +02:00
|
|
|
'PhabricatorApplicationPolicy' => 'PhabricatorApplication',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PhabricatorApplicationPonder' => 'PhabricatorApplication',
|
2012-08-07 20:54:49 +02:00
|
|
|
'PhabricatorApplicationProject' => 'PhabricatorApplication',
|
2013-10-02 22:13:07 +02:00
|
|
|
'PhabricatorApplicationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-03-15 12:28:43 +01:00
|
|
|
'PhabricatorApplicationReleeph' => 'PhabricatorApplication',
|
|
|
|
'PhabricatorApplicationReleephConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2012-10-01 21:56:33 +02:00
|
|
|
'PhabricatorApplicationRepositories' => 'PhabricatorApplication',
|
2013-04-15 15:43:39 +02:00
|
|
|
'PhabricatorApplicationSearch' => 'PhabricatorApplication',
|
2013-05-30 23:09:02 +02:00
|
|
|
'PhabricatorApplicationSearchController' => 'PhabricatorSearchBaseController',
|
2012-08-05 23:12:43 +02:00
|
|
|
'PhabricatorApplicationSettings' => 'PhabricatorApplication',
|
2012-10-01 21:56:02 +02:00
|
|
|
'PhabricatorApplicationSlowvote' => 'PhabricatorApplication',
|
2012-08-02 23:07:21 +02:00
|
|
|
'PhabricatorApplicationStatusView' => 'AphrontView',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorApplicationSubscriptions' => 'PhabricatorApplication',
|
2013-10-04 04:05:47 +02:00
|
|
|
'PhabricatorApplicationTest' => 'PhabricatorApplication',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorApplicationTokens' => 'PhabricatorApplication',
|
2012-12-11 23:00:21 +01:00
|
|
|
'PhabricatorApplicationTransaction' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorLiskDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionComment' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorLiskDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
2012-12-11 23:00:21 +01:00
|
|
|
2 => 'PhabricatorPolicyInterface',
|
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',
|
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',
|
2013-07-29 15:51:19 +02:00
|
|
|
'PhabricatorApplicationTransactionPHIDTypeTransaction' => 'PhabricatorPHIDType',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2012-12-11 23:02:29 +01:00
|
|
|
'PhabricatorApplicationTransactionResponse' => 'AphrontProxyResponse',
|
2013-02-17 15:37:02 +01:00
|
|
|
'PhabricatorApplicationTransactionTextDiffDetailView' => 'AphrontView',
|
2013-09-19 00:31:58 +02:00
|
|
|
'PhabricatorApplicationTransactionValidationError' => 'Phobject',
|
|
|
|
'PhabricatorApplicationTransactionValidationException' => 'Exception',
|
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',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PhabricatorApplicationTransactions' => 'PhabricatorApplication',
|
2012-09-11 18:56:40 +02:00
|
|
|
'PhabricatorApplicationUIExamples' => 'PhabricatorApplication',
|
2013-01-29 18:14:03 +01:00
|
|
|
'PhabricatorApplicationUninstallController' => 'PhabricatorApplicationsController',
|
2013-04-02 18:52:52 +02:00
|
|
|
'PhabricatorApplicationXHProf' => 'PhabricatorApplication',
|
2013-01-19 22:46:48 +01:00
|
|
|
'PhabricatorApplicationsController' => 'PhabricatorController',
|
2013-10-03 02:03:53 +02:00
|
|
|
'PhabricatorApplicationsListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorApplicationsController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
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',
|
2012-02-25 00:04:53 +01:00
|
|
|
'PhabricatorAuditAddCommentController' => 'PhabricatorAuditController',
|
2012-10-24 22:22:24 +02:00
|
|
|
'PhabricatorAuditComment' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorAuditDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
|
|
|
),
|
2012-10-10 19:18:23 +02:00
|
|
|
'PhabricatorAuditCommentEditor' => 'PhabricatorEditor',
|
2012-02-29 06:10:39 +01:00
|
|
|
'PhabricatorAuditCommitListView' => 'AphrontView',
|
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',
|
|
|
|
'PhabricatorAuditDAO' => 'PhabricatorLiskDAO',
|
2012-05-30 23:26:29 +02:00
|
|
|
'PhabricatorAuditInlineComment' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorAuditDAO',
|
|
|
|
1 => 'PhabricatorInlineCommentInterface',
|
|
|
|
),
|
2012-02-24 22:02:14 +01:00
|
|
|
'PhabricatorAuditListController' => 'PhabricatorAuditController',
|
|
|
|
'PhabricatorAuditListView' => 'AphrontView',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorAuditMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2013-08-05 19:35:01 +02:00
|
|
|
'PhabricatorAuditManagementDeleteWorkflow' => 'PhabricatorAuditManagementWorkflow',
|
|
|
|
'PhabricatorAuditManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2012-02-27 22:00:23 +01:00
|
|
|
'PhabricatorAuditPreviewController' => 'PhabricatorAuditController',
|
2012-02-27 21:57:57 +01:00
|
|
|
'PhabricatorAuditReplyHandler' => 'PhabricatorMailReplyHandler',
|
2013-06-17 16:08:50 +02:00
|
|
|
'PhabricatorAuthAccountView' => 'AphrontView',
|
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',
|
2013-06-17 19:52:38 +02:00
|
|
|
'PhabricatorAuthEditController' => 'PhabricatorAuthProviderConfigController',
|
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',
|
2013-06-17 22:26:25 +02:00
|
|
|
'PhabricatorAuthManagementLDAPWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2013-06-17 19:55:05 +02:00
|
|
|
'PhabricatorAuthManagementRecoverWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2013-06-25 00:55:41 +02:00
|
|
|
'PhabricatorAuthManagementRefreshWorkflow' => 'PhabricatorAuthManagementWorkflow',
|
2013-06-17 19:55:05 +02:00
|
|
|
'PhabricatorAuthManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2013-06-17 19:51:35 +02:00
|
|
|
'PhabricatorAuthNewController' => 'PhabricatorAuthProviderConfigController',
|
2013-06-19 10:33:27 +02:00
|
|
|
'PhabricatorAuthOldOAuthRedirectController' => 'PhabricatorAuthController',
|
2013-06-17 19:49:18 +02:00
|
|
|
'PhabricatorAuthProviderConfig' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorAuthDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
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',
|
2013-06-16 19:18:34 +02:00
|
|
|
'PhabricatorAuthProviderLDAP' => 'PhabricatorAuthProvider',
|
2013-06-16 19:15:16 +02:00
|
|
|
'PhabricatorAuthProviderOAuth' => 'PhabricatorAuthProvider',
|
2013-09-03 14:53:08 +02:00
|
|
|
'PhabricatorAuthProviderOAuth1' => 'PhabricatorAuthProvider',
|
2013-09-03 14:53:21 +02:00
|
|
|
'PhabricatorAuthProviderOAuth1JIRA' => 'PhabricatorAuthProviderOAuth1',
|
2013-09-03 14:53:08 +02:00
|
|
|
'PhabricatorAuthProviderOAuth1Twitter' => 'PhabricatorAuthProviderOAuth1',
|
2013-06-20 20:19:11 +02:00
|
|
|
'PhabricatorAuthProviderOAuthAmazon' => 'PhabricatorAuthProviderOAuth',
|
|
|
|
'PhabricatorAuthProviderOAuthAsana' => 'PhabricatorAuthProviderOAuth',
|
2013-06-16 19:16:14 +02:00
|
|
|
'PhabricatorAuthProviderOAuthDisqus' => 'PhabricatorAuthProviderOAuth',
|
2013-06-16 19:15:16 +02:00
|
|
|
'PhabricatorAuthProviderOAuthFacebook' => 'PhabricatorAuthProviderOAuth',
|
2013-06-16 19:17:29 +02:00
|
|
|
'PhabricatorAuthProviderOAuthGitHub' => 'PhabricatorAuthProviderOAuth',
|
2013-06-16 19:18:04 +02:00
|
|
|
'PhabricatorAuthProviderOAuthGoogle' => 'PhabricatorAuthProviderOAuth',
|
2013-08-08 22:34:30 +02:00
|
|
|
'PhabricatorAuthProviderOAuthTwitch' => 'PhabricatorAuthProviderOAuth',
|
Add password authentication and registration to new registration
Summary:
Ref T1536. Ref T1930. Code is not reachable.
This provides password authentication and registration on the new provider/adapter framework.
I sort of cheated a little bit and don't really route any password logic through the adapter (instead, this provider uses an empty adapter and just sets the type/domain on it). I think the right way to do this //conceptually// is to treat username/passwords as an external black box which the adapter communicates with. However, this creates a lot of practical implementation and UX problems:
- There would basically be two steps -- in the first one, you interact with the "password black box", which behaves like an OAuth provider. This produces some ExternalAccount associated with the username/password pair, then we go into normal registration.
- In normal registration, we'd proceed normally.
This means:
- The registration flow would be split into two parts, one where you select a username/password (interacting with the black box) and one where you actually register (interacting with the generic flow). This is unusual and probably confusing for users.
- We would need to do a lot of re-hashing of passwords, since passwords currently depend on the username and user PHID, which won't exist yet during registration or the "black box" phase. This is a big mess I don't want to deal with.
- We hit a weird condition where two users complete step 1 with the same username but don't complete step 2 yet. The box knows about two different copies of the username, with two different passwords. When we arrive at step 2 the second time we have a lot of bad choices about how to reoslve it, most of which create security problems. The most stragihtforward and "pure" way to resolve the issues is to put password-auth usernames in a separate space, but this would be incredibly confusuing to users (your login name might not be the same as your username, which is bizarre).
- If we change this, we need to update all the other password-related code, which I don't want to bother with (at least for now).
Instead, let registration know about a "default" registration controller (which is always password, if enabled), and let it require a password. This gives us a much simpler (albeit slightly less pure) implementation:
- All the fields are on one form.
- Password adapter is just a shell.
- Password provider does the heavy lifting.
We might make this more pure at some point, but I'm generally pretty satisfied with this.
This doesn't implement the brute-force CAPTCHA protection, that will be coming soon.
Test Plan: Registered with password only and logged in with a password. Hit various error conditions.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, chad
Maniphest Tasks: T1536, T1930
Differential Revision: https://secure.phabricator.com/D6164
2013-06-16 19:15:49 +02:00
|
|
|
'PhabricatorAuthProviderPassword' => 'PhabricatorAuthProvider',
|
2013-10-14 23:34:57 +02:00
|
|
|
'PhabricatorAuthProviderPersona' => 'PhabricatorAuthProvider',
|
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',
|
2013-06-16 19:15:16 +02:00
|
|
|
'PhabricatorAuthStartController' => 'PhabricatorAuthController',
|
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',
|
2012-10-16 19:33:47 +02:00
|
|
|
'PhabricatorBarePageExample' => 'PhabricatorUIExample',
|
|
|
|
'PhabricatorBarePageView' => 'AphrontPageView',
|
2012-06-15 04:01:57 +02:00
|
|
|
'PhabricatorBaseEnglishTranslation' => 'PhabricatorTranslation',
|
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-16 05:24:23 +01:00
|
|
|
'PhabricatorBotBaseStreamingProtocolAdapter' => 'PhabricatorBaseProtocolAdapter',
|
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',
|
|
|
|
'PhabricatorBotDifferentialNotificationHandler' => 'PhabricatorBotHandler',
|
|
|
|
'PhabricatorBotFeedNotificationHandler' => 'PhabricatorBotHandler',
|
2013-02-16 05:24:23 +01:00
|
|
|
'PhabricatorBotFlowdockProtocolAdapter' => 'PhabricatorBotBaseStreamingProtocolAdapter',
|
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',
|
|
|
|
'PhabricatorBotObjectNameHandler' => 'PhabricatorBotHandler',
|
|
|
|
'PhabricatorBotSymbolHandler' => 'PhabricatorBotHandler',
|
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',
|
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',
|
2013-07-04 05:24:28 +02:00
|
|
|
'PhabricatorBusyExample' => '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',
|
2013-05-20 19:16:35 +02:00
|
|
|
'PhabricatorCacheManagementPurgeWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
|
|
|
'PhabricatorCacheManagementWorkflow' => 'PhutilArgumentWorkflow',
|
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
|
|
|
'PhabricatorCalendarBrowseController' => 'PhabricatorCalendarController',
|
|
|
|
'PhabricatorCalendarController' => 'PhabricatorController',
|
2012-05-03 09:21:47 +02:00
|
|
|
'PhabricatorCalendarDAO' => 'PhabricatorLiskDAO',
|
2012-10-24 22:22:24 +02:00
|
|
|
'PhabricatorCalendarDeleteStatusController' => 'PhabricatorCalendarController',
|
|
|
|
'PhabricatorCalendarEditStatusController' => 'PhabricatorCalendarController',
|
2012-05-03 09:21:47 +02:00
|
|
|
'PhabricatorCalendarHoliday' => 'PhabricatorCalendarDAO',
|
2012-05-03 21:16:09 +02:00
|
|
|
'PhabricatorCalendarHolidayTestCase' => 'PhabricatorTestCase',
|
2012-10-24 22:22:24 +02:00
|
|
|
'PhabricatorCalendarViewStatusController' => 'PhabricatorCalendarController',
|
2013-02-17 15:37:02 +01:00
|
|
|
'PhabricatorCampfireProtocolAdapter' => 'PhabricatorBotBaseStreamingProtocolAdapter',
|
2012-03-13 05:39:05 +01:00
|
|
|
'PhabricatorChangesetResponse' => 'AphrontProxyResponse',
|
2013-02-14 13:10:42 +01:00
|
|
|
'PhabricatorChatLogChannel' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorChatLogDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
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',
|
2012-06-02 23:00:08 +02:00
|
|
|
'PhabricatorChatLogEvent' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorChatLogDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2012-02-17 19:21:38 +01:00
|
|
|
'PhabricatorChatLogEventType' => 'PhabricatorChatLogConstants',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorChatLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2011-01-24 18:00:29 +01:00
|
|
|
'PhabricatorConduitAPIController' => 'PhabricatorConduitController',
|
2011-06-14 21:17:14 +02:00
|
|
|
'PhabricatorConduitCertificateToken' => 'PhabricatorConduitDAO',
|
2013-05-19 13:16:09 +02:00
|
|
|
'PhabricatorConduitConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-01-24 18:00:29 +01:00
|
|
|
'PhabricatorConduitConnectionLog' => 'PhabricatorConduitDAO',
|
|
|
|
'PhabricatorConduitConsoleController' => 'PhabricatorConduitController',
|
|
|
|
'PhabricatorConduitController' => 'PhabricatorController',
|
|
|
|
'PhabricatorConduitDAO' => 'PhabricatorLiskDAO',
|
2013-07-01 21:36:34 +02:00
|
|
|
'PhabricatorConduitListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorConduitController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2011-01-24 18:00:29 +01:00
|
|
|
'PhabricatorConduitLogController' => 'PhabricatorConduitController',
|
2013-07-01 21:37:34 +02:00
|
|
|
'PhabricatorConduitLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorConduitMethodCallLog' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorConduitDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2013-07-01 21:36:34 +02:00
|
|
|
'PhabricatorConduitMethodQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorConduitSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2011-06-14 21:17:14 +02:00
|
|
|
'PhabricatorConduitTokenController' => 'PhabricatorConduitController',
|
2013-01-16 20:10:41 +01:00
|
|
|
'PhabricatorConfigAllController' => 'PhabricatorConfigController',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigController' => 'PhabricatorController',
|
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',
|
2013-01-01 23:10:33 +01:00
|
|
|
'PhabricatorConfigDefaultSource' => 'PhabricatorConfigProxySource',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigDictionarySource' => 'PhabricatorConfigSource',
|
2012-12-28 00:20:09 +01:00
|
|
|
'PhabricatorConfigEditController' => 'PhabricatorConfigController',
|
2013-01-02 03:14:41 +01:00
|
|
|
'PhabricatorConfigEditor' => 'PhabricatorApplicationTransactionEditor',
|
2013-07-22 00:04:21 +02:00
|
|
|
'PhabricatorConfigEntry' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorConfigEntryDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
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',
|
2013-03-06 23:14:09 +01:00
|
|
|
'PhabricatorConfigIgnoreController' => 'PhabricatorApplicationsController',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorConfigIssueListController' => 'PhabricatorConfigController',
|
|
|
|
'PhabricatorConfigIssueViewController' => 'PhabricatorConfigController',
|
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',
|
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',
|
|
|
|
'PhabricatorConfigManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2013-01-01 23:09:29 +01:00
|
|
|
'PhabricatorConfigOption' =>
|
|
|
|
array(
|
|
|
|
0 => 'Phobject',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
|
|
|
),
|
2013-07-22 00:04:21 +02:00
|
|
|
'PhabricatorConfigPHIDTypeConfig' => 'PhabricatorPHIDType',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigProxySource' => 'PhabricatorConfigSource',
|
2013-01-23 00:16:26 +01:00
|
|
|
'PhabricatorConfigResponse' => 'AphrontHTMLResponse',
|
2012-12-25 15:44:29 +01:00
|
|
|
'PhabricatorConfigStackSource' => 'PhabricatorConfigSource',
|
2013-01-02 03:14:41 +01:00
|
|
|
'PhabricatorConfigTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-01-02 03:15:03 +01:00
|
|
|
'PhabricatorConfigValidationException' => 'Exception',
|
2013-07-26 21:07:47 +02:00
|
|
|
'PhabricatorConpherencePHIDTypeThread' => 'PhabricatorPHIDType',
|
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',
|
2011-01-23 02:48:55 +01:00
|
|
|
'PhabricatorController' => 'AphrontController',
|
2013-01-02 03:22:48 +01:00
|
|
|
'PhabricatorCoreConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-05-23 15:47:54 +02:00
|
|
|
'PhabricatorCountdown' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorCountdownDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2013-10-16 19:36:08 +02:00
|
|
|
'PhabricatorCountdownCapabilityDefaultView' => 'PhabricatorPolicyCapability',
|
2011-06-13 01:06:17 +02:00
|
|
|
'PhabricatorCountdownController' => 'PhabricatorController',
|
|
|
|
'PhabricatorCountdownDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorCountdownDeleteController' => 'PhabricatorCountdownController',
|
|
|
|
'PhabricatorCountdownEditController' => 'PhabricatorCountdownController',
|
2013-07-23 15:16:19 +02:00
|
|
|
'PhabricatorCountdownListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorCountdownController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-07-22 23:42:25 +02:00
|
|
|
'PhabricatorCountdownPHIDTypeCountdown' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorCountdownQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-05-23 15:47:54 +02:00
|
|
|
'PhabricatorCountdownRemarkupRule' => 'PhabricatorRemarkupRuleObject',
|
2013-07-23 15:16:19 +02:00
|
|
|
'PhabricatorCountdownSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
|
|
'PhabricatorCountdownView' => 'AphrontTagView',
|
2011-06-13 01:06:17 +02:00
|
|
|
'PhabricatorCountdownViewController' => 'PhabricatorCountdownController',
|
2012-12-07 22:35:17 +01:00
|
|
|
'PhabricatorCrumbView' => 'AphrontView',
|
|
|
|
'PhabricatorCrumbsView' => 'AphrontView',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorCursorPagedPolicyAwareQuery' => 'PhabricatorPolicyAwareQuery',
|
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',
|
|
|
|
'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',
|
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',
|
|
|
|
'PhabricatorCustomFieldStorage' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorCustomFieldStringIndexStorage' => 'PhabricatorCustomFieldIndexStorage',
|
2011-03-07 07:29:22 +01:00
|
|
|
'PhabricatorDaemon' => 'PhutilDaemon',
|
2011-05-03 02:05:22 +02:00
|
|
|
'PhabricatorDaemonCombinedLogController' => 'PhabricatorDaemonController',
|
2011-03-10 22:48:29 +01:00
|
|
|
'PhabricatorDaemonConsoleController' => 'PhabricatorDaemonController',
|
|
|
|
'PhabricatorDaemonController' => 'PhabricatorController',
|
2011-03-15 21:38:14 +01:00
|
|
|
'PhabricatorDaemonDAO' => 'PhabricatorLiskDAO',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorDaemonEventListener' => 'PhabricatorEventListener',
|
2013-07-23 21:11:34 +02:00
|
|
|
'PhabricatorDaemonLog' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorDaemonDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2011-03-15 21:38:14 +01:00
|
|
|
'PhabricatorDaemonLogEvent' => 'PhabricatorDaemonDAO',
|
2013-07-23 21:30:58 +02:00
|
|
|
'PhabricatorDaemonLogEventViewController' => 'PhabricatorDaemonController',
|
2011-05-03 02:05:22 +02:00
|
|
|
'PhabricatorDaemonLogEventsView' => 'AphrontView',
|
|
|
|
'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',
|
2013-07-19 00:28:56 +02:00
|
|
|
'PhabricatorDaemonManagementRestartWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
|
|
|
'PhabricatorDaemonManagementStartWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
|
|
|
'PhabricatorDaemonManagementStatusWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
|
|
|
'PhabricatorDaemonManagementStopWorkflow' => 'PhabricatorDaemonManagementWorkflow',
|
|
|
|
'PhabricatorDaemonManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2013-07-21 18:27:00 +02:00
|
|
|
'PhabricatorDataNotAttachedException' => 'Exception',
|
2013-03-04 22:45:51 +01:00
|
|
|
'PhabricatorDebugController' => 'PhabricatorController',
|
2011-07-20 07:48:38 +02:00
|
|
|
'PhabricatorDefaultFileStorageEngineSelector' => 'PhabricatorFileStorageEngineSelector',
|
2011-08-08 00:14:23 +02:00
|
|
|
'PhabricatorDefaultSearchEngineSelector' => 'PhabricatorSearchEngineSelector',
|
2013-01-01 23:09:17 +01:00
|
|
|
'PhabricatorDeveloperConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2012-12-31 00:36:06 +01:00
|
|
|
'PhabricatorDifferentialConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-05-06 23:11:26 +02:00
|
|
|
'PhabricatorDifferentialRevisionTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2013-01-16 18:08:13 +01:00
|
|
|
'PhabricatorDiffusionConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-01-23 02:48:55 +01:00
|
|
|
'PhabricatorDirectoryController' => 'PhabricatorController',
|
2012-05-01 19:15:56 +02:00
|
|
|
'PhabricatorDirectoryMainController' => 'PhabricatorDirectoryController',
|
2011-05-12 19:06:54 +02:00
|
|
|
'PhabricatorDisabledUserController' => 'PhabricatorAuthController',
|
2013-01-01 23:09:29 +01:00
|
|
|
'PhabricatorDisqusConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-02-06 01:57:21 +01:00
|
|
|
'PhabricatorDraft' => 'PhabricatorDraftDAO',
|
|
|
|
'PhabricatorDraftDAO' => 'PhabricatorLiskDAO',
|
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',
|
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',
|
2012-10-10 19:18:23 +02:00
|
|
|
'PhabricatorEdgeEditor' => 'PhabricatorEditor',
|
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',
|
2012-10-23 04:06:56 +02:00
|
|
|
'PhabricatorEditor' => 'Phobject',
|
2011-01-31 20:55:26 +01:00
|
|
|
'PhabricatorEmailLoginController' => 'PhabricatorAuthController',
|
|
|
|
'PhabricatorEmailTokenController' => 'PhabricatorAuthController',
|
2013-07-11 03:53:09 +02:00
|
|
|
'PhabricatorEmailVerificationController' => 'PhabricatorAuthController',
|
2013-03-01 20:28:02 +01:00
|
|
|
'PhabricatorEmptyQueryException' => 'Exception',
|
2012-06-15 04:01:57 +02:00
|
|
|
'PhabricatorEnglishTranslation' => 'PhabricatorBaseEnglishTranslation',
|
2012-01-12 01:07:36 +01:00
|
|
|
'PhabricatorEnvTestCase' => 'PhabricatorTestCase',
|
2012-04-08 02:25:31 +02:00
|
|
|
'PhabricatorErrorExample' => 'PhabricatorUIExample',
|
2011-11-10 02:23:33 +01:00
|
|
|
'PhabricatorEvent' => 'PhutilEvent',
|
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',
|
2013-01-03 00:52:30 +01:00
|
|
|
'PhabricatorExtendingPhabricatorConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-06-17 21:14:00 +02:00
|
|
|
'PhabricatorExternalAccount' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorUserDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhabricatorExternalAccountQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2012-07-27 22:46:01 +02:00
|
|
|
'PhabricatorFactAggregate' => 'PhabricatorFactDAO',
|
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',
|
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',
|
|
|
|
'PhabricatorFactManagementWorkflow' => 'PhutilArgumentWorkflow',
|
|
|
|
'PhabricatorFactRaw' => 'PhabricatorFactDAO',
|
2012-07-30 19:43:49 +02:00
|
|
|
'PhabricatorFactSimpleSpec' => 'PhabricatorFactSpec',
|
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',
|
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',
|
2013-08-05 23:10:41 +02:00
|
|
|
'PhabricatorFeedListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorFeedController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-06-26 01:29:47 +02:00
|
|
|
'PhabricatorFeedManagementRepublishWorkflow' => 'PhabricatorFeedManagementWorkflow',
|
|
|
|
'PhabricatorFeedManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2011-07-10 03:03:59 +02:00
|
|
|
'PhabricatorFeedPublicStreamController' => 'PhabricatorFeedController',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorFeedQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-08-05 23:10:41 +02:00
|
|
|
'PhabricatorFeedSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2012-07-04 01:46:27 +02:00
|
|
|
'PhabricatorFeedStory' => 'PhabricatorPolicyInterface',
|
2012-07-01 20:08:59 +02:00
|
|
|
'PhabricatorFeedStoryAggregate' => 'PhabricatorFeedStory',
|
2012-02-27 18:49:01 +01:00
|
|
|
'PhabricatorFeedStoryAudit' => 'PhabricatorFeedStory',
|
2012-06-20 15:03:44 +02:00
|
|
|
'PhabricatorFeedStoryCommit' => 'PhabricatorFeedStory',
|
2011-07-05 17:35:18 +02:00
|
|
|
'PhabricatorFeedStoryData' => 'PhabricatorFeedDAO',
|
2011-07-10 00:44:49 +02:00
|
|
|
'PhabricatorFeedStoryDifferential' => 'PhabricatorFeedStory',
|
2012-08-22 17:19:38 +02:00
|
|
|
'PhabricatorFeedStoryDifferentialAggregate' => 'PhabricatorFeedStoryAggregate',
|
2012-07-01 20:08:59 +02:00
|
|
|
'PhabricatorFeedStoryManiphestAggregate' => 'PhabricatorFeedStoryAggregate',
|
2012-06-08 15:31:30 +02:00
|
|
|
'PhabricatorFeedStoryNotification' => 'PhabricatorFeedDAO',
|
2011-07-12 16:23:04 +02:00
|
|
|
'PhabricatorFeedStoryPhriction' => 'PhabricatorFeedStory',
|
2011-07-05 17:35:18 +02:00
|
|
|
'PhabricatorFeedStoryReference' => 'PhabricatorFeedDAO',
|
2011-07-09 22:28:09 +02:00
|
|
|
'PhabricatorFeedStoryStatus' => 'PhabricatorFeedStory',
|
2011-07-10 00:44:49 +02:00
|
|
|
'PhabricatorFeedStoryTypeConstants' => 'PhabricatorFeedConstants',
|
2012-10-31 17:57:46 +01:00
|
|
|
'PhabricatorFile' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorFileDAO',
|
2013-09-05 22:11:02 +02:00
|
|
|
1 => 'PhabricatorTokenReceiverInterface',
|
|
|
|
2 => 'PhabricatorSubscribableInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
3 => 'PhabricatorFlaggableInterface',
|
|
|
|
4 => 'PhabricatorPolicyInterface',
|
2012-10-31 17:57:46 +01:00
|
|
|
),
|
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',
|
2013-09-05 22:11:02 +02:00
|
|
|
'PhabricatorFileEditor' => 'PhabricatorApplicationTransactionEditor',
|
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
|
|
|
'PhabricatorFileImageMacro' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorFileDAO',
|
|
|
|
1 => 'PhabricatorSubscribableInterface',
|
2013-02-17 15:37:09 +01:00
|
|
|
2 => 'PhabricatorApplicationTransactionInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
3 => 'PhabricatorFlaggableInterface',
|
|
|
|
4 => '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
|
|
|
),
|
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
|
|
|
'PhabricatorFileLinkListView' => 'AphrontView',
|
|
|
|
'PhabricatorFileLinkView' => 'AphrontView',
|
2013-05-31 19:51:05 +02:00
|
|
|
'PhabricatorFileListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorFileController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-07-22 17:02:56 +02:00
|
|
|
'PhabricatorFilePHIDTypeFile' => 'PhabricatorPHIDType',
|
2012-10-31 17:57:46 +01:00
|
|
|
'PhabricatorFileQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-05-31 19:51:05 +02:00
|
|
|
'PhabricatorFileSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2012-05-03 23:46:11 +02:00
|
|
|
'PhabricatorFileShortcutController' => 'PhabricatorFileController',
|
2011-01-23 03:33:00 +01:00
|
|
|
'PhabricatorFileStorageBlob' => 'PhabricatorFileDAO',
|
2012-05-30 23:26:29 +02:00
|
|
|
'PhabricatorFileStorageConfigurationException' => 'Exception',
|
2013-02-06 22:37:42 +01:00
|
|
|
'PhabricatorFileTestCase' => 'PhabricatorTestCase',
|
2013-05-06 19:30:24 +02:00
|
|
|
'PhabricatorFileTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2013-09-05 22:11:02 +02:00
|
|
|
'PhabricatorFileTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhabricatorFileTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
|
|
|
'PhabricatorFileTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2011-05-22 23:40:51 +02:00
|
|
|
'PhabricatorFileTransformController' => 'PhabricatorFileController',
|
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',
|
2013-01-14 02:01:00 +01:00
|
|
|
'PhabricatorFilesConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
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',
|
2012-10-25 20:36:38 +02:00
|
|
|
'PhabricatorFilesManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2013-08-14 01:17:42 +02:00
|
|
|
'PhabricatorFlag' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorFlagDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2012-03-28 01:22:40 +02:00
|
|
|
'PhabricatorFlagColor' => 'PhabricatorFlagConstants',
|
|
|
|
'PhabricatorFlagController' => 'PhabricatorController',
|
|
|
|
'PhabricatorFlagDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorFlagDeleteController' => 'PhabricatorFlagController',
|
|
|
|
'PhabricatorFlagEditController' => 'PhabricatorFlagController',
|
2013-08-14 01:27:26 +02:00
|
|
|
'PhabricatorFlagListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorFlagController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
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',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorFlagsUIEventListener' => 'PhabricatorEventListener',
|
2012-04-04 21:14:10 +02:00
|
|
|
'PhabricatorFormExample' => 'PhabricatorUIExample',
|
2013-01-02 23:03:08 +01:00
|
|
|
'PhabricatorGarbageCollectorConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-07-03 18:47:31 +02:00
|
|
|
'PhabricatorGarbageCollectorDaemon' => 'PhabricatorDaemon',
|
Add support for device swipe events
Summary:
Ref T2700. Allow JS to listen for swipes on devices.
There are a bunch of tricky cases here and I probably didn't get them all totally right, but this interaction broadly looks like this:
- We implement gesture recognition for the mouse in device modes (narrow browser), and for touch events from an actual device.
- The sigil `touchable` indicates that a node wants to react to touch events.
- When the user touches a `touchable` node, we start listening for moves. They might be tapping/clicking (in which case we don't care), but they might also be gesturing.
- Once the user moves their finger/pointer far enough away from the tap origin, we recognize it as a gesture. I hardcoded this at 20px; I wasn't able to find any "official" Apple value, but 20px seems like a common default.
- At this point, we look at where their finger has moved.
- If they moved it mostly up/down, we interpret the gesture as "scroll" and just stop listening. The device does its own thing.
- However, if they moved it mostly left/right, we interpret it as a "swipe". We start killing the moves so the device doesn't scroll.
- Once we've recognized that a gesture is underway, we send a "gesture.swipe.start" event and then "gesture.swipe.move" events for every move.
- When the user ends the gesture, we send "gesture.swipe.end".
- If the user cancels the gesture (currently, only by tapping with a second finger), we send "gesture.swipe.cancel".
- Gesture events have raw position data and some convenience fields.
Test Plan:
Wrote UI example and used it from the Desktop, iPhone simulator, and a real iphone.
- The code always seems to get "scroll" vs "swipe" correct (i.e., consistent with my intentions).
- The threshold feels pretty good to me.
- Tapping with a second finger cancels the action.
Reviewers: chad, btrahan
Reviewed By: chad
CC: aran
Maniphest Tasks: T2700
Differential Revision: https://secure.phabricator.com/D5308
2013-03-09 22:53:15 +01:00
|
|
|
'PhabricatorGestureExample' => 'PhabricatorUIExample',
|
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',
|
2013-07-21 16:03:10 +02:00
|
|
|
'PhabricatorHandleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-11-09 03:09:03 +01:00
|
|
|
'PhabricatorHarbormasterConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2012-12-21 14:43:33 +01:00
|
|
|
'PhabricatorHashTestCase' => 'PhabricatorTestCase',
|
2011-05-28 20:36:00 +02:00
|
|
|
'PhabricatorHelpController' => 'PhabricatorController',
|
|
|
|
'PhabricatorHelpKeyboardShortcutController' => 'PhabricatorHelpController',
|
2013-04-02 18:15:33 +02:00
|
|
|
'PhabricatorHovercardExample' => 'PhabricatorUIExample',
|
|
|
|
'PhabricatorHovercardView' => 'AphrontView',
|
2011-05-15 18:29:48 +02:00
|
|
|
'PhabricatorIRCBot' => 'PhabricatorDaemon',
|
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' => 'PhabricatorBaseProtocolAdapter',
|
|
|
|
'PhabricatorIRCProtocolHandler' => 'PhabricatorBotHandler',
|
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',
|
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',
|
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',
|
2013-07-04 01:37:05 +02:00
|
|
|
'PhabricatorLegalpadConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-07-26 21:05:33 +02:00
|
|
|
'PhabricatorLegalpadPHIDTypeDocument' => 'PhabricatorPHIDType',
|
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
|
|
|
'PhabricatorLintEngine' => 'PhutilLintEngine',
|
2013-04-12 23:07:15 +02:00
|
|
|
'PhabricatorLipsumGenerateWorkflow' => 'PhabricatorLipsumManagementWorkflow',
|
|
|
|
'PhabricatorLipsumManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2013-04-16 17:19:45 +02:00
|
|
|
'PhabricatorLipsumMondrianArtist' => 'PhabricatorLipsumArtist',
|
2011-01-23 02:48:55 +01:00
|
|
|
'PhabricatorLiskDAO' => 'LiskDAO',
|
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',
|
2011-01-31 03:52:29 +01:00
|
|
|
'PhabricatorLogoutController' => 'PhabricatorAuthController',
|
2013-09-28 01:01:37 +02:00
|
|
|
'PhabricatorMacroAudioController' => 'PhabricatorMacroController',
|
2013-10-16 19:35:52 +02:00
|
|
|
'PhabricatorMacroCapabilityManage' => 'PhabricatorPolicyCapability',
|
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',
|
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',
|
2013-05-30 23:09:37 +02:00
|
|
|
'PhabricatorMacroListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorMacroController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorMacroMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2013-01-20 03:43:35 +01:00
|
|
|
'PhabricatorMacroMemeController' => 'PhabricatorMacroController',
|
2013-01-22 03:46:04 +01:00
|
|
|
'PhabricatorMacroMemeDialogController' => 'PhabricatorMacroController',
|
2013-07-24 23:06:10 +02:00
|
|
|
'PhabricatorMacroPHIDTypeMacro' => 'PhabricatorPHIDType',
|
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',
|
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' => 'PhabricatorMailReplyHandler',
|
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',
|
2011-02-10 02:39:55 +01:00
|
|
|
'PhabricatorMailImplementationAmazonSESAdapter' => 'PhabricatorMailImplementationPHPMailerLiteAdapter',
|
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-07-11 00:18:37 +02:00
|
|
|
'PhabricatorMailManagementListInboundWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
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' => 'PhabricatorSearchManagementWorkflow',
|
2013-07-11 00:13:24 +02:00
|
|
|
'PhabricatorMailManagementReceiveTestWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
2013-03-30 23:53:49 +01:00
|
|
|
'PhabricatorMailManagementResendWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
2013-07-11 00:18:24 +02:00
|
|
|
'PhabricatorMailManagementSendTestWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
2013-05-20 19:13:42 +02:00
|
|
|
'PhabricatorMailManagementShowInboundWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
|
|
|
'PhabricatorMailManagementShowOutboundWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
2013-03-30 23:53:49 +01:00
|
|
|
'PhabricatorMailManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2013-05-15 00:04:17 +02:00
|
|
|
'PhabricatorMailReceiverTestCase' => 'PhabricatorTestCase',
|
2013-07-21 19:42:07 +02:00
|
|
|
'PhabricatorMailingListPHIDTypeList' => 'PhabricatorPHIDType',
|
|
|
|
'PhabricatorMailingListQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhabricatorMailingListSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-01-24 01:36:21 +01:00
|
|
|
'PhabricatorMailingListsController' => 'PhabricatorController',
|
|
|
|
'PhabricatorMailingListsEditController' => 'PhabricatorMailingListsController',
|
2013-07-21 19:42:07 +02:00
|
|
|
'PhabricatorMailingListsListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorMailingListsController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2012-07-31 01:09:14 +02:00
|
|
|
'PhabricatorMainMenuGroupView' => 'AphrontView',
|
|
|
|
'PhabricatorMainMenuIconView' => 'AphrontView',
|
|
|
|
'PhabricatorMainMenuSearchView' => 'AphrontView',
|
|
|
|
'PhabricatorMainMenuView' => 'AphrontView',
|
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',
|
2013-05-24 21:37:53 +02:00
|
|
|
'PhabricatorMarkupOneOff' => 'PhabricatorMarkupInterface',
|
2013-08-05 19:46:39 +02:00
|
|
|
'PhabricatorMarkupPreviewController' => 'PhabricatorController',
|
2013-07-11 00:17:38 +02:00
|
|
|
'PhabricatorMetaMTAActorQuery' => 'PhabricatorQuery',
|
2013-01-17 00:06:39 +01:00
|
|
|
'PhabricatorMetaMTAConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-01-26 02:40:21 +01:00
|
|
|
'PhabricatorMetaMTAController' => 'PhabricatorController',
|
|
|
|
'PhabricatorMetaMTADAO' => 'PhabricatorLiskDAO',
|
2011-06-01 17:33:14 +02:00
|
|
|
'PhabricatorMetaMTAEmailBodyParserTestCase' => 'PhabricatorTestCase',
|
2011-01-26 02:40:21 +01:00
|
|
|
'PhabricatorMetaMTAMail' => 'PhabricatorMetaMTADAO',
|
2012-07-17 04:01:43 +02:00
|
|
|
'PhabricatorMetaMTAMailBodyTestCase' => 'PhabricatorTestCase',
|
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',
|
2013-07-21 19:42:07 +02:00
|
|
|
'PhabricatorMetaMTAMailingList' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorMetaMTADAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
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',
|
2011-05-30 20:07:05 +02:00
|
|
|
'PhabricatorMetaMTASendGridReceiveController' => 'PhabricatorMetaMTAController',
|
2012-02-28 02:11:25 +01:00
|
|
|
'PhabricatorMetaMTAWorker' => 'PhabricatorWorker',
|
2013-04-02 20:23:24 +02:00
|
|
|
'PhabricatorMultiColumnExample' => 'PhabricatorUIExample',
|
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',
|
2013-05-27 22:40:43 +02:00
|
|
|
'PhabricatorNamedQuery' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorSearchDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhabricatorNamedQueryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-03-08 02:23:30 +01:00
|
|
|
'PhabricatorNoteExample' => 'PhabricatorUIExample',
|
2012-06-20 22:51:19 +02:00
|
|
|
'PhabricatorNotificationClearController' => 'PhabricatorNotificationController',
|
2013-01-03 18:29:19 +01:00
|
|
|
'PhabricatorNotificationConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2012-06-08 15:31:30 +02:00
|
|
|
'PhabricatorNotificationController' => 'PhabricatorController',
|
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',
|
2012-06-17 20:35:18 +02:00
|
|
|
'PhabricatorNotificationStatusController' => 'PhabricatorNotificationController',
|
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
|
|
|
'PhabricatorOAuthClientAuthorization' => 'PhabricatorOAuthServerDAO',
|
2012-02-22 19:21:39 +01:00
|
|
|
'PhabricatorOAuthClientAuthorizationBaseController' => 'PhabricatorOAuthServerController',
|
|
|
|
'PhabricatorOAuthClientAuthorizationDeleteController' => 'PhabricatorOAuthClientAuthorizationBaseController',
|
|
|
|
'PhabricatorOAuthClientAuthorizationEditController' => 'PhabricatorOAuthClientAuthorizationBaseController',
|
|
|
|
'PhabricatorOAuthClientAuthorizationListController' => 'PhabricatorOAuthClientAuthorizationBaseController',
|
2012-04-05 02:51:16 +02:00
|
|
|
'PhabricatorOAuthClientAuthorizationQuery' => 'PhabricatorOffsetPagedQuery',
|
2012-02-22 19:21:39 +01:00
|
|
|
'PhabricatorOAuthClientBaseController' => 'PhabricatorOAuthServerController',
|
|
|
|
'PhabricatorOAuthClientDeleteController' => 'PhabricatorOAuthClientBaseController',
|
|
|
|
'PhabricatorOAuthClientEditController' => 'PhabricatorOAuthClientBaseController',
|
|
|
|
'PhabricatorOAuthClientListController' => 'PhabricatorOAuthClientBaseController',
|
|
|
|
'PhabricatorOAuthClientViewController' => 'PhabricatorOAuthClientBaseController',
|
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',
|
|
|
|
'PhabricatorOAuthServerAccessToken' => 'PhabricatorOAuthServerDAO',
|
|
|
|
'PhabricatorOAuthServerAuthController' => 'PhabricatorAuthController',
|
|
|
|
'PhabricatorOAuthServerAuthorizationCode' => 'PhabricatorOAuthServerDAO',
|
|
|
|
'PhabricatorOAuthServerClient' => 'PhabricatorOAuthServerDAO',
|
2012-04-05 02:51:16 +02:00
|
|
|
'PhabricatorOAuthServerClientQuery' => 'PhabricatorOffsetPagedQuery',
|
2012-02-22 19:21:39 +01:00
|
|
|
'PhabricatorOAuthServerController' => 'PhabricatorController',
|
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',
|
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',
|
2012-02-22 19:21:39 +01:00
|
|
|
'PhabricatorOAuthServerTestController' => '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
|
|
|
'PhabricatorOAuthServerTokenController' => 'PhabricatorAuthController',
|
2013-07-21 16:03:10 +02:00
|
|
|
'PhabricatorObjectHandle' => 'PhabricatorPolicyInterface',
|
Add object status to Handles
Summary:
We use ObjectHandles as proxy objects which can refer to any other object in the
system. Add the concept of the underlying object's "status" (e.g., open, closed
or busy).
This allows us to render completed tasks and revisions with strikethrough. In
the future, if we implement OOO or something, we could render users with a
"busy" status if they're on vacation, etc.
Test Plan: Viewed a task with closed revisions and dependencies:
https://secure.phabricator.com/file/view/PHID-FILE-6183e81286fa3288d33d/
Reviewed By: codeblock
Reviewers: codeblock, hunterbridges, jungejason, tuomaspelkonen, aran
CC: aran, codeblock
Differential Revision: 772
2011-08-03 15:37:18 +02:00
|
|
|
'PhabricatorObjectHandleStatus' => 'PhabricatorObjectHandleConstants',
|
2012-08-07 20:57:38 +02:00
|
|
|
'PhabricatorObjectListView' => 'AphrontView',
|
2013-05-14 19:57:41 +02:00
|
|
|
'PhabricatorObjectMailReceiver' => 'PhabricatorMailReceiver',
|
2013-05-17 12:49:29 +02:00
|
|
|
'PhabricatorObjectMailReceiverTestCase' => 'PhabricatorTestCase',
|
2013-07-21 15:34:21 +02:00
|
|
|
'PhabricatorObjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2012-03-27 05:54:26 +02:00
|
|
|
'PhabricatorOffsetPagedQuery' => 'PhabricatorQuery',
|
2013-01-16 19:52:30 +01:00
|
|
|
'PhabricatorOwnersConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-04-03 23:48:36 +02:00
|
|
|
'PhabricatorOwnersController' => 'PhabricatorController',
|
|
|
|
'PhabricatorOwnersDAO' => 'PhabricatorLiskDAO',
|
2011-04-04 07:03:27 +02:00
|
|
|
'PhabricatorOwnersDeleteController' => 'PhabricatorOwnersController',
|
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',
|
2013-07-26 19:31:26 +02:00
|
|
|
'PhabricatorOwnersPHIDTypePackage' => 'PhabricatorPHIDType',
|
2012-08-08 21:25:11 +02:00
|
|
|
'PhabricatorOwnersPackage' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorOwnersDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorOwnersPackageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2012-12-07 02:23:56 +01:00
|
|
|
'PhabricatorOwnersPackageTestCase' => 'PhabricatorTestCase',
|
2011-04-03 23:48:36 +02:00
|
|
|
'PhabricatorOwnersPath' => 'PhabricatorOwnersDAO',
|
2013-01-09 15:05:34 +01:00
|
|
|
'PhabricatorPHDConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-01-15 21:03:44 +01:00
|
|
|
'PhabricatorPHPMailerConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
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
|
|
|
'PhabricatorPagedFormExample' => 'PhabricatorUIExample',
|
2012-05-30 23:26:29 +02:00
|
|
|
'PhabricatorPaste' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorPasteDAO',
|
2013-08-06 02:11:46 +02:00
|
|
|
1 => 'PhabricatorSubscribableInterface',
|
|
|
|
2 => 'PhabricatorTokenReceiverInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
3 => 'PhabricatorFlaggableInterface',
|
|
|
|
4 => 'PhabricatorPolicyInterface',
|
2012-05-30 23:26:29 +02:00
|
|
|
),
|
2013-08-02 21:56:58 +02:00
|
|
|
'PhabricatorPasteCommentController' => 'PhabricatorPasteController',
|
2013-07-30 22:26:55 +02:00
|
|
|
'PhabricatorPasteConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-06-10 08:53:53 +02:00
|
|
|
'PhabricatorPasteController' => 'PhabricatorController',
|
|
|
|
'PhabricatorPasteDAO' => 'PhabricatorLiskDAO',
|
2012-08-24 22:19:14 +02:00
|
|
|
'PhabricatorPasteEditController' => 'PhabricatorPasteController',
|
2013-08-02 21:56:58 +02:00
|
|
|
'PhabricatorPasteEditor' => 'PhabricatorApplicationTransactionEditor',
|
2013-05-30 23:09:02 +02:00
|
|
|
'PhabricatorPasteListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorPasteController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-07-24 20:32:49 +02:00
|
|
|
'PhabricatorPastePHIDTypePaste' => 'PhabricatorPHIDType',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorPasteQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-02-27 16:18:30 +01:00
|
|
|
'PhabricatorPasteRemarkupRule' => 'PhabricatorRemarkupRuleObject',
|
2013-04-14 15:53:20 +02:00
|
|
|
'PhabricatorPasteSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
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',
|
2011-01-24 03:09:16 +01:00
|
|
|
'PhabricatorPeopleController' => 'PhabricatorController',
|
|
|
|
'PhabricatorPeopleEditController' => 'PhabricatorPeopleController',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorPeopleHovercardEventListener' => 'PhabricatorEventListener',
|
2012-07-04 04:10:38 +02:00
|
|
|
'PhabricatorPeopleLdapController' => 'PhabricatorPeopleController',
|
2013-05-31 19:51:20 +02:00
|
|
|
'PhabricatorPeopleListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorPeopleController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
Provide an activity log for login and administrative actions
Summary: This isn't complete, but I figured I'd ship it for review while it's still smallish.
Provide an activity log for high-level system actions (logins, admin actions). This basically allows two things to happen:
- The log itself is useful if there are shenanigans.
- Password login can check it and start CAPTCHA'ing users after a few failed attempts.
I'm going to change how the admin stuff works a little bit too, since right now you can make someone an agent, grab their certificate, revert them back to a normal user, and then act on their behalf over Conduit. This is a little silly, I'm going to move "agent" to the create workflow instead. I'll also add a confirm/email step to the administrative password reset flow.
Test Plan: Took various administrative and non-administrative actions, they appeared in the logs. Filtered the logs in a bunch of different ways.
Reviewers: jungejason, tuomaspelkonen, aran
CC:
Differential Revision: 302
2011-05-18 03:42:21 +02:00
|
|
|
'PhabricatorPeopleLogsController' => 'PhabricatorPeopleController',
|
2013-07-24 23:12:39 +02:00
|
|
|
'PhabricatorPeoplePHIDTypeExternal' => 'PhabricatorPHIDType',
|
2013-07-26 23:05:19 +02:00
|
|
|
'PhabricatorPeoplePHIDTypeUser' => 'PhabricatorPHIDType',
|
2011-01-24 03:09:16 +01:00
|
|
|
'PhabricatorPeopleProfileController' => 'PhabricatorPeopleController',
|
2013-06-07 18:55:55 +02:00
|
|
|
'PhabricatorPeopleProfileEditController' => 'PhabricatorPeopleController',
|
2013-07-10 01:23:54 +02:00
|
|
|
'PhabricatorPeopleProfilePictureController' => 'PhabricatorPeopleController',
|
2013-05-31 19:51:53 +02:00
|
|
|
'PhabricatorPeopleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-05-31 19:51:20 +02:00
|
|
|
'PhabricatorPeopleSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-04-15 04:09:20 +02:00
|
|
|
'PhabricatorPeopleTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2013-01-16 00:36:49 +01:00
|
|
|
'PhabricatorPhameConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-07-26 21:19:12 +02:00
|
|
|
'PhabricatorPhamePHIDTypeBlog' => 'PhabricatorPHIDType',
|
2013-07-26 22:15:08 +02:00
|
|
|
'PhabricatorPhamePHIDTypePost' => 'PhabricatorPHIDType',
|
2013-01-16 19:52:30 +01:00
|
|
|
'PhabricatorPholioConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-05-06 21:33:37 +02:00
|
|
|
'PhabricatorPholioMockTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2013-04-25 18:48:04 +02:00
|
|
|
'PhabricatorPhortuneConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhabricatorPhrequentConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-01-15 15:31:53 +01:00
|
|
|
'PhabricatorPhrictionConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
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',
|
2013-10-14 21:07:31 +02:00
|
|
|
'PhabricatorPolicy' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorPolicyDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorPolicyAwareQuery' => 'PhabricatorOffsetPagedQuery',
|
|
|
|
'PhabricatorPolicyAwareTestQuery' => 'PhabricatorPolicyAwareQuery',
|
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',
|
|
|
|
'PhabricatorPolicyCapabilityCanEdit' => 'PhabricatorPolicyCapability',
|
|
|
|
'PhabricatorPolicyCapabilityCanJoin' => 'PhabricatorPolicyCapability',
|
|
|
|
'PhabricatorPolicyCapabilityCanView' => 'PhabricatorPolicyCapability',
|
2013-01-07 21:47:26 +01:00
|
|
|
'PhabricatorPolicyConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
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',
|
2012-05-30 23:26:29 +02:00
|
|
|
'PhabricatorPolicyException' => 'Exception',
|
2013-09-27 17:43:41 +02:00
|
|
|
'PhabricatorPolicyExplainController' => 'PhabricatorPolicyController',
|
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-09-29 18:06:41 +02:00
|
|
|
'PhabricatorPolicyManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2013-10-11 01:09:51 +02:00
|
|
|
'PhabricatorPolicyPHIDTypePolicy' => 'PhabricatorPHIDType',
|
2013-10-14 21:07:31 +02:00
|
|
|
'PhabricatorPolicyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-10-09 23:05:10 +02:00
|
|
|
'PhabricatorPolicyRuleAdministrators' => 'PhabricatorPolicyRule',
|
|
|
|
'PhabricatorPolicyRuleLunarPhase' => 'PhabricatorPolicyRule',
|
|
|
|
'PhabricatorPolicyRuleProjects' => 'PhabricatorPolicyRule',
|
|
|
|
'PhabricatorPolicyRuleUsers' => 'PhabricatorPolicyRule',
|
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',
|
2012-05-30 23:26:29 +02:00
|
|
|
'PhabricatorPolicyTestObject' => 'PhabricatorPolicyInterface',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorPolicyType' => 'PhabricatorPolicyConstants',
|
2012-08-10 00:42:44 +02:00
|
|
|
'PhabricatorProject' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorProjectDAO',
|
2013-10-25 21:52:00 +02:00
|
|
|
1 => 'PhabricatorFlaggableInterface',
|
|
|
|
2 => 'PhabricatorPolicyInterface',
|
2012-08-10 00:42:44 +02:00
|
|
|
),
|
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',
|
|
|
|
'PhabricatorProjectColumn' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorProjectDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhabricatorProjectColumnQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2011-02-21 03:41:23 +01:00
|
|
|
'PhabricatorProjectController' => 'PhabricatorController',
|
2011-06-26 17:37:47 +02:00
|
|
|
'PhabricatorProjectCreateController' => 'PhabricatorProjectController',
|
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',
|
2012-10-10 19:18:23 +02:00
|
|
|
'PhabricatorProjectEditor' => 'PhabricatorEditor',
|
2012-08-11 16:05:20 +02:00
|
|
|
'PhabricatorProjectEditorTestCase' => 'PhabricatorTestCase',
|
2013-10-22 22:49:37 +02:00
|
|
|
'PhabricatorProjectHistoryController' => 'PhabricatorProjectController',
|
2013-07-22 17:34:35 +02:00
|
|
|
'PhabricatorProjectListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorProjectController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2012-08-07 20:57:38 +02:00
|
|
|
'PhabricatorProjectMembersEditController' => 'PhabricatorProjectController',
|
2012-05-30 23:26:29 +02:00
|
|
|
'PhabricatorProjectNameCollisionException' => 'Exception',
|
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
|
|
|
'PhabricatorProjectPHIDTypeColumn' => 'PhabricatorPHIDType',
|
2013-07-22 18:26:26 +02:00
|
|
|
'PhabricatorProjectPHIDTypeProject' => 'PhabricatorPHIDType',
|
2011-02-21 03:41:23 +01:00
|
|
|
'PhabricatorProjectProfile' => 'PhabricatorProjectDAO',
|
|
|
|
'PhabricatorProjectProfileController' => 'PhabricatorProjectController',
|
2011-06-18 10:13:56 +02:00
|
|
|
'PhabricatorProjectProfileEditController' => 'PhabricatorProjectController',
|
2013-10-17 18:32:34 +02:00
|
|
|
'PhabricatorProjectProfilePictureController' => 'PhabricatorProjectController',
|
2012-09-13 19:15:08 +02:00
|
|
|
'PhabricatorProjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-07-22 17:34:35 +02:00
|
|
|
'PhabricatorProjectSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-09-12 22:05:19 +02:00
|
|
|
'PhabricatorProjectSearchIndexer' => 'PhabricatorSearchDocumentIndexer',
|
2013-04-29 21:17:55 +02:00
|
|
|
'PhabricatorProjectTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
2013-10-22 22:49:28 +02:00
|
|
|
'PhabricatorProjectTransaction' => 'PhabricatorApplicationTransaction',
|
2013-10-22 22:49:37 +02:00
|
|
|
'PhabricatorProjectTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2012-01-25 20:51:20 +01:00
|
|
|
'PhabricatorProjectUpdateController' => 'PhabricatorProjectController',
|
2013-01-03 18:17:38 +01:00
|
|
|
'PhabricatorRecaptchaConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
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',
|
2013-10-17 04:12:14 +02:00
|
|
|
'PhabricatorRemarkupBlockInterpreterCowsay' => 'PhutilRemarkupBlockInterpreter',
|
|
|
|
'PhabricatorRemarkupBlockInterpreterFiglet' => 'PhutilRemarkupBlockInterpreter',
|
|
|
|
'PhabricatorRemarkupBlockInterpreterGraphviz' => 'PhutilRemarkupBlockInterpreter',
|
2012-09-19 21:27:28 +02:00
|
|
|
'PhabricatorRemarkupControl' => 'AphrontFormTextAreaControl',
|
2013-10-25 02:26:07 +02:00
|
|
|
'PhabricatorRemarkupCustomBlockRule' => 'PhutilRemarkupEngineBlockRule',
|
|
|
|
'PhabricatorRemarkupCustomInlineRule' => 'PhutilRemarkupRule',
|
2013-10-02 22:13:07 +02:00
|
|
|
'PhabricatorRemarkupRuleEmbedFile' => 'PhabricatorRemarkupRuleObject',
|
2011-04-14 00:15:48 +02:00
|
|
|
'PhabricatorRemarkupRuleImageMacro' => 'PhutilRemarkupRule',
|
2013-01-24 18:57:58 +01:00
|
|
|
'PhabricatorRemarkupRuleMeme' => 'PhutilRemarkupRule',
|
2011-06-24 19:59:57 +02:00
|
|
|
'PhabricatorRemarkupRuleMention' => 'PhutilRemarkupRule',
|
2013-02-26 23:59:31 +01:00
|
|
|
'PhabricatorRemarkupRuleObject' => 'PhutilRemarkupRule',
|
2011-05-27 21:50:02 +02:00
|
|
|
'PhabricatorRemarkupRuleYoutube' => 'PhutilRemarkupRule',
|
2012-12-19 20:07:06 +01:00
|
|
|
'PhabricatorRepository' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorRepositoryDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
2 => 'PhabricatorFlaggableInterface',
|
|
|
|
3 => 'PhabricatorMarkupInterface',
|
2012-12-19 20:07:06 +01:00
|
|
|
),
|
2013-07-26 23:33:31 +02:00
|
|
|
'PhabricatorRepositoryArcanistProject' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorRepositoryDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2012-10-04 22:25:58 +02:00
|
|
|
'PhabricatorRepositoryArcanistProjectDeleteController' => 'PhabricatorRepositoryController',
|
2011-04-06 05:49:31 +02:00
|
|
|
'PhabricatorRepositoryArcanistProjectEditController' => 'PhabricatorRepositoryController',
|
2013-07-26 23:33:31 +02:00
|
|
|
'PhabricatorRepositoryArcanistProjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
Migrate "PhabricatorOwnersPackageCommitRelationship" to "PhabricatorRepositoryAuditRequest"
Summary:
- Move table to Repository, since we have no Owners joins in the application anymore but would like to do a Repository join.
- Rename "packagePHID" to "auditorPHID", since this column may contain package, project, or user PHIDs.
Test Plan:
- Browsed Owners, Audit, and Differential interfaces to the Audit tool.
- Made comments and state changes.
- Ran "reparse.php --herald --owners" on several commits.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, nh, vrana
Maniphest Tasks: T904
Differential Revision: https://secure.phabricator.com/D1787
2012-03-05 22:17:29 +01:00
|
|
|
'PhabricatorRepositoryAuditRequest' => 'PhabricatorRepositoryDAO',
|
2012-11-06 08:09:36 +01:00
|
|
|
'PhabricatorRepositoryBranch' => 'PhabricatorRepositoryDAO',
|
2013-02-27 17:04:54 +01:00
|
|
|
'PhabricatorRepositoryCommit' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorRepositoryDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
2 => 'PhabricatorFlaggableInterface',
|
|
|
|
3 => 'PhabricatorTokenReceiverInterface',
|
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',
|
2011-03-11 18:34:22 +01:00
|
|
|
'PhabricatorRepositoryCommitParserWorker' => 'PhabricatorWorker',
|
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
|
|
|
'PhabricatorRepositoryCommitSearchIndexer' => 'PhabricatorSearchDocumentIndexer',
|
2013-01-16 18:35:47 +01:00
|
|
|
'PhabricatorRepositoryConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-02-13 03:26:15 +01:00
|
|
|
'PhabricatorRepositoryController' => 'PhabricatorController',
|
|
|
|
'PhabricatorRepositoryDAO' => 'PhabricatorLiskDAO',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorRepositoryDiscoveryEngine' => 'PhabricatorRepositoryEngine',
|
2013-05-24 21:37:42 +02:00
|
|
|
'PhabricatorRepositoryEditor' => 'PhabricatorApplicationTransactionEditor',
|
2011-03-11 18:34:22 +01:00
|
|
|
'PhabricatorRepositoryGitCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker',
|
|
|
|
'PhabricatorRepositoryGitCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker',
|
2011-03-11 23:13:23 +01:00
|
|
|
'PhabricatorRepositoryListController' => 'PhabricatorRepositoryController',
|
2012-10-26 01:23:41 +02:00
|
|
|
'PhabricatorRepositoryManagementDeleteWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementDiscoverWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2013-11-06 20:26:41 +01:00
|
|
|
'PhabricatorRepositoryManagementImportingWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementListWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2013-11-06 20:26:24 +01:00
|
|
|
'PhabricatorRepositoryManagementMarkImportedWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
2012-06-25 21:35:37 +02:00
|
|
|
'PhabricatorRepositoryManagementPullWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
|
|
|
|
'PhabricatorRepositoryManagementWorkflow' => 'PhutilArgumentWorkflow',
|
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',
|
2013-07-26 23:33:31 +02:00
|
|
|
'PhabricatorRepositoryPHIDTypeArcanistProject' => 'PhabricatorPHIDType',
|
2013-07-21 19:57:07 +02:00
|
|
|
'PhabricatorRepositoryPHIDTypeCommit' => 'PhabricatorPHIDType',
|
2013-07-22 19:45:12 +02:00
|
|
|
'PhabricatorRepositoryPHIDTypeRepository' => 'PhabricatorPHIDType',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorRepositoryPullEngine' => 'PhabricatorRepositoryEngine',
|
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',
|
2012-12-19 20:07:06 +01:00
|
|
|
'PhabricatorRepositoryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-09-11 00:26:08 +02:00
|
|
|
'PhabricatorRepositorySearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2011-03-31 09:33:44 +02:00
|
|
|
'PhabricatorRepositoryShortcut' => 'PhabricatorRepositoryDAO',
|
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',
|
2013-11-01 16:34:11 +01:00
|
|
|
'PhabricatorRepositoryVCSPassword' => 'PhabricatorRepositoryDAO',
|
2011-07-31 22:54:58 +02:00
|
|
|
'PhabricatorS3FileStorageEngine' => 'PhabricatorFileStorageEngine',
|
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' => 'PhutilArgumentWorkflow',
|
2013-05-27 22:41:20 +02:00
|
|
|
'PhabricatorSavedQuery' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorSearchDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhabricatorSavedQueryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2012-03-10 00:46:25 +01:00
|
|
|
'PhabricatorSearchAttachController' => 'PhabricatorSearchBaseController',
|
2011-02-15 00:34:20 +01:00
|
|
|
'PhabricatorSearchBaseController' => 'PhabricatorController',
|
2013-01-12 00:28:16 +01:00
|
|
|
'PhabricatorSearchConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-02-15 00:34:20 +01:00
|
|
|
'PhabricatorSearchController' => 'PhabricatorSearchBaseController',
|
|
|
|
'PhabricatorSearchDAO' => 'PhabricatorLiskDAO',
|
2013-05-27 22:42:44 +02:00
|
|
|
'PhabricatorSearchDeleteController' => 'PhabricatorSearchBaseController',
|
2011-02-15 00:34:20 +01:00
|
|
|
'PhabricatorSearchDocument' => 'PhabricatorSearchDAO',
|
|
|
|
'PhabricatorSearchDocumentField' => 'PhabricatorSearchDAO',
|
|
|
|
'PhabricatorSearchDocumentRelationship' => 'PhabricatorSearchDAO',
|
2013-05-27 22:42:01 +02:00
|
|
|
'PhabricatorSearchEditController' => 'PhabricatorSearchBaseController',
|
[NO CLUE WHAT I'M DOING] Add an Elasticsearch engine
Summary:
I have no idea what I'm doing, but here's part of an elasticsearch engine. These things work:
- Indexing stuff (??)
- Searching for text/type?
- Reconstructing things??
All the complicated stuff doesn't work. I'm having a hard time figuring out the best way to model things because elasticsearch's documentation is not exactly the most complete or illuminating.
@amckinley, does this look sane-ish so far? Particularly, the /phabricator/<type>/<phid>/ URI scheme and how I've set up the relationships and fields in the documents?
How should I model the relationship and field queries? I want, like, an "equal" query but it seems like I've got "text" or "term" to work with and neither are exact match? And "term" doesn't consider PHIDs to be terms since they have hyphens in them?
I'll keep kind of slogging my way forward here but if you have valuable wisdom to share it would probably get me to a better end state much faster. The whole query construction phase is pretty much black magic to me.
Test Plan: nyancat
Reviewers: amckinley, vrana
Reviewed By: vrana
CC: jungejason, tuomaspelkonen, aran, 20after4, vrana
Differential Revision: https://secure.phabricator.com/D790
2012-04-21 00:33:09 +02:00
|
|
|
'PhabricatorSearchEngineElastic' => 'PhabricatorSearchEngine',
|
2011-08-08 00:14:23 +02:00
|
|
|
'PhabricatorSearchEngineMySQL' => 'PhabricatorSearchEngine',
|
2013-04-03 17:31:27 +02:00
|
|
|
'PhabricatorSearchHovercardController' => 'PhabricatorSearchBaseController',
|
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',
|
|
|
|
'PhabricatorSearchManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2013-06-06 01:22:27 +02:00
|
|
|
'PhabricatorSearchOrderController' => 'PhabricatorSearchBaseController',
|
2011-02-15 00:34:20 +01:00
|
|
|
'PhabricatorSearchQuery' => 'PhabricatorSearchDAO',
|
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',
|
2012-03-10 00:46:25 +01:00
|
|
|
'PhabricatorSearchSelectController' => 'PhabricatorSearchBaseController',
|
2013-01-03 14:45:23 +01:00
|
|
|
'PhabricatorSecurityConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2013-01-15 21:04:05 +01:00
|
|
|
'PhabricatorSendGridConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2012-08-13 21:37:18 +02:00
|
|
|
'PhabricatorSettingsAdjustController' => 'PhabricatorController',
|
|
|
|
'PhabricatorSettingsMainController' => 'PhabricatorController',
|
2012-08-13 21:37:26 +02:00
|
|
|
'PhabricatorSettingsPanelAccount' => 'PhabricatorSettingsPanel',
|
|
|
|
'PhabricatorSettingsPanelConduit' => 'PhabricatorSettingsPanel',
|
2013-03-26 21:30:35 +01:00
|
|
|
'PhabricatorSettingsPanelConpherencePreferences' => 'PhabricatorSettingsPanel',
|
2013-07-28 05:18:58 +02:00
|
|
|
'PhabricatorSettingsPanelDeveloperPreferences' => 'PhabricatorSettingsPanel',
|
2013-02-05 02:00:27 +01:00
|
|
|
'PhabricatorSettingsPanelDiffPreferences' => 'PhabricatorSettingsPanel',
|
2012-08-13 21:37:26 +02:00
|
|
|
'PhabricatorSettingsPanelDisplayPreferences' => 'PhabricatorSettingsPanel',
|
|
|
|
'PhabricatorSettingsPanelEmailAddresses' => 'PhabricatorSettingsPanel',
|
|
|
|
'PhabricatorSettingsPanelEmailPreferences' => 'PhabricatorSettingsPanel',
|
2013-06-17 15:12:45 +02:00
|
|
|
'PhabricatorSettingsPanelExternalAccounts' => 'PhabricatorSettingsPanel',
|
2013-01-16 18:00:11 +01:00
|
|
|
'PhabricatorSettingsPanelHomePreferences' => 'PhabricatorSettingsPanel',
|
2012-08-13 21:37:26 +02:00
|
|
|
'PhabricatorSettingsPanelPassword' => 'PhabricatorSettingsPanel',
|
|
|
|
'PhabricatorSettingsPanelSSHKeys' => 'PhabricatorSettingsPanel',
|
|
|
|
'PhabricatorSettingsPanelSearchPreferences' => 'PhabricatorSettingsPanel',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorSetupCheckAPC' => 'PhabricatorSetupCheck',
|
2013-06-20 01:28:48 +02:00
|
|
|
'PhabricatorSetupCheckAuth' => 'PhabricatorSetupCheck',
|
2013-01-22 22:57:02 +01:00
|
|
|
'PhabricatorSetupCheckBaseURI' => 'PhabricatorSetupCheck',
|
Add setup checks for the availability of 'which' and 'diff' binaries
Summary:
Spent an hour or two helping a user figure this out. Make sure I never do that again.
If the webserver is configured with an empty or bogus PATH, binaries like 'which' and 'diff' (and 'git', and 'svn', etc.) may not be available. In most cases, this is fine, because we get an error like "sh: whatever-command not found", which is obvious to diagnose.
In the case of 'diff', we don't get this, because 'diff' is expected to exit with a nonzero code for differing files -- so we interpret the "sh: whatever-command not found" as "files differ" and then try to parse the empty output.
Explicitly check for 'which' (on Windows, 'where') and 'diff' during setup (I plan to refine the behavior around 'git', 'svn' and 'hg' at some point, but this is less pressing since the errors are trivial to support).
Test Plan: Faked failures on all modes, verified setup warnings look reasonable.
Reviewers: btrahan, chad
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D6008
2013-05-23 23:42:07 +02:00
|
|
|
'PhabricatorSetupCheckBinaries' => 'PhabricatorSetupCheck',
|
2013-01-23 01:16:24 +01:00
|
|
|
'PhabricatorSetupCheckDatabase' => 'PhabricatorSetupCheck',
|
2013-01-23 00:16:26 +01:00
|
|
|
'PhabricatorSetupCheckExtensions' => 'PhabricatorSetupCheck',
|
2013-01-01 23:09:17 +01:00
|
|
|
'PhabricatorSetupCheckExtraConfig' => 'PhabricatorSetupCheck',
|
2013-05-17 19:00:40 +02:00
|
|
|
'PhabricatorSetupCheckFileinfo' => 'PhabricatorSetupCheck',
|
2013-01-19 17:41:45 +01:00
|
|
|
'PhabricatorSetupCheckGD' => 'PhabricatorSetupCheck',
|
2013-02-08 18:14:28 +01:00
|
|
|
'PhabricatorSetupCheckImagemagick' => 'PhabricatorSetupCheck',
|
2013-01-02 03:15:03 +01:00
|
|
|
'PhabricatorSetupCheckInvalidConfig' => 'PhabricatorSetupCheck',
|
2013-01-18 22:28:30 +01:00
|
|
|
'PhabricatorSetupCheckMail' => 'PhabricatorSetupCheck',
|
2013-01-19 17:41:45 +01:00
|
|
|
'PhabricatorSetupCheckMySQL' => 'PhabricatorSetupCheck',
|
2013-01-23 01:15:54 +01:00
|
|
|
'PhabricatorSetupCheckPHPConfig' => 'PhabricatorSetupCheck',
|
2013-01-22 23:45:19 +01:00
|
|
|
'PhabricatorSetupCheckPath' => 'PhabricatorSetupCheck',
|
2013-02-28 18:17:01 +01:00
|
|
|
'PhabricatorSetupCheckPygment' => 'PhabricatorSetupCheck',
|
2013-10-30 21:07:09 +01:00
|
|
|
'PhabricatorSetupCheckRepositories' => 'PhabricatorSetupCheck',
|
2013-01-19 17:39:27 +01:00
|
|
|
'PhabricatorSetupCheckStorage' => 'PhabricatorSetupCheck',
|
2012-12-31 02:04:38 +01:00
|
|
|
'PhabricatorSetupCheckTimezone' => 'PhabricatorSetupCheck',
|
2013-01-29 20:29:56 +01:00
|
|
|
'PhabricatorSetupIssueExample' => 'PhabricatorUIExample',
|
2012-12-30 15:37:49 +01:00
|
|
|
'PhabricatorSetupIssueView' => 'AphrontView',
|
2013-10-16 19:36:00 +02:00
|
|
|
'PhabricatorSlowvoteCapabilityDefaultView' => 'PhabricatorPolicyCapability',
|
2011-07-08 20:13:11 +02:00
|
|
|
'PhabricatorSlowvoteChoice' => 'PhabricatorSlowvoteDAO',
|
|
|
|
'PhabricatorSlowvoteComment' => 'PhabricatorSlowvoteDAO',
|
2013-07-15 13:45:43 +02:00
|
|
|
'PhabricatorSlowvoteCommentController' => 'PhabricatorSlowvoteController',
|
2011-07-08 20:13:11 +02:00
|
|
|
'PhabricatorSlowvoteController' => 'PhabricatorController',
|
|
|
|
'PhabricatorSlowvoteDAO' => 'PhabricatorLiskDAO',
|
2013-07-15 19:50:38 +02:00
|
|
|
'PhabricatorSlowvoteEditController' => 'PhabricatorSlowvoteController',
|
2013-07-15 13:45:43 +02:00
|
|
|
'PhabricatorSlowvoteEditor' => 'PhabricatorApplicationTransactionEditor',
|
2013-07-13 19:41:49 +02:00
|
|
|
'PhabricatorSlowvoteListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorSlowvoteController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2011-07-08 20:13:11 +02:00
|
|
|
'PhabricatorSlowvoteOption' => 'PhabricatorSlowvoteDAO',
|
2013-07-21 15:34:21 +02:00
|
|
|
'PhabricatorSlowvotePHIDTypePoll' => 'PhabricatorPHIDType',
|
2013-07-13 19:41:30 +02:00
|
|
|
'PhabricatorSlowvotePoll' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorSlowvoteDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
2013-07-15 19:50:38 +02:00
|
|
|
2 => 'PhabricatorSubscribableInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
3 => 'PhabricatorFlaggableInterface',
|
|
|
|
4 => 'PhabricatorTokenReceiverInterface',
|
2013-07-13 19:41:30 +02:00
|
|
|
),
|
2011-07-08 20:13:11 +02:00
|
|
|
'PhabricatorSlowvotePollController' => 'PhabricatorSlowvoteController',
|
2013-07-13 19:41:49 +02:00
|
|
|
'PhabricatorSlowvoteQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'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',
|
2012-04-10 23:18:20 +02:00
|
|
|
'PhabricatorSlugTestCase' => 'PhabricatorTestCase',
|
2012-03-20 03:48:22 +01:00
|
|
|
'PhabricatorSortTableExample' => 'PhabricatorUIExample',
|
2012-08-15 19:45:06 +02:00
|
|
|
'PhabricatorSourceCodeView' => 'AphrontView',
|
2013-06-07 18:55:55 +02:00
|
|
|
'PhabricatorStandardCustomField' => 'PhabricatorCustomField',
|
2013-09-17 01:03:51 +02:00
|
|
|
'PhabricatorStandardCustomFieldBool' => 'PhabricatorStandardCustomField',
|
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',
|
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',
|
2013-09-17 01:04:46 +02:00
|
|
|
'PhabricatorStandardCustomFieldUsers' => 'PhabricatorStandardCustomFieldPHIDs',
|
2012-10-16 19:33:47 +02:00
|
|
|
'PhabricatorStandardPageView' => 'PhabricatorBarePageView',
|
2011-04-08 20:13:29 +02:00
|
|
|
'PhabricatorStatusController' => 'PhabricatorController',
|
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',
|
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',
|
|
|
|
'PhabricatorStorageManagementWorkflow' => 'PhutilArgumentWorkflow',
|
2012-10-05 22:18:05 +02:00
|
|
|
'PhabricatorSubscribersQuery' => 'PhabricatorQuery',
|
|
|
|
'PhabricatorSubscriptionsEditController' => 'PhabricatorController',
|
2012-10-10 19:18:23 +02:00
|
|
|
'PhabricatorSubscriptionsEditor' => 'PhabricatorEditor',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorSubscriptionsUIEventListener' => 'PhabricatorEventListener',
|
2011-08-30 22:12:20 +02:00
|
|
|
'PhabricatorSymbolNameLinter' => 'ArcanistXHPASTLintNamingHook',
|
2013-01-10 18:56:36 +01:00
|
|
|
'PhabricatorSyntaxHighlightingConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2012-11-24 15:47:06 +01:00
|
|
|
'PhabricatorTagExample' => 'PhabricatorUIExample',
|
|
|
|
'PhabricatorTagView' => 'AphrontView',
|
2011-03-10 22:48:29 +01:00
|
|
|
'PhabricatorTaskmasterDaemon' => 'PhabricatorDaemon',
|
2011-04-30 19:11:41 +02:00
|
|
|
'PhabricatorTestCase' => 'ArcanistPhutilTestCase',
|
2013-10-04 04:05:47 +02:00
|
|
|
'PhabricatorTestController' => 'PhabricatorController',
|
2013-02-06 22:37:42 +01:00
|
|
|
'PhabricatorTestStorageEngine' => 'PhabricatorFileStorageEngine',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorTestWorker' => 'PhabricatorWorker',
|
2013-06-03 21:58:11 +02:00
|
|
|
'PhabricatorTimeTestCase' => 'PhabricatorTestCase',
|
2012-11-22 02:24:56 +01:00
|
|
|
'PhabricatorTimelineEventView' => 'AphrontView',
|
|
|
|
'PhabricatorTimelineExample' => 'PhabricatorUIExample',
|
|
|
|
'PhabricatorTimelineView' => 'AphrontView',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorToken' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorTokenDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhabricatorTokenController' => 'PhabricatorController',
|
|
|
|
'PhabricatorTokenCount' => 'PhabricatorTokenDAO',
|
2013-03-04 20:47:58 +01:00
|
|
|
'PhabricatorTokenCountQuery' => 'PhabricatorOffsetPagedQuery',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorTokenGiveController' => 'PhabricatorTokenController',
|
|
|
|
'PhabricatorTokenGiven' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorTokenDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'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-09-25 02:00:31 +02:00
|
|
|
'PhabricatorTokenPHIDTypeToken' => 'PhabricatorPHIDType',
|
2013-02-15 16:47:14 +01:00
|
|
|
'PhabricatorTokenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-03-22 00:04:29 +01:00
|
|
|
'PhabricatorTokenReceiverQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhabricatorTokenUIEventListener' => 'PhabricatorEventListener',
|
2012-02-24 22:02:35 +01:00
|
|
|
'PhabricatorTransactionView' => 'AphrontView',
|
2011-05-22 23:40:51 +02:00
|
|
|
'PhabricatorTransformedFile' => 'PhabricatorFileDAO',
|
2013-01-05 01:22:52 +01:00
|
|
|
'PhabricatorTranslationsConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
2011-08-03 17:17:53 +02:00
|
|
|
'PhabricatorTrivialTestCase' => 'PhabricatorTestCase',
|
2013-03-11 03:20:01 +01:00
|
|
|
'PhabricatorTwoColumnExample' => 'PhabricatorUIExample',
|
2011-01-25 22:48:05 +01:00
|
|
|
'PhabricatorTypeaheadCommonDatasourceController' => 'PhabricatorTypeaheadDatasourceController',
|
|
|
|
'PhabricatorTypeaheadDatasourceController' => 'PhabricatorController',
|
2012-09-11 18:56:40 +02:00
|
|
|
'PhabricatorUIExampleRenderController' => 'PhabricatorController',
|
2011-04-04 00:50:06 +02:00
|
|
|
'PhabricatorUIListFilterExample' => 'PhabricatorUIExample',
|
2012-06-14 00:00:24 +02:00
|
|
|
'PhabricatorUINotificationExample' => 'PhabricatorUIExample',
|
2011-04-01 02:06:33 +02:00
|
|
|
'PhabricatorUIPagerExample' => 'PhabricatorUIExample',
|
2013-07-24 23:13:22 +02:00
|
|
|
'PhabricatorUIStatusExample' => 'PhabricatorUIExample',
|
2012-03-13 02:21:02 +01:00
|
|
|
'PhabricatorUITooltipExample' => 'PhabricatorUIExample',
|
2012-05-04 02:30:17 +02:00
|
|
|
'PhabricatorUnitsTestCase' => 'PhabricatorTestCase',
|
2012-06-15 03:08:06 +02:00
|
|
|
'PhabricatorUser' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorUserDAO',
|
|
|
|
1 => 'PhutilPerson',
|
2013-05-31 19:51:20 +02:00
|
|
|
2 => 'PhabricatorPolicyInterface',
|
2013-06-07 18:55:55 +02:00
|
|
|
3 => 'PhabricatorCustomFieldInterface',
|
|
|
|
),
|
2013-06-07 19:22:45 +02:00
|
|
|
'PhabricatorUserBlurbField' => 'PhabricatorUserCustomField',
|
|
|
|
'PhabricatorUserConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
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' =>
|
2013-06-07 18:55:55 +02:00
|
|
|
array(
|
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
|
|
|
0 => 'PhabricatorUserCustomField',
|
|
|
|
1 => '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',
|
2012-05-07 19:29:33 +02:00
|
|
|
'PhabricatorUserEmail' => 'PhabricatorUserDAO',
|
Provide an activity log for login and administrative actions
Summary: This isn't complete, but I figured I'd ship it for review while it's still smallish.
Provide an activity log for high-level system actions (logins, admin actions). This basically allows two things to happen:
- The log itself is useful if there are shenanigans.
- Password login can check it and start CAPTCHA'ing users after a few failed attempts.
I'm going to change how the admin stuff works a little bit too, since right now you can make someone an agent, grab their certificate, revert them back to a normal user, and then act on their behalf over Conduit. This is a little silly, I'm going to move "agent" to the create workflow instead. I'll also add a confirm/email step to the administrative password reset flow.
Test Plan: Took various administrative and non-administrative actions, they appeared in the logs. Filtered the logs in a bunch of different ways.
Reviewers: jungejason, tuomaspelkonen, aran
CC:
Differential Revision: 302
2011-05-18 03:42:21 +02:00
|
|
|
'PhabricatorUserLog' => 'PhabricatorUserDAO',
|
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',
|
2011-07-22 19:17:57 +02:00
|
|
|
'PhabricatorUserSSHKey' => 'PhabricatorUserDAO',
|
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
|
|
|
'PhabricatorUserSearchIndexer' => 'PhabricatorSearchDocumentIndexer',
|
2013-07-10 14:09:59 +02:00
|
|
|
'PhabricatorUserSinceField' => 'PhabricatorUserCustomField',
|
2012-05-04 00:47:34 +02:00
|
|
|
'PhabricatorUserStatus' => 'PhabricatorUserDAO',
|
2013-07-10 21:34:09 +02:00
|
|
|
'PhabricatorUserStatusField' => 'PhabricatorUserCustomField',
|
2012-10-24 22:22:24 +02:00
|
|
|
'PhabricatorUserStatusInvalidEpochException' => 'Exception',
|
|
|
|
'PhabricatorUserStatusOverlapException' => 'Exception',
|
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',
|
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',
|
2012-10-31 23:22:16 +01:00
|
|
|
'PhabricatorWorkerActiveTask' => 'PhabricatorWorkerTask',
|
|
|
|
'PhabricatorWorkerArchiveTask' => 'PhabricatorWorkerTask',
|
2011-03-10 22:48:29 +01:00
|
|
|
'PhabricatorWorkerDAO' => 'PhabricatorLiskDAO',
|
2012-11-01 19:30:16 +01:00
|
|
|
'PhabricatorWorkerLeaseQuery' => 'PhabricatorQuery',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorWorkerPermanentFailureException' => 'Exception',
|
2011-03-10 22:48:29 +01:00
|
|
|
'PhabricatorWorkerTask' => 'PhabricatorWorkerDAO',
|
|
|
|
'PhabricatorWorkerTaskData' => 'PhabricatorWorkerDAO',
|
2011-03-27 07:55:18 +02:00
|
|
|
'PhabricatorWorkerTaskDetailController' => 'PhabricatorDaemonController',
|
2012-01-24 01:36:32 +01:00
|
|
|
'PhabricatorWorkerTaskUpdateController' => 'PhabricatorDaemonController',
|
2012-11-01 19:30:23 +01:00
|
|
|
'PhabricatorWorkerTestCase' => 'PhabricatorTestCase',
|
2013-05-13 04:08:37 +02:00
|
|
|
'PhabricatorWorkingCopyDiscoveryTestCase' => 'PhabricatorWorkingCopyTestCase',
|
2013-05-13 04:05:52 +02:00
|
|
|
'PhabricatorWorkingCopyPullTestCase' => 'PhabricatorWorkingCopyTestCase',
|
|
|
|
'PhabricatorWorkingCopyTestCase' => 'PhabricatorTestCase',
|
2011-04-07 04:17:05 +02:00
|
|
|
'PhabricatorXHPASTViewController' => 'PhabricatorController',
|
|
|
|
'PhabricatorXHPASTViewDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhabricatorXHPASTViewFrameController' => 'PhabricatorXHPASTViewController',
|
|
|
|
'PhabricatorXHPASTViewFramesetController' => 'PhabricatorXHPASTViewController',
|
|
|
|
'PhabricatorXHPASTViewInputController' => 'PhabricatorXHPASTViewPanelController',
|
|
|
|
'PhabricatorXHPASTViewPanelController' => 'PhabricatorXHPASTViewController',
|
|
|
|
'PhabricatorXHPASTViewParseTree' => 'PhabricatorXHPASTViewDAO',
|
|
|
|
'PhabricatorXHPASTViewRunController' => 'PhabricatorXHPASTViewController',
|
|
|
|
'PhabricatorXHPASTViewStreamController' => 'PhabricatorXHPASTViewPanelController',
|
|
|
|
'PhabricatorXHPASTViewTreeController' => 'PhabricatorXHPASTViewPanelController',
|
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',
|
Move skins toward modularization
Summary:
Two high-level things happening here:
- We no longer ever need to put meta-UI (content creation, editing, notices, etc.) on live blog views, since this is all in Phame now. I pulled this out.
- On the other hand, I pushed more routing/control logic into Skins and made the root skin a Controller instead of a View. This simplifies some of the code above skins, and the theory behind this is that it gives us greater flexibility to, e.g., put a glue layer between Phame and Wordpress templates or whatever else, and allows skins to handle routing and thus add pages like "About" or "Bio".
- I added a basic skin below the root skin which is more like the old root skin and has standard rendering hooks.
- "Ten Eleven" is a play on the popular (default?) Wordpress themes called "Twenty Ten", "Twenty Eleven" and "Twenty Twelve".
Test Plan: Viewed live blog and live posts. They aren't pretty, but they don't have extraneous resources.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1373
Differential Revision: https://secure.phabricator.com/D3714
2012-10-17 17:36:25 +02:00
|
|
|
'PhameBasicBlogSkin' => 'PhameBlogSkin',
|
2012-10-17 17:36:48 +02:00
|
|
|
'PhameBasicTemplateBlogSkin' => 'PhameBasicBlogSkin',
|
2012-10-15 23:49:52 +02:00
|
|
|
'PhameBlog' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhameDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
2012-10-15 23:51:30 +02:00
|
|
|
2 => 'PhabricatorMarkupInterface',
|
2012-10-15 23:49:52 +02:00
|
|
|
),
|
2012-07-19 18:03:10 +02:00
|
|
|
'PhameBlogDeleteController' => 'PhameController',
|
|
|
|
'PhameBlogEditController' => 'PhameController',
|
2013-01-09 04:53:34 +01:00
|
|
|
'PhameBlogFeedController' => 'PhameController',
|
2012-10-15 23:50:12 +02:00
|
|
|
'PhameBlogListController' => 'PhameController',
|
|
|
|
'PhameBlogLiveController' => 'PhameController',
|
2012-10-15 23:49:52 +02:00
|
|
|
'PhameBlogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
Move skins toward modularization
Summary:
Two high-level things happening here:
- We no longer ever need to put meta-UI (content creation, editing, notices, etc.) on live blog views, since this is all in Phame now. I pulled this out.
- On the other hand, I pushed more routing/control logic into Skins and made the root skin a Controller instead of a View. This simplifies some of the code above skins, and the theory behind this is that it gives us greater flexibility to, e.g., put a glue layer between Phame and Wordpress templates or whatever else, and allows skins to handle routing and thus add pages like "About" or "Bio".
- I added a basic skin below the root skin which is more like the old root skin and has standard rendering hooks.
- "Ten Eleven" is a play on the popular (default?) Wordpress themes called "Twenty Ten", "Twenty Eleven" and "Twenty Twelve".
Test Plan: Viewed live blog and live posts. They aren't pretty, but they don't have extraneous resources.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1373
Differential Revision: https://secure.phabricator.com/D3714
2012-10-17 17:36:25 +02:00
|
|
|
'PhameBlogSkin' => 'PhabricatorController',
|
2012-07-19 18:03:10 +02:00
|
|
|
'PhameBlogViewController' => 'PhameController',
|
2012-04-12 22:09:04 +02:00
|
|
|
'PhameController' => 'PhabricatorController',
|
|
|
|
'PhameDAO' => 'PhabricatorLiskDAO',
|
2012-10-15 23:50:12 +02:00
|
|
|
'PhamePost' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhameDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
2012-10-15 23:51:30 +02:00
|
|
|
2 => 'PhabricatorMarkupInterface',
|
2013-05-10 18:11:14 +02:00
|
|
|
3 => 'PhabricatorTokenReceiverInterface',
|
2012-10-15 23:50:12 +02:00
|
|
|
),
|
2012-04-12 22:09:04 +02:00
|
|
|
'PhamePostDeleteController' => 'PhameController',
|
|
|
|
'PhamePostEditController' => 'PhameController',
|
2012-10-15 23:50:45 +02:00
|
|
|
'PhamePostFramedController' => 'PhameController',
|
2012-10-15 23:50:37 +02:00
|
|
|
'PhamePostListController' => 'PhameController',
|
2012-10-15 23:50:45 +02:00
|
|
|
'PhamePostNewController' => 'PhameController',
|
2012-10-15 23:51:30 +02:00
|
|
|
'PhamePostNotLiveController' => 'PhameController',
|
2012-04-12 22:09:04 +02:00
|
|
|
'PhamePostPreviewController' => 'PhameController',
|
2012-10-15 23:50:45 +02:00
|
|
|
'PhamePostPublishController' => 'PhameController',
|
2012-10-15 23:50:12 +02:00
|
|
|
'PhamePostQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2012-10-15 23:50:45 +02:00
|
|
|
'PhamePostUnpublishController' => 'PhameController',
|
Move skins toward modularization
Summary:
Two high-level things happening here:
- We no longer ever need to put meta-UI (content creation, editing, notices, etc.) on live blog views, since this is all in Phame now. I pulled this out.
- On the other hand, I pushed more routing/control logic into Skins and made the root skin a Controller instead of a View. This simplifies some of the code above skins, and the theory behind this is that it gives us greater flexibility to, e.g., put a glue layer between Phame and Wordpress templates or whatever else, and allows skins to handle routing and thus add pages like "About" or "Bio".
- I added a basic skin below the root skin which is more like the old root skin and has standard rendering hooks.
- "Ten Eleven" is a play on the popular (default?) Wordpress themes called "Twenty Ten", "Twenty Eleven" and "Twenty Twelve".
Test Plan: Viewed live blog and live posts. They aren't pretty, but they don't have extraneous resources.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T1373
Differential Revision: https://secure.phabricator.com/D3714
2012-10-17 17:36:25 +02:00
|
|
|
'PhamePostView' => 'AphrontView',
|
2012-04-12 22:09:04 +02:00
|
|
|
'PhamePostViewController' => 'PhameController',
|
2012-10-17 17:37:05 +02:00
|
|
|
'PhameResourceController' => 'CelerityResourceController',
|
2013-03-21 02:01:52 +01:00
|
|
|
'PhluxController' => 'PhabricatorController',
|
|
|
|
'PhluxDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhluxEditController' => 'PhluxController',
|
|
|
|
'PhluxListController' => 'PhluxController',
|
2013-07-24 23:06:50 +02:00
|
|
|
'PhluxPHIDTypeVariable' => 'PhabricatorPHIDType',
|
2013-03-21 02:01:52 +01:00
|
|
|
'PhluxTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhluxTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PhluxVariable' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhluxDAO',
|
2013-10-25 21:52:00 +02:00
|
|
|
1 => 'PhabricatorFlaggableInterface',
|
|
|
|
2 => 'PhabricatorPolicyInterface',
|
2013-03-21 02:01:52 +01:00
|
|
|
),
|
|
|
|
'PhluxVariableEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'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',
|
|
|
|
'PholioImage' =>
|
|
|
|
array(
|
|
|
|
0 => 'PholioDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
2013-07-26 01:59:25 +02:00
|
|
|
2 => '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
|
|
|
),
|
2013-07-26 01:59:25 +02:00
|
|
|
'PholioImageHistoryController' => 'PholioController',
|
|
|
|
'PholioImageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-07-19 00:04:08 +02:00
|
|
|
'PholioImageUploadController' => 'PholioController',
|
2013-02-22 15:39:08 +01:00
|
|
|
'PholioInlineCommentEditView' => 'AphrontView',
|
|
|
|
'PholioInlineCommentSaveView' => 'AphrontView',
|
2013-02-19 23:12:33 +01:00
|
|
|
'PholioInlineCommentView' => 'AphrontView',
|
2013-02-08 16:24:17 +01:00
|
|
|
'PholioInlineController' => 'PholioController',
|
2013-02-19 23:12:33 +01:00
|
|
|
'PholioInlineDeleteController' => 'PholioController',
|
2013-02-22 15:39:08 +01:00
|
|
|
'PholioInlineEditController' => 'PholioController',
|
2013-02-06 20:28:03 +01:00
|
|
|
'PholioInlineSaveController' => 'PholioController',
|
2013-03-20 13:36:53 +01:00
|
|
|
'PholioInlineThumbController' => 'PholioController',
|
2013-02-19 23:12:33 +01:00
|
|
|
'PholioInlineViewController' => 'PholioController',
|
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' =>
|
|
|
|
array(
|
|
|
|
0 => 'PholioDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
|
|
|
2 => 'PhabricatorPolicyInterface',
|
|
|
|
3 => 'PhabricatorSubscribableInterface',
|
2013-02-15 16:47:14 +01:00
|
|
|
4 => 'PhabricatorTokenReceiverInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
5 => 'PhabricatorFlaggableInterface',
|
|
|
|
6 => 'PhabricatorApplicationTransactionInterface',
|
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
|
|
|
),
|
2012-11-22 02:27:20 +01:00
|
|
|
'PholioMockCommentController' => 'PholioController',
|
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',
|
2013-01-20 18:29:34 +01:00
|
|
|
'PholioMockImagesView' => 'AphrontView',
|
2013-07-22 21:21:15 +02:00
|
|
|
'PholioMockListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PholioController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-05-14 19:57:41 +02:00
|
|
|
'PholioMockMailReceiver' => 'PhabricatorObjectMailReceiver',
|
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',
|
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',
|
2013-07-26 01:59:25 +02:00
|
|
|
'PholioPHIDTypeImage' => 'PhabricatorPHIDType',
|
2013-07-21 21:40:51 +02:00
|
|
|
'PholioPHIDTypeMock' => 'PhabricatorPHIDType',
|
2013-02-26 23:59:31 +01:00
|
|
|
'PholioRemarkupRule' => 'PhabricatorRemarkupRuleObject',
|
2012-11-22 02:39:46 +01:00
|
|
|
'PholioReplyHandler' => 'PhabricatorMailReplyHandler',
|
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
|
|
|
'PholioSearchIndexer' => 'PhabricatorSearchDocumentIndexer',
|
2012-12-11 22:59:20 +01:00
|
|
|
'PholioTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PholioTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2012-12-11 23:00:21 +01:00
|
|
|
'PholioTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2012-11-22 02:27:44 +01:00
|
|
|
'PholioTransactionType' => 'PholioConstants',
|
2013-03-10 04:23:50 +01:00
|
|
|
'PholioTransactionView' => 'PhabricatorApplicationTransactionView',
|
2013-07-19 00:04:08 +02:00
|
|
|
'PholioUploadedImageView' => 'AphrontView',
|
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' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhortuneDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2013-04-12 17:10:22 +02:00
|
|
|
'PhortuneAccountBuyController' => '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',
|
|
|
|
'PhortuneAccountQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhortuneAccountTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhortuneAccountTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
|
|
|
'PhortuneAccountViewController' => 'PhortuneController',
|
2013-04-25 18:48:04 +02:00
|
|
|
'PhortuneBalancedPaymentProvider' => 'PhortunePaymentProvider',
|
2013-04-25 18:45:07 +02:00
|
|
|
'PhortuneCart' => 'PhortuneDAO',
|
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' => 'PhortuneDAO',
|
|
|
|
'PhortuneController' => 'PhabricatorController',
|
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',
|
2012-04-05 01:09:29 +02:00
|
|
|
'PhortuneMonthYearExpiryControl' => 'AphrontFormControl',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortuneMultiplePaymentProvidersException' => 'Exception',
|
|
|
|
'PhortuneNoPaymentProviderException' => 'Exception',
|
2013-04-25 18:46:59 +02:00
|
|
|
'PhortuneNotImplementedException' => 'Exception',
|
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' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhortuneDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2013-03-28 17:11:42 +01:00
|
|
|
'PhortunePaymentMethodEditController' => '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
|
|
|
'PhortunePaymentMethodListController' => 'PhabricatorController',
|
2013-03-28 17:11:42 +01:00
|
|
|
'PhortunePaymentMethodQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
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
|
|
|
'PhortunePaymentMethodViewController' => 'PhabricatorController',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortunePaymentProviderTestCase' => 'PhabricatorTestCase',
|
2013-05-06 20:44:24 +02:00
|
|
|
'PhortunePaypalPaymentProvider' => 'PhortunePaymentProvider',
|
2013-03-28 17:13:07 +01:00
|
|
|
'PhortuneProduct' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhortuneDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhortuneProductEditController' => 'PhabricatorController',
|
|
|
|
'PhortuneProductEditor' => 'PhabricatorApplicationTransactionEditor',
|
|
|
|
'PhortuneProductListController' => 'PhabricatorController',
|
|
|
|
'PhortuneProductQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
|
|
'PhortuneProductTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PhortuneProductTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-04-25 18:45:07 +02:00
|
|
|
'PhortuneProductViewController' => 'PhortuneController',
|
2013-05-06 20:44:24 +02:00
|
|
|
'PhortuneProviderController' => '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
|
|
|
'PhortunePurchase' => 'PhortuneDAO',
|
2013-04-25 18:45:43 +02:00
|
|
|
'PhortuneStripePaymentProvider' => 'PhortunePaymentProvider',
|
|
|
|
'PhortuneTestExtraPaymentProvider' => 'PhortunePaymentProvider',
|
|
|
|
'PhortuneTestPaymentProvider' => 'PhortunePaymentProvider',
|
2013-05-22 00:34:46 +02:00
|
|
|
'PhortuneWePayPaymentProvider' => 'PhortunePaymentProvider',
|
2013-03-30 17:32:29 +01:00
|
|
|
'PhrequentController' => 'PhabricatorController',
|
|
|
|
'PhrequentDAO' => 'PhabricatorLiskDAO',
|
2013-10-01 22:04:47 +02:00
|
|
|
'PhrequentListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhrequentController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
|
|
|
'PhrequentSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-10-18 21:47:36 +02:00
|
|
|
'PhrequentTimeBlock' => 'Phobject',
|
|
|
|
'PhrequentTimeBlockTestCase' => 'PhabricatorTestCase',
|
2013-03-31 13:52:35 +02:00
|
|
|
'PhrequentTrackController' => 'PhrequentController',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhrequentUIEventListener' => 'PhabricatorEventListener',
|
2013-10-01 22:04:47 +02:00
|
|
|
'PhrequentUserTime' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhrequentDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
|
|
|
'PhrequentUserTimeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2011-07-12 16:23:04 +02:00
|
|
|
'PhrictionActionConstants' => 'PhrictionConstants',
|
2013-10-22 02:00:21 +02:00
|
|
|
'PhrictionActionMenuEventListener' => 'PhabricatorEventListener',
|
2011-12-17 18:19:08 +01:00
|
|
|
'PhrictionChangeType' => 'PhrictionConstants',
|
2012-07-16 20:49:06 +02:00
|
|
|
'PhrictionContent' =>
|
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
|
|
|
array(
|
|
|
|
0 => 'PhrictionDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
|
|
|
),
|
2012-07-16 20:49:06 +02:00
|
|
|
'PhrictionController' => 'PhabricatorController',
|
|
|
|
'PhrictionDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'PhrictionDeleteController' => 'PhrictionController',
|
|
|
|
'PhrictionDiffController' => 'PhrictionController',
|
2013-01-12 00:28:16 +01:00
|
|
|
'PhrictionDocument' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhrictionDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
Added subscriptions to Phriction documents
Summary:
Fixes T2694
added edge infrastructure for Phriction
added mail subject prefix option for Phriction
added messy mail support for subscribers
adds edges to the phriction db, along with the subscriber interface
which gives us subscriptions for free.
simple display of subscribers, adequate to the current design and
sufficient fallbacks for exceptional cases. @chad may
be mailed about that one more UI element may be added to his redesign
mail support is messy. not generic at all. only sends to subscribed non-authors.
Test Plan:
tried out all kinds of stuff. applied patch, subscribed, unsubscribed with multiple
accs. verified proper
edited documents, verified that mail was sent in MetaMTA. Verified
contents, tos and stuff by looking into the db, comparing PHIDs etc.
functional testing per serious MTA (that is, AWS SES) worked wonderfully.
Here's how the subscription list looks like:
{F36320, layout=link}
Reviewers: epriestley, chad, btrahan
Reviewed By: epriestley
CC: hfcorriez, aran, Korvin
Maniphest Tasks: T2686, T2694
Differential Revision: https://secure.phabricator.com/D5372
Conflicts:
src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php
2013-03-21 18:26:32 +01:00
|
|
|
2 => 'PhabricatorSubscribableInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
3 => 'PhabricatorFlaggableInterface',
|
|
|
|
4 => 'PhabricatorTokenReceiverInterface',
|
2013-01-12 00:28:16 +01:00
|
|
|
),
|
2011-07-11 17:54:22 +02:00
|
|
|
'PhrictionDocumentController' => 'PhrictionController',
|
2012-10-10 19:18:23 +02:00
|
|
|
'PhrictionDocumentEditor' => 'PhabricatorEditor',
|
2011-07-17 03:25:45 +02:00
|
|
|
'PhrictionDocumentPreviewController' => 'PhrictionController',
|
2013-03-08 16:12:24 +01:00
|
|
|
'PhrictionDocumentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2011-12-17 18:19:08 +01:00
|
|
|
'PhrictionDocumentStatus' => 'PhrictionConstants',
|
2011-07-12 17:08:03 +02:00
|
|
|
'PhrictionDocumentTestCase' => 'PhabricatorTestCase',
|
2011-07-11 21:34:53 +02:00
|
|
|
'PhrictionEditController' => 'PhrictionController',
|
2011-07-12 00:06:19 +02:00
|
|
|
'PhrictionHistoryController' => 'PhrictionController',
|
2013-07-28 03:26:42 +02:00
|
|
|
'PhrictionListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhrictionController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-03-06 22:12:04 +01:00
|
|
|
'PhrictionMoveController' => 'PhrictionController',
|
2012-11-10 00:08:37 +01:00
|
|
|
'PhrictionNewController' => 'PhrictionController',
|
2013-07-24 20:32:13 +02:00
|
|
|
'PhrictionPHIDTypeDocument' => 'PhabricatorPHIDType',
|
2013-02-26 23:57:41 +01:00
|
|
|
'PhrictionRemarkupRule' => 'PhutilRemarkupRule',
|
2013-07-28 03:26:42 +02:00
|
|
|
'PhrictionSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
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
|
|
|
'PhrictionSearchIndexer' => 'PhabricatorSearchDocumentIndexer',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderAddAnswerView' => 'AphrontView',
|
|
|
|
'PonderAnswer' =>
|
|
|
|
array(
|
|
|
|
0 => 'PonderDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
|
|
|
2 => 'PonderVotableInterface',
|
2013-07-26 22:19:49 +02:00
|
|
|
3 => 'PhabricatorPolicyInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
4 => 'PhabricatorFlaggableInterface',
|
|
|
|
5 => 'PhabricatorSubscribableInterface',
|
|
|
|
6 => 'PhabricatorTokenReceiverInterface',
|
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',
|
2013-07-26 22:19:49 +02:00
|
|
|
'PonderAnswerQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderAnswerSaveController' => 'PonderController',
|
2013-07-26 22:52:57 +02:00
|
|
|
'PonderAnswerTransaction' => 'PhabricatorApplicationTransaction',
|
|
|
|
'PonderAnswerTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
2013-07-29 01:17:51 +02:00
|
|
|
'PonderAnswerTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
adding comments to ponder
Summary: This is pretty spartan, but it does the job.
Test Plan:
Patch, update storage, add some comment
to your favorite question or answer.
Reviewers: nh, vrana, epriestley
Reviewed By: epriestley
CC: aran, Korvin, starruler, syrneus, me.here, victorzarate7
Maniphest Tasks: T1645
Differential Revision: https://secure.phabricator.com/D3471
2012-09-11 21:13:20 +02:00
|
|
|
'PonderComment' =>
|
|
|
|
array(
|
|
|
|
0 => 'PonderDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
|
|
|
),
|
|
|
|
'PonderCommentQuery' => 'PhabricatorQuery',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderController' => 'PhabricatorController',
|
|
|
|
'PonderDAO' => 'PhabricatorLiskDAO',
|
2013-09-19 00:15:25 +02:00
|
|
|
'PonderEditor' => 'PhabricatorApplicationTransactionEditor',
|
2013-07-26 22:19:49 +02:00
|
|
|
'PonderPHIDTypeAnswer' => 'PhabricatorPHIDType',
|
2013-07-24 20:32:31 +02:00
|
|
|
'PonderPHIDTypeQuestion' => 'PhabricatorPHIDType',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderQuestion' =>
|
|
|
|
array(
|
|
|
|
0 => 'PonderDAO',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
|
|
|
2 => 'PonderVotableInterface',
|
2012-10-08 23:47:21 +02:00
|
|
|
3 => 'PhabricatorSubscribableInterface',
|
2013-10-25 21:52:00 +02:00
|
|
|
4 => 'PhabricatorFlaggableInterface',
|
|
|
|
5 => 'PhabricatorPolicyInterface',
|
|
|
|
6 => 'PhabricatorTokenReceiverInterface',
|
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',
|
2013-07-29 03:32:55 +02:00
|
|
|
'PonderQuestionHistoryController' => 'PonderController',
|
2013-07-18 21:40:51 +02:00
|
|
|
'PonderQuestionListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'PonderController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-05-14 19:57:41 +02:00
|
|
|
'PonderQuestionMailReceiver' => 'PhabricatorObjectMailReceiver',
|
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',
|
2013-07-29 17:38:25 +02:00
|
|
|
'PonderQuestionReplyHandler' => 'PhabricatorMailReplyHandler',
|
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',
|
2013-02-27 16:18:30 +01:00
|
|
|
'PonderRemarkupRule' => 'PhabricatorRemarkupRuleObject',
|
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
|
|
|
'PonderSearchIndexer' => 'PhabricatorSearchDocumentIndexer',
|
2013-09-19 00:15:25 +02:00
|
|
|
'PonderTransactionFeedStory' => 'PhabricatorApplicationTransactionFeedStory',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderVotableView' => 'AphrontView',
|
2013-07-28 03:37:17 +02:00
|
|
|
'PonderVote' => 'PonderConstants',
|
2012-10-10 19:18:23 +02:00
|
|
|
'PonderVoteEditor' => 'PhabricatorEditor',
|
2012-08-10 19:44:04 +02:00
|
|
|
'PonderVoteSaveController' => 'PonderController',
|
2013-10-10 13:29:07 +02:00
|
|
|
'ProjectCapabilityCreateProjects' => 'PhabricatorPolicyCapability',
|
2013-05-18 11:46:39 +02:00
|
|
|
'ProjectRemarkupRule' => 'PhabricatorRemarkupRuleObject',
|
2012-07-26 21:01:47 +02:00
|
|
|
'QueryFormattingTestCase' => 'PhabricatorTestCase',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephAuthorFieldSpecification' => 'ReleephFieldSpecification',
|
2013-07-21 18:27:00 +02:00
|
|
|
'ReleephBranch' =>
|
|
|
|
array(
|
|
|
|
0 => 'ReleephDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2013-07-21 17:42:10 +02:00
|
|
|
'ReleephBranchAccessController' => 'ReleephProjectController',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephBranchCommitFieldSpecification' => 'ReleephFieldSpecification',
|
2013-07-21 17:42:10 +02:00
|
|
|
'ReleephBranchCreateController' => 'ReleephProjectController',
|
|
|
|
'ReleephBranchEditController' => 'ReleephProjectController',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephBranchEditor' => 'PhabricatorEditor',
|
2013-08-20 19:11:52 +02:00
|
|
|
'ReleephBranchHistoryController' => 'ReleephProjectController',
|
2013-07-21 17:44:53 +02:00
|
|
|
'ReleephBranchNamePreviewController' => 'ReleephController',
|
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',
|
2013-08-20 18:31:27 +02:00
|
|
|
'ReleephBranchTransaction' => 'PhabricatorApplicationTransaction',
|
2013-08-20 19:11:52 +02:00
|
|
|
'ReleephBranchTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-08-15 00:38:52 +02:00
|
|
|
'ReleephBranchViewController' =>
|
|
|
|
array(
|
|
|
|
0 => 'ReleephProjectController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephCommitFinderException' => 'Exception',
|
|
|
|
'ReleephCommitMessageFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephController' => 'PhabricatorController',
|
|
|
|
'ReleephDAO' => 'PhabricatorLiskDAO',
|
|
|
|
'ReleephDefaultFieldSelector' => 'ReleephFieldSelector',
|
|
|
|
'ReleephDefaultUserView' => 'ReleephUserView',
|
|
|
|
'ReleephDiffChurnFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephDiffMessageFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephDiffSizeFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephFieldParseException' => 'Exception',
|
2013-08-14 17:58:54 +02:00
|
|
|
'ReleephFieldSpecification' =>
|
|
|
|
array(
|
|
|
|
0 => 'PhabricatorCustomField',
|
|
|
|
1 => 'PhabricatorMarkupInterface',
|
|
|
|
),
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephIntentFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephLevelFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephOriginalCommitFieldSpecification' => 'ReleephFieldSpecification',
|
2013-07-21 18:27:00 +02:00
|
|
|
'ReleephPHIDTypeBranch' => 'PhabricatorPHIDType',
|
2013-07-21 17:41:38 +02:00
|
|
|
'ReleephPHIDTypeProject' => 'PhabricatorPHIDType',
|
|
|
|
'ReleephPHIDTypeRequest' => 'PhabricatorPHIDType',
|
2013-03-22 14:29:37 +01:00
|
|
|
'ReleephProject' =>
|
|
|
|
array(
|
|
|
|
0 => 'ReleephDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
|
|
|
),
|
2013-07-21 17:42:10 +02:00
|
|
|
'ReleephProjectActionController' => 'ReleephProjectController',
|
|
|
|
'ReleephProjectController' => 'ReleephController',
|
|
|
|
'ReleephProjectCreateController' => 'ReleephProjectController',
|
|
|
|
'ReleephProjectEditController' => 'ReleephProjectController',
|
2013-08-20 19:00:25 +02:00
|
|
|
'ReleephProjectHistoryController' => 'ReleephProjectController',
|
2013-07-21 17:44:53 +02:00
|
|
|
'ReleephProjectListController' =>
|
|
|
|
array(
|
|
|
|
0 => 'ReleephController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-03-22 14:29:37 +01:00
|
|
|
'ReleephProjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-07-21 17:44:53 +02:00
|
|
|
'ReleephProjectSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-08-20 18:31:27 +02:00
|
|
|
'ReleephProjectTransaction' => 'PhabricatorApplicationTransaction',
|
2013-08-20 19:00:25 +02:00
|
|
|
'ReleephProjectTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
2013-08-17 03:55:35 +02:00
|
|
|
'ReleephProjectViewController' =>
|
|
|
|
array(
|
|
|
|
0 => 'ReleephProjectController',
|
|
|
|
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
|
|
|
|
),
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephReasonFieldSpecification' => 'ReleephFieldSpecification',
|
2013-04-26 18:07:38 +02:00
|
|
|
'ReleephRequest' =>
|
|
|
|
array(
|
|
|
|
0 => 'ReleephDAO',
|
|
|
|
1 => 'PhabricatorPolicyInterface',
|
2013-08-14 19:04:18 +02:00
|
|
|
2 => 'PhabricatorCustomFieldInterface',
|
2013-04-26 18:07:38 +02:00
|
|
|
),
|
2013-07-21 17:42:10 +02:00
|
|
|
'ReleephRequestActionController' => 'ReleephProjectController',
|
|
|
|
'ReleephRequestCommentController' => 'ReleephProjectController',
|
|
|
|
'ReleephRequestDifferentialCreateController' => 'ReleephProjectController',
|
|
|
|
'ReleephRequestEditController' => 'ReleephProjectController',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephRequestHeaderListView' => 'AphrontView',
|
|
|
|
'ReleephRequestHeaderView' => 'AphrontView',
|
|
|
|
'ReleephRequestIntentsView' => 'AphrontView',
|
2013-05-14 19:57:41 +02:00
|
|
|
'ReleephRequestMailReceiver' => 'PhabricatorObjectMailReceiver',
|
2013-05-15 00:04:17 +02:00
|
|
|
'ReleephRequestQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
2013-04-08 17:34:21 +02:00
|
|
|
'ReleephRequestReplyHandler' => 'PhabricatorMailReplyHandler',
|
2013-08-15 00:38:52 +02:00
|
|
|
'ReleephRequestSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephRequestStatusView' => 'AphrontView',
|
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',
|
2013-07-21 17:42:10 +02:00
|
|
|
'ReleephRequestViewController' => 'ReleephProjectController',
|
2013-03-15 12:28:43 +01:00
|
|
|
'ReleephRequestorFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephRevisionFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephSeverityFieldSpecification' => 'ReleephLevelFieldSpecification',
|
|
|
|
'ReleephStatusFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephSummaryFieldSpecification' => 'ReleephFieldSpecification',
|
|
|
|
'ReleephUserView' => 'AphrontView',
|
2013-11-09 03:19:48 +01:00
|
|
|
'RemoteCommandBuildStepImplementation' => 'VariableBuildStepImplementation',
|
2013-11-09 03:09:03 +01:00
|
|
|
'ShellLogView' => 'AphrontView',
|
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
|
|
|
'SleepBuildStepImplementation' => 'BuildStepImplementation',
|
2013-04-16 17:18:52 +02:00
|
|
|
'SlowvoteEmbedView' => 'AphrontView',
|
|
|
|
'SlowvoteRemarkupRule' => 'PhabricatorRemarkupRuleObject',
|
2013-11-09 03:09:03 +01:00
|
|
|
'VariableBuildStepImplementation' => 'BuildStepImplementation',
|
2011-01-16 22:51:39 +01:00
|
|
|
),
|
|
|
|
));
|