private function renderCommitTooltip(PhabricatorRepositoryCommit $commit, array $handles, $author)
 {
     $viewer = $this->getRequest()->getUser();
     $date = phabricator_date($commit->getEpoch(), $viewer);
     $summary = trim($commit->getSummary());
     if ($commit->getAuthorPHID()) {
         $author = $handles[$commit->getAuthorPHID()]->getName();
     }
     return "{$summary}\n{$date} · {$author}";
 }
 /**
  * Return a map of available audit actions for rendering into a <select />.
  * This shows the user valid actions, and does not show nonsense/invalid
  * actions (like closing an already-closed commit, or resigning from a commit
  * you have no association with).
  */
 private function getAuditActions(PhabricatorRepositoryCommit $commit, array $audit_requests)
 {
     assert_instances_of($audit_requests, 'PhabricatorRepositoryAuditRequest');
     $user = $this->getRequest()->getUser();
     $user_is_author = $commit->getAuthorPHID() == $user->getPHID();
     $user_request = null;
     foreach ($audit_requests as $audit_request) {
         if ($audit_request->getAuditorPHID() == $user->getPHID()) {
             $user_request = $audit_request;
             break;
         }
     }
     $actions = array();
     $actions[PhabricatorAuditActionConstants::COMMENT] = true;
     $actions[PhabricatorAuditActionConstants::ADD_CCS] = true;
     $actions[PhabricatorAuditActionConstants::ADD_AUDITORS] = true;
     // We allow you to accept your own commits. A use case here is that you
     // notice an issue with your own commit and "Raise Concern" as an indicator
     // to other auditors that you're on top of the issue, then later resolve it
     // and "Accept". You can not accept on behalf of projects or packages,
     // however.
     $actions[PhabricatorAuditActionConstants::ACCEPT] = true;
     $actions[PhabricatorAuditActionConstants::CONCERN] = true;
     // To resign, a user must have authority on some request and not be the
     // commit's author.
     if (!$user_is_author) {
         $may_resign = false;
         $authority_map = array_fill_keys($this->auditAuthorityPHIDs, true);
         foreach ($audit_requests as $request) {
             if (empty($authority_map[$request->getAuditorPHID()])) {
                 continue;
             }
             $may_resign = true;
             break;
         }
         // If the user has already resigned, don't show "Resign...".
         $status_resigned = PhabricatorAuditStatusConstants::RESIGNED;
         if ($user_request) {
             if ($user_request->getAuditStatus() == $status_resigned) {
                 $may_resign = false;
             }
         }
         if ($may_resign) {
             $actions[PhabricatorAuditActionConstants::RESIGN] = true;
         }
     }
     $status_concern = PhabricatorAuditCommitStatusConstants::CONCERN_RAISED;
     $concern_raised = $commit->getAuditStatus() == $status_concern;
     $can_close_option = PhabricatorEnv::getEnvConfig('audit.can-author-close-audit');
     if ($can_close_option && $user_is_author && $concern_raised) {
         $actions[PhabricatorAuditActionConstants::CLOSE] = true;
     }
     foreach ($actions as $constant => $ignored) {
         $actions[$constant] = PhabricatorAuditActionConstants::getActionName($constant);
     }
     return $actions;
 }
 private function publishFeedStory(PhabricatorRepository $repository, PhabricatorRepositoryCommit $commit, PhabricatorRepositoryCommitData $data)
 {
     if (time() > $commit->getEpoch() + 24 * 60 * 60) {
         // Don't publish stories that are more than 24 hours old, to avoid
         // ridiculous levels of feed spam if a repository is imported without
         // disabling feed publishing.
         return;
     }
     $author_phid = $commit->getAuthorPHID();
     $committer_phid = $data->getCommitDetail('committerPHID');
     $publisher = new PhabricatorFeedStoryPublisher();
     $publisher->setStoryType(PhabricatorFeedStoryTypeConstants::STORY_COMMIT);
     $publisher->setStoryData(array('commitPHID' => $commit->getPHID(), 'summary' => $data->getSummary(), 'authorName' => $data->getAuthorName(), 'authorPHID' => $author_phid, 'committerName' => $data->getCommitDetail('committer'), 'committerPHID' => $committer_phid));
     $publisher->setStoryTime($commit->getEpoch());
     $publisher->setRelatedPHIDs(array_filter(array($author_phid, $committer_phid)));
     if ($author_phid) {
         $publisher->setStoryAuthorPHID($author_phid);
     }
     $publisher->publish();
 }