diff --git a/src/applications/audit/view/PhabricatorAuditListView.php b/src/applications/audit/view/PhabricatorAuditListView.php index 4afb069778..9207230e7c 100644 --- a/src/applications/audit/view/PhabricatorAuditListView.php +++ b/src/applications/audit/view/PhabricatorAuditListView.php @@ -1,183 +1,181 @@ noDataString = $no_data_string; return $this; } public function getNoDataString() { return $this->noDataString; } public function setHeader($header) { $this->header = $header; return $this; } public function getHeader() { return $this->header; } public function setShowDrafts($show_drafts) { $this->showDrafts = $show_drafts; return $this; } public function getShowDrafts() { return $this->showDrafts; } /** * These commits should have both commit data and audit requests attached. */ public function setCommits(array $commits) { assert_instances_of($commits, 'PhabricatorRepositoryCommit'); $this->commits = mpull($commits, null, 'getPHID'); return $this; } public function getCommits() { return $this->commits; } private function getCommitDescription($phid) { if ($this->commits === null) { return pht('(Unknown Commit)'); } $commit = idx($this->commits, $phid); if (!$commit) { return pht('(Unknown Commit)'); } $summary = $commit->getCommitData()->getSummary(); if (strlen($summary)) { return $summary; } // No summary, so either this is still impoting or just has an empty // commit message. if (!$commit->isImported()) { return pht('(Importing Commit...)'); } else { return pht('(Untitled Commit)'); } } public function render() { $list = $this->buildList(); $list->setFlush(true); return $list->render(); } public function buildList() { $viewer = $this->getViewer(); $rowc = array(); $phids = array(); foreach ($this->getCommits() as $commit) { $phids[] = $commit->getPHID(); foreach ($commit->getAudits() as $audit) { $phids[] = $audit->getAuditorPHID(); } $author_phid = $commit->getAuthorPHID(); if ($author_phid) { $phids[] = $author_phid; } } $handles = $viewer->loadHandles($phids); $show_drafts = $this->getShowDrafts(); $draft_icon = id(new PHUIIconView()) ->setIcon('fa-comment yellow') ->addSigil('has-tooltip') ->setMetadata( array( 'tip' => pht('Unsubmitted Comments'), )); $list = new PHUIObjectItemListView(); foreach ($this->commits as $commit) { $commit_phid = $commit->getPHID(); $commit_handle = $handles[$commit_phid]; $committed = null; $commit_name = $commit_handle->getName(); $commit_link = $commit_handle->getURI(); $commit_desc = $this->getCommitDescription($commit_phid); $committed = phabricator_datetime($commit->getEpoch(), $viewer); $status = $commit->getAuditStatus(); $status_text = PhabricatorAuditCommitStatusConstants::getStatusName($status); $status_color = PhabricatorAuditCommitStatusConstants::getStatusColor($status); $status_icon = PhabricatorAuditCommitStatusConstants::getStatusIcon($status); $author_phid = $commit->getAuthorPHID(); if ($author_phid) { $author_name = $handles[$author_phid]->renderLink(); } else { $author_name = $commit->getCommitData()->getAuthorName(); } $item = id(new PHUIObjectItemView()) ->setObjectName($commit_name) ->setHeader($commit_desc) - ->setHref($commit_link); + ->setHref($commit_link) + ->addByline(pht('Author: %s', $author_name)) + ->addIcon('none', $committed); if ($show_drafts) { if ($commit->getHasDraft($viewer)) { $item->addAttribute($draft_icon); } } - $item - ->addAttribute(pht('Author: %s', $author_name)) - ->addIcon('none', $committed); - $audits = $commit->getAudits(); $auditor_phids = mpull($audits, 'getAuditorPHID'); if ($auditor_phids) { - $item->addByLine( - array( - pht('Auditors:'), - ' ', - $handles->newSublist($auditor_phids)->renderList(), - )); + $auditor_list = $handles->newSublist($auditor_phids) + ->renderList() + ->setAsInline(true); + } else { + $auditor_list = phutil_tag('em', array(), pht('None')); } + $item->addAttribute(pht('Auditors: %s', $auditor_list)); if ($status_color) { $item->setStatusIcon($status_icon.' '.$status_color, $status_text); } $list->addItem($item); } if ($this->noDataString) { $list->setNoDataString($this->noDataString); } if ($this->header) { $list->setHeader($this->header); } return $list; } } diff --git a/src/applications/diffusion/view/DiffusionHistoryTableView.php b/src/applications/diffusion/view/DiffusionHistoryTableView.php index 4c19e3762b..bb3aee37da 100644 --- a/src/applications/diffusion/view/DiffusionHistoryTableView.php +++ b/src/applications/diffusion/view/DiffusionHistoryTableView.php @@ -1,251 +1,269 @@ history = $history; return $this; } public function loadRevisions() { $commit_phids = array(); foreach ($this->history as $item) { if ($item->getCommit()) { $commit_phids[] = $item->getCommit()->getPHID(); } } // TODO: Get rid of this. $this->revisions = id(new DifferentialRevision()) ->loadIDsByCommitPHIDs($commit_phids); return $this; } public function setHandles(array $handles) { assert_instances_of($handles, 'PhabricatorObjectHandle'); $this->handles = $handles; return $this; } private function getRequiredHandlePHIDs() { $phids = array(); foreach ($this->history as $item) { $data = $item->getCommitData(); if ($data) { if ($data->getCommitDetail('authorPHID')) { $phids[$data->getCommitDetail('authorPHID')] = true; } if ($data->getCommitDetail('committerPHID')) { $phids[$data->getCommitDetail('committerPHID')] = true; } } } return array_keys($phids); } public function setParents(array $parents) { $this->parents = $parents; return $this; } public function setIsHead($is_head) { $this->isHead = $is_head; return $this; } public function setIsTail($is_tail) { $this->isTail = $is_tail; return $this; } public function setFilterParents($filter_parents) { $this->filterParents = $filter_parents; return $this; } public function getFilterParents() { return $this->filterParents; } public function render() { $drequest = $this->getDiffusionRequest(); $viewer = $this->getUser(); $buildables = $this->loadBuildables(mpull($this->history, 'getCommit')); $has_any_build = false; $show_revisions = PhabricatorApplication::isClassInstalledForViewer( 'PhabricatorDifferentialApplication', $viewer); $handles = $viewer->loadHandles($this->getRequiredHandlePHIDs()); $graph = null; if ($this->parents) { $parents = $this->parents; // If we're filtering parents, remove relationships which point to // commits that are not part of the visible graph. Otherwise, we get // a big tree of nonsense when viewing release branches like "stable" // versus "master". if ($this->filterParents) { foreach ($parents as $key => $nodes) { foreach ($nodes as $nkey => $node) { if (empty($parents[$node])) { unset($parents[$key][$nkey]); } } } } $graph = id(new PHUIDiffGraphView()) ->setIsHead($this->isHead) ->setIsTail($this->isTail) ->renderGraph($parents); } $show_builds = PhabricatorApplication::isClassInstalledForViewer( 'PhabricatorHarbormasterApplication', $this->getUser()); $rows = array(); $ii = 0; foreach ($this->history as $history) { $epoch = $history->getEpoch(); if ($epoch) { $committed = $viewer->formatShortDateTime($epoch); } else { $committed = null; } $data = $history->getCommitData(); $author_phid = $committer = $committer_phid = null; if ($data) { $author_phid = $data->getCommitDetail('authorPHID'); $committer_phid = $data->getCommitDetail('committerPHID'); $committer = $data->getCommitDetail('committer'); } if ($author_phid && isset($handles[$author_phid])) { $author = $handles[$author_phid]->renderLink(); } else { $author = self::renderName($history->getAuthorName()); } $different_committer = false; if ($committer_phid) { $different_committer = ($committer_phid != $author_phid); } else if ($committer != '') { $different_committer = ($committer != $history->getAuthorName()); } if ($different_committer) { if ($committer_phid && isset($handles[$committer_phid])) { $committer = $handles[$committer_phid]->renderLink(); } else { $committer = self::renderName($committer); } $author = hsprintf('%s/%s', $author, $committer); } // We can show details once the message and change have been imported. $partial_import = PhabricatorRepositoryCommit::IMPORTED_MESSAGE | PhabricatorRepositoryCommit::IMPORTED_CHANGE; $commit = $history->getCommit(); if ($commit && $commit->isPartiallyImported($partial_import) && $data) { $summary = AphrontTableView::renderSingleDisplayLine( $history->getSummary()); } else { $summary = phutil_tag('em', array(), pht("Importing\xE2\x80\xA6")); } $build = null; if ($show_builds) { $buildable = idx($buildables, $commit->getPHID()); if ($buildable !== null) { $build = $this->renderBuildable($buildable); $has_any_build = true; } } $browse = $this->linkBrowse( $history->getPath(), array( 'commit' => $history->getCommitIdentifier(), 'branch' => $drequest->getBranch(), 'type' => $history->getFileType(), )); + $status = $commit->getAuditStatus(); + $icon = PhabricatorAuditCommitStatusConstants::getStatusIcon($status); + $color = PhabricatorAuditCommitStatusConstants::getStatusColor($status); + $name = PhabricatorAuditCommitStatusConstants::getStatusName($status); + + $audit_view = id(new PHUIIconView()) + ->setIcon($icon, $color) + ->addSigil('has-tooltip') + ->setMetadata( + array( + 'tip' => $name, + )); + $rows[] = array( $graph ? $graph[$ii++] : null, $browse, self::linkCommit( $drequest->getRepository(), $history->getCommitIdentifier()), $build, + $audit_view, ($commit ? self::linkRevision(idx($this->revisions, $commit->getPHID())) : null), $author, $summary, $committed, ); } $view = new AphrontTableView($rows); $view->setHeaders( array( null, null, pht('Commit'), null, null, - pht('Author/Committer'), + null, + pht('Author'), pht('Details'), pht('Committed'), )); $view->setColumnClasses( array( 'threads', 'nudgeright', '', 'icon', + 'icon', '', '', 'wide', 'right', )); $view->setColumnVisibility( array( $graph ? true : false, true, true, $has_any_build, + true, $show_revisions, )); $view->setDeviceVisibility( array( $graph ? true : false, true, true, true, true, + true, false, true, false, )); return $view->render(); } }