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();
 }