diff --git a/conf/default.conf.php b/conf/default.conf.php
index 7cef111ba1..e441e130da 100644
--- a/conf/default.conf.php
+++ b/conf/default.conf.php
@@ -992,6 +992,7 @@ return array(
'bash' => 'Bash Scripting',
'brainfuck' => 'Brainf*ck',
'c' => 'C',
+ 'coffee-script' => 'CoffeeScript',
'cpp' => 'C++',
'css' => 'CSS',
'd' => 'D',
@@ -999,14 +1000,18 @@ return array(
'django' => 'Django Templating',
'erb' => 'Embedded Ruby/ERB',
'erlang' => 'Erlang',
+ 'go' => 'Golang',
+ 'groovy' => 'Groovy',
'haskell' => 'Haskell',
'html' => 'HTML',
'java' => 'Java',
'js' => 'Javascript',
+ 'json' => 'JSON',
'mysql' => 'MySQL',
'objc' => 'Objective-C',
'perl' => 'Perl',
'php' => 'PHP',
+ 'puppet' => 'Puppet',
'rest' => 'reStructuredText',
'text' => 'Plain Text',
'python' => 'Python',
@@ -1014,6 +1019,7 @@ return array(
'remarkup' => 'Remarkup',
'ruby' => 'Ruby',
'xml' => 'XML',
+ 'yaml' => 'YAML',
),
// This is an override list of regular expressions which allows you to choose
@@ -1035,6 +1041,7 @@ return array(
// '@\\.([^.]+)\\.bak$@' => 1,
'@\.arcconfig$@' => 'js',
+ '@\.arclint$@' => 'js',
'@\.divinerconfig$@' => 'js',
),
diff --git a/resources/celerity/map.php b/resources/celerity/map.php
index 832717065b..268675360e 100644
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -7,7 +7,7 @@
return array(
'names' =>
array(
- 'core.pkg.css' => 'ac63f8ac',
+ 'core.pkg.css' => 'c94a698c',
'core.pkg.js' => '7db41c19',
'darkconsole.pkg.js' => 'ca8671ce',
'differential.pkg.css' => 'fbf57382',
@@ -64,7 +64,6 @@ return array(
'rsrc/css/application/diffusion/commit-view.css' => '92d1e8f9',
'rsrc/css/application/diffusion/diffusion-icons.css' => '384a0f7d',
'rsrc/css/application/diffusion/diffusion-source.css' => '66fdf661',
- 'rsrc/css/application/directory/phabricator-jump-nav.css' => 'f0c5e726',
'rsrc/css/application/feed/feed.css' => 'dd43ce00',
'rsrc/css/application/files/global-drag-and-drop.css' => '697324ad',
'rsrc/css/application/flag/flag.css' => '5337623f',
@@ -137,7 +136,7 @@ return array(
'rsrc/css/phui/phui-info-panel.css' => '27ea50a1',
'rsrc/css/phui/phui-list.css' => '43ed2d93',
'rsrc/css/phui/phui-object-box.css' => 'ce92d8ec',
- 'rsrc/css/phui/phui-object-item-list-view.css' => '16003f41',
+ 'rsrc/css/phui/phui-object-item-list-view.css' => '15c582b1',
'rsrc/css/phui/phui-pinboard-view.css' => '874c22f9',
'rsrc/css/phui/phui-property-list-view.css' => '2f7199e8',
'rsrc/css/phui/phui-remarkup-preview.css' => '19ad512b',
@@ -483,7 +482,7 @@ return array(
'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8',
'rsrc/js/phuix/PHUIXActionView.js' => '6e8cefa4',
'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bd4c8dca',
- 'rsrc/swf/aphlict.swf' => 'abac967d',
+ 'rsrc/swf/aphlict.swf' => 'f22c1e40',
),
'symbols' =>
array(
@@ -707,7 +706,6 @@ return array(
'phabricator-flag-css' => '5337623f',
'phabricator-hovercard' => '4f344388',
'phabricator-hovercard-view-css' => '46a13cf0',
- 'phabricator-jump-nav' => 'f0c5e726',
'phabricator-keyboard-shortcut' => '1ae869f2',
'phabricator-keyboard-shortcut-manager' => 'ad7a69ca',
'phabricator-main-menu-view' => '72d1d2ef',
@@ -768,7 +766,7 @@ return array(
'phui-info-panel-css' => '27ea50a1',
'phui-list-view-css' => '43ed2d93',
'phui-object-box-css' => 'ce92d8ec',
- 'phui-object-item-list-view-css' => '16003f41',
+ 'phui-object-item-list-view-css' => '15c582b1',
'phui-pinboard-view-css' => '874c22f9',
'phui-property-list-view-css' => '2f7199e8',
'phui-remarkup-preview-css' => '19ad512b',
@@ -2113,47 +2111,46 @@ return array(
8 => 'aphront-tokenizer-control-css',
9 => 'aphront-typeahead-control-css',
10 => 'aphront-list-filter-view-css',
- 11 => 'phabricator-jump-nav',
- 12 => 'phabricator-remarkup-css',
- 13 => 'syntax-highlighting-css',
- 14 => 'aphront-pager-view-css',
- 15 => 'phabricator-transaction-view-css',
- 16 => 'aphront-tooltip-css',
- 17 => 'phabricator-flag-css',
- 18 => 'aphront-error-view-css',
- 19 => 'sprite-remarkup-css',
- 20 => 'sprite-gradient-css',
- 21 => 'sprite-menu-css',
- 22 => 'sprite-apps-css',
- 23 => 'sprite-apps-large-css',
- 24 => 'phabricator-main-menu-view',
- 25 => 'phabricator-notification-css',
- 26 => 'phabricator-notification-menu-css',
- 27 => 'lightbox-attachment-css',
- 28 => 'phui-header-view-css',
- 29 => 'phabricator-filetree-view-css',
- 30 => 'phabricator-nav-view-css',
- 31 => 'phabricator-side-menu-view-css',
- 32 => 'phabricator-crumbs-view-css',
- 33 => 'phui-object-item-list-view-css',
- 34 => 'global-drag-and-drop-css',
- 35 => 'phui-spacing-css',
- 36 => 'phui-form-css',
- 37 => 'phui-icon-view-css',
- 38 => 'phabricator-application-launch-view-css',
- 39 => 'phabricator-action-list-view-css',
- 40 => 'phui-property-list-view-css',
- 41 => 'phui-tag-view-css',
- 42 => 'phui-list-view-css',
- 43 => 'font-fontawesome',
- 44 => 'phui-font-icon-base-css',
- 45 => 'sprite-main-header-css',
- 46 => 'phui-box-css',
- 47 => 'phui-object-box-css',
- 48 => 'phui-timeline-view-css',
- 49 => 'sprite-tokens-css',
- 50 => 'tokens-css',
- 51 => 'phui-status-list-view-css',
+ 11 => 'phabricator-remarkup-css',
+ 12 => 'syntax-highlighting-css',
+ 13 => 'aphront-pager-view-css',
+ 14 => 'phabricator-transaction-view-css',
+ 15 => 'aphront-tooltip-css',
+ 16 => 'phabricator-flag-css',
+ 17 => 'aphront-error-view-css',
+ 18 => 'sprite-remarkup-css',
+ 19 => 'sprite-gradient-css',
+ 20 => 'sprite-menu-css',
+ 21 => 'sprite-apps-css',
+ 22 => 'sprite-apps-large-css',
+ 23 => 'phabricator-main-menu-view',
+ 24 => 'phabricator-notification-css',
+ 25 => 'phabricator-notification-menu-css',
+ 26 => 'lightbox-attachment-css',
+ 27 => 'phui-header-view-css',
+ 28 => 'phabricator-filetree-view-css',
+ 29 => 'phabricator-nav-view-css',
+ 30 => 'phabricator-side-menu-view-css',
+ 31 => 'phabricator-crumbs-view-css',
+ 32 => 'phui-object-item-list-view-css',
+ 33 => 'global-drag-and-drop-css',
+ 34 => 'phui-spacing-css',
+ 35 => 'phui-form-css',
+ 36 => 'phui-icon-view-css',
+ 37 => 'phabricator-application-launch-view-css',
+ 38 => 'phabricator-action-list-view-css',
+ 39 => 'phui-property-list-view-css',
+ 40 => 'phui-tag-view-css',
+ 41 => 'phui-list-view-css',
+ 42 => 'font-fontawesome',
+ 43 => 'phui-font-icon-base-css',
+ 44 => 'sprite-main-header-css',
+ 45 => 'phui-box-css',
+ 46 => 'phui-object-box-css',
+ 47 => 'phui-timeline-view-css',
+ 48 => 'sprite-tokens-css',
+ 49 => 'tokens-css',
+ 50 => 'phui-status-list-view-css',
),
'core.pkg.js' =>
array(
diff --git a/resources/celerity/packages.php b/resources/celerity/packages.php
index 2f9522e2d5..32c9479f65 100644
--- a/resources/celerity/packages.php
+++ b/resources/celerity/packages.php
@@ -83,8 +83,6 @@ return array(
'aphront-typeahead-control-css',
'aphront-list-filter-view-css',
- 'phabricator-jump-nav',
-
'phabricator-remarkup-css',
'syntax-highlighting-css',
'aphront-pager-view-css',
diff --git a/resources/sql/patches/20131004.dxreviewers.php b/resources/sql/patches/20131004.dxreviewers.php
index 3904613eb3..8ff3bc32f8 100644
--- a/resources/sql/patches/20131004.dxreviewers.php
+++ b/resources/sql/patches/20131004.dxreviewers.php
@@ -32,7 +32,7 @@ foreach (new LiskMigrationIterator($table) as $revision) {
if (phid_get_type($dst) == PhabricatorPHIDConstants::PHID_TYPE_UNKNOWN) {
// At least one old install ran into some issues here. Skip the row if we
// can't figure out what the destination PHID is. See here:
- // https://github.com/facebook/phabricator/pull/507
+ // https://github.com/phacility/phabricator/pull/507
continue;
}
diff --git a/scripts/install/install_rhel-derivs.sh b/scripts/install/install_rhel-derivs.sh
index a09949f29b..58753c038c 100755
--- a/scripts/install/install_rhel-derivs.sh
+++ b/scripts/install/install_rhel-derivs.sh
@@ -119,21 +119,21 @@ confirm
if [[ ! -e libphutil ]]
then
- git clone git://github.com/facebook/libphutil.git
+ git clone git://github.com/phacility/libphutil.git
else
(cd libphutil && git pull --rebase)
fi
if [[ ! -e arcanist ]]
then
- git clone git://github.com/facebook/arcanist.git
+ git clone git://github.com/phacility/arcanist.git
else
(cd arcanist && git pull --rebase)
fi
if [[ ! -e phabricator ]]
then
- git clone git://github.com/facebook/phabricator.git
+ git clone git://github.com/phacility/phabricator.git
else
(cd phabricator && git pull --rebase)
fi
diff --git a/scripts/install/install_ubuntu.sh b/scripts/install/install_ubuntu.sh
index e736b7128f..265d044883 100755
--- a/scripts/install/install_ubuntu.sh
+++ b/scripts/install/install_ubuntu.sh
@@ -64,21 +64,21 @@ fi
if [ ! -e libphutil ]
then
- git clone git://github.com/facebook/libphutil.git
+ git clone git://github.com/phacility/libphutil.git
else
(cd libphutil && git pull --rebase)
fi
if [ ! -e arcanist ]
then
- git clone git://github.com/facebook/arcanist.git
+ git clone git://github.com/phacility/arcanist.git
else
(cd arcanist && git pull --rebase)
fi
if [ ! -e phabricator ]
then
- git clone git://github.com/facebook/phabricator.git
+ git clone git://github.com/phacility/phabricator.git
else
(cd phabricator && git pull --rebase)
fi
diff --git a/src/aphront/console/plugin/DarkConsoleErrorLogPlugin.php b/src/aphront/console/plugin/DarkConsoleErrorLogPlugin.php
index 7c96cafe6f..cf2d2841f2 100644
--- a/src/aphront/console/plugin/DarkConsoleErrorLogPlugin.php
+++ b/src/aphront/console/plugin/DarkConsoleErrorLogPlugin.php
@@ -99,58 +99,3 @@ final class DarkConsoleErrorLogPlugin extends DarkConsolePlugin {
));
}
}
-
-/*
- $data = $this->getData();
- if (!$data) {
- return
-
- No errors.
- ;
- }
-
- $markup =
;
- $alt = false;
- foreach ($data as $error) {
- $row =
;
-
- $text = $error['error'];
- $text = preg_replace('/\(in .* on line \d+\)$/', '', trim($text));
-
- $trace = $error['trace'];
- $trace = explode("\n", $trace);
- if (!$trace) {
- $trace = array('unknown@0@unknown');
- }
-
- foreach ($trace as $idx => $traceline) {
- list($file, $line, $where) = array_merge(
- explode('@', $traceline),
- array('?', '?', '?'));
- if ($where == 'DarkConsole->addError' ||
- $where == 'debug_rlog') {
- unset($trace[$idx]);
- }
- }
-
- $row->appendChild({$text} | );
-
- foreach ($trace as $traceline) {
- list($file, $line, $where) = array_merge(
- explode('@', $traceline),
- array('?', '?', '?'));
- $row->appendChild({$file}:{$line} | );
- $row->appendChild({$where}() | );
- $markup->appendChild($row);
- $row =
;
- }
-
- $alt = !$alt;
- }
-
- return
-
- Errors
- {$markup}
- ;
-*/
diff --git a/src/applications/audit/application/PhabricatorApplicationAudit.php b/src/applications/audit/application/PhabricatorApplicationAudit.php
index 87b6b2cfde..ef85b7c0fc 100644
--- a/src/applications/audit/application/PhabricatorApplicationAudit.php
+++ b/src/applications/audit/application/PhabricatorApplicationAudit.php
@@ -2,10 +2,6 @@
final class PhabricatorApplicationAudit extends PhabricatorApplication {
- public function getShortDescription() {
- return pht('Audit Code');
- }
-
public function getBaseURI() {
return '/audit/';
}
@@ -14,6 +10,10 @@ final class PhabricatorApplicationAudit extends PhabricatorApplication {
return 'audit';
}
+ public function getShortDescription() {
+ return pht('Browse and Audit Commits');
+ }
+
public function getHelpURI() {
return PhabricatorEnv::getDoclink('Audit User Guide');
}
diff --git a/src/applications/auth/application/PhabricatorApplicationAuth.php b/src/applications/auth/application/PhabricatorApplicationAuth.php
index 0a25817907..3c51aa9bc0 100644
--- a/src/applications/auth/application/PhabricatorApplicationAuth.php
+++ b/src/applications/auth/application/PhabricatorApplicationAuth.php
@@ -14,6 +14,10 @@ final class PhabricatorApplicationAuth extends PhabricatorApplication {
return 'authentication';
}
+ public function getShortDescription() {
+ return pht('Configure Login and Registration');
+ }
+
public function getHelpURI() {
// NOTE: Although reasonable help exists for this in "Configuring Accounts
// and Registration", specifying a help URI here means we get the menu
diff --git a/src/applications/base/PhabricatorApplication.php b/src/applications/base/PhabricatorApplication.php
index bed89ed741..91acc55a8f 100644
--- a/src/applications/base/PhabricatorApplication.php
+++ b/src/applications/base/PhabricatorApplication.php
@@ -155,12 +155,10 @@ abstract class PhabricatorApplication
}
public function getHelpURI() {
- // TODO: When these applications get created, link to their docs:
- //
- // - Drydock
- // - OAuth Server
-
+ return null;
+ }
+ public function getOverview() {
return null;
}
diff --git a/src/applications/calendar/application/PhabricatorApplicationCalendar.php b/src/applications/calendar/application/PhabricatorApplicationCalendar.php
index 9554557dc5..18c6b12d11 100644
--- a/src/applications/calendar/application/PhabricatorApplicationCalendar.php
+++ b/src/applications/calendar/application/PhabricatorApplicationCalendar.php
@@ -3,7 +3,7 @@
final class PhabricatorApplicationCalendar extends PhabricatorApplication {
public function getShortDescription() {
- return pht('Dates and Stuff');
+ return pht('Upcoming Events');
}
public function getFlavorText() {
diff --git a/src/applications/chatlog/applications/PhabricatorApplicationChatLog.php b/src/applications/chatlog/applications/PhabricatorApplicationChatLog.php
index 707cf46344..018cae36c0 100644
--- a/src/applications/chatlog/applications/PhabricatorApplicationChatLog.php
+++ b/src/applications/chatlog/applications/PhabricatorApplicationChatLog.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationChatLog extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Chat Log');
+ return pht('IRC Logs');
}
public function getIconName() {
diff --git a/src/applications/conduit/application/PhabricatorApplicationConduit.php b/src/applications/conduit/application/PhabricatorApplicationConduit.php
index 248877bb9b..e50778e30f 100644
--- a/src/applications/conduit/application/PhabricatorApplicationConduit.php
+++ b/src/applications/conduit/application/PhabricatorApplicationConduit.php
@@ -19,7 +19,7 @@ final class PhabricatorApplicationConduit extends PhabricatorApplication {
}
public function getShortDescription() {
- return 'Conduit API Console';
+ return pht('Phabricator Developer API Console');
}
public function getTitleGlyph() {
diff --git a/src/applications/config/application/PhabricatorApplicationConfig.php b/src/applications/config/application/PhabricatorApplicationConfig.php
index d18b81c2df..aa3756c438 100644
--- a/src/applications/config/application/PhabricatorApplicationConfig.php
+++ b/src/applications/config/application/PhabricatorApplicationConfig.php
@@ -22,6 +22,10 @@ final class PhabricatorApplicationConfig extends PhabricatorApplication {
return false;
}
+ public function getShortDescription() {
+ return pht('Configure Phabricator');
+ }
+
public function getRoutes() {
return array(
'/config/' => array(
diff --git a/src/applications/config/option/PhabricatorSyntaxHighlightingConfigOptions.php b/src/applications/config/option/PhabricatorSyntaxHighlightingConfigOptions.php
index d0fcc26df6..4ce4725faa 100644
--- a/src/applications/config/option/PhabricatorSyntaxHighlightingConfigOptions.php
+++ b/src/applications/config/option/PhabricatorSyntaxHighlightingConfigOptions.php
@@ -42,6 +42,7 @@ final class PhabricatorSyntaxHighlightingConfigOptions
'bash' => 'Bash Scripting',
'brainfuck' => 'Brainf*ck',
'c' => 'C',
+ 'coffee-script' => 'CoffeeScript',
'cpp' => 'C++',
'css' => 'CSS',
'd' => 'D',
@@ -49,15 +50,19 @@ final class PhabricatorSyntaxHighlightingConfigOptions
'django' => 'Django Templating',
'erb' => 'Embedded Ruby/ERB',
'erlang' => 'Erlang',
+ 'go' => 'Golang',
+ 'groovy' => 'Groovy',
'haskell' => 'Haskell',
'html' => 'HTML',
'invisible' => 'Invisible',
'java' => 'Java',
'js' => 'Javascript',
+ 'json' => 'JSON',
'mysql' => 'MySQL',
'objc' => 'Objective-C',
'perl' => 'Perl',
'php' => 'PHP',
+ 'puppet' => 'Puppet',
'rest' => 'reStructuredText',
'text' => 'Plain Text',
'python' => 'Python',
@@ -65,6 +70,7 @@ final class PhabricatorSyntaxHighlightingConfigOptions
'remarkup' => 'Remarkup',
'ruby' => 'Ruby',
'xml' => 'XML',
+ 'yaml' => 'YAML',
))
->setSummary(
pht("Set the language list which appears in dropdowns."))
@@ -77,6 +83,7 @@ final class PhabricatorSyntaxHighlightingConfigOptions
'wild',
array(
'@\.arcconfig$@' => 'js',
+ '@\.arclint$@' => 'js',
'@\.divinerconfig$@' => 'js',
))
->setSummary(
diff --git a/src/applications/conpherence/application/PhabricatorApplicationConpherence.php b/src/applications/conpherence/application/PhabricatorApplicationConpherence.php
index 7a36283459..d86cb67722 100644
--- a/src/applications/conpherence/application/PhabricatorApplicationConpherence.php
+++ b/src/applications/conpherence/application/PhabricatorApplicationConpherence.php
@@ -10,7 +10,7 @@ final class PhabricatorApplicationConpherence extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Messaging');
+ return pht('Send Messages');
}
public function getIconName() {
diff --git a/src/applications/countdown/application/PhabricatorApplicationCountdown.php b/src/applications/countdown/application/PhabricatorApplicationCountdown.php
index ba01b55f57..e50dec7725 100644
--- a/src/applications/countdown/application/PhabricatorApplicationCountdown.php
+++ b/src/applications/countdown/application/PhabricatorApplicationCountdown.php
@@ -11,7 +11,7 @@ final class PhabricatorApplicationCountdown extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Countdown Timers');
+ return pht('Countdown to Events');
}
public function getTitleGlyph() {
diff --git a/src/applications/daemon/application/PhabricatorApplicationDaemons.php b/src/applications/daemon/application/PhabricatorApplicationDaemons.php
index f6582ccfee..4ceec3a4cb 100644
--- a/src/applications/daemon/application/PhabricatorApplicationDaemons.php
+++ b/src/applications/daemon/application/PhabricatorApplicationDaemons.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationDaemons extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Manage Daemons');
+ return pht('Manage Phabricator Daemons');
}
public function getBaseURI() {
diff --git a/src/applications/dashboard/application/PhabricatorApplicationDashboard.php b/src/applications/dashboard/application/PhabricatorApplicationDashboard.php
index 4c3f57b5ad..65704afd98 100644
--- a/src/applications/dashboard/application/PhabricatorApplicationDashboard.php
+++ b/src/applications/dashboard/application/PhabricatorApplicationDashboard.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationDashboard extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Such Data');
+ return pht('Create Custom Pages');
}
public function getIconName() {
diff --git a/src/applications/dashboard/controller/PhabricatorDashboardViewController.php b/src/applications/dashboard/controller/PhabricatorDashboardViewController.php
index 5fded53dab..0201a8e2ee 100644
--- a/src/applications/dashboard/controller/PhabricatorDashboardViewController.php
+++ b/src/applications/dashboard/controller/PhabricatorDashboardViewController.php
@@ -26,10 +26,14 @@ final class PhabricatorDashboardViewController
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(pht('Dashboard %d', $dashboard->getID()));
- $rendered_dashboard = id(new PhabricatorDashboardRenderingEngine())
- ->setViewer($viewer)
- ->setDashboard($dashboard)
- ->renderDashboard();
+ if ($dashboard->getPanelPHIDs()) {
+ $rendered_dashboard = id(new PhabricatorDashboardRenderingEngine())
+ ->setViewer($viewer)
+ ->setDashboard($dashboard)
+ ->renderDashboard();
+ } else {
+ $rendered_dashboard = $this->buildEmptyView();
+ }
return $this->buildApplicationPage(
array(
@@ -50,9 +54,24 @@ final class PhabricatorDashboardViewController
id(new PHUIListItemView())
->setIcon('fa-th')
->setName(pht('Manage Dashboard'))
- ->setHref($this->getApplicationURI()."manage/{$id}/"));
+ ->setHref($this->getApplicationURI("manage/{$id}/")));
return $crumbs;
}
+ public function buildEmptyView() {
+ $id = $this->id;
+ $manage_uri = $this->getApplicationURI("manage/{$id}/");
+
+ return id(new AphrontErrorView())
+ ->setSeverity(AphrontErrorView::SEVERITY_NODATA)
+ ->appendChild(
+ pht('This dashboard has no panels '.
+ 'yet. Use %s to add panels.',
+ phutil_tag(
+ 'a',
+ array('href'=>$manage_uri),
+ pht('Manage Dashboard'))));
+ }
+
}
diff --git a/src/applications/differential/application/PhabricatorApplicationDifferential.php b/src/applications/differential/application/PhabricatorApplicationDifferential.php
index 289a1a4d5e..b2816d6ab9 100644
--- a/src/applications/differential/application/PhabricatorApplicationDifferential.php
+++ b/src/applications/differential/application/PhabricatorApplicationDifferential.php
@@ -36,6 +36,14 @@ final class PhabricatorApplicationDifferential extends PhabricatorApplication {
);
}
+ public function getOverview() {
+ return pht(<<[1-9]\d*)' => 'DifferentialRevisionViewController',
diff --git a/src/applications/differential/customfield/DifferentialTestPlanField.php b/src/applications/differential/customfield/DifferentialTestPlanField.php
index c4c8cf7943..efc3bfc1a0 100644
--- a/src/applications/differential/customfield/DifferentialTestPlanField.php
+++ b/src/applications/differential/customfield/DifferentialTestPlanField.php
@@ -44,7 +44,7 @@ final class DifferentialTestPlanField
protected function getCoreFieldRequiredErrorString() {
return pht(
'You must provide a test plan. Describe the actions you performed '.
- 'to verify the behvaior of this change.');
+ 'to verify the behavior of this change.');
}
public function readValueFromRequest(AphrontRequest $request) {
diff --git a/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php b/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php
index e22087af67..15865e5ceb 100644
--- a/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php
+++ b/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php
@@ -3,7 +3,7 @@
final class PhabricatorApplicationDiffusion extends PhabricatorApplication {
public function getShortDescription() {
- return pht('Repository Browser');
+ return pht('Host and Browse Repositories');
}
public function getBaseURI() {
diff --git a/src/applications/diffusion/controller/DiffusionBrowseFileController.php b/src/applications/diffusion/controller/DiffusionBrowseFileController.php
index fdeeabdb56..2a926136a8 100644
--- a/src/applications/diffusion/controller/DiffusionBrowseFileController.php
+++ b/src/applications/diffusion/controller/DiffusionBrowseFileController.php
@@ -9,6 +9,7 @@ final class DiffusionBrowseFileController extends DiffusionBrowseController {
public function processRequest() {
$request = $this->getRequest();
$drequest = $this->getDiffusionRequest();
+ $viewer = $request->getUser();
$before = $request->getStr('before');
if ($before) {
@@ -17,7 +18,7 @@ final class DiffusionBrowseFileController extends DiffusionBrowseController {
$path = $drequest->getPath();
- $preferences = $request->getUser()->loadPreferences();
+ $preferences = $viewer->loadPreferences();
$show_blame = $request->getBool(
'blame',
@@ -31,7 +32,7 @@ final class DiffusionBrowseFileController extends DiffusionBrowseController {
true));
$view = $request->getStr('view');
- if ($request->isFormPost() && $view != 'raw') {
+ if ($request->isFormPost() && $view != 'raw' && $viewer->isLoggedIn()) {
$preferences->setPreference(
PhabricatorUserPreferences::PREFERENCE_DIFFUSION_BLAME,
$show_blame);
@@ -354,7 +355,7 @@ final class DiffusionBrowseFileController extends DiffusionBrowseController {
->setHref($base_uri->alter('blame', $blame_value))
->setIcon($blame_icon)
->setUser($viewer)
- ->setRenderAsForm(true));
+ ->setRenderAsForm($viewer->isLoggedIn()));
if ($show_color) {
$highlight_text = pht('Disable Highlighting');
@@ -372,7 +373,7 @@ final class DiffusionBrowseFileController extends DiffusionBrowseController {
->setHref($base_uri->alter('color', $highlight_value))
->setIcon($highlight_icon)
->setUser($viewer)
- ->setRenderAsForm(true));
+ ->setRenderAsForm($viewer->isLoggedIn()));
$href = null;
if ($this->getRequest()->getStr('lint') !== null) {
diff --git a/src/applications/diviner/application/PhabricatorApplicationDiviner.php b/src/applications/diviner/application/PhabricatorApplicationDiviner.php
index 524786fe9d..da2fd4bcb8 100644
--- a/src/applications/diviner/application/PhabricatorApplicationDiviner.php
+++ b/src/applications/diviner/application/PhabricatorApplicationDiviner.php
@@ -36,7 +36,7 @@ final class PhabricatorApplicationDiviner extends PhabricatorApplication {
}
public function getApplicationGroup() {
- return self::GROUP_COMMUNICATION;
+ return self::GROUP_UTILITIES;
}
public function getRemarkupRules() {
diff --git a/src/applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php b/src/applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php
index 24b605c1cc..d1e0281765 100644
--- a/src/applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php
+++ b/src/applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php
@@ -6,14 +6,14 @@ final class PhabricatorApplicationDoorkeeper extends PhabricatorApplication {
return false;
}
- public function getBaseURI() {
- return '/doorkeeper/';
- }
-
public function shouldAppearInLaunchView() {
return false;
}
+ public function getShortDescription() {
+ return pht('Connect to Other Software');
+ }
+
public function getRemarkupRules() {
return array(
new DoorkeeperRemarkupRuleAsana(),
diff --git a/src/applications/drydock/application/PhabricatorApplicationDrydock.php b/src/applications/drydock/application/PhabricatorApplicationDrydock.php
index fc2e39c4b4..06bd4d264a 100644
--- a/src/applications/drydock/application/PhabricatorApplicationDrydock.php
+++ b/src/applications/drydock/application/PhabricatorApplicationDrydock.php
@@ -30,6 +30,10 @@ final class PhabricatorApplicationDrydock extends PhabricatorApplication {
return true;
}
+ public function getHelpURI() {
+ return PhabricatorEnv::getDoclink('Drydock User Guide');
+ }
+
public function getRoutes() {
return array(
'/drydock/' => array(
diff --git a/src/applications/fact/application/PhabricatorApplicationFact.php b/src/applications/fact/application/PhabricatorApplicationFact.php
index 0436594b50..3a3439c7bc 100644
--- a/src/applications/fact/application/PhabricatorApplicationFact.php
+++ b/src/applications/fact/application/PhabricatorApplicationFact.php
@@ -3,7 +3,7 @@
final class PhabricatorApplicationFact extends PhabricatorApplication {
public function getShortDescription() {
- return 'Analyze Data';
+ return pht('Chart and Analyze Data');
}
public function getName() {
diff --git a/src/applications/feed/application/PhabricatorApplicationFeed.php b/src/applications/feed/application/PhabricatorApplicationFeed.php
index 21c8092e3d..b30da72fe5 100644
--- a/src/applications/feed/application/PhabricatorApplicationFeed.php
+++ b/src/applications/feed/application/PhabricatorApplicationFeed.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationFeed extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Review Activity');
+ return pht('Review Recent Activity');
}
public function getIconName() {
diff --git a/src/applications/flag/application/PhabricatorApplicationFlags.php b/src/applications/flag/application/PhabricatorApplicationFlags.php
index b7701340b6..e9bee801d1 100644
--- a/src/applications/flag/application/PhabricatorApplicationFlags.php
+++ b/src/applications/flag/application/PhabricatorApplicationFlags.php
@@ -3,7 +3,7 @@
final class PhabricatorApplicationFlags extends PhabricatorApplication {
public function getShortDescription() {
- return pht('Reminders');
+ return pht('Personal Bookmarks and Reminders');
}
public function getBaseURI() {
@@ -25,7 +25,7 @@ final class PhabricatorApplicationFlags extends PhabricatorApplication {
}
public function getApplicationGroup() {
- return self::GROUP_ORGANIZATION;
+ return self::GROUP_UTILITIES;
}
public function loadStatus(PhabricatorUser $user) {
diff --git a/src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php b/src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php
index 4e3c61a64f..699f58077f 100644
--- a/src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php
+++ b/src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationHarbormaster extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Continuous Build');
+ return pht('Builds and Continuous Integration');
}
public function getIconName() {
diff --git a/src/applications/home/controller/PhabricatorHomeMainController.php b/src/applications/home/controller/PhabricatorHomeMainController.php
index adfad2863d..693695e300 100644
--- a/src/applications/home/controller/PhabricatorHomeMainController.php
+++ b/src/applications/home/controller/PhabricatorHomeMainController.php
@@ -16,10 +16,6 @@ final class PhabricatorHomeMainController
public function processRequest() {
$user = $this->getRequest()->getUser();
-
- if ($this->filter == 'jump') {
- return $this->buildJumpResponse();
- }
$nav = $this->buildNav();
$dashboard = PhabricatorDashboardInstall::getDashboard(
@@ -92,8 +88,6 @@ final class PhabricatorHomeMainController
$welcome_panel = null;
}
- $jump_panel = $this->buildJumpPanel();
-
if ($has_differential) {
$revision_panel = $this->buildRevisionPanel();
} else {
@@ -101,7 +95,6 @@ final class PhabricatorHomeMainController
}
$content = array(
- $jump_panel,
$welcome_panel,
$unbreak_panel,
$triage_panel,
@@ -118,27 +111,6 @@ final class PhabricatorHomeMainController
}
- private function buildJumpResponse() {
- $request = $this->getRequest();
- $jump = $request->getStr('jump');
-
- $response = PhabricatorJumpNavHandler::getJumpResponse(
- $request->getUser(),
- $jump);
-
- if ($response) {
- return $response;
- } else if ($request->isFormPost()) {
- $uri = new PhutilURI('/search/');
- $uri->setQueryParam('query', $jump);
- $uri->setQueryParam('search:primary', 'true');
-
- return id(new AphrontRedirectResponse())->setURI((string)$uri);
- } else {
- return id(new AphrontRedirectResponse())->setURI('/');
- }
- }
-
private function buildUnbreakNowPanel() {
$unbreak_now = PhabricatorEnv::getEnvConfig(
'maniphest.priorities.unbreak-now');
@@ -330,73 +302,6 @@ final class PhabricatorHomeMainController
return $view;
}
- private function buildJumpPanel($query=null) {
- $request = $this->getRequest();
- $user = $request->getUser();
-
- $uniq_id = celerity_generate_unique_node_id();
-
- Javelin::initBehavior(
- 'phabricator-autofocus',
- array(
- 'id' => $uniq_id,
- ));
-
- require_celerity_resource('phabricator-jump-nav');
-
- $doc_href = PhabricatorEnv::getDocLink('Jump Nav User Guide');
- $doc_link = phutil_tag(
- 'a',
- array(
- 'href' => $doc_href,
- ),
- 'Jump Nav User Guide');
-
- $jump_input = phutil_tag(
- 'input',
- array(
- 'type' => 'text',
- 'class' => 'phabricator-jump-nav',
- 'name' => 'jump',
- 'id' => $uniq_id,
- 'value' => $query,
- ));
- $jump_caption = phutil_tag(
- 'p',
- array(
- 'class' => 'phabricator-jump-nav-caption',
- ),
- hsprintf(
- 'Enter the name of an object like D123 to quickly jump to '.
- 'it. See %s or type help.',
- $doc_link));
-
- $form = phabricator_form(
- $user,
- array(
- 'action' => '/jump/',
- 'method' => 'POST',
- 'class' => 'phabricator-jump-nav-form',
- ),
- array(
- $jump_input,
- $jump_caption,
- ));
-
- $panel = new AphrontPanelView();
- $panel->setNoBackground();
- // $panel->appendChild();
-
- $list_filter = new AphrontListFilterView();
- $list_filter->appendChild($form);
-
- $container = phutil_tag('div',
- array('class' => 'phabricator-jump-nav-container'),
- $list_filter);
-
- return $container;
- }
-
private function renderSectionHeader($title, $href) {
$header = phutil_tag(
'a',
diff --git a/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php b/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php
index 7b9dd4b0b5..999e20b646 100644
--- a/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php
+++ b/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationLegalpad extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Legal Documents');
+ return pht('Agreements and Signatures');
}
public function getIconName() {
diff --git a/src/applications/maniphest/config/PhabricatorManiphestConfigOptions.php b/src/applications/maniphest/config/PhabricatorManiphestConfigOptions.php
index aaaa4e79ff..6b03cae03c 100644
--- a/src/applications/maniphest/config/PhabricatorManiphestConfigOptions.php
+++ b/src/applications/maniphest/config/PhabricatorManiphestConfigOptions.php
@@ -218,9 +218,9 @@ EOTEXT
->setSummary(pht("Custom Maniphest fields."))
->setDescription(
pht(
- "Array of custom fields for Maniphest tasks. For details on ".
- "adding custom fields to Maniphest, see 'Maniphest User Guide: ".
- "Adding Custom Fields'."))
+ 'Array of custom fields for Maniphest tasks. For details on '.
+ 'adding custom fields to Maniphest, see "Configuring Custom '.
+ 'Fields" in the documentation.'))
->addExample(
'{"mycompany:estimated-hours": {"name": "Estimated Hours", '.
'"type": "int", "caption": "Estimated number of hours this will '.
diff --git a/src/applications/meta/application/PhabricatorApplicationApplications.php b/src/applications/meta/application/PhabricatorApplicationApplications.php
index 66c611406c..847e0f2c2b 100644
--- a/src/applications/meta/application/PhabricatorApplicationApplications.php
+++ b/src/applications/meta/application/PhabricatorApplicationApplications.php
@@ -11,7 +11,7 @@ final class PhabricatorApplicationApplications extends PhabricatorApplication {
}
public function getShortDescription() {
- return 'Installed Applications';
+ return pht('Explore More Applications');
}
public function getIconName() {
@@ -26,7 +26,7 @@ final class PhabricatorApplicationApplications extends PhabricatorApplication {
return self::GROUP_ADMIN;
}
- public function getRoutes() {
+ public function getRoutes() {
return array(
'/applications/' => array(
'(?:query/(?P[^/]+)/)?' =>
@@ -38,7 +38,6 @@ final class PhabricatorApplicationApplications extends PhabricatorApplication {
'(?P\w+)/(?Pinstall|uninstall)/' =>
'PhabricatorApplicationUninstallController',
),
-
);
}
diff --git a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
index b2cc713181..1dacee6761 100644
--- a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
@@ -1,10 +1,14 @@
application = $data['application'];
}
@@ -61,16 +65,37 @@ final class PhabricatorApplicationDetailViewController
$viewer = $this->getRequest()->getUser();
- $properties = id(new PHUIPropertyListView())
- ->addProperty(pht('Description'), $application->getShortDescription());
+ $properties = id(new PHUIPropertyListView());
$properties->setActionList($actions);
+ $properties->addProperty(
+ pht('Description'),
+ $application->getShortDescription());
+
+ if ($application->getFlavorText()) {
+ $properties->addProperty(
+ null,
+ phutil_tag('em', array(), $application->getFlavorText()));
+ }
+
if ($application->isBeta()) {
$properties->addProperty(
pht('Release'),
pht('Beta'));
}
+ $overview = $application->getOverview();
+ if ($overview) {
+ $properties->addSectionHeader(
+ pht('Overview'),
+ PHUIPropertyListView::ICON_SUMMARY);
+ $properties->addTextContent(
+ PhabricatorMarkupEngine::renderOneObject(
+ id(new PhabricatorMarkupOneOff())->setContent($overview),
+ 'default',
+ $viewer));
+ }
+
$descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
$viewer,
$application);
@@ -94,6 +119,14 @@ final class PhabricatorApplicationDetailViewController
->setUser($user)
->setObjectURI($this->getRequest()->getRequestURI());
+ if ($selected->getHelpURI()) {
+ $view->addAction(
+ id(new PhabricatorActionView())
+ ->setName(pht('Help / Documentation'))
+ ->setIcon('fa-life-ring')
+ ->setHref($selected->getHelpURI()));
+ }
+
$can_edit = PhabricatorPolicyFilter::hasCapability(
$user,
$selected,
diff --git a/src/applications/meta/controller/PhabricatorApplicationEditController.php b/src/applications/meta/controller/PhabricatorApplicationEditController.php
index aa4952205b..5d1ac1e185 100644
--- a/src/applications/meta/controller/PhabricatorApplicationEditController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationEditController.php
@@ -1,10 +1,14 @@
application = $data['application'];
}
diff --git a/src/applications/meta/controller/PhabricatorApplicationUninstallController.php b/src/applications/meta/controller/PhabricatorApplicationUninstallController.php
index 8445526a04..052ef30222 100644
--- a/src/applications/meta/controller/PhabricatorApplicationUninstallController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationUninstallController.php
@@ -6,6 +6,10 @@ final class PhabricatorApplicationUninstallController
private $application;
private $action;
+ public function shouldRequireAdmin() {
+ return true;
+ }
+
public function willProcessRequest(array $data) {
$this->application = $data['application'];
$this->action = $data['action'];
diff --git a/src/applications/meta/controller/PhabricatorApplicationsController.php b/src/applications/meta/controller/PhabricatorApplicationsController.php
index 69f5bd03dd..e5b035bab4 100644
--- a/src/applications/meta/controller/PhabricatorApplicationsController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationsController.php
@@ -2,10 +2,6 @@
abstract class PhabricatorApplicationsController extends PhabricatorController {
- public function shouldRequireAdmin() {
- return true;
- }
-
public function buildSideNavView($for_app = false) {
$user = $this->getRequest()->getUser();
diff --git a/src/applications/meta/controller/PhabricatorApplicationsListController.php b/src/applications/meta/controller/PhabricatorApplicationsListController.php
index 5815f7cff2..9bcb845768 100644
--- a/src/applications/meta/controller/PhabricatorApplicationsListController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationsListController.php
@@ -5,6 +5,10 @@ final class PhabricatorApplicationsListController
private $queryKey;
+ public function shouldAllowPublic() {
+ return true;
+ }
+
public function willProcessRequest(array $data) {
$this->queryKey = idx($data, 'queryKey');
}
diff --git a/src/applications/meta/query/PhabricatorAppSearchEngine.php b/src/applications/meta/query/PhabricatorAppSearchEngine.php
index a83a84e566..4f26a80859 100644
--- a/src/applications/meta/query/PhabricatorAppSearchEngine.php
+++ b/src/applications/meta/query/PhabricatorAppSearchEngine.php
@@ -25,6 +25,9 @@ final class PhabricatorAppSearchEngine
$saved->setParameter(
'firstParty',
$this->readBoolFromRequest($request, 'firstParty'));
+ $saved->setParameter(
+ 'launchable',
+ $this->readBoolFromRequest($request, 'launchable'));
return $saved;
}
@@ -54,6 +57,11 @@ final class PhabricatorAppSearchEngine
$query->withFirstParty($first_party);
}
+ $launchable = $saved->getParameter('launchable');
+ if ($launchable !== null) {
+ $query->withLaunchable($launchable);
+ }
+
return $query;
}
@@ -99,6 +107,17 @@ final class PhabricatorAppSearchEngine
'' => pht('Show All Applications'),
'true' => pht('Show First-Party Applications'),
'false' => pht('Show Third-Party Applications'),
+ )))
+ ->appendChild(
+ id(new AphrontFormSelectControl())
+ ->setLabel(pht('Launchable'))
+ ->setName('launchable')
+ ->setValue($this->getBoolFromQuery($saved, 'launchable'))
+ ->setOptions(
+ array(
+ '' => pht('Show All Applications'),
+ 'true' => pht('Show Launchable Applications'),
+ 'false' => pht('Show Non-Launchable Applications'),
)));
}
@@ -109,6 +128,7 @@ final class PhabricatorAppSearchEngine
public function getBuiltinQueryNames() {
$names = array(
+ 'launcher' => pht('Launcher'),
'all' => pht('All Applications'),
);
@@ -121,6 +141,10 @@ final class PhabricatorAppSearchEngine
$query->setQueryKey($query_key);
switch ($query_key) {
+ case 'launcher':
+ return $query
+ ->setParameter('installed', true)
+ ->setParameter('launchable', true);
case 'all':
return $query;
}
@@ -129,33 +153,93 @@ final class PhabricatorAppSearchEngine
}
protected function renderResultList(
- array $applications,
+ array $all_applications,
PhabricatorSavedQuery $query,
array $handle) {
- assert_instances_of($applications, 'PhabricatorApplication');
+ assert_instances_of($all_applications, 'PhabricatorApplication');
- $list = new PHUIObjectItemListView();
+ $all_applications = msort($all_applications, 'getName');
- $applications = msort($applications, 'getName');
-
- foreach ($applications as $application) {
- $item = id(new PHUIObjectItemView())
- ->setHeader($application->getName())
- ->setHref('/applications/view/'.get_class($application).'/')
- ->addAttribute($application->getShortDescription());
-
- if (!$application->isInstalled()) {
- $item->addIcon('delete', pht('Uninstalled'));
- }
-
- if ($application->isBeta()) {
- $item->addIcon('lint-warning', pht('Beta'));
- }
-
- $list->addItem($item);
+ if ($query->getQueryKey() == 'launcher') {
+ $groups = mgroup($all_applications, 'getApplicationGroup');
+ } else {
+ $groups = array($all_applications);
}
- return $list;
+ $group_names = PhabricatorApplication::getApplicationGroups();
+ $groups = array_select_keys($groups, array_keys($group_names)) + $groups;
+
+ $results = array();
+ foreach ($groups as $group => $applications) {
+ if (count($groups) > 1) {
+ $results[] = phutil_tag(
+ 'h1',
+ array(
+ 'class' => 'launcher-header',
+ ),
+ idx($group_names, $group, $group));
+ }
+
+ $list = new PHUIObjectItemListView();
+ $list->addClass('phui-object-item-launcher-list');
+
+ foreach ($applications as $application) {
+ $icon = $application->getIconName();
+ if (!$icon) {
+ $icon = 'application';
+ }
+
+ // TODO: This sheet doesn't work the same way other sheets do so it
+ // ends up with the wrong classes if we try to use PHUIIconView. This
+ // is probably all changing in the redesign anyway.
+
+ $icon_view = javelin_tag(
+ 'span',
+ array(
+ 'class' => 'phui-icon-view '.
+ 'sprite-apps-large apps-'.$icon.'-dark-large',
+ 'aural' => false,
+ ),
+ '');
+
+ $description = phutil_tag(
+ 'div',
+ array(
+ 'style' => 'white-space: nowrap; '.
+ 'overflow: hidden; '.
+ 'text-overflow: ellipsis;',
+ ),
+ $application->getShortDescription());
+
+ $item = id(new PHUIObjectItemView())
+ ->setHeader($application->getName())
+ ->setImageIcon($icon_view)
+ ->addAttribute($description)
+ ->addAction(
+ id(new PHUIListItemView())
+ ->setName(pht('Help/Options'))
+ ->setIcon('fa-cog')
+ ->setHref('/applications/view/'.get_class($application).'/'));
+
+ if ($application->getBaseURI()) {
+ $item->setHref($application->getBaseURI());
+ }
+
+ if (!$application->isInstalled()) {
+ $item->addIcon('delete', pht('Uninstalled'));
+ }
+
+ if ($application->isBeta()) {
+ $item->addIcon('fa-star-half-o grey', pht('Beta'));
+ }
+
+ $list->addItem($item);
+ }
+
+ $results[] = $list;
+ }
+
+ return $results;
}
}
diff --git a/src/applications/meta/query/PhabricatorApplicationQuery.php b/src/applications/meta/query/PhabricatorApplicationQuery.php
index ca14d6954a..366a29d422 100644
--- a/src/applications/meta/query/PhabricatorApplicationQuery.php
+++ b/src/applications/meta/query/PhabricatorApplicationQuery.php
@@ -9,6 +9,7 @@ final class PhabricatorApplicationQuery
private $nameContains;
private $unlisted;
private $classes;
+ private $launchable;
private $phids;
const ORDER_APPLICATION = 'order:application';
@@ -41,6 +42,11 @@ final class PhabricatorApplicationQuery
return $this;
}
+ public function withLaunchable($launchable) {
+ $this->launchable = $launchable;
+ return $this;
+ }
+
public function withClasses(array $classes) {
$this->classes = $classes;
return $this;
@@ -117,6 +123,15 @@ final class PhabricatorApplicationQuery
}
}
+ if ($this->launchable !== null) {
+ foreach ($apps as $key => $app) {
+ if ($app->shouldAppearInLaunchView() != $this->launchable) {
+ unset($apps[$key]);
+ }
+ }
+ }
+
+
switch ($this->order) {
case self::ORDER_NAME:
$apps = msort($apps, 'getName');
diff --git a/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php b/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php
index 844eca2ec0..70605eb1a1 100644
--- a/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php
+++ b/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php
@@ -2,14 +2,14 @@
final class PhabricatorApplicationMetaMTA extends PhabricatorApplication {
- public function getBaseURI() {
- return '/mail/';
- }
-
public function getIconName() {
return 'metamta';
}
+ public function getShortDescription() {
+ return pht('Delivers Mail');
+ }
+
public function getFlavorText() {
return pht('Yo dawg, we heard you like MTAs.');
}
diff --git a/src/applications/notification/application/PhabricatorApplicationNotifications.php b/src/applications/notification/application/PhabricatorApplicationNotifications.php
index a4925c107d..1de16b76cd 100644
--- a/src/applications/notification/application/PhabricatorApplicationNotifications.php
+++ b/src/applications/notification/application/PhabricatorApplicationNotifications.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationNotifications extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Beep Beep Bloop');
+ return pht('Real-Time Updates and Alerts');
}
public function getRoutes() {
diff --git a/src/applications/nuance/application/PhabricatorApplicationNuance.php b/src/applications/nuance/application/PhabricatorApplicationNuance.php
index ac962b1982..5bf137b814 100644
--- a/src/applications/nuance/application/PhabricatorApplicationNuance.php
+++ b/src/applications/nuance/application/PhabricatorApplicationNuance.php
@@ -27,6 +27,10 @@ final class PhabricatorApplicationNuance extends PhabricatorApplication {
return '/nuance/';
}
+ public function getShortDescription() {
+ return pht('High-Volume Task Queues');
+ }
+
public function getRoutes() {
return array(
'/nuance/' => array(
diff --git a/src/applications/oauthserver/application/PhabricatorApplicationOAuthServer.php b/src/applications/oauthserver/application/PhabricatorApplicationOAuthServer.php
index 8510f8c5f6..399367436f 100644
--- a/src/applications/oauthserver/application/PhabricatorApplicationOAuthServer.php
+++ b/src/applications/oauthserver/application/PhabricatorApplicationOAuthServer.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationOAuthServer extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('OAuth Provider');
+ return pht('OAuth Login Provider');
}
public function getIconName() {
@@ -23,13 +23,17 @@ final class PhabricatorApplicationOAuthServer extends PhabricatorApplication {
}
public function getApplicationGroup() {
- return self::GROUP_UTILITIES;
+ return self::GROUP_ADMIN;
}
public function isBeta() {
return true;
}
+ public function getHelpURI() {
+ return PhabricatorEnv::getDoclink('Using the Phabricator OAuth Server');
+ }
+
public function getRoutes() {
return array(
'/oauthserver/' => array(
diff --git a/src/applications/owners/application/PhabricatorApplicationOwners.php b/src/applications/owners/application/PhabricatorApplicationOwners.php
index ed80bf0b45..6412772236 100644
--- a/src/applications/owners/application/PhabricatorApplicationOwners.php
+++ b/src/applications/owners/application/PhabricatorApplicationOwners.php
@@ -11,7 +11,7 @@ final class PhabricatorApplicationOwners extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Group Source Code');
+ return pht('Track Ownership of Source Code');
}
public function getTitleGlyph() {
@@ -27,7 +27,7 @@ final class PhabricatorApplicationOwners extends PhabricatorApplication {
}
public function getApplicationGroup() {
- return self::GROUP_ORGANIZATION;
+ return self::GROUP_UTILITIES;
}
public function getRoutes() {
diff --git a/src/applications/passphrase/application/PhabricatorApplicationPassphrase.php b/src/applications/passphrase/application/PhabricatorApplicationPassphrase.php
index 2632106044..dedeb505b8 100644
--- a/src/applications/passphrase/application/PhabricatorApplicationPassphrase.php
+++ b/src/applications/passphrase/application/PhabricatorApplicationPassphrase.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationPassphrase extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Credential Management');
+ return pht('Store Passwords and Credentials');
}
public function getIconName() {
diff --git a/src/applications/passphrase/controller/PassphraseCredentialEditController.php b/src/applications/passphrase/controller/PassphraseCredentialEditController.php
index 063e8eca26..b8126cf476 100644
--- a/src/applications/passphrase/controller/PassphraseCredentialEditController.php
+++ b/src/applications/passphrase/controller/PassphraseCredentialEditController.php
@@ -26,23 +26,18 @@ final class PassphraseCredentialEditController extends PassphraseController {
return new Aphront404Response();
}
- $type = PassphraseCredentialType::getTypeByConstant(
- $credential->getCredentialType());
- if (!$type) {
- throw new Exception(pht('Credential has invalid type "%s"!', $type));
- }
-
- if (!$type->isCreateable()) {
- throw new Exception(
- pht('Credential has noncreateable type "%s"!', $type));
- }
+ $type = $this->getCredentialType($credential->getCredentialType());
$is_new = false;
} else {
$type_const = $request->getStr('type');
- $type = PassphraseCredentialType::getTypeByConstant($type_const);
- if (!$type) {
- return new Aphront404Response();
+ $type = $this->getCredentialType($type_const);
+
+ if (!$type->isCreateable()) {
+ throw new Exception(
+ pht(
+ 'Credential has noncreateable type "%s"!',
+ $credential->getCredentialType()));
}
$credential = PassphraseCredential::initializeNewCredential($viewer)
@@ -358,4 +353,15 @@ final class PassphraseCredentialEditController extends PassphraseController {
));
}
+ private function getCredentialType($type_const) {
+ $type = PassphraseCredentialType::getTypeByConstant($type_const);
+
+ if (!$type) {
+ throw new Exception(
+ pht('Credential has invalid type "%s"!', $type_const));
+ }
+
+ return $type;
+ }
+
}
diff --git a/src/applications/paste/application/PhabricatorApplicationPaste.php b/src/applications/paste/application/PhabricatorApplicationPaste.php
index 0e99441e5d..5ba1f211fc 100644
--- a/src/applications/paste/application/PhabricatorApplicationPaste.php
+++ b/src/applications/paste/application/PhabricatorApplicationPaste.php
@@ -18,6 +18,10 @@ final class PhabricatorApplicationPaste extends PhabricatorApplication {
return self::GROUP_UTILITIES;
}
+ public function getShortDescription() {
+ return pht('Share Text Snippets');
+ }
+
public function getRemarkupRules() {
return array(
new PhabricatorPasteRemarkupRule(),
diff --git a/src/applications/people/application/PhabricatorApplicationPeople.php b/src/applications/people/application/PhabricatorApplicationPeople.php
index 2b89dc4d2c..d387b0f882 100644
--- a/src/applications/people/application/PhabricatorApplicationPeople.php
+++ b/src/applications/people/application/PhabricatorApplicationPeople.php
@@ -3,7 +3,7 @@
final class PhabricatorApplicationPeople extends PhabricatorApplication {
public function getShortDescription() {
- return pht('User Accounts');
+ return pht('User Accounts and Profiles');
}
public function getBaseURI() {
diff --git a/src/applications/phlux/application/PhabricatorApplicationPhlux.php b/src/applications/phlux/application/PhabricatorApplicationPhlux.php
index 85c1699cb3..c6e42598cc 100644
--- a/src/applications/phlux/application/PhabricatorApplicationPhlux.php
+++ b/src/applications/phlux/application/PhabricatorApplicationPhlux.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationPhlux extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Configuration Store');
+ return pht('Key/Value Configuration Store');
}
public function getIconName() {
diff --git a/src/applications/pholio/application/PhabricatorApplicationPholio.php b/src/applications/pholio/application/PhabricatorApplicationPholio.php
index 96f113cba3..500ee5098b 100644
--- a/src/applications/pholio/application/PhabricatorApplicationPholio.php
+++ b/src/applications/pholio/application/PhabricatorApplicationPholio.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationPholio extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Design Review');
+ return pht('Review Mocks and Design');
}
public function getIconName() {
diff --git a/src/applications/phortune/application/PhabricatorApplicationPhortune.php b/src/applications/phortune/application/PhabricatorApplicationPhortune.php
index fe08ef4487..ab22fbde88 100644
--- a/src/applications/phortune/application/PhabricatorApplicationPhortune.php
+++ b/src/applications/phortune/application/PhabricatorApplicationPhortune.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationPhortune extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Account and Billing');
+ return pht('Accounts and Billing');
}
public function getIconName() {
diff --git a/src/applications/phrequent/application/PhabricatorApplicationPhrequent.php b/src/applications/phrequent/application/PhabricatorApplicationPhrequent.php
index 35f2dd9fd9..4bcccef60d 100644
--- a/src/applications/phrequent/application/PhabricatorApplicationPhrequent.php
+++ b/src/applications/phrequent/application/PhabricatorApplicationPhrequent.php
@@ -3,7 +3,7 @@
final class PhabricatorApplicationPhrequent extends PhabricatorApplication {
public function getShortDescription() {
- return pht('Track Time');
+ return pht('Track Time Spent');
}
public function getBaseURI() {
@@ -19,7 +19,7 @@ final class PhabricatorApplicationPhrequent extends PhabricatorApplication {
}
public function getApplicationGroup() {
- return self::GROUP_ORGANIZATION;
+ return self::GROUP_UTILITIES;
}
public function getApplicationOrder() {
diff --git a/src/applications/phrequent/storage/PhrequentTimeBlock.php b/src/applications/phrequent/storage/PhrequentTimeBlock.php
index 60721e45ca..45b3555fd2 100644
--- a/src/applications/phrequent/storage/PhrequentTimeBlock.php
+++ b/src/applications/phrequent/storage/PhrequentTimeBlock.php
@@ -23,6 +23,11 @@ final class PhrequentTimeBlock extends Phobject {
public function getObjectTimeRanges($now) {
$ranges = array();
+ $range_start = time();
+ foreach ($this->events as $event) {
+ $range_start = min($range_start, $event->getDateStarted());
+ }
+
$object_ranges = array();
foreach ($this->events as $event) {
diff --git a/src/applications/policy/__tests__/PhabricatorPolicyDataTestCase.php b/src/applications/policy/__tests__/PhabricatorPolicyDataTestCase.php
index 89b303b0d9..e0f66c1569 100644
--- a/src/applications/policy/__tests__/PhabricatorPolicyDataTestCase.php
+++ b/src/applications/policy/__tests__/PhabricatorPolicyDataTestCase.php
@@ -14,10 +14,12 @@ final class PhabricatorPolicyDataTestCase extends PhabricatorTestCase {
$proj_a = id(new PhabricatorProject())
->setName('A')
->setAuthorPHID($author->getPHID())
+ ->setIcon('fa-briefcase')
->save();
$proj_b = id(new PhabricatorProject())
->setName('B')
->setAuthorPHID($author->getPHID())
+ ->setIcon('fa-briefcase')
->save();
$proj_a->setViewPolicy($proj_b->getPHID())->save();
diff --git a/src/applications/ponder/application/PhabricatorApplicationPonder.php b/src/applications/ponder/application/PhabricatorApplicationPonder.php
index 220750b558..0821533460 100644
--- a/src/applications/ponder/application/PhabricatorApplicationPonder.php
+++ b/src/applications/ponder/application/PhabricatorApplicationPonder.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationPonder extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Find Answers');
+ return pht('Questions and Answers');
}
public function getIconName() {
diff --git a/src/applications/project/application/PhabricatorApplicationProject.php b/src/applications/project/application/PhabricatorApplicationProject.php
index 22e016c285..60c13fb62e 100644
--- a/src/applications/project/application/PhabricatorApplicationProject.php
+++ b/src/applications/project/application/PhabricatorApplicationProject.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationProject extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Organize Work');
+ return pht('Create Groups, Tags, and Projects');
}
public function getBaseURI() {
diff --git a/src/applications/project/editor/PhabricatorProjectTransactionEditor.php b/src/applications/project/editor/PhabricatorProjectTransactionEditor.php
index 27b0c4a13d..a1312bac20 100644
--- a/src/applications/project/editor/PhabricatorProjectTransactionEditor.php
+++ b/src/applications/project/editor/PhabricatorProjectTransactionEditor.php
@@ -305,8 +305,15 @@ final class PhabricatorProjectTransactionEditor
$slug_xaction = last($xactions);
$new = $slug_xaction->getNewValue();
- $slugs_used_already = id(new PhabricatorProjectSlug())
- ->loadAllWhere('slug IN (%Ls)', $new);
+
+ if ($new) {
+ $slugs_used_already = id(new PhabricatorProjectSlug())
+ ->loadAllWhere('slug IN (%Ls)', $new);
+ } else {
+ // The project doesn't have any extra slugs.
+ $slugs_used_already = array();
+ }
+
$slugs_used_already = mgroup($slugs_used_already, 'getProjectPHID');
foreach ($slugs_used_already as $project_phid => $used_slugs) {
$used_slug_strs = mpull($used_slugs, 'getSlug');
diff --git a/src/applications/releeph/application/PhabricatorApplicationReleeph.php b/src/applications/releeph/application/PhabricatorApplicationReleeph.php
index 3876470ff5..79f7a24961 100644
--- a/src/applications/releeph/application/PhabricatorApplicationReleeph.php
+++ b/src/applications/releeph/application/PhabricatorApplicationReleeph.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationReleeph extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Release Branches');
+ return pht('Pull Requests');
}
public function getBaseURI() {
diff --git a/src/applications/repository/application/PhabricatorApplicationRepositories.php b/src/applications/repository/application/PhabricatorApplicationRepositories.php
index 0afce533b4..e2caea3527 100644
--- a/src/applications/repository/application/PhabricatorApplicationRepositories.php
+++ b/src/applications/repository/application/PhabricatorApplicationRepositories.php
@@ -14,7 +14,7 @@ final class PhabricatorApplicationRepositories extends PhabricatorApplication {
}
public function getShortDescription() {
- return 'Track Repositories';
+ return pht('(Deprecated)');
}
public function getTitleGlyph() {
diff --git a/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php b/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php
index e935740743..5ce19f875f 100644
--- a/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php
+++ b/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php
@@ -384,7 +384,7 @@ final class PhabricatorRepositoryPullEngine
// This behavior has been reverted, but users who updated between Feb 1,
// 2012 and Mar 1, 2012 will have the erroring version. Do a dumb test
// against stdout to check for this possibility.
- // See: https://github.com/facebook/phabricator/issues/101/
+ // See: https://github.com/phacility/phabricator/issues/101/
// NOTE: Mercurial has translated versions, which translate this error
// string. In a translated version, the string will be something else,
diff --git a/src/applications/repository/management/PhabricatorRepositoryManagementParentsWorkflow.php b/src/applications/repository/management/PhabricatorRepositoryManagementParentsWorkflow.php
index fd49df59a0..86fb07c7bf 100644
--- a/src/applications/repository/management/PhabricatorRepositoryManagementParentsWorkflow.php
+++ b/src/applications/repository/management/PhabricatorRepositoryManagementParentsWorkflow.php
@@ -58,6 +58,10 @@ final class PhabricatorRepositoryManagementParentsWorkflow
$graph = array();
foreach ($refs as $ref) {
+ if (!$repo->shouldTrackBranch($ref->getRefName())) {
+ continue;
+ }
+
$console->writeOut(
"%s\n",
pht('Rebuilding branch "%s"...', $ref->getRefName()));
diff --git a/src/applications/search/application/PhabricatorApplicationSearch.php b/src/applications/search/application/PhabricatorApplicationSearch.php
index eb2199947b..c1b73f7446 100644
--- a/src/applications/search/application/PhabricatorApplicationSearch.php
+++ b/src/applications/search/application/PhabricatorApplicationSearch.php
@@ -11,7 +11,7 @@ final class PhabricatorApplicationSearch extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Search & Find');
+ return pht('Full-Text Search');
}
public function getFlavorText() {
diff --git a/src/applications/search/engine/PhabricatorSearchEngineElastic.php b/src/applications/search/engine/PhabricatorSearchEngineElastic.php
index 120460a6c0..82e03cf350 100644
--- a/src/applications/search/engine/PhabricatorSearchEngineElastic.php
+++ b/src/applications/search/engine/PhabricatorSearchEngineElastic.php
@@ -97,7 +97,7 @@ final class PhabricatorSearchEngineElastic extends PhabricatorSearchEngine {
if (strlen($query->getParameter('query'))) {
$spec[] = array(
- 'field' => array(
+ 'term' => array(
'field.corpus' => $query->getParameter('query'),
),
);
diff --git a/src/applications/settings/application/PhabricatorApplicationSettings.php b/src/applications/settings/application/PhabricatorApplicationSettings.php
index 65ad9505ad..a4028f6b9a 100644
--- a/src/applications/settings/application/PhabricatorApplicationSettings.php
+++ b/src/applications/settings/application/PhabricatorApplicationSettings.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationSettings extends PhabricatorApplication {
}
public function getShortDescription() {
- return 'User Preferences';
+ return pht('User Preferences');
}
public function getIconName() {
@@ -18,6 +18,10 @@ final class PhabricatorApplicationSettings extends PhabricatorApplication {
return false;
}
+ public function shouldAppearInLaunchView() {
+ return false;
+ }
+
public function getRoutes() {
return array(
'/settings/' => array(
diff --git a/src/applications/tokens/application/PhabricatorApplicationTokens.php b/src/applications/tokens/application/PhabricatorApplicationTokens.php
index 39d665e7b4..dd1a77d2d0 100644
--- a/src/applications/tokens/application/PhabricatorApplicationTokens.php
+++ b/src/applications/tokens/application/PhabricatorApplicationTokens.php
@@ -19,7 +19,7 @@ final class PhabricatorApplicationTokens extends PhabricatorApplication {
}
public function getShortDescription() {
- return pht('Acquire Trinkets');
+ return pht('Award and Acquire Trinkets');
}
public function getApplicationGroup() {
diff --git a/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php b/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php
index e74c1138ad..e7774432a2 100644
--- a/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php
+++ b/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php
@@ -7,7 +7,7 @@ final class PhabricatorApplicationUIExamples extends PhabricatorApplication {
}
public function getShortDescription() {
- return 'Developer UI Examples';
+ return pht('Phabricator Developer UI Examples');
}
public function getIconName() {
diff --git a/src/docs/user/feedback.diviner b/src/docs/user/feedback.diviner
index 216482030d..bfb395be2b 100644
--- a/src/docs/user/feedback.diviner
+++ b/src/docs/user/feedback.diviner
@@ -39,7 +39,7 @@ requests, general questions, or random feedback this way, too.
= GitHub Issues =
You can also use
-[[https://github.com/facebook/phabricator/issues/new | GitHub Issues]] if you
+[[https://github.com/phacility/phabricator/issues/new | GitHub Issues]] if you
prefer.
= IRC =
diff --git a/src/docs/user/installation_guide.diviner b/src/docs/user/installation_guide.diviner
index ece216513b..b829c5aa1f 100644
--- a/src/docs/user/installation_guide.diviner
+++ b/src/docs/user/installation_guide.diviner
@@ -95,9 +95,9 @@ Now that you have all that stuff installed, grab Phabricator and its
dependencies:
$ cd somewhere/ # pick some install directory
- somewhere/ $ git clone git://github.com/facebook/libphutil.git
- somewhere/ $ git clone git://github.com/facebook/arcanist.git
- somewhere/ $ git clone git://github.com/facebook/phabricator.git
+ somewhere/ $ git clone git://github.com/phacility/libphutil.git
+ somewhere/ $ git clone git://github.com/phacility/arcanist.git
+ somewhere/ $ git clone git://github.com/phacility/phabricator.git
= Installing APC (Optional) =
diff --git a/src/docs/user/userguide/arcanist.diviner b/src/docs/user/userguide/arcanist.diviner
index 7f5d449526..5211e173d8 100644
--- a/src/docs/user/userguide/arcanist.diviner
+++ b/src/docs/user/userguide/arcanist.diviner
@@ -92,8 +92,8 @@ have PHP installed, you can download it from .
To install Arcanist, pick an install directory and clone the code from GitHub:
- some_install_path/ $ git clone git://github.com/facebook/libphutil.git
- some_install_path/ $ git clone git://github.com/facebook/arcanist.git
+ some_install_path/ $ git clone git://github.com/phacility/libphutil.git
+ some_install_path/ $ git clone git://github.com/phacility/arcanist.git
This should leave you with a directory structure like this
@@ -162,7 +162,7 @@ several sources:
The first place where the setting is defined wins.
-Existing settings can be printed with `arc set-config --show`.
+Existing settings can be printed with `arc get-config`.
== Next Steps ==
diff --git a/src/docs/user/userguide/arcanist_new_project.diviner b/src/docs/user/userguide/arcanist_new_project.diviner
index c8f9389572..c29a53dfb4 100644
--- a/src/docs/user/userguide/arcanist_new_project.diviner
+++ b/src/docs/user/userguide/arcanist_new_project.diviner
@@ -74,7 +74,7 @@ These options are supported, but their use is discouraged:
solution to certificate validity problems, and is discouraged. Instead,
use valid certificates.
-For a complete list of options, run `arc set-config --show`. Although all
+For a complete list of options, run `arc get-config`. Although all
options can be set in `.arcconfig`, some options (like `editor`) usually do not
make sense to set here because they're likely to vary from user to user.
diff --git a/src/docs/user/userguide/arcanist_quick_start.diviner b/src/docs/user/userguide/arcanist_quick_start.diviner
index 141416d301..3d4407f42a 100644
--- a/src/docs/user/userguide/arcanist_quick_start.diviner
+++ b/src/docs/user/userguide/arcanist_quick_start.diviner
@@ -23,8 +23,8 @@ Then install Arcanist itself:
$ mkdir somewhere/
$ cd somewhere/
- somewhere/ $ git clone git://github.com/facebook/libphutil.git
- somewhere/ $ git clone git://github.com/facebook/arcanist.git
+ somewhere/ $ git clone git://github.com/phacility/libphutil.git
+ somewhere/ $ git clone git://github.com/phacility/arcanist.git
Add `arc` to your path:
diff --git a/src/view/phui/PHUIFeedStoryView.php b/src/view/phui/PHUIFeedStoryView.php
index c1b4df9cb2..5fc8745474 100644
--- a/src/view/phui/PHUIFeedStoryView.php
+++ b/src/view/phui/PHUIFeedStoryView.php
@@ -142,7 +142,6 @@ final class PHUIFeedStoryView extends AphrontView {
require_celerity_resource('phui-feed-story-css');
Javelin::initBehavior('phabricator-hovercards');
- $oneline = !$this->hasChildren();
$body = null;
$foot = null;
@@ -186,18 +185,6 @@ final class PHUIFeedStoryView extends AphrontView {
$icon->setSpriteSheet(PHUIIconView::SPRITE_APPS);
}
- $ol_foot = null;
- if ($oneline) {
- $ol_foot = phutil_tag(
- 'div',
- array(
- 'class' => 'phui-feed-story-oneline-foot'
- ),
- array(
- $icon,
- $foot));
- }
-
$action_list = array();
$icons = null;
foreach ($this->actions as $action) {
@@ -223,10 +210,9 @@ final class PHUIFeedStoryView extends AphrontView {
'class' => 'phui-feed-story-head',
),
array(
- (!$oneline ? $actor : null),
+ $actor,
nonempty($this->title, pht('Untitled Story')),
$icons,
- $ol_foot
));
if (!empty($this->tokenBar)) {
@@ -249,23 +235,16 @@ final class PHUIFeedStoryView extends AphrontView {
$body_content);
}
- if ($oneline) {
- $foot = null;
- } else {
- $foot = phutil_tag(
- 'div',
- array(
- 'class' => 'phui-feed-story-foot',
- ),
- array(
- $icon,
- $foot));
- }
+ $foot = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'phui-feed-story-foot',
+ ),
+ array(
+ $icon,
+ $foot));
$classes = array('phui-feed-story');
- if ($oneline) {
- $classes[] = 'phui-feed-story-oneline';
- }
return id(new PHUIBoxView())
->addClass(implode(' ', $classes))
@@ -282,6 +261,15 @@ final class PHUIFeedStoryView extends AphrontView {
case PhabricatorMacroPHIDTypeMacro::TYPECONST:
$this->setAppIcon("macro-dark");
break;
+ case ManiphestPHIDTypeTask::TYPECONST:
+ $this->setAppIcon('maniphest-dark');
+ break;
+ case DifferentialPHIDTypeRevision::TYPECONST:
+ $this->setAppIcon('differential-dark');
+ break;
+ case PhabricatorCalendarPHIDTypeEvent::TYPECONST:
+ $this->setAppIcon('calendar-dark');
+ break;
}
}
}
diff --git a/src/view/phui/PHUIObjectItemView.php b/src/view/phui/PHUIObjectItemView.php
index f888207454..80592fe5f9 100644
--- a/src/view/phui/PHUIObjectItemView.php
+++ b/src/view/phui/PHUIObjectItemView.php
@@ -21,6 +21,7 @@ final class PHUIObjectItemView extends AphrontTagView {
private $imageURI;
private $state;
private $fontIcon;
+ private $imageIcon;
const AGE_FRESH = 'fresh';
const AGE_STALE = 'stale';
@@ -115,6 +116,15 @@ final class PHUIObjectItemView extends AphrontTagView {
return $this->imageURI;
}
+ public function setImageIcon($image_icon) {
+ $this->imageIcon = $image_icon;
+ return $this;
+ }
+
+ public function getImageIcon() {
+ return $this->imageIcon;
+ }
+
public function setState($state) {
$this->state = $state;
switch ($state) {
@@ -288,6 +298,10 @@ final class PHUIObjectItemView extends AphrontTagView {
$item_classes[] = 'phui-object-item-with-image';
}
+ if ($this->getImageIcon()) {
+ $item_classes[] = 'phui-object-item-with-image-icon';
+ }
+
if ($this->fontIcon) {
$item_classes[] = 'phui-object-item-with-ficon';
}
@@ -520,6 +534,22 @@ final class PHUIObjectItemView extends AphrontTagView {
'style' => 'background-image: url('.$this->getImageURI().')',
),
'');
+ } else if ($this->getImageIcon()) {
+ $image = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'phui-object-item-image-icon',
+ ),
+ $this->getImageIcon());
+ }
+
+ if ($image && $this->href) {
+ $image = phutil_tag(
+ 'a',
+ array(
+ 'href' => $this->href,
+ ),
+ $image);
}
$ficon = null;
diff --git a/support/aphlict/client/build_aphlict_client.sh b/support/aphlict/client/build_aphlict_client.sh
index b328873d19..0d2e4ae122 100755
--- a/support/aphlict/client/build_aphlict_client.sh
+++ b/support/aphlict/client/build_aphlict_client.sh
@@ -9,20 +9,12 @@ if [ -z "$MXMLC" ]; then
fi;
set -e
-set -x
-# cp -R $ROOT/externals/vegas/src $BASEDIR/src/vegas
-
-(cd $BASEDIR && $MXMLC \
- -output aphlict.swf \
+$MXMLC \
+ -output=$ROOT/webroot/rsrc/swf/aphlict.swf \
-default-background-color=0x444444 \
-default-size=500,500 \
-warnings=true \
- -debug=true \
-source-path=$ROOT/externals/vegas/src \
-static-link-runtime-shared-libraries=true \
- src/Aphlict.as)
-
-mv $BASEDIR/aphlict.swf $ROOT/webroot/rsrc/swf/aphlict.swf
-
-# -target-player=10.2.0 \
+ $BASEDIR/src/AphlictClient.as
diff --git a/support/aphlict/client/src/Aphlict.as b/support/aphlict/client/src/Aphlict.as
index 14eb9548db..d61ad04b0a 100644
--- a/support/aphlict/client/src/Aphlict.as
+++ b/support/aphlict/client/src/Aphlict.as
@@ -1,117 +1,38 @@
package {
- import flash.net.*;
- import flash.utils.*;
- import flash.media.*;
- import flash.display.*;
- import flash.events.*;
+ import flash.display.Sprite;
import flash.external.ExternalInterface;
+ import flash.net.LocalConnection;
- import vegas.strings.JSON;
public class Aphlict extends Sprite {
- private var client:String;
+ /**
+ * A transport channel used to receive data.
+ */
+ protected var recv:LocalConnection;
- private var socket:Socket;
- private var readBuffer:ByteArray;
+ /**
+ * A transport channel used to send data.
+ */
+ protected var send:LocalConnection;
- private var remoteServer:String;
- private var remotePort:Number;
public function Aphlict() {
super();
- ExternalInterface.addCallback('connect', this.externalConnect);
- ExternalInterface.call(
- 'JX.Stratcom.invoke',
- 'aphlict-component-ready',
- null,
- {});
+ this.recv = new LocalConnection();
+ this.recv.client = this;
+
+ this.send = new LocalConnection();
}
- public function externalConnect(server:String, port:Number):void {
- this.externalInvoke('connect');
-
- this.remoteServer = server;
- this.remotePort = port;
-
- this.connectToServer();
- }
-
-
- public function connectToServer():void {
- var socket:Socket = new Socket();
-
- socket.addEventListener(Event.CONNECT, didConnectSocket);
- socket.addEventListener(Event.CLOSE, didCloseSocket);
- socket.addEventListener(ProgressEvent.SOCKET_DATA, didReceiveSocket);
-
- socket.addEventListener(IOErrorEvent.IO_ERROR, didIOErrorSocket);
- socket.addEventListener(
- SecurityErrorEvent.SECURITY_ERROR,
- didSecurityErrorSocket);
-
- socket.connect(this.remoteServer, this.remotePort);
-
- this.readBuffer = new ByteArray();
- this.socket = socket;
- }
-
- private function didConnectSocket(event:Event):void {
- this.externalInvoke('connected');
- }
-
- private function didCloseSocket(event:Event):void {
- this.externalInvoke('close');
- }
-
- private function didIOErrorSocket(event:IOErrorEvent):void {
- this.externalInvoke('error', event.text);
- }
-
- private function didSecurityErrorSocket(event:SecurityErrorEvent):void {
- this.externalInvoke('error', event.text);
- }
-
- private function didReceiveSocket(event:Event):void {
- var b:ByteArray = this.readBuffer;
- this.socket.readBytes(b, b.length);
-
- do {
- b = this.readBuffer;
- b.position = 0;
-
- if (b.length <= 8) {
- break;
- }
-
- var msg_len:Number = parseInt(b.readUTFBytes(8), 10);
- if (b.length >= msg_len + 8) {
- var bytes:String = b.readUTFBytes(msg_len);
- var data:Object = vegas.strings.JSON.deserialize(bytes);
- var t:ByteArray = new ByteArray();
- t.writeBytes(b, msg_len + 8);
- this.readBuffer = t;
-
- this.receiveMessage(data);
- } else {
- break;
- }
- } while (true);
-
- }
-
- public function receiveMessage(msg:Object):void {
- this.externalInvoke('receive', msg);
- }
-
- public function externalInvoke(type:String, object:Object = null):void {
+ protected function externalInvoke(type:String, object:Object = null):void {
ExternalInterface.call('JX.Aphlict.didReceiveEvent', type, object);
}
- public function log(message:String):void {
- ExternalInterface.call('console.log', message);
+ protected function log(message:String):void {
+ this.externalInvoke('log', message);
}
}
diff --git a/support/aphlict/client/src/AphlictClient.as b/support/aphlict/client/src/AphlictClient.as
new file mode 100644
index 0000000000..31105c67d1
--- /dev/null
+++ b/support/aphlict/client/src/AphlictClient.as
@@ -0,0 +1,129 @@
+package {
+
+ import flash.events.TimerEvent;
+ import flash.external.ExternalInterface;
+ import flash.utils.Timer;
+
+
+ public class AphlictClient extends Aphlict {
+
+ /**
+ * The connection name for this client. This will be used for the
+ * @{class:LocalConnection} object.
+ */
+ private var client:String;
+
+ /**
+ * The expiry timestamp for the @{class:AphlictMaster}. If this time is
+ * elapsed then the master will be assumed to be dead and another
+ * @{class:AphlictClient} will create a master.
+ */
+ private var expiry:Number = 0;
+
+ /**
+ * The interval at which to ping the @{class:AphlictMaster}.
+ */
+ public static const INTERVAL:Number = 3000;
+
+ private var master:AphlictMaster;
+ private var timer:Timer;
+
+ private var remoteServer:String;
+ private var remotePort:Number;
+
+
+ public function AphlictClient() {
+ super();
+
+ ExternalInterface.addCallback('connect', this.externalConnect);
+ ExternalInterface.call(
+ 'JX.Stratcom.invoke',
+ 'aphlict-component-ready',
+ null,
+ {});
+ }
+
+ public function externalConnect(server:String, port:Number):void {
+ this.externalInvoke('connect');
+
+ this.remoteServer = server;
+ this.remotePort = port;
+
+ this.client = AphlictClient.generateClientId();
+ this.recv.connect(this.client);
+
+ this.timer = new Timer(AphlictClient.INTERVAL);
+ this.timer.addEventListener(TimerEvent.TIMER, this.keepalive);
+
+ this.connectToMaster();
+ }
+
+ /**
+ * Generate a unique identifier that will be used to communicate with the
+ * @{class:AphlictMaster}.
+ */
+ private static function generateClientId():String {
+ return 'aphlict_client_' + Math.round(Math.random() * 100000);
+ }
+
+ /**
+ * Create a new connection to the @{class:AphlictMaster}.
+ *
+ * If there is no current @{class:AphlictMaster} instance, then a new master
+ * will be created.
+ */
+ private function connectToMaster():void {
+ this.timer.stop();
+
+ // Try to become the master.
+ try {
+ this.log('Attempting to become the master...');
+ this.master = new AphlictMaster(this.remoteServer, this.remotePort);
+ this.log('I am the master.');
+ } catch (x:Error) {
+ // Couldn't become the master
+ this.log('Cannot become the master... probably one already exists');
+ }
+
+ this.send.send('aphlict_master', 'register', this.client);
+ this.expiry = new Date().getTime() + (5 * AphlictClient.INTERVAL);
+ this.log('Registered client ' + this.client);
+
+ this.timer.start();
+ }
+
+ /**
+ * Send a keepalive signal to the @{class:AphlictMaster}.
+ *
+ * If the connection to the master has expired (because the master has not
+ * sent a heartbeat signal), then a new connection to master will be
+ * created.
+ */
+ private function keepalive(event:TimerEvent):void {
+ if (new Date().getTime() > this.expiry) {
+ this.connectToMaster();
+ }
+
+ this.send.send('aphlict_master', 'ping', this.client);
+ }
+
+ /**
+ * This function is used to receive the heartbeat signal from the
+ * @{class:AphlictMaster}.
+ */
+ public function pong():void {
+ this.expiry = new Date().getTime() + (2 * AphlictClient.INTERVAL);
+ }
+
+ /**
+ * Receive a message from the Aphlict Server, via the
+ * @{class:AphlictMaster}.
+ */
+ public function receiveMessage(msg:Object):void {
+ this.log('Received message.');
+ this.externalInvoke('receive', msg);
+ }
+
+ }
+
+}
diff --git a/support/aphlict/client/src/AphlictMaster.as b/support/aphlict/client/src/AphlictMaster.as
new file mode 100644
index 0000000000..1991ab48bd
--- /dev/null
+++ b/support/aphlict/client/src/AphlictMaster.as
@@ -0,0 +1,166 @@
+package {
+
+ import flash.events.Event;
+ import flash.events.IOErrorEvent;
+ import flash.events.ProgressEvent;
+ import flash.events.SecurityErrorEvent;
+ import flash.events.TimerEvent;
+ import flash.net.Socket;
+ import flash.utils.ByteArray;
+ import flash.utils.Dictionary;
+ import flash.utils.Timer;
+ import vegas.strings.JSON;
+
+
+ public class AphlictMaster extends Aphlict {
+
+ /**
+ * The pool of connected clients.
+ */
+ private var clients:Dictionary;
+
+ /**
+ * A timer used to trigger periodic events.
+ */
+ private var timer:Timer;
+
+ /**
+ * The interval after which clients will be considered dead and removed
+ * from the pool.
+ */
+ public static const PURGE_INTERVAL:Number = 3 * AphlictClient.INTERVAL;
+
+ /**
+ * The hostname for the Aphlict Server.
+ */
+ private var remoteServer:String;
+
+ /**
+ * The port number for the Aphlict Server.
+ */
+ private var remotePort:Number;
+
+ private var socket:Socket;
+ private var readBuffer:ByteArray;
+
+
+ public function AphlictMaster(server:String, port:Number) {
+ super();
+
+ this.remoteServer = server;
+ this.remotePort = port;
+
+ // Connect to the Aphlict Server.
+ this.recv.connect('aphlict_master');
+ this.connectToServer();
+
+ this.clients = new Dictionary();
+
+ // Start a timer and regularly purge dead clients.
+ this.timer = new Timer(AphlictMaster.PURGE_INTERVAL);
+ this.timer.addEventListener(TimerEvent.TIMER, this.purgeClients);
+ this.timer.start();
+ }
+
+ /**
+ * Register a @{class:AphlictClient}.
+ */
+ public function register(client:String):void {
+ if (!this.clients[client]) {
+ this.log('Registering client: ' + client);
+ this.clients[client] = new Date().getTime();
+ }
+ }
+
+ /**
+ * Purge stale client connections from the client pool.
+ */
+ private function purgeClients(event:TimerEvent):void {
+ for (var client:String in this.clients) {
+ var checkin:Number = this.clients[client];
+
+ if (new Date().getTime() - checkin > AphlictMaster.PURGE_INTERVAL) {
+ this.log('Purging client: ' + client);
+ delete this.clients[client];
+ }
+ }
+ }
+
+ /**
+ * Clients will regularly "ping" the master to let us know that they are
+ * still alive. We will "pong" them back to let the client know that the
+ * master is still alive.
+ */
+ public function ping(client:String):void {
+ this.clients[client] = new Date().getTime();
+ this.send.send(client, 'pong');
+ }
+
+ private function connectToServer():void {
+ var socket:Socket = new Socket();
+
+ socket.addEventListener(Event.CONNECT, didConnectSocket);
+ socket.addEventListener(Event.CLOSE, didCloseSocket);
+ socket.addEventListener(ProgressEvent.SOCKET_DATA, didReceiveSocket);
+
+ socket.addEventListener(IOErrorEvent.IO_ERROR, didIOErrorSocket);
+ socket.addEventListener(
+ SecurityErrorEvent.SECURITY_ERROR,
+ didSecurityErrorSocket);
+
+ socket.connect(this.remoteServer, this.remotePort);
+
+ this.readBuffer = new ByteArray();
+ this.socket = socket;
+ }
+
+ private function didConnectSocket(event:Event):void {
+ this.externalInvoke('connected');
+ }
+
+ private function didCloseSocket(event:Event):void {
+ this.externalInvoke('close');
+ }
+
+ private function didIOErrorSocket(event:IOErrorEvent):void {
+ this.externalInvoke('error', event.text);
+ }
+
+ private function didSecurityErrorSocket(event:SecurityErrorEvent):void {
+ this.externalInvoke('error', event.text);
+ }
+
+ private function didReceiveSocket(event:Event):void {
+ var b:ByteArray = this.readBuffer;
+ this.socket.readBytes(b, b.length);
+
+ do {
+ b = this.readBuffer;
+ b.position = 0;
+
+ if (b.length <= 8) {
+ break;
+ }
+
+ var msg_len:Number = parseInt(b.readUTFBytes(8), 10);
+ if (b.length >= msg_len + 8) {
+ var bytes:String = b.readUTFBytes(msg_len);
+ var data:Object = vegas.strings.JSON.deserialize(bytes);
+ var t:ByteArray = new ByteArray();
+ t.writeBytes(b, msg_len + 8);
+ this.readBuffer = t;
+
+ // Send the message to all clients.
+ for (var client:String in this.clients) {
+ this.log('Sending message to client: ' + client);
+ this.send.send(client, 'receiveMessage', data);
+ }
+ } else {
+ break;
+ }
+ } while (true);
+ }
+
+ }
+
+}
diff --git a/webroot/rsrc/css/application/directory/phabricator-jump-nav.css b/webroot/rsrc/css/application/directory/phabricator-jump-nav.css
deleted file mode 100644
index fe06c4c973..0000000000
--- a/webroot/rsrc/css/application/directory/phabricator-jump-nav.css
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * @provides phabricator-jump-nav
- */
-
-.phabricator-jump-nav-form {
- text-align: center;
- padding: 0px;
- margin: 0;
-}
-
-input.phabricator-jump-nav[type='text'] {
- font-size: 16px;
- width: 100%;
-}
-
-.phabricator-jump-nav-caption {
- margin-top: 4px;
- font-size: 11px;
- color: {$greytext};
- text-align: left;
-}
-
-.phabricator-jump-nav-container form {
- padding: 12px 16px;
-}
diff --git a/webroot/rsrc/css/phui/phui-object-item-list-view.css b/webroot/rsrc/css/phui/phui-object-item-list-view.css
index e4055541e6..d9787f2c51 100644
--- a/webroot/rsrc/css/phui/phui-object-item-list-view.css
+++ b/webroot/rsrc/css/phui/phui-object-item-list-view.css
@@ -671,3 +671,54 @@
border: none;
border-bottom: 1px solid {$thinblueborder};
}
+
+
+/* - Launcher List ---------------------------------------------------------- */
+
+.launcher-header {
+ margin: 8px 16px -4px;
+ clear: both;
+ color: {$darkbluetext};
+}
+
+.launcher-header:nth-of-type(1) {
+ margin-top: 24px;
+}
+
+.phui-object-item-launcher-list {
+ overflow: hidden;
+}
+
+.device-desktop .phui-object-item-launcher-list .phui-object-item {
+ width: 32.333%;
+ float: left;
+ margin-right: 1%;
+ box-sizing: border-box;
+}
+
+.phui-object-item-image-icon {
+ background: none;
+}
+
+.phui-object-item-image-icon {
+ width: 30px;
+ height: 30px;
+ margin: 4px 4px 4px 4px;
+ position: absolute;
+}
+
+.phui-object-item-image-icon .phui-icon-view {
+ position: absolute;
+ width: 28px;
+ height: 28px;
+ left: 6px;
+ top: 6px;
+}
+
+.phui-object-item-with-image-icon .phui-object-item-frame {
+ min-height: 48px;
+}
+
+.phui-object-item-with-image-icon .phui-object-item-content-box {
+ margin-left: 44px;
+}
diff --git a/webroot/rsrc/swf/aphlict.swf b/webroot/rsrc/swf/aphlict.swf
index 4ac315b9de..cee18c7dc6 100644
Binary files a/webroot/rsrc/swf/aphlict.swf and b/webroot/rsrc/swf/aphlict.swf differ