Skip to content

Commit 58b3412

Browse files
committed
Only parse remote branches in git.
1 parent 91a730b commit 58b3412

File tree

2 files changed

+36
-31
lines changed

2 files changed

+36
-31
lines changed

readthedocs/rtd_tests/tests/test_backend.py

+14-10
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,23 @@ def setUp(self):
2424
self.project.users.add(self.eric)
2525

2626
def test_parse_branches(self):
27-
data = """\
27+
data = """
2828
develop
2929
master
3030
release/2.0.0
31-
remotes/origin/2.0.X
32-
remotes/origin/HEAD -> origin/master
33-
remotes/origin/master
34-
remotes/origin/release/2.0.0"""
35-
36-
expected_ids = [('develop', 'develop'), ('master', 'master'),
37-
('release/2.0.0', 'release-2.0.0'),
38-
('remotes/origin/2.0.X', '2.0.X'),
39-
('remotes/origin/release/2.0.0', 'release-2.0.0')]
31+
origin/2.0.X
32+
origin/HEAD -> origin/master
33+
origin/master
34+
origin/release/2.0.0
35+
"""
36+
37+
expected_ids = [
38+
('develop', 'develop'),
39+
('master', 'master'),
40+
('release/2.0.0', 'release-2.0.0'),
41+
('origin/2.0.X', '2.0.X'),
42+
('origin/release/2.0.0', 'release-2.0.0')
43+
]
4044
given_ids = [(x.identifier, x.verbose_name) for x in
4145
self.project.vcs_repo().parse_branches(data)]
4246
assert expected_ids == given_ids

readthedocs/vcs_support/backends/git.py

+22-21
Original file line numberDiff line numberDiff line change
@@ -104,39 +104,40 @@ def parse_tags(self, data):
104104

105105
@property
106106
def branches(self):
107-
retcode, stdout, err = self.run('git', 'branch', '-a')
107+
# Only show remote branches
108+
retcode, stdout, err = self.run('git', 'branch', '-r')
108109
# error (or no tags found)
109110
if retcode != 0:
110111
return []
111112
return self.parse_branches(stdout)
112113

113114
def parse_branches(self, data):
114115
"""
115-
Parse output of git branch -a, eg:
116-
develop
117-
master
118-
* release/2.0.0
119-
rtd-jonas
120-
remotes/origin/2.0.X
121-
remotes/origin/HEAD -> origin/master
122-
remotes/origin/develop
123-
remotes/origin/master
124-
remotes/origin/release/2.0.0
125-
remotes/origin/release/2.1.0
116+
Parse output of git branch -r, eg:
117+
origin/2.0.X
118+
origin/HEAD -> origin/master
119+
origin/develop
120+
origin/master
121+
origin/release/2.0.0
122+
origin/release/2.1.0
126123
"""
127124
clean_branches = []
128125
raw_branches = csv.reader(StringIO(data), delimiter=' ')
129126
for branch in raw_branches:
130127
branch = filter(lambda f: f != '' and f != '*', branch)
131-
branch = branch[0]
132-
if branch.startswith('remotes/origin/'):
133-
slug = branch[15:].replace('/', '-')
134-
if slug in ['HEAD', self.fallback_branch]:
135-
continue
136-
clean_branches.append(VCSVersion(self, branch, slug))
137-
else:
138-
slug = branch.replace('/', '-')
139-
clean_branches.append(VCSVersion(self, branch, slug))
128+
# Handle empty branches
129+
if len(branch):
130+
branch = branch[0]
131+
if branch.startswith('origin/'):
132+
cut_len = len('origin/')
133+
slug = branch[cut_len:].replace('/', '-')
134+
if slug in ['HEAD', self.fallback_branch]:
135+
continue
136+
clean_branches.append(VCSVersion(self, branch, slug))
137+
else:
138+
# Believe this is dead code.
139+
slug = branch.replace('/', '-')
140+
clean_branches.append(VCSVersion(self, branch, slug))
140141
return clean_branches
141142

142143
def checkout(self, identifier=None):

0 commit comments

Comments
 (0)