diff --git a/crates/git_hosting_providers/src/providers/gitlab.rs b/crates/git_hosting_providers/src/providers/gitlab.rs index 1e7bdbb88b..7910379ef0 100644 --- a/crates/git_hosting_providers/src/providers/gitlab.rs +++ b/crates/git_hosting_providers/src/providers/gitlab.rs @@ -77,9 +77,9 @@ impl GitHostingProvider for Gitlab { return None; } - let mut path_segments = url.path_segments()?; - let owner = path_segments.next()?; - let repo = path_segments.next()?.trim_end_matches(".git"); + let mut path_segments = url.path_segments()?.collect::>(); + let repo = path_segments.pop()?.trim_end_matches(".git"); + let owner = path_segments.join("/"); Some(ParsedGitRemote { owner: owner.into(), @@ -178,6 +178,23 @@ mod tests { ); } + #[test] + fn test_parse_remote_url_given_self_hosted_https_url_with_subgroup() { + let remote_url = "https://gitlab.my-enterprise.com/group/subgroup/zed.git"; + let parsed_remote = Gitlab::from_remote_url(remote_url) + .unwrap() + .parse_remote_url(remote_url) + .unwrap(); + + assert_eq!( + parsed_remote, + ParsedGitRemote { + owner: "group/subgroup".into(), + repo: "zed".into(), + } + ); + } + #[test] fn test_build_gitlab_permalink() { let permalink = Gitlab::new().build_permalink(