diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index e18b4da7cf..9952609586 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1255,6 +1255,7 @@ phutil_register_library_map(array( 'PhabricatorCalendarHolidayTestCase' => 'applications/calendar/storage/__tests__/PhabricatorCalendarHolidayTestCase.php', 'PhabricatorCalendarViewStatusController' => 'applications/calendar/controller/PhabricatorCalendarViewStatusController.php', 'PhabricatorCampfireProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorCampfireProtocolAdapter.php', + 'PhabricatorChangeParserTestCase' => 'applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php', 'PhabricatorChangesetResponse' => 'infrastructure/diff/PhabricatorChangesetResponse.php', 'PhabricatorChatLogChannel' => 'applications/chatlog/storage/PhabricatorChatLogChannel.php', 'PhabricatorChatLogChannelListController' => 'applications/chatlog/controller/PhabricatorChatLogChannelListController.php', @@ -3846,6 +3847,7 @@ phutil_register_library_map(array( 'PhabricatorCalendarHolidayTestCase' => 'PhabricatorTestCase', 'PhabricatorCalendarViewStatusController' => 'PhabricatorCalendarController', 'PhabricatorCampfireProtocolAdapter' => 'PhabricatorBotBaseStreamingProtocolAdapter', + 'PhabricatorChangeParserTestCase' => 'PhabricatorWorkingCopyTestCase', 'PhabricatorChangesetResponse' => 'AphrontProxyResponse', 'PhabricatorChatLogChannel' => array( diff --git a/src/applications/repository/engine/__tests__/PhabricatorWorkingCopyTestCase.php b/src/applications/repository/engine/__tests__/PhabricatorWorkingCopyTestCase.php index 336a8fe89d..ab1ea5ebca 100644 --- a/src/applications/repository/engine/__tests__/PhabricatorWorkingCopyTestCase.php +++ b/src/applications/repository/engine/__tests__/PhabricatorWorkingCopyTestCase.php @@ -76,9 +76,18 @@ abstract class PhabricatorWorkingCopyTestCase extends PhabricatorTestCase { ->setRepository($repository) ->pullRepository(); - $this->pulled[$callsign] = true; + return $repository; + } + + protected function buildDiscoveredRepository($callsign) { + $repository = $this->buildPulledRepository($callsign); + + id(new PhabricatorRepositoryDiscoveryEngine()) + ->setRepository($repository) + ->discoverCommits($repository); return $repository; } + } diff --git a/src/applications/repository/engine/__tests__/data/CHA.git.tgz b/src/applications/repository/engine/__tests__/data/CHA.git.tgz new file mode 100644 index 0000000000000000000000000000000000000000..7b625e6f7fbd63970356bb25d907fbbacbdc270d GIT binary patch literal 10466 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 QP5#t}D_`knaA0Hr05Nn#1ONa4 literal 0 HcmV?d00001 diff --git a/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php b/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php new file mode 100644 index 0000000000..4805b95578 --- /dev/null +++ b/src/applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php @@ -0,0 +1,275 @@ +buildDiscoveredRepository('CHA'); + $viewer = PhabricatorUser::getOmnipotentUser(); + + $commits = id(new DiffusionCommitQuery()) + ->setViewer($viewer) + ->withRepositoryIDs(array($repository->getID())) + ->execute(); + + $this->expectChanges( + $repository, + $commits, + array( + // 8ebb73c add +x + '8ebb73c3f127625ad090472f4f3bfc72804def54' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 1389892449, + ), + array( + '/file_moved', + null, + null, + DifferentialChangeType::TYPE_CHANGE, + DifferentialChangeType::FILE_NORMAL, + 1, + 1389892449, + ), + ), + + // ee9c790 add symlink + 'ee9c7909e012da7d75e8e1293c7803a6e73ac26a' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 1389892436, + ), + array( + '/file_link', + null, + null, + DifferentialChangeType::TYPE_ADD, + DifferentialChangeType::FILE_SYMLINK, + 1, + 1389892436, + ), + ), + + // 7260ca4 add directory file + '7260ca4b6cec35e755bb5365c4ccdd3f1977772e' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 1389892408, + ), + array( + '/dir', + null, + null, + DifferentialChangeType::TYPE_ADD, + DifferentialChangeType::FILE_DIRECTORY, + 1, + 1389892408, + ), + array( + '/dir/subfile', + null, + null, + DifferentialChangeType::TYPE_ADD, + DifferentialChangeType::FILE_NORMAL, + 1, + 1389892408, + ), + ), + + // 1fe783c move a file + '1fe783cf207c1e5f3e01650d2d9cb80b8a707f0e' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 1389892388, + ), + array( + '/file', + null, + null, + DifferentialChangeType::TYPE_MOVE_AWAY, + DifferentialChangeType::FILE_NORMAL, + 1, + 1389892388, + ), + array( + '/file_moved', + '/file', + '1fe783cf207c1e5f3e01650d2d9cb80b8a707f0e', + DifferentialChangeType::TYPE_MOVE_HERE, + DifferentialChangeType::FILE_NORMAL, + 1, + 1389892388, + ), + ), + + // 376af8c copy a file + '376af8cd8f5b96ec55b7d9a86ccc85b8df8fb833' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 1389892377, + ), + array( + '/file', + null, + null, + DifferentialChangeType::TYPE_COPY_AWAY, + DifferentialChangeType::FILE_NORMAL, + 0, + 1389892377, + ), + array( + '/file_copy', + '/file', + '376af8cd8f5b96ec55b7d9a86ccc85b8df8fb833', + DifferentialChangeType::TYPE_COPY_HERE, + DifferentialChangeType::FILE_NORMAL, + 1, + 1389892377, + ), + ), + + // ece6ea6 changed a file + 'ece6ea6c6836e8b11a103e21707b8f30e6840c94' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + 0, + 1389892352, + ), + array( + '/file', + null, + null, + DifferentialChangeType::TYPE_CHANGE, + DifferentialChangeType::FILE_NORMAL, + 1, + 1389892352, + ), + ), + + // 513103f added a file + '513103f65b8413dd2f1a1b5c1d4852a4a598540f' => array( + array( + '/', + null, + null, + DifferentialChangeType::TYPE_CHILD, + DifferentialChangeType::FILE_DIRECTORY, + // This is the initial commit and technically created this + // directory; arguably the parser should figure this out and + // mark this as a direct change. + 0, + 1389892330, + ), + array( + '/file', + null, + null, + DifferentialChangeType::TYPE_ADD, + DifferentialChangeType::FILE_NORMAL, + 1, + 1389892330, + ), + ), + )); + } + + private function expectChanges( + PhabricatorRepository $repository, + array $commits, + array $expect) { + + switch ($repository->getVersionControlSystem()) { + case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: + $parser = 'PhabricatorRepositoryGitCommitChangeParserWorker'; + break; + default: + throw new Exception(pht('No support yet.')); + } + + foreach ($commits as $commit) { + $commit_identifier = $commit->getCommitIdentifier(); + $expect_changes = idx($expect, $commit_identifier); + + if ($expect_changes === null) { + $this->assertEqual( + $commit_identifier, + null, + pht( + 'No test entry for commit "%s" in repository "%s"!', + $commit_identifier, + $repository->getCallsign())); + } + + $parser_object = newv($parser, array(array())); + $changes = $parser_object->parseChangesForUnitTest($repository, $commit); + + $path_map = id(new DiffusionPathQuery()) + ->withPathIDs(mpull($changes, 'getPathID')) + ->execute(); + $path_map = ipull($path_map, 'path'); + + $target_commits = array_filter(mpull($changes, 'getTargetCommitID')); + if ($target_commits) { + $commits = id(new DiffusionCommitQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withIDs($target_commits) + ->execute(); + $target_commits = mpull($commits, 'getCommitIdentifier', 'getID'); + } + + $dicts = array(); + foreach ($changes as $key => $change) { + $target_path = idx($path_map, $change->getTargetPathID()); + $target_commit = idx($target_commits, $change->getTargetCommitID()); + + $dicts[$key] = array( + $path_map[(int)$change->getPathID()], + $target_path, + $target_commit, + (int)$change->getChangeType(), + (int)$change->getFileType(), + (int)$change->getIsDirect(), + (int)$change->getCommitSequence(), + ); + } + + $dicts = ipull($dicts, null, 0); + $expect_changes = ipull($expect_changes, null, 0); + ksort($dicts); + ksort($expect_changes); + + $this->assertEqual($expect_changes, $dicts); + } + } + + +} diff --git a/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php b/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php index 7a7cb6254d..0fd91e83b7 100644 --- a/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php +++ b/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php @@ -35,6 +35,12 @@ abstract class PhabricatorRepositoryCommitChangeParserWorker $this->finishParse(); } + public function parseChangesForUnitTest( + PhabricatorRepository $repository, + PhabricatorRepositoryCommit $commit) { + return $this->parseCommitChanges($repository, $commit); + } + public static function lookupOrCreatePaths(array $paths) { $repository = new PhabricatorRepository(); $conn_w = $repository->establishConnection('w'); diff --git a/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryGitCommitChangeParserWorker.php b/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryGitCommitChangeParserWorker.php index 2242065729..fb191631b9 100644 --- a/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryGitCommitChangeParserWorker.php +++ b/src/applications/repository/worker/commitchangeparser/PhabricatorRepositoryGitCommitChangeParserWorker.php @@ -228,25 +228,16 @@ final class PhabricatorRepositoryGitCommitChangeParserWorker } } - $results = array(); foreach ($changes as $change) { - $target_path_id = $change['targetPathID'] - ? (int)$change['targetPathID'] - : null; - - $target_commit_id = $change['targetCommitID'] - ? (int)$change['targetCommitID'] - : null; - $result = id(new PhabricatorRepositoryParsedChange()) - ->setPathID((int)$change['pathID']) - ->setTargetPathID($target_path_id) - ->setTargetCommitID($target_commit_id) - ->setChangeType((int)$change['changeType']) + ->setPathID($change['pathID']) + ->setTargetPathID($change['targetPathID']) + ->setTargetCommitID($change['targetCommitID']) + ->setChangeType($change['changeType']) ->setFileType($change['fileType']) - ->setIsDirect((int)$change['isDirect']) - ->setCommitSequence((int)$change['commitSequence']); + ->setIsDirect($change['isDirect']) + ->setCommitSequence($change['commitSequence']); $results[] = $result; }