[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/repository/worker/ -> PhabricatorRepositoryCommitOwnersWorker.php (source)

   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  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1