private function renderAuditStatusView(array $audit_requests) { assert_instances_of($audit_requests, 'PhabricatorRepositoryAuditRequest'); $viewer = $this->getViewer(); $authority_map = array_fill_keys($this->auditAuthorityPHIDs, true); $view = new PHUIStatusListView(); foreach ($audit_requests as $request) { $code = $request->getAuditStatus(); $item = new PHUIStatusItemView(); $item->setIcon(PhabricatorAuditStatusConstants::getStatusIcon($code), PhabricatorAuditStatusConstants::getStatusColor($code), PhabricatorAuditStatusConstants::getStatusName($code)); $note = array(); foreach ($request->getAuditReasons() as $reason) { $note[] = phutil_tag('div', array(), $reason); } $item->setNote($note); $auditor_phid = $request->getAuditorPHID(); $target = $viewer->renderHandle($auditor_phid); $item->setTarget($target); if (isset($authority_map[$auditor_phid])) { $item->setHighlighted(true); } $view->addItem($item); } return $view; }
public function execute(PhutilArgumentParser $args) { $viewer = $this->getViewer(); $users = $this->loadUsers($args->getArg('users')); $repos = $this->loadRepos($args->getArg('repositories')); $commits = $this->loadCommits($args->getArg('commits')); $ids = $this->parseList($args->getArg('ids')); $status = $args->getArg('status'); if (!$status) { $status = DiffusionCommitQuery::AUDIT_STATUS_OPEN; } $min_date = $this->loadDate($args->getArg('min-commit-date')); $max_date = $this->loadDate($args->getArg('max-commit-date')); if ($min_date && $max_date && $min_date > $max_date) { throw new PhutilArgumentUsageException('Specified max date must come after specified min date.'); } $is_dry_run = $args->getArg('dry-run'); $query = id(new DiffusionCommitQuery())->setViewer($this->getViewer())->needAuditRequests(true); if ($status) { $query->withAuditStatus($status); } $id_map = array(); if ($ids) { $id_map = array_fuse($ids); $query->withAuditIDs($ids); } if ($repos) { $query->withRepositoryIDs(mpull($repos, 'getID')); } $auditor_map = array(); if ($users) { $auditor_map = array_fuse(mpull($users, 'getPHID')); $query->withAuditorPHIDs($auditor_map); } if ($commits) { $query->withPHIDs(mpull($commits, 'getPHID')); } $commits = $query->execute(); $commits = mpull($commits, null, 'getPHID'); $audits = array(); foreach ($commits as $commit) { $commit_audits = $commit->getAudits(); foreach ($commit_audits as $key => $audit) { if ($id_map && empty($id_map[$audit->getID()])) { unset($commit_audits[$key]); continue; } if ($auditor_map && empty($auditor_map[$audit->getAuditorPHID()])) { unset($commit_audits[$key]); continue; } if ($min_date && $commit->getEpoch() < $min_date) { unset($commit_audits[$key]); continue; } if ($max_date && $commit->getEpoch() > $max_date) { unset($commit_audits[$key]); continue; } } $audits[] = $commit_audits; } $audits = array_mergev($audits); $console = PhutilConsole::getConsole(); if (!$audits) { $console->writeErr("%s\n", pht('No audits match the query.')); return 0; } $handles = id(new PhabricatorHandleQuery())->setViewer($this->getViewer())->withPHIDs(mpull($audits, 'getAuditorPHID'))->execute(); foreach ($audits as $audit) { $commit = $commits[$audit->getCommitPHID()]; $console->writeOut("%s\n", sprintf('%10d %-16s %-16s %s: %s', $audit->getID(), $handles[$audit->getAuditorPHID()]->getName(), PhabricatorAuditStatusConstants::getStatusName($audit->getAuditStatus()), $commit->getRepository()->formatCommitName($commit->getCommitIdentifier()), trim($commit->getSummary()))); } if (!$is_dry_run) { $message = pht('Really delete these %d audit(s)? They will be permanently deleted ' . 'and can not be recovered.', count($audits)); if ($console->confirm($message)) { foreach ($audits as $audit) { $id = $audit->getID(); $console->writeOut("%s\n", pht('Deleting audit %d...', $id)); $audit->delete(); } } } return 0; }
public function buildList() { $user = $this->getUser(); if (!$user) { throw new Exception(pht('You must %s before %s!', 'setUser()', __FUNCTION__ . '()')); } $rowc = array(); $list = new PHUIObjectItemListView(); foreach ($this->commits as $commit) { $commit_phid = $commit->getPHID(); $commit_handle = $this->getHandle($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(), $user); $audits = mpull($commit->getAudits(), null, 'getAuditorPHID'); $auditors = array(); $reasons = array(); foreach ($audits as $audit) { $auditor_phid = $audit->getAuditorPHID(); $auditors[$auditor_phid] = $this->getHandle($auditor_phid)->renderLink(); } $auditors = phutil_implode_html(', ', $auditors); $authority_audits = array_select_keys($audits, $this->authorityPHIDs); if ($authority_audits) { $audit = reset($authority_audits); } else { $audit = reset($audits); } if ($audit) { $reasons = $audit->getAuditReasons(); $reasons = phutil_implode_html(', ', $reasons); $status_code = $audit->getAuditStatus(); $status_text = PhabricatorAuditStatusConstants::getStatusName($status_code); $status_color = PhabricatorAuditStatusConstants::getStatusColor($status_code); $status_icon = PhabricatorAuditStatusConstants::getStatusIcon($status_code); } else { $reasons = null; $status_text = null; $status_color = null; $status_icon = null; } $author_phid = $commit->getAuthorPHID(); if ($author_phid) { $author_name = $this->getHandle($author_phid)->renderLink(); } else { $author_name = $commit->getCommitData()->getAuthorName(); } $item = id(new PHUIObjectItemView())->setObjectName($commit_name)->setHeader($commit_desc)->setHref($commit_link)->addAttribute(pht('Author: %s', $author_name))->addAttribute($reasons)->addIcon('none', $committed); if (!empty($auditors)) { $item->addByLine(pht('Auditors: %s', $auditors)); } if ($status_color) { $item->setStatusIcon($status_icon . ' ' . $status_color, $status_text); } $list->addItem($item); } if ($this->noDataString) { $list->setNoDataString($this->noDataString); } return $list; }
public function render() { $user = $this->user; $authority = array_fill_keys($this->authorityPHIDs, true); $rowc = array(); $last = null; $rows = array(); foreach ($this->audits as $audit) { $commit_phid = $audit->getCommitPHID(); if ($last == $commit_phid) { $commit_name = null; $commit_desc = null; } else { $commit_name = $this->getHandle($commit_phid)->renderLink(); $commit_desc = $this->getCommitDescription($commit_phid); $last = $commit_phid; } $reasons = $audit->getAuditReasons(); foreach ($reasons as $key => $reason) { $reasons[$key] = phutil_escape_html($reason); } $reasons = implode('<br />', $reasons); $status_code = $audit->getAuditStatus(); $status = PhabricatorAuditStatusConstants::getStatusName($status_code); $auditor_handle = $this->getHandle($audit->getAuditorPHID()); $rows[] = array($commit_name, phutil_escape_html($commit_desc), $auditor_handle->renderLink(), phutil_escape_html($status), $reasons); $row_class = null; $has_authority = !empty($authority[$audit->getAuditorPHID()]); if ($has_authority) { $commit_author = $this->commits[$commit_phid]->getAuthorPHID(); // You don't have authority over package and project audits on your own // commits. $auditor_is_user = $audit->getAuditorPHID() == $user->getPHID(); $user_is_author = $commit_author == $user->getPHID(); if ($auditor_is_user || !$user_is_author) { $row_class = 'highlighted'; } } $rowc[] = $row_class; } $table = new AphrontTableView($rows); $table->setHeaders(array('Commit', 'Description', 'Auditor', 'Status', 'Details')); $table->setColumnClasses(array('pri', $this->showDescriptions ? 'wide' : '', '', '', $this->showDescriptions ? '' : 'wide')); $table->setRowClasses($rowc); $table->setColumnVisibility(array($this->showDescriptions, $this->showDescriptions, true, true, true)); if ($this->noDataString) { $table->setNoDataString($this->noDataString); } return $table->render(); }
public function render() { $rowc = array(); $last = null; $rows = array(); foreach ($this->audits as $audit) { $commit_phid = $audit->getCommitPHID(); $committed = null; if ($last == $commit_phid) { $commit_name = null; $commit_desc = null; } else { $commit_name = $this->getHandle($commit_phid)->renderLink(); $commit_desc = $this->getCommitDescription($commit_phid); $commit = idx($this->commits, $commit_phid); if ($commit && $this->user) { $committed = phabricator_datetime($commit->getEpoch(), $this->user); } $last = $commit_phid; } $reasons = $audit->getAuditReasons(); foreach ($reasons as $key => $reason) { $reasons[$key] = phutil_escape_html($reason); } $reasons = implode('<br />', $reasons); $status_code = $audit->getAuditStatus(); $status = PhabricatorAuditStatusConstants::getStatusName($status_code); $auditor_handle = $this->getHandle($audit->getAuditorPHID()); $rows[] = array($commit_name, phutil_escape_html($commit_desc), $committed, $auditor_handle->renderLink(), phutil_escape_html($status), $reasons); $row_class = null; if (array_key_exists($audit->getID(), $this->getHighlightedAudits())) { $row_class = 'highlighted'; } $rowc[] = $row_class; } $table = new AphrontTableView($rows); $table->setHeaders(array('Commit', 'Description', 'Committed', 'Auditor', 'Status', 'Details')); $table->setColumnClasses(array('pri', $this->showDescriptions ? 'wide' : '', '', '', '', $this->showDescriptions ? '' : 'wide')); $table->setRowClasses($rowc); $table->setColumnVisibility(array($this->showDescriptions, $this->showDescriptions, $this->showDescriptions, true, true, true)); if ($this->noDataString) { $table->setNoDataString($this->noDataString); } return $table->render(); }