diff --git a/src/applications/repository/engine/__tests__/data/CHC.svn.tgz b/src/applications/repository/engine/__tests__/data/CHC.svn.tgz new file mode 100644 index 0000000000000000000000000000000000000000..93da53515b9b0bfad18205cf29aa5d9e9fcc54bb GIT binary patch literal 10048 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 W*d~>QgRo}#FK;FO#hbx_kpTdF*!*7r literal 0 HcmV?d00001 diff --git a/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php b/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php index 913fa4678f..1194c8922b 100644 --- a/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php +++ b/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php @@ -393,6 +393,199 @@ final class PhabricatorChangeParserTestCase )); } + public function testSubversionParser() { + $repository = $this->buildDiscoveredRepository('CHC'); + $viewer = PhabricatorUser::getOmnipotentUser(); + + $commits = id(new DiffusionCommitQuery()) + ->setViewer($viewer) + ->withRepositoryIDs(array($repository->getID())) + ->execute(); + + $this->expectChanges( + $repository, + $commits, + array( + '7' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 7, + ), + array( + '/file_moved', + null, + null, + DifferentialChangeType::TYPE_CHANGE, + DifferentialChangeType::FILE_NORMAL, + 1, + 7, + ), + ), + + '6' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 6, + ), + array( + '/file_link', + null, + null, + DifferentialChangeType::TYPE_ADD, + // TODO: This is not correct, and should be FILE_SYMLINK. + DifferentialChangeType::FILE_NORMAL, + 1, + 6, + ), + ), + + '5' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 5, + ), + array( + '/dir', + null, + null, + DifferentialChangeType::TYPE_ADD, + DifferentialChangeType::FILE_DIRECTORY, + 1, + 5, + ), + array( + '/dir/subfile', + null, + null, + DifferentialChangeType::TYPE_ADD, + DifferentialChangeType::FILE_NORMAL, + 1, + 5, + ), + ), + + '4' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 4, + ), + array( + '/file', + null, + null, + DifferentialChangeType::TYPE_MOVE_AWAY, + DifferentialChangeType::FILE_NORMAL, + 1, + 4, + ), + array( + '/file_moved', + '/file', + '2', + DifferentialChangeType::TYPE_MOVE_HERE, + DifferentialChangeType::FILE_NORMAL, + 1, + 4, + ), + ), + + '3' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 3, + ), + array( + '/file', + null, + null, + DifferentialChangeType::TYPE_COPY_AWAY, + DifferentialChangeType::FILE_NORMAL, + 0, + 3, + ), + array( + '/file_copy', + '/file', + '2', + DifferentialChangeType::TYPE_COPY_HERE, + DifferentialChangeType::FILE_NORMAL, + 1, + 3, + ), + ), + + '2' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 2, + ), + array( + '/file', + null, + null, + DifferentialChangeType::TYPE_CHANGE, + DifferentialChangeType::FILE_NORMAL, + 1, + 2, + ), + ), + + '1' => array( + array( + '/', + null, + null, + // The Git and Svn parsers don't recognize the first commit as + // creating "/", while the Mercurial parser does. All the parsers + // should probably behave like the Mercurial parser. + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 1, + ), + array( + '/file', + null, + null, + DifferentialChangeType::TYPE_ADD, + DifferentialChangeType::FILE_NORMAL, + 1, + 1, + ), + ), + )); + } + private function expectChanges( PhabricatorRepository $repository, array $commits, @@ -405,6 +598,9 @@ final class PhabricatorChangeParserTestCase case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: $parser = 'PhabricatorRepositoryMercurialCommitChangeParserWorker'; break; + case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: + $parser = 'PhabricatorRepositorySvnCommitChangeParserWorker'; + break; default: throw new Exception(pht('No support yet.')); } @@ -448,7 +644,7 @@ final class PhabricatorChangeParserTestCase $dicts[$key] = array( $path_map[(int)$change->getPathID()], $target_path, - $target_commit, + $target_commit ? (string)$target_commit : null, (int)$change->getChangeType(), (int)$change->getFileType(), (int)$change->getIsDirect(), diff --git a/src/applications/repository/worker/commitchangeparser/PhabricatorRepositorySvnCommitChangeParserWorker.php b/src/applications/repository/worker/commitchangeparser/PhabricatorRepositorySvnCommitChangeParserWorker.php index b09eefdda6..2aaaf17c33 100644 --- a/src/applications/repository/worker/commitchangeparser/PhabricatorRepositorySvnCommitChangeParserWorker.php +++ b/src/applications/repository/worker/commitchangeparser/PhabricatorRepositorySvnCommitChangeParserWorker.php @@ -29,7 +29,7 @@ final class PhabricatorRepositorySvnCommitChangeParserWorker // Pull the top-level path changes out of "svn log". This is pretty // straightforward; just parse the XML log. - $log = $this->getSVNLogXMLObject($uri, $svn_commit); + $log = $this->getSVNLogXMLObject($repository, $uri, $svn_commit); $entry = $log->logentry[0]; @@ -357,58 +357,50 @@ final class PhabricatorRepositorySvnCommitChangeParserWorker $path_map = $this->lookupOrCreatePaths($lookup_paths); $commit_map = $this->lookupSvnCommits($repository, $lookup_commits); - $this->writeChanges($repository, $commit, $effects, $path_map, $commit_map); $this->writeBrowse($repository, $commit, $effects, $path_map); - return array(); + return $this->buildChanges( + $repository, + $commit, + $effects, + $path_map, + $commit_map); } - private function writeChanges( + private function buildChanges( PhabricatorRepository $repository, PhabricatorRepositoryCommit $commit, array $effects, array $path_map, array $commit_map) { - $conn_w = $repository->establishConnection('w'); - - $sql = array(); + $results = array(); foreach ($effects as $effect) { - $sql[] = qsprintf( - $conn_w, - '(%d, %d, %d, %nd, %nd, %d, %d, %d, %d)', - $repository->getID(), - $path_map[$effect['rawPath']], - $commit->getID(), - $effect['rawTargetPath'] - ? $path_map[$effect['rawTargetPath']] - : null, - $effect['rawTargetCommit'] - ? $commit_map[$effect['rawTargetCommit']] - : null, - $effect['changeType'], - $effect['fileType'], - $effect['rawDirect'] - ? 1 - : 0, - $commit->getCommitIdentifier()); - } + $path_id = $path_map[$effect['rawPath']]; - queryfx( - $conn_w, - 'DELETE FROM %T WHERE commitID = %d', - PhabricatorRepository::TABLE_PATHCHANGE, - $commit->getID()); - foreach (array_chunk($sql, 512) as $sql_chunk) { - queryfx( - $conn_w, - 'INSERT INTO %T - (repositoryID, pathID, commitID, targetPathID, targetCommitID, - changeType, fileType, isDirect, commitSequence) - VALUES %Q', - PhabricatorRepository::TABLE_PATHCHANGE, - implode(', ', $sql_chunk)); + $target_path_id = null; + if ($effect['rawTargetPath']) { + $target_path_id = $path_map[$effect['rawTargetPath']]; + } + + $target_commit_id = null; + if ($effect['rawTargetCommit']) { + $target_commit_id = $commit_map[$effect['rawTargetCommit']]; + } + + $result = id(new PhabricatorRepositoryParsedChange()) + ->setPathID($path_id) + ->setTargetPathID($target_path_id) + ->setTargetCommitID($target_commit_id) + ->setChangeType($effect['changeType']) + ->setFileType($effect['fileType']) + ->setIsDirect($effect['rawDirect']) + ->setCommitSequence($commit->getCommitIdentifier()); + + $results[] = $result; } + + return $results; } private function writeBrowse( @@ -771,13 +763,12 @@ final class PhabricatorRepositorySvnCommitChangeParserWorker return $parents; } - /** - * This method is kind of awkward here but both the SVN message and - * change parsers use it. - */ - private function getSVNLogXMLObject($uri, $revision) { - list($xml) = $this->repository->execxRemoteCommand( - "log --xml --verbose --limit 1 %s@%d", + private function getSVNLogXMLObject( + PhabricatorRepository $repository, + $uri, + $revision) { + list($xml) = $repository->execxRemoteCommand( + 'log --xml --verbose --limit 1 %s@%d', $uri, $revision);