diff --git a/src/applications/repository/engine/__tests__/data/CHD.svn.tgz b/src/applications/repository/engine/__tests__/data/CHD.svn.tgz new file mode 100644 index 0000000000000000000000000000000000000000..0a4d0a5700414b36e6c72445d35dc7310d9f464a GIT binary patch literal 9437 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

TNd`QOKfj}Ob28$Npdv>~$9mOFNlr;65$ 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 literal 0 HcmV?d00001 diff --git a/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php b/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php index 616de159d4..54bbdd74c8 100644 --- a/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php +++ b/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php @@ -952,6 +952,110 @@ final class PhabricatorChangeParserTestCase )); } + public function testSubversionPartialParser() { + $repository = $this->buildBareRepository('CHD'); + $repository->setDetail('svn-subpath', 'trunk/'); + + id(new PhabricatorRepositoryPullEngine()) + ->setRepository($repository) + ->pullRepository(); + + id(new PhabricatorRepositoryDiscoveryEngine()) + ->setRepository($repository) + ->discoverCommits($repository); + + $viewer = PhabricatorUser::getOmnipotentUser(); + + $commits = id(new DiffusionCommitQuery()) + ->setViewer($viewer) + ->withRepositoryIDs(array($repository->getID())) + ->execute(); + + $this->expectChanges( + $repository, + $commits, + array( + // Copy of a file outside of the subpath from an earlier revision + // into the subpath. + 4 => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 4, + ), + array( + '/goat', + null, + null, + DifferentialChangeType::TYPE_COPY_AWAY, + DifferentialChangeType::FILE_NORMAL, + 0, + 4, + ), + array( + '/trunk', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 4, + ), + array( + '/trunk/goat', + '/goat', + '1', + DifferentialChangeType::TYPE_COPY_HERE, + DifferentialChangeType::FILE_NORMAL, + 1, + 4, + ), + ), + 3 => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 3, + ), + array( + '/trunk', + null, + null, + DifferentialChangeType::TYPE_ADD, + DifferentialChangeType::FILE_DIRECTORY, + 1, + 3, + ), + array( + '/trunk/apple', + null, + null, + DifferentialChangeType::TYPE_ADD, + DifferentialChangeType::FILE_NORMAL, + 1, + 3, + ), + array( + '/trunk/banana', + null, + null, + DifferentialChangeType::TYPE_ADD, + DifferentialChangeType::FILE_NORMAL, + 1, + 3, + ), + ), + )); + } + private function expectChanges( PhabricatorRepository $repository, array $commits, @@ -1023,7 +1127,10 @@ final class PhabricatorChangeParserTestCase ksort($dicts); ksort($expect_changes); - $this->assertEqual($expect_changes, $dicts); + $this->assertEqual( + $expect_changes, + $dicts, + pht('Commit %s', $commit_identifier)); } }