mirror of
https://we.phorge.it/source/phorge.git
synced 2024-09-20 09:18:48 +02:00
When observing a repository, switch to "importing" mode on a large discovery in an empty repository
Summary: Ref T10923. Fixes T9554. When hosting a repository, we currently have a heuristic that tries to detect when you're doing an initial import: if you push more than 7 commits to an empty repository, it counts as an import and we disable mail/feed/etc. Do something similar for observed repositories: if the repository is empty and we discover more than 7 commits, switch to import mode until we catch up. This should align behavior with user expectation more often when juggling hosted vs imported repositories. Test Plan: - Created a new hosted repository. - Activated it and allowed it to fully import. - Added an "Observe URI". - Saw it automatically drop into "Importing" mode until the import completed. - Swapped it back to hosted mode. Reviewers: chad Reviewed By: chad Maniphest Tasks: T9554, T10923 Differential Revision: https://secure.phabricator.com/D15877
This commit is contained in:
parent
576b73dc53
commit
71a97d8af5
4 changed files with 56 additions and 11 deletions
|
@ -172,14 +172,7 @@ final class DiffusionCommitHookEngine extends Phobject {
|
||||||
|
|
||||||
if ($this->isInitialImport($all_updates)) {
|
if ($this->isInitialImport($all_updates)) {
|
||||||
$repository = $this->getRepository();
|
$repository = $this->getRepository();
|
||||||
|
$repository->markImporting();
|
||||||
$repository->openTransaction();
|
|
||||||
$repository->beginReadLocking();
|
|
||||||
$repository = $repository->reload();
|
|
||||||
$repository->setDetail('importing', true);
|
|
||||||
$repository->save();
|
|
||||||
$repository->endReadLocking();
|
|
||||||
$repository->saveTransaction();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->emailPHIDs) {
|
if ($this->emailPHIDs) {
|
||||||
|
@ -1244,7 +1237,7 @@ final class DiffusionCommitHookEngine extends Phobject {
|
||||||
$commit_count++;
|
$commit_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($commit_count <= 7) {
|
if ($commit_count <= PhabricatorRepository::IMPORT_THRESHOLD) {
|
||||||
// If this pushes a very small number of commits, assume it's an
|
// If this pushes a very small number of commits, assume it's an
|
||||||
// initial commit or stack of a few initial commits.
|
// initial commit or stack of a few initial commits.
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -52,6 +52,16 @@ final class PhabricatorRepositoryDiscoveryEngine
|
||||||
throw new Exception(pht("Unknown VCS '%s'!", $vcs));
|
throw new Exception(pht("Unknown VCS '%s'!", $vcs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->isInitialImport($refs)) {
|
||||||
|
$this->log(
|
||||||
|
pht(
|
||||||
|
'Discovered more than %s commit(s) in an empty repository, '.
|
||||||
|
'marking repository as importing.',
|
||||||
|
new PhutilNumber(PhabricatorRepository::IMPORT_THRESHOLD)));
|
||||||
|
|
||||||
|
$repository->markImporting();
|
||||||
|
}
|
||||||
|
|
||||||
// Clear the working set cache.
|
// Clear the working set cache.
|
||||||
$this->workingSet = array();
|
$this->workingSet = array();
|
||||||
|
|
||||||
|
@ -579,4 +589,30 @@ final class PhabricatorRepositoryDiscoveryEngine
|
||||||
PhabricatorWorker::scheduleTask($class, $data);
|
PhabricatorWorker::scheduleTask($class, $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function isInitialImport(array $refs) {
|
||||||
|
$commit_count = count($refs);
|
||||||
|
|
||||||
|
if ($commit_count <= PhabricatorRepository::IMPORT_THRESHOLD) {
|
||||||
|
// If we fetched a small number of commits, assume it's an initial
|
||||||
|
// commit or a stack of a few initial commits.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$viewer = $this->getViewer();
|
||||||
|
$repository = $this->getRepository();
|
||||||
|
|
||||||
|
$any_commits = id(new DiffusionCommitQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withRepository($repository)
|
||||||
|
->setLimit(1)
|
||||||
|
->execute();
|
||||||
|
|
||||||
|
if ($any_commits) {
|
||||||
|
// If the repository already has commits, this isn't an import.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,6 @@ abstract class PhabricatorWorkingCopyTestCase extends PhabricatorTestCase {
|
||||||
$this->didConstructRepository($repo);
|
$this->didConstructRepository($repo);
|
||||||
|
|
||||||
$repo->save();
|
$repo->save();
|
||||||
$repo->makeEphemeral();
|
|
||||||
|
|
||||||
// Keep the disk resources around until we exit.
|
// Keep the disk resources around until we exit.
|
||||||
$this->dirs[] = $dir;
|
$this->dirs[] = $dir;
|
||||||
|
|
|
@ -26,6 +26,11 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
*/
|
*/
|
||||||
const MINIMUM_QUALIFIED_HASH = 5;
|
const MINIMUM_QUALIFIED_HASH = 5;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimum number of commits to an empty repository to trigger "import" mode.
|
||||||
|
*/
|
||||||
|
const IMPORT_THRESHOLD = 7;
|
||||||
|
|
||||||
const TABLE_PATH = 'repository_path';
|
const TABLE_PATH = 'repository_path';
|
||||||
const TABLE_PATHCHANGE = 'repository_pathchange';
|
const TABLE_PATHCHANGE = 'repository_pathchange';
|
||||||
const TABLE_FILESYSTEM = 'repository_filesystem';
|
const TABLE_FILESYSTEM = 'repository_filesystem';
|
||||||
|
@ -354,7 +359,7 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
if (!strlen($name)) {
|
if (!strlen($name)) {
|
||||||
$name = $this->getName();
|
$name = $this->getName();
|
||||||
$name = phutil_utf8_strtolower($name);
|
$name = phutil_utf8_strtolower($name);
|
||||||
$name = preg_replace('@[/ -:]+@', '-', $name);
|
$name = preg_replace('@[/ -:<>]+@', '-', $name);
|
||||||
$name = trim($name, '-');
|
$name = trim($name, '-');
|
||||||
if (!strlen($name)) {
|
if (!strlen($name)) {
|
||||||
$name = $this->getCallsign();
|
$name = $this->getCallsign();
|
||||||
|
@ -2155,6 +2160,18 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
return $service;
|
return $service;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function markImporting() {
|
||||||
|
$this->openTransaction();
|
||||||
|
$this->beginReadLocking();
|
||||||
|
$repository = $this->reload();
|
||||||
|
$repository->setDetail('importing', true);
|
||||||
|
$repository->save();
|
||||||
|
$this->endReadLocking();
|
||||||
|
$this->saveTransaction();
|
||||||
|
|
||||||
|
return $repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -( Symbols )-------------------------------------------------------------*/
|
/* -( Symbols )-------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue