diff --git a/readthedocs/rtd_tests/tests/test_backend.py b/readthedocs/rtd_tests/tests/test_backend.py index 239c2dc8f57..0e9bdffeb16 100644 --- a/readthedocs/rtd_tests/tests/test_backend.py +++ b/readthedocs/rtd_tests/tests/test_backend.py @@ -49,30 +49,34 @@ def setUp(self): self.dummy_conf.submodules.include = ALL self.dummy_conf.submodules.exclude = [] - def test_parse_branches(self): - data = """ - develop - master - release/2.0.0 - origin/2.0.X - origin/HEAD -> origin/master - origin/master - origin/release/2.0.0 - origin/release/foo/bar - """ - - expected_ids = [ - ('develop', 'develop'), - ('master', 'master'), - ('release/2.0.0', 'release/2.0.0'), - ('origin/2.0.X', '2.0.X'), - ('origin/master', 'master'), - ('origin/release/2.0.0', 'release/2.0.0'), - ('origin/release/foo/bar', 'release/foo/bar'), + def test_git_branches(self): + repo_path = self.project.repo + default_branches = [ + # comes from ``make_test_git`` function + 'submodule', + 'relativesubmodule', + 'invalidsubmodule', ] - given_ids = [(x.identifier, x.verbose_name) for x in - self.project.vcs_repo().parse_branches(data)] - self.assertEqual(expected_ids, given_ids) + branches = [ + 'develop', + 'master', + '2.0.X', + 'release/2.0.0', + 'release/foo/bar', + 'release-ünîø∂é', + ] + for branch in branches: + create_git_branch(repo_path, branch) + + repo = self.project.vcs_repo() + # We aren't cloning the repo, + # so we need to hack the repo path + repo.working_dir = repo_path + + self.assertEqual( + set(branches + default_branches), + {branch.verbose_name for branch in repo.branches}, + ) def test_git_checkout(self): repo = self.project.vcs_repo() @@ -90,7 +94,7 @@ def test_git_tags(self): repo.working_dir = repo_path self.assertEqual( set(['v01', 'v02', 'release-ünîø∂é']), - set(vcs.verbose_name for vcs in repo.tags) + {vcs.verbose_name for vcs in repo.tags}, ) def test_check_for_submodules(self): diff --git a/readthedocs/rtd_tests/tests/test_celery.py b/readthedocs/rtd_tests/tests/test_celery.py index 4e5ed8856e6..83a5fdbe815 100644 --- a/readthedocs/rtd_tests/tests/test_celery.py +++ b/readthedocs/rtd_tests/tests/test_celery.py @@ -124,7 +124,9 @@ def test_sync_repository(self): self.assertTrue(result.successful()) @patch('readthedocs.projects.tasks.api_v2') - def test_check_duplicate_reserved_version_latest(self, api_v2): + @patch('readthedocs.projects.models.Project.checkout_path') + def test_check_duplicate_reserved_version_latest(self, checkout_path, api_v2): + checkout_path.return_value = self.project.repo create_git_branch(self.repo, 'latest') create_git_tag(self.repo, 'latest') @@ -144,7 +146,9 @@ def test_check_duplicate_reserved_version_latest(self, api_v2): api_v2.project().sync_versions.post.assert_called() @patch('readthedocs.projects.tasks.api_v2') - def test_check_duplicate_reserved_version_stable(self, api_v2): + @patch('readthedocs.projects.models.Project.checkout_path') + def test_check_duplicate_reserved_version_stable(self, checkout_path, api_v2): + checkout_path.return_value = self.project.repo create_git_branch(self.repo, 'stable') create_git_tag(self.repo, 'stable') diff --git a/readthedocs/vcs_support/backends/git.py b/readthedocs/vcs_support/backends/git.py index 2959add5493..69e0adae338 100644 --- a/readthedocs/vcs_support/backends/git.py +++ b/readthedocs/vcs_support/backends/git.py @@ -4,7 +4,6 @@ from __future__ import ( absolute_import, division, print_function, unicode_literals) -import csv import logging import os import re @@ -13,7 +12,6 @@ from builtins import str from django.core.exceptions import ValidationError from git.exc import BadName -from six import PY2, StringIO from readthedocs.config import ALL from readthedocs.projects.exceptions import RepositoryError @@ -174,51 +172,23 @@ def tags(self): @property def branches(self): - # Only show remote branches - retcode, stdout, _ = self.run( - 'git', - 'branch', - '-r', - record_as_success=True, - ) - # error (or no branches found) - if retcode != 0: - return [] - return self.parse_branches(stdout) - - def parse_branches(self, data): - """ - Parse output of git branch -r. - - e.g.: + repo = git.Repo(self.working_dir) + versions = [] - origin/2.0.X - origin/HEAD -> origin/master - origin/develop - origin/master - origin/release/2.0.0 - origin/release/2.1.0 - """ - clean_branches = [] - # StringIO below is expecting Unicode data, so ensure that it gets it. - if not isinstance(data, str): - data = str(data) - delimiter = str(' ').encode('utf-8') if PY2 else str(' ') - raw_branches = csv.reader(StringIO(data), delimiter=delimiter) - for branch in raw_branches: - branch = [f for f in branch if f not in ('', '*')] - # Handle empty branches - if branch: - branch = branch[0] - if branch.startswith('origin/'): - verbose_name = branch.replace('origin/', '') - if verbose_name in ['HEAD']: - continue - clean_branches.append( - VCSVersion(self, branch, verbose_name)) - else: - clean_branches.append(VCSVersion(self, branch, branch)) - return clean_branches + # ``repo.branches`` returns local branches and + branches = repo.branches + # ``repo.remotes.origin.refs`` returns remote branches + if repo.remotes: + branches += repo.remotes.origin.refs + + for branch in branches: + verbose_name = branch.name + if verbose_name.startswith('origin/'): + verbose_name = verbose_name.replace('origin/', '') + if verbose_name == 'HEAD': + continue + versions.append(VCSVersion(self, str(branch), verbose_name)) + return versions @property def commit(self):