protected function execute(ConduitAPIRequest $request)
 {
     $corpus = $request->getValue('corpus');
     try {
         $message = DifferentialCommitMessage::newFromRawCorpus($corpus);
     } catch (DifferentialCommitMessageParserException $ex) {
         return array('error' => $ex->getMessage());
     }
     return array('error' => null, 'fields' => array('title' => $message->getTitle(), 'summary' => $message->getSummary(), 'testPlan' => $message->getTestPlan(), 'blameRevision' => $message->getBlameRevision(), 'revertPlan' => $message->getRevertPlan(), 'reviewerPHIDs' => $message->getReviewerPHIDs(), 'reviewedByPHIDs' => $message->getReviewedByPHIDs(), 'ccPHIDs' => $message->getCCPHIDs(), 'revisionID' => $message->getRevisionID(), 'gitSVNID' => $message->getGitSVNID(), 'tasks' => $message->getTasks()));
 }
 public static function newFromRawCorpus($raw_corpus)
 {
     $message = new DifferentialCommitMessage();
     $message->setRawCorpus($raw_corpus);
     $fields = $message->parseFields($raw_corpus);
     foreach ($fields as $field => $data) {
         switch ($field) {
             case 'Title':
                 $message->setTitle($data);
                 break;
             case 'Differential Revision':
                 $message->setRevisionID($data);
                 break;
             case 'Summary':
                 $message->setSummary($data);
                 break;
             case 'Test Plan':
                 $message->setTestPlan($data);
                 break;
             case 'Blame Revision':
                 $message->setBlameRevision($data);
                 break;
             case 'Revert Plan':
                 $message->setRevertPlan($data);
                 break;
             case 'Reviewers':
                 $message->setReviewerNames($data);
                 break;
             case 'Reviewed By':
                 $message->setReviewedByNames($data);
                 break;
             case 'CC':
                 $message->setCCNames($data);
                 break;
             case 'git-svn-id':
                 $message->setGitSVNID($data);
                 break;
             case 'Commenters':
                 // Just drop this.
                 break;
             case 'Tasks':
                 $message->setTasks($data);
                 break;
             default:
                 throw new Exception("Unrecognized field '{$field}'.");
         }
     }
     $need_users = array_merge($message->getReviewerNames(), $message->getReviewedByNames(), $message->getCCNames());
     $need_mail = $message->getCCNames();
     if ($need_users) {
         $users = id(new PhabricatorUser())->loadAllWhere('(username IN (%Ls)) OR (email IN (%Ls))', $need_users, $need_users);
         $users = mpull($users, 'getPHID', 'getUsername') + mpull($users, 'getPHID', 'getEmail');
     } else {
         $users = array();
     }
     if ($need_mail) {
         $mail = id(new PhabricatorMetaMTAMailingList())->loadAllWhere('(email in (%Ls)) OR (name IN (%Ls))', $need_mail, $need_mail);
         $mail = mpull($mail, 'getPHID', 'getName') + mpull($mail, 'getPHID', 'getEmail');
     } else {
         $mail = array();
     }
     $reviewer_phids = array();
     foreach ($message->getReviewerNames() as $name) {
         $phid = idx($users, $name);
         if (!$phid) {
             throw new DifferentialCommitMessageParserException("Commit message references nonexistent 'Reviewer' value '" . $name . "'");
         }
         $reviewer_phids[] = $phid;
     }
     $message->setReviewerPHIDs($reviewer_phids);
     $reviewed_by_phids = array();
     foreach ($message->getReviewedByNames() as $name) {
         $phid = idx($users, $name);
         if (!$phid) {
             throw new DifferentialCommitMessageParserException("Commit message references nonexistent 'Reviewed by' value '" . $name . "'");
         }
         $reviewed_by_phids[] = $phid;
     }
     $message->setReviewedByPHIDs($reviewed_by_phids);
     $cc_phids = array();
     foreach ($message->getCCNames() as $name) {
         $phid = idx($users, $name);
         if (!$phid) {
             $phid = idx($mail, $name);
         }
         if (!$phid) {
             throw new DifferentialCommitMessageParserException("Commit message references nonexistent 'CC' value '" . $name . "'");
         }
         $cc_phids[] = $phid;
     }
     $message->setCCPHIDs($cc_phids);
     return $message;
 }