[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

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

   1  <?php
   2  
   3  final class PhabricatorRepositoryCommitHeraldWorker
   4    extends PhabricatorRepositoryCommitParserWorker {
   5  
   6  
   7    public function getRequiredLeaseTime() {
   8      // Herald rules may take a long time to process.
   9      return phutil_units('4 hours in seconds');
  10    }
  11  
  12    public function parseCommit(
  13      PhabricatorRepository $repository,
  14      PhabricatorRepositoryCommit $commit) {
  15  
  16      // Reload the commit to pull commit data and audit requests.
  17      $commit = id(new DiffusionCommitQuery())
  18        ->setViewer(PhabricatorUser::getOmnipotentUser())
  19        ->withIDs(array($commit->getID()))
  20        ->needCommitData(true)
  21        ->needAuditRequests(true)
  22        ->executeOne();
  23      $data = $commit->getCommitData();
  24  
  25      if (!$data) {
  26        throw new PhabricatorWorkerPermanentFailureException(
  27          pht(
  28            'Unable to load commit data. The data for this task is invalid '.
  29            'or no longer exists.'));
  30      }
  31  
  32      $commit->attachRepository($repository);
  33  
  34      $content_source = PhabricatorContentSource::newForSource(
  35        PhabricatorContentSource::SOURCE_DAEMON,
  36        array());
  37  
  38      $committer_phid = $data->getCommitDetail('committerPHID');
  39      $author_phid = $data->getCommitDetail('authorPHID');
  40      $acting_as_phid = nonempty(
  41        $committer_phid,
  42        $author_phid,
  43        id(new PhabricatorDiffusionApplication())->getPHID());
  44  
  45      $editor = id(new PhabricatorAuditEditor())
  46        ->setActor(PhabricatorUser::getOmnipotentUser())
  47        ->setActingAsPHID($acting_as_phid)
  48        ->setContentSource($content_source);
  49  
  50      $xactions = array();
  51      $xactions[] = id(new PhabricatorAuditTransaction())
  52        ->setTransactionType(PhabricatorAuditTransaction::TYPE_COMMIT)
  53        ->setDateCreated($commit->getEpoch())
  54        ->setNewValue(array(
  55          'description'   => $data->getCommitMessage(),
  56          'summary'       => $data->getSummary(),
  57          'authorName'    => $data->getAuthorName(),
  58          'authorPHID'    => $commit->getAuthorPHID(),
  59          'committerName' => $data->getCommitDetail('committer'),
  60          'committerPHID' => $data->getCommitDetail('committerPHID'),
  61        ));
  62      try {
  63        $raw_patch = $this->loadRawPatchText($repository, $commit);
  64      } catch (Exception $ex) {
  65        $raw_patch = pht('Unable to generate patch: %s', $ex->getMessage());
  66      }
  67      $editor->setRawPatch($raw_patch);
  68      return $editor->applyTransactions($commit, $xactions);
  69    }
  70  
  71    private function loadRawPatchText(
  72      PhabricatorRepository $repository,
  73      PhabricatorRepositoryCommit $commit) {
  74  
  75      $drequest = DiffusionRequest::newFromDictionary(
  76        array(
  77          'user' => PhabricatorUser::getOmnipotentUser(),
  78          'initFromConduit' => false,
  79          'repository' => $repository,
  80          'commit' => $commit->getCommitIdentifier(),
  81        ));
  82  
  83      $raw_query = DiffusionRawDiffQuery::newFromDiffusionRequest($drequest);
  84      $raw_query->setLinesOfContext(3);
  85  
  86      $time_key = 'metamta.diffusion.time-limit';
  87      $byte_key = 'metamta.diffusion.byte-limit';
  88      $time_limit = PhabricatorEnv::getEnvConfig($time_key);
  89      $byte_limit = PhabricatorEnv::getEnvConfig($byte_key);
  90  
  91      if ($time_limit) {
  92        $raw_query->setTimeout($time_limit);
  93      }
  94  
  95      $raw_diff = $raw_query->loadRawDiff();
  96  
  97      $size = strlen($raw_diff);
  98      if ($byte_limit && $size > $byte_limit) {
  99        $pretty_size = phutil_format_bytes($size);
 100        $pretty_limit = phutil_format_bytes($byte_limit);
 101        throw new Exception(pht(
 102          'Patch size of %s exceeds configured byte size limit (%s) of %s.',
 103          $pretty_size,
 104          $byte_key,
 105          $pretty_limit));
 106      }
 107  
 108      return $raw_diff;
 109    }
 110  
 111  }


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