Skip to content

Commit 4f0a91a

Browse files
authored
Merge pull request #1921 from minrk/trailing-slash-repoproviders
strip trailing slash on github/gist/gitlab URLs
2 parents 5a4bf55 + 159aec7 commit 4f0a91a

File tree

2 files changed

+85
-5
lines changed

2 files changed

+85
-5
lines changed

binderhub/repoproviders.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ class GitLabRepoProvider(RepoProvider):
711711
"displayName": "GitLab",
712712
"id": "gl",
713713
"spec": {"validateRegex": r"[^/]+/.+"},
714-
"detect": {"regex": "^(https?://gitlab.com/)?(?<repo>.*)"},
714+
"detect": {"regex": "^(https?://gitlab.com/)?(?<repo>.*[^/])/?"},
715715
"repo": {
716716
"label": "GitLab repository name or URL",
717717
"placeholder": "example: https://gitlab.com/mosaik/examples/mosaik-tutorials-on-binder or mosaik/examples/mosaik-tutorials-on-binder",
@@ -839,8 +839,8 @@ class GitHubRepoProvider(RepoProvider):
839839
display_config = {
840840
"displayName": "GitHub",
841841
"id": "gh",
842-
"spec": {"validateRegex": r".+/.+/.+"},
843-
"detect": {"regex": "^(https?://github.com/)?(?<repo>.*)"},
842+
"spec": {"validateRegex": r"[^/]+/[^/]+/.+"},
843+
"detect": {"regex": "^(https?://github.com/)?(?<repo>.*[^/])/?"},
844844
"repo": {
845845
"label": "GitHub repository name or URL",
846846
"placeholder": "example: yuvipanda/requirements or https://github.com/yuvipanda/requirements",
@@ -1112,8 +1112,8 @@ class GistRepoProvider(GitHubRepoProvider):
11121112
display_config = {
11131113
"displayName": "GitHub Gist",
11141114
"id": "gist",
1115-
"spec": {"validateRegex": r".+/.+(/.+)"},
1116-
"detect": {"regex": "^(https?://gist.github.com/)?(?<repo>.*)"},
1115+
"spec": {"validateRegex": r"[^/]+/[^/]+(/[^/]+)?"},
1116+
"detect": {"regex": "^(https?://gist.github.com/)?(?<repo>.*[^/])/?"},
11171117
"repo": {
11181118
"label": "Gist ID (username/gistId) or URL",
11191119
"placeholder": "",

binderhub/tests/test_repoproviders.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,3 +610,83 @@ def test_gist_secret():
610610

611611
provider = GistRepoProvider(spec=spec, allow_secret_gist=True)
612612
assert IOLoop().run_sync(provider.get_resolved_ref) is not None
613+
614+
615+
def _js_regex(pat):
616+
"""compile a javascript regular expression
617+
618+
converts js '?<name>' to Python '?P<name>' syntax
619+
"""
620+
return re.compile(pat.replace("?<", "?P<"))
621+
622+
623+
@pytest.mark.parametrize(
624+
"provider, repo, expected_spec",
625+
[
626+
(
627+
GitHubRepoProvider,
628+
"https://github.com/org/repo",
629+
"org/repo",
630+
),
631+
(
632+
GitHubRepoProvider,
633+
"http://github.com/org/repo/",
634+
"org/repo",
635+
),
636+
(
637+
GitHubRepoProvider,
638+
"http://github.com/org/",
639+
"org",
640+
),
641+
(
642+
GitHubRepoProvider,
643+
"org/repo",
644+
"org/repo",
645+
),
646+
(
647+
GitHubRepoProvider,
648+
"org/repo/",
649+
"org/repo",
650+
),
651+
(
652+
GitLabRepoProvider,
653+
"https://gitlab.com/org/repo",
654+
"org/repo",
655+
),
656+
(
657+
GitLabRepoProvider,
658+
"https://gitlab.com/org/repo/",
659+
"org/repo",
660+
),
661+
(
662+
GitLabRepoProvider,
663+
"org/repo/",
664+
"org/repo",
665+
),
666+
(
667+
GitLabRepoProvider,
668+
"org/repo",
669+
"org/repo",
670+
),
671+
(
672+
GistRepoProvider,
673+
"user/12345",
674+
"user/12345",
675+
),
676+
(
677+
GistRepoProvider,
678+
"user/12345/",
679+
"user/12345",
680+
),
681+
],
682+
)
683+
def test_detect_regex(provider, repo, expected_spec):
684+
config = provider.display_config
685+
detect_regex = _js_regex(config["detect"]["regex"])
686+
687+
match = detect_regex.match(repo)
688+
if expected_spec is None and match is None:
689+
# ok, no match expected
690+
return
691+
repo = match.group("repo")
692+
assert repo == expected_spec

0 commit comments

Comments
 (0)