diff --git a/src/applications/diffusion/query/branch/git/DiffusionGitBranchQuery.php b/src/applications/diffusion/query/branch/git/DiffusionGitBranchQuery.php index a420cbd8bb..dc58784ebc 100644 --- a/src/applications/diffusion/query/branch/git/DiffusionGitBranchQuery.php +++ b/src/applications/diffusion/query/branch/git/DiffusionGitBranchQuery.php @@ -1,7 +1,7 @@ $head) { + if (!$repository->shouldTrackBranch($name)) { + continue; + } + $branch = new DiffusionBranchInformation(); $branch->setName($name); $branch->setHeadCommitIdentifier($head); diff --git a/src/applications/repository/controller/edit/PhabricatorRepositoryEditController.php b/src/applications/repository/controller/edit/PhabricatorRepositoryEditController.php index 25c95ee1ab..b8b34f07ca 100644 --- a/src/applications/repository/controller/edit/PhabricatorRepositoryEditController.php +++ b/src/applications/repository/controller/edit/PhabricatorRepositoryEditController.php @@ -1,7 +1,7 @@ isFormPost()) { @@ -238,6 +239,14 @@ class PhabricatorRepositoryEditController if ($has_local) { $repository->setDetail('local-path', $request->getStr('path')); } + + if ($has_branch_filter) { + $branch_filter = $request->getStrList('branch-filter'); + $branch_filter = array_fill_keys($branch_filter, true); + + $repository->setDetail('branch-filter', $branch_filter); + } + $repository->setDetail( 'pull-frequency', max(1, $request->getInt('frequency'))); @@ -548,6 +557,22 @@ class PhabricatorRepositoryEditController ->setError($e_path)); } + if ($has_branch_filter) { + $branch_filter_str = implode( + ', ', + array_keys($repository->getDetail('branch-filter', array()))); + $form + ->appendChild( + id(new AphrontFormTextControl()) + ->setName('branch-filter') + ->setLabel('Track Only') + ->setValue($branch_filter_str) + ->setCaption( + 'Optional list of branches to track. Other branches will be '. + 'completely ignored. If left empty, all branches are tracked. '. + 'Example: master, release')); + } + $form ->appendChild( id(new AphrontFormTextControl()) @@ -584,7 +609,7 @@ class PhabricatorRepositoryEditController $default_branch_name)) ->setError($e_branch) ->setCaption( - 'Default remote branch to show in Diffusion.')); + 'Default branch to show in Diffusion.')); } $form diff --git a/src/applications/repository/daemon/commitdiscovery/base/PhabricatorRepositoryCommitDiscoveryDaemon.php b/src/applications/repository/daemon/commitdiscovery/base/PhabricatorRepositoryCommitDiscoveryDaemon.php index bbc5422718..c4d60a6d94 100644 --- a/src/applications/repository/daemon/commitdiscovery/base/PhabricatorRepositoryCommitDiscoveryDaemon.php +++ b/src/applications/repository/daemon/commitdiscovery/base/PhabricatorRepositoryCommitDiscoveryDaemon.php @@ -1,7 +1,7 @@ repository = $this->loadRepository(); - - $sleep = $this->repository->getDetail('pull-frequency'); while (true) { + // Reload the repository every time to pick up changes from the web + // console. + $this->repository = $this->loadRepository(); $this->discoverCommits(); - $this->sleep(max(2, $sleep)); + + $sleep = max(2, $this->getRepository()->getDetail('pull-frequency')); + $this->sleep($sleep); } } diff --git a/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php b/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php index 9f59c2550c..275d02eaca 100644 --- a/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php +++ b/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php @@ -1,7 +1,7 @@ $commit) { + if (!$repository->shouldTrackBranch($name)) { + continue; + } + + $tracked_something = true; + if ($this->isKnownCommit($commit)) { continue; } else { @@ -61,6 +68,14 @@ class PhabricatorRepositoryGitCommitDiscoveryDaemon } } + if (!$tracked_something) { + $repo_name = $repository->getName(); + $repo_callsign = $repository->getCallsign(); + throw new Exception( + "Repository r{$repo_callsign} '{$repo_name}' has no tracked branches! ". + "Verify that your branch filtering settings are correct."); + } + return $got_something; } diff --git a/src/applications/repository/storage/repository/PhabricatorRepository.php b/src/applications/repository/storage/repository/PhabricatorRepository.php index 87647e028f..1bcf27e3d2 100644 --- a/src/applications/repository/storage/repository/PhabricatorRepository.php +++ b/src/applications/repository/storage/repository/PhabricatorRepository.php @@ -1,7 +1,7 @@ getDetail('tracking-enabled', false); } + public function shouldTrackBranch($branch) { + $vcs = $this->getVersionControlSystem(); + + $is_git = ($vcs == PhabricatorRepositoryType::REPOSITORY_TYPE_GIT); + + $use_filter = ($is_git); + + if ($use_filter) { + $filter = $this->getDetail('branch-filter', array()); + if ($filter && !isset($filter[$branch])) { + return false; + } + } + + // By default, track all branches. + return true; + } + } diff --git a/src/applications/repository/storage/repository/__tests__/PhabricatorRepositoryTestCase.php b/src/applications/repository/storage/repository/__tests__/PhabricatorRepositoryTestCase.php index 0bc70a892c..7af6246422 100644 --- a/src/applications/repository/storage/repository/__tests__/PhabricatorRepositoryTestCase.php +++ b/src/applications/repository/storage/repository/__tests__/PhabricatorRepositoryTestCase.php @@ -1,7 +1,7 @@ setVersionControlSystem($git); + + $this->assertEqual( + true, + $repo->shouldTrackBranch('imaginary'), + 'Track all branches by default.'); + + $repo->setDetail( + 'branch-filter', + array( + 'master' => true, + )); + + $this->assertEqual( + true, + $repo->shouldTrackBranch('master'), + 'Track listed branches.'); + + $this->assertEqual( + false, + $repo->shouldTrackBranch('imaginary'), + 'Do not track unlisted branches.'); + } + } diff --git a/src/applications/repository/storage/repository/__tests__/__init__.php b/src/applications/repository/storage/repository/__tests__/__init__.php index 8676e844d1..60c3a605b7 100644 --- a/src/applications/repository/storage/repository/__tests__/__init__.php +++ b/src/applications/repository/storage/repository/__tests__/__init__.php @@ -6,6 +6,7 @@ +phutil_require_module('phabricator', 'applications/repository/constants/repositorytype'); phutil_require_module('phabricator', 'applications/repository/storage/repository'); phutil_require_module('phabricator', 'infrastructure/testing/testcase');