diff --git a/.arcconfig b/.arcconfig
index 88f04f72c5..b381a3ac53 100644
--- a/.arcconfig
+++ b/.arcconfig
@@ -1,5 +1,5 @@
{
- "phabricator.uri": "https://secure.phabricator.com/",
+ "phabricator.uri": "https://we.phorge.it/",
"load": ["src/"],
"history.immutable": false
}
diff --git a/.arclint b/.arclint
index 29258b5d3e..7fb4c0f4a6 100644
--- a/.arclint
+++ b/.arclint
@@ -2,7 +2,8 @@
"exclude": [
"(^externals/)",
"(^webroot/rsrc/externals/(?!javelin/))",
- "(/__tests__/data/)"
+ "(/__tests__/data/)",
+ "(^support/aphlict/server/package-lock.json)"
],
"linters": {
"chmod": {
diff --git a/README.md b/README.md
index 5190845da4..19dc39cd82 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,24 @@
-Effective June 1, 2021: Phabricator is no longer actively maintained.
+**Phorge** is a collection of web applications which help software companies build better software.
-**Phabricator** is a collection of web applications for software development.
+Phorge is a community-maintained fork of [Phabricator](http://phabricator.org).
+
+Phorge includes applications for:
+
+ - reviewing and auditing source code;
+ - hosting and browsing repositories;
+ - tracking bugs;
+ - managing projects;
+ - conversing with team members;
+ - assembling a party to venture forth;
+ - writing stuff down and reading it later;
+ - hiding stuff from coworkers; and
+ - also some other things.
+
+
+Phorge is developed and maintained by [The Phorge Team](https://phorge.it).
+
+----------
**LICENSE**
-Phabricator is released under the Apache 2.0 license except as otherwise noted.
+Phorge is released under the Apache 2.0 license except as otherwise noted.
diff --git a/resources/celerity/map.php b/resources/celerity/map.php
index c29df70b1e..80ba37f78e 100644
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -9,10 +9,10 @@
'names' => array(
'conpherence.pkg.css' => '0e3cf785',
'conpherence.pkg.js' => '020aebcf',
- 'core.pkg.css' => 'b816811e',
- 'core.pkg.js' => 'd2de90d9',
+ 'core.pkg.css' => 'f538846d',
+ 'core.pkg.js' => '256dfd7b',
'dark-console.pkg.js' => '187792c2',
- 'differential.pkg.css' => 'ffb69e3d',
+ 'differential.pkg.css' => '609e63d4',
'differential.pkg.js' => 'c60bec1b',
'diffusion.pkg.css' => '42c75c37',
'diffusion.pkg.js' => '78c9885d',
@@ -38,14 +38,14 @@
'rsrc/css/aphront/typeahead.css' => '8779483d',
'rsrc/css/application/almanac/almanac.css' => '2e050f4f',
'rsrc/css/application/auth/auth.css' => 'c2f23d74',
- 'rsrc/css/application/base/main-menu-view.css' => 'bcec20f0',
+ 'rsrc/css/application/base/main-menu-view.css' => '89fc16b6',
'rsrc/css/application/base/notification-menu.css' => '4df1ee30',
'rsrc/css/application/base/phui-theme.css' => '35883b37',
'rsrc/css/application/base/standard-page-view.css' => 'a374f94c',
'rsrc/css/application/chatlog/chatlog.css' => 'abdc76ee',
'rsrc/css/application/conduit/conduit-api.css' => 'ce2cfc41',
'rsrc/css/application/config/config-options.css' => '16c920ae',
- 'rsrc/css/application/config/config-template.css' => '20babf50',
+ 'rsrc/css/application/config/config-template.css' => 'e689dbbd',
'rsrc/css/application/config/setup-issue.css' => '5eed85b2',
'rsrc/css/application/config/unhandled-exception.css' => '9ecfc00d',
'rsrc/css/application/conpherence/color.css' => 'b17746b0',
@@ -63,9 +63,9 @@
'rsrc/css/application/diff/diff-tree-view.css' => 'e2d3e222',
'rsrc/css/application/diff/inline-comment-summary.css' => '81eb368d',
'rsrc/css/application/differential/add-comment.css' => '7e5900d9',
- 'rsrc/css/application/differential/changeset-view.css' => '60c3d405',
+ 'rsrc/css/application/differential/changeset-view.css' => 'bf159129',
'rsrc/css/application/differential/core.css' => '7300a73e',
- 'rsrc/css/application/differential/phui-inline-comment.css' => '9863a85e',
+ 'rsrc/css/application/differential/phui-inline-comment.css' => 'a864426f',
'rsrc/css/application/differential/revision-comment.css' => '7dbc8d1d',
'rsrc/css/application/differential/revision-history.css' => '237a2979',
'rsrc/css/application/differential/revision-list.css' => '93d2df7d',
@@ -77,7 +77,7 @@
'rsrc/css/application/feed/feed.css' => 'd8b6e3f8',
'rsrc/css/application/files/global-drag-and-drop.css' => '1d2713a4',
'rsrc/css/application/flag/flag.css' => '2b77be8d',
- 'rsrc/css/application/harbormaster/harbormaster.css' => '8dfe16b2',
+ 'rsrc/css/application/harbormaster/harbormaster.css' => 'd98decda',
'rsrc/css/application/herald/herald-test.css' => '7e7bbdae',
'rsrc/css/application/herald/herald.css' => '648d39e2',
'rsrc/css/application/maniphest/report.css' => '3d53188b',
@@ -101,15 +101,15 @@
'rsrc/css/application/policy/policy-transaction-detail.css' => 'c02b8384',
'rsrc/css/application/policy/policy.css' => 'ceb56a08',
'rsrc/css/application/ponder/ponder-view.css' => '05a09d0a',
- 'rsrc/css/application/project/project-card-view.css' => 'a9f2c2dd',
+ 'rsrc/css/application/project/project-card-view.css' => 'c1200da7',
'rsrc/css/application/project/project-triggers.css' => 'cd9c8bb9',
- 'rsrc/css/application/project/project-view.css' => '567858b3',
+ 'rsrc/css/application/project/project-view.css' => '2f7caa20',
'rsrc/css/application/search/application-search-view.css' => '0f7c06d8',
'rsrc/css/application/search/search-results.css' => '9ea70ace',
'rsrc/css/application/slowvote/slowvote.css' => '1694baed',
'rsrc/css/application/tokens/tokens.css' => 'ce5a50bd',
'rsrc/css/application/uiexample/example.css' => 'b4795059',
- 'rsrc/css/core/core.css' => 'b3ebd90d',
+ 'rsrc/css/core/core.css' => 'a708bd25',
'rsrc/css/core/remarkup.css' => '5baa3bd9',
'rsrc/css/core/syntax.css' => '548567f6',
'rsrc/css/core/z-index.css' => 'ac3bfcd4',
@@ -121,10 +121,10 @@
'rsrc/css/fuel/fuel-handle-list.css' => '2c4cbeca',
'rsrc/css/fuel/fuel-map.css' => 'd6e31510',
'rsrc/css/fuel/fuel-menu.css' => '21f5d199',
- 'rsrc/css/layout/phabricator-source-code-view.css' => '03d7ac28',
+ 'rsrc/css/layout/phabricator-source-code-view.css' => '6b31244f',
'rsrc/css/phui/button/phui-button-bar.css' => 'a4aa75c4',
'rsrc/css/phui/button/phui-button-simple.css' => '1ff278aa',
- 'rsrc/css/phui/button/phui-button.css' => 'ea704902',
+ 'rsrc/css/phui/button/phui-button.css' => 'e434f171',
'rsrc/css/phui/calendar/phui-calendar-day.css' => '9597d706',
'rsrc/css/phui/calendar/phui-calendar-list.css' => 'ccd7e4e2',
'rsrc/css/phui/calendar/phui-calendar-month.css' => 'cb758c42',
@@ -142,7 +142,7 @@
'rsrc/css/phui/phui-big-info-view.css' => '362ad37b',
'rsrc/css/phui/phui-box.css' => '5ed3b8cb',
'rsrc/css/phui/phui-bulk-editor.css' => '374d5e30',
- 'rsrc/css/phui/phui-chart.css' => '14df9ae3',
+ 'rsrc/css/phui/phui-chart.css' => 'fe8f87a7',
'rsrc/css/phui/phui-cms.css' => '8c05c41e',
'rsrc/css/phui/phui-comment-form.css' => '68a2d99a',
'rsrc/css/phui/phui-comment-panel.css' => 'ec4e31c0',
@@ -155,7 +155,7 @@
'rsrc/css/phui/phui-feed-story.css' => 'a0c05029',
'rsrc/css/phui/phui-fontkit.css' => '1ec937e5',
'rsrc/css/phui/phui-form-view.css' => '01b796c0',
- 'rsrc/css/phui/phui-form.css' => '1f177cb7',
+ 'rsrc/css/phui/phui-form.css' => 'd1adb52c',
'rsrc/css/phui/phui-formation-view.css' => 'd2dec8ed',
'rsrc/css/phui/phui-head-thing.css' => 'd7f293df',
'rsrc/css/phui/phui-header-view.css' => '36c86a58',
@@ -168,7 +168,7 @@
'rsrc/css/phui/phui-left-right.css' => '68513c34',
'rsrc/css/phui/phui-lightbox.css' => '4ebf22da',
'rsrc/css/phui/phui-list.css' => '0c04affd',
- 'rsrc/css/phui/phui-object-box.css' => 'b8d7eea0',
+ 'rsrc/css/phui/phui-object-box.css' => 'fdffed5c',
'rsrc/css/phui/phui-pager.css' => 'd022c7ad',
'rsrc/css/phui/phui-pinboard-view.css' => '1f08f5d8',
'rsrc/css/phui/phui-policy-section-view.css' => '139fdc64',
@@ -184,7 +184,7 @@
'rsrc/css/phui/workboards/phui-workboard.css' => '74fc9d98',
'rsrc/css/phui/workboards/phui-workcard.css' => '913441b6',
'rsrc/css/phui/workboards/phui-workpanel.css' => '3ae89b20',
- 'rsrc/css/sprite-login.css' => '18b368a6',
+ 'rsrc/css/sprite-login.css' => '35d1510c',
'rsrc/css/sprite-tokens.css' => 'f1896dc5',
'rsrc/css/syntax/syntax-default.css' => '055fc231',
'rsrc/externals/d3/d3.min.js' => '9d068042',
@@ -257,7 +257,7 @@
'rsrc/externals/javelin/lib/URI.js' => '2e255291',
'rsrc/externals/javelin/lib/Vector.js' => 'e9c80beb',
'rsrc/externals/javelin/lib/WebSocket.js' => 'fdc13e4e',
- 'rsrc/externals/javelin/lib/Workflow.js' => '945ff654',
+ 'rsrc/externals/javelin/lib/Workflow.js' => 'd7ba6915',
'rsrc/externals/javelin/lib/__tests__/Cookie.js' => 'ca686f71',
'rsrc/externals/javelin/lib/__tests__/DOM.js' => '4566e249',
'rsrc/externals/javelin/lib/__tests__/JSON.js' => '710377ae',
@@ -320,7 +320,7 @@
'rsrc/image/icon/tango/upload.png' => '3fe6b92d',
'rsrc/image/icon/unsubscribe.png' => 'db04378a',
'rsrc/image/lightblue-header.png' => 'e6d483c6',
- 'rsrc/image/logo/light-eye.png' => '72337472',
+ 'rsrc/image/logo/project-logo.png' => '019d256f',
'rsrc/image/main_texture.png' => '894d03c4',
'rsrc/image/menu_texture.png' => '896c9ade',
'rsrc/image/people/harding.png' => '95b2db63',
@@ -342,8 +342,8 @@
'rsrc/image/phrequent_active.png' => 'de66dc50',
'rsrc/image/phrequent_inactive.png' => '79c61baf',
'rsrc/image/resize.png' => '9cc83373',
- 'rsrc/image/sprite-login-X2.png' => '604545f6',
- 'rsrc/image/sprite-login.png' => '7a001a9a',
+ 'rsrc/image/sprite-login-X2.png' => '269800ec',
+ 'rsrc/image/sprite-login.png' => 'a843f146',
'rsrc/image/sprite-tokens-X2.png' => '21621dd9',
'rsrc/image/sprite-tokens.png' => 'bede2580',
'rsrc/image/texture/card-gradient.png' => 'e6892cb4',
@@ -474,7 +474,7 @@
'rsrc/js/core/behavior-detect-timezone.js' => '78bc5d94',
'rsrc/js/core/behavior-device.js' => 'ac2b1e01',
'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '3277c62d',
- 'rsrc/js/core/behavior-fancy-datepicker.js' => '36821f8d',
+ 'rsrc/js/core/behavior-fancy-datepicker.js' => 'b545d0a0',
'rsrc/js/core/behavior-form.js' => '55d7b788',
'rsrc/js/core/behavior-gesture.js' => 'b58d1a2a',
'rsrc/js/core/behavior-global-drag-and-drop.js' => '1cab0e9a',
@@ -559,7 +559,7 @@
'conpherence-transaction-css' => '3a3f5e7e',
'd3' => '9d068042',
'diff-tree-view-css' => 'e2d3e222',
- 'differential-changeset-view-css' => '60c3d405',
+ 'differential-changeset-view-css' => 'bf159129',
'differential-core-view-css' => '7300a73e',
'differential-revision-add-comment-css' => '7e5900d9',
'differential-revision-comment-css' => '7dbc8d1d',
@@ -578,7 +578,7 @@
'fuel-map-css' => 'd6e31510',
'fuel-menu-css' => '21f5d199',
'global-drag-and-drop-css' => '1d2713a4',
- 'harbormaster-css' => '8dfe16b2',
+ 'harbormaster-css' => 'd98decda',
'herald-css' => '648d39e2',
'herald-rule-editor' => '2633bef7',
'herald-test-css' => '7e7bbdae',
@@ -628,7 +628,7 @@
'javelin-behavior-editengine-reorder-configs' => '4842f137',
'javelin-behavior-editengine-reorder-fields' => '0ad8d31f',
'javelin-behavior-event-all-day' => '0b1bc990',
- 'javelin-behavior-fancy-datepicker' => '36821f8d',
+ 'javelin-behavior-fancy-datepicker' => 'b545d0a0',
'javelin-behavior-global-drag-and-drop' => '1cab0e9a',
'javelin-behavior-harbormaster-log' => 'b347a301',
'javelin-behavior-herald-rule-editor' => '0922e81d',
@@ -756,7 +756,7 @@
'javelin-workboard-header' => '111bfd2d',
'javelin-workboard-header-template' => 'ebe83a6b',
'javelin-workboard-order-template' => '03e8891f',
- 'javelin-workflow' => '945ff654',
+ 'javelin-workflow' => 'd7ba6915',
'maniphest-report-css' => '3d53188b',
'maniphest-task-edit-css' => '272daa84',
'maniphest-task-summary-css' => '61d1667e',
@@ -771,7 +771,7 @@
'phabricator-busy' => '5202e831',
'phabricator-chatlog-css' => 'abdc76ee',
'phabricator-content-source-view-css' => 'cdf0d579',
- 'phabricator-core-css' => 'b3ebd90d',
+ 'phabricator-core-css' => 'a708bd25',
'phabricator-countdown-css' => 'bff8012f',
'phabricator-darklog' => '3b869402',
'phabricator-darkmessage' => '26cd4b73',
@@ -784,14 +784,14 @@
'phabricator-diff-tree-view' => '5d83623b',
'phabricator-drag-and-drop-file-upload' => '4370900d',
'phabricator-draggable-list' => '0169e425',
- 'phabricator-fatal-config-template-css' => '20babf50',
+ 'phabricator-fatal-config-template-css' => 'e689dbbd',
'phabricator-favicon' => '7930776a',
'phabricator-feed-css' => 'd8b6e3f8',
'phabricator-file-upload' => 'ab85e184',
'phabricator-flag-css' => '2b77be8d',
'phabricator-keyboard-shortcut' => '1a844c06',
'phabricator-keyboard-shortcut-manager' => '81debc48',
- 'phabricator-main-menu-view' => 'bcec20f0',
+ 'phabricator-main-menu-view' => '89fc16b6',
'phabricator-nav-view-css' => '423f92cc',
'phabricator-notification' => 'a9b91e3f',
'phabricator-notification-css' => '30240bd2',
@@ -803,7 +803,7 @@
'phabricator-search-results-css' => '9ea70ace',
'phabricator-shaped-request' => '995f5102',
'phabricator-slowvote-css' => '1694baed',
- 'phabricator-source-code-view-css' => '03d7ac28',
+ 'phabricator-source-code-view-css' => '6b31244f',
'phabricator-standard-page-view' => 'a374f94c',
'phabricator-textareautils' => 'f340a484',
'phabricator-title' => '43bc9360',
@@ -827,13 +827,13 @@
'phui-box-css' => '5ed3b8cb',
'phui-bulk-editor-css' => '374d5e30',
'phui-button-bar-css' => 'a4aa75c4',
- 'phui-button-css' => 'ea704902',
+ 'phui-button-css' => 'e434f171',
'phui-button-simple-css' => '1ff278aa',
'phui-calendar-css' => 'f11073aa',
'phui-calendar-day-css' => '9597d706',
'phui-calendar-list-css' => 'ccd7e4e2',
'phui-calendar-month-css' => 'cb758c42',
- 'phui-chart-css' => '14df9ae3',
+ 'phui-chart-css' => 'fe8f87a7',
'phui-cms-css' => '8c05c41e',
'phui-comment-form-css' => '68a2d99a',
'phui-comment-panel-css' => 'ec4e31c0',
@@ -846,7 +846,7 @@
'phui-feed-story-css' => 'a0c05029',
'phui-font-icon-base-css' => '303c9b87',
'phui-fontkit-css' => '1ec937e5',
- 'phui-form-css' => '1f177cb7',
+ 'phui-form-css' => 'd1adb52c',
'phui-form-view-css' => '01b796c0',
'phui-formation-view-css' => 'd2dec8ed',
'phui-head-thing-view-css' => 'd7f293df',
@@ -858,12 +858,12 @@
'phui-icon-view-css' => '4cbc684a',
'phui-image-mask-css' => '62c7f4d2',
'phui-info-view-css' => 'a10a909b',
- 'phui-inline-comment-view-css' => '9863a85e',
+ 'phui-inline-comment-view-css' => 'a864426f',
'phui-invisible-character-view-css' => 'c694c4a4',
'phui-left-right-css' => '68513c34',
'phui-lightbox-css' => '4ebf22da',
'phui-list-view-css' => '0c04affd',
- 'phui-object-box-css' => 'b8d7eea0',
+ 'phui-object-box-css' => 'fdffed5c',
'phui-oi-big-ui-css' => 'fa74cc35',
'phui-oi-color-css' => 'b517bfa0',
'phui-oi-drag-ui-css' => 'da15d3dc',
@@ -900,11 +900,11 @@
'policy-edit-css' => '8794e2ed',
'policy-transaction-detail-css' => 'c02b8384',
'ponder-view-css' => '05a09d0a',
- 'project-card-view-css' => 'a9f2c2dd',
+ 'project-card-view-css' => 'c1200da7',
'project-triggers-css' => 'cd9c8bb9',
- 'project-view-css' => '567858b3',
+ 'project-view-css' => '2f7caa20',
'setup-issue-css' => '5eed85b2',
- 'sprite-login-css' => '18b368a6',
+ 'sprite-login-css' => '35d1510c',
'sprite-tokens-css' => 'f1896dc5',
'syntax-default-css' => '055fc231',
'syntax-highlighting-css' => '548567f6',
@@ -1222,13 +1222,6 @@
'aphront-typeahead-control-css',
'phui-tag-view-css',
),
- '36821f8d' => array(
- 'javelin-behavior',
- 'javelin-util',
- 'javelin-dom',
- 'javelin-stratcom',
- 'javelin-vector',
- ),
'3829a3cf' => array(
'javelin-behavior',
'javelin-uri',
@@ -1519,9 +1512,6 @@
'5faf27b9' => array(
'phuix-form-control-view',
),
- '60c3d405' => array(
- 'phui-inline-comment-view-css',
- ),
'60cd9241' => array(
'javelin-behavior',
),
@@ -1672,6 +1662,9 @@
'javelin-stratcom',
'javelin-install',
),
+ '89fc16b6' => array(
+ 'phui-theme-css',
+ ),
'8ac32fd9' => array(
'javelin-behavior',
'javelin-stratcom',
@@ -1751,17 +1744,6 @@
'javelin-typeahead-preloaded-source',
'javelin-util',
),
- '945ff654' => array(
- 'javelin-stratcom',
- 'javelin-request',
- 'javelin-dom',
- 'javelin-vector',
- 'javelin-install',
- 'javelin-util',
- 'javelin-mask',
- 'javelin-uri',
- 'javelin-routable',
- ),
'9623adc1' => array(
'javelin-behavior',
'javelin-stratcom',
@@ -1953,6 +1935,13 @@
'b517bfa0' => array(
'phui-oi-list-view-css',
),
+ 'b545d0a0' => array(
+ 'javelin-behavior',
+ 'javelin-util',
+ 'javelin-dom',
+ 'javelin-stratcom',
+ 'javelin-vector',
+ ),
'b557770a' => array(
'javelin-install',
'javelin-util',
@@ -2010,8 +1999,8 @@
'phabricator-drag-and-drop-file-upload',
'javelin-workboard-board',
),
- 'bcec20f0' => array(
- 'phui-theme-css',
+ 'bf159129' => array(
+ 'phui-inline-comment-view-css',
),
'c03f2fb4' => array(
'javelin-install',
@@ -2080,6 +2069,17 @@
'd4cc2d2a' => array(
'javelin-install',
),
+ 'd7ba6915' => array(
+ 'javelin-stratcom',
+ 'javelin-request',
+ 'javelin-dom',
+ 'javelin-vector',
+ 'javelin-install',
+ 'javelin-util',
+ 'javelin-mask',
+ 'javelin-uri',
+ 'javelin-routable',
+ ),
'd7d3ba75' => array(
'javelin-dom',
'javelin-util',
diff --git a/resources/sql/autopatches/20210802.legalpad_document_signature.01.phid.sql b/resources/sql/autopatches/20210802.legalpad_document_signature.01.phid.sql
new file mode 100644
index 0000000000..92e50cce98
--- /dev/null
+++ b/resources/sql/autopatches/20210802.legalpad_document_signature.01.phid.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature
+ ADD phid VARBINARY(64) NOT NULL;
diff --git a/resources/sql/autopatches/20210802.legalpad_document_signature.02.phid-populate.php b/resources/sql/autopatches/20210802.legalpad_document_signature.02.phid-populate.php
new file mode 100644
index 0000000000..1a2ce50293
--- /dev/null
+++ b/resources/sql/autopatches/20210802.legalpad_document_signature.02.phid-populate.php
@@ -0,0 +1,79 @@
+establishConnection('w');
+$table_name = $docsig_table->getTableName();
+
+$chunk_size = 4096;
+
+$temporary_table = 'tmp_20210802_docsig_id_map';
+
+try {
+ queryfx(
+ $conn,
+ 'CREATE TEMPORARY TABLE %T (
+ docsig_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ docsig_phid VARBINARY(64) NOT NULL)',
+ $temporary_table);
+} catch (AphrontAccessDeniedQueryException $ex) {
+ throw new PhutilProxyException(
+ pht(
+ 'Failed to "CREATE TEMPORARY TABLE". You may need to "GRANT" the '.
+ 'current MySQL user this permission.'),
+ $ex);
+}
+
+$table_iterator = id(new LiskRawMigrationIterator($conn, $table_name))
+ ->setPageSize($chunk_size);
+
+$chunk_iterator = new PhutilChunkedIterator($table_iterator, $chunk_size);
+foreach ($chunk_iterator as $chunk) {
+
+ $map = array();
+ foreach ($chunk as $docsig_row) {
+ $phid = $docsig_row['phid'];
+
+ if (strlen($phid)) {
+ continue;
+ }
+
+ $phid = PhabricatorPHID::generateNewPHID($phid_type);
+ $id = $docsig_row['id'];
+
+ $map[(int)$id] = $phid;
+ }
+
+ if (!$map) {
+ continue;
+ }
+
+ $sql = array();
+ foreach ($map as $docsig_id => $docsig_phid) {
+ $sql[] = qsprintf(
+ $conn,
+ '(%d, %s)',
+ $docsig_id,
+ $docsig_phid);
+ }
+
+ queryfx(
+ $conn,
+ 'TRUNCATE TABLE %T',
+ $temporary_table);
+
+ queryfx(
+ $conn,
+ 'INSERT INTO %T (docsig_id, docsig_phid) VALUES %LQ',
+ $temporary_table,
+ $sql);
+
+ queryfx(
+ $conn,
+ 'UPDATE %T c JOIN %T x ON c.id = x.docsig_id
+ SET c.phid = x.docsig_phid',
+ $table_name,
+ $temporary_table);
+}
diff --git a/resources/sshd/phabricator-ssh-hook.sh b/resources/sshd/phorge-ssh-hook.sh
similarity index 66%
rename from resources/sshd/phabricator-ssh-hook.sh
rename to resources/sshd/phorge-ssh-hook.sh
index fc7de81dad..4e5843986e 100755
--- a/resources/sshd/phabricator-ssh-hook.sh
+++ b/resources/sshd/phorge-ssh-hook.sh
@@ -3,8 +3,8 @@
# NOTE: Replace this with the username that you expect users to connect with.
VCSUSER="vcs-user"
-# NOTE: Replace this with the path to your Phabricator directory.
-ROOT="/path/to/phabricator"
+# NOTE: Replace this with the path to your Phorge directory.
+ROOT="/path/to/phorge"
if [ "$1" != "$VCSUSER" ];
then
diff --git a/resources/sshd/sshd_config.phabricator.example b/resources/sshd/sshd_config.phorge.example
similarity index 84%
rename from resources/sshd/sshd_config.phabricator.example
rename to resources/sshd/sshd_config.phorge.example
index 506d32bbbf..34c0d14d33 100644
--- a/resources/sshd/sshd_config.phabricator.example
+++ b/resources/sshd/sshd_config.phorge.example
@@ -3,7 +3,7 @@
# NOTE: Edit these to the correct values for your setup.
-AuthorizedKeysCommand /usr/libexec/phabricator-ssh-hook.sh
+AuthorizedKeysCommand /usr/libexec/phorge-ssh-hook.sh
AuthorizedKeysCommandUser vcs-user
AllowUsers vcs-user
@@ -21,4 +21,4 @@ PasswordAuthentication no
ChallengeResponseAuthentication no
AuthorizedKeysFile none
-PidFile /var/run/sshd-phabricator.pid
+PidFile /var/run/sshd-phorge.pid
diff --git a/scripts/install/update_phabricator.sh b/scripts/install/update_phorge.sh
similarity index 66%
rename from scripts/install/update_phabricator.sh
rename to scripts/install/update_phorge.sh
index 3831acd963..c84583506b 100755
--- a/scripts/install/update_phabricator.sh
+++ b/scripts/install/update_phorge.sh
@@ -3,32 +3,35 @@
set -e
set -x
-# This is an example script for updating Phabricator, similar to the one used to
-# update . It might not work perfectly on your
-# system, but hopefully it should be easy to adapt. This script is not intended
-# to work without modifications.
+# This is an example script for updating Phabricator. It might not work
+# perfectly on your system, but hopefully it should be easy to adapt. This
+# script is not intended to work without modifications.
# NOTE: This script assumes you are running it from a directory which contains
-# arcanist/ and phabricator/.
+# arcanist/ and phorge/. If you named them differently, you can change them
+# here:
+NAME_MAIN="phorge"
+NAME_ARC="arcanist"
+
ROOT=`pwd` # You can hard-code the path here instead.
### UPDATE WORKING COPIES ######################################################
-cd $ROOT/arcanist
+cd $ROOT/$NAME_ARC
git pull
-cd $ROOT/phabricator
+cd $ROOT/$NAME_MAIN
git pull
### CYCLE WEB SERVER AND DAEMONS ###############################################
# Stop daemons.
-$ROOT/phabricator/bin/phd stop
+$ROOT/$NAME_MAIN/bin/phd stop
# If running the notification server, stop it.
-# $ROOT/phabricator/bin/aphlict stop
+# $ROOT/$NAME_MAIN/bin/aphlict stop
# Stop the webserver (apache, nginx, lighttpd, etc). This command will differ
# depending on which system and webserver you are running: replace it with an
@@ -40,14 +43,14 @@ sudo /etc/init.d/httpd stop
# Upgrade the database schema. You may want to add the "--force" flag to allow
# this script to run noninteractively.
-$ROOT/phabricator/bin/storage upgrade
+$ROOT/$NAME_MAIN/bin/storage upgrade
# Restart the webserver. As above, this depends on your system and webserver.
# NOTE: If you're running php-fpm, restart it here too.
sudo /etc/init.d/httpd start
# Restart daemons.
-$ROOT/phabricator/bin/phd start
+$ROOT/$NAME_MAIN/bin/phd start
# If running the notification server, start it.
-# $ROOT/phabricator/bin/aphlict start
+# $ROOT/$NAME_MAIN/bin/aphlict start
diff --git a/src/__phutil_library_init__.php b/src/__phutil_library_init__.php
index f150c1f94f..55c0912aba 100644
--- a/src/__phutil_library_init__.php
+++ b/src/__phutil_library_init__.php
@@ -1,3 +1,3 @@
'applications/harbormaster/query/HarbormasterBuildableTransactionQuery.php',
'HarbormasterBuildableTransactionType' => 'applications/harbormaster/xaction/buildable/HarbormasterBuildableTransactionType.php',
'HarbormasterBuildableViewController' => 'applications/harbormaster/controller/HarbormasterBuildableViewController.php',
- 'HarbormasterBuildkiteBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php',
+ 'HarbormasterBuildkiteBuildStepImplementation' => 'applications/harbormaster/integration/buildkite/HarbormasterBuildkiteBuildStepImplementation.php',
'HarbormasterBuildkiteBuildableInterface' => 'applications/harbormaster/interface/HarbormasterBuildkiteBuildableInterface.php',
- 'HarbormasterBuildkiteHookController' => 'applications/harbormaster/controller/HarbormasterBuildkiteHookController.php',
+ 'HarbormasterBuildkiteHookHandler' => 'applications/harbormaster/integration/buildkite/HarbormasterBuildkiteHookHandler.php',
'HarbormasterBuiltinBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterBuiltinBuildStepGroup.php',
- 'HarbormasterCircleCIBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterCircleCIBuildStepImplementation.php',
+ 'HarbormasterCircleCIBuildStepImplementation' => 'applications/harbormaster/integration/circleci/HarbormasterCircleCIBuildStepImplementation.php',
'HarbormasterCircleCIBuildableInterface' => 'applications/harbormaster/interface/HarbormasterCircleCIBuildableInterface.php',
- 'HarbormasterCircleCIHookController' => 'applications/harbormaster/controller/HarbormasterCircleCIHookController.php',
+ 'HarbormasterCircleCIHookHandler' => 'applications/harbormaster/integration/circleci/HarbormasterCircleCIHookHandler.php',
'HarbormasterConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterConduitAPIMethod.php',
'HarbormasterControlBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterControlBuildStepGroup.php',
'HarbormasterController' => 'applications/harbormaster/controller/HarbormasterController.php',
@@ -1514,6 +1514,9 @@
'HarbormasterExternalBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterExternalBuildStepGroup.php',
'HarbormasterFileArtifact' => 'applications/harbormaster/artifact/HarbormasterFileArtifact.php',
'HarbormasterHTTPRequestBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterHTTPRequestBuildStepImplementation.php',
+ 'HarbormasterHTTPRequestWithContentBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterHTTPRequestWithContentBuildStepImplementation.php',
+ 'HarbormasterHookController' => 'applications/harbormaster/controller/HarbormasterHookController.php',
+ 'HarbormasterHookHandler' => 'applications/harbormaster/integration/HarbormasterHookHandler.php',
'HarbormasterHostArtifact' => 'applications/harbormaster/artifact/HarbormasterHostArtifact.php',
'HarbormasterLeaseWorkingCopyBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterLeaseWorkingCopyBuildStepImplementation.php',
'HarbormasterLintMessagesController' => 'applications/harbormaster/controller/HarbormasterLintMessagesController.php',
@@ -1736,6 +1739,7 @@
'LegalpadDocumentQuery' => 'applications/legalpad/query/LegalpadDocumentQuery.php',
'LegalpadDocumentRemarkupRule' => 'applications/legalpad/remarkup/LegalpadDocumentRemarkupRule.php',
'LegalpadDocumentRequireSignatureTransaction' => 'applications/legalpad/xaction/LegalpadDocumentRequireSignatureTransaction.php',
+ 'LegalpadDocumentSearchConduitAPIMethod' => 'applications/legalpad/conduit/LegalpadDocumentSearchConduitAPIMethod.php',
'LegalpadDocumentSearchEngine' => 'applications/legalpad/query/LegalpadDocumentSearchEngine.php',
'LegalpadDocumentSignController' => 'applications/legalpad/controller/LegalpadDocumentSignController.php',
'LegalpadDocumentSignature' => 'applications/legalpad/storage/LegalpadDocumentSignature.php',
@@ -1755,6 +1759,7 @@
'LegalpadRequireSignatureHeraldAction' => 'applications/legalpad/herald/LegalpadRequireSignatureHeraldAction.php',
'LegalpadSchemaSpec' => 'applications/legalpad/storage/LegalpadSchemaSpec.php',
'LegalpadSignatureNeededByObjectEdgeType' => 'applications/legalpad/edge/LegalpadSignatureNeededByObjectEdgeType.php',
+ 'LegalpadSignatureSearchConduitAPIMethod' => 'applications/legalpad/conduit/LegalpadSignatureSearchConduitAPIMethod.php',
'LegalpadTransaction' => 'applications/legalpad/storage/LegalpadTransaction.php',
'LegalpadTransactionComment' => 'applications/legalpad/storage/LegalpadTransactionComment.php',
'LegalpadTransactionQuery' => 'applications/legalpad/query/LegalpadTransactionQuery.php',
@@ -3676,8 +3681,11 @@
'PhabricatorLabelProfileMenuItem' => 'applications/search/menuitem/PhabricatorLabelProfileMenuItem.php',
'PhabricatorLanguageSettingsPanel' => 'applications/settings/panel/PhabricatorLanguageSettingsPanel.php',
'PhabricatorLegalpadApplication' => 'applications/legalpad/application/PhabricatorLegalpadApplication.php',
+ 'PhabricatorLegalpadBodySearchEngineAttachment' => 'applications/legalpad/engineextension/PhabricatorLegalpadBodySearchEngineAttachment.php',
'PhabricatorLegalpadDocumentPHIDType' => 'applications/legalpad/phid/PhabricatorLegalpadDocumentPHIDType.php',
+ 'PhabricatorLegalpadDocumentSignaturePHIDType' => 'applications/legalpad/phid/PhabricatorLegalpadDocumentSignaturePHIDType.php',
'PhabricatorLegalpadSignaturePolicyRule' => 'applications/legalpad/policyrule/PhabricatorLegalpadSignaturePolicyRule.php',
+ 'PhabricatorLegalpadSignaturesSearchEngineAttachment' => 'applications/legalpad/engineextension/PhabricatorLegalpadSignaturesSearchEngineAttachment.php',
'PhabricatorLibraryTestCase' => '__tests__/PhabricatorLibraryTestCase.php',
'PhabricatorLinkProfileMenuItem' => 'applications/search/menuitem/PhabricatorLinkProfileMenuItem.php',
'PhabricatorLipsumArtist' => 'applications/lipsum/image/PhabricatorLipsumArtist.php',
@@ -4210,6 +4218,7 @@
'PhabricatorPeopleProfilePictureController' => 'applications/people/controller/PhabricatorPeopleProfilePictureController.php',
'PhabricatorPeopleProfileRevisionsController' => 'applications/people/controller/PhabricatorPeopleProfileRevisionsController.php',
'PhabricatorPeopleProfileTasksController' => 'applications/people/controller/PhabricatorPeopleProfileTasksController.php',
+ 'PhabricatorPeopleProfileTimeController' => 'applications/people/controller/PhabricatorPeopleProfileTimeController.php',
'PhabricatorPeopleProfileViewController' => 'applications/people/controller/PhabricatorPeopleProfileViewController.php',
'PhabricatorPeopleQuery' => 'applications/people/query/PhabricatorPeopleQuery.php',
'PhabricatorPeopleRenameController' => 'applications/people/controller/PhabricatorPeopleRenameController.php',
@@ -4217,6 +4226,7 @@
'PhabricatorPeopleSearchEngine' => 'applications/people/query/PhabricatorPeopleSearchEngine.php',
'PhabricatorPeopleTasksProfileMenuItem' => 'applications/people/menuitem/PhabricatorPeopleTasksProfileMenuItem.php',
'PhabricatorPeopleTestDataGenerator' => 'applications/people/lipsum/PhabricatorPeopleTestDataGenerator.php',
+ 'PhabricatorPeopleTimeProfileMenuItem' => 'applications/people/menuitem/PhabricatorPeopleTimeProfileMenuItem.php',
'PhabricatorPeopleTransactionQuery' => 'applications/people/query/PhabricatorPeopleTransactionQuery.php',
'PhabricatorPeopleUserEmailPHIDType' => 'applications/people/phid/PhabricatorPeopleUserEmailPHIDType.php',
'PhabricatorPeopleUserEmailQuery' => 'applications/people/query/PhabricatorPeopleUserEmailQuery.php',
@@ -5575,6 +5585,7 @@
'PhrequentTimeBlock' => 'applications/phrequent/storage/PhrequentTimeBlock.php',
'PhrequentTimeBlockTestCase' => 'applications/phrequent/storage/__tests__/PhrequentTimeBlockTestCase.php',
'PhrequentTimeSlices' => 'applications/phrequent/storage/PhrequentTimeSlices.php',
+ 'PhrequentTimespendConduitAPIMethod' => 'applications/phrequent/conduit/PhrequentTimespendConduitAPIMethod.php',
'PhrequentTrackController' => 'applications/phrequent/controller/PhrequentTrackController.php',
'PhrequentTrackableInterface' => 'applications/phrequent/interface/PhrequentTrackableInterface.php',
'PhrequentTrackingConduitAPIMethod' => 'applications/phrequent/conduit/PhrequentTrackingConduitAPIMethod.php',
@@ -5892,6 +5903,8 @@
'UserQueryConduitAPIMethod' => 'applications/people/conduit/UserQueryConduitAPIMethod.php',
'UserSearchConduitAPIMethod' => 'applications/people/conduit/UserSearchConduitAPIMethod.php',
'UserWhoAmIConduitAPIMethod' => 'applications/people/conduit/UserWhoAmIConduitAPIMethod.php',
+ 'WorklogParser' => 'applications/phrequent/storage/WorklogParser.php',
+ 'WorklogParserTestCase' => 'applications/phrequent/storage/__tests__/WorklogParserTestCase.php',
),
'function' => array(
'celerity_generate_unique_node_id' => 'applications/celerity/api.php',
@@ -7648,10 +7661,10 @@
'HarbormasterBuildableTransactionType' => 'PhabricatorModularTransactionType',
'HarbormasterBuildableViewController' => 'HarbormasterController',
'HarbormasterBuildkiteBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
- 'HarbormasterBuildkiteHookController' => 'HarbormasterController',
+ 'HarbormasterBuildkiteHookHandler' => 'HarbormasterHookHandler',
'HarbormasterBuiltinBuildStepGroup' => 'HarbormasterBuildStepGroup',
'HarbormasterCircleCIBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
- 'HarbormasterCircleCIHookController' => 'HarbormasterController',
+ 'HarbormasterCircleCIHookHandler' => 'HarbormasterHookHandler',
'HarbormasterConduitAPIMethod' => 'ConduitAPIMethod',
'HarbormasterControlBuildStepGroup' => 'HarbormasterBuildStepGroup',
'HarbormasterController' => 'PhabricatorController',
@@ -7665,6 +7678,9 @@
'HarbormasterExternalBuildStepGroup' => 'HarbormasterBuildStepGroup',
'HarbormasterFileArtifact' => 'HarbormasterArtifact',
'HarbormasterHTTPRequestBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
+ 'HarbormasterHTTPRequestWithContentBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
+ 'HarbormasterHookController' => 'HarbormasterController',
+ 'HarbormasterHookHandler' => 'Phobject',
'HarbormasterHostArtifact' => 'HarbormasterDrydockLeaseArtifact',
'HarbormasterLeaseWorkingCopyBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
'HarbormasterLintMessagesController' => 'HarbormasterController',
@@ -7908,6 +7924,7 @@
'PhabricatorSubscribableInterface',
'PhabricatorApplicationTransactionInterface',
'PhabricatorDestructibleInterface',
+ 'PhabricatorConduitResultInterface',
),
'LegalpadDocumentBody' => array(
'LegalpadDAO',
@@ -7924,11 +7941,13 @@
'LegalpadDocumentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'LegalpadDocumentRemarkupRule' => 'PhabricatorObjectRemarkupRule',
'LegalpadDocumentRequireSignatureTransaction' => 'LegalpadDocumentTransactionType',
+ 'LegalpadDocumentSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
'LegalpadDocumentSearchEngine' => 'PhabricatorApplicationSearchEngine',
'LegalpadDocumentSignController' => 'LegalpadController',
'LegalpadDocumentSignature' => array(
'LegalpadDAO',
'PhabricatorPolicyInterface',
+ 'PhabricatorConduitResultInterface',
),
'LegalpadDocumentSignatureAddController' => 'LegalpadController',
'LegalpadDocumentSignatureListController' => 'LegalpadController',
@@ -7946,6 +7965,7 @@
'LegalpadRequireSignatureHeraldAction' => 'HeraldAction',
'LegalpadSchemaSpec' => 'PhabricatorConfigSchemaSpec',
'LegalpadSignatureNeededByObjectEdgeType' => 'PhabricatorEdgeType',
+ 'LegalpadSignatureSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
'LegalpadTransaction' => 'PhabricatorModularTransaction',
'LegalpadTransactionComment' => 'PhabricatorApplicationTransactionComment',
'LegalpadTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
@@ -8388,6 +8408,7 @@
'PhabricatorApplicationTransactionInterface',
'PhabricatorPolicyInterface',
'PhabricatorFlaggableInterface',
+ 'PhabricatorMentionableInterface',
'PhabricatorSubscribableInterface',
'PhabricatorDestructibleInterface',
'PhabricatorSpacesInterface',
@@ -10157,8 +10178,11 @@
'PhabricatorLabelProfileMenuItem' => 'PhabricatorProfileMenuItem',
'PhabricatorLanguageSettingsPanel' => 'PhabricatorEditEngineSettingsPanel',
'PhabricatorLegalpadApplication' => 'PhabricatorApplication',
+ 'PhabricatorLegalpadBodySearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
'PhabricatorLegalpadDocumentPHIDType' => 'PhabricatorPHIDType',
+ 'PhabricatorLegalpadDocumentSignaturePHIDType' => 'PhabricatorPHIDType',
'PhabricatorLegalpadSignaturePolicyRule' => 'PhabricatorPolicyRule',
+ 'PhabricatorLegalpadSignaturesSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
'PhabricatorLibraryTestCase' => 'PhutilLibraryTestCase',
'PhabricatorLinkProfileMenuItem' => 'PhabricatorProfileMenuItem',
'PhabricatorLipsumArtist' => 'Phobject',
@@ -10779,6 +10803,7 @@
'PhabricatorPeopleProfilePictureController' => 'PhabricatorPeopleProfileController',
'PhabricatorPeopleProfileRevisionsController' => 'PhabricatorPeopleProfileController',
'PhabricatorPeopleProfileTasksController' => 'PhabricatorPeopleProfileController',
+ 'PhabricatorPeopleProfileTimeController' => 'PhabricatorPeopleProfileController',
'PhabricatorPeopleProfileViewController' => 'PhabricatorPeopleProfileController',
'PhabricatorPeopleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorPeopleRenameController' => 'PhabricatorPeopleController',
@@ -10786,6 +10811,7 @@
'PhabricatorPeopleSearchEngine' => 'PhabricatorApplicationSearchEngine',
'PhabricatorPeopleTasksProfileMenuItem' => 'PhabricatorProfileMenuItem',
'PhabricatorPeopleTestDataGenerator' => 'PhabricatorTestDataGenerator',
+ 'PhabricatorPeopleTimeProfileMenuItem' => 'PhabricatorProfileMenuItem',
'PhabricatorPeopleTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
'PhabricatorPeopleUserEmailPHIDType' => 'PhabricatorPHIDType',
'PhabricatorPeopleUserEmailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
@@ -12439,6 +12465,7 @@
'PhrequentTimeBlock' => 'Phobject',
'PhrequentTimeBlockTestCase' => 'PhabricatorTestCase',
'PhrequentTimeSlices' => 'Phobject',
+ 'PhrequentTimespendConduitAPIMethod' => 'PhrequentConduitAPIMethod',
'PhrequentTrackController' => 'PhrequentController',
'PhrequentTrackingConduitAPIMethod' => 'PhrequentConduitAPIMethod',
'PhrequentTrackingEditor' => 'PhabricatorEditor',
@@ -12796,5 +12823,6 @@
'UserQueryConduitAPIMethod' => 'UserConduitAPIMethod',
'UserSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
'UserWhoAmIConduitAPIMethod' => 'UserConduitAPIMethod',
+ 'WorklogParserTestCase' => 'PhabricatorTestCase',
),
));
diff --git a/src/applications/auth/adapter/PhutilTwitchAuthAdapter.php b/src/applications/auth/adapter/PhutilTwitchAuthAdapter.php
index dce2c7e2f0..364ac55eac 100644
--- a/src/applications/auth/adapter/PhutilTwitchAuthAdapter.php
+++ b/src/applications/auth/adapter/PhutilTwitchAuthAdapter.php
@@ -14,7 +14,7 @@ public function getAdapterDomain() {
}
public function getAccountID() {
- return $this->getOAuthAccountData('_id');
+ return $this->getOAuthAccountData('id');
}
public function getAccountEmail() {
@@ -22,11 +22,11 @@ public function getAccountEmail() {
}
public function getAccountName() {
- return $this->getOAuthAccountData('name');
+ return $this->getOAuthAccountData('login');
}
public function getAccountImageURI() {
- return $this->getOAuthAccountData('logo');
+ return $this->getOAuthAccountData('profile_image_url');
}
public function getAccountURI() {
@@ -42,11 +42,11 @@ public function getAccountRealName() {
}
protected function getAuthenticateBaseURI() {
- return 'https://api.twitch.tv/kraken/oauth2/authorize';
+ return 'https://id.twitch.tv/oauth2/authorize';
}
protected function getTokenBaseURI() {
- return 'https://api.twitch.tv/kraken/oauth2/token';
+ return 'https://id.twitch.tv/oauth2/token';
}
public function getScope() {
@@ -69,7 +69,7 @@ protected function loadOAuthAccountData() {
return id(new PhutilTwitchFuture())
->setClientID($this->getClientID())
->setAccessToken($this->getAccessToken())
- ->setRawTwitchQuery('user')
+ ->setRawTwitchQuery('users')
->resolve();
}
diff --git a/src/applications/calendar/controller/PhabricatorCalendarImportEditController.php b/src/applications/calendar/controller/PhabricatorCalendarImportEditController.php
index 0af9fa1540..9acbd0f2d2 100644
--- a/src/applications/calendar/controller/PhabricatorCalendarImportEditController.php
+++ b/src/applications/calendar/controller/PhabricatorCalendarImportEditController.php
@@ -8,7 +8,22 @@ public function handleRequest(AphrontRequest $request) {
->setController($this);
$id = $request->getURIData('id');
- if (!$id) {
+ if ($id) {
+
+ // edit a specific entry
+
+ $calendar_import = self::queryImportByID($request, $id);
+ if (!$calendar_import) {
+ return new Aphront404Response();
+ }
+
+ // pass the correct import engine to build the response
+ $engine->setImportEngine($calendar_import->getEngine());
+
+ } else {
+
+ // create an entry
+
$list_uri = $this->getApplicationURI('import/');
$import_type = $request->getStr('importType');
@@ -27,6 +42,18 @@ public function handleRequest(AphrontRequest $request) {
return $engine->buildResponse();
}
+ private static function queryImportByID(AphrontRequest $request, int $id) {
+ return id(new PhabricatorCalendarImportQuery())
+ ->setViewer($request->getViewer())
+ ->withIDs(array($id))
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ ))
+ ->executeOne();
+ }
+
private function buildEngineTypeResponse($cancel_uri) {
$import_engines = PhabricatorCalendarImportEngine::getAllImportEngines();
diff --git a/src/applications/calendar/editor/PhabricatorCalendarImportEditEngine.php b/src/applications/calendar/editor/PhabricatorCalendarImportEditEngine.php
index 7be3969671..9a4a7c0107 100644
--- a/src/applications/calendar/editor/PhabricatorCalendarImportEditEngine.php
+++ b/src/applications/calendar/editor/PhabricatorCalendarImportEditEngine.php
@@ -83,6 +83,12 @@ protected function buildCustomEditFields($object) {
$engine = $object->getEngine();
$can_trigger = $engine->supportsTriggers($object);
+ // calendar URI import
+ // note that it can contains a secret token
+ // if we are here you have enough privileges to edit and see the value
+ $uri_key = PhabricatorCalendarImportICSURITransaction::PARAMKEY_URI;
+ $uri = $object->getParameter($uri_key);
+
$fields = array(
id(new PhabricatorTextEditField())
->setKey('name')
@@ -94,6 +100,15 @@ protected function buildCustomEditFields($object) {
->setConduitTypeDescription(pht('New import name.'))
->setPlaceholder($object->getDisplayName())
->setValue($object->getName()),
+ id(new PhabricatorTextEditField())
+ ->setKey('uri')
+ ->setLabel(pht('URI'))
+ ->setDescription(pht('URI to import.'))
+ ->setTransactionType(
+ PhabricatorCalendarImportICSURITransaction::TRANSACTIONTYPE)
+ ->setConduitDescription(pht('URI to import.'))
+ ->setConduitTypeDescription(pht('New URI.'))
+ ->setValue($uri),
id(new PhabricatorBoolEditField())
->setKey('disabled')
->setOptions(pht('Active'), pht('Disabled'))
diff --git a/src/applications/calendar/query/PhabricatorCalendarEventQuery.php b/src/applications/calendar/query/PhabricatorCalendarEventQuery.php
index db50bb4d77..d20250e711 100644
--- a/src/applications/calendar/query/PhabricatorCalendarEventQuery.php
+++ b/src/applications/calendar/query/PhabricatorCalendarEventQuery.php
@@ -222,12 +222,16 @@ protected function loadPage() {
$limit = $this->getRecurrenceLimit($event, $raw_limit);
+ // note that this can be NULL for some imported events
$set = $event->newRecurrenceSet();
- $recurrences = $set->getEventsBetween(
- $start_date,
- $end_date,
- $limit + 1);
+ $recurrences = array();
+ if ($set) {
+ $recurrences = $set->getEventsBetween(
+ $start_date,
+ $end_date,
+ $limit + 1);
+ }
// We're generating events from the beginning and then filtering them
// here (instead of only generating events starting at the start date)
diff --git a/src/applications/celerity/postprocessor/CelerityDarkModePostprocessor.php b/src/applications/celerity/postprocessor/CelerityDarkModePostprocessor.php
index 39ee4be57a..31932352ef 100644
--- a/src/applications/celerity/postprocessor/CelerityDarkModePostprocessor.php
+++ b/src/applications/celerity/postprocessor/CelerityDarkModePostprocessor.php
@@ -15,13 +15,13 @@ public function buildVariables() {
return array(
// Fonts
- 'basefont' => "13px 'Segoe UI', 'Segoe UI Emoji', ".
- "'Segoe UI Symbol', 'Lato', 'Helvetica Neue', ".
- "Helvetica, Arial, sans-serif",
+ 'basefont' => "13px -apple-system, system-ui, BlinkMacSystemFont, ".
+ "'Segoe UI', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lato', ".
+ "'Helvetica Neue', Helvetica, Arial, sans-serif",
- 'fontfamily' => "'Segoe UI', 'Segoe UI Emoji', ".
- "'Segoe UI Symbol', 'Lato', 'Helvetica Neue', ".
- "Helvetica, Arial, sans-serif",
+ 'fontfamily' => "-apple-system, system-ui, BlinkMacSystemFont, ".
+ "'Segoe UI', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lato', ".
+ "'Helvetica Neue', Helvetica, Arial, sans-serif",
// Drop Shadow
'dropshadow' => '0 2px 12px rgba(0, 0, 0, .20)',
diff --git a/src/applications/celerity/postprocessor/CelerityDefaultPostprocessor.php b/src/applications/celerity/postprocessor/CelerityDefaultPostprocessor.php
index be039772c1..ff7e7f3668 100644
--- a/src/applications/celerity/postprocessor/CelerityDefaultPostprocessor.php
+++ b/src/applications/celerity/postprocessor/CelerityDefaultPostprocessor.php
@@ -20,13 +20,13 @@ public function buildDefaultPostprocessor() {
public function buildVariables() {
return array(
// Fonts
- 'basefont' => "13px 'Segoe UI', 'Segoe UI Emoji', ".
- "'Segoe UI Symbol', 'Lato', 'Helvetica Neue', ".
- "Helvetica, Arial, sans-serif",
+ 'basefont' => "13px -apple-system, system-ui, BlinkMacSystemFont, ".
+ "'Segoe UI', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lato', ".
+ "'Helvetica Neue', Helvetica, Arial, sans-serif",
- 'fontfamily' => "'Segoe UI', 'Segoe UI Emoji', ".
- "'Segoe UI Symbol', 'Lato', 'Helvetica Neue', ".
- "Helvetica, Arial, sans-serif",
+ 'fontfamily' => "-apple-system, system-ui, BlinkMacSystemFont, ".
+ "'Segoe UI', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lato', ".
+ "'Helvetica Neue', Helvetica, Arial, sans-serif",
// Drop Shadow
'dropshadow' => '0 2px 12px rgba(0, 0, 0, .20)',
diff --git a/src/applications/celerity/postprocessor/CelerityLargeFontPostprocessor.php b/src/applications/celerity/postprocessor/CelerityLargeFontPostprocessor.php
index 4dbe561951..1bc4e1cb3c 100644
--- a/src/applications/celerity/postprocessor/CelerityLargeFontPostprocessor.php
+++ b/src/applications/celerity/postprocessor/CelerityLargeFontPostprocessor.php
@@ -14,9 +14,9 @@ public function getPostprocessorName() {
public function buildVariables() {
return array(
- 'basefont' => "14px 'Segoe UI', 'Segoe UI Web Regular', ".
- "'Segoe UI Symbol', 'Lato', 'Helvetica Neue', Helvetica, ".
- "Arial, sans-serif",
+ 'basefont' => "14px -apple-system, system-ui, BlinkMacSystemFont, ".
+ "'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', 'Lato', ".
+ "'Helvetica Neue', Helvetica, Arial, sans-serif",
// Font Sizes
'biggestfontsize' => '16px',
diff --git a/src/applications/conduit/controller/PhabricatorConduitConsoleController.php b/src/applications/conduit/controller/PhabricatorConduitConsoleController.php
index 70a2253084..b3dfa805a2 100644
--- a/src/applications/conduit/controller/PhabricatorConduitConsoleController.php
+++ b/src/applications/conduit/controller/PhabricatorConduitConsoleController.php
@@ -247,6 +247,10 @@ private function buildMethodProperties(ConduitAPIMethod $method) {
));
}
+ $view->addProperty(
+ pht('Summary'),
+ $method->getMethodSummary());
+
$view->addProperty(
pht('Returns'),
$method->getReturnType());
diff --git a/src/applications/config/controller/PhabricatorConfigConsoleController.php b/src/applications/config/controller/PhabricatorConfigConsoleController.php
index bd23d6dde5..8d60459837 100644
--- a/src/applications/config/controller/PhabricatorConfigConsoleController.php
+++ b/src/applications/config/controller/PhabricatorConfigConsoleController.php
@@ -138,7 +138,7 @@ public function newLibraryVersionTable() {
private function loadVersions(PhabricatorUser $viewer) {
$specs = array(
- 'phabricator',
+ 'phorge',
'arcanist',
);
@@ -174,7 +174,14 @@ private function loadVersions(PhabricatorUser $viewer) {
// A repository may have a bunch of remotes, but we're only going to look
// for remotes we host to try to figure out where this repository branched.
- $upstream_pattern = '(github\.com/phacility/|secure\.phabricator\.com/)';
+ $upstream_pattern =
+ '('.
+ implode('|', array(
+ 'we\.phorge\.it/',
+ 'github\.com/phacility/',
+ 'secure\.phabricator\.com/',
+ )).
+ ')';
$upstream_futures = array();
$lib_upstreams = array();
diff --git a/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php b/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php
index 57f04e550b..6c499bf63a 100644
--- a/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php
+++ b/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php
@@ -94,10 +94,7 @@ public function getRoutes() {
'lint/' => array(
'(?P\d+)/' => 'HarbormasterLintMessagesController',
),
- 'hook/' => array(
- 'circleci/' => 'HarbormasterCircleCIHookController',
- 'buildkite/' => 'HarbormasterBuildkiteHookController',
- ),
+ 'hook/(?P[^/]+)/' => 'HarbormasterHookController',
'log/' => array(
'view/(?P\d+)/(?:\$(?P\d+(?:-\d+)?))?'
=> 'HarbormasterBuildLogViewController',
diff --git a/src/applications/harbormaster/controller/HarbormasterHookController.php b/src/applications/harbormaster/controller/HarbormasterHookController.php
new file mode 100644
index 0000000000..8eb442bc41
--- /dev/null
+++ b/src/applications/harbormaster/controller/HarbormasterHookController.php
@@ -0,0 +1,21 @@
+getURIData('handler');
+ $handler = HarbormasterHookHandler::getHandler($name);
+
+ if (!$handler) {
+ throw new Exception(pht('No handler found for %s', $name));
+ }
+
+ return $handler->handleRequest($request);
+ }
+
+}
diff --git a/src/applications/harbormaster/integration/HarbormasterHookHandler.php b/src/applications/harbormaster/integration/HarbormasterHookHandler.php
new file mode 100644
index 0000000000..5b4aafa612
--- /dev/null
+++ b/src/applications/harbormaster/integration/HarbormasterHookHandler.php
@@ -0,0 +1,27 @@
+setAncestorClass(__CLASS__)
+ ->setUniqueMethod('getName')
+ ->execute();
+ }
+
+ public static function getHandler($handler) {
+ $base = idx(self::getHandlers(), $handler);
+
+ if ($base) {
+ return (clone $base);
+ }
+
+ return null;
+ }
+
+ abstract public function getName();
+
+ abstract public function handleRequest(AphrontRequest $request);
+
+}
diff --git a/src/applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php b/src/applications/harbormaster/integration/buildkite/HarbormasterBuildkiteBuildStepImplementation.php
similarity index 100%
rename from src/applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php
rename to src/applications/harbormaster/integration/buildkite/HarbormasterBuildkiteBuildStepImplementation.php
diff --git a/src/applications/harbormaster/controller/HarbormasterBuildkiteHookController.php b/src/applications/harbormaster/integration/buildkite/HarbormasterBuildkiteHookHandler.php
similarity index 95%
rename from src/applications/harbormaster/controller/HarbormasterBuildkiteHookController.php
rename to src/applications/harbormaster/integration/buildkite/HarbormasterBuildkiteHookHandler.php
index df50ea9126..2a29ceffa0 100644
--- a/src/applications/harbormaster/controller/HarbormasterBuildkiteHookController.php
+++ b/src/applications/harbormaster/integration/buildkite/HarbormasterBuildkiteHookHandler.php
@@ -1,10 +1,10 @@
getSetting('uri');
+ if ($uri) {
+ $domain = id(new PhutilURI($uri))->getDomain();
+ }
+
+ $method = $this->formatSettingForDescription('method', 'POST');
+ $domain = $this->formatValueForDescription($domain);
+
+ if ($this->getSetting('credential')) {
+ return pht(
+ 'Make an authenticated HTTP %s request to %s.',
+ $method,
+ $domain);
+ } else {
+ return pht(
+ 'Make an HTTP %s request to %s.',
+ $method,
+ $domain);
+ }
+ }
+
+ public function execute(
+ HarbormasterBuild $build,
+ HarbormasterBuildTarget $build_target) {
+
+ $viewer = PhabricatorUser::getOmnipotentUser();
+ $settings = $this->getSettings();
+ $variables = $build_target->getVariables();
+
+ $uri = $this->mergeVariables(
+ 'vurisprintf',
+ $settings['uri'],
+ $variables);
+
+ $method = nonempty(idx($settings, 'method'), 'POST');
+
+ $content = $this->mergeVariables(
+ 'vcsprintf',
+ $settings['content'],
+ $variables);
+ $content = preg_replace ( "/'/", "", $content);
+
+ $future = id(new HTTPSFuture($uri))
+ ->setMethod($method)
+ ->setTimeout(60);
+ if(strlen(trim($content))>0)
+ {
+ $future->write(trim($content));
+ }
+ $credential_phid = $this->getSetting('credential');
+ if ($credential_phid) {
+ $key = PassphrasePasswordKey::loadFromPHID(
+ $credential_phid,
+ $viewer);
+ $future->setHTTPBasicAuthCredentials(
+ $key->getUsernameEnvelope()->openEnvelope(),
+ $key->getPasswordEnvelope());
+ }
+
+ $this->resolveFutures(
+ $build,
+ $build_target,
+ array($future));
+
+ $this->logHTTPResponse($build, $build_target, $future, $uri);
+
+ list($status) = $future->resolve();
+ if ($status->isError()) {
+ throw new HarbormasterBuildFailureException();
+ }
+ }
+
+ public function getFieldSpecifications() {
+ return array(
+ 'uri' => array(
+ 'name' => pht('URI'),
+ 'type' => 'text',
+ 'required' => true,
+ ),
+ 'method' => array(
+ 'name' => pht('HTTP Method'),
+ 'type' => 'select',
+ 'options' => array_fuse(array('POST')),
+ ),
+ 'content' => array(
+ 'name' => pht('Content'),
+ 'type' => 'text',
+ 'required' => true,
+ ),
+ 'credential' => array(
+ 'name' => pht('Credentials'),
+ 'type' => 'credential',
+ 'credential.type'
+ => PassphrasePasswordCredentialType::CREDENTIAL_TYPE,
+ 'credential.provides'
+ => PassphrasePasswordCredentialType::PROVIDES_TYPE,
+ ),
+ );
+ }
+
+ public function supportsWaitForMessage() {
+ return true;
+ }
+
+}
diff --git a/src/applications/legalpad/conduit/LegalpadDocumentSearchConduitAPIMethod.php b/src/applications/legalpad/conduit/LegalpadDocumentSearchConduitAPIMethod.php
new file mode 100644
index 0000000000..bb94c48536
--- /dev/null
+++ b/src/applications/legalpad/conduit/LegalpadDocumentSearchConduitAPIMethod.php
@@ -0,0 +1,18 @@
+needDocumentBodies(true);
+ }
+
+ public function getAttachmentForObject($object, $data, $spec) {
+ return array(
+ 'body' => $object->getDocumentBody()->getText(),
+ 'preamble' => $object->getPreamble(),
+ );
+ }
+
+}
diff --git a/src/applications/legalpad/engineextension/PhabricatorLegalpadSignaturesSearchEngineAttachment.php b/src/applications/legalpad/engineextension/PhabricatorLegalpadSignaturesSearchEngineAttachment.php
new file mode 100644
index 0000000000..9904951c68
--- /dev/null
+++ b/src/applications/legalpad/engineextension/PhabricatorLegalpadSignaturesSearchEngineAttachment.php
@@ -0,0 +1,38 @@
+needSignatures(true);
+ }
+
+ public function getAttachmentForObject($object, $data, $spec) {
+ $signatures = array();
+ foreach ($object->getSignatures() as $signature) {
+ $signatures[] = array(
+ 'phid' => $signature->getPHID(),
+ 'signerPHID' => $signature->getSignerPHID(),
+ 'exemptionPHID' => $signature->getExemptionPHID(),
+ 'isExemption' => $signature->getIsExemption(),
+ 'signerName' => $signature->getSignerName(),
+ 'signerEmail' => $signature->getSignerEmail(),
+ 'documentVersion' => $signature->getDocumentVersion(),
+ 'dateCreated' => (int)$signature->getDateCreated(),
+ );
+ }
+
+ return array(
+ 'signatures' => $signatures,
+ );
+ }
+
+}
diff --git a/src/applications/legalpad/phid/PhabricatorLegalpadDocumentSignaturePHIDType.php b/src/applications/legalpad/phid/PhabricatorLegalpadDocumentSignaturePHIDType.php
new file mode 100644
index 0000000000..782dbf13aa
--- /dev/null
+++ b/src/applications/legalpad/phid/PhabricatorLegalpadDocumentSignaturePHIDType.php
@@ -0,0 +1,47 @@
+withPHIDs($phids);
+ }
+
+ public function loadHandles(
+ PhabricatorHandleQuery $query,
+ array $handles,
+ array $objects) {
+
+ foreach ($handles as $phid => $handle) {
+ $sig = $objects[$phid];
+ $id = $sig->getID();
+ $handle->setName('Signature '.$id);
+
+ $signer_name = $sig->getSignerName();
+ $handle->setFullName("Signature {$id} by {$signer_name}");
+ $handle->setURI("/legalpad/signature/{$id}");
+ }
+ }
+}
diff --git a/src/applications/legalpad/query/LegalpadDocumentSignatureQuery.php b/src/applications/legalpad/query/LegalpadDocumentSignatureQuery.php
index c310dd3d64..f8ee72c913 100644
--- a/src/applications/legalpad/query/LegalpadDocumentSignatureQuery.php
+++ b/src/applications/legalpad/query/LegalpadDocumentSignatureQuery.php
@@ -4,6 +4,7 @@ final class LegalpadDocumentSignatureQuery
extends PhabricatorCursorPagedPolicyAwareQuery {
private $ids;
+ private $phids;
private $documentPHIDs;
private $signerPHIDs;
private $documentVersions;
@@ -16,6 +17,11 @@ public function withIDs(array $ids) {
return $this;
}
+ public function withPHIDs(array $phids) {
+ $this->phids = $phids;
+ return $this;
+ }
+
public function withDocumentPHIDs(array $phids) {
$this->documentPHIDs = $phids;
return $this;
@@ -46,20 +52,14 @@ public function withEmailContains($text) {
return $this;
}
- protected function loadPage() {
- $table = new LegalpadDocumentSignature();
- $conn_r = $table->establishConnection('r');
-
- $data = queryfx_all(
- $conn_r,
- 'SELECT * FROM %T %Q %Q %Q',
- $table->getTableName(),
- $this->buildWhereClause($conn_r),
- $this->buildOrderClause($conn_r),
- $this->buildLimitClause($conn_r));
+ public function newResultObject() {
+ return new LegalpadDocumentSignature();
+ }
+ protected function loadPage() {
+ $table = $this->newResultObject();
+ $data = $this->loadStandardPageRows($table);
$signatures = $table->loadAllFromArray($data);
-
return $signatures;
}
@@ -98,6 +98,13 @@ protected function buildWhereClause(AphrontDatabaseConnection $conn) {
$this->ids);
}
+ if ($this->phids !== null) {
+ $where[] = qsprintf(
+ $conn,
+ 'phid IN (%Ls)',
+ $this->phids);
+ }
+
if ($this->documentPHIDs !== null) {
$where[] = qsprintf(
$conn,
diff --git a/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php b/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php
index ea14fd4a2f..14ebca9d04 100644
--- a/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php
+++ b/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php
@@ -5,6 +5,75 @@ final class LegalpadDocumentSignatureSearchEngine
private $document;
+ public function newQuery() {
+ return new LegalpadDocumentSignatureQuery();
+ }
+
+ protected function buildCustomSearchFields() {
+ return array(
+ id(new PhabricatorUsersSearchField())
+ ->setLabel(pht('Signed By'))
+ ->setKey('signerPHIDs')
+ ->setAliases(array('signer', 'signers', 'signerPHID'))
+ ->setDescription(
+ pht('Search for signatures by given users.')),
+ id(new PhabricatorPHIDsSearchField())
+ ->setLabel(pht('Documents'))
+ ->setKey('documentPHIDs')
+ ->setAliases(array('document', 'documents', 'documentPHID'))
+ ->setDescription(
+ pht('Search for signatures on the given documents')),
+ id(new PhabricatorSearchTextField())
+ ->setLabel(pht('Name Contains'))
+ ->setKey('nameContains')
+ ->setDescription(
+ pht('Search for signatures with a name containing the '.
+ 'given string.')),
+ id(new PhabricatorSearchTextField())
+ ->setLabel(pht('Email Contains'))
+ ->setKey('emailContains')
+ ->setDescription(
+ pht('Search for signatures with an email containing the '.
+ 'given string.')),
+ id(new PhabricatorSearchDateField())
+ ->setLabel(pht('Created After'))
+ ->setKey('createdStart'),
+ id(new PhabricatorSearchDateField())
+ ->setLabel(pht('Created Before'))
+ ->setKey('createdEnd'),
+ );
+ }
+
+ protected function buildQueryFromParameters(array $map) {
+ $query = $this->newQuery();
+
+ if ($map['signerPHIDs']) {
+ $query->withSignerPHIDs($map['signerPHIDs']);
+ }
+
+ if ($map['documentPHIDs']) {
+ $query->withDocumentPHIDs($map['documentPHIDs']);
+ }
+
+ if ($map['createdStart']) {
+ $query->withDateCreatedAfter($map['createdStart']);
+ }
+
+ if ($map['createdEnd']) {
+ $query->withDateCreatedAfter($map['createdStart']);
+ }
+
+ if ($map['nameContains']) {
+ $query->withNameContains($map['nameContains']);
+ }
+
+ if ($map['emailContains']) {
+ $query->withEmailContains($map['emailContains']);
+ }
+
+ return $query;
+ }
+
public function getResultTypeDescription() {
return pht('Legalpad Signatures');
}
diff --git a/src/applications/legalpad/storage/LegalpadDocument.php b/src/applications/legalpad/storage/LegalpadDocument.php
index efcd6b5f15..e3245532e8 100644
--- a/src/applications/legalpad/storage/LegalpadDocument.php
+++ b/src/applications/legalpad/storage/LegalpadDocument.php
@@ -5,7 +5,8 @@ final class LegalpadDocument extends LegalpadDAO
PhabricatorPolicyInterface,
PhabricatorSubscribableInterface,
PhabricatorApplicationTransactionInterface,
- PhabricatorDestructibleInterface {
+ PhabricatorDestructibleInterface,
+ PhabricatorConduitResultInterface {
protected $title;
protected $contributorCount;
@@ -159,6 +160,10 @@ public function getSignatureTypeIcon() {
return idx($map, $type, 'fa-user grey');
}
+ public function getPreamble() {
+ return $this->preamble;
+ }
+
/* -( PhabricatorSubscribableInterface )----------------------------------- */
@@ -167,6 +172,48 @@ public function isAutomaticallySubscribed($phid) {
return ($this->creatorPHID == $phid);
}
+/* -( PhabricatorConduitResultInterface )---------------------------------- */
+
+ public function getFieldSpecificationsForConduit() {
+ return array(
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('title')
+ ->setType('string')
+ ->setDescription(pht('The title of this document')),
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('creatorPHID')
+ ->setType('phid')
+ ->setDescription(pht('This user who created this document')),
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('versions')
+ ->setType('int')
+ ->setDescription(pht('The number of versions of this document')),
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('requireSignature')
+ ->setType('bool')
+ ->setDescription(pht(
+ 'Whether signatures on this doc are required to use this install')),
+ );
+ }
+
+ public function getFieldValuesForConduit() {
+ return array(
+ 'title' => $this->title,
+ 'creatorPHID' => $this->creatorPHID,
+ 'versions' => $this->versions,
+ 'requireSignature' => (bool)$this->requireSignature,
+ );
+ }
+
+ public function getConduitSearchAttachments() {
+ return array(
+ id(new PhabricatorLegalpadBodySearchEngineAttachment())
+ ->setAttachmentKey('body'),
+ id(new PhabricatorLegalpadSignaturesSearchEngineAttachment())
+ ->setAttachmentKey('signatures'),
+ );
+ }
+
/* -( PhabricatorPolicyInterface )----------------------------------------- */
diff --git a/src/applications/legalpad/storage/LegalpadDocumentSignature.php b/src/applications/legalpad/storage/LegalpadDocumentSignature.php
index 1cd0875dda..308d51ff2a 100644
--- a/src/applications/legalpad/storage/LegalpadDocumentSignature.php
+++ b/src/applications/legalpad/storage/LegalpadDocumentSignature.php
@@ -2,7 +2,9 @@
final class LegalpadDocumentSignature
extends LegalpadDAO
- implements PhabricatorPolicyInterface {
+ implements
+ PhabricatorPolicyInterface,
+ PhabricatorConduitResultInterface {
const VERIFIED = 0;
const UNVERIFIED = 1;
@@ -23,6 +25,7 @@ final class LegalpadDocumentSignature
protected function getConfiguration() {
return array(
+ self::CONFIG_AUX_PHID => true,
self::CONFIG_SERIALIZATION => array(
'signatureData' => self::SERIALIZATION_JSON,
),
@@ -51,6 +54,14 @@ protected function getConfiguration() {
) + parent::getConfiguration();
}
+ public function getPHIDType() {
+ return PhabricatorLegalpadDocumentSignaturePHIDType::TYPECONST;
+ }
+
+ public function generatePHID() {
+ return PhabricatorPHID::generateNewPHID($this->getPHIDType());
+ }
+
public function save() {
if (!$this->getSecretKey()) {
$this->setSecretKey(Filesystem::readRandomCharacters(20));
@@ -71,6 +82,76 @@ public function attachDocument(LegalpadDocument $document) {
return $this;
}
+ public function getSignerPHID() {
+ return $this->signerPHID;
+ }
+
+ public function getIsExemption() {
+ return (bool)$this->isExemption;
+ }
+
+ public function getExemptionPHID() {
+ return $this->exemptionPHID;
+ }
+
+ public function getSignerName() {
+ return $this->signerName;
+ }
+
+ public function getSignerEmail() {
+ return $this->signerEmail;
+ }
+
+ public function getDocumentVersion() {
+ return (int)$this->documentVersion;
+ }
+
+/* -( PhabricatorConduitResultInterface )---------------------------------- */
+
+ public function getFieldSpecificationsForConduit() {
+ return array(
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('documentPHID')
+ ->setType('phid')
+ ->setDescription(pht('The PHID of the document')),
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('signerPHID')
+ ->setType('phid?')
+ ->setDescription(pht('The PHID of the signer')),
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('exemptionPHID')
+ ->setType('phid?')
+ ->setDescription(pht('The PHID of the user who granted the exemption')),
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('signerName')
+ ->setType('string')
+ ->setDescription(pht('The name used by the signer.')),
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('signerEmail')
+ ->setType('string')
+ ->setDescription(pht('The email used by the signer.')),
+ id(new PhabricatorConduitSearchFieldSpecification())
+ ->setKey('isExemption')
+ ->setType('bool')
+ ->setDescription(pht('Whether or not this signature is an exemption')),
+ );
+ }
+
+ public function getFieldValuesForConduit() {
+ return array(
+ 'documentPHID' => $this->getDocumentPHID(),
+ 'signerPHID' => $this->getSignerPHID(),
+ 'exemptionPHID' => $this->getExemptionPHID(),
+ 'signerName' => $this->getSignerName(),
+ 'signerEmail' => $this->getSignerEmail(),
+ 'isExemption' => $this->getIsExemption(),
+ );
+ }
+
+ public function getConduitSearchAttachments() {
+ return array();
+ }
+
/* -( PhabricatorPolicyInterface )----------------------------------------- */
diff --git a/src/applications/passphrase/controller/PassphraseCredentialEditController.php b/src/applications/passphrase/controller/PassphraseCredentialEditController.php
index a3a346c20f..7247321648 100644
--- a/src/applications/passphrase/controller/PassphraseCredentialEditController.php
+++ b/src/applications/passphrase/controller/PassphraseCredentialEditController.php
@@ -45,6 +45,12 @@ public function handleRequest(AphrontRequest $request) {
// Prefill username if provided.
$credential->setUsername((string)$request->getStr('username'));
+ // Prefill name if provided.
+ $credential->setName((string)$request->getStr('name'));
+
+ // Prefill description if provided.
+ $credential->setDescription((string)$request->getStr('description'));
+
if (!$request->getStr('isInitialized')) {
$type->didInitializeNewCredential($viewer, $credential);
}
diff --git a/src/applications/passphrase/storage/PassphraseCredential.php b/src/applications/passphrase/storage/PassphraseCredential.php
index c470ea661f..d180fc6b31 100644
--- a/src/applications/passphrase/storage/PassphraseCredential.php
+++ b/src/applications/passphrase/storage/PassphraseCredential.php
@@ -5,6 +5,7 @@ final class PassphraseCredential extends PassphraseDAO
PhabricatorApplicationTransactionInterface,
PhabricatorPolicyInterface,
PhabricatorFlaggableInterface,
+ PhabricatorMentionableInterface,
PhabricatorSubscribableInterface,
PhabricatorDestructibleInterface,
PhabricatorSpacesInterface,
diff --git a/src/applications/people/application/PhabricatorPeopleApplication.php b/src/applications/people/application/PhabricatorPeopleApplication.php
index 86c03fdf4b..5af41d87c3 100644
--- a/src/applications/people/application/PhabricatorPeopleApplication.php
+++ b/src/applications/people/application/PhabricatorPeopleApplication.php
@@ -78,6 +78,8 @@ public function getRoutes() {
'PhabricatorPeopleProfilePictureController',
'manage/(?P[1-9]\d*)/' =>
'PhabricatorPeopleProfileManageController',
+ 'time/(?P[1-9]\d*)/' =>
+ 'PhabricatorPeopleProfileTimeController',
),
'/p/(?P[\w._-]+)/' => array(
'' => 'PhabricatorPeopleProfileViewController',
diff --git a/src/applications/people/controller/PhabricatorPeopleProfileTimeController.php b/src/applications/people/controller/PhabricatorPeopleProfileTimeController.php
new file mode 100644
index 0000000000..f0c444c15f
--- /dev/null
+++ b/src/applications/people/controller/PhabricatorPeopleProfileTimeController.php
@@ -0,0 +1,153 @@
+getViewer();
+ $id = $request->getURIData('id');
+
+ $user = id(new PhabricatorPeopleQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($id))
+ ->needProfile(true)
+ ->needUserSettings(true)
+ ->needProfileImage(true)
+ ->needAvailability(true)
+ ->executeOne();
+ if (!$user) {
+ return new Aphront404Response();
+ }
+
+ $class = 'PhabricatorPhrequentApplication';
+ if (!PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) {
+ return new Aphront404Response();
+ }
+
+ $this->setUser($user);
+ $title = array(pht('Time logging'), $user->getUsername());
+ $header = $this->buildProfileHeader();
+ $timelogs = $this->buildTimeLogView($user);
+
+ $crumbs = $this->buildApplicationCrumbs();
+ $crumbs->addTextCrumb(pht('Recent timelogs'));
+ $crumbs->setBorder(true);
+
+ $navigation = $this->newNavigation(
+ $user,
+ PhabricatorPeopleProfileMenuEngine::ITEM_TIME);
+
+ $view = id(new PHUITwoColumnView())
+ ->setHeader($header)
+ ->addClass('project-view-home')
+ ->addClass('project-view-people-home')
+ ->setFooter(array(
+ $timelogs,
+ ));
+
+ return $this->newPage()
+ ->setTitle($title)
+ ->setCrumbs($crumbs)
+ ->setNavigation($navigation)
+ ->appendChild($view);
+ }
+
+ private function buildTimeLogView(PhabricatorUser $user) {
+
+ $request = id(new PhrequentUserTimeQuery())
+ ->withUserPHIDs(array($user->getPHID()))
+ ->setLimit(100)
+ ->setViewer($user)
+ ->needPreemptingEvents(true);
+
+ $usertimes = $request->execute();
+
+ $view = id(new PHUIObjectItemListView())
+ ->setUser($user);
+
+ $handles = array();
+ foreach ($usertimes as $usertime) {
+ $item = new PHUIObjectItemView();
+ if ($usertime->getObjectPHID() === null) {
+ $item->setHeader($usertime->getNote());
+ }
+ $item->setObject($usertime);
+
+ $block = new PhrequentTimeBlock(array($usertime));
+ $time_spent = $block->getTimeSpentOnObject(
+ $usertime->getObjectPHID(),
+ PhabricatorTime::getNow());
+
+ $time_spent = $time_spent == 0 ? 'none' :
+ phutil_format_relative_time_detailed($time_spent);
+
+ if ($usertime->getDateEnded() !== null) {
+ $item->addAttribute(
+ pht(
+ 'Tracked %s',
+ $time_spent));
+ $item->addAttribute(
+ pht(
+ 'Started on %s',
+ phabricator_datetime($usertime->getDateStarted(), $user)));
+
+ $item->addAttribute(
+ pht(
+ 'Ended on %s',
+ phabricator_datetime($usertime->getDateEnded(), $user)));
+
+ if ($usertime->getObjectPHID() !== null &&
+ $usertime->getUserPHID() === $user->getPHID()) {
+ $back_uri = '/';
+ if ($this->getRequest() !== null) {
+ $back_uri = $this->getRequest()->GetPath();
+ }
+ $uri = new PhutilURI('/phrequent/track/delete/'.
+ $usertime->getObjectPHID().'/');
+ $parameters = array();
+ $parameters['__back__'] = $back_uri;
+ $parameters['__timelog_id__'] = $usertime->getID();
+ $uri->setQueryParams($parameters);
+ $href = $uri->__toString();
+
+ $item->addAction(
+ id(new PHUIListItemView())
+ ->setIcon('fa-trash')
+ ->addSigil('phrequent-delete-worklog')
+ ->setWorkflow(true)
+ ->setRenderNameAsTooltip(true)
+ ->setName(pht('Delete'))
+ ->setHref($href));
+ }
+
+ } else {
+ $item->addAttribute(
+ pht(
+ 'Tracked %s so far',
+ $time_spent));
+ if ($usertime->getObjectPHID() !== null &&
+ $usertime->getUserPHID() === $viewer->getPHID()) {
+ $item->addAction(
+ id(new PHUIListItemView())
+ ->setIcon('fa-stop')
+ ->addSigil('phrequent-stop-tracking')
+ ->setWorkflow(true)
+ ->setRenderNameAsTooltip(true)
+ ->setName(pht('Stop'))
+ ->setHref(
+ '/phrequent/track/stop/'.
+ $usertime->getObjectPHID().'/'));
+ }
+ $item->setStatusIcon('fa-clock-o green');
+ }
+
+ $view->addItem($item);
+ }
+ return $view;
+
+ }
+}
diff --git a/src/applications/people/controller/PhabricatorPeopleProfileViewController.php b/src/applications/people/controller/PhabricatorPeopleProfileViewController.php
index b929d980d5..31446bad40 100644
--- a/src/applications/people/controller/PhabricatorPeopleProfileViewController.php
+++ b/src/applications/people/controller/PhabricatorPeopleProfileViewController.php
@@ -3,10 +3,6 @@
final class PhabricatorPeopleProfileViewController
extends PhabricatorPeopleProfileController {
- public function shouldAllowPublic() {
- return true;
- }
-
public function handleRequest(AphrontRequest $request) {
$viewer = $this->getViewer();
$username = $request->getURIData('username');
diff --git a/src/applications/people/engine/PhabricatorPeopleProfileMenuEngine.php b/src/applications/people/engine/PhabricatorPeopleProfileMenuEngine.php
index 6d6d239f5b..e7151190eb 100644
--- a/src/applications/people/engine/PhabricatorPeopleProfileMenuEngine.php
+++ b/src/applications/people/engine/PhabricatorPeopleProfileMenuEngine.php
@@ -10,6 +10,7 @@ final class PhabricatorPeopleProfileMenuEngine
const ITEM_TASKS = 'people.tasks';
const ITEM_COMMITS = 'people.commits';
const ITEM_REVISIONS = 'people.revisions';
+ const ITEM_TIME = 'people.time';
protected function isMenuEngineConfigurable() {
return false;
@@ -76,6 +77,9 @@ protected function getBuiltinProfileItems($object) {
->setBuiltinKey(self::ITEM_MANAGE)
->setMenuItemKey(PhabricatorPeopleManageProfileMenuItem::MENUITEMKEY);
+ $items[] = $this->newItem()
+ ->setBuiltinKey(self::ITEM_TIME)
+ ->setMenuItemKey(PhabricatorPeopleTimeProfileMenuItem::MENUITEMKEY);
return $items;
}
diff --git a/src/applications/people/menuitem/PhabricatorPeopleTimeProfileMenuItem.php b/src/applications/people/menuitem/PhabricatorPeopleTimeProfileMenuItem.php
new file mode 100644
index 0000000000..0b65292b79
--- /dev/null
+++ b/src/applications/people/menuitem/PhabricatorPeopleTimeProfileMenuItem.php
@@ -0,0 +1,72 @@
+getProfileObject();
+ $id = $user->getID();
+
+ $item = $this->newItemView()
+ ->setURI("/people/time/{$id}/")
+ ->setName($this->getDisplayName($config))
+ ->setIcon('clock-o');
+
+ return array(
+ $item,
+ );
+ }
+
+ public function getMenuItemTypeName() {
+ return pht('Time');
+ }
+
+ private function getDefaultName() {
+ return pht('Time');
+ }
+
+ public function canHideMenuItem(
+ PhabricatorProfileMenuItemConfiguration $config) {
+ return true;
+ }
+
+ public function getDisplayName(
+ PhabricatorProfileMenuItemConfiguration $config) {
+ $name = $config->getMenuItemProperty('name');
+
+ if (strlen($name)) {
+ return $name;
+ }
+ return $this->getDefaultName();
+ }
+
+ public function buildEditEngineFields(
+ PhabricatorProfileMenuItemConfiguration $config) {
+ return array(
+ id(new PhabricatorTextEditField())
+ ->setKey('name')
+ ->setLabel(pht('Name'))
+ ->setPlaceholder($this->getDefaultName())
+ ->setValue($config->getMenuItemProperty('name')),
+ );
+ }
+
+ protected function newNavigationMenuItems(
+ PhabricatorProfileMenuItemConfiguration $config) {
+
+ $user = $config->getProfileObject();
+ $id = $user->getID();
+
+ $item = $this->newItemView()
+ ->setURI("/people/time/{$id}/")
+ ->setName($this->getDisplayName($config))
+ ->setIcon('clock-o');
+
+ return array(
+ $item,
+ );
+ }
+}
diff --git a/src/applications/people/storage/PhabricatorUser.php b/src/applications/people/storage/PhabricatorUser.php
index 7276253085..5edfb2d537 100644
--- a/src/applications/people/storage/PhabricatorUser.php
+++ b/src/applications/people/storage/PhabricatorUser.php
@@ -321,12 +321,28 @@ private function generateConduitCertificate() {
const EMAIL_CYCLE_FREQUENCY = 86400;
const EMAIL_TOKEN_LENGTH = 24;
+ /**
+ * This function removes the blurb from a profile.
+ * This is an incredibly broad hammer to handle some spam on the upstream,
+ * which will be refined later.
+ *
+ * @return void
+ */
+ private function cleanUpProfile() {
+ $this->profile->setBlurb('');
+ }
+
public function getUserProfile() {
return $this->assertAttached($this->profile);
}
public function attachUserProfile(PhabricatorUserProfile $profile) {
$this->profile = $profile;
+
+ if ($this->isDisabled) {
+ $this->cleanUpProfile();
+ }
+
return $this;
}
@@ -343,6 +359,10 @@ public function loadUserProfile() {
$this->profile = PhabricatorUserProfile::initializeNewProfile($this);
}
+ if ($this->isDisabled) {
+ $this->cleanUpProfile();
+ }
+
return $this->profile;
}
diff --git a/src/applications/pholio/xaction/PholioImageFileTransaction.php b/src/applications/pholio/xaction/PholioImageFileTransaction.php
index e18fca28e2..ce1a0e9773 100644
--- a/src/applications/pholio/xaction/PholioImageFileTransaction.php
+++ b/src/applications/pholio/xaction/PholioImageFileTransaction.php
@@ -110,9 +110,11 @@ public function extractFilePHIDs($object, $value) {
$new_phids = $value;
$file_phids = array();
- foreach ($new_phids as $phid) {
- $file_phids[] = $editor->loadPholioImage($object, $phid)
- ->getFilePHID();
+ foreach ($new_phids as $phids) {
+ foreach ($phids as $phid) {
+ $file_phids[] = $editor->loadPholioImage($object, $phid)
+ ->getFilePHID();
+ }
}
return $file_phids;
diff --git a/src/applications/phrequent/conduit/PhrequentTimespendConduitAPIMethod.php b/src/applications/phrequent/conduit/PhrequentTimespendConduitAPIMethod.php
new file mode 100644
index 0000000000..08108fffc4
--- /dev/null
+++ b/src/applications/phrequent/conduit/PhrequentTimespendConduitAPIMethod.php
@@ -0,0 +1,61 @@
+ 'required phid',
+ 'startTime' => 'required int',
+ 'worklog' => 'required text',
+ 'notes' => 'text',
+ );
+ }
+
+ protected function defineReturnType() {
+ return 'phid';
+ }
+
+ protected function execute(ConduitAPIRequest $request) {
+ $user = $request->getUser();
+ $object_phid = $request->getValue('objectPHID');
+ $start_timestamp = $request->getValue('startTime');
+ $worklog = $request->getValue('worklog');
+ $notes = $request->getValue('notes');
+
+ if (strlen($worklog) > 0) {
+ $worklog_parser = new WorklogParser(
+ $start_timestamp->getEpoch(),
+ $worklog);
+ $parse_error = $worklog_parser->getError();
+ if (strlen($parse_error) > 0) {
+ return array('ERR_WORKLOG_PARSER' => pht('Syntax error'));
+ } else {
+ $editor = new PhrequentTrackingEditor();
+ return $editor->addWorklog(
+ $user,
+ $object_phid,
+ $start_timestamp,
+ $worklog);
+ }
+
+ } else {
+ return array('ERR_WORKLOG_PARSER' => pht('Empty worklog'));
+ }
+ }
+}
diff --git a/src/applications/phrequent/controller/PhrequentTrackController.php b/src/applications/phrequent/controller/PhrequentTrackController.php
index de0b75324c..1283dd16e9 100644
--- a/src/applications/phrequent/controller/PhrequentTrackController.php
+++ b/src/applications/phrequent/controller/PhrequentTrackController.php
@@ -1,174 +1,289 @@
phid = $data['phid'];
$this->verb = $data['verb'];
}
- public function processRequest() {
- $request = $this->getRequest();
- $viewer = $request->getUser();
+ public function processRequest ()
+ {
+ $request = $this->getRequest ();
+ $viewer = $request->getUser ();
+
$phid = $this->phid;
- $handle = id(new PhabricatorHandleQuery())
- ->setViewer($viewer)
- ->withPHIDs(array($phid))
- ->executeOne();
- $done_uri = $handle->getURI();
+ $handle =
+ id (new PhabricatorHandleQuery ())->setViewer ($viewer)->
+ withPHIDs (array ($phid))->executeOne ();
+ $done_uri = $handle->getURI ();
$current_timer = null;
- switch ($this->verb) {
+ switch ($this->verb)
+ {
case 'start':
- $button_text = pht('Start Tracking');
- $title_text = pht('Start Tracking Time');
- $inner_text = pht('What time did you start working?');
- $action_text = pht('Start Timer');
- $label_text = pht('Start Time');
+ $button_text = pht ('Start Tracking');
+ $title_text = pht ('Start Tracking Time');
+ $inner_text = pht ('What time did you start working?');
+ $ok_button_text = pht ('Start Timer');
+ $label_text = pht ('Start Time');
+ break;
+
+ case 'worklog':
+ $button_text = pht ('Add Worklog');
+ $title_text = pht ('Add Worklog');
+ $inner_text = pht ('When did you start ');
+ $inner_text .= pht('and how long did you worked on current item?');
+ // $inner_text .= pht('You can log weeks, ').
+ // pht('days, hours and minutes using');
+ // $inner_text .= pht(' one digit and one letter for each').
+ // pth((, ex. 1w2d5h30m');
+ $inner_text .= pht('You can log hours and minutes using');
+ $inner_text .= pht(' one digit and one letter for each, ex. 5h30m');
+ $ok_button_text = pht ('Add worklog');
+ $label_text = pht ('Start Time');
+ $worklog_action_text = pht ('Worklog');
break;
+
case 'stop':
- $button_text = pht('Stop Tracking');
- $title_text = pht('Stop Tracking Time');
- $inner_text = pht('What time did you stop working?');
- $action_text = pht('Stop Timer');
- $label_text = pht('Stop Time');
-
-
- $current_timer = id(new PhrequentUserTimeQuery())
- ->setViewer($viewer)
- ->withUserPHIDs(array($viewer->getPHID()))
- ->withObjectPHIDs(array($phid))
- ->withEnded(PhrequentUserTimeQuery::ENDED_NO)
- ->executeOne();
- if (!$current_timer) {
- return $this->newDialog()
- ->setTitle(pht('Not Tracking Time'))
- ->appendParagraph(
- pht('You are not currently tracking time on this object.'))
- ->addCancelButton($done_uri);
- }
+ $button_text = pht ('Stop Tracking');
+ $title_text = pht ('Stop Tracking Time');
+ $inner_text = pht ('What time did you stop working?');
+ $ok_button_text = pht ('Stop timer');
+ $label_text = pht ('Stop Time');
+
+
+ $current_timer =
+ id (new PhrequentUserTimeQuery ())->setViewer ($viewer)->
+ withUserPHIDs (array ($viewer->getPHID ()))->
+ withObjectPHIDs (array ($phid))->
+ withEnded (PhrequentUserTimeQuery::ENDED_NO)->executeOne ();
+ if (!$current_timer)
+ {
+ return $this->newDialog ()->setTitle (pht ('Not Tracking Time'))->
+ appendParagraph (pht
+ ('You are not currently tracking time on this object.'))->
+ addCancelButton ($done_uri);
+ }
+ break;
+
+ case 'delete':
+
+ $request_data = $request->getRequestData();
+ $timelog_id = $request_data['__timelog_id__'];
+ $query = new PhrequentUserTimeQuery();
+ $query->withIDs(array($timelog_id));
+ $query->setViewer($viewer);
+ $usertime = $query->executeOne();
+
+ if ($usertime !== null) {
+ if ($usertime->getObjectPHID() !== null &&
+ $usertime->getUserPHID() === $viewer->getPHID()) {
+
+ $is_confirmed = array_key_exists('__confirm__', $request_data) && ($request_data['__confirm__'] == 'true');
+ if ($is_confirmed) {
+ // actual delete
+ $usertime->delete();
+ $done_uri = $request_data['__back__'];
+ return id(new AphrontRedirectResponse ())
+ ->setURI($done_uri);
+ } else {
+ $done_uri = $request_data['__back__'];
+ return $this->newDialog()->setTitle(pht('Timelog deletion'))
+ ->appendParagraph(
+ pht('Are you sure to delete this timelog?'))
+ ->addSubmitButton(pht('Yes, delete'))
+ ->addCancelButton($done_uri)
+ ->addHiddenInput('__timelog_id__', $timelog_id)
+ ->addHiddenInput('__confirm__', 'true')
+ ->addHiddenInput('__back__', $done_uri);
+ }
+ } else {
+ return $this->newDialog()
+ ->setTitle(pht('You are not the owner'))
+ ->appendParagraph(
+ pht('You cannot delete timelog created by another user.'))
+ ->addCancelButton($done_uri);
+ }
+ } else {
+ return $this->newDialog()->setTitle(pht('Worklog not found'))
+ ->appendParagraph(
+ pht('I was unable to found the worklog you try to delete.'))
+ ->addCancelButton($done_uri);
+ }
break;
+
+
default:
- return new Aphront404Response();
- }
+ return new Aphront404Response ();
+ }
- $errors = array();
+ $errors = array ();
$v_note = null;
$e_date = null;
- $timestamp = AphrontFormDateControlValue::newFromEpoch(
- $viewer,
- time());
-
- if ($request->isDialogFormPost()) {
- $v_note = $request->getStr('note');
- $timestamp = AphrontFormDateControlValue::newFromRequest(
- $request,
- 'epoch');
-
- if (!$timestamp->isValid()) {
- $errors[] = pht('Please choose a valid date.');
- $e_date = pht('Invalid');
- } else {
- $max_time = PhabricatorTime::getNow();
- if ($timestamp->getEpoch() > $max_time) {
- if ($this->isStoppingTracking()) {
- $errors[] = pht(
- 'You can not stop tracking time at a future time. Enter the '.
- 'current time, or a time in the past.');
- } else {
- $errors[] = pht(
- 'You can not start tracking time at a future time. Enter the '.
- 'current time, or a time in the past.');
+ $e_worklog = null;
+ $worklog = null;
+
+ $timestamp = AphrontFormDateControlValue::newFromEpoch ($viewer, time ());
+
+ if ($request->isDialogFormPost ())
+ {
+ $v_note = $request->getStr ('note');
+ $worklog = $request->getStr ('worklog');
+ $timestamp = AphrontFormDateControlValue::newFromRequest ($request, 'epoch');
+
+ if (!$timestamp->isValid ())
+ {
+ $errors[] = pht ('Please choose a valid date.');
+ $e_date = pht ('Invalid');
}
- $e_date = pht('Invalid');
- }
+ else
+ {
+ $max_time = PhabricatorTime::getNow ();
+ if ($timestamp->getEpoch () > $max_time)
+ {
+ if ($this->isStoppingTracking ())
+ {
+ $errors[] =
+ pht
+ ('You can not stop tracking time at a future time. Enter the '.'current time, or a time in the past.');
+ }
+ else
+ {
+ $errors[] =
+ pht
+ ('You can not start tracking time at a future time. Enter the '.'current time, or a time in the past.');
+ }
+ $e_date = pht ('Invalid');
+ }
- if ($this->isStoppingTracking()) {
- $min_time = $current_timer->getDateStarted();
- if ($min_time > $timestamp->getEpoch()) {
- $errors[] = pht('Stop time must be after start time.');
- $e_date = pht('Invalid');
+ if ($this->isWorklog ())
+ {
+ if (strlen ($worklog) > 0)
+ {
+ $worklog_parser =
+ new WorklogParser ($timestamp->getEpoch (), $worklog);
+ $parse_error = $worklog_parser->getError ();
+ if (strlen ($parse_error) > 0)
+ {
+ $errors[] = $parse_error;
+ $e_worklog = pht ('Syntax error');
+ }
+ }
+ else
+ {
+ $errors[] = pht ('Please type a worklog');
+ $e_worklog = pht ('Syntax error');
+ }
+ }
+ else if ($this->isStoppingTracking ())
+ {
+ $min_time = $current_timer->getDateStarted ();
+ if ($min_time > $timestamp->getEpoch ())
+ {
+ $errors[] = pht ('Stop time must be after start time.');
+ $e_date = pht ('Invalid');
+ }
+ }
}
- }
- }
- if (!$errors) {
- $editor = new PhrequentTrackingEditor();
- if ($this->isStartingTracking()) {
- $editor->startTracking(
- $viewer,
- $this->phid,
- $timestamp->getEpoch());
- } else if ($this->isStoppingTracking()) {
- $editor->stopTracking(
- $viewer,
- $this->phid,
- $timestamp->getEpoch(),
- $v_note);
- }
+ if (!$errors)
+ {
+ $editor = new PhrequentTrackingEditor ();
+ if ($this->isStartingTracking ())
+ {
+ $editor->startTracking ($viewer,
+ $this->phid, $timestamp->getEpoch ());
+ }
+ else if ($this->isStoppingTracking ())
+ {
+ $editor->stopTracking ($viewer,
+ $this->phid,
+ $timestamp->getEpoch (), $v_note);
+ }
+ else if ($this->isWorklog ())
+ {
+ $editor->addWorklog ($viewer,
+ $this->phid,
+ $timestamp->getEpoch (), $worklog, $v_note);
+ }
+
+ return id (new AphrontRedirectResponse ())->setURI ($done_uri);
+ }
- return id(new AphrontRedirectResponse())->setURI($done_uri);
}
- }
+ $dialog =
+ $this->newDialog ()->setTitle ($title_text)->
+ setWidth (AphrontDialogView::WIDTH_FORM)->setErrors ($errors)->
+ appendParagraph ($inner_text);
+
+ $form = new PHUIFormLayoutView ();
- $dialog = $this->newDialog()
- ->setTitle($title_text)
- ->setWidth(AphrontDialogView::WIDTH_FORM)
- ->setErrors($errors)
- ->appendParagraph($inner_text);
+ if ($this->isStoppingTracking ())
+ {
+ $start_time = $current_timer->getDateStarted ();
+ $start_string = pht ('%s (%s ago)',
+ phabricator_datetime ($start_time, $viewer),
+ phutil_format_relative_time
+ (PhabricatorTime::getNow () - $start_time));
- $form = new PHUIFormLayoutView();
+ $form->appendChild (id (new AphrontFormStaticControl ())->setLabel
+ (pht ('Started At'))->setValue ($start_string));
+ }
- if ($this->isStoppingTracking()) {
- $start_time = $current_timer->getDateStarted();
- $start_string = pht(
- '%s (%s ago)',
- phabricator_datetime($start_time, $viewer),
- phutil_format_relative_time(PhabricatorTime::getNow() - $start_time));
+ $form->appendChild (id (new AphrontFormDateControl ())->
+ setUser ($viewer)->setName ('epoch')->
+ setLabel ($label_text)->setError ($e_date)->
+ setValue ($timestamp));
- $form->appendChild(
- id(new AphrontFormStaticControl())
- ->setLabel(pht('Started At'))
- ->setValue($start_string));
- }
+ if ($this->isWorklog ())
+ {
+ if($worklog == ""){
+ $worklog = '7h';
+ }
+ $form->appendChild (id (new AphrontFormTextControl ())->
+ setUser ($viewer)->setName ('worklog')->
+ setLabel ($worklog_action_text)->
+ setError ($e_worklog)->setValue ($worklog));
- $form->appendChild(
- id(new AphrontFormDateControl())
- ->setUser($viewer)
- ->setName('epoch')
- ->setLabel($action_text)
- ->setError($e_date)
- ->setValue($timestamp));
+ $form->appendChild (id (new AphrontFormTextControl ())->setLabel
+ (pht ('Note'))->setName ('note')->setValue ($v_note));
+ }
- if ($this->isStoppingTracking()) {
- $form->appendChild(
- id(new AphrontFormTextControl())
- ->setLabel(pht('Note'))
- ->setName('note')
- ->setValue($v_note));
- }
+ if ($this->isStoppingTracking ())
+ {
+ $form->appendChild (id (new AphrontFormTextControl ())->setLabel
+ (pht ('Note'))->setName ('note')->setValue ($v_note));
+ }
- $dialog->appendChild($form);
+ $dialog->appendChild ($form);
- $dialog->addCancelButton($done_uri);
+ $dialog->addCancelButton ($done_uri);
- $dialog->addSubmitButton($action_text);
+ $dialog->addSubmitButton ($ok_button_text);
return $dialog;
}
- private function isStartingTracking() {
- return $this->verb === 'start';
+ private function isStartingTracking ()
+ {
+ return $this->verb == 'start';
+ }
+
+ private function isStoppingTracking ()
+ {
+ return $this->verb == 'stop';
}
- private function isStoppingTracking() {
- return $this->verb === 'stop';
+ private function isWorklog ()
+ {
+ return $this->verb == 'worklog';
}
}
diff --git a/src/applications/phrequent/editor/PhrequentTrackingEditor.php b/src/applications/phrequent/editor/PhrequentTrackingEditor.php
index fec91ef7cb..2ac6f1bc2f 100644
--- a/src/applications/phrequent/editor/PhrequentTrackingEditor.php
+++ b/src/applications/phrequent/editor/PhrequentTrackingEditor.php
@@ -12,6 +12,30 @@ public function startTracking(PhabricatorUser $user, $phid, $timestamp) {
return $phid;
}
+ public function addWorklog(
+ PhabricatorUser $user,
+ $phid,
+ $begin_timestamp,
+ $worklog,
+ $note) {
+
+ $usertime_dao = new PhrequentUserTime();
+ $conn = $usertime_dao->establishConnection('r');
+
+ $worklog_parser = new WorklogParser($begin_timestamp, $worklog);
+ $end_timestamp = $worklog_parser->getTimeStamp();
+
+ $usertime = new PhrequentUserTime();
+ $usertime->setDateStarted($begin_timestamp);
+ $usertime->setDateEnded($end_timestamp);
+ $usertime->setUserPHID($user->getPHID());
+ $usertime->setObjectPHID($phid);
+ $usertime->save();
+
+ return $phid;
+ }
+
+
public function stopTracking(
PhabricatorUser $user,
$phid,
diff --git a/src/applications/phrequent/event/PhrequentUIEventListener.php b/src/applications/phrequent/event/PhrequentUIEventListener.php
index e876559efe..f02dda89cb 100644
--- a/src/applications/phrequent/event/PhrequentUIEventListener.php
+++ b/src/applications/phrequent/event/PhrequentUIEventListener.php
@@ -42,19 +42,30 @@ private function handleActionEvent($event) {
->setIcon('fa-clock-o')
->setWorkflow(true)
->setHref('/phrequent/track/start/'.$object->getPHID().'/');
+ $this->addActionMenuItems($event, $track_action);
+
+ $track_action = id(new PhabricatorActionView())
+ ->setName(pht('Add Worklog'))
+ ->setIcon('fa-clock-o green')
+ ->setWorkflow(true)
+ ->setHref('/phrequent/track/worklog/'.$object->getPHID().'/');
+ $this->addActionMenuItems($event, $track_action);
+
+
} else {
$track_action = id(new PhabricatorActionView())
->setName(pht('Stop Tracking Time'))
->setIcon('fa-clock-o red')
->setWorkflow(true)
->setHref('/phrequent/track/stop/'.$object->getPHID().'/');
+ $this->addActionMenuItems($event, $track_action);
}
if (!$user->isLoggedIn()) {
$track_action->setDisabled(true);
}
- $this->addActionMenuItems($event, $track_action);
- }
+
+ }
}
diff --git a/src/applications/phrequent/query/PhrequentSearchEngine.php b/src/applications/phrequent/query/PhrequentSearchEngine.php
index d137c40b64..4fbd3f891f 100644
--- a/src/applications/phrequent/query/PhrequentSearchEngine.php
+++ b/src/applications/phrequent/query/PhrequentSearchEngine.php
@@ -161,10 +161,40 @@ protected function renderResultList(
pht(
'Tracked %s',
$time_spent));
+ $item->addAttribute(
+ pht(
+ 'Started on %s',
+ phabricator_datetime($usertime->getDateStarted(), $viewer)));
+
$item->addAttribute(
pht(
'Ended on %s',
phabricator_datetime($usertime->getDateEnded(), $viewer)));
+
+ if ($usertime->getObjectPHID() !== null &&
+ $usertime->getUserPHID() === $viewer->getPHID()) {
+ $back_uri = '/';
+ if ($this->getRequest() !== null) {
+ $back_uri = $this->getRequest()->GetPath();
+ }
+ $uri = new PhutilURI('/phrequent/track/delete/'.
+ $usertime->getObjectPHID().'/');
+ $parameters = array();
+ $parameters['__back__'] = $back_uri;
+ $parameters['__timelog_id__'] = $usertime->getID();
+ $uri->setQueryParams($parameters);
+ $href = $uri->__toString();
+
+ $item->addAction(
+ id(new PHUIListItemView())
+ ->setIcon('fa-trash')
+ ->addSigil('phrequent-delete-worklog')
+ ->setWorkflow(true)
+ ->setRenderNameAsTooltip(true)
+ ->setName(pht('Delete'))
+ ->setHref($href));
+ }
+
} else {
$item->addAttribute(
pht(
diff --git a/src/applications/phrequent/storage/WorklogParser.php b/src/applications/phrequent/storage/WorklogParser.php
new file mode 100644
index 0000000000..9c3d01b2b1
--- /dev/null
+++ b/src/applications/phrequent/storage/WorklogParser.php
@@ -0,0 +1,71 @@
+ 126000,// 60 * 60 * 7 * 5
+ 'd' => 25200, // 60 * 60 * 7
+ */
+ 'h' => 3600, // 60 * 60
+ 'm' => 60,
+ ];
+
+ private $timestamp;
+ private $error;
+
+ public function __construct($timestamp, $worklog) {
+ $this->timestamp = $timestamp;
+ $matches = [];
+ preg_match_all(static::$regexWorklog, $worklog, $matches);
+
+ // shift of the first match, which is the full string
+ $this->timestamp += $this->worklogToSeconds(array_shift($matches));
+ }
+
+ public function getError() {
+ return $this->error;
+ }
+
+ public function getTimeStamp() {
+ return $this->timestamp;
+ }
+
+ private function worklogToSeconds($tokens) {
+ $duration_in_second = 0;
+
+ foreach ($tokens as $token) {
+ $matches = ['', 0, 'm']; // default to 0 minutes
+ preg_match(static::$regexWorklogItem, $token, $matches);
+ if (!$matches[1] || !$matches[2]) {
+
+ $this->error = pht('Trailing characters in the worklog');
+ $this->error .= pht(' (digit without letter?)');
+ } else {
+ $type = $matches[2];
+ $count = $matches[1];
+ $duration_in_second += $count * static::$durationMap[$type];
+ }
+ }
+ return $duration_in_second;
+ }
+}
diff --git a/src/applications/phrequent/storage/__tests__/WorklogParserTestCase.php b/src/applications/phrequent/storage/__tests__/WorklogParserTestCase.php
new file mode 100644
index 0000000000..44f07f6036
--- /dev/null
+++ b/src/applications/phrequent/storage/__tests__/WorklogParserTestCase.php
@@ -0,0 +1,9 @@
+assertEqual("A", "A");
+ }
+}
diff --git a/src/docs/book/contributor.book b/src/docs/book/contributor.book
index 10db63c011..1d0386251f 100644
--- a/src/docs/book/contributor.book
+++ b/src/docs/book/contributor.book
@@ -1,11 +1,11 @@
{
- "name": "phabcontrib",
- "title": "Phabricator Contributor Documentation",
- "short": "Phabricator Contributor Docs",
- "preface": "Information for Phabricator contributors and developers.",
+ "name": "contrib",
+ "title": "Phorge Contributor Documentation",
+ "short": "Contributor Docs",
+ "preface": "Information for Phorge contributors and developers.",
"root": "../../../",
"uri.source":
- "https://secure.phabricator.com/diffusion/P/browse/master/%f$%l",
+ "https://we.phorge.it/diffusion/P/browse/master/%f$%l",
"rules": {
"(\\.diviner$)": "DivinerArticleAtomizer"
},
diff --git a/src/docs/book/flavor.book b/src/docs/book/flavor.book
index 978244f19d..4404e94bf7 100644
--- a/src/docs/book/flavor.book
+++ b/src/docs/book/flavor.book
@@ -1,11 +1,11 @@
{
- "name": "phabflavor",
- "title": "Phabricator Flavor Text",
+ "name": "flavor",
+ "title": "Phorge Flavor Text",
"short": "Flavor Text",
- "preface": "Recommendations, lore, and dark rituals.",
+ "preface": "A collection of short articles which pertain to software development in general, not necessarily to Phorge specifically.",
"root": "../../../",
"uri.source":
- "https://secure.phabricator.com/diffusion/P/browse/master/%f$%l",
+ "https://we.phorge.it/diffusion/P/browse/master/%f$%l",
"rules": {
"(\\.diviner$)": "DivinerArticleAtomizer"
},
@@ -20,14 +20,11 @@
"(^webroot/rsrc/externals/)"
],
"groups": {
- "overview": {
- "name": "Overview"
- },
"javascript": {
"name": "Javascript"
},
"lore": {
- "name": "Phabricator Lore"
+ "name": "Phorge Lore"
},
"php": {
"name": "PHP"
diff --git a/src/docs/book/phabricator.book b/src/docs/book/phorge.book
similarity index 96%
rename from src/docs/book/phabricator.book
rename to src/docs/book/phorge.book
index d109a9b70e..0be0d5526d 100644
--- a/src/docs/book/phabricator.book
+++ b/src/docs/book/phorge.book
@@ -1,11 +1,11 @@
{
- "name": "phabdev",
- "title": "Phabricator Technical Documentation",
- "short": "Phabricator Tech Docs",
- "preface": "Technical reference material for Phabricator developers.",
+ "name": "dev",
+ "title": "Phorge Technical Documentation",
+ "short": "Tech Docs",
+ "preface": "Technical reference material for Phorge developers.",
"root": "../../../",
"uri.source":
- "https://secure.phabricator.com/diffusion/P/browse/master/%f$%l",
+ "https://we.phorge.it/diffusion/P/browse/master/%f$%l",
"rules": {
"(\\.diviner$)": "DivinerArticleAtomizer",
"(\\.php$)": "DivinerPHPAtomizer"
diff --git a/src/docs/book/user.book b/src/docs/book/user.book
index fb2dccc578..b5b6dac7b1 100644
--- a/src/docs/book/user.book
+++ b/src/docs/book/user.book
@@ -1,11 +1,11 @@
{
- "name": "phabricator",
- "title": "Phabricator User Documentation",
- "short": "Phabricator User Docs",
- "preface": "Instructions for installing, configuring, and using Phabricator.",
+ "name": "phorge",
+ "title": "Phorge Administrator and User Documentation",
+ "short": "User Docs",
+ "preface": "Instructions for installing, configuring, and using Phorge.",
"root": "../../../",
"uri.source":
- "https://secure.phabricator.com/diffusion/P/browse/master/%f$%l",
+ "https://we.phorge.it/diffusion/P/browse/master/%f$%l",
"rules": {
"(\\.diviner$)": "DivinerArticleAtomizer"
},
@@ -37,9 +37,6 @@
},
"fieldmanual": {
"name": "Field Manuals"
- },
- "cellar": {
- "name": "Musty Cellar"
}
}
}
diff --git a/src/docs/contributor/adding_new_classes.diviner b/src/docs/contributor/adding_new_classes.diviner
index ea932eba5c..64ab228ea3 100644
--- a/src/docs/contributor/adding_new_classes.diviner
+++ b/src/docs/contributor/adding_new_classes.diviner
@@ -1,22 +1,22 @@
@title Adding New Classes
@group developer
-Guide to adding new classes to extend Phabricator.
+Guide to adding new classes to extend Phorge.
Overview
========
-Phabricator is highly modular, and many parts of it can be extended by adding
+Phorge is highly modular, and many parts of it can be extended by adding
new classes. This document explains how to write new classes to change or
-expand the behavior of Phabricator.
+expand the behavior of Phorge.
-IMPORTANT: The upstream does not offer support with extension development.
+NOTE: The upstream offers limited support with extension development.
Fundamentals
============
-Phabricator primarily discovers functionality by looking at concrete subclasses
-of some base class. For example, Phabricator determines which applications are
+Phorge primarily discovers functionality by looking at concrete subclasses
+of some base class. For example, Phorge determines which applications are
available by looking at all of the subclasses of
@{class@phabricator:PhabricatorApplication}. It
discovers available workflows in `arc` by looking at all of the subclasses of
@@ -24,7 +24,7 @@ discovers available workflows in `arc` by looking at all of the subclasses of
by looking at all of the subclasses of @{class@arcanist:PhutilLocale}.
This pattern holds in many cases, so you can often add functionality by adding
-new classes with no other work. Phabricator will automatically discover and
+new classes with no other work. Phorge will automatically discover and
integrate the new capabilities or features at runtime.
There are two main ways to add classes:
@@ -42,20 +42,20 @@ The next sections walk through these approaches in greater detail.
Extensions Directory
====================
-The easiest way to extend Phabricator by adding new classes is to drop them
-into the extensions directory, at `phabricator/src/extensions/`.
+The easiest way to extend Phorge by adding new classes is to drop them
+into the extensions directory, at `pohrge/src/extensions/`.
This is intended as a quick way to add small pieces of functionality, test new
-features, or get started on a larger project. Extending Phabricator like this
+features, or get started on a larger project. Extending Phorge like this
imposes a small performance penalty compared to using a library.
-This directory exists in all libphutil libraries, so you can find a similar
+This directory also exists for Arcanist, so you can find a similar
directory in `arcanist/src/extensions/`.
For example, to add a new application, create a file like this one and add it
-to `phabricator/src/extensions/`.
+to `phorge/src/extensions/`.
-```name=phabricator/src/extensions/ExampleApplication.php, lang=php
+```name=phorge/src/extensions/ExampleApplication.php, lang=php
4. You represent that you are legally entitled to grant the above license. If
-> your employer(s) has rights to intellectual property that you create that
-> includes your Contributions, you represent that you have received permission
-> to make Contributions on behalf of that employer, that your employer has
-> waived such rights for your Contributions to Phacility, or that your employer
-> has executed a separate Corporate CLA with Phacility.
-
-Ownership of your work varies based on where you live, how you are employed,
-and your agreements with your employer. However, at least in the US, it is
-likely that your employer owns your work unless you have anticipated conflicts
-and specifically avoided them. This generally makes sense: if you are paid by
-your employer for your work, they own the product of your work and you receive
-salary and benefits in fair exchange for that work.
-
-Your employer may have an ownership claim on your work even if you perform it
-on your own time, if you use their equipment (like a company laptop or phone),
-resources, facilities, or trade secrets, or signed something like an "Invention
-Assignment Agreement" when you were hired. Such agreements are common. The
-details of the strength of their claim will vary based on your situation and
-local law.
-
-If you are unsure, you should speak with your employer or a lawyer. If you
-contribute code you do not own under the individual CLA, you are exposing
-yourself to liability. You may also be exposing us to liability, but we'll have
-the CLA on our side to show that we were unwilling pawns in your malicious
-scheme to defraud your employer.
-
-The good news is that most employers are happy to contribute to open source
-projects. Incentives are generally well aligned: they get features they want,
-and it reflects well on them. In the past, potential contributors who have
-approached their employers about a corporate CLA have generally had little
-difficulty getting approval.
diff --git a/src/docs/contributor/contrib_intro.diviner b/src/docs/contributor/contrib_intro.diviner
index 59ad9b44df..00a2e42c0e 100644
--- a/src/docs/contributor/contrib_intro.diviner
+++ b/src/docs/contributor/contrib_intro.diviner
@@ -1,12 +1,12 @@
@title Contributor Introduction
@group contrib
-Introduction to contributing to Phabricator and Arcanist.
+Introduction to contributing to Phorge and Arcanist.
Overview
========
-If you'd like to contribute to Phabricator, this document can guide you though
+If you'd like to contribute to Phorge, this document can guide you though
ways you can help improve the project.
Writing code is valuable, but often isn't the best or easiest way to contribute.
@@ -19,24 +19,11 @@ heavy lifting.
Without writing any code, learning the whole codebase, making a big time
commitment, or having to touch PHP, here are some ways you can materially
-contribute to Phabricator:
+contribute to Phorge:
- - Drop by the [[ https://phurl.io/u/discourse | community forum ]] just to
- say "thanks". A big part of the reason we build this software is to help
- people solve problems, and knowing that our efforts are appreciated is
- really rewarding.
- - Recommend Phabricator to people who you think might find it useful. Our
+ - Recommend Phorge to people who you think might find it useful. Our
most powerful growth channel is word of mouth, and mentioning or tweeting
- about Phabricator helps the project grow. If writing a tweet sounds like
- too much work, you can use one of these form tweets written by our PR
- department to quickly and easily shill on our behalf. Hail corporate!
-
-> Phabricator seems like it's pretty okay
-
-> I am not being paid to mention Phabricator in this extemporaneous, completely organic tweet
-
-> Phabricator is objectively the best thing. Source: I am a certified, internationally recognized expert.
-
+ about Phorge helps the project grow.
- Submit high-quality bug reports by carefully following the guide in
@{article:Contributing Bug Reports}.
diff --git a/src/docs/contributor/contributing_code.diviner b/src/docs/contributor/contributing_code.diviner
index b6816e03b5..c7bdec25c9 100644
--- a/src/docs/contributor/contributing_code.diviner
+++ b/src/docs/contributor/contributing_code.diviner
@@ -1,4 +1,197 @@
@title Contributing Code
@group detail
-Effective June 1, 2021: Phabricator is no longer actively maintained, and no longer accepting contributions.
+Phorge is an open-source project, and welcomes contributions from the community
+at large. However, there are some guidelines we ask you to follow.
+
+
+Overview
+========
+
+The most important parts of contributing code to Phorge are:
+
+ - File a task with a bug report or feature request //before// you write code.
+ - We do not accept GitHub pull requests.
+ - Some alternative approaches are available if your change isn't something
+ we want to bring upstream.
+
+The rest of this article describes these points in more detail, and then
+provides guidance on writing and submitting patches.
+
+If you just want to contribute some code but don't have a specific bug or
+feature in mind, see the bottom of this document for tips on finding ways to get
+started.
+
+For general information on contributing to Phorge, see
+@{article:Contributor Introduction}.
+
+
+Coordinate First
+================
+
+Before sending code, you should file a task describing what you'd like to write.
+
+When you file a task, mention that you'd like to write the code to fix it. We
+can help contextualize your request or bug and guide you through writing an
+upstreamable patch, provided it's something that's upstreamable. If it isn't
+upstreamable, we can let you know what the issues are and help find another
+plan of attack.
+
+You don't have to file first (for example, if you spot a misspelling it's
+normally fine to just send a diff), but for anything even moderately complex
+you're strongly encouraged to file first and coordinate with the upstream.
+
+
+Rejecting Patches
+=================
+
+If you send us a patch without coordinating it with us first, it will probably
+be immediately rejected, or sit in limbo for a long time and eventually be
+rejected. The reasons we do this vary from patch to patch, but some of the most
+common reasons are:
+
+**Unjustifiable Costs**: We support code in the upstream forever. Support is
+enormously expensive and takes up a huge amount of our time. The cost to support
+a change over its lifetime is often 10x or 100x or 1000x greater than the cost
+to write the first version of it. Many uncoordinated patches we receive are
+"white elephants", which would cost much more to maintain than the value they
+provide.
+
+As an author, it may look like you're giving us free work and we're rejecting it
+as too expensive, but this viewpoint doesn't align with the reality of a large
+project which is actively supported by a small, experienced team. Writing code
+is cheap; maintaining it is expensive.
+
+By coordinating with us first, you can make sure the patch is something we
+consider valuable enough to put long-term support resources behind, and that
+you're building it in a way that we're comfortable taking over.
+
+**Not a Good Fit**: Many patches aren't good fits for the upstream: they
+implement features we simply don't want. Coordinating with us first helps
+make sure we're on the same page and interested in a feature.
+
+The most common type of patch along these lines is a patch which adds new
+configuration options. We consider additional configuration options to have
+an exceptionally high lifetime support cost and are very unlikely to accept
+them. Coordinate with us first.
+
+**Not a Priority**: If you send us a patch against something which isn't a
+priority, we probably won't have time to look at it. We don't give special
+treatment to low-priority issues just because there's code written: we'd still
+be spending time on something lower-priority when we could be spending it on
+something higher-priority instead.
+
+If you coordinate with us first, you can make sure your patch is in an area
+of the codebase that we can prioritize.
+
+**Overly Ambitious Patches**: Sometimes we'll get huge patches from new
+contributors. These can have a lot of fundamental problems and require a huge
+amount of our time to review and correct. If you're interested in contributing,
+you'll have more success if you start small and learn as you go.
+
+We can help you break a large change into smaller pieces and learn how the
+codebase works as you proceed through the implementation, but only if you
+coordinate with us first.
+
+**Generality**: We often receive several feature requests which ask for similar
+features, and can come up with a general approach which covers all of the use
+cases. If you send us a patch for //your use case only//, the approach may be
+too specific. When a cleaner and more general approach is available, we usually
+prefer to pursue it.
+
+By coordinating with us first, we can make you aware of similar use cases and
+opportunities to generalize an approach. These changes are often small, but can
+have a big impact on how useful a piece of code is.
+
+**Infrastructure and Sequencing**: Sometimes patches are written against a piece
+of infrastructure with major planned changes. We don't want to accept these
+because they'll make the infrastructure changes more difficult to implement.
+
+Coordinate with us first to make sure a change doesn't need to wait on other
+pieces of infrastructure. We can help you identify technical blockers and
+possibly guide you through resolving them if you're interested.
+
+
+No Prototype Changes
+====================
+
+With rare exceptions, we do not accept patches for prototype applications for
+the same reasons that we don't accept feature requests or bug reports. To learn
+more about prototype applications, see
+@{article:User Guide: Prototype Applications}.
+
+
+No Pull Requests
+================
+
+We do not accept pull requests on GitHub:
+
+ - Pull requests do not get lint and unit tests run, so issues which are
+ normally caught statically can slip by.
+ - Phorge is code review software, and developed using its own workflows.
+ Pull requests bypass some of these workflows (for example, they will not
+ trigger Herald rules to notify interested parties).
+ - GitHub is not the authoritative master repository and we maintain a linear
+ history, so merging pull requests is cumbersome on our end.
+ - If you're comfortable enough with Phorge to contribute to it, you
+ should also be comfortable using it to submit changes.
+
+Instead of sending a pull request, use `arc diff` to create a revision on the
+upstream install. Your change will go through the normal Phorge review
+process.
+
+(GitHub does not allow repositories to disable pull requests, which is why
+it's technically possible to submit them.)
+
+
+Alternatives
+============
+
+If you've written code but we're not accepting it into the upstream, some
+alternative approaches include:
+
+**Maintain a local fork.** This will require some ongoing effort to port your
+changes forward when you update, but is often very reasonable for simple
+changes.
+
+**Develop as an application.** Many parts of Phorge's infrastructure are
+modular, and modularity is increasing over time. A lot of changes can be built
+as external modules or applications without forking Phorge itself. There
+isn't much documentation for this right now, but you can look at
+how other applications are implemented, and at other third-party code that
+extends Phorge.
+
+**Rise to prominence.** We're more willing to accept borderline changes from
+community members who are active, make multiple contributions, or have a history
+with the project. This is not carte blanche, but distinguishing yourself can
+make us feel more comfortable about supporting a change which is slightly
+outside of our comfort zone.
+
+
+Writing and Submitting Patches
+==================
+
+To actually submit a patch, run `arc diff` in `phorge/` or `arcanist/`.
+When executed in these directories, `arc` should automatically talk to the
+upstream install. You can add #blessed_reviewers as a reviewer.
+
+You should read the relevant coding convention documents before you submit a
+change. If you're a new contributor, you don't need to worry about this too
+much. Just try to make your code look similar to the code around it, and we
+can help you through the details during review.
+
+ - @{article:General Coding Standards} (for all languages)
+ - @{article:PHP Coding Standards} (for PHP)
+ - @{article:Javascript Coding Standards} (for Javascript)
+
+In general, if you're coordinating with us first, we can usually provide
+guidance on how to implement things. The other articles in this section also
+provide information on how to work in the Phorge codebase.
+
+
+Next Steps
+==========
+
+Continue by:
+
+ - returning to the @{article:Contributor Introduction}.
diff --git a/src/docs/contributor/css_coding_standards.diviner b/src/docs/contributor/css_coding_standards.diviner
index c321124eae..e83778f24c 100644
--- a/src/docs/contributor/css_coding_standards.diviner
+++ b/src/docs/contributor/css_coding_standards.diviner
@@ -1,14 +1,14 @@
@title CSS Coding Standards
@group standards
-This document describes CSS features and coding standards for Phabricator.
+This document describes CSS features and coding standards for Phorge.
= Overview =
This document describes technical and style guidelines for writing CSS in
-Phabricator.
+Phorge.
-Phabricator has a limited CSS preprocessor. This document describes the features
+Phorge has a limited CSS preprocessor. This document describes the features
it makes available.
= Z-Indexes =
@@ -19,7 +19,7 @@ Great Z-Index War where all indexes grow without bound in an endless arms race.
= Color Variables =
-Phabricator's preprocessor provides some standard color variables. You can
+Phorge's preprocessor provides some standard color variables. You can
reference these with `{$color}`. For example:
lang=css
@@ -60,7 +60,7 @@ by the media query.
= Device Rules =
-Phabricator's environment defines several device classes which can be used to
+Phorge's environment defines several device classes which can be used to
adjust behavior responsively. In particular:
lang=css
@@ -86,6 +86,6 @@ either tablets or phones:
= Image Inlining =
-Phabricator's CSS preprocessor automatically inlines images which are less than
+Phorge's CSS preprocessor automatically inlines images which are less than
32KB using `data:` URIs. This is primarily useful for gradients or textures
which are small and difficult to sprite.
diff --git a/src/docs/contributor/database.diviner b/src/docs/contributor/database.diviner
index aaea485dc6..fc39c1ff1c 100644
--- a/src/docs/contributor/database.diviner
+++ b/src/docs/contributor/database.diviner
@@ -7,10 +7,10 @@ questions like how to store new types of data.
Database System
===============
-Phabricator uses MySQL or another MySQL-compatible database (like MariaDB
+Phorge uses MySQL or another MySQL-compatible database (like MariaDB
or Amazon RDS).
-Phabricator uses the InnoDB table engine. The only exception is the
+Phorge uses the InnoDB table engine. The only exception is the
`search_documentfield` table which uses MyISAM because MySQL doesn't support
fulltext search in InnoDB (recent versions do, but we haven't added support
yet).
@@ -21,22 +21,22 @@ SQLite.
PHP Drivers
===========
-Phabricator supports [[ http://www.php.net/book.mysql | MySQL ]] and
+Phorge supports [[ http://www.php.net/book.mysql | MySQL ]] and
[[ http://www.php.net/book.mysqli | MySQLi ]] PHP extensions.
Databases
=========
-Each Phabricator application has its own database. The names are prefixed by
-`phabricator_` (this is configurable).
+Each Phorge application has its own database. The names are prefixed by
+`phorge_` (this is configurable).
-Phabricator uses a separate database for each application. To understand why,
-see @{article:Why does Phabricator need so many databases?}.
+Phorge uses a separate database for each application. To understand why,
+see @{article:Why does Phorge need so many databases?}.
Connections
===========
-Phabricator specifies if it will use any opened connection just for reading or
+Phorge specifies if it will use any opened connection just for reading or
also for writing. This allows opening write connections to a primary and read
connections to a replica in primary/replica setups (which are not actually
supported yet).
@@ -45,7 +45,7 @@ Tables
======
Most table names are prefixed by their application names. For example,
-Differential revisions are stored in database `phabricator_differential` and
+Differential revisions are stored in database `phorge_differential` and
table `differential_revision`. This generally makes queries easier to recognize
and understand.
@@ -57,7 +57,7 @@ We use lower-case table names with words separated by underscores.
Column Names
============
-Phabricator uses `camelCase` names for columns. The main advantage is that they
+Phorge uses `camelCase` names for columns. The main advantage is that they
directly map to properties in PHP classes.
Don't use MySQL reserved words (such as `order`) for column names.
@@ -65,17 +65,17 @@ Don't use MySQL reserved words (such as `order`) for column names.
Data Types
==========
-Phabricator defines a set of abstract data types (like `uint32`, `epoch`, and
+Phorge defines a set of abstract data types (like `uint32`, `epoch`, and
`phid`) which map to MySQL column types. The mapping depends on the MySQL
version.
-Phabricator uses `utf8mb4` character sets where available (MySQL 5.5 or newer),
+Phorge uses `utf8mb4` character sets where available (MySQL 5.5 or newer),
and `binary` character sets in most other cases. The primary motivation is to
allow 4-byte unicode characters to be stored (the `utf8` character set, which
is more widely available, does not support them). On newer MySQL, we use
`utf8mb4` to take advantage of improved collation rules.
-Phabricator stores dates with an `epoch` abstract data type, which maps to
+Phorge stores dates with an `epoch` abstract data type, which maps to
`int unsigned`. Although this makes dates less readable when browsing the
database, it makes date and time manipulation more consistent and
straightforward in the application.
@@ -134,8 +134,8 @@ eventually, but there isn't a strong case for them at the present time.
PHIDs
=====
-Each globally referencable object in Phabricator has an associated PHID
-("Phabricator ID") which serves as a global identifier, similar to a GUID.
+Each globally referencable object in Phorge has an associated PHID
+("Phorge ID") which serves as a global identifier, similar to a GUID.
We use PHIDs for referencing data in different databases.
We use both auto-incrementing IDs and global PHIDs because each is useful in
@@ -150,6 +150,8 @@ are permitted to subscribe to different types of objects (revisions, tasks,
etc). Without PHIDs, we would need to add a "type" column to avoid ID collision;
using PHIDs makes implementing features like this simpler.
+For more information, see @{article:Handles Technical Documentation}
+
Transactions
============
@@ -169,7 +171,7 @@ update, and understand than application code.
Schema Denormalization
======================
-Phabricator uses schema denormalization sparingly. Avoid denormalization unless
+Phorge uses schema denormalization sparingly. Avoid denormalization unless
there is a compelling reason (usually, performance) to denormalize.
Schema Changes and Migrations
diff --git a/src/docs/contributor/describing_problems.diviner b/src/docs/contributor/describing_problems.diviner
index d06d7b7d64..30f3b4cad0 100644
--- a/src/docs/contributor/describing_problems.diviner
+++ b/src/docs/contributor/describing_problems.diviner
@@ -37,21 +37,21 @@ a problem and why it's important for you to resolve it.
Here are some examples of good ways to start a problem description:
-> My company does contracting work for government agencies. Because of the
-> nature of our customers, deadlines are critical and it's very important
-> for us to keep track of where we are on a timeline. We're using Maniphest
-> to track tasks...
+(NOTE) My company does contracting work for government agencies. Because of the
+ nature of our customers, deadlines are critical and it's very important
+for us to keep track of where we are on a timeline. We're using Maniphest
+to track tasks...
-> I have poor eyesight, and use a screenreader to help me use software like
-> Phabricator in my job as a developer. I'm having difficulty...
+(NOTE) I have poor eyesight, and use a screenreader to help me use software like
+ Phorge in my job as a developer. I'm having difficulty...
-> We work on a large server program which has very long compile times.
-> Switching branches is a huge pain (you have to rebuild the binary after
-> every switch, which takes about 8 minutes), but we've recently begun using
-> `git worktree` to help, which has made life a lot better. However, ...
+(NOTE) We work on a large server program which has very long compile times.
+ Switching branches is a huge pain (you have to rebuild the binary after
+ every switch, which takes about 8 minutes), but we've recently begun using
+ `git worktree` to help, which has made life a lot better. However, ...
-> I triage manual test failures from our offshore QA team. Here's how our
-> workflow works...
+(NOTE) I triage manual test failures from our offshore QA team. Here's how our
+ workflow works...
All of these descriptions are helpful: the provide context about what goals
you're trying to accomplish and why.
@@ -59,19 +59,19 @@ you're trying to accomplish and why.
Here are some examples of ways to start a problem description that probably
are not very good:
-> {icon times color=red} Add custom keyboard shortcuts.
+(IMPORTANT) Add custom keyboard shortcuts.
-> {icon times color=red} I have a problem: there is no way to download
-> .tar archives of repositories.
+(IMPORTANT) I have a problem: there is no way to download
+ .tar archives of repositories.
-> {icon times color=red} I want an RSS feed of my tokens. My root problem is
-> that I do not have an RSS feed of my tokens.
+(IMPORTANT) I want an RSS feed of my tokens. My root problem is
+ that I do not have an RSS feed of my tokens.
-> {icon times color=red} There is no way to see other users' email addresses.
-> That is a problem.
+(IMPORTANT) There is no way to see other users' email addresses.
+ That is a problem.
-> {icon times color=red} I've used some other software that has a cool
-> feature. Phabricator should have that feature too.
+(IMPORTANT) I've used some other software that has a cool
+ feature. Phorge should have that feature too.
These problem descriptions are not helpful. They do not describe goals or
provide context.
diff --git a/src/docs/contributor/developer_setup.diviner b/src/docs/contributor/developer_setup.diviner
index 95508ccd19..8c39c5fc3d 100644
--- a/src/docs/contributor/developer_setup.diviner
+++ b/src/docs/contributor/developer_setup.diviner
@@ -1,19 +1,19 @@
@title Developer Setup
@group developer
-How to configure a Phabricator development environment.
+How to configure a Phorge development environment.
Overview
========
There are some options and workflows that may be useful if you are developing
-or debugging Phabricator.
+or debugging Phorge.
Configuration
=============
-To adjust Phabricator for development:
+To adjust Phorge for development:
- Enable `phabricator.developer-mode` to enable some options and show
more debugging information.
@@ -48,17 +48,17 @@ After adding, renaming, or moving classes, run `arc liberate` to rebuild
the class map:
```
-phabricator/ $ arc liberate
+phorge/ $ arc liberate
```
-Until you do this, Phabricator won't recognize your new, moved, or renamed
+Until you do this, Phorge won't recognize your new, moved, or renamed
classes. You do not need to run this after modifying an existing class.
After any modifications to static resources (CSS / JS) but before sending
changes for review or pushing them to the remote, run `bin/celerity map`:
```
-phabricator/ $ ./bin/celerity map
+phorge/ $ ./bin/celerity map
```
This rebuilds the static resource map.
@@ -91,7 +91,7 @@ Phame) you can normally test them by adding more entries to your webserver
configuration that look exactly like the primary entry (or expanding the
primary entry to match more domains).
-Phabricator routes all requests based on host headers, so alternate domains
+Phorge routes all requests based on host headers, so alternate domains
do not normally need any kind of special configuration.
You may also need to add `/etc/hosts` entries for the domains themselves.
@@ -103,8 +103,8 @@ Creating Test Data
You can create test objects with the "Lipsum" utility:
```
-phabricator/ $ ./bin/lipsum help generate
-phabricator/ $ ./bin/lipsum generate ...
+phorge/ $ ./bin/lipsum help generate
+phorge/ $ ./bin/lipsum generate ...
```
Test data can make your local install feel a little more realistic. With
diff --git a/src/docs/contributor/feature_requests.diviner b/src/docs/contributor/feature_requests.diviner
index 20fe4b2d30..b2ca702cec 100644
--- a/src/docs/contributor/feature_requests.diviner
+++ b/src/docs/contributor/feature_requests.diviner
@@ -1,4 +1,211 @@
@title Contributing Feature Requests
@group detail
-Effective June 1, 2021: Phabricator is no longer actively maintained, and there is no way to file a feature request.
+Describes how to file an effective Phorge feature request.
+
+Overview
+========
+
+Phorge is an open-source project, and welcomes feature requests from the community
+at large. However, there are some guidelines we ask you to follow.
+
+Overview
+========
+
+This article describes how to file an effective feature request.
+
+The most important things to do are:
+
+ - understand the upstream;
+ - make sure your feature makes sense in the project;
+ - align your expectations around timelines and priorities;
+ - describe your problem, not your solution.
+
+The rest of this article walks through these points in detail.
+
+If you have a bug report (not a feature request), see
+@{article:Contributing Bug Reports} for a more tailored guide.
+
+For general information on contributing to Phorge, see
+@{article:Contributor Introduction}.
+
+
+Understanding the Upstream
+==========================
+
+Before filing a feature request, it may be useful to understand how the
+upstream operates.
+
+Phorge has a designated core team who controls the project and roadmap.
+We have a cohesive vision for the project in the long term, and a general
+roadmap that extends for years into the future. While the specifics of how
+we get there are flexible, many major milestones are well-established.
+
+Although we set project direction, the community is also a critical part of
+Phorge. We aren't all-knowing, and we rely on feedback to help us identify
+issues, guide product direction, prioritize changes, and suggest features.
+
+Feature requests are an important part of this, but we ultimately build only
+features which make sense as part of the long term plan.
+
+Since it's hard to absorb a detailed understanding of that vision, //describing
+a problem// is often more effective than //requesting a feature//. We have the
+context to develop solutions which fit into our plans, address similar use
+cases, make sense with the available infrastructure, and work within the
+boundaries of our product vision. For more details on this, see below.
+
+
+Target Audiences
+================
+
+Some feature requests support very unusual use cases. Although we are broadly
+inclusive of many different kinds of users and use cases, we are not trying
+to make the software all things to all users. Use cases which are far afield
+from the things the majority of users do with Phorge often face substantial
+barriers.
+
+Phorge is primarily targeted at software projects and organizations with
+a heavy software focus. We are most likely to design, build, and prioritize
+features which serve these organizations and projects.
+
+Phorge is primarily targeted at software professionals and other
+professionals with adjacent responsibilities (like project management and
+operations). Particularly, we assume users are proficient computer users and
+familiar with software development concepts. We are most likely to design, build
+and prioritize features which serve these users.
+
+Phorge is primarily targeted at professionals working in teams on full-time
+projects. Particularly, we assume most users will use the software regularly and
+are often willing to spend a little more time up front to get a more efficient
+workflow in the long run. We are most likely to design, build and prioritize
+features which serve these use cases.
+
+Phorge is not limited to these kinds of organizations, users and use cases,
+but features which are aimed at a different group of users (like students,
+casual projects, or inexperienced computer users) may be harder to get
+upstreamed. Features aimed at very different groups of users (like wedding
+planners, book clubs, or dogs) will be much harder to get upstreamed.
+
+In many cases, a feature makes something better for all users. For example,
+suppose we fixed an issue where colorblind users had difficulty doing something.
+Dogs would benefit the most, but colorblind human users would also benefit, and
+no one would be worse off. If the benefit for core users is very small these
+kinds of features may be hard to prioritize, but there is no exceptional barrier
+to getting them upstreamed.
+
+In other cases, a feature makes something better for some users and worse for
+other users. These kinds of features face a high barrier if they make the
+software better at planning weddings and worse at reviewing code.
+
+
+Setting Expectations
+====================
+
+We have a lot of users and a small team. Even if your feature is something we're
+interested in and a good fit for where we want the product to go, it may take
+us a long time to get around to building it.
+
+Our long-term roadmap (which we call our
+[[ https://we.phorge.it/w/starmap/ | Starmap ]]) has many years worth
+of work. Your feature request is competing against thousands of other requests
+for priority.
+
+In general, we try to prioritize work that will have the greatest impact on the
+most users. Many feature requests are perfectly reasonable requests, but have
+very little impact, impact only a few users, and/or are complex to develop and
+support relative to their impact. It can take us a long time to get to these.
+
+Even if your feature request is simple and has substantial impact for a large
+number of users, the size of the request queue means that it is mathematically
+unlikely to be near the top.
+
+As a whole, this means that the overwhelming majority of feature requests will
+sit in queue for a long time without any updates, and that we won't be able to
+give you any updates or predictions about timelines. One day, out of nowhere,
+your feature will materialize. That day may be a decade from now. You should
+have realistic expectations about this when filing a feature request.
+
+
+Describe Problems
+=================
+
+When you file a feature request, we need you to describe the problem you're
+facing first, not just your desired solution. Describing the problem you are
+facing is the **most important part** of a feature request.
+
+Often, your problem may have a lot in common with other similar problems. If we
+understand your use case we can compare it to other use cases and sometimes find
+a more powerful or more general solution which solves several problems at once.
+
+At other times, we'll have a planned solution to the problem that might be
+different from your desired solution but accomplish the same goal. Understanding
+the root issue can let us merge and contextualize things.
+
+Sometimes there's already a way to solve your problem that might just not be
+obvious.
+
+Finally, your proposed solution may not be compatible with the direction we
+want to take the product, but we may be able to come up with another solution
+which has approximately the same effect and does fit into the product direction.
+
+If you only describe the solution and not the problem, we can't generalize,
+contextualize, merge, reframe, or offer alternative solutions or workarounds.
+
+You must describe the problem you are facing when filing a feature request. We
+will not accept feature requests which do not contextualize the request by
+describing the root problem.
+
+If you aren't sure exactly what we're after when we ask you to describe a root
+problem, you can find examples and more discussion in
+@{article:Describing Root Problems}.
+
+
+Hypotheticals
+=============
+
+We sometimes receive hypothetical feature requests about anticipated problems
+or concerns which haven't actually occurred yet. We usually can't do much about
+these until the problems actually occur, since the context required to
+understand and properly fix the root issue won't exist.
+
+One situation where this happens is when installs are thinking about adopting
+Phorge and trying to guess what problems users might encounter during the
+transition. More generally, this includes any request like "if users do **X**,
+they might find **Y** confusing", where no actual users have encountered
+confusion yet.
+
+These requests are necessarily missing important context, maybe including the
+answers to questions like these:
+
+ - Why did users do **X**?
+ - What were they trying to do?
+ - What did they expect to happen?
+ - How often do users do this?
+
+The answers to these questions are important in establishing that the issue is
+really a problem, figuring out the best solution for it, and prioritizing the
+issue relative to other issues.
+
+Without knowing this information, we can't be confident that we've found a good
+solution to the problem, can't know if we've actually fixed the problem, and
+can't even know if the issue was really a problem in the first place (some
+hypothetical requests describe problems which no users ever encounter).
+
+We usually can't move forward without this information. In particular, we don't
+want to spend time solving hypothetical problems which no real users will ever
+encounter: the value of those changes is zero (or negative, by making the
+product more complex without providing a benefit), but they consume development
+time which could be better spent building much more valuable features.
+
+Generally, you should wait until a problem actually occurs before filing a
+request about it.
+
+
+Next Steps
+==========
+
+Continue by:
+
+ - learning about @{article: Contributing Bug Reports}; or
+ - reading general support information in @{article:Support Resources}; or
+ - returning to the @{article:Contributor Introduction}.
diff --git a/src/docs/contributor/general_coding_standards.diviner b/src/docs/contributor/general_coding_standards.diviner
index 9b151312fd..5127aebbfc 100644
--- a/src/docs/contributor/general_coding_standards.diviner
+++ b/src/docs/contributor/general_coding_standards.diviner
@@ -1,7 +1,7 @@
@title General Coding Standards
@group standards
-This document is a general coding standard for contributing to Phabricator,
+This document is a general coding standard for contributing to Phorge,
Arcanist, and Diviner.
= Overview =
@@ -60,7 +60,7 @@ And, obviously, don't do this sort of thing:
determine if code is fast or slow by measuring it.
- Reject performance discussions that aren't rooted in concrete data.
-In Phabricator, you can usually use the builtin XHProf profiling to quickly
+In Phorge, you can usually use the builtin XHProf profiling to quickly
gather concrete performance data.
diff --git a/src/docs/tech/handles.diviner b/src/docs/contributor/handles.diviner
similarity index 97%
rename from src/docs/tech/handles.diviner
rename to src/docs/contributor/handles.diviner
index 18e33dc133..ffdd0f0705 100644
--- a/src/docs/tech/handles.diviner
+++ b/src/docs/contributor/handles.diviner
@@ -1,12 +1,12 @@
@title Handles Technical Documentation
-@group handles
+@group developer
Technical overview of Handles.
Overview
========
-Most objects in Phabricator have PHIDs, which are globally unique identifiers
+Most objects in Phorge have PHIDs, which are globally unique identifiers
that look like `PHID-USER-2zw4hwdt4i5b5ypikv6x`. If you know the PHID for an
object, you can load a **handle** for that object to get more information
about it.
diff --git a/src/docs/contributor/internationalization.diviner b/src/docs/contributor/internationalization.diviner
index 99c35e675e..84fe2d2591 100644
--- a/src/docs/contributor/internationalization.diviner
+++ b/src/docs/contributor/internationalization.diviner
@@ -1,12 +1,12 @@
@title Internationalization
@group developer
-Describes Phabricator translation and localization.
+Describes Phorge translation and localization.
Overview
========
-Phabricator partially supports internationalization, but many of the tools
+Phorge partially supports internationalization, but many of the tools
are missing or in a prototype state.
This document describes what tools exist today, how to add new translations,
@@ -23,7 +23,7 @@ Once you've created a locale, applications can add translations for that
locale.
For instructions on adding new classes, see
-@{article@phabcontrib:Adding New Classes}.
+@{article@contrib:Adding New Classes}.
Adding Translations to Locale
@@ -38,7 +38,7 @@ provide translations into different locales without needing to define those
locales themselves.
For instructions on adding new classes, see
-@{article@phabcontrib:Adding New Classes}.
+@{article@contrib:Adding New Classes}.
Writing Translatable Code
@@ -58,7 +58,7 @@ $dialog->appendParagraph(pht('This is an example.'));
```
This allows the code to return the correct Spanish or German or Russian
-version of the text, if the viewer is using Phabricator in one of those
+version of the text, if the viewer is using Phorge in one of those
languages and a translation is available.
Using `pht()` properly so that strings are translatable can be tricky. Briefly,
@@ -275,7 +275,7 @@ return pht('This will take %s hour(s).', new PhutilNumber($count));
If you now load the web UI, you'll see "hour(s)" literally in the UI. To fix
this so the translation sounds better in English, provide translations for this
-string in the @{class@phabricator:PhabricatorUSEnglishTranslation} file:
+string in the @{class:PhabricatorUSEnglishTranslation} file:
```lang=php
'This will take %s hour(s).' => array(
@@ -378,4 +378,4 @@ Next Steps
Continue by:
- adding a new locale or translation file with
- @{article@phabcontrib:Adding New Classes}.
+ @{article@contrib:Adding New Classes}.
diff --git a/src/docs/contributor/javascript_coding_standards.diviner b/src/docs/contributor/javascript_coding_standards.diviner
index 3b47a566a6..39103e94ec 100644
--- a/src/docs/contributor/javascript_coding_standards.diviner
+++ b/src/docs/contributor/javascript_coding_standards.diviner
@@ -1,12 +1,12 @@
@title Javascript Coding Standards
@group standards
-This document describes Javascript coding standards for Phabricator and Javelin.
+This document describes Javascript coding standards for Phorge and Javelin.
= Overview =
This document outlines technical and style guidelines which are followed in
-Phabricator and Javelin. Contributors should also follow these guidelines. Many
+Phorge and Javelin. Contributors should also follow these guidelines. Many
of these guidelines are automatically enforced by lint.
These guidelines are essentially identical to the Facebook guidelines, since I
diff --git a/src/docs/contributor/n_plus_one.diviner b/src/docs/contributor/n_plus_one.diviner
index 6d259671a1..21bac266e7 100644
--- a/src/docs/contributor/n_plus_one.diviner
+++ b/src/docs/contributor/n_plus_one.diviner
@@ -39,7 +39,7 @@ queries which each return 1 result.** This is particularly true if your database
is on a different machine which is, say, 1-2ms away on the network. In this
case, issuing 100 queries serially has a minimum cost of 100-200ms, even if they
can be satisfied instantly by MySQL. This is far higher than the entire
-server-side generation cost for most Phabricator pages should be.
+server-side generation cost for most Phorge pages should be.
= Batching Queries =
diff --git a/src/docs/contributor/phabricator_code_layout.diviner b/src/docs/contributor/phorge_code_layout.diviner
similarity index 78%
rename from src/docs/contributor/phabricator_code_layout.diviner
rename to src/docs/contributor/phorge_code_layout.diviner
index 422f228a27..fee99ed897 100644
--- a/src/docs/contributor/phabricator_code_layout.diviner
+++ b/src/docs/contributor/phorge_code_layout.diviner
@@ -1,19 +1,19 @@
-@title Phabricator Code Layout
+@title Phorge Code Layout
@group developer
-Guide to Phabricator code layout, including how URI mapping works through
+Guide to Phorge code layout, including how URI mapping works through
application class and subdirectory organization best practices.
= URI Mapping =
-When a user visits a Phabricator URI, the Phabricator infrastructure parses
-that URI with a regular expression to determine what controller class to load.
+When a user visits a Phorge URI, the Phorge infrastructure parses that URI with
+ a regular expression to determine what controller class to load.
-The Phabricator infrastructure knows where a given controller class lives on
+The Phorge infrastructure knows where a given controller class lives on
disk from a cache file the Arcanist phutil mapper generates. This mapping
should be updated whenever new classes or files are added:
- arc liberate /path/to/phabricator/src
+ arc liberate /path/to/phorge/src
Finally, a given controller class will map to an application which will have
most of its code in standardized subdirectories and classes.
@@ -22,11 +22,11 @@ most of its code in standardized subdirectories and classes.
Suppose you were working on the application `Derp`.
- phabricator/src/applications/derp/
+ phorge/src/applications/derp/
If `Derp` were as simple as possible, it would have one subdirectory:
- phabricator/src/applications/derp/controller/
+ phorge/src/applications/derp/controller/
containing the file `DerpController.php` with the class
@@ -37,25 +37,25 @@ containing the file `DerpController.php` with the class
If `Derp` were (relatively) complex, one could reasonably expect to see
the following directory layout:
- phabricator/src/applications/derp/conduit/
- phabricator/src/applications/derp/constants/
- phabricator/src/applications/derp/controller/
- phabricator/src/applications/derp/editor/
- phabricator/src/applications/derp/exception/
- phabricator/src/applications/derp/query/
- phabricator/src/applications/derp/replyhandler/
- phabricator/src/applications/derp/storage/
- phabricator/src/applications/derp/view/
+ phorge/src/applications/derp/conduit/
+ phorge/src/applications/derp/constants/
+ phorge/src/applications/derp/controller/
+ phorge/src/applications/derp/editor/
+ phorge/src/applications/derp/exception/
+ phorge/src/applications/derp/query/
+ phorge/src/applications/derp/replyhandler/
+ phorge/src/applications/derp/storage/
+ phorge/src/applications/derp/view/
(The following two folders are also likely to be included for JavaScript and
CSS respectively. However, static resources are largely outside the scope of
this document. See @{article:Adding New CSS and JS}.)
- phabricator/webroot/rsrc/js/application/derp/
- phabricator/webroot/rsrc/css/application/derp/
+ phorge/webroot/rsrc/js/application/derp/
+ phorge/webroot/rsrc/css/application/derp/
-These directories under `phabricator/src/applications/derp/` represent
-the basic set of class types from which most Phabricator applications are
+These directories under `phorge/src/applications/derp/` represent
+the basic set of class types from which most Phorge applications are
assembled. Each would contain a class file. For `Derp`, these classes could be
something like:
diff --git a/src/docs/contributor/php_coding_standards.diviner b/src/docs/contributor/php_coding_standards.diviner
index a14acf17f2..bb54478fa3 100644
--- a/src/docs/contributor/php_coding_standards.diviner
+++ b/src/docs/contributor/php_coding_standards.diviner
@@ -1,13 +1,13 @@
@title PHP Coding Standards
@group standards
-This document describes PHP coding standards for Phabricator and related
+This document describes PHP coding standards for Phorge and related
projects (like Arcanist).
= Overview =
This document outlines technical and style guidelines which are followed in
-Phabricator and Arcanist. Contributors should also follow these guidelines.
+Phorge and Arcanist. Contributors should also follow these guidelines.
Many of these guidelines are automatically enforced by lint.
These guidelines are essentially identical to the Facebook guidelines, since I
diff --git a/src/docs/contributor/rendering_html.diviner b/src/docs/contributor/rendering_html.diviner
index a8fe5a899d..40892b5ad7 100644
--- a/src/docs/contributor/rendering_html.diviner
+++ b/src/docs/contributor/rendering_html.diviner
@@ -1,11 +1,11 @@
@title Rendering HTML
@group developer
-Rendering HTML in the Phabricator environment.
+Rendering HTML in the Phorge environment.
= Overview =
-Phabricator attempts to prevent XSS by treating strings as default-unsafe when
+Phorge attempts to prevent XSS by treating strings as default-unsafe when
rendering. This means that if you try to build HTML through string
concatenation, it won't work: the string will be escaped by the rendering
pipeline, and the browser will treat it as plain text, not HTML.
@@ -51,7 +51,7 @@ content correctly (without double-escaping):
array(),
$content));
-In Phabricator, the @{function:javelin_tag} function is similar to
+In Phorge, the @{function:javelin_tag} function is similar to
@{function@arcanist:phutil_tag}, but provides special handling for the
`sigil` and `meta` attributes.
@@ -117,7 +117,7 @@ If you need to build a list of items with some element in between each of them
= AphrontView Classes =
-Subclasses of @{class:AphrontView} in Phabricator should return a
+Subclasses of @{class:AphrontView} in Phorge should return a
@{class@arcanist:PhutilSafeHTML} object. The easiest way to do this is to
return `phutil_tag()` or `javelin_tag()`:
diff --git a/src/docs/contributor/reproduction_steps.diviner b/src/docs/contributor/reproduction_steps.diviner
index 1050e43c48..4a8d916efc 100644
--- a/src/docs/contributor/reproduction_steps.diviner
+++ b/src/docs/contributor/reproduction_steps.diviner
@@ -6,7 +6,7 @@ Describes how to provide reproduction steps.
Overview
========
-When you submit a bug report about Phabricator, you **MUST** include
+When you submit a bug report about Phorge, you **MUST** include
reproduction steps. We can not help you with bugs we can not reproduce, and
will not accept reports which omit reproduction steps or have incomplete or
insufficient instructions.
@@ -15,7 +15,7 @@ This document explains what we're looking for in good reproduction steps.
Briefly:
- Reproduction steps must allow us to reproduce the problem locally on a
- clean, up-to-date install of Phabricator.
+ clean, up-to-date install of Phorge.
- Reproduction should be as simple as possible.
Good reproduction steps can take time to write out clearly, simplify, and
@@ -70,7 +70,7 @@ Reliable Reproduction
=====================
When you file a bug report, the first thing we do to fix it is to try to
-reproduce the problem locally on an up-to-date install of Phabricator. We will
+reproduce the problem locally on an up-to-date install of Phorge. We will
do this by following the steps you provide. If we can recreate the issue
locally, we can almost always resolve the problem (often very promptly).
@@ -80,7 +80,7 @@ settings, feed stories, etc) that we don't have access to. We either can't
follow these steps, or can't reproduce issues by following them.
Reproduction steps must be complete and self-contained, and must allow
-**anyone** to reproduce the issue on a new, empty install of Phabricator. If
+**anyone** to reproduce the issue on a new, empty install of Phorge. If
the bug you're seeing depends on data or configuration which would not be
present on a new install, you need to include that information in your steps.
@@ -101,11 +101,7 @@ to private or proprietary data.
Now, to verify that your steps provide a complete, self-contained way to
reproduce the issue, follow them yourself on a new, empty, up-to-date instance
-of Phabricator.
-
-If you can't easily start an empty instance locally, you can launch an empty
-instance on Phacility in about 60 seconds (see the "Resources" section for
-details).
+of Phorge.
If you can follow your steps and reproduce the issue on a clean instance,
we'll probably be able to follow them and reproduce the issue ourselves.
@@ -128,32 +124,6 @@ them by removing some steps or describing steps more narrowly. For help, see
"Simplifying Steps" below.
-Resources
-=========
-
-We provide some resources which can make it easier to start building steps, or
-to simplify steps.
-
-**Phacility Test Instances**: You can launch a new, up-to-date instance of
-Phabricator on Phacility in about a minute at .
-These instances run `stable`.
-
-You can use these instances to make sure that issues haven't already been
-fixed, that they reproduce on a clean install, or that your steps are really
-complete, and that the root cause isn't custom code or local extensions. Using
-a test instance will avoid disrupting other users on your install.
-
-**Test Repositories**: There are several test repositories on
-`secure.phabricator.com` which you can push commits to if you need to build
-an example to demonstrate a problem.
-
-For example, if you're seeing an issue with a certain filename but the commit
-where the problem occurs is in a proprietary internal repository, push a commit
-that affects a file with a similar name to a test repository, then reproduce
-against the test data. This will allow you to generate steps which anyone can
-follow.
-
-
Simplifying Steps
=================
@@ -239,10 +209,6 @@ to a minimal reproduction case, we can't accept it as a bug report. These
issues are tremendously time consuming for us to pursue and rarely benefit
more than one install.
-If the issue is important but falls outside the scope of permissible bug
-reports, we're happy to provide more tailored support at consulting rates. See
-[[ https://secure.phabricator.com/w/consulting/ | Consulting ]] for details.
-
Next Steps
==========
diff --git a/src/docs/contributor/running_builtin_php_webserver.diviner b/src/docs/contributor/running_builtin_php_webserver.diviner
index 1e4bdacb5c..b511731dc1 100644
--- a/src/docs/contributor/running_builtin_php_webserver.diviner
+++ b/src/docs/contributor/running_builtin_php_webserver.diviner
@@ -3,7 +3,7 @@
As of version 5.4.0, the PHP command line interface provides a built-in web
server. This web server is designed for developmental purposes only, and should
-not be used in production. Phabricator can be executed under it with the
+not be used in production. Phorge can be executed under it with the
command:
- $ php -S localhost:8000 -t path/to/phabricator/webroot/ path/to/phabricator/webroot/index.php
+ $ php -S localhost:8000 -t path/to/phorge/webroot/ path/to/phorge/webroot/index.php
diff --git a/src/docs/contributor/unit_tests.diviner b/src/docs/contributor/unit_tests.diviner
index 7977a4a876..35cee09566 100644
--- a/src/docs/contributor/unit_tests.diviner
+++ b/src/docs/contributor/unit_tests.diviner
@@ -1,11 +1,11 @@
@title Writing Unit Tests
@group developer
-Simple guide to Arcanist and Phabricator unit tests.
+Simple guide to Arcanist and Phorge unit tests.
= Overview =
-Arcanist and Phabricator provide and use a simple unit test framework. This
+Arcanist and Phorge provide and use a simple unit test framework. This
document is aimed at project contributors and describes how to use it to add
and run tests in these projects or other libphutil libraries.
@@ -16,11 +16,11 @@ for information on customizing engines.
= Adding Tests =
-To add new tests to a Arcanist or Phabricator module:
+To add new tests to a Arcanist or Phorge module:
- Create a `__tests__/` directory in the module if it doesn't exist yet.
- Add classes to the `__tests__/` directory which extend from
- @{class:PhabricatorTestCase} (in Phabricator) or
+ @{class:PhabricatorTestCase} (in Phorge) or
@{class@arcanist:PhutilTestCase} (elsewhere).
- Run `arc liberate` on the library root so your classes are loadable.
@@ -38,7 +38,7 @@ Once you've added test classes, you can run them with:
Here's a simple example test:
lang=php
- class PhabricatorTrivialTestCase extends PhabricatorTestCase {
+ class PhorgeTrivialTestCase extends PhabricatorTestCase {
private $two;
@@ -56,7 +56,7 @@ Here's a simple example test:
You can see this class at @{class:PhabricatorTrivialTestCase} and run it with:
- phabricator/ $ arc unit src/infrastructure/testing/testcase/
+ phorge/ $ arc unit src/infrastructure/testing/testcase/
PASS <1ms* testAllIsRightWithTheWorld
For more information on writing tests, see
@@ -64,7 +64,7 @@ For more information on writing tests, see
= Database Isolation =
-By default, Phabricator isolates unit tests from the database. It makes a crude
+By default, Phorge isolates unit tests from the database. It makes a crude
effort to simulate some side effects (principally, ID assignment on insert), but
any queries which read data will fail to select any rows and throw an exception
about isolation. In general, isolation is good, but this can make certain types
diff --git a/src/docs/contributor/using_edges.diviner b/src/docs/contributor/using_edges.diviner
index 89d07f4c2f..132d728019 100644
--- a/src/docs/contributor/using_edges.diviner
+++ b/src/docs/contributor/using_edges.diviner
@@ -6,8 +6,7 @@ Guide to the Edges infrastructure.
= Overview =
Edges are a generic way of storing a relationship between two objects (like a
-Task and its attached files). If you are familiar with the Facebook associations
-framework, Phabricator Edges are substantially similar.
+Task and its attached files).
An edge is defined by a source PHID (the edge origin), a destination PHID
(the edge destination) and an edge type (which describes the relationship,
diff --git a/src/docs/contributor/using_oauthserver.diviner b/src/docs/contributor/using_oauthserver.diviner
index b40496d7cf..3e30065fd1 100644
--- a/src/docs/contributor/using_oauthserver.diviner
+++ b/src/docs/contributor/using_oauthserver.diviner
@@ -1,19 +1,19 @@
-@title Using the Phabricator OAuth Server
+@title Using the Phorge OAuth Server
@group developer
-How to use the Phabricator OAuth Server.
+How to use the Phorge OAuth Server.
= Overview =
-Phabricator includes an OAuth Server which supports the
+Phorge includes an OAuth Server which supports the
`Authorization Code Grant` flow as described in the OAuth 2.0
specification:
http://tools.ietf.org/html/draft-ietf-oauth-v2-23
This functionality can allow clients to integrate with a given
-Phabricator instance in a secure way with granular data access.
-For example, Phabricator can be used as a central identity store for any
+Phorge instance in a secure way with granular data access.
+For example, Phorge can be used as a central identity store for any
clients that implement OAuth 2.0.
= Vocabulary =
@@ -41,7 +41,7 @@ clients that implement OAuth 2.0.
= Obtaining an Authorization Code =
-POST or GET `https://phabricator.example.com/oauthserver/auth/` with the
+POST or GET `https://phorge.example.com/oauthserver/auth/` with the
following parameters:
- Required - **client_id** - the id of the newly registered client.
@@ -69,14 +69,14 @@ redirect_uri with a valid authorization code.
If there is an error, the OAuth Server will return a descriptive error
message. This error will be presented to the resource owner on the
-Phabricator domain if there is reason to believe there is something fishy
+Phorge domain if there is reason to believe there is something fishy
with the client. For example, if there is an issue with the redirect_uri.
Otherwise, the OAuth Server will redirect to the pertinent redirect_uri
and include the pertinent error information.
= Obtaining an Access Token =
-POST or GET `https://phabricator.example.com/oauthserver/token/`
+POST or GET `https://phorge.example.com/oauthserver/token/`
with the following parameters:
- Required - **client_id** - the id of the client
@@ -101,7 +101,7 @@ message.
Simply include a query param with the key of "access_token" and the value
as the earlier obtained access token. For example:
-```https://phabricator.example.com/api/user.whoami?access_token=ykc7ly7vtibj334oga4fnfbuvnwz4ocp```
+```https://phorge.example.com/api/user.whoami?access_token=ykc7ly7vtibj334oga4fnfbuvnwz4ocp```
If the token has expired or is otherwise invalid, the client will receive
an error indicating as such. In these cases, the client should re-initiate
diff --git a/src/docs/contributor/version.diviner b/src/docs/contributor/version.diviner
index 8ffafede1b..6e960c7993 100644
--- a/src/docs/contributor/version.diviner
+++ b/src/docs/contributor/version.diviner
@@ -19,10 +19,10 @@ resolved because valid reproduction steps must also reproduce against a clean,
up-to-date install. See @{article:Providing Reproduction Steps} for details.
-Phabricator Version
-===================
+Phorge Version
+==============
-To get Phabricator version information:
+To get Phorge version information:
- Go to the {nav Config} application. You can type "Config" into the global
search box, or navigate to `https://your.install.com/config/`. You must
@@ -52,7 +52,7 @@ prevents you from reaching the version reporting screen.
Running a Fork?
===============
-If you've forked Phabricator and have local commits, please make sure you are
+If you've forked Phorge and have local commits, please make sure you are
reporting upstream commit hashes, not local commit hashes. The UI will attempt
to figure out where you branched from, but it may not be able to in all cases.
@@ -68,7 +68,7 @@ $ git merge-base HEAD origin/master
```
Note that if you report a bug and have local commits, we will almost always ask
-you to reproduce the issue against a clean copy of Phabricator before we
+you to reproduce the issue against a clean copy of Phorge before we
continue. You can get help faster by doing this //before// reporting an issue.
diff --git a/src/docs/flavor/about_flavor_text.diviner b/src/docs/flavor/about_flavor_text.diviner
deleted file mode 100644
index 3d46ff41d0..0000000000
--- a/src/docs/flavor/about_flavor_text.diviner
+++ /dev/null
@@ -1,9 +0,0 @@
-@title About Flavor Text
-@group overview
-
-Explains what's going on here.
-
-= Overview =
-
-Flavor Text is a collection of short articles which pertain to software
-development in general, not necessarily to Phabricator specifically.
diff --git a/src/docs/flavor/project_history.diviner b/src/docs/flavor/project_history.diviner
index c3b5363d50..1159304cda 100644
--- a/src/docs/flavor/project_history.diviner
+++ b/src/docs/flavor/project_history.diviner
@@ -1,30 +1,27 @@
-@title Phabricator Project History
+@title Phorge Project History
@group lore
-A riveting tale of adventure. In this document, I refer to worldly and
-sophisticated engineer Evan Priestley as "I", which is only natural as I am he.
-
-This document is mostly just paragraph after paragraph of self-aggrandizement.
+A riveting tale of adventure.
= In The Beginning =
-I wrote the original version of Differential in one night at a Facebook
-Hackathon in April or May 2007, along with Luke Shepard. I joined the company in
-April and code review was already an established and mostly-mandatory part of
-the culture, but it happened over email and was inefficient and hard to keep
-track of. I remember feeling like I was spending a lot of time waiting for code
-review to happen, which was a major motivator for building the tool.
+Evan Priestley wrote the original version of Differential in one night at a
+Facebook Hackathon in April or May 2007, along with Luke Shepard. He joined the
+company in April and code review was already an established and mostly-mandatory
+part of the culture, but it happened over email and was inefficient and hard to
+keep track of. Evan remembers feeling like he was spending a lot of time waiting
+ for code review to happen, which was a major motivator for building the tool.
The original name of the tool was "Diffcamp". Some time earlier there had been
an attempt to create a project management tool that was a sort of hybrid between
-Trac and Basecamp called "Traccamp". Since we were writing the code review tool
-at the height of the brief popularity Traccamp enjoyed, we integrated and called
-the new tool Diffcamp even though it had no relation to Basecamp. Traccamp fell
-by the wayside shortly thereafter and was eventually removed.
+Trac and Basecamp called "Traccamp". Since they were writing the code review tool
+at the height of the brief popularity Traccamp enjoyed, Evan and Luke integrated
+ and called the new tool Diffcamp even though it had no relation to Basecamp.
+ Traccamp fell by the wayside shortly thereafter and was eventually removed.
-However, Diffcamp didn't share its fate. We spent some more time working on it
-and got good enough to win hearts and minds over emailing diffs around and was
-soon the de facto method of code review at Facebook.
+However, Diffcamp didn't share its fate. Evan and Luke spent some more time
+working on it and got good enough to win hearts and minds over emailing diffs
+around and was soon the de facto method of code review at Facebook.
= The Long Bloat =
@@ -34,10 +31,10 @@ was 100% SVN in early 2007 but 90%+ of Engineers worked primarily in git with
SVN bridging by 2010). As these patches were contributed pretty much randomly,
it also gained a lot of performance problems, usability issues, and bugs.
-Through 2007 and 2008 I worked mostly on frontend and support infrastructure;
-among other things, I wrote a static resource management system called Haste. In
-2009 I worked on the Facebook Lite site, where I built the Javelin Javascript
-library and an MVC-flavored framework called Alite.
+Through 2007 and 2008 Evan worked mostly on frontend and support infrastructure;
+among other things, he wrote a static resource management system called Haste.
+In 2009 Evan worked on the Facebook Lite site, where he built the Javelin
+Javascript library and an MVC-flavored framework called Alite.
But by early 2010, Diffcamp was in pretty bad shape. Two years of having random
features grafted onto it without real direction had left it slow and difficult
@@ -49,12 +46,18 @@ problems.
= Differential =
-I joined the new Dev Tools team around February 2010 and took over Diffcamp. I
-renamed it to Differential, moved it to a new Alite-based infrastructure with
-Javelin, and started making it somewhat less terrible. I eventually wrote
+Evan joined the new Dev Tools team around February 2010 and took over Diffcamp.
+He renamed it to Differential, moved it to a new Alite-based infrastructure with
+Javelin, and started making it somewhat less terrible. He eventually wrote
Diffusion and built Herald to replace a very difficult-to-use predecessor. These
-tools were less negatively received than the older versions. By December 2010 I
-started open sourcing them; Haste became //Celerity// and Alite became
-//Aphront//. I wrote Maniphest to track open issues with the project in January
-or February, left Facebook in April, and shortly after, we open sourced
+tools were less negatively received than the older versions. By December 2010,
+Evan started open sourcing them; Haste became //Celerity// and Alite became
+//Aphront//. He wrote Maniphest to track open issues with the project in January
+or February, left Facebook in April, and shortly after, open sourced
Phabricator.
+
+= Phork =
+In 2021, Evan announced that Phabricator was no longer maintained. A group of
+open-source contributors came together and forked it. This new
+group called renamed the project "Phorge" and continues to maintain this
+beloved and well-used project.
diff --git a/src/docs/flavor/recommendations_on_branching.diviner b/src/docs/flavor/recommendations_on_branching.diviner
index 38d196ad9b..521b08d873 100644
--- a/src/docs/flavor/recommendations_on_branching.diviner
+++ b/src/docs/flavor/recommendations_on_branching.diviner
@@ -7,13 +7,13 @@ This document discusses organizing branches in your remote/origin for feature
development and release management, not the use of local branches in Git or
queues or bookmarks in Mercurial.
-This document is purely advisory. Phabricator works with a variety of branching
+This document is purely advisory. Phorge works with a variety of branching
strategies, and diverging from the recommendations in this document
will not impact your ability to use it for code review and source management.
= Overview =
-This document describes a branching strategy used by Facebook and Phabricator to
+This document describes a branching strategy used by Facebook and Phorge to
develop software. It scales well and removes the pain associated with most
branching strategies. This strategy is most applicable to web applications, and
may be less applicable to other types of software. The basics are:
@@ -118,7 +118,7 @@ describing similar systems:
- Martin Fowler discusses these systems in a 2010 blog post here:
[[http://martinfowler.com/bliki/FeatureToggle.html |
Martin Fowler's FeatureToggle]].
- - Phabricator just adds config options but defaults them to off. When
+ - Phorge just adds config options but defaults them to off. When
developing, we turn them on locally. Once a feature is ready, we default it
on. We have a vastly less context to deal with than most projects, however,
and sometimes get away with simply not linking new features in the UI until
diff --git a/src/docs/flavor/recommendations_on_revision_control.diviner b/src/docs/flavor/recommendations_on_revision_control.diviner
index 8e30e2f4f1..3e5a5a791f 100644
--- a/src/docs/flavor/recommendations_on_revision_control.diviner
+++ b/src/docs/flavor/recommendations_on_revision_control.diviner
@@ -3,12 +3,12 @@
Project recommendations on how to organize revision control.
-This document is purely advisory. Phabricator works with a variety of revision
+This document is purely advisory. Phorge works with a variety of revision
control strategies, and diverging from the recommendations in this document
will not impact your ability to use it for code review and source management.
-This is my (epriestley's) personal take on the issue and not necessarily
-representative of the views of the Phabricator team as a whole.
+This is Evan's personal take on the issue and not necessarily
+representative of the views of the Phorge team as a whole.
= Overview =
diff --git a/src/docs/flavor/so_many_databases.diviner b/src/docs/flavor/so_many_databases.diviner
index 74fb21332f..cde2c93825 100644
--- a/src/docs/flavor/so_many_databases.diviner
+++ b/src/docs/flavor/so_many_databases.diviner
@@ -1,19 +1,19 @@
-@title Why does Phabricator need so many databases?
+@title Why does Phorge need so many databases?
@group lore
-Phabricator uses about 60 databases (and we may have added more by the time you
+Phorge uses about 60 databases (and we may have added more by the time you
read this document). This sometimes comes as a surprise, since you might assume
it would only use one database.
The approach we use is designed to work at scale for huge installs with many
thousands of users. We care a lot about working well for large installs, and
about scaling up gracefully to meet the needs of growing organizations. We want
-small startups to be able to install Phabricator and have it grow with them as
+small startups to be able to install Phorge and have it grow with them as
they expand to many thousands of employees.
-A cost of this approach is that it makes Phabricator more difficult to install
+A cost of this approach is that it makes Phorge more difficult to install
on shared hosts which require a lot of work to create or authorize access to
-each database. However, Phabricator does a lot of advanced or complex things
+each database. However, Phorge does a lot of advanced or complex things
which are difficult to configure or manage on shared hosts, and we don't
recommend installing it on a shared host. The install documentation explicitly
discourages installing on shared hosts.
@@ -26,11 +26,11 @@ operating at scale.
Listing Databases
=================
-You can get a full list of the databases Phabricator needs with `bin/storage
+You can get a full list of the databases Phorge needs with `bin/storage
databases`. It will look something like this:
```
-$ /core/lib/phabricator/bin/storage databases
+$ /core/lib/phorge/bin/storage databases
secure_audit
secure_calendar
secure_chatlog
@@ -89,9 +89,9 @@ tables which are organized into separate application databases, just like it's
easier to work with a large project if you organize source files into
directories.
-If you aren't developing Phabricator and never look at the data in the
+If you aren't developing Phorge and never look at the data in the
database, you probably won't benefit from this organization. However, if you
-are a developer or want to extend Phabricator or look under the hood, it's
+are a developer or want to extend Phorge or look under the hood, it's
easier to find what you're looking for and work with the tables when they're
organized by application.
@@ -118,7 +118,7 @@ each database, databases do cost something.
However, this cost is an artificial cost imposed by the selected environment,
and this is only the first of many issues you'll run into trying to install and
-run Phabricator on a shared host. These issues are why we strongly discourage
+run Phorge on a shared host. These issues are why we strongly discourage
using shared hosts, and recommend against them in the install guide.
diff --git a/src/docs/flavor/soon_static_resources.diviner b/src/docs/flavor/soon_static_resources.diviner
index 96f28cfe2f..79fbc29819 100644
--- a/src/docs/flavor/soon_static_resources.diviner
+++ b/src/docs/flavor/soon_static_resources.diviner
@@ -121,6 +121,6 @@ version of CSS and JS into the database.
= Reference Implementation: Celerity =
-Some of the ideas discussed here are implemented in Phabricator's //Celerity//
+Some of the ideas discussed here are implemented in Phorge's's //Celerity//
system, which is essentially a simplified version of the //Haste// system used
by Facebook.
diff --git a/src/docs/flavor/things_you_should_do_now.diviner b/src/docs/flavor/things_you_should_do_now.diviner
index 0d3b4135ba..58a5b8eaea 100644
--- a/src/docs/flavor/things_you_should_do_now.diviner
+++ b/src/docs/flavor/things_you_should_do_now.diviner
@@ -134,5 +134,5 @@ query escaping system the rest of the application does.
Hopefully, whatever language you're writing in has good query libraries that
can handle escaping for you. If so, use them. If you're using PHP and don't have
-a solution in place yet, the Phabricator implementation of `qsprintf()` is
+a solution in place yet, the Phorge implementation of `qsprintf()` is
similar to Facebook's system and was successful there.
diff --git a/src/docs/flavor/writing_reviewable_code.diviner b/src/docs/flavor/writing_reviewable_code.diviner
index edff09f7d0..8cebc5d3e4 100644
--- a/src/docs/flavor/writing_reviewable_code.diviner
+++ b/src/docs/flavor/writing_reviewable_code.diviner
@@ -3,14 +3,14 @@
Project recommendations on how to structure changes.
-This document is purely advisory. Phabricator works with a variety of revision
+This document is purely advisory. Phorge works with a variety of revision
control strategies, and diverging from the recommendations in this document
will not impact your ability to use it for code review and source management.
= Overview =
This document describes a strategy for structuring changes used successfully at
-Facebook and in Phabricator. In essence:
+Facebook and in Phorge. In essence:
- Each commit should be as small as possible, but no smaller.
- The smallest a commit can be is a single cohesive idea: don't make commits
@@ -71,8 +71,8 @@ make any sense and you would increase the collective complexity. The real goal
is for each change to have minimal complexity, line size is just a proxy that is
often well-correlated with complexity.
-We generally follow these practices in Phabricator. The median change size for
-Phabricator is 35 lines.
+We generally follow these practices in Phorge. The median change size for
+Phorge is 35 lines.
= Write Sensible Commit Messages =
@@ -146,7 +146,7 @@ really all that important in commit messages include:
reasons //why// a change is happening into the commit message.
- Although maybe the spelling and grammar shouldn't be egregiously bad?
-Phabricator does not have guidelines for this stuff. You can obviously set
+Phorge does not have guidelines for this stuff. You can obviously set
guidelines at your organization if you prefer, but getting the //why// into the
message is the most important part.
diff --git a/src/docs/user/cluster/cluster.diviner b/src/docs/user/cluster/cluster.diviner
index 2362b80485..10f8e98e4c 100644
--- a/src/docs/user/cluster/cluster.diviner
+++ b/src/docs/user/cluster/cluster.diviner
@@ -1,7 +1,7 @@
@title Clustering Introduction
@group cluster
-Guide to configuring Phabricator across multiple hosts for availability and
+Guide to configuring Phorge across multiple hosts for availability and
performance.
@@ -12,7 +12,7 @@ WARNING: This feature is a prototype. Installs should expect a challenging
adventure when deploying clusters. In the best of times, configuring a
cluster is complex and requires significant operations experience.
-Phabricator can be configured to run on multiple hosts with redundant services
+Phorge can be configured to run on multiple hosts with redundant services
to improve its availability and scalability, and make disaster recovery much
easier.
@@ -20,7 +20,7 @@ Clustering is more complex to setup and maintain than running everything on a
single host, but greatly reduces the cost of recovering from hardware and
network failures.
-Each Phabricator service has an array of clustering options that can be
+Each Phorge service has an array of clustering options that can be
configured somewhat independently. Configuring a cluster is inherently complex,
and this is an advanced feature aimed at installs with large userbases and
experienced operations personnel who need this high degree of flexibility.
@@ -55,7 +55,7 @@ See below for a walkthrough of these services in greater detail.
Preparing for Clustering
========================
-To begin deploying Phabricator in cluster mode, set up `cluster.addresses`
+To begin deploying Phorge in cluster mode, set up `cluster.addresses`
in your configuration.
This option should contain a list of network address blocks which are considered
@@ -65,8 +65,8 @@ hosts in the cluster, so this list should be as small as possible. See "Cluster
Whitelist Security" below for discussion.
If you are deploying hardware in EC2, a reasonable approach is to launch a
-dedicated Phabricator VPC, whitelist the whole VPC as a Phabricator cluster,
-and then deploy only Phabricator services into that VPC.
+dedicated Phorge VPC, whitelist the whole VPC as a Phorge cluster,
+and then deploy only Phorge services into that VPC.
If you have additional auxiliary hosts which run builds and tests via Drydock,
you should //not// include them in the cluster address definition. For more
@@ -84,7 +84,7 @@ When you configure `cluster.addresses`, you should keep the list of trusted
cluster hosts as small as possible. Hosts on this list gain additional
capabilities, including these:
-**Trusted HTTP Headers**: Normally, Phabricator distrusts the load balancer
+**Trusted HTTP Headers**: Normally, Phorge distrusts the load balancer
HTTP headers `X-Forwarded-For` and `X-Forwarded-Proto` because they may be
client-controlled and can be set to arbitrary values by an attacker if no load
balancer is deployed. In particular, clients can set `X-Forwarded-For` to any
@@ -134,7 +134,7 @@ highest impact on availability and resistance to data loss. This is usually the
most important service to make redundant if your focus is on availability and
disaster recovery.
-Configuring replicas allows Phabricator to run in read-only mode if you lose
+Configuring replicas allows Phorge to run in read-only mode if you lose
the master and to quickly promote the replica as a replacement.
For details, see @{article:Cluster: Databases}.
@@ -147,7 +147,7 @@ Configuring multiple repository hosts is complex, but is required before you
can add multiple daemon or web hosts.
Repository replicas are important for availability if you host repositories
-on Phabricator, but less important if you host repositories elsewhere
+on Phorge, but less important if you host repositories elsewhere
(instead, you should focus on making that service more available).
The distributed nature of Git and Mercurial tend to mean that they are
@@ -243,7 +243,7 @@ Cluster: Fulltext Search
Configuring search services is relatively simple and has no pre-requisites.
-By default, Phabricator uses MySQL as a fulltext search engine, so deploying
+By default, Phorge uses MySQL as a fulltext search engine, so deploying
multiple database hosts will effectively also deploy multiple fulltext search
hosts.
@@ -257,7 +257,7 @@ Overlaying Services
===================
Although hosts can run a single dedicated service type, certain groups of
-services work well together. Phabricator clusters usually do not need to be
+services work well together. Phorge clusters usually do not need to be
very large, so deploying a small number of hosts with multiple services is a
good place to start.
diff --git a/src/docs/user/cluster/cluster_daemons.diviner b/src/docs/user/cluster/cluster_daemons.diviner
index 8cde3e7b7d..53495280ff 100644
--- a/src/docs/user/cluster/cluster_daemons.diviner
+++ b/src/docs/user/cluster/cluster_daemons.diviner
@@ -1,7 +1,7 @@
@title Cluster: Daemons
@group cluster
-Configuring Phabricator to use multiple daemon hosts.
+Configuring Phorge to use multiple daemon hosts.
Overview
========
@@ -38,7 +38,7 @@ Dedicated Daemon Hosts
You can launch additional daemon hosts without any special configuration.
Daemon hosts must be able to reach other hosts on the network, but do not need
-to run any services (like HTTP or SSH). Simply deploy the Phabricator software
+to run any services (like HTTP or SSH). Simply deploy the Phorge software
and configuration and start the daemons.
Normally, there is little reason to deploy dedicated daemon hosts. They can
diff --git a/src/docs/user/cluster/cluster_databases.diviner b/src/docs/user/cluster/cluster_databases.diviner
index 51bf14d925..c13cc2eba4 100644
--- a/src/docs/user/cluster/cluster_databases.diviner
+++ b/src/docs/user/cluster/cluster_databases.diviner
@@ -1,12 +1,12 @@
@title Cluster: Databases
@group cluster
-Configuring Phabricator to use multiple database hosts.
+Configuring Phorge to use multiple database hosts.
Overview
========
-You can deploy Phabricator with multiple database hosts, configured as a master
+You can deploy Phorge with multiple database hosts, configured as a master
and a set of replicas. The advantages of doing this are:
- faster recovery from disasters by promoting a replica;
@@ -15,24 +15,24 @@ and a set of replicas. The advantages of doing this are:
This configuration is complex, and many installs do not need to pursue it.
-If you lose the master, Phabricator can degrade automatically into read-only
+If you lose the master, Phorge can degrade automatically into read-only
mode and remain available, but can not fully recover without operational
intervention unless the master recovers on its own.
-Phabricator will not currently send read traffic to replicas unless the master
+Phorge will not currently send read traffic to replicas unless the master
has failed, so configuring a replica will not currently spread any load away
-from the master. Future versions of Phabricator are expected to be able to
+from the master. Future versions of Phorge are expected to be able to
distribute some read traffic to replicas.
-Phabricator can not currently be configured into a multi-master mode, nor can
+Phorge can not currently be configured into a multi-master mode, nor can
it be configured to automatically promote a replica to become the new master.
There are no current plans to support multi-master mode or autonomous failover,
although this may change in the future.
-Phabricator applications //can// be partitioned across multiple database
+Phorge applications //can// be partitioned across multiple database
masters. This does not provide redundancy and generally does not increase
resilience or resistance to data loss, but can help you scale and operate
-Phabricator. For details, see
+Phorge. For details, see
@{article:Cluster: Partitioning and Advanced Configuration}.
@@ -44,32 +44,32 @@ To begin, set up a replica database server and configure MySQL replication.
If you aren't sure how to do this, refer to the MySQL manual for instructions.
The MySQL documentation is comprehensive and walks through the steps and
options in good detail. You should understand MySQL replication before
-deploying it in production: Phabricator layers on top of it, and does not
+deploying it in production: Phorge layers on top of it, and does not
attempt to abstract it away.
-Some useful notes for configuring replication for Phabricator:
+Some useful notes for configuring replication for Phorge:
-**Binlog Format**: Phabricator issues some queries which MySQL will detect as
+**Binlog Format**: Phorge issues some queries which MySQL will detect as
unsafe if you use the `STATEMENT` binlog format (the default). Instead, use
`MIXED` (recommended) or `ROW` as the `binlog_format`.
-**Grant `REPLICATION CLIENT` Privilege**: If you give the user that Phabricator
+**Grant `REPLICATION CLIENT` Privilege**: If you give the user that Phorge
will use to connect to the replica database server the `REPLICATION CLIENT`
-privilege, Phabricator's status console can give you more information about
+privilege, Phorge's status console can give you more information about
replica health and state.
-**Copying Data to Replicas**: Phabricator currently uses a mixture of MyISAM
+**Copying Data to Replicas**: Phorge currently uses a mixture of MyISAM
and InnoDB tables, so it can be difficult to guarantee that a dump is wholly
consistent and suitable for loading into a replica because MySQL uses different
consistency mechanisms for the different storage engines.
An approach you may want to consider to limit downtime but still produce a
-consistent dump is to leave Phabricator running but configured in read-only
+consistent dump is to leave Phorge running but configured in read-only
mode while dumping:
- Stop all the daemons.
- Set `cluster.read-only` to `true` and deploy the new configuration. The
- web UI should now show that Phabricator is in "Read Only" mode.
+ web UI should now show that Phorge is in "Read Only" mode.
- Dump the database. You can do this with `bin/storage dump --for-replica`
to add the `--master-data` flag to the underlying command and include a
`CHANGE MASTER ...` statement in the dump.
@@ -81,18 +81,18 @@ binary logs on startup with the `expire_logs_days` option. If you do not
configure this and do not explicitly purge old logs with `PURGE BINARY LOGS`,
the binary logs on disk will grow unboundedly and relatively quickly.
-Once you have a working replica, continue below to tell Phabricator about it.
+Once you have a working replica, continue below to tell Phorge about it.
Configuring Replicas
====================
-Once your replicas are in working order, tell Phabricator about them by
+Once your replicas are in working order, tell Phorge about them by
configuring the `cluster.databases` option. This option must be configured from
-the command line or in configuration files because Phabricator needs to read
+the command line or in configuration files because Phorge needs to read
it //before// it can connect to databases.
-This option value will list all of the database hosts that you want Phabricator
+This option value will list all of the database hosts that you want Phorge
to interact with: your master and all your replicas. Each entry in the list
should have these keys:
@@ -105,7 +105,7 @@ should have these keys:
host. If omitted, the default from `mysql.user` will be used.
- `pass`: //Optional string.// The password to use to connect to this host.
If omitted, the default from `mysql.pass` will be used.
- - `disabled`: //Optional bool.// If set to `true`, Phabricator will not
+ - `disabled`: //Optional bool.// If set to `true`, Phorge will not
connect to this host. You can use this to temporarily take a host out
of service.
@@ -113,7 +113,7 @@ When `cluster.databases` is configured the `mysql.host` option is not used.
The other MySQL connection configuration options (`mysql.port`, `mysql.user`,
`mysql.pass`) are used only to provide defaults.
-Once you've configured this option, restart Phabricator for the changes to take
+Once you've configured this option, restart Phorge for the changes to take
effect, then continue to "Monitoring Replicas" to verify the configuration.
@@ -131,7 +131,7 @@ request//. If you are recovering from a disaster, the view this page shows
may be partial or misleading, and two requests served by different servers may
see different views of the cluster.
-**Connection**: Phabricator tries to connect to each configured database, then
+**Connection**: Phorge tries to connect to each configured database, then
shows the result in this column. If it fails, a brief diagnostic message with
details about the error is shown. If it succeeds, the column shows a rough
measurement of latency from the current webserver to the database.
@@ -141,7 +141,7 @@ things are properly configured and stable, the replicas should be actively
replicating and no more than a few seconds behind master, and the master
should //not// be replicating from another database.
-To report this status, the user Phabricator is connecting as must have the
+To report this status, the user Phorge is connecting as must have the
`REPLICATION CLIENT` privilege (or the `SUPER` privilege) so it can run the
`SHOW SLAVE STATUS` command. The `REPLICATION CLIENT` privilege only enables
the user to run diagnostic commands so it should be reasonable to grant it in
@@ -163,12 +163,12 @@ see an older view of the world which could be confusing for users: it may
appear that their data has been lost, even if it is safe and just hasn't
replicated yet.
-Phabricator will attempt to prevent clients from seeing out-of-date views, but
+Phorge will attempt to prevent clients from seeing out-of-date views, but
sometimes sending traffic to a delayed replica is the best available option
(for example, if the master can not be reached).
**Health**: This column shows the result of recent health checks against the
-server. After several checks in a row fail, Phabricator will mark the server
+server. After several checks in a row fail, Phorge will mark the server
as unhealthy and stop sending traffic to it until several checks in a row
later succeed.
@@ -189,12 +189,12 @@ To test that your configuration can survive a disaster, turn off the master
database. Do this with great ceremony, making a cool explosion sound as you
run the `mysqld stop` command.
-If things have been set up properly, Phabricator should degrade to a temporary
+If things have been set up properly, Phorge should degrade to a temporary
read-only mode immediately. After a brief period of unresponsiveness, it will
degrade further into a longer-term read-only mode. For details on how this
works internally, see "Unreachable Masters" below.
-Once satisfied, turn the master back on. After a brief delay, Phabricator
+Once satisfied, turn the master back on. After a brief delay, Phorge
should recognize that the master is healthy again and recover fully.
Throughout this process, the {nav Database Servers} console will show a
@@ -202,7 +202,7 @@ current view of the world from the perspective of the web server handling the
request. You can use it to monitor state.
You can perform a more narrow test by enabling `cluster.read-only` in
-configuration. This will put Phabricator into read-only mode immediately
+configuration. This will put Phorge into read-only mode immediately
without turning off any databases.
You can use this mode to understand which capabilities will and will not be
@@ -211,7 +211,7 @@ accessible in a disaster (like wiki pages or contact information) is really
accessible.
See the next section, "Degradation to Read Only Mode", for more details about
-when, why, and how Phabricator degrades.
+when, why, and how Phorge degrades.
If you run custom code or extensions, they may not accommodate read-only mode
properly. You should specifically test that they function correctly in
@@ -221,14 +221,14 @@ read-only mode and do not prevent you from accessing important information.
Degradation to Read-Only Mode
=============================
-Phabricator will degrade to read-only mode when any of these conditions occur:
+Phorge will degrade to read-only mode when any of these conditions occur:
- you turn it on explicitly;
- you configure cluster mode, but don't set up any masters;
- the master can not be reached while handling a request; or
- recent attempts to connect to the master have consistently failed.
-When Phabricator is running in read-only mode, users can still read data and
+When Phorge is running in read-only mode, users can still read data and
browse and clone repositories, but they can not edit, update, or push new
changes. For example, users can still read disaster recovery information on
the wiki or emergency contact information on user profiles.
@@ -239,14 +239,14 @@ reasons you might want to do this include:
- to test that the mode works like you expect it to;
- to make sure that information you need will be available;
- to prevent new writes while performing database maintenance; or
- - to permanently archive a Phabricator install.
+ - to permanently archive a Phorge install.
You can also enable this mode implicitly by configuring `cluster.databases`
but disabling the master, or by not specifying any host as a master. This may
be more convenient than turning it on explicitly during the course of
operations work.
-If Phabricator is unable to reach the master database, it will degrade into
+If Phorge is unable to reach the master database, it will degrade into
read-only mode automatically. See "Unreachable Masters" below for details on
how this process works.
@@ -258,12 +258,12 @@ the new master. See the next section, "Promoting a Replica", for details.
Promoting a Replica
===================
-If you lose access to the master database, Phabricator will degrade into
+If you lose access to the master database, Phorge will degrade into
read-only mode. This is described in greater detail below.
The easiest way to get out of read-only mode is to restore the master database.
If the database recovers on its own or operations staff can revive it,
-Phabricator will return to full working order after a few moments.
+Phorge will return to full working order after a few moments.
If you can't restore the master or are unsure you will be able to restore the
master quickly, you can promote a replica to become the new master instead.
@@ -295,16 +295,16 @@ redundancy.
Unreachable Masters
===================
-This section describes how Phabricator determines that a master has been lost,
+This section describes how Phorge determines that a master has been lost,
marks it unreachable, and degrades into read-only mode.
-Phabricator degrades into read-only mode automatically in two ways: very
+Phorge degrades into read-only mode automatically in two ways: very
briefly in response to a single connection failure, or more permanently in
response to a series of connection failures.
In the first case, if a request needs to connect to the master but is not able
-to, Phabricator will temporarily degrade into read-only mode for the remainder
-of that request. The alternative is to fail abruptly, but Phabricator can
+to, Phorge will temporarily degrade into read-only mode for the remainder
+of that request. The alternative is to fail abruptly, but Phorge can
sometimes degrade successfully and still respond to the user's request, so it
makes an effort to finish serving the request from replicas.
@@ -314,19 +314,19 @@ if it was a read that did not actually need to use the master it may succeed.
This temporary mode is intended to recover as gracefully as possible from brief
interruptions in service (a few seconds), like a server being restarted, a
network link becoming temporarily unavailable, or brief periods of load-related
-disruption. If the anomaly is temporary, Phabricator should recover immediately
+disruption. If the anomaly is temporary, Phorge should recover immediately
(on the next request once service is restored).
This mode can be slow for users (they need to wait on connection attempts to
the master which fail) and does not reduce load on the master (requests still
attempt to connect to it).
-The second way Phabricator degrades is by running periodic health checks
+The second way Phorge degrades is by running periodic health checks
against databases, and marking them unhealthy if they fail over a longer period
of time. This mechanism is very similar to the health checks that most HTTP
load balancers perform against web servers.
-If a database fails several health checks in a row, Phabricator will mark it as
+If a database fails several health checks in a row, Phorge will mark it as
unhealthy and stop sending all traffic (except for more health checks) to it.
This improves performance during a service interruption and reduces load on the
master, which may help it recover from load problems.
@@ -336,13 +336,13 @@ console. The "Health" column shows how many checks have run recently and
how many have succeeded.
Health checks run every 3 seconds, and 5 checks in a row must fail or succeed
-before Phabricator marks the database as healthy or unhealthy, so it will
+before Phorge marks the database as healthy or unhealthy, so it will
generally take about 15 seconds for a database to change state after it goes
down or comes up.
-If all of the recent checks fail, Phabricator will mark the database as
+If all of the recent checks fail, Phorge will mark the database as
unhealthy and stop sending traffic to it. If the master was the database that
-was marked as unhealthy, Phabricator will actively degrade into read-only mode
+was marked as unhealthy, Phorge will actively degrade into read-only mode
until it recovers.
This mode only attempts to connect to the unhealthy database once every few
@@ -350,7 +350,7 @@ seconds to see if it is recovering, so performance will be better on average
(users rarely need to wait for bad connections to fail or time out) and the
database will receive less load.
-Once all of the recent checks succeed, Phabricator will mark the database as
+Once all of the recent checks succeed, Phorge will mark the database as
healthy again and continue sending traffic to it.
Health checks are tracked individually for each web server, so some web servers
@@ -397,7 +397,7 @@ might be quick) without needing to restore backups (which might be very slow).
Delayed replication is outside the scope of this document, but may be worth
considering as an additional data security step on top of backup snapshots
depending on your resources and needs. If you configure a delayed replica, do
-not add it to the `cluster.databases` configuration: Phabricator should never
+not add it to the `cluster.databases` configuration: Phorge should never
send traffic to it, and does not need to know about it.
diff --git a/src/docs/user/cluster/cluster_devices.diviner b/src/docs/user/cluster/cluster_devices.diviner
index c90aa220c4..af29978345 100644
--- a/src/docs/user/cluster/cluster_devices.diviner
+++ b/src/docs/user/cluster/cluster_devices.diviner
@@ -6,7 +6,7 @@ Guide to configuring hosts to act as cluster devices.
Cluster Context
===============
-This document describes a step in configuring Phabricator to run on
+This document describes a step in configuring Phorge to run on
multiple hosts in a cluster configuration. This is an advanced feature. For
more information on clustering, see @{article:Clustering Introduction}.
@@ -38,7 +38,7 @@ Today, this is primarily necessary when configuring repository clusters.
Using Almanac
=============
-The tool Phabricator uses to manage cluster devices is the **Almanac**
+The tool Phorge uses to manage cluster devices is the **Almanac**
application, and most configuration will occur through the application's web
UI. If you are not familiar with it, see @{article:Almanac User Guide} first.
This document assumes you are familiar with Almanac concepts.
@@ -52,7 +52,7 @@ remainder of this document walks through these points in more detail.
- Create an Almanac device record for each device.
- Generate, add, and trust SSH keys if necessary.
- - Install Phabricator on the host.
+ - Install Phorge on the host.
- Use `bin/almanac register` from the host to register it as a device.
See below for guidance on each of these steps.
@@ -76,7 +76,7 @@ setting up a small cluster (2-3 devices) for the first time.
Using **shared keys** makes key management easier but safety checks won't be
able to catch a few kinds of mistakes. This may be a better choice if you are
setting up a larger cluster, plan to expand the cluster later, or have
-experience with Phabricator clustering.
+experience with Phorge clustering.
Because all cluster keys are all-powerful, there is no material difference
between these methods from a security or trust viewpoint. Unique keys are just
@@ -87,11 +87,11 @@ easier at larger scales.
Create Almanac Device Records
=============================
-For each host you plan to make part of a Phabricator cluster, go to the
+For each host you plan to make part of a Phorge cluster, go to the
{nav Almanac} application and create a **device** record. For guidance on this
application, see @{article:Almanac User Guide}.
-Add **interfaces** to each device record so Phabricator can tell how to
+Add **interfaces** to each device record so Phorge can tell how to
connect to these hosts. Normally, you'll add one HTTP interface (usually on
port 80) and one SSH interface (by default, on port 2222) to each device:
@@ -107,9 +107,9 @@ up with records that look like these:
Note that these hosts will normally run two `sshd` ports: the standard `sshd`
which you connect to to operate and administrate the host, and the special
-Phabricator `sshd` that you connect to to clone and push repositories.
+Phorge `sshd` that you connect to to clone and push repositories.
-You should specify the Phabricator `sshd` port, **not** the standard `sshd`
+You should specify the Phorge `sshd` port, **not** the standard `sshd`
port.
If you're using **unique** SSH keys for each device, continue to the next step.
@@ -141,8 +141,8 @@ in the web UI and run this command from the command line for each key, to mark
each key as trusted:
```
-phabricator/ $ ./bin/almanac trust-key --id
-phabricator/ $ ./bin/almanac trust-key --id
+phorge/ $ ./bin/almanac trust-key --id
+phorge/ $ ./bin/almanac trust-key --id
...
```
@@ -153,27 +153,27 @@ policy checks without requiring additional credentials. Guard them carefully!
If you need to revoke trust for a key later, use `untrust-key`:
```
-phabricator/ $ ./bin/almanac untrust-key --id
+phorge/ $ ./bin/almanac untrust-key --id
```
Once the keys are trusted, continue to the next step.
-Install Phabricator
+Install Phorge
===================
-If you haven't already, install Phabricator on each device you plan to enroll
+If you haven't already, install Phorge on each device you plan to enroll
in the cluster. Cluster repository devices must provide services over both HTTP
and SSH, so you need to install and configure both a webserver and a
-Phabricator `sshd` on these hosts.
+Phorge `sshd` on these hosts.
Generally, you will follow whatever process you otherwise use when installing
-Phabricator.
+Phorge.
NOTE: Do not start the daemons on the new devices yet. They won't work properly
until you've finished configuring things.
-Once Phabricator is installed, you can enroll the devices in the cluster by
+Once Phorge is installed, you can enroll the devices in the cluster by
registering them.
@@ -223,7 +223,7 @@ with the trusted key. The `--identify-as` flag allows several different hosts
to share the same key but still identify as different devices.
The overall effect of the `bin/almanac` command is to copy identity and key
-files into `phabricator/conf/keys/`. You can inspect the results by examining
+files into `phorge/conf/keys/`. You can inspect the results by examining
that directory. The helper script just catches potential mistakes and makes
sure the process is completed correctly.
diff --git a/src/docs/user/cluster/cluster_notifications.diviner b/src/docs/user/cluster/cluster_notifications.diviner
index 79c89769fc..2893aefa91 100644
--- a/src/docs/user/cluster/cluster_notifications.diviner
+++ b/src/docs/user/cluster/cluster_notifications.diviner
@@ -1,7 +1,7 @@
@title Cluster: Notifications
@group cluster
-Configuring Phabricator to use multiple notification servers.
+Configuring Phorge to use multiple notification servers.
Overview
========
@@ -29,7 +29,7 @@ never authoritative and never the only way for users to learn about events.
For example, if a notification about a task update is not delivered, the next
page you load will still show the notification in your notification menu.
-Generally, Phabricator works fine without notifications configured at all, so
+Generally, Phorge works fine without notifications configured at all, so
clustering assumes that losing some messages during a disruption is acceptable.
@@ -88,7 +88,7 @@ A simple example with two servers might look like this:
```
-Configuring Phabricator
+Configuring Phorge
=======================
To configure clustering on the client side, add every service you run to
diff --git a/src/docs/user/cluster/cluster_partitioning.diviner b/src/docs/user/cluster/cluster_partitioning.diviner
index 20ae11d6a6..cfac0d02ac 100644
--- a/src/docs/user/cluster/cluster_partitioning.diviner
+++ b/src/docs/user/cluster/cluster_partitioning.diviner
@@ -1,12 +1,12 @@
@title Cluster: Partitioning and Advanced Configuration
@group cluster
-Guide to partitioning Phabricator applications across multiple database hosts.
+Guide to partitioning Phorge applications across multiple database hosts.
Overview
========
-You can partition Phabricator's applications across multiple databases. For
+You can partition Phorge's applications across multiple databases. For
example, you can move an application like Files or Maniphest to a dedicated
database host.
@@ -18,7 +18,7 @@ The advantages of doing this are:
operating the cluster easier.
This configuration is complex, and very few installs will benefit from pursuing
-it. Phabricator will normally run comfortably with a single database master
+it. Phorge will normally run comfortably with a single database master
even for large organizations.
Partitioning generally does not do much to increase resilience or make it
@@ -41,10 +41,10 @@ See "Advanced Configuration", below, for additional discussion.
What Partitioning Does
======================
-When you partition Phabricator, you move all of the data for one or more
+When you partition Phorge, you move all of the data for one or more
applications (like Maniphest) to a new master database host. This is possible
-because Phabricator stores data for each application in its own logical
-database (like `phabricator_maniphest`) and performs no joins between databases.
+because Phorge stores data for each application in its own logical
+database (like `phorge_maniphest`) and performs no joins between databases.
If you're running into scale limits on a single master database, you can move
one or more of your most commonly-used applications to a second database host
@@ -78,7 +78,7 @@ each `replica` database follows. Here's a simple example config:
{
"host": "db001.corporation.com",
"role": "master",
- "user": "phabricator",
+ "user": "phorge",
"pass": "hunter2!trustno1",
"port": 3306,
"partition": [
@@ -88,7 +88,7 @@ each `replica` database follows. Here's a simple example config:
{
"host": "db002.corporation.com",
"role": "replica",
- "user": "phabricator",
+ "user": "phorge",
"pass": "hunter2!trustno1",
"port": 3306,
"master": "db001.corporation.com:3306"
@@ -96,7 +96,7 @@ each `replica` database follows. Here's a simple example config:
{
"host": "db003.corporation.com",
"role": "master",
- "user": "phabricator",
+ "user": "phorge",
"pass": "hunter2!trustno1",
"port": 3306,
"partition": [
@@ -108,7 +108,7 @@ each `replica` database follows. Here's a simple example config:
{
"host": "db004.corporation.com",
"role": "replica",
- "user": "phabricator",
+ "user": "phorge",
"pass": "hunter2!trustno1",
"port": 3306,
"master": "db003.corporation.com:3306"
@@ -137,7 +137,7 @@ configuration.
To commit the configuration, run this command:
```
-phabricator/ $ ./bin/storage partition
+phorge/ $ ./bin/storage partition
```
Run this command after making any partition or clustering changes. Webservers
@@ -154,16 +154,16 @@ To add a new partition, follow these steps:
- Add the new database to `cluster.databases`, but keep its "partition"
configuration empty (just an empty list). If this is the first time you
are partitioning, you will need to configure your existing master as the
- new "default". This will let Phabricator interact with it, but won't send
+ new "default". This will let Phorge interact with it, but won't send
any traffic to it yet.
- Run `bin/storage partition`.
- Run `bin/storage upgrade` to initialize the schemata on the new hosts.
- - Stop writes to the applications you want to move by putting Phabricator
+ - Stop writes to the applications you want to move by putting Phorge
in read-only mode, or shutting down the webserver and daemons, or telling
everyone not to touch anything.
- Dump the data from the application databases on the old master.
- Load the data into the application databases on the new master.
- - Reconfigure the "partition" setup so that Phabricator knows the databases
+ - Reconfigure the "partition" setup so that Phorge knows the databases
have moved.
- Run `bin/storage partition`.
- While still in read-only mode, check that all the data appears to be
@@ -178,7 +178,7 @@ end-to-end before performing a larger, higher-stakes migration.
How Partitioning Works
======================
-If you have multiple masters, Phabricator keeps the entire set of schemata up
+If you have multiple masters, Phorge keeps the entire set of schemata up
to date on all of them. When you run `bin/storage upgrade` or other storage
management commands, they generally affect all masters (if they do not, they
will prompt you to be more specific).
@@ -197,7 +197,7 @@ There are some exceptions to this rule. For example, all masters keep track
of which patches have been applied to that particular master so that
`bin/storage upgrade` can upgrade hosts correctly.
-Phabricator does not perform joins across logical databases, so there are no
+Phorge does not perform joins across logical databases, so there are no
meaningful differences in runtime behavior if two applications are on the same
physical host or different physical hosts.
@@ -212,7 +212,7 @@ only one master.
`persistent` //(bool)// Enables persistent connections. Defaults to off.
-With persistent connections enabled, Phabricator will keep a pool of database
+With persistent connections enabled, Phorge will keep a pool of database
connections open between web requests and reuse them when serving subsequent
requests.
@@ -224,7 +224,7 @@ because requests are unable to bind to an outbound port, enabling this option
is likely to fix the issue. This option may also slightly increase performance.
The cost of using persistent connections is that you may need to raise the
-MySQL `max_connections` setting: although Phabricator will make far fewer
+MySQL `max_connections` setting: although Phorge will make far fewer
connections, the connections it does make will be longer-lived. Raising this
setting will increase MySQL memory requirements and may run into other limits,
like `open_files_limit`, which may also need to be raised.
diff --git a/src/docs/user/cluster/cluster_repositories.diviner b/src/docs/user/cluster/cluster_repositories.diviner
index a2e5fd5b68..2160a73fef 100644
--- a/src/docs/user/cluster/cluster_repositories.diviner
+++ b/src/docs/user/cluster/cluster_repositories.diviner
@@ -1,12 +1,12 @@
@title Cluster: Repositories
@group cluster
-Configuring Phabricator to use multiple repository hosts.
+Configuring Phorge to use multiple repository hosts.
Overview
========
-If you use Git, you can deploy Phabricator with multiple repository hosts,
+If you use Git, you can deploy Phorge with multiple repository hosts,
configured so that each host is readable and writable. The advantages of doing
this are:
@@ -22,11 +22,11 @@ This configuration is not currently supported with Subversion or Mercurial.
How Reads and Writes Work
=========================
-Phabricator repository replicas are multi-master: every node is readable and
+Phorge repository replicas are multi-master: every node is readable and
writable, and a cluster of nodes can (almost always) survive the loss of any
arbitrary subset of nodes so long as at least one node is still alive.
-Phabricator maintains an internal version for each repository, and increments
+Phorge maintains an internal version for each repository, and increments
it when the repository is mutated.
Before responding to a read, replicas make sure their version of the repository
@@ -77,7 +77,7 @@ similar agents of other rogue nations is beyond the scope of this document.
Repository Hosts
================
-Repository hosts must run a complete, fully configured copy of Phabricator,
+Repository hosts must run a complete, fully configured copy of Phorge,
including a webserver. They must also run a properly configured `sshd`.
If you are converting existing hosts into cluster hosts, you may need to
@@ -123,7 +123,7 @@ Almanac:
- First, register at least one device according to the device clustering
instructions.
- - Create a new service of type **Phabricator Cluster: Repository** in
+ - Create a new service of type **Phorge Cluster: Repository** in
Almanac.
- Bind this service to all the interfaces on the device or devices.
- For each binding, add a `protocol` key with one of these values:
@@ -170,11 +170,11 @@ To migrate a repository back off a service, use this command:
$ ./bin/repository clusterize --remove-service
```
-This command only changes how Phabricator connects to the repository; it does
+This command only changes how Phorge connects to the repository; it does
not move any data or make any complex structural changes.
-When Phabricator needs information about a non-clustered repository, it just
-runs a command like `git log` directly on disk. When Phabricator needs
+When Phorge needs information about a non-clustered repository, it just
+runs a command like `git log` directly on disk. When Phorge needs
information about a clustered repository, it instead makes a service call to
another server, asking that server to run `git log` instead.
@@ -213,9 +213,9 @@ To expand an existing cluster, follow these general steps:
For instructions on configuring and registering devices, see
@{article:Cluster: Devices}.
-As soon as you add active bindings to a service, Phabricator will begin
+As soon as you add active bindings to a service, Phorge will begin
synchronizing repositories and sending traffic to the new device. You do not
-need to copy any repository data to the device: Phabricator will automatically
+need to copy any repository data to the device: Phorge will automatically
synchronize it.
If you have a large amount of repository data, you may want to help this
@@ -297,7 +297,7 @@ Configuration}.
This screen shows all the configured devices which are hosting the repository
and the available version on that device.
-**Version**: When a repository is mutated by a push, Phabricator increases
+**Version**: When a repository is mutated by a push, Phorge increases
an internal version number for the repository. This column shows which version
is on disk on the corresponding device.
@@ -335,9 +335,9 @@ There are three major cluster failure modes:
are reachable.
- **Ambiguous Leaders**: The internal state of the repository is unclear.
-Phabricator can detect these issues, and responds by freezing the repository
+Phorge can detect these issues, and responds by freezing the repository
(usually preventing all reads and writes) until the issue is resolved. These
-conditions are normally rare and very little data is at risk, but Phabricator
+conditions are normally rare and very little data is at risk, but Phorge
errs on the side of caution and requires decisions which may result in data
loss to be confirmed by a human.
@@ -357,13 +357,13 @@ in a brief window during and immediately after a write. This looks like this:
- During or immediately after the write, lightning strikes the server
and destroys it.
-Phabricator can not commit changes to a working copy (stored on disk) and to
+Phorge can not commit changes to a working copy (stored on disk) and to
the global state (stored in a database) atomically, so there is necessarily a
narrow window between committing these two different states when some tragedy
can befall a server, leaving the global and local views of the repository state
possibly divergent.
-In these cases, Phabricator fails into a frozen state where further writes
+In these cases, Phorge fails into a frozen state where further writes
are not permitted until the failure is investigated and resolved. When a
repository is frozen in this way it remains readable.
@@ -391,7 +391,7 @@ was complete on disk. To demote the device and release the write lock, run this
command:
```
-phabricator/ $ ./bin/repository thaw --demote
+phorge/ $ ./bin/repository thaw --demote
```
{icon exclamation-triangle, color="yellow"} Any committed but unacknowledged
@@ -411,7 +411,7 @@ this:
and destroys it.
Here, all of the "leader" devices with the most up-to-date copy of the
-repository have been lost. Phabricator will freeze the repository refuse to
+repository have been lost. Phorge will freeze the repository refuse to
serve requests because it can not serve reads consistently and can not accept
new writes without data loss.
@@ -424,7 +424,7 @@ quickly, you can use the monitoring console to review which changes are
present on the leaders but not present on the followers by examining the
push logs.
-If you are comfortable discarding these changes, you can instruct Phabricator
+If you are comfortable discarding these changes, you can instruct Phorge
that it can forget about the leaders by doing this:
- Disable the service bindings to all of the leader devices so they are no
@@ -434,7 +434,7 @@ that it can forget about the leaders by doing this:
To demote a device, run this command:
```
-phabricator/ $ ./bin/repository thaw rXYZ --demote repo002.corp.net
+phorge/ $ ./bin/repository thaw rXYZ --demote repo002.corp.net
```
{icon exclamation-triangle, color="red"} Any data which is only present on
@@ -450,7 +450,7 @@ devices by using `--demote ` and `--all-repositories`. **This is
dangerous and discards all unreplicated data in any repository on any device.**
```
-phabricator/ $ ./bin/repository thaw --demote repo.corp.net --all-repositories
+phorge/ $ ./bin/repository thaw --demote repo.corp.net --all-repositories
```
After you do this, continue below to promote a leader and restore the cluster
@@ -474,15 +474,15 @@ error, like these:
If you are moving repositories into cluster services, you can also reach this
state if you use `clusterize` to associate a repository with a service that is
-bound to multiple active devices. In this case, Phabricator will not know which
+bound to multiple active devices. In this case, Phorge will not know which
device or devices have up-to-date information.
-When Phabricator can not tell which device in a cluster is a leader, it freezes
+When Phorge can not tell which device in a cluster is a leader, it freezes
the cluster because it is possible that some devices have less data and others
have more, and if it chooses a leader arbitrarily it may destroy some data
which you would prefer to retain.
-To resolve this, you need to tell Phabricator which device has the most
+To resolve this, you need to tell Phorge which device has the most
up-to-date data and promote that device to become a leader. If you know all
devices have the same data, you are free to promote any device.
@@ -496,7 +496,7 @@ Once you have identified a device which has data you're happy with, use
device will become authoritative:
```
-phabricator/ $ ./bin/repository thaw rXYZ --promote repo002.corp.net
+phorge/ $ ./bin/repository thaw rXYZ --promote repo002.corp.net
```
{icon exclamation-triangle, color="red"} Any data which is only present on
@@ -514,7 +514,7 @@ If something issues a `--force` push that destroys branch heads, the mutation
will propagate to the replicas.
You may be able to manually restore the branches by using tools like the
-Phabricator push log or the Git reflog so it is less important to retain
+Phorge push log or the Git reflog so it is less important to retain
repository snapshots than database snapshots, but it is still possible for
data to be lost permanently, especially if you don't notice the problem for
some time.
@@ -543,8 +543,8 @@ changes may either encounter conflicts or encounter problems with change
propagation.
You can encounter conflicts because directly modifying the working copy on disk
-won't prevent users or Phabricator itself from performing writes to the same
-working copy at the same time. Phabricator does not compromise the lower-level
+won't prevent users or Phorge itself from performing writes to the same
+working copy at the same time. Phorge does not compromise the lower-level
locks provided by the VCS so this is theoretically safe -- and this rarely
causes any significant problems in practice -- but doesn't make things any
simpler or easier.
diff --git a/src/docs/user/cluster/cluster_search.diviner b/src/docs/user/cluster/cluster_search.diviner
index 25c35aa34a..4bbd1c2fbd 100644
--- a/src/docs/user/cluster/cluster_search.diviner
+++ b/src/docs/user/cluster/cluster_search.diviner
@@ -4,10 +4,10 @@
Overview
========
-You can configure Phabricator to connect to one or more fulltext search
+You can configure Phorge to connect to one or more fulltext search
services.
-By default, Phabricator will use MySQL for fulltext search. This is suitable
+By default, Phorge will use MySQL for fulltext search. This is suitable
for most installs. However, alternate engines are supported.
@@ -33,10 +33,10 @@ like this:
]
```
-When a user makes a change to a document, Phabricator writes the updated
+When a user makes a change to a document, Phorge writes the updated
document into every configured, writable fulltext service.
-When a user issues a query, Phabricator tries configured, readable services
+When a user issues a query, Phorge tries configured, readable services
in order until it is able to execute the query successfully.
These options are supported by all service types:
@@ -141,7 +141,7 @@ After adding new search services, you will need to rebuild document indexes
on them. To do this, first initialize the services:
```
-phabricator/ $ ./bin/search init
+phorge/ $ ./bin/search init
```
This will perform index setup steps and other one-time configuration.
@@ -149,14 +149,14 @@ This will perform index setup steps and other one-time configuration.
To populate documents in all indexes, run this command:
```
-phabricator/ $ ./bin/search index --force --background --type all
+phorge/ $ ./bin/search index --force --background --type all
```
This initiates an exhaustive rebuild of the document indexes. To get a more
detailed list of indexing options available, run:
```
-phabricator/ $ ./bin/search help index
+phorge/ $ ./bin/search help index
```
@@ -166,7 +166,7 @@ Advanced Example
This is a more advanced example which shows a configuration with multiple
different services in different roles. In this example:
- - Phabricator is using an Elasticsearch 2 service as its primary fulltext
+ - Phorge is using an Elasticsearch 2 service as its primary fulltext
service.
- An Elasticsearch 5 service is online, but only receiving writes.
- The MySQL service is serving as a backup if Elasticsearch fails.
diff --git a/src/docs/user/cluster/cluster_ssh.diviner b/src/docs/user/cluster/cluster_ssh.diviner
index bdd41776f5..57551309a6 100644
--- a/src/docs/user/cluster/cluster_ssh.diviner
+++ b/src/docs/user/cluster/cluster_ssh.diviner
@@ -1,12 +1,12 @@
@title Cluster: SSH Servers
@group cluster
-Configuring Phabricator to use multiple SSH servers.
+Configuring Phorge to use multiple SSH servers.
Overview
========
-You can run Phabricator on multiple SSH servers. The advantages of doing this
+You can run Phorge on multiple SSH servers. The advantages of doing this
are:
- you can completely survive the loss of multiple SSH hosts.
@@ -24,14 +24,14 @@ Adding SSH Hosts
After configuring repositories in cluster mode, you can add more web hosts
at any time.
-First, deploy the Phabricator software and configuration to a host, then
+First, deploy the Phorge software and configuration to a host, then
register the host as a cluster device if it is not already registered (for
help, see @{article:Cluster: Devices}.)
Once the host is registered, start the SSH server, and then add the host to the
SSH load balancer pool.
-Phabricator SSH servers are stateless, so you can pull them in and out of
+Phorge SSH servers are stateless, so you can pull them in and out of
production freely.
You may also want to run web services on these hosts, since the service is very
diff --git a/src/docs/user/cluster/cluster_webservers.diviner b/src/docs/user/cluster/cluster_webservers.diviner
index 7c7c3e8b1f..7483e8f6cd 100644
--- a/src/docs/user/cluster/cluster_webservers.diviner
+++ b/src/docs/user/cluster/cluster_webservers.diviner
@@ -1,12 +1,12 @@
@title Cluster: Web Servers
@group cluster
-Configuring Phabricator to use multiple web servers.
+Configuring Phorge to use multiple web servers.
Overview
========
-You can run Phabricator on multiple web servers. The advantages of doing this
+You can run Phorge on multiple web servers. The advantages of doing this
are:
- you can completely survive the loss of multiple web hosts; and
@@ -22,14 +22,14 @@ Adding Web Hosts
After configuring repositories in cluster mode, you can add more web hosts
at any time.
-First, deploy the Phabricator software and configuration to a host, then
+First, deploy the Phorge software and configuration to a host, then
register the host as a cluster device if it is not already registered (for
help, see @{article:Cluster: Devices}.)
Once the host is registered, start the web server, and then add the host to the
load balancer pool.
-Phabricator web servers are stateless, so you can pull them in and out of
+Phorge web servers are stateless, so you can pull them in and out of
production freely.
You may also want to run SSH services on these hosts, since the service is very
diff --git a/src/docs/user/configuration/advanced_configuration.diviner b/src/docs/user/configuration/advanced_configuration.diviner
index 690b51ea04..5a2d565386 100644
--- a/src/docs/user/configuration/advanced_configuration.diviner
+++ b/src/docs/user/configuration/advanced_configuration.diviner
@@ -1,21 +1,21 @@
@title Configuration User Guide: Advanced Configuration
@group config
-Configuring Phabricator for multiple environments.
+Configuring Phorge for multiple environments.
= Overview =
-Phabricator reads configuration from multiple sources. This document explains
+Phorge reads configuration from multiple sources. This document explains
the configuration stack and how to set up advanced configuration sources, which
may be useful for deployments with multiple environments (e.g., development and
production).
This is a complicated topic for advanced users. You do not need to understand
-this topic to install Phabricator.
+this topic to install Phorge.
= Configuration Sources =
-Phabricator supports the following configuration sources, from highest priority
+Phorge supports the following configuration sources, from highest priority
to lowest priority:
- **Database**: Values are stored in the database and edited from the web UI
@@ -26,14 +26,14 @@ to lowest priority:
- **Config Files**: Values are stored in a config file in `conf/`. The file
to use is selected by writing to `conf/local/ENVIRONMENT`, or setting the
`PHABRICATOR_ENV` configuration variable. See below for more information.
- - **Defaults**: Defaults hard-coded in the Phabricator source, which can not
+ - **Defaults**: Defaults hard-coded in the Phorge source, which can not
be edited. They have the lowest priority, and all other settings override
them.
-Normally, you install and configure Phabricator by writing enough configuration
+Normally, you install and configure Phorge by writing enough configuration
into the local config to get access to the database configuration (e.g., the
MySQL username, password, and hostname), then use the web interface to further
-configure Phabricator.
+configure Phorge.
= Configuration Files =
@@ -52,7 +52,7 @@ examples below.
First, write an `exampleconfig.conf.php` file here (rename it according to the
name you chose):
- phabricator/conf/custom/exampleconfig.conf.php
+ phorge/conf/custom/exampleconfig.conf.php
Its contents should look like this:
@@ -77,14 +77,14 @@ a config like this:
== Selecting a Configuration File ==
To select a configuration file, write the name of the file (relative to
-`phabricator/conf/`) to `phabricator/conf/local/ENVIRONMENT`. For example, to
-select `phabricator/conf/custom/exampleconfig.conf.php`, you would write
-"custom/exampleconfig" to `phabricator/conf/local/ENVIRONMENT`:
+`phorge/conf/`) to `phorge/conf/local/ENVIRONMENT`. For example, to
+select `phorge/conf/custom/exampleconfig.conf.php`, you would write
+"custom/exampleconfig" to `phorge/conf/local/ENVIRONMENT`:
- phabricator/ $ echo custom/exampleconfig > conf/local/ENVIRONMENT
- phabricator/ $ cat conf/local/ENVIRONMENT
+ phorge/ $ echo custom/exampleconfig > conf/local/ENVIRONMENT
+ phorge/ $ cat conf/local/ENVIRONMENT
custom/exampleconfig
- phabricator/ $
+ phorge/ $
You can also set the environmental variable `PHABRICATOR_ENV`. This is more
involved but may be easier in some deployment environments. Note that this needs
@@ -107,8 +107,8 @@ setenv.add-environment = (
)
```
-After creating and selecting a configuration file, restart Phabricator (for
-help, see @{article:Restarting Phabricator}). Any configuration you set should
+After creating and selecting a configuration file, restart Phorge (for
+help, see @{article:Restarting Phorge}). Any configuration you set should
take effect immediately, and your file should be visible in the Config
application when examining configuration.
diff --git a/src/docs/user/configuration/configuration_guide.diviner b/src/docs/user/configuration/configuration_guide.diviner
index 8b221bda41..1fde967a95 100644
--- a/src/docs/user/configuration/configuration_guide.diviner
+++ b/src/docs/user/configuration/configuration_guide.diviner
@@ -1,7 +1,7 @@
@title Configuration Guide
@group config
-This document contains basic configuration instructions for Phabricator.
+This document contains basic configuration instructions for Phorge.
= Prerequisites =
@@ -11,7 +11,8 @@ If you haven't, see @{article:Installation Guide}.
The next steps are:
- Configure your webserver (Apache, nginx, or lighttpd).
- - Access Phabricator with your browser.
+ - Configure the databases.
+ - Access Phorge with your browser.
- Follow the instructions to complete setup.
= Webserver: Configuring Apache =
@@ -24,8 +25,8 @@ documentation for help. Make sure `mod_php` and `mod_rewrite` are enabled,
and `mod_ssl` if you intend to set up SSL.
If you haven't already, set up a domain name to point to the host you're
-installing on. You can either install Phabricator on a subdomain (like
-phabricator.example.com) or an entire domain, but you can not install it in
+installing on. You can either install Phorge on a subdomain (like
+phorge.example.com) or an entire domain, but you can not install it in
some subdirectory of an existing website. Navigate to whatever domain you're
going to use and make sure Apache serves you something to verify that DNS
is correctly configured.
@@ -33,32 +34,32 @@ is correctly configured.
NOTE: The domain must contain a dot ('.'), i.e. not be just a bare name like
'http://example/'. Some web browsers will not set cookies otherwise.
-Now create a VirtualHost entry for Phabricator. It should look something like
+Now create a VirtualHost entry for Phorge. It should look something like
this:
name=httpd.conf
# Change this to the domain which points to your host.
- ServerName phabricator.example.com
+ ServerName phorge.example.com
- # Change this to the path where you put 'phabricator' when you checked it
- # out from GitHub when following the Installation Guide.
+ # Change this to the path where you put 'phorge' when you checked it
+ # out from the upstream when following the Installation Guide.
#
# Make sure you include "/webroot" at the end!
- DocumentRoot /path/to/phabricator/webroot
+ DocumentRoot /path/to/phorge/webroot
RewriteEngine on
RewriteRule ^(.*)$ /index.php?__path__=$1 [B,L,QSA]
If Apache isn't currently configured to serve documents out of the directory
-where you put Phabricator, you may also need to add `` section. The
+where you put Phorge, you may also need to add `` section. The
syntax for this section depends on which version of Apache you're running.
(If you don't know, you can usually figure this out by running `httpd -v`.)
For Apache versions older than 2.4, use this:
name="Apache Older Than 2.4"
-
+
Order allow,deny
Allow from all
@@ -66,7 +67,7 @@ For Apache versions older than 2.4, use this:
For Apache versions 2.4 and newer, use this:
name="Apache 2.4 and Newer"
-
+
Require all granted
@@ -81,8 +82,8 @@ For nginx, use a configuration like this:
name=nginx.conf
server {
- server_name phabricator.example.com;
- root /path/to/phabricator/webroot;
+ server_name phorge.example.com;
+ root /path/to/phorge/webroot;
location / {
index index.php;
@@ -121,8 +122,8 @@ up to their sections.
For lighttpd, add a section like this to your lighttpd.conf:
- $HTTP["host"] =~ "phabricator(\.example\.com)?" {
- server.document-root = "/path/to/phabricator/webroot"
+ $HTTP["host"] =~ "phorge(\.example\.com)?" {
+ server.document-root = "/path/to/phorge/webroot"
url.rewrite-once = (
# This simulates QSA ("query string append") mode in apache
"^(/[^?]*)\?(.*)" => "/index.php?__path__=$1&$2",
@@ -167,22 +168,22 @@ no one else will be able to sign up or log in. For more information, see
During setup, you'll need to configure MySQL. To do this, get MySQL running and
verify you can connect to it. Consult the MySQL documentation for help. When
-MySQL works, you need to load the Phabricator schemata into it. To do this, run:
+MySQL works, you need to load the Phorge schemata into it. To do this, run:
- phabricator/ $ ./bin/storage upgrade
+ phorge/ $ ./bin/storage upgrade
If your configuration uses an unprivileged user to connect to the database, you
may have to override the default user so the schema changes can be applied with
root or some other admin user:
- phabricator/ $ ./bin/storage upgrade --user --password
+ phorge/ $ ./bin/storage upgrade --user --password
You can avoid the prompt the script issues by passing the `--force` flag (for
example, if you are scripting the upgrade process).
- phabricator/ $ ./bin/storage upgrade --force
+ phorge/ $ ./bin/storage upgrade --force
-NOTE: When you update Phabricator, run `storage upgrade` again to apply any
+NOTE: When you update Phorge, run `storage upgrade` again to apply any
new updates.
= Next Steps =
@@ -200,7 +201,7 @@ Continue by:
@{article:Configuring a Preamble Script}; or
- configuring where uploaded files and attachments will be stored with
@{article:Configuring File Storage}; or
- - configuring Phabricator so it can send mail with
+ - configuring Phorge so it can send mail with
@{article:Configuring Outbound Email}; or
- configuring inbound mail with @{article:Configuring Inbound Email}; or
- importing repositories with @{article:Diffusion User Guide}; or
@@ -209,4 +210,4 @@ Continue by:
@{article:Notifications User Guide: Setup and Configuration}; or
- configuring backups with
@{article:Configuring Backups and Performing Migrations}; or
- - contributing to Phabricator with @{article:Contributor Introduction}.
+ - contributing to Phorge with @{article:Contributor Introduction}.
diff --git a/src/docs/user/configuration/configuration_locked.diviner b/src/docs/user/configuration/configuration_locked.diviner
index 57ed76c5c7..19b06ea424 100644
--- a/src/docs/user/configuration/configuration_locked.diviner
+++ b/src/docs/user/configuration/configuration_locked.diviner
@@ -24,7 +24,7 @@ Locked Configuration
can edit it from the CLI instead, with `bin/config`:
```
-phabricator/ $ ./bin/config set
+phorge/ $ ./bin/config set
```
Some configuration options take complicated values which can be difficult
@@ -42,7 +42,7 @@ file:
Then, set it with `--stdin` like this:
```
-phabricator/ $ ./bin/config set --stdin < config.json
+phorge/ $ ./bin/config set --stdin < config.json
```
A few settings have alternate CLI tools. Refer to the setting page for
@@ -57,13 +57,13 @@ locked include:
**Required for bootstrapping**: Some options, like `mysql.host`, must be
-available before Phabricator can read configuration from the database.
+available before Phorge can read configuration from the database.
-If you stored `mysql.host` only in the database, Phabricator would not know how
+If you stored `mysql.host` only in the database, Phorge would not know how
to connect to the database in order to read the value in the first place.
These options must be provided in a configuration source which is read earlier
-in the bootstrapping process, before Phabricator connects to the database.
+in the bootstrapping process, before Phorge connects to the database.
**Errors could not be fixed from the web UI**: Some options, like
@@ -83,7 +83,7 @@ attacker who has gained access to an administrator account in order to gain
greater access.
For example, an attacker who could modify `cluster.mailers` (and other
-similar options), could potentially reconfigure Phabricator to send mail
+similar options), could potentially reconfigure Phorge to send mail
through an evil server they controlled, then trigger password resets on other
user accounts to compromise them.
@@ -105,8 +105,8 @@ administrator accounts) from reading them.
You can review (and edit) hidden configuration from the CLI:
```
-phabricator/ $ ./bin/config get
-phabricator/ $ ./bin/config set
+phorge/ $ ./bin/config get
+phorge/ $ ./bin/config set
```
@@ -117,12 +117,12 @@ Locked Configuration With Database Values
You may receive a setup issue warning you that a locked configuration key has a
value set in the database. Most commonly, this is because:
- - In some earlier version of Phabricator, this configuration was not locked.
+ - In some earlier version of Phorge, this configuration was not locked.
- In the past, you or some other administrator used the web UI to set a
value. This value was written to the database.
- In a later version of the software, the value became locked.
-When Phabricator was originally released, locked configuration did not yet
+When Phorge was originally released, locked configuration did not yet
exist. Locked configuration was introduced later, and then configuration options
were gradually locked for a long time after that.
@@ -134,10 +134,10 @@ to lock the value.
Locking values was more common in the past, and it is now relatively rare for
an unlocked value to become locked: when new values are introduced, they are
generally locked or hidden appropriately. In most cases, this setup issue only
-affects installs that have used Phabricator for a long time.
+affects installs that have used Phorge for a long time.
-At time of writing (February 2019), Phabricator currently respects these old
-database values. However, some future version of Phabricator will refuse to
+At time of writing (February 2019), Phorge currently respects these old
+database values. However, some future version of Phorge will refuse to
read locked configuration from the database, because this improves security if
an attacker manages to find a way to bypass restrictions on editing locked
configuration from the web UI.
@@ -147,19 +147,19 @@ you should move these configuration values from the database to a local config
file. Usually, you'll do this by first copying the value from the database:
```
-phabricator/ $ ./bin/config get
+phorge/ $ ./bin/config get
```
...into local configuration:
```
-phabricator/ $ ./bin/config set
+phorge/ $ ./bin/config set
```
...and then removing the database value:
```
-phabricator/ $ ./bin/config delete --database
+phorge/ $ ./bin/config delete --database
```
See @{Configuration User Guide: Advanced Configuration} for some more detailed
diff --git a/src/docs/user/configuration/configuring_accounts_and_registration.diviner b/src/docs/user/configuration/configuring_accounts_and_registration.diviner
index e703c46402..5d28b3342c 100644
--- a/src/docs/user/configuration/configuring_accounts_and_registration.diviner
+++ b/src/docs/user/configuration/configuring_accounts_and_registration.diviner
@@ -1,12 +1,12 @@
@title Configuring Accounts and Registration
@group config
-Describes how to configure user access to Phabricator.
+Describes how to configure user access to Phorge.
Overview
========
-Phabricator supports a number of login systems. You can enable or disable these
+Phorge supports a number of login systems. You can enable or disable these
systems to configure who can register for and access your install, and how users
with existing accounts can login.
@@ -18,7 +18,7 @@ support logging in with other credentials. For example:
- **LDAP:** Users use LDAP credentials to log in or register.
- **OAuth:** Users use accounts on a supported OAuth2 provider (like
GitHub, Facebook, or Google) to log in or register.
- - **Other Providers:** More providers are available, and Phabricator
+ - **Other Providers:** More providers are available, and Phorge
can be extended with custom providers. See the "Auth" application for
a list of available providers.
@@ -26,14 +26,14 @@ By default, no providers are enabled. You must use the "Auth" application to
add one or more providers after you complete the installation process.
After you add a provider, you can link it to existing accounts (for example,
-associate an existing Phabricator account with a GitHub OAuth account) or users
+associate an existing Phorge account with a GitHub OAuth account) or users
can use it to register new accounts (assuming you enable these options).
Recovering Inaccessible Accounts
================================
-If you accidentally lock yourself out of Phabricator (for example, by disabling
+If you accidentally lock yourself out of Phorge (for example, by disabling
all authentication providers), you can normally use the "send a login link"
action from the login screen to email yourself a login link and regain access
to your account.
@@ -43,7 +43,7 @@ can use the `bin/auth` script to recover access to an account. To recover
access, run:
```
-phabricator/ $ ./bin/auth recover
+phorge/ $ ./bin/auth recover
```
...where `` is the account username you want to recover access
diff --git a/src/docs/user/configuration/configuring_backups.diviner b/src/docs/user/configuration/configuring_backups.diviner
index 0e851d01ac..e4e088aa8e 100644
--- a/src/docs/user/configuration/configuring_backups.diviner
+++ b/src/docs/user/configuration/configuring_backups.diviner
@@ -1,21 +1,21 @@
@title Configuring Backups and Performing Migrations
@group config
-Advice for backing up Phabricator, or migrating from one machine to another.
+Advice for backing up Phorge, or migrating from one machine to another.
Overview
========
-Phabricator does not currently have a comprehensive backup system, but creating
-backups is not particularly difficult and Phabricator does have a few basic
+Phorge does not currently have a comprehensive backup system, but creating
+backups is not particularly difficult and Phorge does have a few basic
tools which can help you set up a reasonable process. In particular, the things
which needs to be backed up are:
- the MySQL databases;
- hosted repositories;
- uploaded files; and
- - your Phabricator configuration files.
+ - your Phorge configuration files.
This document discusses approaches for backing up this data.
@@ -24,25 +24,25 @@ same steps you would if you were creating a backup and then restoring it, you
will just backup the old machine and then restore the data onto the new
machine.
-WARNING: You need to restart Phabricator after restoring data.
+WARNING: You need to restart Phorge after restoring data.
-Restarting Phabricator after performing a restore makes sure that caches are
+Restarting Phorge after performing a restore makes sure that caches are
flushed properly. For complete instructions, see
-@{article:Restarting Phabricator}.
+@{article:Restarting Phorge}.
Backup: MySQL Databases
=======================
-Most of Phabricator's data is stored in MySQL, and it's the most important thing
+Most of Phorge's data is stored in MySQL, and it's the most important thing
to back up. You can run `bin/storage dump` to get a dump of all the MySQL
databases. This is a convenience script which just runs a normal `mysqldump`,
-but will only dump databases Phabricator owns.
+but will only dump databases Phorge owns.
Since most of this data is compressible, it may be helpful to run it through
gzip prior to storage. For example:
- phabricator/ $ ./bin/storage dump --compress --output backup.sql.gz
+ phorge/ $ ./bin/storage dump --compress --output backup.sql.gz
Then store the backup somewhere safe, like in a box buried under an old tree
stump. No one will ever think to look for it there.
@@ -59,7 +59,7 @@ to uncompress it first, if you compressed it prior to storage.)
Backup: Hosted Repositories
===========================
-If you host repositories in Phabricator, you should back them up. You can use
+If you host repositories in Phorge, you should back them up. You can use
`bin/repository list-paths` to show the local paths on disk for each
repository. To back them up, copy them elsewhere.
@@ -87,11 +87,11 @@ need to do any additional work.
**Amazon S3**: If you use Amazon S3, redundancy and backups are built in to the
service. This is probably sufficient for most installs. If you trust Amazon with
your data //except not really//, you can backup your S3 bucket outside of
-Phabricator.
+Phorge.
**Local Disk**: If you use the local disk storage engine, you'll need to back up
files manually. You can do this by creating a copy of the root directory where
-you told Phabricator to put files (the `storage.local-disk.path` configuration
+you told Phorge to put files (the `storage.local-disk.path` configuration
setting).
For more information about configuring how files are stored, see
@@ -108,15 +108,15 @@ Backup: Configuration Files
===========================
You should also backup your configuration files, and any scripts you use to
-deploy or administrate Phabricator (like a customized upgrade script). The best
+deploy or administrate Phorge (like a customized upgrade script). The best
way to do this is to check them into a private repository somewhere and just use
whatever backup process you already have in place for repositories. Just copying
them somewhere will work fine too, of course.
-In particular, you should backup this configuration file which Phabricator
+In particular, you should backup this configuration file which Phorge
creates:
- phabricator/conf/local/local.json
+ phorge/conf/local/local.json
This file contains all of the configuration settings that have been adjusted
by using `bin/config set `.
@@ -126,14 +126,14 @@ Restore: Configuration Files
============================
To restore configuration files, just copy them into the right locations. Copy
-your backup of `local.json` to `phabricator/conf/local/local.json`.
+your backup of `local.json` to `phorge/conf/local/local.json`.
Security
========
-MySQL dumps have no builtin encryption and most data in Phabricator is stored in
+MySQL dumps have no builtin encryption and most data in Phorge is stored in
a raw, accessible form, so giving a user access to backups is a lot like giving
-them shell access to the machine Phabricator runs on. In particular, a user who
+them shell access to the machine Phorge runs on. In particular, a user who
has the backups can:
- read data that policies do not permit them to see;
@@ -141,7 +141,7 @@ has the backups can:
- read other users' session and conduit tokens and impersonate them.
Some of this information is durable, so disclosure of even a very old backup may
-present a risk. If you restrict access to the Phabricator host or database, you
+present a risk. If you restrict access to the Phorge host or database, you
should also restrict access to the backups.
diff --git a/src/docs/user/configuration/configuring_encryption.diviner b/src/docs/user/configuration/configuring_encryption.diviner
index 36315506e6..e237573432 100644
--- a/src/docs/user/configuration/configuring_encryption.diviner
+++ b/src/docs/user/configuration/configuring_encryption.diviner
@@ -6,14 +6,14 @@ Setup guide for configuring encryption.
Overview
========
-Phabricator supports at-rest encryption of uploaded file data stored in the
+Phorge supports at-rest encryption of uploaded file data stored in the
"Files" application.
Configuring at-rest file data encryption does not encrypt any other data or
resources. In particular, it does not encrypt the database and does not encrypt
Passphrase credentials.
-Attackers who compromise a Phabricator host can read the master key and decrypt
+Attackers who compromise a Phorge host can read the master key and decrypt
the data. In most configurations, this does not represent a significant
barrier above and beyond accessing the file data. Thus, configuring at-rest
encryption is primarily useful for two types of installs:
@@ -81,7 +81,7 @@ Format: Raw Data
The `raw` storage format is automatically selected for all newly uploaded
file data if no key is marked as the `default` key in the keyring. This is
-the behavior of Phabricator if you haven't configured anything.
+the behavior of Phorge if you haven't configured anything.
This format stores raw data without modification.
@@ -104,7 +104,7 @@ length, then base64 encoded when represented in `keyring`.
You can generate a valid, properly encoded AES256 master key with this command:
```
-phabricator/ $ ./bin/files generate-key --type aes-256-cbc
+phorge/ $ ./bin/files generate-key --type aes-256-cbc
```
This mode is generally similar to the default server-side encryption mode
@@ -134,7 +134,7 @@ default.
To change the format of an individual file, run this command:
```
-phabricator/ $ ./bin/files encode --as F123 [--key ]
+phorge/ $ ./bin/files encode --as F123 [--key ]
```
This will change the storage format of the specified file.
@@ -167,7 +167,7 @@ to leave the old key in place for now so existing data can be decrypted.
To cycle an individual file, run this command:
```
-phabricator/ $ ./bin/files cycle F123
+phorge/ $ ./bin/files cycle F123
```
Verify that cycling worked properly by examining the command output and
@@ -177,7 +177,7 @@ can cycle additional files to gain additional confidence.
You can cycle all files with this command:
```
-phabricator/ $ ./bin/files cycle --all
+phorge/ $ ./bin/files cycle --all
```
Once all files have been cycled, remove the old master key from the keyring.
diff --git a/src/docs/user/configuration/configuring_file_domain.diviner b/src/docs/user/configuration/configuring_file_domain.diviner
index 6f7c410435..a54e850eb1 100644
--- a/src/docs/user/configuration/configuring_file_domain.diviner
+++ b/src/docs/user/configuration/configuring_file_domain.diviner
@@ -6,7 +6,7 @@ Setup guide for an alternate file domain or CDN.
Overview
========
-Serving files that users upload from the same domain that Phabricator runs on
+Serving files that users upload from the same domain that Phorge runs on
is a security risk.
In general, doing this creates a risk that users who have permission to upload
@@ -17,7 +17,7 @@ history of security issues). The attacker can then trick another user into
executing the file and gain access to their session.
The best way to mitigate this threat is to serve files from a separate domain.
-For example, if Phabricator is hosted at `https://phabricator.example.com/`,
+For example, if Phorge is hosted at `https://phorge.example.com/`,
you can serve files from `https://files.exampleusercontent.com/`.
The alternate file domain should be a completely different domain from your
@@ -48,7 +48,7 @@ CloudFront is a CDN service that's part of Amazon Web Services. It makes
particular sense to use if you're hosting your install in AWS.
To configure it, set up a new CloudFront distribution which is pointed at
-your Phabricator install as an origin (make sure you point it at the primary
+your Phorge install as an origin (make sure you point it at the primary
domain name of your install, not just a load balancer or instance). You do not
need to set up a new domain name, which makes setup a bit more straightforward.
@@ -57,10 +57,10 @@ the **Allowed HTTP Methods** setting from `GET, HEAD` to
`GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE`.
Once configured, accessing the distribution's domain name should return a
-Phabricator error page indicating that Phabricator does not recognize the
+Phorge error page indicating that Phorge does not recognize the
domain. If you see this page, it means you've configured things correctly.
-Continue to "Configuring Phabricator", below.
+Continue to "Configuring Phorge", below.
Approach: CloudFlare
========
@@ -68,7 +68,7 @@ Approach: CloudFlare
WARNING: You should review all your CloudFlare settings, and be very
sure to turn off all JavaScript, HTML, CSS minification and
optimization features, including systems like "Rocket Loader". These
-features will break Phabricator in strange and mysterious ways that
+features will break Phorge in strange and mysterious ways that
are unpredictable. Only allow CloudFlare to cache files, and never
optimize them.
@@ -76,23 +76,23 @@ optimize them.
To set up CloudFlare, you'll need to register a second domain and go through
their enrollment process to host the alternate domain on their servers. Use a
-CNAME record to forward a subdomain to your Phabricator install.
+CNAME record to forward a subdomain to your Phorge install.
CloudFlare will automatically generate SSL certificates for hosted domains,
which can significantly reduce the cost and complexity of setup.
Once configured, accessing the CNAME-forwarded subdomain should return a
-Phabricator error page indicating that Phabricator does not recognize the
+Phorge error page indicating that Phorge does not recognize the
domain. If you see this page, it means you've configured things correctly.
-Continue to "Configuring Phabricator", below.
+Continue to "Configuring Phorge", below.
Approach: Self Hosted
========
To do this, just set up a second domain exactly like your primary domain is
-set up. When setup is complete, visiting the domain should return a Phabricator
-error page indicating that Phabricator does not recognize the domain. This
+set up. When setup is complete, visiting the domain should return a Phorge
+error page indicating that Phorge does not recognize the domain. This
means that you've configured things correctly.
Note that if you use SSL (which you should), you'll also need to get a
@@ -102,18 +102,18 @@ You can also configure a self-hosted domain to route through a caching server
to provide some of the performance benefits of a CDN, but this is advanced and
outside the scope of this documentation.
-Continue to "Configuring Phabricator", below.
+Continue to "Configuring Phorge", below.
-Configuring Phabricator
+Configuring Phorge
========
-After you've set up a CDN or an alternate domain, configure Phabricator to
+After you've set up a CDN or an alternate domain, configure Phorge to
recognize the domain. Run this command, providing the domain you have
configured in place of the `` token. You should include the protocol,
-so an example domain might be `https://cdn.phabcdn.net/`.
+so an example domain might be `https://cdn.examplecdn.com/`.
- phabricator/ $ ./bin/config set security.alternate-file-domain
+ phorge/ $ ./bin/config set security.alternate-file-domain
-Phabricator should now serve CSS, JS, images, profile pictures, and user
+Phorge should now serve CSS, JS, images, profile pictures, and user
content through the file domain. You can verify this with "View Source" or
by downloading a file and checking the URL.
diff --git a/src/docs/user/configuration/configuring_file_storage.diviner b/src/docs/user/configuration/configuring_file_storage.diviner
index d6abb22c13..6d7fb247b9 100644
--- a/src/docs/user/configuration/configuring_file_storage.diviner
+++ b/src/docs/user/configuration/configuring_file_storage.diviner
@@ -6,8 +6,8 @@ Setup file storage and support for large files.
Overview
========
-This document describes how to configure Phabricator to support large file
-uploads, and how to choose where Phabricator stores files.
+This document describes how to configure Phorge to support large file
+uploads, and how to choose where Phorge stores files.
There are two major things to configure:
@@ -17,16 +17,16 @@ There are two major things to configure:
The following sections will guide you through this configuration.
-How Phabricator Stores Files
+How Phorge Stores Files
============================
-Phabricator stores files in "storage engines", which are modular backends
+Phorge stores files in "storage engines", which are modular backends
that implement access to some storage system (like MySQL, the filesystem, or
a cloud storage service like Amazon S3).
-Phabricator stores large files by breaking them up into many chunks (a few
+Phorge stores large files by breaking them up into many chunks (a few
megabytes in size) and storing the chunks in an underlying storage engine.
-This makes it easier to implement new storage engines and gives Phabricator
+This makes it easier to implement new storage engines and gives Phorge
more flexibility in managing file data.
The first section of this document discusses configuring your install so that
@@ -45,7 +45,7 @@ of the stack. Generally, the minimum value of all the limits is the effective
one.
To upload large files, you need to increase all the limits to at least
-**32MB**. This will allow you to upload file chunks, which will let Phabricator
+**32MB**. This will allow you to upload file chunks, which will let Phorge
store arbitrarily large files.
The settings which limit file uploads are:
@@ -62,20 +62,20 @@ somewhat larger than the desired maximum filesize.
- **lighttpd**: lighttpd limits requests with the lighttpd
`server.max-request-size` directive.
-Set the applicable limit to at least **32MB**. Phabricator can not read these
+Set the applicable limit to at least **32MB**. Phorge can not read these
settings, so it can not raise setup warnings if they are misconfigured.
**PHP**: PHP has several directives which limit uploads. These directives are
found in `php.ini`.
- **post_max_size**: Maximum POST request size PHP will accept. If you
- exceed this, Phabricator will give you a useful error. This often defaults
- to `8M`. Set this to at least `32MB`. Phabricator will give you a setup
+ exceed this, Phorge will give you a useful error. This often defaults
+ to `8M`. Set this to at least `32MB`. Phorge will give you a setup
warning about this if it is set too low.
- **memory_limit**: For some uploads, file data will be read into memory
- before Phabricator can adjust the memory limit. If you exceed this, PHP
+ before Phorge can adjust the memory limit. If you exceed this, PHP
may give you a useful error, depending on your configuration. It is
- recommended that you set this to `-1` to disable it. Phabricator will
+ recommended that you set this to `-1` to disable it. Phorge will
give you a setup warning about this if it is set too low.
You may also want to configure these PHP options:
@@ -87,7 +87,7 @@ You may also want to configure these PHP options:
- **upload_max_filesize**: Maximum file size PHP will accept in a raw file
upload. This is not normally used when uploading files via drag-and-drop,
but affects some other kinds of file uploads. If you exceed this,
- Phabricator will give you a useful error. This often defaults to `2M`. Set
+ Phorge will give you a useful error. This often defaults to `2M`. Set
this to at least `32MB`.
Once you've adjusted all this configuration, your server will be able to
@@ -98,7 +98,7 @@ enable you to store arbitrarily large files.
Storage Engines
===============
-Phabricator supports several different file storage engines:
+Phorge supports several different file storage engines:
| Engine | Setup | Cost | Notes |
|--------|-------|------|-------|
@@ -110,7 +110,7 @@ Phabricator supports several different file storage engines:
You can review available storage engines and their configuration by navigating
to {nav Applications > Files > Help/Options > Storage Engines} in the web UI.
-By default, Phabricator is configured to store files up to 1MB in MySQL, and
+By default, Phorge is configured to store files up to 1MB in MySQL, and
reject files larger than 1MB. To store larger files, you can either:
- increase the MySQL limit to at least 8MB; or
@@ -172,7 +172,7 @@ Testing Storage Engines
=======================
You can test that things are correctly configured by dragging and dropping
-a file onto the Phabricator home page. If engines have been configured
+a file onto the Phorge home page. If engines have been configured
properly, the file should upload.
Migrating Files Between Engines
@@ -183,11 +183,11 @@ script to perform migrations. For example, suppose you previously used MySQL but
recently set up S3 and want to migrate all your files there. First, migrate one
file to make sure things work:
- phabricator/ $ ./bin/files migrate --engine amazon-s3 F12345
+ phorge/ $ ./bin/files migrate --engine amazon-s3 F12345
If that works properly, you can then migrate everything:
- phabricator/ $ ./bin/files migrate --engine amazon-s3 --all
+ phorge/ $ ./bin/files migrate --engine amazon-s3 --all
You can use `--dry-run` to show which migrations would be performed without
taking any action. Run `bin/files help` for more options and information.
diff --git a/src/docs/user/configuration/configuring_inbound_email.diviner b/src/docs/user/configuration/configuring_inbound_email.diviner
index 39982b10cd..dfebfde7aa 100644
--- a/src/docs/user/configuration/configuring_inbound_email.diviner
+++ b/src/docs/user/configuration/configuring_inbound_email.diviner
@@ -2,15 +2,15 @@
@group config
This document contains instructions for configuring inbound email, so users
-may interact with some Phabricator applications via email.
+may interact with some Phorge applications via email.
Preamble
========
-Phabricator can process inbound mail in two general ways:
+Phorge can process inbound mail in two general ways:
**Handling Replies**: When users reply to email notifications about changes,
-Phabricator can turn email into comments on the relevant discussion thread.
+Phorge can turn email into comments on the relevant discussion thread.
**Creating Objects**: You can configure an address like `bugs@yourcompany.com`
to create new objects (like tasks) when users send email.
@@ -21,7 +21,7 @@ broader set of changes to objects beyond commenting. (For example, you can use
To configure inbound mail, you will generally:
- - Configure some mail domain to submit mail to Phabricator for processing.
+ - Configure some mail domain to submit mail to Phorge for processing.
- For handling replies, set `metamta.reply-handler-domain` in your
configuration.
- For handling email that creates objects, configure inbound addresses in the
@@ -34,11 +34,11 @@ Configuration Overview
======================
Usually, the most challenging part of configuring inbound mail is getting mail
-delivered to Phabricator for processing. This step can be made much easier if
-you use a third-party mail service which can submit mail to Phabricator via
+delivered to Phorge for processing. This step can be made much easier if
+you use a third-party mail service which can submit mail to Phorge via
webhooks.
-Some available approaches for delivering mail to Phabricator are:
+Some available approaches for delivering mail to Phorge are:
| Receive Mail With | Setup | Cost | Notes |
|--------|-------|------|-------|
@@ -47,37 +47,37 @@ Some available approaches for delivering mail to Phabricator are:
| Mailgun | Easy | Cheap | Discouraged |
| Local MTA | Difficult | Free | Discouraged |
-The remainder of this document walks through configuring Phabricator to
+The remainder of this document walks through configuring Phorge to
receive mail, and then configuring your chosen transport to deliver mail
-to Phabricator.
+to Phorge.
Configuring "Reply" Email
=========================
-By default, Phabricator uses a `noreply@phabricator.example.com` email address
+By default, Phorge uses a `noreply@phorge.example.com` email address
as the "From" address when it sends mail. The exact address it uses can be
configured with `metamta.default-address`.
-When a user takes an action that generates mail, Phabricator sets the
+When a user takes an action that generates mail, Phorge sets the
"Reply-To" addresss for the mail to that user's name and address. This means
that users can reply to email to discuss changes, but: the conversation won't
-be recorded in Phabricator; and users will not be able to use email commands
+be recorded in Phorge; and users will not be able to use email commands
to take actions or make edits.
-To change this behavior so that users can interact with objects in Phabricator
+To change this behavior so that users can interact with objects in Phorge
over email, change the configuration key `metamta.reply-handler-domain` to some
domain you configure according to the instructions below, e.g.
-`phabricator.example.com`. Once you set this key, email will use a
-"Reply-To" like `T123+273+af310f9220ad@phabricator.example.com`, which -- when
+`phorge.example.com`. Once you set this key, email will use a
+"Reply-To" like `T123+273+af310f9220ad@phorge.example.com`, which -- when
configured correctly, according to the instructions below -- will parse incoming
email and allow users to interact with Differential revisions, Maniphest tasks,
etc. over email.
-If you don't want Phabricator to take up an entire domain (or subdomain) you
+If you don't want Phorge to take up an entire domain (or subdomain) you
can configure a general prefix so you can use a single mailbox to receive mail
on. To make use of this set `metamta.single-reply-handler-prefix` to the
-prefix of your choice, and Phabricator will prepend this to the "Reply-To"
+prefix of your choice, and Phorge will prepend this to the "Reply-To"
mail address. This works because everything up to the first (optional) '+'
character in an email address is considered the receiver, and everything
after is essentially ignored.
@@ -87,7 +87,7 @@ Configuring "Create" Email
==========================
You can set up application email addresses to allow users to create objects via
-email. For example, you could configure `bugs@phabricator.example.com` to
+email. For example, you could configure `bugs@phorge.example.com` to
create a Maniphest task out of any email which is sent to it.
You can find application email settings for each application at:
@@ -104,7 +104,7 @@ with the `[ Content source ]` and/or `[ Receiving email address ]` fields to
route or handle objects based on which address mail was sent to.
You'll also need to configure the actual mail domain to submit mail to
-Phabricator by following the instructions below. Phabricator will let you add
+Phorge by following the instructions below. Phorge will let you add
any address as an application address, but can only process mail which is
actually delivered to it.
@@ -130,7 +130,7 @@ authenticating senders in the general case (e.g., where you are an open source
project and need to interact with users whose email accounts you have no control
over).
-You can also set `metamta.public-replies`, which will change how Phabricator
+You can also set `metamta.public-replies`, which will change how Phorge
delivers email. Instead of sending each recipient a unique mail with a personal
reply-to address, it will send a single email to everyone with a public reply-to
address. This decreases security because anyone who can spoof a "From" address
@@ -142,7 +142,7 @@ not received an email about an object can not blindly interact with it.
If you enable application email addresses, those addresses also use the weaker
"From" authentication mechanism.
-NOTE: Phabricator does not currently attempt to verify "From" addresses because
+NOTE: Phorge does not currently attempt to verify "From" addresses because
this is technically complex, seems unreasonably difficult in the general case,
and no installs have had a need for it yet. If you have a specific case where a
reasonable mechanism exists to provide sender verification (e.g., DKIM
@@ -155,17 +155,17 @@ Testing and Debugging Inbound Email
===================================
You can use the `bin/mail` utility to test and review inbound mail. This can
-help you determine if mail is being delivered to Phabricator or not:
+help you determine if mail is being delivered to Phorge or not:
- phabricator/ $ ./bin/mail list-inbound # List inbound messages.
- phabricator/ $ ./bin/mail show-inbound # Show details about a message.
+ phorge/ $ ./bin/mail list-inbound # List inbound messages.
+ phorge/ $ ./bin/mail show-inbound # Show details about a message.
You can also test receiving mail, but note that this just simulates receiving
the mail and doesn't send any information over the network. It is
primarily aimed at developing email handlers: it will still work properly
if your inbound email configuration is incorrect or even disabled.
- phabricator/ $ ./bin/mail receive-test # Receive test message.
+ phorge/ $ ./bin/mail receive-test # Receive test message.
Run `bin/mail help ` for detailed help on using these commands.
@@ -179,7 +179,7 @@ like this:
- Configure a mail domain according to Mailgun's instructions.
- Add a Mailgun route with a `catch_all()` rule which takes the action
- `forward("https://phabricator.example.com/mail/mailgun/")`. Replace the
+ `forward("https://phorge.example.com/mail/mailgun/")`. Replace the
example domain with your actual domain.
- Configure a mailer in `cluster.mailers` with your Mailgun API key.
@@ -194,7 +194,7 @@ To process inbound mail from Postmark, configure this URI as your inbound
webhook URI in the Postmark control panel:
```
-https:///mail/postmark/
+https:///mail/postmark/
```
See also the Postmark section in @{article:Configuring Outbound Email} for
@@ -209,21 +209,21 @@ To use SendGrid, you need a SendGrid account with access to the "Parse API" for
inbound email. Provided you have such an account, configure it like this:
- Configure an MX record according to SendGrid's instructions, i.e. add
- `phabricator.example.com MX 10 mx.sendgrid.net.` or similar.
+ `phorge.example.com MX 10 mx.sendgrid.net.` or similar.
- Go to the "Parse Incoming Emails" page on SendGrid
() and add the domain as the
"Hostname".
- - Add the URL `https://phabricator.example.com/mail/sendgrid/` as the "Url",
+ - Add the URL `https://phorge.example.com/mail/sendgrid/` as the "Url",
using your domain (and HTTP instead of HTTPS if you are not configured with
SSL).
- If you get an error that the hostname "can't be located or verified", it
means your MX record is either incorrectly configured or hasn't propagated
yet.
- - Set `metamta.reply-handler-domain` to `phabricator.example.com`
+ - Set `metamta.reply-handler-domain` to `phorge.example.com`
(whatever you configured the MX record for).
That's it! If everything is working properly you should be able to send email
-to `anything@phabricator.example.com` and it should appear in
+to `anything@phorge.example.com` and it should appear in
`bin/mail list-inbound` within a few seconds.
@@ -267,10 +267,10 @@ probably means something like this:
- add your host to /etc/mail/local-host-names; and
- restart sendmail.
-Now, you can actually configure sendmail to deliver to Phabricator. In
+Now, you can actually configure sendmail to deliver to Phorge. In
`/etc/aliases`, add an entry like this:
- phabricator: "| /path/to/phabricator/scripts/mail/mail_handler.php"
+ phorge: "| /path/to/phorge/scripts/mail/mail_handler.php"
If you use the `PHABRICATOR_ENV` environmental variable to select a
configuration, you can pass the value to the script as an argument:
@@ -283,12 +283,12 @@ without an argument.
After making this change, run `sudo newaliases`. Now you likely need to symlink
this script into `/etc/smrsh/`:
- sudo ln -s /path/to/phabricator/scripts/mail/mail_handler.php /etc/smrsh/
+ sudo ln -s /path/to/phorge/scripts/mail/mail_handler.php /etc/smrsh/
Finally, edit `/etc/mail/virtusertable` and add an entry like this:
- @yourdomain.com phabricator@localhost
+ @yourdomain.com phorge@localhost
-That will forward all mail to @yourdomain.com to the Phabricator processing
+That will forward all mail to @yourdomain.com to the Phorge processing
script. Run `sudo /etc/mail/make` or similar and then restart sendmail with
`sudo /etc/init.d/sendmail restart`.
diff --git a/src/docs/user/configuration/configuring_outbound_email.diviner b/src/docs/user/configuration/configuring_outbound_email.diviner
index 9acf3abe10..07cacb6b25 100644
--- a/src/docs/user/configuration/configuring_outbound_email.diviner
+++ b/src/docs/user/configuration/configuring_outbound_email.diviner
@@ -1,17 +1,17 @@
@title Configuring Outbound Email
@group config
-Instructions for configuring Phabricator to send email and other types of
+Instructions for configuring Phorge to send email and other types of
messages, like text messages.
Overview
========
-Phabricator sends outbound messages through "mailers". Most mailers send
+Phorge sends outbound messages through "mailers". Most mailers send
email and most messages are email messages, but mailers may also send other
types of messages (like text messages).
-Phabricator can send outbound messages through multiple different mailers,
+Phorge can send outbound messages through multiple different mailers,
including a local mailer or various third-party services. Options include:
| Send Mail With | Setup | Cost | Inbound | Media | Notes |
@@ -41,7 +41,7 @@ options.
If you have some internal mail or messaging service you'd like to use you can
also write a custom mailer, but this requires digging into the code.
-Phabricator sends mail in the background, so the daemons need to be running for
+Phorge sends mail in the background, so the daemons need to be running for
it to be able to deliver mail. You should receive setup warnings if they are
not. For more information on using daemons, see
@{article:Managing Daemons with phd}.
@@ -50,10 +50,10 @@ not. For more information on using daemons, see
Outbound "From" and "To" Addresses
==================================
-When Phabricator sends outbound mail, it must select some "From" address to
+When Phorge sends outbound mail, it must select some "From" address to
send mail from, since mailers require this.
-When mail only has "CC" recipients, Phabricator generates a dummy "To" address,
+When mail only has "CC" recipients, Phorge generates a dummy "To" address,
since some mailers require this and some users write mail rules that depend
on whether they appear in the "To" or "CC" line.
@@ -65,12 +65,12 @@ contrast, if the address is a real user address, that user will receive a lot
of mail they probably don't want.
If you plan to configure //inbound// mail later, you usually don't need to do
-anything. Phabricator will automatically create a `noreply@` mailbox which
+anything. Phorge will automatically create a `noreply@` mailbox which
works the right way (accepts and discards all mail it receives) and
automatically use it when generating addresses.
If you don't plan to configure inbound mail, you may need to configure an
-address for Phabricator to use. You can do this by setting
+address for Phorge to use. You can do this by setting
`metamta.default-address`.
@@ -131,7 +131,7 @@ It also supports these local mailers:
- `smtp`: Connect directly to an SMTP server.
- `test`: Internal mailer for testing. Does not send mail.
-You can also write your own mailer by extending `PhabricatorMailAdapter`.
+You can also write your own mailer by extending `PhorgeMailAdapter`.
The `media` field supports these values:
@@ -169,7 +169,7 @@ tricky because of shell escaping. The easiest way to do it is to use the
Then set the value like this:
```
-phabricator/ $ ./bin/config set --stdin cluster.mailers < mailers.json
+phorge/ $ ./bin/config set --stdin cluster.mailers < mailers.json
```
For alternatives and more information on configuration, see
@@ -315,7 +315,7 @@ SendGrid is a third-party email delivery service. You can learn more at
.
You can configure SendGrid in two ways: you can send via SMTP or via the REST
-API. To use SMTP, configure Phabricator to use an `smtp` mailer.
+API. To use SMTP, configure Phorge to use an `smtp` mailer.
To use the REST API mailer, set `type` to `sendgrid`, then configure
these `options`:
@@ -348,7 +348,7 @@ do any of this, strongly consider using Postmark instead.
To use this mailer, set `type` to `sendmail`, then configure these `options`:
- - `message-id`: Optional bool. Set to `false` if Phabricator will not be
+ - `message-id`: Optional bool. Set to `false` if Phorge will not be
able to select a custom "Message-ID" header when sending mail via this
mailer. See "Message-ID Headers" below.
@@ -370,7 +370,7 @@ To use this mailer, set `type` to `smtp`, then configure these `options`:
- `password`: Optional string. Password for authentication.
- `protocol`: Optional string. Set to `tls` or `ssl` if necessary. Use
`ssl` for Gmail.
- - `message-id`: Optional bool. Set to `false` if Phabricator will not be
+ - `message-id`: Optional bool. Set to `false` if Phorge will not be
able to select a custom "Message-ID" header when sending mail via this
mailer. See "Message-ID Headers" below.
@@ -395,9 +395,9 @@ Testing and Debugging Outbound Email
You can use the `bin/mail` utility to test, debug, and examine outbound mail. In
particular:
- phabricator/ $ ./bin/mail list-outbound # List outbound mail.
- phabricator/ $ ./bin/mail show-outbound # Show details about messages.
- phabricator/ $ ./bin/mail send-test # Send test messages.
+ phorge/ $ ./bin/mail list-outbound # List outbound mail.
+ phorge/ $ ./bin/mail show-outbound # Show details about messages.
+ phorge/ $ ./bin/mail send-test # Send test messages.
Run `bin/mail help ` for more help on using these commands.
@@ -411,12 +411,12 @@ You can monitor daemons using the Daemon Console (`/daemon/`, or click
Priorities
==========
-By default, Phabricator will try each mailer in order: it will try the first
+By default, Phorge will try each mailer in order: it will try the first
mailer first. If that fails (for example, because the service is not available
at the moment) it will try the second mailer, and so on.
If you want to load balance between multiple mailers instead of using one as
-a primary, you can set `priority`. Phabricator will start with mailers in the
+a primary, you can set `priority`. Phorge will start with mailers in the
highest priority group and go through them randomly, then fall back to the
next group.
@@ -446,14 +446,14 @@ like this:
}
```
-Phabricator will start with servers in the highest priority group (the group
+Phorge will start with servers in the highest priority group (the group
with the **largest** `priority` number). In this example, the highest group is
`300`, which has the two SMTP servers. They'll be tried in random order first.
-If both fail, Phabricator will move on to the next priority group. In this
+If both fail, Phorge will move on to the next priority group. In this
example, there are no other priority groups.
-If it still hasn't sent the mail, Phabricator will try servers which are not
+If it still hasn't sent the mail, Phorge will try servers which are not
in any priority group, in the configured order. In this example there is
only one such server, so it will try to send via Postmark.
@@ -462,14 +462,14 @@ Message-ID Headers
==================
Email has a "Message-ID" header which is important for threading messages
-correctly in mail clients. Normally, Phabricator is free to select its own
+correctly in mail clients. Normally, Phorge is free to select its own
"Message-ID" header values for mail it sends.
However, some mailers (including Amazon SES) do not allow selection of custom
"Message-ID" values and will ignore or replace the "Message-ID" in mail that
is submitted through them.
-When Phabricator adds other mail headers which affect threading, like
+When Phorge adds other mail headers which affect threading, like
"In-Reply-To", it needs to know if its "Message-ID" headers will be respected
or not to select header values which will produce good threading behavior. If
we guess wrong and think we can set a "Message-ID" header when we can't, you
@@ -498,11 +498,11 @@ we can set a "Message-ID" header.
If the outbound pathway does not actually allow selection of a "Message-ID"
header, you can set the `message-id` option on the mailer to `false` to tell
-Phabricator that it should not assume it can select a value for this header.
+Phorge that it should not assume it can select a value for this header.
For example, if you are sending mail via a local Postfix server which then
forwards the mail to Amazon SES (a service which does not allow selection of
-a "Message-ID" header), your `smtp` configuration in Phabricator should
+a "Message-ID" header), your `smtp` configuration in Phorge should
specify `"message-id": false`.
diff --git a/src/docs/user/configuration/configuring_preamble.diviner b/src/docs/user/configuration/configuring_preamble.diviner
index 6b6b9da149..15ae20e75b 100644
--- a/src/docs/user/configuration/configuring_preamble.diviner
+++ b/src/docs/user/configuration/configuring_preamble.diviner
@@ -6,14 +6,14 @@ Adjust environmental settings (SSL, remote IPs) using a preamble script.
Overview
========
-If Phabricator is deployed in an environment where HTTP headers behave oddly
+If Phorge is deployed in an environment where HTTP headers behave oddly
(usually, because it is behind a load balancer), it may not be able to detect
some environmental features (like the client's IP, or the presence of SSL)
correctly.
You can use a special preamble script to make arbitrary adjustments to the
-environment and some parts of Phabricator's configuration in order to fix these
-problems and set up the environment which Phabricator expects.
+environment and some parts of Phorge's configuration in order to fix these
+problems and set up the environment which Phorge expects.
Creating a Preamble Script
@@ -21,15 +21,15 @@ Creating a Preamble Script
To create a preamble script, write a file to:
- phabricator/support/preamble.php
+ phorge/support/preamble.php
-(This file is in Phabricator's `.gitignore`, so you do not need to worry about
+(This file is in Phorge's `.gitignore`, so you do not need to worry about
colliding with `git` or interacting with updates.)
This file should be a valid PHP script. If you aren't very familiar with PHP,
you can check for syntax errors with `php -l`:
- phabricator/ $ php -l support/preamble.php
+ phorge/ $ php -l support/preamble.php
No syntax errors detected in support/preamble.php
If present, this script will be executed at the very beginning of each web
@@ -40,14 +40,14 @@ examples, see the next sections.
Adjusting Client IPs
====================
-If your install is behind a load balancer, Phabricator may incorrectly detect
+If your install is behind a load balancer, Phorge may incorrectly detect
all requests as originating from the load balancer, rather than from the
correct client IPs.
In common cases where networks are configured like this, the `X-Forwarded-For`
header will have trustworthy information about the real client IP. You
can use the function `preamble_trust_x_forwarded_for_header()` in your
-preamble to tell Phabricator that you expect to receive requests from a
+preamble to tell Phorge that you expect to receive requests from a
load balancer or proxy which modifies this header:
```name="Trust X-Forwarded-For Header", lang=php
@@ -89,9 +89,9 @@ if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
Adjusting SSL
=============
-If your install is behind an SSL terminating load balancer, Phabricator may
+If your install is behind an SSL terminating load balancer, Phorge may
detect requests as HTTP when the client sees them as HTTPS. This can cause
-Phabricator to generate links with the wrong protocol, issue cookies without
+Phorge to generate links with the wrong protocol, issue cookies without
the SSL-only flag, or reject requests outright.
To fix this, you can set `$_SERVER['HTTPS']` explicitly:
@@ -103,7 +103,7 @@ name=Explicitly Configure SSL Availability
$_SERVER['HTTPS'] = true;
```
-You can also set this value to `false` to explicitly tell Phabricator that a
+You can also set this value to `false` to explicitly tell Phorge that a
request is not an SSL request.
diff --git a/src/docs/user/configuration/custom_fields.diviner b/src/docs/user/configuration/custom_fields.diviner
index 75d83fc8ba..5879931317 100644
--- a/src/docs/user/configuration/custom_fields.diviner
+++ b/src/docs/user/configuration/custom_fields.diviner
@@ -5,7 +5,7 @@ How to add custom fields to applications which support them.
= Overview =
-Several Phabricator applications allow the configuration of custom fields. These
+Several Phorge applications allow the configuration of custom fields. These
fields allow you to add more information to objects, and in some cases reorder
or remove builtin fields.
@@ -134,7 +134,7 @@ The `strings` value supports different strings per control type. They are:
- **search.default** Text for the search interface, defaults to "(Any)".
- **search.require** Text for the search interface, defaults to "Require".
-Internally, Phabricator implements some additional custom field types and
+Internally, Phorge implements some additional custom field types and
options. These are not intended for general use and are subject to abrupt
change, but are documented here for completeness:
@@ -149,7 +149,7 @@ change, but are documented here for completeness:
If you want custom fields to have advanced behaviors (sophisticated rendering,
advanced validation, complicated controls, interaction with other systems, etc),
-you can write a custom field as an extension and add it to Phabricator.
+you can write a custom field as an extension and add it to Phorge.
NOTE: This API is somewhat new and fairly large. You should expect that there
will be occasional changes to the API requiring minor updates in your code.
@@ -167,9 +167,9 @@ want to add a field to:
| Projects | @{class:PhabricatorProjectCustomField} |
The easiest way to get started is to drop your subclass into
-`phabricator/src/extensions/`. If Phabricator is configured in development
+`phorge/src/extensions/`. If Phorge is configured in development
mode, the class should immediately be available in the UI. If not, you can
-restart Phabricator (for help, see @{article:Restarting Phabricator}).
+restart Phorge (for help, see @{article:Restarting Phorge}).
For example, this is a simple template which adds a custom field to Maniphest:
@@ -211,6 +211,6 @@ integrations, see the base class for your application and
Continue by:
- - learning more about extending Phabricator with custom code in
- @{article@phabcontrib:Adding New Classes};
+ - learning more about extending Phorge with custom code in
+ @{article@contrib:Adding New Classes};
- or returning to the @{article: Configuration Guide}.
diff --git a/src/docs/user/configuration/managing_caches.diviner b/src/docs/user/configuration/managing_caches.diviner
index e873b99d8c..c4e209fc25 100644
--- a/src/docs/user/configuration/managing_caches.diviner
+++ b/src/docs/user/configuration/managing_caches.diviner
@@ -1,17 +1,17 @@
@title Managing Caches
@group config
-Discusses Phabricator caches and cache management.
+Discusses Phorge caches and cache management.
Overview
========
-Phabricator uses various caches to improve performance, similar to the caches
+Phorge uses various caches to improve performance, similar to the caches
a web browser uses to improve web performance.
In particular, blocks of text which are expensive to render (like formatted
text and syntax highlighted code) are often cached after they're rendered for
-the first time. When they're rendered again, Phabricator can read the cache
+the first time. When they're rendered again, Phorge can read the cache
instead of recomputing the result.
Because text is cached, you may continue to see the old result even after you
@@ -28,20 +28,20 @@ you can just ignore the out of date caches and they'll fix themselves
eventually (usually within 30 days).
If you don't want to wait, you can purge the caches. This will remove any
-cached data and force Phabricator to recompute the results.
+cached data and force Phorge to recompute the results.
Purging Caches
==============
-If you need to purge Phabricator's caches, you can use the CLI tool. Run it
+If you need to purge Phorge's caches, you can use the CLI tool. Run it
with the `--help` flag to see options:
- phabricator/ $ ./bin/cache purge --help
+ phorge/ $ ./bin/cache purge --help
This tool can purge caches in a granular way, but it's normally easiest to
just purge all of the caches:
- phabricator/ $ ./bin/cache purge --all
+ phorge/ $ ./bin/cache purge --all
You can purge caches safely. The data they contain can always be rebuilt from
-other data if Phabricator needs it.
+other data if Phorge needs it.
diff --git a/src/docs/user/configuration/managing_daemons.diviner b/src/docs/user/configuration/managing_daemons.diviner
index cf2ba85ea2..0e56a95995 100644
--- a/src/docs/user/configuration/managing_daemons.diviner
+++ b/src/docs/user/configuration/managing_daemons.diviner
@@ -1,11 +1,11 @@
@title Managing Daemons with phd
@group config
-Explains Phabricator daemons and the daemon control program `phd`.
+Explains Phorge daemons and the daemon control program `phd`.
= Overview =
-Phabricator uses daemons (background processing scripts) to handle a number of
+Phorge uses daemons (background processing scripts) to handle a number of
tasks:
- tracking repositories, discovering new commits, and importing and parsing
@@ -16,19 +16,19 @@ tasks:
Daemons are started and stopped with **phd** (the **Ph**abricator **D**aemon
launcher). Daemons can be monitored via a web console.
-You do not need to run daemons for most parts of Phabricator to work, but some
+You do not need to run daemons for most parts of Phorge to work, but some
features (principally, repository tracking with Diffusion) require them and
several features will benefit in performance or stability if you configure
daemons.
= phd =
-**phd** is a command-line script (located at `phabricator/bin/phd`). To get
+**phd** is a command-line script (located at `phorge/bin/phd`). To get
a list of commands, run `phd help`:
- phabricator/ $ ./bin/phd help
+ phorge/ $ ./bin/phd help
NAME
- phd - phabricator daemon launcher
+ phd - phorge daemon launcher
...
Generally, you will use:
@@ -43,7 +43,7 @@ If you want finer-grained control, you can use:
- **phd launch** to launch individual daemons; and
- **phd debug** to debug problems with daemons.
-NOTE: When you upgrade Phabricator or change configuration, you should restart
+NOTE: When you upgrade Phorge or change configuration, you should restart
the daemons by running `phd restart`.
= Daemon Console =
@@ -81,12 +81,12 @@ launch custom daemons, or launch special daemons like the IRC bot.
To debug a daemon, use `phd debug`:
- phabricator/bin/ $ ./phd debug
+ phorge/bin/ $ ./phd debug
You can pass arguments like this (normal arguments are passed to the daemon
control mechanism, not to the daemon itself):
- phabricator/bin/ $ ./phd debug -- --flavor apple
+ phorge/bin/ $ ./phd debug -- --flavor apple
In debug mode, daemons do not daemonize, and they print additional debugging
output to the console. This should make it easier to debug problems. You can
@@ -94,7 +94,7 @@ terminate the daemon with `^C`.
To launch a nonstandard daemon, use `phd launch`:
- phabricator/bin/ $ ./phd launch
+ phorge/bin/ $ ./phd launch
This daemon will daemonize and run normally.
@@ -109,7 +109,7 @@ This daemon will daemonize and run normally.
just those started with `phd start`. If you're writing a restart script,
have it launch any custom daemons explicitly after `phd restart`.
- You can write your own daemons and manage them with `phd` by extending
- @{class:PhabricatorDaemon}. See @{article@phabcontrib:Adding New Classes}.
+ @{class:PhabricatorDaemon}. See @{article@contrib:Adding New Classes}.
- See @{article:Diffusion User Guide} for details about tuning the repository
daemon.
@@ -128,4 +128,4 @@ Continue by:
- learning about the repository daemon with @{article:Diffusion User Guide};
or
- - writing your own daemons with @{article@phabcontrib:Adding New Classes}.
+ - writing your own daemons with @{article@contrib:Adding New Classes}.
diff --git a/src/docs/user/configuration/managing_garbage.diviner b/src/docs/user/configuration/managing_garbage.diviner
index 0b18bd2a0a..5c5ef87762 100644
--- a/src/docs/user/configuration/managing_garbage.diviner
+++ b/src/docs/user/configuration/managing_garbage.diviner
@@ -6,7 +6,7 @@ Understanding and configuring garbage collection.
Overview
========
-Phabricator generates various logs and caches during normal operation. Some of
+Phorge generates various logs and caches during normal operation. Some of
these logs and caches are usually of very little use after some time has
passed, so they are deleted automatically (often after a month or two) in a
process called "garbage collection".
@@ -35,7 +35,7 @@ You can review the current retention policies in
`bin/garbage set-policy` to select a new policy:
```
-phabricator/ $ ./bin/garbage set-policy --collector cache.markup --days 7
+phorge/ $ ./bin/garbage set-policy --collector cache.markup --days 7
```
You can use `--days` to select how long data is retained for. You can also use
@@ -53,7 +53,7 @@ Troubleshooting
You can manually run a collector with `bin/garbage collect`.
```
-phabricator/ $ ./bin/garbage collect --collector cache.general
+phorge/ $ ./bin/garbage collect --collector cache.general
```
By using the `--trace` flag, you can inspect the operation of the collector
diff --git a/src/docs/user/configuration/notifications.diviner b/src/docs/user/configuration/notifications.diviner
index 13d93317f9..de1a32d5e1 100644
--- a/src/docs/user/configuration/notifications.diviner
+++ b/src/docs/user/configuration/notifications.diviner
@@ -6,11 +6,11 @@ Guide to setting up notifications.
Overview
========
-By default, Phabricator delivers information about events (like users creating
+By default, Phorge delivers information about events (like users creating
tasks or commenting on code reviews) through email and in-application
notifications.
-Phabricator can also be configured to deliver notifications in real time, by
+Phorge can also be configured to deliver notifications in real time, by
popping up a message in any open browser windows if something has happened or
an object has been updated.
@@ -41,13 +41,13 @@ The notification server uses Node.js, so you'll need to install it first.
To install Node.js, follow the instructions on
[[ http://nodejs.org | nodejs.org ]].
-You will also need to install the `ws` module for Node. This needs to be
+You will also need to install the dependencies for Node. This needs to be
installed into the notification server directory:
- phabricator/ $ cd support/aphlict/server/
- phabricator/support/aphlict/server/ $ npm install ws
+ phorge/ $ cd support/aphlict/server/
+ phorge/support/aphlict/server/ $ npm install
-Once Node.js and the `ws` module are installed, you're ready to start the
+Once Node.js and its dependencies are installed, you're ready to start the
server.
@@ -57,21 +57,21 @@ Running the Aphlict Server
After installing Node.js, you can control the notification server with the
`bin/aphlict` command. To start the server:
- phabricator/ $ bin/aphlict start
+ phorge/ $ bin/aphlict start
By default, the server must be able to listen on port `22280`. If you're using
a host firewall (like a security group in EC2), make sure traffic can reach the
server.
The server configuration is controlled by a configuration file, which is
-separate from Phabricator's configuration settings. The default file can
-be found at `phabricator/conf/aphlict/aphlict.default.json`.
+separate from Phorge's configuration settings. The default file can
+be found at `phorge/conf/aphlict/aphlict.default.json`.
To make adjustments to the default configuration, either copy this file to
create `aphlict.custom.json` in the same directory (this file will be used if
it exists) or specify a configuration file explicitly with the `--config` flag:
- phabricator/ $ bin/aphlict start --config path/to/config.json
+ phorge/ $ bin/aphlict start --config path/to/config.json
The configuration file has these settings:
@@ -118,12 +118,12 @@ installs. For more information on how to configure a cluster, see
The defaults are appropriate for simple cases, but you may need to adjust them
if you are running a more complex configuration.
-Configuring Phabricator
+Configuring Phorge
=======================
-After starting the server, configure Phabricator to connect to it by adjusting
+After starting the server, configure Phorge to connect to it by adjusting
`notification.servers`. This configuration option should have a list of servers
-that Phabricator should interact with.
+that Phorge should interact with.
Normally, you'll list one client server and one admin server, like this:
@@ -131,7 +131,7 @@ Normally, you'll list one client server and one admin server, like this:
[
{
"type": "client",
- "host": "phabricator.mycompany.com",
+ "host": "phorge.mycompany.com",
"port": 22280,
"protocol": "https"
},
@@ -165,7 +165,7 @@ Troubleshooting
You can run `aphlict` in the foreground to get output to your console:
- phabricator/ $ ./bin/aphlict debug
+ phorge/ $ ./bin/aphlict debug
Because the notification server uses WebSockets, your browser error console
may also have information that is useful in figuring out what's wrong.
@@ -178,10 +178,10 @@ information that is useful in resolving issues.
SSL and HTTPS
=============
-If you serve Phabricator over HTTPS, you must also serve websockets over HTTPS.
+If you serve Phorge over HTTPS, you must also serve websockets over HTTPS.
Browsers will refuse to connect to `ws://` websockets from HTTPS pages.
-If a client connects to Phabricator over HTTPS, Phabricator will automatically
+If a client connects to Phorge over HTTPS, Phorge will automatically
select an appropriate HTTPS service from `notification.servers` and instruct
the browser to open a websocket connection with `wss://`.
@@ -241,10 +241,10 @@ upstream websocket_pool {
}
```
-```lang=nginx, name=/etc/nginx/sites-enabled/phabricator.example.com.conf
+```lang=nginx, name=/etc/nginx/sites-enabled/phorge.example.com.conf
server {
- server_name phabricator.example.com;
- root /path/to/phabricator/webroot;
+ server_name phorge.example.com;
+ root /path/to/phorge/webroot;
// ...
@@ -260,10 +260,10 @@ server {
With this approach, you should make these additional adjustments:
-**Phabricator Configuration**: The entry in `notification.servers` with type
+**Phorge Configuration**: The entry in `notification.servers` with type
`"client"` should have these adjustments made:
- - Set `host` to the Phabricator host.
+ - Set `host` to the Phorge host.
- Set `port` to the standard HTTPS port (usually `443`).
- Set `protocol` to `"https"`.
- Set `path` to `/ws/`, so it matches the special `location` in your
diff --git a/src/docs/user/configuration/storage_adjust.diviner b/src/docs/user/configuration/storage_adjust.diviner
index 2403cd3fed..e460ddd041 100644
--- a/src/docs/user/configuration/storage_adjust.diviner
+++ b/src/docs/user/configuration/storage_adjust.diviner
@@ -6,13 +6,13 @@ Explains how to apply storage adjustments to the MySQL schemata.
Overview
========
-Phabricator uses a workflow called //storage adjustment// to make some minor
+Phorge uses a workflow called //storage adjustment// to make some minor
kinds of changes to the MySQL schema. This workflow compliments the //storage
upgrade// workflow, which makes major changes.
You can perform storage adjustment by running:
- phabricator/ $ ./bin/storage adjust
+ phorge/ $ ./bin/storage adjust
This document describes what adjustments are, how they relate to storage
upgrades, how to perform them, and how to troubleshoot issues with storage
@@ -22,7 +22,7 @@ adjustment.
Understanding Adjustments
===================
-Storage adjustments make minor changes to the Phabricator MySQL schemata to
+Storage adjustments make minor changes to the Phorge MySQL schemata to
improve consistency, unicode handling, and performance. Changes covered by
adjustment include:
@@ -62,7 +62,7 @@ adjustment workflow can resolve.
You can also review adjustments from the CLI, by running:
- phabricator/ $ ./bin/storage adjust
+ phorge/ $ ./bin/storage adjust
Before you're prompted to actually apply adjustments, you'll be given a list of
available adjustments. You can then make a choice to apply them.
@@ -73,11 +73,11 @@ Performing Adjustments
To perform adjustments, run the `adjust` workflow:
- phabricator/ $ ./bin/storage adjust
+ phorge/ $ ./bin/storage adjust
For details about flags, use:
- phabricator/ $ ./bin/storage help adjust
+ phorge/ $ ./bin/storage help adjust
You do not normally need to run this workflow manually: it will be run
automatically after you run the `upgrade` workflow.
@@ -97,7 +97,7 @@ set can safely store 4-byte unicode characters.
The adjustment workflow allows us to alter the schema to primarily use
`binary` character sets on older MySQL, and primarily use `utf8mb4` character
-sets on newer MySQL. The net effect is that Phabricator works consistently and
+sets on newer MySQL. The net effect is that Phorge works consistently and
can store 4-byte unicode characters regardless of the MySQL version. Under
newer MySQL, we can also take advantage of the better collation rules the
`utf8mb4` character set offers.
@@ -143,7 +143,7 @@ upstream.
In general, adjustments are not critical. If you run into issues applying
adjustments, it is safe to file a task in the upstream describing the problem
-you've encountered and continue using Phabricator normally until the issue can
+you've encountered and continue using Phorge normally until the issue can
be resolved.
Surplus Schemata
@@ -154,13 +154,13 @@ After performing adjustment, you may receive an error that a table or column is
| Target | Error |
| --- | --- |
-| phabricator_example.example_table | Surplus |
+| phorge_example.example_table | Surplus |
-Generally, "Surplus" means that Phabricator does not expect the table or column
+Generally, "Surplus" means that Phorge does not expect the table or column
to exist. These surpluses usually exist because you (or someone else
with database access) added the table or column manually. Rarely, they can
also exist for other reasons. They are usually safe to delete, but because
-deleting them destroys data and Phabricator can not be sure that the table or
+deleting them destroys data and Phorge can not be sure that the table or
column doesn't have anything important in it, it does not delete them
automatically.
@@ -174,18 +174,18 @@ message):
```lang=sql
CREATE DATABASE my_backups;
-RENAME TABLE phabricator_example.example_table
+RENAME TABLE phorge_example.example_table
TO my_backups.example_table;
```
-Phabricator will ignore tables that aren't in databases it owns, so you can
-safely move anything you aren't sure about outside of the Phabricator databases.
+Phorge will ignore tables that aren't in databases it owns, so you can
+safely move anything you aren't sure about outside of the Phorge databases.
If you're sure you don't need a table, use `DROP TABLE` to destroy it,
specifying the correct table name (the one given in the error message):
```lang=sql
-DROP TABLE phabricator_example.example_table;
+DROP TABLE phorge_example.example_table;
```
This will destroy the table permanently.
diff --git a/src/docs/user/configuration/troubleshooting_https.diviner b/src/docs/user/configuration/troubleshooting_https.diviner
index bdc3439d7d..b3aae81035 100644
--- a/src/docs/user/configuration/troubleshooting_https.diviner
+++ b/src/docs/user/configuration/troubleshooting_https.diviner
@@ -5,7 +5,7 @@ Detailed instructions for troubleshooting HTTPS connection problems.
= Overview =
-If you're having trouble connecting to an HTTPS install of Phabricator, and
+If you're having trouble connecting to an HTTPS install of Phorge, and
particularly if you're receiving a "There was an error negotiating the SSL
connection." error, this document may be able to help you diagnose and resolve
the problem.
@@ -17,7 +17,7 @@ Connection negotiation can fail for several reasons. The major ones are:
certificates).
- The SSL certificate is signed for the wrong domain. For example, a
certificate signed for `www.example.com` will not work for
- `phabricator.example.com`.
+ `phorge.example.com`.
- The server rejects TLSv1 SNI connections for the domain (this is
complicated, see below).
@@ -50,7 +50,7 @@ with:
$ openssl x509 -text -in
If the certificate was accidentally generated for, e.g. `www.example.com` but
-you installed Phabricator on `phabricator.example.com`, you need to generate a
+you installed Phorge on `phorge.example.com`, you need to generate a
new certificate for the right domain.
= SNI Problems =
@@ -73,7 +73,7 @@ an error in `SSL23_GET_SERVER_HELLO` with `reason(1112)`, like this:
/SourceCache/OpenSSL098/OpenSSL098-44/src/ssl/s23_clnt.c:602:
...it indicates server is misconfigured. The most common cause of this problem
-is an Apache server that does not explicitly name the Phabricator domain as a
+is an Apache server that does not explicitly name the Phorge domain as a
valid VirtualHost.
This error occurs only for some versions of the OpenSSL client library
diff --git a/src/docs/user/feedback.diviner b/src/docs/user/feedback.diviner
deleted file mode 100644
index 0998002b10..0000000000
--- a/src/docs/user/feedback.diviner
+++ /dev/null
@@ -1,7 +0,0 @@
-@title Give Feedback! Get Support!
-@short Feedback/Support
-@group cellar
-
-Deprecated.
-
-This article has moved to @{article:Support Resources}.
diff --git a/src/docs/user/field/conduit_changes.diviner b/src/docs/user/field/conduit_changes.diviner
index 96a890600a..b2246310e3 100644
--- a/src/docs/user/field/conduit_changes.diviner
+++ b/src/docs/user/field/conduit_changes.diviner
@@ -25,7 +25,7 @@ Methods have one of three statuses:
them before they stabilize.
- **Stable**: This is an established method which generally will not change.
- **Deprecated**: This method will be removed in a future version of
- Phabricator and callers should cease using it.
+ Phorge and callers should cease using it.
Normally, a method is deprecated only when it is obsolete or a new, more
powerful method is available to replace it.
diff --git a/src/docs/user/field/darkconsole.diviner b/src/docs/user/field/darkconsole.diviner
index 065be2d8f1..494b175416 100644
--- a/src/docs/user/field/darkconsole.diviner
+++ b/src/docs/user/field/darkconsole.diviner
@@ -6,9 +6,9 @@ Enabling and using the built-in debugging and performance console.
Overview
========
-DarkConsole is a debugging console built into Phabricator which exposes
+DarkConsole is a debugging console built into Phorge which exposes
configuration, performance and error information. It can help you detect,
-understand and resolve bugs and performance problems in Phabricator
+understand and resolve bugs and performance problems in Phorge
applications.
diff --git a/src/docs/user/field/exit_codes.diviner b/src/docs/user/field/exit_codes.diviner
index 7c69b3509b..40f1d281e3 100644
--- a/src/docs/user/field/exit_codes.diviner
+++ b/src/docs/user/field/exit_codes.diviner
@@ -1,7 +1,7 @@
@title Command Line Exit Codes
@group fieldmanual
-Explains the use of exit codes in Phabricator command line scripts.
+Explains the use of exit codes in Phorge command line scripts.
Overview
========
@@ -21,7 +21,7 @@ like `cmdx && cmdy` operate on exit codes.
The code `0` means success. Other codes signal some sort of error or status
condition, depending on the system and command.
-With rare exception, Phabricator uses //all other codes// to signal
+With rare exception, Phorge uses //all other codes// to signal
**catastrophic failure**.
This is an explicit architectural decision and one we are unlikely to deviate
@@ -35,10 +35,10 @@ they are not appropriate for communicating application state in a modern
operational environment. This document explains the reasoning behind our use of
exit codes in more detail.
-In particular, this approach is informed by a focus on operating Phabricator
+In particular, this approach is informed by a focus on operating Phorge
clusters at scale. This is not a common deployment scenario, but we consider it
the most important one. Our use of exit codes makes it easier to deploy and
-operate a Phabricator cluster at larger scales. It makes it slightly harder to
+operate a Phorge cluster at larger scales. It makes it slightly harder to
deploy and operate a small cluster or single host by gluing together `bash`
scripts. We are willingly trading the small scale away for advantages at larger
scales.
@@ -56,11 +56,10 @@ operations environment faces different forces than the interactive shell did
in the 1970s, particularly at scale.
We consider correctness to be very important to modern operations environments.
-In particular, we manage a Phabricator cluster (Phacility) and believe that
-having reliable, repeatable processes for provisioning, configuration and
-deployment is critical to maintaining and scaling our operations. Our use of
-exit codes makes it easier to implement processes that are correct and reliable
-on top of Phabricator management scripts.
+In particular, we believe that having reliable, repeatable processes for
+provisioning, configuration and deployment is critical to maintaining and
+scaling our operations. Our use of exit codes makes it easier to implement
+processes that are correct and reliable on top of Phorge management scripts.
Exit codes as signals for application state are problematic because they are
ambiguous: you can't use them to distinguish between dissimilar failure states
@@ -228,13 +227,13 @@ particular, ease of use in a `bash` environment is not a compelling motivation.
We are broadly willing to make output machine parseable or provide an explicit
machine output mode (often a `--json` flag) if there is a reasonable use case
-for it. However, we operate a large production cluster of Phabricator instances
+for it. However, we operate a large production cluster of Phorge instances
with the tools available in the upstream, so the lack of machine parseable
output is not sufficient to motivate adding such output on its own: we also
need to understand the problem you're facing, and why it isn't a problem we
face. A simpler or cleaner approach to the problem may already exist.
-If you just want to write `bash` scripts on top of Phabricator scripts and you
+If you just want to write `bash` scripts on top of Phorge scripts and you
are unswayed by these concerns, you can often just build a composite command to
get roughly the same effect that you'd get out of an exit code.
diff --git a/src/docs/user/field/performance.diviner b/src/docs/user/field/performance.diviner
index c5980acd0e..09e7023fb9 100644
--- a/src/docs/user/field/performance.diviner
+++ b/src/docs/user/field/performance.diviner
@@ -23,18 +23,18 @@ Performance and the Upstream
============================
Performance issues and hangs will often require upstream involvement to fully
-resolve. The intent is for Phabricator to perform well in all reasonable cases,
+resolve. The intent is for Phorge to perform well in all reasonable cases,
not require tuning for different workloads (as long as those workloads are
generally reasonable). Poor performance with a reasonable workload is likely a
bug, not a configuration problem.
-However, some pages are slow because Phabricator legitimately needs to do a lot
+However, some pages are slow because Phorge legitimately needs to do a lot
of work to generate them. For example, if you write a 100MB wiki document,
-Phabricator will need substantial time to process it, it will take a long time
+Phorge will need substantial time to process it, it will take a long time
to download over the network, and your browser will probably not be able to
render it especially quickly.
-We may be able to improve performance in some cases, but Phabricator is not
+We may be able to improve performance in some cases, but Phorge is not
magic and can not wish away real complexity. The best solution to these problems
is usually to find another way to solve your problem: for example, maybe the
100MB document can be split into several smaller documents.
diff --git a/src/docs/user/field/permanently_destroying_data.diviner b/src/docs/user/field/permanently_destroying_data.diviner
index 04907fc0be..8f5d667252 100644
--- a/src/docs/user/field/permanently_destroying_data.diviner
+++ b/src/docs/user/field/permanently_destroying_data.diviner
@@ -6,7 +6,7 @@ How to permanently destroy data and manage leaked secrets.
Overview
========
-Phabricator intentionally makes it difficult to permanently destroy data, but
+Phorge intentionally makes it difficult to permanently destroy data, but
provides a command-line tool for destroying objects if you're certain that
you want to destroy something.
@@ -24,7 +24,7 @@ Destroying Data
To permanently destroy an object, run this command from the command line:
```
-phabricator/ $ ./bin/remove destroy