[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class PhabricatorRepositoryCommitOwnersWorker 4 extends PhabricatorRepositoryCommitParserWorker { 5 6 protected function parseCommit( 7 PhabricatorRepository $repository, 8 PhabricatorRepositoryCommit $commit) { 9 10 $this->triggerOwnerAudits($repository, $commit); 11 12 $commit->writeImportStatusFlag( 13 PhabricatorRepositoryCommit::IMPORTED_OWNERS); 14 15 if ($this->shouldQueueFollowupTasks()) { 16 $this->queueTask( 17 'PhabricatorRepositoryCommitHeraldWorker', 18 array( 19 'commitID' => $commit->getID(), 20 )); 21 } 22 } 23 24 private function triggerOwnerAudits( 25 PhabricatorRepository $repository, 26 PhabricatorRepositoryCommit $commit) { 27 28 if ($repository->getDetail('herald-disabled')) { 29 return; 30 } 31 32 $affected_paths = PhabricatorOwnerPathQuery::loadAffectedPaths( 33 $repository, 34 $commit, 35 PhabricatorUser::getOmnipotentUser()); 36 $affected_packages = PhabricatorOwnersPackage::loadAffectedPackages( 37 $repository, 38 $affected_paths); 39 40 if ($affected_packages) { 41 $requests = id(new PhabricatorRepositoryAuditRequest()) 42 ->loadAllWhere( 43 'commitPHID = %s', 44 $commit->getPHID()); 45 $requests = mpull($requests, null, 'getAuditorPHID'); 46 47 foreach ($affected_packages as $package) { 48 $request = idx($requests, $package->getPHID()); 49 if ($request) { 50 // Don't update request if it exists already. 51 continue; 52 } 53 54 if ($package->getAuditingEnabled()) { 55 $reasons = $this->checkAuditReasons($commit, $package); 56 if ($reasons) { 57 $audit_status = 58 PhabricatorAuditStatusConstants::AUDIT_REQUIRED; 59 } else { 60 $audit_status = 61 PhabricatorAuditStatusConstants::AUDIT_NOT_REQUIRED; 62 } 63 } else { 64 $reasons = array(); 65 $audit_status = PhabricatorAuditStatusConstants::NONE; 66 } 67 68 $relationship = new PhabricatorRepositoryAuditRequest(); 69 $relationship->setAuditorPHID($package->getPHID()); 70 $relationship->setCommitPHID($commit->getPHID()); 71 $relationship->setAuditReasons($reasons); 72 $relationship->setAuditStatus($audit_status); 73 74 $relationship->save(); 75 76 $requests[$package->getPHID()] = $relationship; 77 } 78 79 $commit->updateAuditStatus($requests); 80 $commit->save(); 81 } 82 } 83 84 private function checkAuditReasons( 85 PhabricatorRepositoryCommit $commit, 86 PhabricatorOwnersPackage $package) { 87 88 $data = id(new PhabricatorRepositoryCommitData())->loadOneWhere( 89 'commitID = %d', 90 $commit->getID()); 91 92 $reasons = array(); 93 94 if ($data->getCommitDetail('vsDiff')) { 95 $reasons[] = 'Changed After Revision Was Accepted'; 96 } 97 98 $commit_author_phid = $data->getCommitDetail('authorPHID'); 99 if (!$commit_author_phid) { 100 $reasons[] = 'Commit Author Not Recognized'; 101 } 102 103 $revision_id = $data->getCommitDetail('differential.revisionID'); 104 105 $revision_author_phid = null; 106 $commit_reviewedby_phid = null; 107 108 if ($revision_id) { 109 // TODO: (T603) This is probably safe to use an omnipotent user on, 110 // but check things more closely. 111 $revision = id(new DifferentialRevision())->load($revision_id); 112 if ($revision) { 113 $revision_author_phid = $revision->getAuthorPHID(); 114 $commit_reviewedby_phid = $data->getCommitDetail('reviewerPHID'); 115 if ($revision_author_phid !== $commit_author_phid) { 116 $reasons[] = 'Author Not Matching with Revision'; 117 } 118 } else { 119 $reasons[] = 'Revision Not Found'; 120 } 121 122 } else { 123 $reasons[] = 'No Revision Specified'; 124 } 125 126 $owners_phids = PhabricatorOwnersOwner::loadAffiliatedUserPHIDs( 127 array($package->getID())); 128 129 if (!($commit_author_phid && in_array($commit_author_phid, $owners_phids) || 130 $commit_reviewedby_phid && in_array($commit_reviewedby_phid, 131 $owners_phids))) { 132 $reasons[] = 'Owners Not Involved'; 133 } 134 135 return $reasons; 136 } 137 138 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |