1- use regex :: Regex ;
1+ use git_url_parse :: GitUrl ;
22use thiserror:: Error ;
33
44use crate :: options:: Opt ;
@@ -87,19 +87,19 @@ struct MergeRequestParts {
8787const DEFAULT_REMOTE_ORIGIN : & str = "origin" ;
8888
8989fn get_remote_parts ( url : & str ) -> anyhow:: Result < RemoteParts > {
90- let re : Regex = Regex :: new ( r"((\w+://)|(git@))(.+@)*(?P<domain>[\w\d.]+)(:[\d]+)?/*(:?)(?P<repository>[^.]*)(\.git)?(/)?$" ) . unwrap ( ) ;
90+ let giturl = GitUrl :: parse ( url ) . map_err ( |_| Issue :: UnableToGetRemoteParts ) ? ;
9191
92- let caps = re
93- . captures ( url)
94- . ok_or_else ( || ( ) )
95- . map_err ( |_| Issue :: UnableToGetRemoteParts ) ?;
96-
97- let domain = caps
98- . name ( "domain" )
92+ let domain = giturl
93+ . host
9994 . map_or ( GitProvider :: GitHub . hostname ( ) , |m| m. as_str ( ) . to_string ( ) ) ;
100- let repository = caps
101- . name ( "repository" )
102- . map_or ( "" . to_string ( ) , |m| m. as_str ( ) . to_string ( ) ) ;
95+
96+ let repository = giturl
97+ . path
98+ . replace ( ".git" , "" ) // don't want the .git part
99+ . split ( "/" )
100+ . filter ( |s| !s. is_empty ( ) )
101+ . collect :: < Vec < & str > > ( )
102+ . join ( "/" ) ;
103103
104104 Ok ( RemoteParts { domain, repository } )
105105}
@@ -122,7 +122,7 @@ fn get_merge_request_parts(domain: &str) -> anyhow::Result<MergeRequestParts, Is
122122 path : "pulls" . to_string ( ) ,
123123 tail : "" . to_string ( ) ,
124124 } ) ,
125- _ => Err ( Issue :: UnknownProvider )
125+ _ => Err ( Issue :: UnknownProvider ) ,
126126 }
127127}
128128
@@ -280,6 +280,15 @@ mod tests {
280280 assert_eq ! ( repository, "path/to/repo" ) ;
281281 }
282282
283+ #[ test]
284+ fn test_with_http_dash_and_port_git_url_parts ( ) {
285+ let RemoteParts { domain, repository } =
286+ get_remote_parts ( "http://host-dash.xz:80/path/to/repo.git/" ) . unwrap ( ) ;
287+
288+ assert_eq ! ( domain, "host-dash.xz" ) ;
289+ assert_eq ! ( repository, "path/to/repo" ) ;
290+ }
291+
283292 #[ test]
284293 fn test_with_http_git_url_parts ( ) {
285294 let RemoteParts { domain, repository } =
@@ -291,35 +300,31 @@ mod tests {
291300
292301 #[ test]
293302 fn test_get_merge_request_parts_with_github ( ) {
294- let MergeRequestParts { path, tail } =
295- get_merge_request_parts ( GITHUB_HOSTNAME ) . unwrap ( ) ;
303+ let MergeRequestParts { path, tail } = get_merge_request_parts ( GITHUB_HOSTNAME ) . unwrap ( ) ;
296304
297305 assert_eq ! ( path, "pulls" ) ;
298306 assert_eq ! ( tail, "" ) ;
299307 }
300308
301309 #[ test]
302310 fn test_get_merge_request_parts_with_gitlab ( ) {
303- let MergeRequestParts { path, tail } =
304- get_merge_request_parts ( GITLAB_HOSTNAME ) . unwrap ( ) ;
311+ let MergeRequestParts { path, tail } = get_merge_request_parts ( GITLAB_HOSTNAME ) . unwrap ( ) ;
305312
306313 assert_eq ! ( path, "-/merge_requests" ) ;
307314 assert_eq ! ( tail, "" ) ;
308315 }
309316
310317 #[ test]
311318 fn test_get_merge_request_parts_with_bitbucket ( ) {
312- let MergeRequestParts { path, tail } =
313- get_merge_request_parts ( BITBUCKET_HOSTNAME ) . unwrap ( ) ;
319+ let MergeRequestParts { path, tail } = get_merge_request_parts ( BITBUCKET_HOSTNAME ) . unwrap ( ) ;
314320
315321 assert_eq ! ( path, "pull-requests" ) ;
316322 assert_eq ! ( tail, "" ) ;
317323 }
318324
319325 #[ test]
320326 fn test_get_merge_request_parts_with_gitea ( ) {
321- let MergeRequestParts { path, tail } =
322- get_merge_request_parts ( GITEA_HOSTNAME ) . unwrap ( ) ;
327+ let MergeRequestParts { path, tail } = get_merge_request_parts ( GITEA_HOSTNAME ) . unwrap ( ) ;
323328
324329 assert_eq ! ( path, "pulls" ) ;
325330 assert_eq ! ( tail, "" ) ;
0 commit comments