@@ -22,6 +22,7 @@ use glob::Pattern;
2222use regex:: Regex ;
2323use secrecy:: SecretString ;
2424use std:: path:: PathBuf ;
25+ use url:: Url ;
2526
2627#[ derive( Debug , Clone , Copy , ValueEnum ) ]
2728pub enum Strip {
@@ -353,10 +354,16 @@ impl TypedValueParser for RemoteValueParser {
353354 value : & std:: ffi:: OsStr ,
354355 ) -> Result < Self :: Value , clap:: Error > {
355356 let inner = clap:: builder:: StringValueParser :: new ( ) ;
356- let value = inner. parse_ref ( cmd, arg, value) ?;
357- let parts = value. split ( '/' ) . rev ( ) . collect :: < Vec < & str > > ( ) ;
358- if let ( Some ( owner) , Some ( repo) ) = ( parts. get ( 1 ) , parts. first ( ) ) {
359- Ok ( RemoteValue ( Remote :: new ( * owner, * repo) ) )
357+ let mut value = inner. parse_ref ( cmd, arg, value) ?;
358+ if let Ok ( url) = Url :: parse ( & value) {
359+ value = url. path ( ) . trim_start_matches ( '/' ) . to_string ( ) ;
360+ }
361+ let parts = value. rsplit_once ( '/' ) ;
362+ if let Some ( ( owner, repo) ) = parts {
363+ Ok ( RemoteValue ( Remote :: new (
364+ owner. to_string ( ) ,
365+ repo. to_string ( ) ,
366+ ) ) )
360367 } else {
361368 let mut err = clap:: Error :: new ( ErrorKind :: ValueValidation ) . with_cmd ( cmd) ;
362369 if let Some ( arg) = arg {
@@ -460,9 +467,14 @@ mod tests {
460467 OsStr :: new( "test/repo" )
461468 ) ?
462469 ) ;
463- assert ! ( remote_value_parser
464- . parse_ref( & Opt :: command( ) , None , OsStr :: new( "test" ) )
465- . is_err( ) ) ;
470+ assert_eq ! (
471+ RemoteValue ( Remote :: new( "gitlab/group/test" , "repo" ) ) ,
472+ remote_value_parser. parse_ref(
473+ & Opt :: command( ) ,
474+ None ,
475+ OsStr :: new( "gitlab/group/test/repo" )
476+ ) ?
477+ ) ;
466478 assert_eq ! (
467479 RemoteValue ( Remote :: new( "test" , "testrepo" ) ) ,
468480 remote_value_parser. parse_ref(
@@ -471,6 +483,17 @@ mod tests {
471483 OsStr :: new( "https://github.com/test/testrepo" )
472484 ) ?
473485 ) ;
486+ assert_eq ! (
487+ RemoteValue ( Remote :: new( "archlinux/packaging/packages" , "arch-repro-status" ) ) ,
488+ remote_value_parser. parse_ref(
489+ & Opt :: command( ) ,
490+ None ,
491+ OsStr :: new( "https://gitlab.archlinux.org/archlinux/packaging/packages/arch-repro-status" )
492+ ) ?
493+ ) ;
494+ assert ! ( remote_value_parser
495+ . parse_ref( & Opt :: command( ) , None , OsStr :: new( "test" ) )
496+ . is_err( ) ) ;
474497 assert ! ( remote_value_parser
475498 . parse_ref( & Opt :: command( ) , None , OsStr :: new( "" ) )
476499 . is_err( ) ) ;
0 commit comments