Skip to content

Commit bf23b2b

Browse files
authored
Merge pull request #3501 from stsewd/fix-integrations-regex
Fix regex for getting project and user
2 parents 909cb56 + a7b8a2e commit bf23b2b

File tree

4 files changed

+84
-49
lines changed

4 files changed

+84
-49
lines changed

readthedocs/builds/models.py

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,17 @@
2121

2222
from readthedocs.core.utils import broadcast
2323
from readthedocs.projects.constants import (
24-
BITBUCKET_REGEXS, BITBUCKET_URL, GITHUB_REGEXS, GITHUB_URL, GITLAB_REGEXS,
25-
GITLAB_URL, PRIVACY_CHOICES, PRIVATE)
24+
BITBUCKET_URL, GITHUB_URL, GITLAB_URL, PRIVACY_CHOICES, PRIVATE)
2625
from readthedocs.projects.models import APIProject, Project
2726

2827
from .constants import (
2928
BRANCH, BUILD_STATE, BUILD_STATE_FINISHED, BUILD_TYPES, LATEST,
3029
NON_REPOSITORY_VERSIONS, STABLE, TAG, VERSION_TYPES)
3130
from .managers import VersionManager
3231
from .querysets import BuildQuerySet, RelatedBuildQuerySet, VersionQuerySet
32+
from .utils import (
33+
get_bitbucket_username_repo, get_github_username_repo,
34+
get_gitlab_username_repo)
3335
from .version_slug import VersionSlugField
3436

3537
DEFAULT_VERSION_PRIVACY_LEVEL = getattr(
@@ -277,12 +279,8 @@ def get_github_url(
277279
elif action == 'edit':
278280
action_string = 'edit'
279281

280-
for regex in GITHUB_REGEXS:
281-
match = regex.search(repo_url)
282-
if match:
283-
user, repo = match.groups()
284-
break
285-
else:
282+
user, repo = get_github_username_repo(repo_url)
283+
if not user and not repo:
286284
return ''
287285
repo = repo.rstrip('/')
288286

@@ -315,12 +313,8 @@ def get_gitlab_url(
315313
elif action == 'edit':
316314
action_string = 'edit'
317315

318-
for regex in GITLAB_REGEXS:
319-
match = regex.search(repo_url)
320-
if match:
321-
user, repo = match.groups()
322-
break
323-
else:
316+
user, repo = get_gitlab_username_repo(repo_url)
317+
if not user and not repo:
324318
return ''
325319
repo = repo.rstrip('/')
326320

@@ -341,12 +335,8 @@ def get_bitbucket_url(self, docroot, filename, source_suffix='.rst'):
341335
if not docroot:
342336
return ''
343337

344-
for regex in BITBUCKET_REGEXS:
345-
match = regex.search(repo_url)
346-
if match:
347-
user, repo = match.groups()
348-
break
349-
else:
338+
user, repo = get_bitbucket_username_repo(repo_url)
339+
if not user and not repo:
350340
return ''
351341
repo = repo.rstrip('/')
352342

readthedocs/builds/utils.py

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,13 @@
44
from __future__ import (
55
absolute_import, division, print_function, unicode_literals)
66

7-
import re
8-
9-
GH_REGEXS = [
10-
re.compile('github.com/(.+)/(.+)(?:\.git){1}'),
11-
re.compile('github.com/(.+)/(.+)'),
12-
re.compile('github.com:(.+)/(.+).git'),
13-
]
14-
15-
BB_REGEXS = [
16-
re.compile('bitbucket.org/(.+)/(.+)/'),
17-
re.compile('bitbucket.org/(.+)/(.+)'),
18-
re.compile('bitbucket.org:(.+)/(.+)\.git'),
19-
]
20-
21-
# TODO: I think this can be different than `gitlab.com`
22-
# self.adapter.provider_base_url
23-
GL_REGEXS = [
24-
re.compile('gitlab.com/(.+)/(.+)(?:\.git){1}'),
25-
re.compile('gitlab.com/(.+)/(.+)'),
26-
re.compile('gitlab.com:(.+)/(.+)\.git'),
27-
]
7+
from readthedocs.projects.constants import (
8+
BITBUCKET_REGEXS, GITHUB_REGEXS, GITLAB_REGEXS)
289

2910

3011
def get_github_username_repo(url):
3112
if 'github' in url:
32-
for regex in GH_REGEXS:
13+
for regex in GITHUB_REGEXS:
3314
match = regex.search(url)
3415
if match:
3516
return match.groups()
@@ -38,7 +19,7 @@ def get_github_username_repo(url):
3819

3920
def get_bitbucket_username_repo(url=None):
4021
if 'bitbucket' in url:
41-
for regex in BB_REGEXS:
22+
for regex in BITBUCKET_REGEXS:
4223
match = regex.search(url)
4324
if match:
4425
return match.groups()
@@ -47,7 +28,7 @@ def get_bitbucket_username_repo(url=None):
4728

4829
def get_gitlab_username_repo(url=None):
4930
if 'gitlab' in url:
50-
for regex in GL_REGEXS:
31+
for regex in GITLAB_REGEXS:
5132
match = regex.search(url)
5233
if match:
5334
return match.groups()

readthedocs/projects/constants.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -292,19 +292,20 @@
292292
PROJECT_SLUG_REGEX = '(?:[-\w]+)'
293293

294294
GITHUB_REGEXS = [
295-
re.compile('github.com/(.+)/(.+)(?:\.git){1}'),
295+
re.compile('github.com/(.+)/(.+)(?:\.git){1}$'),
296296
re.compile('github.com/(.+)/(.+)'),
297-
re.compile('github.com:(.+)/(.+).git'),
297+
re.compile('github.com:(.+)/(.+)\.git$'),
298298
]
299299
BITBUCKET_REGEXS = [
300-
re.compile('bitbucket.org/(.+)/(.+).git'),
300+
re.compile('@bitbucket.org/(.+)/(.+)\.git$'),
301301
re.compile('bitbucket.org/(.+)/(.+)/'),
302302
re.compile('bitbucket.org/(.+)/(.+)'),
303+
re.compile('bitbucket.org:(.+)/(.+)\.git$'),
303304
]
304305
GITLAB_REGEXS = [
305-
re.compile('gitlab.com/(.+)/(.+)(?:\.git){1}'),
306+
re.compile('gitlab.com/(.+)/(.+)(?:\.git){1}$'),
306307
re.compile('gitlab.com/(.+)/(.+)'),
307-
re.compile('gitlab.com:(.+)/(.+).git'),
308+
re.compile('gitlab.com:(.+)/(.+)\.git$'),
308309
]
309310
GITHUB_URL = (
310311
'https://github.com/{user}/{repo}/'

readthedocs/rtd_tests/tests/test_repo_parsing.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,89 @@ def test_github(self):
2222
self.pip.repo = 'https://github.com/user/repo/'
2323
self.assertEqual(self.version.get_github_url(docroot='/docs/', filename='file'), 'https://github.com/user/repo/blob/master/docs/file.rst')
2424

25+
self.pip.repo = 'https://github.com/user/repo.github.io'
26+
self.assertEqual(self.version.get_github_url(docroot='/docs/', filename='file'), 'https://github.com/user/repo.github.io/blob/master/docs/file.rst')
27+
28+
self.pip.repo = 'https://github.com/user/repo.github.io/'
29+
self.assertEqual(self.version.get_github_url(docroot='/docs/', filename='file'), 'https://github.com/user/repo.github.io/blob/master/docs/file.rst')
30+
2531
self.pip.repo = 'https://github.com/user/repo.git'
2632
self.assertEqual(self.version.get_github_url(docroot='/docs/', filename='file'), 'https://github.com/user/repo/blob/master/docs/file.rst')
2733

34+
self.pip.repo = 'https://github.com/user/repo.github.io.git'
35+
self.assertEqual(self.version.get_github_url(docroot='/docs/', filename='file'), 'https://github.com/user/repo.github.io/blob/master/docs/file.rst')
36+
37+
self.pip.repo = 'https://github.com/user/repo.git.git'
38+
self.assertEqual(self.version.get_github_url(docroot='/docs/', filename='file'), 'https://github.com/user/repo.git/blob/master/docs/file.rst')
39+
40+
def test_github_ssh(self):
41+
self.pip.repo = '[email protected]:user/repo.git'
42+
self.assertEqual(self.version.get_github_url(docroot='/docs/', filename='file'), 'https://github.com/user/repo/blob/master/docs/file.rst')
43+
44+
self.pip.repo = '[email protected]:user/repo.github.io.git'
45+
self.assertEqual(self.version.get_github_url(docroot='/docs/', filename='file'), 'https://github.com/user/repo.github.io/blob/master/docs/file.rst')
46+
2847
def test_gitlab(self):
2948
self.pip.repo = 'https://gitlab.com/user/repo'
3049
self.assertEqual(self.version.get_gitlab_url(docroot='/foo/bar/', filename='file'), 'https://gitlab.com/user/repo/blob/master/foo/bar/file.rst')
3150

3251
self.pip.repo = 'https://gitlab.com/user/repo/'
3352
self.assertEqual(self.version.get_gitlab_url(docroot='/foo/bar/', filename='file'), 'https://gitlab.com/user/repo/blob/master/foo/bar/file.rst')
3453

54+
self.pip.repo = 'https://gitlab.com/user/repo.gitlab.io'
55+
self.assertEqual(self.version.get_gitlab_url(docroot='/foo/bar/', filename='file'), 'https://gitlab.com/user/repo.gitlab.io/blob/master/foo/bar/file.rst')
56+
57+
self.pip.repo = 'https://gitlab.com/user/repo.gitlab.io/'
58+
self.assertEqual(self.version.get_gitlab_url(docroot='/foo/bar/', filename='file'), 'https://gitlab.com/user/repo.gitlab.io/blob/master/foo/bar/file.rst')
59+
3560
self.pip.repo = 'https://gitlab.com/user/repo.git'
3661
self.assertEqual(self.version.get_gitlab_url(docroot='/foo/bar/', filename='file'), 'https://gitlab.com/user/repo/blob/master/foo/bar/file.rst')
3762

63+
self.pip.repo = 'https://gitlab.com/user/repo.gitlab.io.git'
64+
self.assertEqual(self.version.get_gitlab_url(docroot='/foo/bar/', filename='file'), 'https://gitlab.com/user/repo.gitlab.io/blob/master/foo/bar/file.rst')
65+
66+
self.pip.repo = 'https://gitlab.com/user/repo.git.git'
67+
self.assertEqual(self.version.get_gitlab_url(docroot='/foo/bar/', filename='file'), 'https://gitlab.com/user/repo.git/blob/master/foo/bar/file.rst')
68+
69+
def test_gitlab_ssh(self):
70+
self.pip.repo = '[email protected]:user/repo.git'
71+
self.assertEqual(self.version.get_gitlab_url(docroot='/foo/bar/', filename='file'), 'https://gitlab.com/user/repo/blob/master/foo/bar/file.rst')
72+
73+
self.pip.repo = '[email protected]:user/repo.gitlab.io.git'
74+
self.assertEqual(self.version.get_gitlab_url(docroot='/foo/bar/', filename='file'), 'https://gitlab.com/user/repo.gitlab.io/blob/master/foo/bar/file.rst')
75+
3876
def test_bitbucket(self):
3977
self.pip.repo = 'https://bitbucket.org/user/repo'
4078
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo/src/master/foo/bar/file.rst')
4179

4280
self.pip.repo = 'https://bitbucket.org/user/repo/'
4381
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo/src/master/foo/bar/file.rst')
4482

83+
self.pip.repo = 'https://bitbucket.org/user/repo.gitbucket.io'
84+
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo.gitbucket.io/src/master/foo/bar/file.rst')
85+
86+
self.pip.repo = 'https://bitbucket.org/user/repo.gitbucket.io/'
87+
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo.gitbucket.io/src/master/foo/bar/file.rst')
88+
4589
self.pip.repo = 'https://bitbucket.org/user/repo.git'
90+
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo.git/src/master/foo/bar/file.rst')
91+
92+
self.pip.repo = 'https://bitbucket.org/user/repo.gitbucket.io.git'
93+
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo.gitbucket.io.git/src/master/foo/bar/file.rst')
94+
95+
self.pip.repo = 'https://bitbucket.org/user/repo.git.git'
96+
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo.git.git/src/master/foo/bar/file.rst')
97+
98+
def test_bitbucket_https(self):
99+
self.pip.repo = 'https://[email protected]/user/repo.git'
100+
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo/src/master/foo/bar/file.rst')
101+
102+
self.pip.repo = 'https://[email protected]/user/repo.gitbucket.io.git'
103+
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo.gitbucket.io/src/master/foo/bar/file.rst')
104+
105+
def test_bitbucket_ssh(self):
106+
self.pip.repo = '[email protected]:user/repo.git'
46107
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo/src/master/foo/bar/file.rst')
47108

109+
self.pip.repo = '[email protected]:user/repo.gitbucket.io.git'
110+
self.assertEqual(self.version.get_bitbucket_url(docroot='/foo/bar/', filename='file'), 'https://bitbucket.org/user/repo.gitbucket.io/src/master/foo/bar/file.rst')

0 commit comments

Comments
 (0)