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');