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