Something went wrong. Try again.
@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
Something went wrong. Try again.
27 kB · 822 lines
PHP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823<?php
final class DiffusionRepositoryBasicsManagementPanel extends DiffusionRepositoryManagementPanel {
const PANELKEY = 'basics';
public function getManagementPanelLabel() { return pht('Basics'); }
public function getManagementPanelOrder() { return 100; }
public function getManagementPanelIcon() { return 'fa-code'; }
protected function getEditEngineFieldKeys() { return array( 'name', 'callsign', 'shortName', 'description', 'projectPHIDs', ); }
public function buildManagementPanelCurtain() { $repository = $this->getRepository(); $viewer = $this->getViewer();
$action_list = $this->newActionList();
$can_edit = PhabricatorPolicyFilter::hasCapability( $viewer, $repository, PhabricatorPolicyCapability::CAN_EDIT);
$edit_uri = $this->getEditPageURI(); $activate_uri = $repository->getPathURI('edit/activate/'); $delete_uri = $repository->getPathURI('edit/delete/'); $encoding_uri = $this->getEditPageURI('encoding'); $dangerous_uri = $repository->getPathURI('edit/dangerous/'); $enormous_uri = $repository->getPathURI('edit/enormous/'); $update_uri = $repository->getPathURI('edit/update/'); $publish_uri = $repository->getPathURI('edit/publish/');
if ($repository->isTracked()) { $activate_icon = 'fa-ban'; $activate_label = pht('Deactivate Repository'); } else { $activate_icon = 'fa-check'; $activate_label = pht('Activate Repository'); }
if (!$repository->isPublishingDisabled()) { $publish_icon = 'fa-ban'; $publish_label = pht('Disable Publishing'); } else { $publish_icon = 'fa-check'; $publish_label = pht('Enable Publishing'); }
$should_dangerous = $repository->shouldAllowDangerousChanges(); if ($should_dangerous) { $dangerous_icon = 'fa-shield'; $dangerous_name = pht('Prevent Dangerous Changes'); $can_dangerous = $can_edit; } else { $dangerous_icon = 'fa-exclamation-triangle'; $dangerous_name = pht('Allow Dangerous Changes'); $can_dangerous = ($can_edit && $repository->canAllowDangerousChanges()); }
$should_enormous = $repository->shouldAllowEnormousChanges(); if ($should_enormous) { $enormous_icon = 'fa-shield'; $enormous_name = pht('Prevent Enormous Changes'); $can_enormous = $can_edit; } else { $enormous_icon = 'fa-exclamation-triangle'; $enormous_name = pht('Allow Enormous Changes'); $can_enormous = ($can_edit && $repository->canAllowEnormousChanges()); }
$action_list->addAction( id(new PhabricatorActionView()) ->setName(pht('Edit Basic Information')) ->setHref($edit_uri) ->setIcon('fa-pencil') ->setDisabled(!$can_edit) ->setWorkflow(!$can_edit));
$action_list->addAction( id(new PhabricatorActionView()) ->setName(pht('Edit Text Encoding')) ->setIcon('fa-text-width') ->setHref($encoding_uri) ->setDisabled(!$can_edit) ->setWorkflow(!$can_edit));
$action_list->addAction( id(new PhabricatorActionView()) ->setName($dangerous_name) ->setHref($dangerous_uri) ->setIcon($dangerous_icon) ->setDisabled(!$can_dangerous) ->setWorkflow(true));
$action_list->addAction( id(new PhabricatorActionView()) ->setName($enormous_name) ->setHref($enormous_uri) ->setIcon($enormous_icon) ->setDisabled(!$can_enormous) ->setWorkflow(true));
$action_list->addAction( id(new PhabricatorActionView()) ->setType(PhabricatorActionView::TYPE_DIVIDER));
$action_list->addAction( id(new PhabricatorActionView()) ->setName($activate_label) ->setHref($activate_uri) ->setIcon($activate_icon) ->setDisabled(!$can_edit) ->setWorkflow(true));
$action_list->addAction( id(new PhabricatorActionView()) ->setName($publish_label) ->setHref($publish_uri) ->setIcon($publish_icon) ->setDisabled(!$can_edit) ->setWorkflow(true));
$action_list->addAction( id(new PhabricatorActionView()) ->setName(pht('Update Now')) ->setHref($update_uri) ->setIcon('fa-refresh') ->setWorkflow(true) ->setDisabled(!$can_edit));
$action_list->addAction( id(new PhabricatorActionView()) ->setType(PhabricatorActionView::TYPE_DIVIDER));
$action_list->addAction( id(new PhabricatorActionView()) ->setName(pht('Delete Repository')) ->setHref($delete_uri) ->setIcon('fa-times') ->setWorkflow(true) ->setDisabled(!$can_edit));
return $this->newCurtainView() ->setActionList($action_list); }
public function buildManagementPanelContent() { $basics = $this->buildBasics(); $basics = $this->newBox(pht('Properties'), $basics);
$repository = $this->getRepository();
$state = $this->buildStateView($repository);
$is_new = $repository->isNewlyInitialized(); $info_view = null; if ($is_new) { $messages = array();
$messages[] = pht( 'This newly created repository is not active yet. Configure policies, '. 'options, and URIs. When ready, %s the repository.', phutil_tag('strong', array(), pht('Activate')));
if ($repository->isHosted()) { $messages[] = pht( 'If activated now, this repository will become a new hosted '. 'repository. To observe an existing repository instead, configure '. 'it in the %s panel.', phutil_tag('strong', array(), pht('URIs'))); } else { $messages[] = pht( 'If activated now, this repository will observe an existing remote '. 'repository and begin importing changes.'); }
$info_view = id(new PHUIInfoView()) ->setSeverity(PHUIInfoView::SEVERITY_NOTICE) ->setErrors($messages); }
$description = $this->buildDescription(); if ($description) { $description = $this->newBox(pht('Description'), $description); } $status = $this->buildStatus();
return array($info_view, $state, $basics, $description, $status); }
private function buildBasics() { $repository = $this->getRepository(); $viewer = $this->getViewer();
$view = id(new PHUIPropertyListView()) ->setViewer($viewer);
$name = $repository->getName(); $view->addProperty(pht('Name'), $name);
$type = PhabricatorRepositoryType::getNameForRepositoryType( $repository->getVersionControlSystem()); $view->addProperty(pht('Type'), $type);
$callsign = $repository->getCallsign(); if (!phutil_nonempty_string($callsign)) { $callsign = phutil_tag('em', array(), pht('No Callsign')); } $view->addProperty(pht('Callsign'), $callsign);
$short_name = $repository->getRepositorySlug(); if ($short_name === null) { $short_name = phutil_tag('em', array(), pht('No Short Name')); } $view->addProperty(pht('Short Name'), $short_name);
$encoding = $repository->getDetail('encoding'); if (!$encoding) { $encoding = phutil_tag('em', array(), pht('Use Default (UTF-8)')); } $view->addProperty(pht('Encoding'), $encoding);
$can_dangerous = $repository->canAllowDangerousChanges(); if (!$can_dangerous) { $dangerous = phutil_tag('em', array(), pht('Not Preventable')); } else { $should_dangerous = $repository->shouldAllowDangerousChanges(); if ($should_dangerous) { $dangerous = pht('Allowed'); } else { $dangerous = pht('Not Allowed'); } }
$view->addProperty(pht('Dangerous Changes'), $dangerous);
$can_enormous = $repository->canAllowEnormousChanges(); if (!$can_enormous) { $enormous = phutil_tag('em', array(), pht('Not Preventable')); } else { $should_enormous = $repository->shouldAllowEnormousChanges(); if ($should_enormous) { $enormous = pht('Allowed'); } else { $enormous = pht('Not Allowed'); } }
$view->addProperty(pht('Enormous Changes'), $enormous);
return $view; }
private function buildDescription() { $repository = $this->getRepository(); $viewer = $this->getViewer();
$description = $repository->getDetail('description');
$view = id(new PHUIPropertyListView()) ->setViewer($viewer); if (!strlen($description)) { return null; } else { $description = new PHUIRemarkupView($viewer, $description); } $view->addTextContent($description);
return $view; }
private function buildStatus() { $repository = $this->getRepository(); $viewer = $this->getViewer();
$view = id(new PHUIPropertyListView()) ->setViewer($viewer);
$view->addProperty( pht('Update Frequency'), $this->buildRepositoryUpdateInterval($repository));
$messages = $this->loadStatusMessages($repository);
$status = $this->buildRepositoryStatus($repository, $messages); $raw_error = $this->buildRepositoryRawError($repository, $messages);
$view->addProperty(pht('Status'), $status); if ($raw_error) { $view->addSectionHeader(pht('Raw Error')); $view->addTextContent($raw_error); }
return $this->newBox(pht('Working Copy Status'), $view); }
private function buildRepositoryUpdateInterval( PhabricatorRepository $repository) {
$smart_wait = $repository->loadUpdateInterval();
$doc_href = PhabricatorEnv::getDoclink( 'Diffusion User Guide: Repository Updates');
return array( phutil_format_relative_time_detailed($smart_wait), " \xC2\xB7 ", phutil_tag( 'a', array( 'href' => $doc_href, 'target' => '_blank', ), pht('Learn More')), ); }
private function buildRepositoryStatus( PhabricatorRepository $repository, array $messages) {
$viewer = $this->getViewer(); $is_cluster = $repository->getAlmanacServicePHID();
$view = new PHUIStatusListView();
if ($repository->isTracked()) { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green') ->setTarget(pht('Repository Active'))); } else { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_WARNING, 'bluegrey') ->setTarget(pht('Repository Inactive')) ->setNote( pht('Activate this repository to begin or resume import.'))); return $view; }
$binaries = array(); $svnlook_check = false; switch ($repository->getVersionControlSystem()) { case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: $binaries[] = 'git'; break; case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: $binaries[] = 'svn'; break; case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: $binaries[] = 'hg'; break; }
if ($repository->isHosted()) { $proto_https = PhabricatorRepositoryURI::BUILTIN_PROTOCOL_HTTPS; $proto_http = PhabricatorRepositoryURI::BUILTIN_PROTOCOL_HTTP; $can_http = $repository->canServeProtocol($proto_http, false) || $repository->canServeProtocol($proto_https, false);
if ($can_http) { switch ($repository->getVersionControlSystem()) { case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: $binaries[] = 'git-http-backend'; break; case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: $binaries[] = 'svnserve'; $binaries[] = 'svnadmin'; $binaries[] = 'svnlook'; $svnlook_check = true; break; case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: $binaries[] = 'hg'; break; } }
$proto_ssh = PhabricatorRepositoryURI::BUILTIN_PROTOCOL_SSH; $can_ssh = $repository->canServeProtocol($proto_ssh, false);
if ($can_ssh) { switch ($repository->getVersionControlSystem()) { case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: $binaries[] = 'git-receive-pack'; $binaries[] = 'git-upload-pack'; break; case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: $binaries[] = 'svnserve'; $binaries[] = 'svnadmin'; $binaries[] = 'svnlook'; $svnlook_check = true; break; case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: $binaries[] = 'hg'; break; } } }
$binaries = array_unique($binaries); if (!$is_cluster) { // We're only checking for binaries if we aren't running with a cluster // configuration. In theory, we could check for binaries on the // repository host machine, but we'd need to make this more complicated // to do that.
foreach ($binaries as $binary) { $where = Filesystem::resolveBinary($binary); if (!$where) { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red') ->setTarget( pht('Missing Binary %s', phutil_tag('tt', array(), $binary))) ->setNote(pht( "Unable to find this binary in the webserver's PATH. You may ". "need to configure %s.", $this->getEnvConfigLink()))); } else { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green') ->setTarget( pht('Found Binary %s', phutil_tag('tt', array(), $binary))) ->setNote(phutil_tag('tt', array(), $where))); } }
// This gets checked generically above. However, for svn commit hooks, we // need this to be in environment.append-paths because subversion strips // PATH. if ($svnlook_check) { $where = Filesystem::resolveBinary('svnlook'); if ($where) { $path = substr($where, 0, strlen($where) - strlen('svnlook')); $dirs = PhabricatorEnv::getEnvConfig('environment.append-paths'); $in_path = false; foreach ($dirs as $dir) { if (Filesystem::isDescendant($path, $dir)) { $in_path = true; break; } } if (!$in_path) { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red') ->setTarget( pht('Commit Hooks: %s', phutil_tag('tt', array(), $binary))) ->setNote( pht( 'The directory containing the "svnlook" binary is not '. 'listed in "environment.append-paths", so commit hooks '. '(which execute with an empty "PATH") will not be able to '. 'find "svnlook". Add `%s` to %s.', $path, $this->getEnvConfigLink()))); } } } }
$doc_href = PhabricatorEnv::getDoclink('Managing Daemons with phd');
$daemon_instructions = pht( 'Use %s to start daemons. See %s.', phutil_tag('tt', array(), 'bin/phd start'), phutil_tag( 'a', array( 'href' => $doc_href, ), pht('Managing Daemons with phd')));
$pull_daemon = id(new PhabricatorDaemonLogQuery()) ->setViewer(PhabricatorUser::getOmnipotentUser()) ->withStatus(PhabricatorDaemonLogQuery::STATUS_ALIVE) ->withDaemonClasses(array('PhabricatorRepositoryPullLocalDaemon')) ->setLimit(1) ->execute();
if ($pull_daemon) {
// TODO: In a cluster environment, we need a daemon on this repository's // host, specifically, and we aren't checking for that right now. This // is a reasonable proxy for things being more-or-less correctly set up, // though.
$view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green') ->setTarget(pht('Pull Daemon Running'))); } else { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red') ->setTarget(pht('Pull Daemon Not Running')) ->setNote($daemon_instructions)); }
$task_daemon = id(new PhabricatorDaemonLogQuery()) ->setViewer(PhabricatorUser::getOmnipotentUser()) ->withStatus(PhabricatorDaemonLogQuery::STATUS_ALIVE) ->withDaemonClasses(array('PhabricatorTaskmasterDaemon')) ->setLimit(1) ->execute(); if ($task_daemon) { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green') ->setTarget(pht('Task Daemon Running'))); } else { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red') ->setTarget(pht('Task Daemon Not Running')) ->setNote($daemon_instructions)); }
if ($is_cluster) { // Just omit this status check for now in cluster environments. We // could make a service call and pull it from the repository host // eventually. } else if ($repository->usesLocalWorkingCopy()) { $local_parent = dirname($repository->getLocalPath()); if (Filesystem::pathExists($local_parent)) { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green') ->setTarget(pht('Storage Directory OK')) ->setNote(phutil_tag('tt', array(), $local_parent))); } else { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red') ->setTarget(pht('No Storage Directory')) ->setNote( pht( 'Storage directory %s does not exist, or is not readable by '. 'the webserver. Create this directory or make it readable.', phutil_tag('tt', array(), $local_parent)))); return $view; }
$local_path = $repository->getLocalPath(); $message = idx($messages, PhabricatorRepositoryStatusMessage::TYPE_INIT); if ($message) { switch ($message->getStatusCode()) { case PhabricatorRepositoryStatusMessage::CODE_ERROR: $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red') ->setTarget(pht('Initialization Error')) ->setNote($message->getParameter('message'))); return $view; case PhabricatorRepositoryStatusMessage::CODE_OKAY: if (Filesystem::pathExists($local_path)) { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green') ->setTarget(pht('Working Copy OK')) ->setNote(phutil_tag('tt', array(), $local_path))); } else { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red') ->setTarget(pht('Working Copy Error')) ->setNote( pht( 'Working copy %s has been deleted, or is not '. 'readable by the webserver. Make this directory '. 'readable. If it has been deleted, the daemons should '. 'restore it automatically.', phutil_tag('tt', array(), $local_path)))); return $view; } break; default: $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_CLOCK, 'green') ->setTarget(pht('Initializing Working Copy')) ->setNote(pht('Daemons are initializing the working copy.'))); return $view; } } else { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_CLOCK, 'orange') ->setTarget(pht('No Working Copy Yet')) ->setNote( pht('Waiting for daemons to build a working copy.'))); return $view; } }
$message = idx($messages, PhabricatorRepositoryStatusMessage::TYPE_FETCH); if ($message) { switch ($message->getStatusCode()) { case PhabricatorRepositoryStatusMessage::CODE_ERROR: $message = $message->getParameter('message');
$suggestion = null; if (preg_match('/Permission denied \(publickey\)./', $message)) { $suggestion = pht( 'Public Key Error: This error usually indicates that the '. 'keypair you have configured does not have permission to '. 'access the repository.'); }
$view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red') ->setTarget(pht('Update Error')) ->setNote($suggestion)); return $view; case PhabricatorRepositoryStatusMessage::CODE_OKAY: $ago = (PhabricatorTime::getNow() - $message->getEpoch()); $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green') ->setTarget(pht('Updates OK')) ->setNote( pht( 'Last updated %s (%s ago).', phabricator_datetime($message->getEpoch(), $viewer), phutil_format_relative_time_detailed($ago)))); break; } } else { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_CLOCK, 'orange') ->setTarget(pht('Waiting For Update')) ->setNote( pht('Waiting for daemons to read updates.'))); }
if ($repository->isImporting()) { $ratio = $repository->loadImportProgress(); $percentage = sprintf('%.2f%%', 100 * $ratio);
$view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_CLOCK, 'green') ->setTarget(pht('Importing')) ->setNote( pht('%s Complete', $percentage))); } else { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green') ->setTarget(pht('Fully Imported'))); }
if (idx($messages, PhabricatorRepositoryStatusMessage::TYPE_NEEDS_UPDATE)) { $view->addItem( id(new PHUIStatusItemView()) ->setIcon(PHUIStatusItemView::ICON_UP, 'indigo') ->setTarget(pht('Prioritized')) ->setNote(pht('This repository will be updated soon!'))); }
return $view; }
private function buildRepositoryRawError( PhabricatorRepository $repository, array $messages) { $viewer = $this->getViewer();
$can_edit = PhabricatorPolicyFilter::hasCapability( $viewer, $repository, PhabricatorPolicyCapability::CAN_EDIT);
$raw_error = null;
$message = idx($messages, PhabricatorRepositoryStatusMessage::TYPE_FETCH); if ($message) { switch ($message->getStatusCode()) { case PhabricatorRepositoryStatusMessage::CODE_ERROR: $raw_error = $message->getParameter('message'); break; } }
if ($raw_error !== null) { if (!$can_edit) { $raw_message = pht( 'You must be able to edit a repository to see raw error messages '. 'because they sometimes disclose sensitive information.'); $raw_message = phutil_tag('em', array(), $raw_message); } else { $raw_message = phutil_escape_html_newlines($raw_error); } } else { $raw_message = null; }
return $raw_message; }
private function loadStatusMessages(PhabricatorRepository $repository) { $messages = id(new PhabricatorRepositoryStatusMessage()) ->loadAllWhere('repositoryID = %d', $repository->getID()); $messages = mpull($messages, null, 'getStatusType');
return $messages; }
private function getEnvConfigLink() { $config_href = '/config/edit/environment.append-paths/'; return phutil_tag( 'a', array( 'href' => $config_href, ), 'environment.append-paths'); }
private function buildStateView(PhabricatorRepository $repository) { $viewer = $this->getViewer(); $is_new = $repository->isNewlyInitialized();
$view = id(new PHUIPropertyListView()) ->setViewer($viewer);
if (!$repository->isTracked()) { if ($is_new) { $active_icon = 'fa-ban'; $active_color = 'yellow'; $active_label = pht('Not Activated Yet'); $active_note = pht('Complete Setup and Activate Repository'); } else { $active_icon = 'fa-times'; $active_color = 'red'; $active_label = pht('Not Active'); $active_note = pht('Repository Disabled'); } } else if ($repository->isImporting()) { $active_icon = 'fa-hourglass'; $active_color = 'yellow'; $active_label = pht('Importing...'); $active_note = null; } else { $active_icon = 'fa-check'; $active_color = 'green'; $active_label = pht('Repository Active'); $active_note = null; }
$active_view = id(new PHUIStatusListView()) ->addItem( id(new PHUIStatusItemView()) ->setIcon($active_icon, $active_color) ->setTarget($active_label) ->setNote($active_note));
if ($repository->isPublishingDisabled()) { $publishing_icon = 'fa-times'; $publishing_color = 'red'; $publishing_label = pht('Not Publishing'); $publishing_note = pht('Publishing Disabled'); } else if (!$repository->isTracked()) { $publishing_icon = 'fa-ban'; $publishing_color = 'yellow'; $publishing_label = pht('Not Publishing'); if ($is_new) { $publishing_note = pht('Repository Not Active Yet'); } else { $publishing_note = pht('Repository Inactive'); } } else if ($repository->isImporting()) { $publishing_icon = 'fa-ban'; $publishing_color = 'yellow'; $publishing_label = pht('Not Publishing'); $publishing_note = pht('Repository Importing'); } else { $publishing_icon = 'fa-check'; $publishing_color = 'green'; $publishing_label = pht('Publishing Active'); $publishing_note = null; }
$publishing_view = id(new PHUIStatusListView()) ->addItem( id(new PHUIStatusItemView()) ->setIcon($publishing_icon, $publishing_color) ->setTarget($publishing_label) ->setNote($publishing_note));
$view->addProperty(pht('Active'), $active_view); $view->addProperty(pht('Publishing'), $publishing_view);
return $this->newBox(pht('State'), $view); }
}