mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-22 13:30:55 +01:00
When doing partial subdirectory parses in Subversion, stub out foreign commit
references Summary: See T325. We tentatively support doing partial subdirectory parses in Phabricator for Subversion, so you can elect to import only "trunk/local/" or similar. We do this by importing only some of the commits (those commits which affected that directory). In Subversion, you can also "svn cp svn+ssh://example.com/svnroot/trunk/foreign/example.c@13 local.c". This means that commits which reference "trunk/local/" may themselves reference foreign commits. Currently, we break in this case and can't find the commit reference. Instead, generate a foreign commit stub so we can at least point at some reasonable object. Test Plan: Successfully imported trunk/a/ of the test repo in T325 without errors. Verified commit 3 in that repo is imported as a foreign stub. Reviewers: jungejason, nh, tuomaspelkonen, aran Reviewed By: jungejason CC: aran, jungejason, epriestley Differential Revision: 892
This commit is contained in:
parent
ed508247ba
commit
ae045a9cf2
2 changed files with 48 additions and 1 deletions
|
@ -502,7 +502,53 @@ class PhabricatorRepositorySvnCommitChangeParserWorker
|
|||
$repository->getID(),
|
||||
$commits);
|
||||
|
||||
return ipull($commit_data, 'id', 'commitIdentifier');
|
||||
$commit_map = ipull($commit_data, 'id', 'commitIdentifier');
|
||||
|
||||
$need = array();
|
||||
foreach ($commits as $commit) {
|
||||
if (empty($commit_map[$commit])) {
|
||||
$need[] = $commit;
|
||||
}
|
||||
}
|
||||
|
||||
// If we are parsing a Subversion repository and have been configured to
|
||||
// import only some subdirectory of it, we may find commits which reference
|
||||
// other foreign commits outside of the directory (for instance, because of
|
||||
// a move or copy). Rather than trying to execute full parses on them, just
|
||||
// create stub commits and identify the stubs as foreign commits.
|
||||
if ($need) {
|
||||
$subpath = $repository->getDetail('svn-subpath');
|
||||
if (!$subpath) {
|
||||
$commits = implode(', ', $need);
|
||||
throw new Exception(
|
||||
"Missing commits ({$need}) in a SVN repository which is not ".
|
||||
"configured for subdirectory-only parsing!");
|
||||
}
|
||||
foreach ($need as $foreign_commit) {
|
||||
$commit = new PhabricatorRepositoryCommit();
|
||||
$commit->setRepositoryID($repository->getID());
|
||||
$commit->setCommitIdentifier($foreign_commit);
|
||||
$commit->setEpoch(0);
|
||||
$commit->save();
|
||||
|
||||
$data = new PhabricatorRepositoryCommitData();
|
||||
$data->setCommitID($commit->getID());
|
||||
$data->setAuthorName('');
|
||||
$data->setCommitMessage('');
|
||||
$data->setCommitDetails(
|
||||
array(
|
||||
'foreign-svn-stub' => true,
|
||||
// Denormalize this to make it easier to debug cases where someone
|
||||
// did half a parse and then changed the subdirectory or something
|
||||
// like that.
|
||||
'svn-subpath' => $subpath,
|
||||
));
|
||||
$data->save();
|
||||
$commit_map[$foreign_commit] = $commit->getID();
|
||||
}
|
||||
}
|
||||
|
||||
return $commit_map;
|
||||
}
|
||||
|
||||
private function lookupPathFileType(
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
phutil_require_module('phabricator', 'applications/differential/constants/changetype');
|
||||
phutil_require_module('phabricator', 'applications/repository/storage/commit');
|
||||
phutil_require_module('phabricator', 'applications/repository/storage/commitdata');
|
||||
phutil_require_module('phabricator', 'applications/repository/storage/repository');
|
||||
phutil_require_module('phabricator', 'applications/repository/worker/commitchangeparser/base');
|
||||
phutil_require_module('phabricator', 'storage/qsprintf');
|
||||
|
|
Loading…
Reference in a new issue