1
0
Fork 0
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:
epriestley 2016-05-10 06:40:30 -07:00
parent 576b73dc53
commit 71a97d8af5
4 changed files with 56 additions and 11 deletions

View file

@ -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;

View file

@ -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;
}
} }

View file

@ -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;

View file

@ -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 )-------------------------------------------------------------*/