1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-09 16:32:39 +01:00

Rename "beta" to "prototype" and document support policy

Summary:
Fixes T6084. Changes:

  - Rename `phabricator.show-beta-applications` to `phabricator.show-prototypes`, to reinforce that these include early-development applications.
  - Migrate the config setting.
  - Add an explicit "no support" banner to the config page.
  - Rename "Beta" to "Prototype" in the UI.
  - Use "bomb" icon instead of "half star" icon.
  - Document prototype applications in more detail.
  - Explicitly document that we do not support these applications.

Test Plan:
  - Ran migration.
  - Resolved "obsolete config" issue.
  - Viewed config setting.
  - Browsed prototypes in Applications app.
  - Viewed documentation.

Reviewers: chad, btrahan

Reviewed By: btrahan

Subscribers: epriestley, hach-que

Maniphest Tasks: T6084

Differential Revision: https://secure.phabricator.com/D10493
This commit is contained in:
epriestley 2014-09-17 18:25:57 -07:00
parent 444ced16d9
commit 298604c9d3
29 changed files with 185 additions and 83 deletions

View file

@ -630,9 +630,6 @@ return array(
// be enabled in production.
'phabricator.developer-mode' => false,
// Should Phabricator show beta applications on the homepage
'phabricator.show-beta-applications' => false,
// Contains a list of uninstalled applications
'phabricator.uninstalled-applications' => array(),

View file

@ -7,7 +7,7 @@
*/
return array(
'names' => array(
'core.pkg.css' => 'f4235a32',
'core.pkg.css' => '3317a3ad',
'core.pkg.js' => 'cbdbd552',
'darkconsole.pkg.js' => 'df001cab',
'differential.pkg.css' => '36884139',
@ -38,7 +38,7 @@ return array(
'rsrc/css/application/auth/auth.css' => '1e655982',
'rsrc/css/application/base/main-menu-view.css' => 'aceca0e9',
'rsrc/css/application/base/notification-menu.css' => '6aa0a74b',
'rsrc/css/application/base/phabricator-application-launch-view.css' => '8b7e271d',
'rsrc/css/application/base/phabricator-application-launch-view.css' => '5d71008f',
'rsrc/css/application/base/standard-page-view.css' => 'dd860661',
'rsrc/css/application/chatlog/chatlog.css' => '852140ff',
'rsrc/css/application/config/config-options.css' => '7fedf08b',
@ -705,7 +705,7 @@ return array(
'path-typeahead' => 'f7fc67ec',
'people-profile-css' => '5402f7a5',
'phabricator-action-list-view-css' => '9ee9910a',
'phabricator-application-launch-view-css' => '8b7e271d',
'phabricator-application-launch-view-css' => '5d71008f',
'phabricator-busy' => '6453c869',
'phabricator-chatlog-css' => '852140ff',
'phabricator-content-source-view-css' => '4b8b05d4',

View file

@ -0,0 +1,24 @@
<?php
$old_key = 'phabricator.show-beta-applications';
$new_key = 'phabricator.show-prototypes';
echo "Migrating '{$old_key}' to '{$new_key}'...\n";
if (PhabricatorEnv::getEnvConfig($new_key)) {
echo "Skipping migration, new data is already set.\n";
return;
}
$old = PhabricatorEnv::getEnvConfigIfExists($old_key);
if (!$old) {
echo "Skipping migration, old data does not exist.\n";
return;
}
PhabricatorConfigEntry::loadConfigEntry($new_key)
->setIsDeleted(0)
->setValue($old)
->save();
echo "Done.\n";

View file

@ -53,8 +53,8 @@ abstract class PhabricatorApplication implements PhabricatorPolicyInterface {
return true;
}
$beta = PhabricatorEnv::getEnvConfig('phabricator.show-beta-applications');
if (!$beta && $this->isBeta()) {
$prototypes = PhabricatorEnv::getEnvConfig('phabricator.show-prototypes');
if (!$prototypes && $this->isPrototype()) {
return false;
}
@ -65,7 +65,7 @@ abstract class PhabricatorApplication implements PhabricatorPolicyInterface {
}
public function isBeta() {
public function isPrototype() {
return false;
}

View file

@ -28,7 +28,7 @@ final class PhabricatorCalendarApplication extends PhabricatorApplication {
return "\xE2\x8C\xA8";
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -18,7 +18,7 @@ final class PhabricatorChatLogApplication extends PhabricatorApplication {
return 'chatlog';
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -190,6 +190,10 @@ final class PhabricatorSetupCheckExtraConfig extends PhabricatorSetupCheck {
'differential.show-host-field' => $differential_field_reason,
'differential.show-test-plan-field' => $differential_field_reason,
'differential.field-selector' => $differential_field_reason,
'phabricator.show-beta-applications' => pht(
'This option has been renamed to `phabricator.show-prototypes` '.
'to emphasize the unfinished nature of many prototype applications. '.
'Your existing setting has been migrated.'),
);
return $ancient_config;

View file

@ -24,6 +24,10 @@ final class PhabricatorCoreConfigOptions
$path = getenv('PATH');
$proto_doc_href = PhabricatorEnv::getDoclink(
'User Guide: Prototype Applications');
$proto_doc_name = pht('User Guide: Prototype Applications');
return array(
$this->newOption('phabricator.base-uri', 'string', null)
->setLocked(true)
@ -86,25 +90,33 @@ final class PhabricatorCoreConfigOptions
'Phabricator instances are running on both domains, this will '.
'create a collision preventing you from logging in.'))
->addExample('dev', pht('Prefix cookie with "dev"')),
$this->newOption('phabricator.show-beta-applications', 'bool', false)
$this->newOption('phabricator.show-prototypes', 'bool', false)
->setBoolOptions(
array(
pht('Install Beta Applications'),
pht('Uninstall Beta Applications')
pht('Enable Prototypes'),
pht('Disable Prototypes')
))
->setSummary(
pht(
'Install applications which are still under development.'))
->setDescription(
pht(
"Phabricator includes 'Beta' applications which are in an early ".
"stage of development. They range from very rough prototypes to ".
"relatively complete (but unpolished) applications.\n\n".
"By default, Beta applications are not installed. You can enable ".
"this option to install them if you're interested in previewing ".
"upcoming features.\n\n".
"After enabling Beta applications, you can selectively uninstall ".
"them (like normal applications).")),
"IMPORTANT: The upstream does not provide support for prototype ".
"applications.".
"\n\n".
"Phabricator includes prototype applications which are in an ".
"**early stage of development**. By default, prototype ".
"applications are not installed, because are often not yet ".
"developed enough to be generally usable. You can enable ".
"this option to install them if you're developing Phabricator ".
"or are interested in previewing upcoming features.".
"\n\n".
"To learn more about prototypes, see [[ %s | %s ]].".
"\n\n".
"After enabling prototypes, you can selectively uninstall them ".
"(like normal applications).",
$proto_doc_href,
$proto_doc_name)),
$this->newOption('phabricator.serious-business', 'bool', false)
->setBoolOptions(
array(

View file

@ -47,8 +47,7 @@ final class DiffusionRepositoryNewController extends DiffusionController {
array(
pht(
'Create a new, empty repository which Phabricator will host. '.
'For instructions on configuring repository hosting, see %s. '.
'This feature is new and in beta!',
'For instructions on configuring repository hosting, see %s.',
$doc_link),
))
->addButton(

View file

@ -30,7 +30,7 @@ final class PhabricatorDrydockApplication extends PhabricatorApplication {
return self::GROUP_UTILITIES;
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -22,7 +22,7 @@ final class PhabricatorFactApplication extends PhabricatorApplication {
return self::GROUP_UTILITIES;
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -26,7 +26,7 @@ final class PhabricatorFundApplication extends PhabricatorApplication {
return self::GROUP_UTILITIES;
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -36,7 +36,7 @@ final class PhabricatorHarbormasterApplication extends PhabricatorApplication {
);
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -77,10 +77,22 @@ final class PhabricatorApplicationDetailViewController
phutil_tag('em', array(), $application->getFlavorText()));
}
if ($application->isBeta()) {
if ($application->isPrototype()) {
$proto_href = PhabricatorEnv::getDoclink(
'User Guide: Prototype Applications');
$learn_more = phutil_tag(
'a',
array(
'href' => $proto_href,
'target' => '_blank',
),
pht('Learn More'));
$properties->addProperty(
pht('Release'),
pht('Beta'));
pht('Prototype'),
pht(
'This application is a prototype. %s',
$learn_more));
}
$overview = $application->getOverview();
@ -160,9 +172,9 @@ final class PhabricatorApplicationDetailViewController
->setHref(
$this->getApplicationURI(get_class($selected).'/install/'));
$beta_enabled = PhabricatorEnv::getEnvConfig(
'phabricator.show-beta-applications');
if ($selected->isBeta() && !$beta_enabled) {
$prototypes_enabled = PhabricatorEnv::getEnvConfig(
'phabricator.show-prototypes');
if ($selected->isPrototype() && !$prototypes_enabled) {
$action->setDisabled(true);
}

View file

@ -27,21 +27,21 @@ final class PhabricatorApplicationUninstallController
$view_uri = $this->getApplicationURI('view/'.$this->application);
$beta_enabled = PhabricatorEnv::getEnvConfig(
'phabricator.show-beta-applications');
$prototypes_enabled = PhabricatorEnv::getEnvConfig(
'phabricator.show-prototypes');
$dialog = id(new AphrontDialogView())
->setUser($user)
->addCancelButton($view_uri);
if ($selected->isBeta() && !$beta_enabled) {
if ($selected->isPrototype() && !$prototypes_enabled) {
$dialog
->setTitle(pht('Beta Applications Not Enabled'))
->setTitle(pht('Prototypes Not Enabled'))
->appendChild(
pht(
'To manage beta applications, enable them by setting %s in your '.
'To manage prototypes, enable them by setting %s in your '.
'Phabricator configuration.',
phutil_tag('tt', array(), 'phabricator.show-beta-applications')));
phutil_tag('tt', array(), 'phabricator.show-prototypes')));
return id(new AphrontDialogResponse())->setDialog($dialog);
}

View file

@ -24,8 +24,8 @@ final class PhabricatorAppSearchEngine
'installed',
$this->readBoolFromRequest($request, 'installed'));
$saved->setParameter(
'beta',
$this->readBoolFromRequest($request, 'beta'));
'prototypes',
$this->readBoolFromRequest($request, 'prototypes'));
$saved->setParameter(
'firstParty',
$this->readBoolFromRequest($request, 'firstParty'));
@ -51,9 +51,16 @@ final class PhabricatorAppSearchEngine
$query->withInstalled($installed);
}
$beta = $saved->getParameter('beta');
if ($beta !== null) {
$query->withBeta($beta);
$prototypes = $saved->getParameter('prototypes');
if ($prototypes === null) {
// NOTE: This is the old name of the 'prototypes' option, see T6084.
$prototypes = $saved->getParameter('beta');
$saved->setParameter('prototypes', $prototypes);
}
if ($prototypes !== null) {
$query->withPrototypes($prototypes);
}
$first_party = $saved->getParameter('firstParty');
@ -92,13 +99,13 @@ final class PhabricatorAppSearchEngine
)))
->appendChild(
id(new AphrontFormSelectControl())
->setLabel(pht('Beta'))
->setName('beta')
->setValue($this->getBoolFromQuery($saved, 'beta'))
->setLabel(pht('Prototypes'))
->setName('prototypes')
->setValue($this->getBoolFromQuery($saved, 'prototypes'))
->setOptions(
array(
'' => pht('Show All Applications'),
'true' => pht('Show Beta Applications'),
'true' => pht('Show Prototype Applications'),
'false' => pht('Show Released Applications'),
)))
->appendChild(
@ -229,8 +236,8 @@ final class PhabricatorAppSearchEngine
$item->addIcon('fa-times', pht('Uninstalled'));
}
if ($application->isBeta()) {
$item->addIcon('fa-star-half-o grey', pht('Beta'));
if ($application->isPrototype()) {
$item->addIcon('fa-bomb grey', pht('Prototype'));
}
if (!$application->isFirstParty()) {

View file

@ -4,7 +4,7 @@ final class PhabricatorApplicationQuery
extends PhabricatorCursorPagedPolicyAwareQuery {
private $installed;
private $beta;
private $prototypes;
private $firstParty;
private $nameContains;
private $unlisted;
@ -27,8 +27,8 @@ final class PhabricatorApplicationQuery
return $this;
}
public function withBeta($beta) {
$this->beta = $beta;
public function withPrototypes($prototypes) {
$this->prototypes = $prototypes;
return $this;
}
@ -99,9 +99,9 @@ final class PhabricatorApplicationQuery
}
}
if ($this->beta !== null) {
if ($this->prototypes !== null) {
foreach ($apps as $key => $app) {
if ($app->isBeta() != $this->beta) {
if ($app->isPrototype() != $this->prototypes) {
unset($apps[$key]);
}
}

View file

@ -43,16 +43,6 @@ final class PhabricatorApplicationLaunchView extends AphrontTagView {
),
$application->getName());
if ($application->isBeta()) {
$content[] = javelin_tag(
'span',
array(
'aural' => false,
'class' => 'phabricator-application-beta',
),
"\xCE\xB2");
}
$content[] = phutil_tag(
'span',
array(

View file

@ -14,7 +14,7 @@ final class PhabricatorNuanceApplication extends PhabricatorApplication {
return "\xE2\x98\x8E";
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -30,7 +30,7 @@ final class PhabricatorOAuthServerApplication extends PhabricatorApplication {
return self::GROUP_ADMIN;
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -26,7 +26,7 @@ final class PhabricatorPhameApplication extends PhabricatorApplication {
return PhabricatorEnv::getDoclink('Phame User Guide');
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -26,7 +26,7 @@ final class PhabricatorPhluxApplication extends PhabricatorApplication {
return self::GROUP_UTILITIES;
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -26,7 +26,7 @@ final class PhabricatorPhortuneApplication extends PhabricatorApplication {
return self::GROUP_UTILITIES;
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -26,7 +26,7 @@ final class PhabricatorPhragmentApplication extends PhabricatorApplication {
return self::GROUP_UTILITIES;
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -14,7 +14,7 @@ final class PhabricatorPhrequentApplication extends PhabricatorApplication {
return '/phrequent/';
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -41,7 +41,7 @@ final class PhabricatorPonderApplication extends PhabricatorApplication {
);
}
public function isBeta() {
public function isPrototype() {
return true;
}

View file

@ -0,0 +1,65 @@
@title User Guide: Prototype Applications
@group userguide
Information about prototypes.
Overview
========
Phabricator includes //prototype applications//, which are applications in an
early stage of development.
IMPORTANT: The upstream does not offer support for these applications.
When we begin working on a new application, we usually implement it as a
prototype first. This allows us to get a better sense of how the application
might work and integrate with other applications, and what technical and product
challenges it might face.
Prototypes are often not generally usable. They usually aren't documented,
don't have safety and correctness checks in place, very rarely have full
integrations or APIs, and may be missing major pieces of critical functionality
or even not work at all. The parts of an application we prototype first
may not be the useful parts.
Some applications leave the prototype phase quickly, but other applications may
not. We build some prototypes just to make sure a specific technical barrier is
surmountable, and may not finish the application for a very long time. In other
cases, the prototype seems less interesting or useful once it starts working
than we might have imagined it would be, or be far more challenging than we
thought. We may lower the priority of a project or put it on hold indefinitely
if we're less excited about it after we begin building it.
If you're interested in previewing upcoming applications, you can use the
`phabricator.show-prototypes` configuration setting to enable prototypes.
Feedback on Prototypes
======================
We're usually interested in this sort of feedback on prototypes:
- {icon check, color=green} **Use Cases**: If we're building something that
you think you'd use, we'd love to hear about your use cases for it. This can
help us figure out what features to add and how users may think about, use,
and integrate the application.
- {icon check, color=green} **General Interest**: Is an application something
you're looking forward to? Knowing which applications users are interested
in can help us set priorities.
We're usually **not** interested in this sort of feedback on prototypes:
- {icon times, color=red} **Support Requests**: We do not support these
applications. Use them at your own risk, or wait for them to leave the
prototype phase.
- {icon times, color=red} **Bug Reports**: We know these applications don't
work well yet, and usually know about most of the open bugs. Even if we
don't, whatever isn't working yet may change completely before the
application leaves the prototype phase.
- {icon times, color=red} **Contributions / Pull Requests**: These
applications are usually in too early a state to accept contributions. Let
us know about your use case, but wait for release to send code.
Overall, using prototypes makes it easier for us to explore and develop
application ideas, and to share a preview of what's coming in the future with
users, but prototypes are not yet full applications and we do not provide
support until applications leave the prototype phase.

View file

@ -102,7 +102,7 @@ abstract class PhabricatorTestCase extends ArcanistPhutilTestCase {
'phabricator.uninstalled-applications',
array());
$this->env->overrideEnvConfig(
'phabricator.show-beta-applications',
'phabricator.show-prototypes',
true);
// Reset application settings to defaults, particularly policies.

View file

@ -72,14 +72,6 @@ div.phabricator-application-launch-container {
display: inline-block;
}
.phabricator-application-beta {
position: absolute;
top: 4px;
left: 4px;
color: {$bluetext};
font-size: 11px;
}
.phabricator-application-launch-attention {
position: absolute;
top: 8px;