diff --git a/src/applications/repository/engine/PhabricatorRepositoryEngine.php b/src/applications/repository/engine/PhabricatorRepositoryEngine.php --- a/src/applications/repository/engine/PhabricatorRepositoryEngine.php +++ b/src/applications/repository/engine/PhabricatorRepositoryEngine.php @@ -119,6 +119,7 @@ $options = array( 'priority' => $task_priority, 'objectPHID' => $commit_phid, + 'containerPHID' => $repository->getPHID(), ); PhabricatorWorker::scheduleTask($class, $data, $options); diff --git a/src/applications/repository/management/PhabricatorRepositoryManagementReparseWorkflow.php b/src/applications/repository/management/PhabricatorRepositoryManagementReparseWorkflow.php --- a/src/applications/repository/management/PhabricatorRepositoryManagementReparseWorkflow.php +++ b/src/applications/repository/management/PhabricatorRepositoryManagementReparseWorkflow.php @@ -249,6 +249,7 @@ $spec = array( 'commitID' => $commit->getID(), 'only' => !$importing, + 'via' => 'reparse', ); foreach ($classes as $class) { @@ -258,6 +259,8 @@ $spec, array( 'priority' => PhabricatorWorker::PRIORITY_IMPORT, + 'objectPHID' => $commit->getPHID(), + 'containerPHID' => $repository->getPHID(), )); } catch (PhabricatorWorkerPermanentFailureException $ex) { // See T13315. We expect some reparse steps to occasionally raise diff --git a/src/applications/repository/worker/PhabricatorRepositoryCommitParserWorker.php b/src/applications/repository/worker/PhabricatorRepositoryCommitParserWorker.php --- a/src/applications/repository/worker/PhabricatorRepositoryCommitParserWorker.php +++ b/src/applications/repository/worker/PhabricatorRepositoryCommitParserWorker.php @@ -51,10 +51,42 @@ $this->parseCommit($repository, $this->commit); } - final protected function shouldQueueFollowupTasks() { + private function shouldQueueFollowupTasks() { return !idx($this->getTaskData(), 'only'); } + final protected function queueCommitTask($task_class) { + if (!$this->shouldQueueFollowupTasks()) { + return; + } + + $commit = $this->loadCommit(); + $repository = $commit->getRepository(); + + $data = array( + 'commitID' => $commit->getID(), + ); + + $task_data = $this->getTaskData(); + if (isset($task_data['via'])) { + $data['via'] = $task_data['via']; + } + + $options = array( + // We queue followup tasks at default priority so that the queue finishes + // work it has started before starting more work. If followups are queued + // at the same priority level, we do all message parses first, then all + // change parses, etc. This makes progress uneven. See T11677 for + // discussion. + 'priority' => parent::PRIORITY_DEFAULT, + + 'objectPHID' => $commit->getPHID(), + 'containerPHID' => $repository->getPHID(), + ); + + $this->queueTask($task_class, $data, $options); + } + protected function getImportStepFlag() { return null; } diff --git a/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php b/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php --- a/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php +++ b/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php @@ -396,6 +396,8 @@ } public function testSubversionParser() { + $this->requireBinaryForTest('svn'); + $repository = $this->buildDiscoveredRepository('CHC'); $viewer = PhabricatorUser::getOmnipotentUser(); @@ -955,6 +957,8 @@ } public function testSubversionPartialParser() { + $this->requireBinaryForTest('svn'); + $repository = $this->buildBareRepository('CHD'); $repository->setDetail('svn-subpath', 'trunk/'); @@ -1059,6 +1063,8 @@ } public function testSubversionValidRootParser() { + $this->requireBinaryForTest('svn'); + // First, automatically configure the root correctly. $repository = $this->buildBareRepository('CHD'); id(new PhabricatorRepositoryPullEngine()) @@ -1104,6 +1110,8 @@ } public function testSubversionForeignStubsParser() { + $this->requireBinaryForTest('svn'); + $repository = $this->buildBareRepository('CHE'); $repository->setDetail('svn-subpath', 'branch/'); diff --git a/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php b/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php --- a/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php +++ b/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php @@ -99,14 +99,7 @@ } protected function finishParse() { - $commit = $this->commit; - if ($this->shouldQueueFollowupTasks()) { - $this->queueTask( - 'PhabricatorRepositoryCommitPublishWorker', - array( - 'commitID' => $commit->getID(), - )); - } + $this->queueCommitTask('PhabricatorRepositoryCommitPublishWorker'); } private function writeCommitChanges( diff --git a/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php b/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php --- a/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php +++ b/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php @@ -24,21 +24,7 @@ $this->updateCommitData($commit, $data); } - if ($this->shouldQueueFollowupTasks()) { - $this->queueTask( - $this->getFollowupTaskClass(), - array( - 'commitID' => $commit->getID(), - ), - array( - // We queue followup tasks at default priority so that the queue - // finishes work it has started before starting more work. If - // followups are queued at the same priority level, we do all - // message parses first, then all change parses, etc. This makes - // progress uneven. See T11677 for discussion. - 'priority' => PhabricatorWorker::PRIORITY_DEFAULT, - )); - } + $this->queueCommitTask($this->getFollowupTaskClass()); } final protected function updateCommitData(