diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index 5c3fcfee6..3a34b328f 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -1,742 +1,752 @@ array( 'uri' => '/res/c666a518/rsrc/css/aphront/crumbs-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/crumbs-view.css', ), 'aphront-dark-console-css' => array( - 'uri' => '/res/056b0c12/rsrc/css/aphront/dark-console.css', + 'uri' => '/res/0417eb95/rsrc/css/aphront/dark-console.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/dark-console.css', ), 'aphront-dialog-view-css' => array( 'uri' => '/res/7101ab69/rsrc/css/aphront/dialog-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/dialog-view.css', ), 'aphront-error-view-css' => array( 'uri' => '/res/19b27527/rsrc/css/aphront/error-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/error-view.css', ), 'aphront-form-view-css' => array( 'uri' => '/res/82eca506/rsrc/css/aphront/form-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/form-view.css', ), 'aphront-headsup-action-list-view-css' => array( 'uri' => '/res/8fd91c1d/rsrc/css/aphront/headsup-action-list-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/headsup-action-list-view.css', ), - 'aphront-list-filter-view-css' => - array( - 'uri' => '/res/50a790ae/rsrc/css/aphront/list-filter-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/list-filter-view.css', - ), - 'aphront-pager-view-css' => - array( - 'uri' => '/res/73ec8cd5/rsrc/css/aphront/pager-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/pager-view.css', - ), 'aphront-panel-view-css' => array( 'uri' => '/res/8f9f3632/rsrc/css/aphront/panel-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/panel-view.css', ), 'aphront-request-failure-view-css' => array( 'uri' => '/res/97b8337a/rsrc/css/aphront/request-failure-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/request-failure-view.css', ), 'aphront-side-nav-view-css' => array( 'uri' => '/res/4f4c5ca8/rsrc/css/aphront/side-nav-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/side-nav-view.css', ), 'aphront-table-view-css' => array( 'uri' => '/res/03724b05/rsrc/css/aphront/table-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/table-view.css', ), 'aphront-tokenizer-control-css' => array( 'uri' => '/res/190349be/rsrc/css/aphront/tokenizer.css', 'type' => 'css', 'requires' => array( 0 => 'aphront-typeahead-control-css', ), 'disk' => '/rsrc/css/aphront/tokenizer.css', ), 'aphront-typeahead-control-css' => array( 'uri' => '/res/928df9f0/rsrc/css/aphront/typeahead.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/typeahead.css', ), + 'aphront-pager-view-css' => + array( + 'uri' => '/res/73ec8cd5/rsrc/css/aphront/pager-view.css', + 'type' => 'css', + 'requires' => + array( + ), + 'disk' => '/rsrc/css/aphront/pager-view.css', + ), + 'aphront-list-filter-view-css' => + array( + 'uri' => '/res/50a790ae/rsrc/css/aphront/list-filter-view.css', + 'type' => 'css', + 'requires' => + array( + ), + 'disk' => '/rsrc/css/aphront/list-filter-view.css', + ), 'phabricator-standard-page-view' => array( 'uri' => '/res/0d41ea7c/rsrc/css/application/base/standard-page-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/base/standard-page-view.css', ), 'differential-revision-add-comment-css' => array( 'uri' => '/res/aaae14d3/rsrc/css/application/differential/add-comment.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/add-comment.css', ), 'differential-changeset-view-css' => array( 'uri' => '/res/f26ca6f9/rsrc/css/application/differential/changeset-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/changeset-view.css', ), 'differential-core-view-css' => array( 'uri' => '/res/525d1a12/rsrc/css/application/differential/core.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/core.css', ), 'differential-revision-comment-list-css' => array( 'uri' => '/res/10b9a829/rsrc/css/application/differential/revision-comment-list.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-comment-list.css', ), 'differential-revision-comment-css' => array( 'uri' => '/res/b271baaf/rsrc/css/application/differential/revision-comment.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-comment.css', ), 'differential-revision-detail-css' => array( 'uri' => '/res/623e3946/rsrc/css/application/differential/revision-detail.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-detail.css', ), 'differential-revision-history-css' => array( 'uri' => '/res/755f3da3/rsrc/css/application/differential/revision-history.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-history.css', ), 'differential-table-of-contents-css' => array( 'uri' => '/res/e68f6f05/rsrc/css/application/differential/table-of-contents.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/table-of-contents.css', ), 'diffusion-commit-view-css' => array( 'uri' => '/res/8c139192/rsrc/css/application/diffusion/commit-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/diffusion/commit-view.css', ), 'diffusion-source-css' => array( 'uri' => '/res/7f50817b/rsrc/css/application/diffusion/diffusion-source.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/diffusion/diffusion-source.css', ), 'phabricator-directory-css' => array( 'uri' => '/res/6a000601/rsrc/css/application/directory/phabricator-directory.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/directory/phabricator-directory.css', ), 'herald-test-css' => array( 'uri' => '/res/28269358/rsrc/css/application/herald/herald-test.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/herald/herald-test.css', ), 'herald-css' => array( 'uri' => '/res/211a4b1b/rsrc/css/application/herald/herald.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/herald/herald.css', ), 'mainphest-task-detail-css' => array( 'uri' => '/res/e5f3beca/rsrc/css/application/maniphest/task-detail.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/task-detail.css', ), 'maniphest-task-summary-css' => array( 'uri' => '/res/8dc6fb13/rsrc/css/application/maniphest/task-summary.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/task-summary.css', ), 'maniphest-transaction-detail-css' => array( 'uri' => '/res/16725026/rsrc/css/application/maniphest/transaction-detail.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/transaction-detail.css', ), 'phabricator-object-selector-css' => array( 'uri' => '/res/52a7e289/rsrc/css/application/objectselector/object-selector.css', 'type' => 'css', 'requires' => array( 0 => 'aphront-dialog-view-css', ), 'disk' => '/rsrc/css/application/objectselector/object-selector.css', ), - 'owners-path-editor-css' => + 'phabricator-profile-css' => array( - 'uri' => '/res/f40dc6b1/rsrc/css/application/owners/owners-path-editor.css', + 'uri' => '/res/259ad37f/rsrc/css/application/people/profile.css', 'type' => 'css', 'requires' => array( ), - 'disk' => '/rsrc/css/application/owners/owners-path-editor.css', + 'disk' => '/rsrc/css/application/people/profile.css', ), - 'phabricator-profile-css' => + 'owners-path-editor-css' => array( - 'uri' => '/res/259ad37f/rsrc/css/application/people/profile.css', + 'uri' => '/res/f40dc6b1/rsrc/css/application/owners/owners-path-editor.css', 'type' => 'css', 'requires' => array( ), - 'disk' => '/rsrc/css/application/people/profile.css', + 'disk' => '/rsrc/css/application/owners/owners-path-editor.css', ), 'phabricator-ui-example-css' => array( 'uri' => '/res/365a10f1/rsrc/css/application/uiexample/example.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/uiexample/example.css', ), 'phabricator-core-buttons-css' => array( 'uri' => '/res/53b4f712/rsrc/css/core/buttons.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/buttons.css', ), 'phabricator-core-css' => array( 'uri' => '/res/6eebb99b/rsrc/css/core/core.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/core.css', ), 'phabricator-remarkup-css' => array( 'uri' => '/res/bf863100/rsrc/css/core/remarkup.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/remarkup.css', ), 'syntax-highlighting-css' => array( 'uri' => '/res/fb673ece/rsrc/css/core/syntax.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/syntax.css', ), + 'multirow-row-manager' => + array( + 'uri' => '/res/330d076b/rsrc/js/application/core/MultirowRowManager.js', + 'type' => 'js', + 'requires' => + array( + 0 => 'javelin-lib-dev', + ), + 'disk' => '/rsrc/js/application/core/MultirowRowManager.js', + ), 'javelin-behavior-dark-console' => array( 'uri' => '/res/020b0265/rsrc/js/application/core/behavior-dark-console.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/application/core/behavior-dark-console.js', ), 'javelin-behavior-phabricator-object-selector' => array( - 'uri' => '/res/4fe735af/rsrc/js/application/core/behavior-object-selector.js', + 'uri' => '/res/c0f12b29/rsrc/js/application/core/behavior-object-selector.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/core/behavior-object-selector.js', ), 'javelin-behavior-aphront-basic-tokenizer' => array( 'uri' => '/res/8317d761/rsrc/js/application/core/behavior-tokenizer.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/core/behavior-tokenizer.js', ), 'javelin-behavior-workflow' => array( 'uri' => '/res/15446e7e/rsrc/js/application/core/behavior-workflow.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/core/behavior-workflow.js', ), - 'multirow-row-manager' => + 'javelin-behavior-error-log' => array( - 'uri' => '/res/330d076b/rsrc/js/application/core/MultirowRowManager.js', + 'uri' => '/res/c57a323f/rsrc/js/application/core/behavior-error-log.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), - 'disk' => '/rsrc/js/application/core/MultirowRowManager.js', + 'disk' => '/rsrc/js/application/core/behavior-error-log.js', ), 'javelin-behavior-differential-add-reviewers' => array( 'uri' => '/res/330154e4/rsrc/js/application/differential/behavior-add-reviewers.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-add-reviewers.js', ), 'javelin-behavior-differential-feedback-preview' => array( 'uri' => '/res/8695d8b8/rsrc/js/application/differential/behavior-comment-preview.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-comment-preview.js', ), 'javelin-behavior-differential-diff-radios' => array( 'uri' => '/res/fdeb3823/rsrc/js/application/differential/behavior-diff-radios.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-diff-radios.js', ), 'javelin-behavior-differential-edit-inline-comments' => array( 'uri' => '/res/74747b2e/rsrc/js/application/differential/behavior-edit-inline-comments.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-edit-inline-comments.js', ), 'javelin-behavior-differential-populate' => array( 'uri' => '/res/a13dcd7e/rsrc/js/application/differential/behavior-populate.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-populate.js', ), 'javelin-behavior-differential-show-all-comments' => array( 'uri' => '/res/2a3592b8/rsrc/js/application/differential/behavior-show-all-comments.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-show-all-comments.js', ), 'javelin-behavior-differential-show-more' => array( 'uri' => '/res/ea998002/rsrc/js/application/differential/behavior-show-more.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/differential/behavior-show-more.js', ), 'javelin-behavior-diffusion-jump-to' => array( 'uri' => '/res/4f3f6cdc/rsrc/js/application/diffusion/behavior-jump-to.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/diffusion/behavior-jump-to.js', ), 'javelin-behavior-diffusion-pull-lastmodified' => array( 'uri' => '/res/6a5e7374/rsrc/js/application/diffusion/behavior-pull-lastmodified.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/diffusion/behavior-pull-lastmodified.js', ), - 'javelin-behavior-herald-rule-editor' => + 'herald-rule-editor' => array( - 'uri' => '/res/48108130/rsrc/js/application/herald/herald-rule-editor.js', + 'uri' => '/res/ec8e2110/rsrc/js/application/herald/HeraldRuleEditor.js', 'type' => 'js', 'requires' => array( - 0 => 'herald-rule-editor', + 0 => 'multirow-row-manager', 1 => 'javelin-lib-dev', + 2 => 'javelin-typeahead-dev', + 3 => 'path-typeahead', ), - 'disk' => '/rsrc/js/application/herald/herald-rule-editor.js', + 'disk' => '/rsrc/js/application/herald/HeraldRuleEditor.js', ), - 'herald-rule-editor' => + 'javelin-behavior-herald-rule-editor' => array( - 'uri' => '/res/ec8e2110/rsrc/js/application/herald/HeraldRuleEditor.js', + 'uri' => '/res/48108130/rsrc/js/application/herald/herald-rule-editor.js', 'type' => 'js', 'requires' => array( - 0 => 'multirow-row-manager', + 0 => 'herald-rule-editor', 1 => 'javelin-lib-dev', - 2 => 'javelin-typeahead-dev', - 3 => 'path-typeahead', ), - 'disk' => '/rsrc/js/application/herald/HeraldRuleEditor.js', + 'disk' => '/rsrc/js/application/herald/herald-rule-editor.js', ), 'path-typeahead' => array( 'uri' => '/res/42fb76c3/rsrc/js/application/herald/PathTypeahead.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', 1 => 'javelin-typeahead-dev', ), 'disk' => '/rsrc/js/application/herald/PathTypeahead.js', ), 'javelin-behavior-maniphest-transaction-controls' => array( 'uri' => '/res/fc6a8722/rsrc/js/application/maniphest/behavior-transaction-controls.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-lib-dev', ), 'disk' => '/rsrc/js/application/maniphest/behavior-transaction-controls.js', ), - 'javelin-behavior-owners-path-editor' => + 'owners-path-editor' => array( - 'uri' => '/res/7568aa22/rsrc/js/application/owners/owners-path-editor.js', + 'uri' => '/res/b01c1ca9/rsrc/js/application/owners/OwnersPathEditor.js', 'type' => 'js', 'requires' => array( - 0 => 'owners-path-editor', + 0 => 'multirow-row-manager', 1 => 'javelin-lib-dev', + 2 => 'javelin-typeahead-dev', + 3 => 'path-typeahead', ), - 'disk' => '/rsrc/js/application/owners/owners-path-editor.js', + 'disk' => '/rsrc/js/application/owners/OwnersPathEditor.js', ), - 'owners-path-editor' => + 'javelin-behavior-owners-path-editor' => array( - 'uri' => '/res/b01c1ca9/rsrc/js/application/owners/OwnersPathEditor.js', + 'uri' => '/res/7568aa22/rsrc/js/application/owners/owners-path-editor.js', 'type' => 'js', 'requires' => array( - 0 => 'multirow-row-manager', + 0 => 'owners-path-editor', 1 => 'javelin-lib-dev', - 2 => 'javelin-typeahead-dev', - 3 => 'path-typeahead', ), - 'disk' => '/rsrc/js/application/owners/OwnersPathEditor.js', + 'disk' => '/rsrc/js/application/owners/owners-path-editor.js', ), 'javelin-magical-init' => array( 'uri' => '/res/76614f84/rsrc/js/javelin/init.dev.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/init.dev.js', ), 'javelin-init-prod' => array( 'uri' => '/res/1267c868/rsrc/js/javelin/init.min.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/init.min.js', ), 'javelin-lib-dev' => array( 'uri' => '/res/a0e7a5e9/rsrc/js/javelin/javelin.dev.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/javelin.dev.js', ), 'javelin-lib-prod' => array( 'uri' => '/res/2f2b3b2e/rsrc/js/javelin/javelin.min.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/javelin.min.js', ), 'javelin-typeahead-dev' => array( 'uri' => '/res/6de6ae59/rsrc/js/javelin/typeahead.dev.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/typeahead.dev.js', ), 'javelin-typeahead-prod' => array( 'uri' => '/res/69d5fad1/rsrc/js/javelin/typeahead.min.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/typeahead.min.js', ), 'javelin-workflow-dev' => array( 'uri' => '/res/c6b17f93/rsrc/js/javelin/workflow.dev.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/workflow.dev.js', ), 'javelin-workflow-prod' => array( 'uri' => '/res/b758e0a0/rsrc/js/javelin/workflow.min.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/js/javelin/workflow.min.js', ), ), array ( 'packages' => array ( '2de9aa4e' => array ( 'name' => 'core.pkg.css', 'symbols' => array ( 0 => 'phabricator-core-css', 1 => 'phabricator-core-buttons-css', 2 => 'phabricator-standard-page-view', 3 => 'aphront-dialog-view-css', 4 => 'aphront-form-view-css', 5 => 'aphront-panel-view-css', 6 => 'aphront-side-nav-view-css', 7 => 'aphront-table-view-css', 8 => 'aphront-crumbs-view-css', 9 => 'aphront-tokenizer-control-css', 10 => 'aphront-typeahead-control-css', 11 => 'phabricator-directory-css', 12 => 'phabricator-remarkup-css', 13 => 'syntax-highlighting-css', ), 'uri' => '/res/pkg/2de9aa4e/core.pkg.css', 'type' => 'css', ), '76f3c1f8' => array ( 'name' => 'differential.pkg.css', 'symbols' => array ( 0 => 'differential-core-view-css', 1 => 'differential-changeset-view-css', 2 => 'differential-revision-detail-css', 3 => 'differential-revision-history-css', 4 => 'differential-table-of-contents-css', 5 => 'differential-revision-comment-css', 6 => 'differential-revision-add-comment-css', 7 => 'differential-revision-comment-list-css', ), 'uri' => '/res/pkg/76f3c1f8/differential.pkg.css', 'type' => 'css', ), '30d594cf' => array ( 'name' => 'differential.pkg.js', 'symbols' => array ( 0 => 'javelin-behavior-differential-feedback-preview', 1 => 'javelin-behavior-differential-edit-inline-comments', 2 => 'javelin-behavior-differential-populate', 3 => 'javelin-behavior-differential-show-more', 4 => 'javelin-behavior-differential-diff-radios', ), 'uri' => '/res/pkg/30d594cf/differential.pkg.js', 'type' => 'js', ), 'eadf6ec3' => array ( 'name' => 'diffusion.pkg.css', 'symbols' => array ( 0 => 'diffusion-commit-view-css', ), 'uri' => '/res/pkg/eadf6ec3/diffusion.pkg.css', 'type' => 'css', ), ), 'reverse' => array ( 'phabricator-core-css' => '2de9aa4e', 'phabricator-core-buttons-css' => '2de9aa4e', 'phabricator-standard-page-view' => '2de9aa4e', 'aphront-dialog-view-css' => '2de9aa4e', 'aphront-form-view-css' => '2de9aa4e', 'aphront-panel-view-css' => '2de9aa4e', 'aphront-side-nav-view-css' => '2de9aa4e', 'aphront-table-view-css' => '2de9aa4e', 'aphront-crumbs-view-css' => '2de9aa4e', 'aphront-tokenizer-control-css' => '2de9aa4e', 'aphront-typeahead-control-css' => '2de9aa4e', 'phabricator-directory-css' => '2de9aa4e', 'phabricator-remarkup-css' => '2de9aa4e', 'syntax-highlighting-css' => '2de9aa4e', 'differential-core-view-css' => '76f3c1f8', 'differential-changeset-view-css' => '76f3c1f8', 'differential-revision-detail-css' => '76f3c1f8', 'differential-revision-history-css' => '76f3c1f8', 'differential-table-of-contents-css' => '76f3c1f8', 'differential-revision-comment-css' => '76f3c1f8', 'differential-revision-add-comment-css' => '76f3c1f8', 'differential-revision-comment-list-css' => '76f3c1f8', 'javelin-behavior-differential-feedback-preview' => '30d594cf', 'javelin-behavior-differential-edit-inline-comments' => '30d594cf', 'javelin-behavior-differential-populate' => '30d594cf', 'javelin-behavior-differential-show-more' => '30d594cf', 'javelin-behavior-differential-diff-radios' => '30d594cf', 'diffusion-commit-view-css' => 'eadf6ec3', ), )); diff --git a/src/aphront/console/core/DarkConsoleCore.php b/src/aphront/console/core/DarkConsoleCore.php index afb9d0935..2b9582f28 100644 --- a/src/aphront/console/core/DarkConsoleCore.php +++ b/src/aphront/console/core/DarkConsoleCore.php @@ -1,158 +1,158 @@ plugins, $plugin_name); } public function __construct() { foreach (self::getPlugins() as $plugin_name) { $plugin = self::newPlugin($plugin_name); if ($plugin->isPermanent() || !isset($disabled[$plugin_name])) { if ($plugin->shouldStartup()) { $plugin->didStartup(); $plugin->setConsoleCore($this); $this->plugins[$plugin_name] = $plugin; } } } } public static function newPlugin($plugin) { $class = 'DarkConsole'.$plugin.'Plugin'; PhutilSymbolLoader::loadClass($class); return newv($class, array()); } public function getEnabledPlugins() { return $this->plugins; } public function render(AphrontRequest $request) { $user = $request->getUser(); $plugins = $this->getEnabledPlugins(); foreach ($plugins as $plugin) { $plugin->setRequest($request); $plugin->willShutdown(); } foreach ($plugins as $plugin) { $plugin->didShutdown(); } foreach ($plugins as $plugin) { $plugin->setData($plugin->generateData()); } $selected = $user->getConsoleTab(); $visible = $user->getConsoleVisible(); if (!isset($plugins[$selected])) { reset($plugins); $selected = key($plugins); } $tabs = array(); foreach ($plugins as $key => $plugin) { $tabs[$key] = array( 'name' => $plugin->getName(), 'panel' => $plugin->render(), ); } $tabs_markup = array(); $panel_markup = array(); foreach ($tabs as $key => $data) { $is_selected = ($key == $selected); if ($is_selected) { $style = null; $tabclass = 'dark-console-tab-selected'; } else { $style = 'display: none;'; $tabclass = null; } $tabs_markup[] = javelin_render_tag( 'a', array( 'class' => "dark-console-tab {$tabclass}", 'sigil' => 'dark-console-tab', 'id' => 'dark-console-tab-'.$key, ), (string)$data['name']); $panel_markup[] = javelin_render_tag( 'div', array( - 'class' => 'dark-console-panel', + 'class' => 'dark-console-panel dark-console-panel-'.$key, 'style' => $style, 'sigil' => 'dark-console-panel', ), (string)$data['panel']); } $console = javelin_render_tag( 'table', array( 'class' => 'dark-console', 'sigil' => 'dark-console', 'style' => $visible ? '' : 'display: none;', ), ''. ''. implode("\n", $tabs_markup). ''. ''.implode("\n", $panel_markup).''. ''); if (!empty($_COOKIE['phsid'])) { $console = str_replace( $_COOKIE['phsid'], phutil_escape_html(''), $console); } return "\n\n\n\n".$console."\n\n\n\n"; } } diff --git a/src/aphront/console/plugin/errorlog/DarkConsoleErrorLogPlugin.php b/src/aphront/console/plugin/errorlog/DarkConsoleErrorLogPlugin.php index 0f140f582..a3352c502 100644 --- a/src/aphront/console/plugin/errorlog/DarkConsoleErrorLogPlugin.php +++ b/src/aphront/console/plugin/errorlog/DarkConsoleErrorLogPlugin.php @@ -1,138 +1,161 @@ getData()); if ($count) { return ' '. "Error Log ({$count})"; } return 'Error Log'; } public function getDescription() { return 'Shows errors and warnings.'; } public function generateData() { return DarkConsoleErrorLogPluginAPI::getErrors(); } public function render() { $data = $this->getData(); $rows = array(); - foreach ($data as $row) { - switch ($row['event']) { - case 'error': - $file = $row['file']; - $line = $row['line']; - break; - case 'exception': - $file = $row['exception']->getFile(); - $line = $row['exception']->getLine(); - break; - } + $details = ''; + + foreach ($data as $index => $row) { + $file = $row['file']; + $line = $row['line']; + + $tag = phutil_render_tag( + 'a', + array( + 'onclick' => jsprintf('show_details(%d)', $index), + ), + phutil_escape_html($row['str'].' at ['.basename($file).':'.$line.']')); + $rows[] = array($tag); + + $details .= + '
'. + phutil_escape_html($row['details'])."\n". + 'Stack trace:'."\n"; + + foreach ($row['trace'] as $key => $entry) { + $line = ''; + if (isset($entry['class'])) { + $line .= $entry['class'].'::'; + } + $line .= idx($entry, 'function', ''); + $onclick = ''; + if (isset($entry['file'])) { + $line .= ' called at ['.$entry['file'].':'.$entry['line'].']'; + $onclick = jsprintf( + 'open_file(%s, %d)', $entry['file'], $entry['line']); + } + $details .= phutil_render_tag( + 'a', + array( + 'onclick' => $onclick, + ), + phutil_escape_html($line)); + $details .= "\n"; + } - $rows[] = array( - basename($file).':'.$line, - $row['str'], - ); + $details .= '
'; } $table = new AphrontTableView($rows); - $table->setColumnClasses( - array( - null, - 'wide wrap', - )); - $table->setHeaders( - array( - 'File', - 'Error', - )); + $table->setClassName('error-log'); + $table->setHeaders(array('Error')); $table->setNoDataString('No errors.'); - return $table->render(); + return '
'. + '
'.$table->render().'
'. + '
'. + '
'.
+      $details.'
'. + '
'; } } /* $data = $this->getData(); if (!$data) { return
No errors.
; } $markup = ; $alt = false; foreach ($data as $error) { $row = ; $text = $error['error']; $text = preg_replace('/\(in .* on line \d+\)$/', '', trim($text)); $trace = $error['trace']; $trace = explode("\n", $trace); if (!$trace) { $trace = array('unknown@0@unknown'); } foreach ($trace as $idx => $traceline) { list($file, $line, $where) = array_merge( explode('@', $traceline), array('?', '?', '?')); if ($where == 'DarkConsole->addError' || $where == 'debug_rlog') { unset($trace[$idx]); } } $row->appendChild(); foreach ($trace as $traceline) { list($file, $line, $where) = array_merge( explode('@', $traceline), array('?', '?', '?')); $row->appendChild(); $row->appendChild(); $markup->appendChild($row); $row = ; } $alt = !$alt; } return

Errors

{$markup}
; */ diff --git a/src/aphront/console/plugin/errorlog/__init__.php b/src/aphront/console/plugin/errorlog/__init__.php index 6b52c92de..cb560b187 100644 --- a/src/aphront/console/plugin/errorlog/__init__.php +++ b/src/aphront/console/plugin/errorlog/__init__.php @@ -1,14 +1,18 @@ 'error', - 'num' => $num, - 'str' => $str, - 'file' => $file, - 'line' => $line, - 'cxt' => $cxt, - 'trace' => debug_backtrace(), - ); + public static function handleErrors($event, $value, $metadata) { + if (self::$discardMode) { + return; } - error_log("{$file}:{$line} {$str}"); - } - public static function handleException($ex) { - if (!self::$discardMode) { - self::$errors[] = array( - 'event' => 'exception', - 'exception' => $ex, - ); + switch ($event) { + case PhutilErrorHandler::EXCEPTION: + // $value is of type Exception + self::$errors[] = array( + 'details' => $value->getMessage(), + 'event' => $event, + 'file' => $value->getFile(), + 'line' => $value->getLine(), + 'str' => $value->getMessage(), + 'trace' => $metadata['trace'], + ); + break; + case PhutilErrorHandler::ERROR: + // $value is a simple string + self::$errors[] = array( + 'details' => $value, + 'event' => $event, + 'file' => $metadata['file'], + 'line' => $metadata['line'], + 'str' => $value, + 'trace' => $metadata['trace'], + ); + break; + case PhutilErrorHandler::PHLOG: + // $value can be anything + self::$errors[] = array( + 'details' => PhutilReadableSerializer::printShallow($value, 3), + 'event' => $event, + 'file' => $metadata['file'], + 'line' => $metadata['line'], + 'str' => PhutilReadableSerializer::printShort($value), + 'trace' => $metadata['trace'], + ); + break; + default: + error_log('Unknown event : '.$event); + break; } - error_log($ex); } } + diff --git a/src/aphront/console/plugin/errorlog/api/__init__.php b/src/aphront/console/plugin/errorlog/api/__init__.php index f4f7b7ffb..428c8500c 100644 --- a/src/aphront/console/plugin/errorlog/api/__init__.php +++ b/src/aphront/console/plugin/errorlog/api/__init__.php @@ -1,10 +1,13 @@ request = $request; return $this; } public function getRequest() { return $this->request; } public function setApplicationName($application_name) { $this->applicationName = $application_name; return $this; } public function getApplicationName() { return $this->applicationName; } public function setBaseURI($base_uri) { $this->baseURI = $base_uri; return $this; } public function getBaseURI() { return $this->baseURI; } public function setTabs(array $tabs, $selected_tab) { $this->tabs = $tabs; $this->selectedTab = $selected_tab; return $this; } public function getTitle() { $use_glyph = true; $request = $this->getRequest(); if ($request) { $user = $request->getUser(); if ($user && $user->loadPreferences()->getPreference( PhabricatorUserPreferences::PREFERENCE_TITLES) !== 'glyph') { $use_glyph = false; } } return ($use_glyph ? $this->getGlyph() : '['.$this->getApplicationName().']'). ' '.parent::getTitle(); } protected function willRenderPage() { if (!$this->getRequest()) { throw new Exception( "You must set the Request to render a PhabricatorStandardPageView."); } $console = $this->getRequest()->getApplicationConfiguration()->getConsole(); require_celerity_resource('phabricator-core-css'); require_celerity_resource('phabricator-core-buttons-css'); require_celerity_resource('phabricator-standard-page-view'); require_celerity_resource('javelin-lib-dev'); require_celerity_resource('javelin-workflow-dev'); Javelin::initBehavior('workflow', array()); if ($console) { require_celerity_resource('aphront-dark-console-css'); Javelin::initBehavior( 'dark-console', array( 'uri' => '/~/', )); + + // Change this to initBehavior when there is some behavior to initialize + require_celerity_resource('javelin-behavior-error-log'); } $this->bodyContent = $this->renderChildren(); } protected function getHead() { $response = CelerityAPI::getStaticResourceResponse(); $head = ''. $response->renderResourcesOfType('css'). ''; $request = $this->getRequest(); if ($request) { $user = $request->getUser(); if ($user) { $monospaced = $user->loadPreferences()->getPreference( PhabricatorUserPreferences::PREFERENCE_MONOSPACED ); if (strlen($monospaced)) { $head .= ''; } } } return $head; } public function setGlyph($glyph) { $this->glyph = $glyph; return $this; } public function getGlyph() { return $this->glyph; } protected function willSendResponse($response) { $console = $this->getRequest()->getApplicationConfiguration()->getConsole(); if ($console) { $response = str_replace( '', $console->render($this->getRequest()), $response); } return $response; } protected function getBody() { $console = $this->getRequest()->getApplicationConfiguration()->getConsole(); $tabs = array(); foreach ($this->tabs as $name => $tab) { $tab_markup = phutil_render_tag( 'a', array( 'href' => idx($tab, 'href'), ), phutil_escape_html(idx($tab, 'name'))); $tab_markup = phutil_render_tag( 'td', array( 'class' => ($name == $this->selectedTab) ? 'phabricator-selected-tab' : null, ), $tab_markup); $tabs[] = $tab_markup; } $tabs = implode('', $tabs); $login_stuff = null; $request = $this->getRequest(); $user = null; if ($request) { $user = $request->getUser(); // NOTE: user may not be set here if we caught an exception early // in the execution workflow. if ($user && $user->getPHID()) { $login_stuff = 'Logged in as '.phutil_render_tag( 'a', array( 'href' => '/p/'.$user->getUsername().'/', ), phutil_escape_html($user->getUsername())). ' · '. 'Settings'. ' · '. phabricator_render_form( $user, array( 'action' => '/search/', 'method' => 'post', 'style' => 'display: inline', ), ''. ''); } } $foot_links = array(); $version = PhabricatorEnv::getEnvConfig('phabricator.version'); $foot_links[] = phutil_escape_html('Phabricator '.$version); if (PhabricatorEnv::getEnvConfig('darkconsole.enabled') && !PhabricatorEnv::getEnvConfig('darkconsole.always-on')) { if ($console) { $link = javelin_render_tag( 'a', array( 'href' => '/~/', 'sigil' => 'workflow', ), 'Disable DarkConsole'); } else { $link = javelin_render_tag( 'a', array( 'href' => '/~/', 'sigil' => 'workflow', ), 'Enable DarkConsole'); } $foot_links[] = $link; } if ($user && $user->getPHID()) { // This ends up very early in tab order at the top of the page and there's // a bunch of junk up there anyway, just shove it down here. $foot_links[] = phabricator_render_form( $user, array( 'action' => '/logout/', 'method' => 'post', 'style' => 'display: inline', ), ''); } $foot_links = implode(' · ', $foot_links); return ($console ? '' : null). '
'. '
'. ''. '
{$text}{$file}:{$line}{$where}()
'. ''. ''. ''. $tabs. ''. '
'. phutil_render_tag( 'a', array( 'href' => $this->getBaseURI(), 'class' => 'phabricator-head-appname', ), phutil_escape_html($this->getApplicationName())). '
'. ''. $this->bodyContent. '
'. ''. '
'. $foot_links. '
'; } protected function getTail() { $response = CelerityAPI::getStaticResourceResponse(); return $response->renderResourcesOfType('js'). $response->renderHTMLFooter(); } } diff --git a/webroot/index.php b/webroot/index.php index fa175970f..5b733544b 100644 --- a/webroot/index.php +++ b/webroot/index.php @@ -1,188 +1,195 @@ ', where '' ". "is one of 'development', 'production', or a custom environment."); } if (!function_exists('mysql_connect')) { phabricator_fatal_config_error( "The PHP MySQL extension is not installed. This extension is required."); } if (!isset($_REQUEST['__path__'])) { phabricator_fatal_config_error( "__path__ is not set. Your rewrite rules are not configured correctly."); } require_once dirname(dirname(__FILE__)).'/conf/__init_conf__.php'; try { $conf = phabricator_read_config_file($env); $conf['phabricator.env'] = $env; setup_aphront_basics(); phutil_require_module('phabricator', 'infrastructure/env'); PhabricatorEnv::setEnvConfig($conf); phutil_require_module('phabricator', 'aphront/console/plugin/xhprof/api'); DarkConsoleXHProfPluginAPI::hookProfiler(); phutil_require_module('phabricator', 'aphront/console/plugin/errorlog/api'); set_error_handler( array('DarkConsoleErrorLogPluginAPI', 'handleError')); set_exception_handler( array('DarkConsoleErrorLogPluginAPI', 'handleException')); } catch (Exception $ex) { phabricator_fatal_config_error( "[Exception] ".$ex->getMessage()); } $tz = PhabricatorEnv::getEnvConfig('phabricator.timezone'); if ($tz) { date_default_timezone_set($tz); } +phutil_require_module('phabricator', 'aphront/console/plugin/errorlog/api'); +phutil_require_module('phutil', 'error'); + +PhutilErrorHandler::setErrorListener( + array('DarkConsoleErrorLogPluginAPI', 'handleErrors')); foreach (PhabricatorEnv::getEnvConfig('load-libraries') as $library) { phutil_load_library($library); } $host = $_SERVER['HTTP_HOST']; $path = $_REQUEST['__path__']; switch ($host) { default: $config_key = 'aphront.default-application-configuration-class'; $config_class = PhabricatorEnv::getEnvConfig($config_key); PhutilSymbolLoader::loadClass($config_class); $application = newv($config_class, array()); break; } + $application->setHost($host); $application->setPath($path); $application->willBuildRequest(); $request = $application->buildRequest(); $application->setRequest($request); list($controller, $uri_data) = $application->buildController(); try { $response = $controller->willBeginExecution(); if (!$response) { $controller->willProcessRequest($uri_data); $response = $controller->processRequest(); } } catch (AphrontRedirectException $ex) { $response = id(new AphrontRedirectResponse()) ->setURI($ex->getURI()); } catch (Exception $ex) { $response = $application->handleException($ex); } $response = $application->willSendResponse($response); $response->setRequest($request); $response_string = $response->buildResponseString(); $code = $response->getHTTPResponseCode(); if ($code != 200) { header("HTTP/1.0 {$code}"); } $headers = $response->getCacheHeaders(); $headers = array_merge($headers, $response->getHeaders()); foreach ($headers as $header) { list($header, $value) = $header; header("{$header}: {$value}"); } + // TODO: This shouldn't be possible in a production-configured environment. if (isset($_REQUEST['__profile__']) && ($_REQUEST['__profile__'] == 'all')) { $profile = DarkConsoleXHProfPluginAPI::stopProfiler(); $profile = '
'. ''. '>>> View Profile <<<'. ''. '
'; if (strpos($response_string, '') !== false) { $response_string = str_replace( '', ''.$profile, $response_string); } else { echo $profile; } } echo $response_string; /** * @group aphront */ function setup_aphront_basics() { $aphront_root = dirname(dirname(__FILE__)); $libraries_root = dirname($aphront_root); $root = null; if (!empty($_SERVER['PHUTIL_LIBRARY_ROOT'])) { $root = $_SERVER['PHUTIL_LIBRARY_ROOT']; } ini_set('include_path', $libraries_root.':'.ini_get('include_path')); @include_once $root.'libphutil/src/__phutil_library_init__.php'; if (!@constant('__LIBPHUTIL__')) { echo "ERROR: Unable to load libphutil. Update your PHP 'include_path' to ". "include the parent directory of libphutil/.\n"; exit(1); } // Load Phabricator itself using the absolute path, so we never end up doing // anything surprising (loading index.php and libraries from different // directories). phutil_load_library($aphront_root.'/src'); phutil_load_library('arcanist/src'); } function phabricator_fatal_config_error($msg) { header('Content-Type: text/plain', $replace = true, $http_error = 500); $error = "CONFIG ERROR: ".$msg."\n"; error_log($error); echo $error; die(); } diff --git a/webroot/rsrc/css/aphront/dark-console.css b/webroot/rsrc/css/aphront/dark-console.css index c1e63cb14..7fe3d766b 100644 --- a/webroot/rsrc/css/aphront/dark-console.css +++ b/webroot/rsrc/css/aphront/dark-console.css @@ -1,72 +1,89 @@ /** * @provides aphront-dark-console-css */ .dark-console { background: #555555; color: #eeeeee; width: 100%; font-family: "Verdana"; font-size: 11px; border-bottom: 2px solid #000000; position: relative; z-index: 1; } .dark-console-tabs { width: 180px; background: #222222; border-right: 1px solid #888888; padding: 2.5em 0em; } a.dark-console-tab { padding: .75em 12px; text-align: right; background: #444444; position: relative; border: 1px solid #666666; border-width: 1px 0; border-right-color: #888888; margin-bottom: 2px; display: block; color: #cccccc; } a.dark-console-tab-selected { margin-right: -1px; padding-right: 13px; background: #555555; border-color: #888888; border-right-color: #555555; color: #eeeeee; } .dark-console .aphront-table-view { background: #888888; color: #eeeeee; margin: 1em 1%; width: 98%; border-color: #333333; } .dark-console .aphront-table-view th { background: #333333; color: #ffffff; } .dark-console .aphront-table-view td.header { background: #444444; color: #ffffff; min-width: 200px; } .dark-console .aphront-table-view tr.alt { background: #666666; } .dark-console .aphront-table-view tr.no-data td { color: #dddddd; } + +.dark-console-panel-ErrorLog { + max-height: 500px; + overflow: auto; +} + +.dark-console-panel-error-details { + display: none; +} + +.dark-console-panel-error-separator { + background-color: #e8e8e8; + border-bottom: 1px solid #b7b7b7; + border-top: 1px solid #b7b7b7; + height: 2px; +} + diff --git a/webroot/rsrc/js/application/core/behavior-error-log.js b/webroot/rsrc/js/application/core/behavior-error-log.js new file mode 100644 index 000000000..5f2d64ed1 --- /dev/null +++ b/webroot/rsrc/js/application/core/behavior-error-log.js @@ -0,0 +1,22 @@ +/** + * @provides javelin-behavior-error-log + * @requires javelin-lib-dev + */ + +var current_details = null; + +function open_file(file, row) { + // Do some fun some here, e.g., open the diffusion page for the file + // or open the file in an editor +} + +function show_details(row) { + var node = JX.$('row-details-' + row); + + if (current_details !== null) { + JX.$('row-details-' + current_details).style.display = 'none'; + } + + node.style.display = 'block'; + current_details = row; +}