diff --git a/src/applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php b/src/applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php index 4f50450a10..b887404df8 100644 --- a/src/applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php +++ b/src/applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php @@ -46,6 +46,12 @@ final class PhabricatorRepositoryPullLocalDaemon extends PhabricatorDaemon { private $commitCache = array(); + private $repair; + + public function setRepair($repair) { + $this->repair = $repair; + return $this; + } /* -( Pulling Repositories )----------------------------------------------- */ @@ -238,6 +244,13 @@ final class PhabricatorRepositoryPullLocalDaemon return true; } + if ($this->repair) { + // In repair mode, rediscover the entire repository, ignoring the + // database state. We can hit the local cache above, but if we miss it + // stop the script from going to the database cache. + return false; + } + $commit = id(new PhabricatorRepositoryCommit())->loadOneWhere( 'repositoryID = %s AND commitIdentifier = %s', $repository->getID(), @@ -316,6 +329,12 @@ final class PhabricatorRepositoryPullLocalDaemon $commit->getID(), $epoch); + if ($this->repair) { + // Normally, the query should throw a duplicate key exception. If we + // reach this in repair mode, we've actually performed a repair. + $this->log("Repaired commit '%s'.", $commit_identifier); + } + $this->setCache($repository, $commit_identifier); } catch (AphrontQueryDuplicateKeyException $ex) { // Ignore. This can happen because we discover the same new commit diff --git a/src/applications/repository/management/PhabricatorRepositoryManagementDiscoverWorkflow.php b/src/applications/repository/management/PhabricatorRepositoryManagementDiscoverWorkflow.php index c053983da7..adaa2503f8 100644 --- a/src/applications/repository/management/PhabricatorRepositoryManagementDiscoverWorkflow.php +++ b/src/applications/repository/management/PhabricatorRepositoryManagementDiscoverWorkflow.php @@ -22,7 +22,7 @@ final class PhabricatorRepositoryManagementDiscoverWorkflow public function didConstruct() { $this ->setName('discover') - ->setExamples('**discover** __repository__ ...') + ->setExamples('**discover** [__options__] __repository__ ...') ->setSynopsis('Discover __repository__, named by callsign or PHID.') ->setArguments( array( @@ -30,6 +30,11 @@ final class PhabricatorRepositoryManagementDiscoverWorkflow 'name' => 'verbose', 'help' => 'Show additional debugging information.', ), + array( + 'name' => 'repair', + 'help' => 'Repair a repository with gaps in commit '. + 'history.', + ), array( 'name' => 'repos', 'wildcard' => true, @@ -52,6 +57,7 @@ final class PhabricatorRepositoryManagementDiscoverWorkflow $daemon = new PhabricatorRepositoryPullLocalDaemon(array()); $daemon->setVerbose($args->getArg('verbose')); + $daemon->setRepair($args->getArg('repair')); $daemon->discoverRepository($repo); }