@@ -210,7 +210,10 @@ impl PackageIdSpec {
210210}
211211
212212fn parse_spec ( spec : & str ) -> Result < Option < ( String , Option < PartialVersion > ) > > {
213- let Some ( ( name, ver) ) = spec. split_once ( [ ':' , '@' ] ) else {
213+ let Some ( ( name, ver) ) = spec
214+ . rsplit_once ( '@' )
215+ . or_else ( || spec. rsplit_once ( ':' ) . filter ( |( n, _) | !n. ends_with ( ':' ) ) )
216+ else {
214217 return Ok ( None ) ;
215218 } ;
216219 let name = name. to_owned ( ) ;
@@ -438,7 +441,16 @@ mod tests {
438441 } ,
439442 "foo" ,
440443 ) ;
441- err ! ( "foo::bar" , ErrorKind :: PartialVersion ( _) ) ;
444+ ok (
445+ "foo::bar" ,
446+ PackageIdSpec {
447+ name : String :: from ( "foo::bar" ) ,
448+ version : None ,
449+ url : None ,
450+ kind : None ,
451+ } ,
452+ "foo::bar" ,
453+ ) ;
442454 ok (
443455 "foo:1.2.3" ,
444456 PackageIdSpec {
@@ -449,7 +461,16 @@ mod tests {
449461 } ,
450462451463 ) ;
452- err ! ( "foo::bar:1.2.3" , ErrorKind :: PartialVersion ( _) ) ;
464+ ok (
465+ "foo::bar:1.2.3" ,
466+ PackageIdSpec {
467+ name : String :: from ( "foo::bar" ) ,
468+ version : Some ( "1.2.3" . parse ( ) . unwrap ( ) ) ,
469+ url : None ,
470+ kind : None ,
471+ } ,
472+ 473+ ) ;
453474 ok (
454475455476 PackageIdSpec {
@@ -460,7 +481,16 @@ mod tests {
460481 } ,
461482462483 ) ;
463- err ! ( "foo::[email protected] " , ErrorKind :: PartialVersion ( _
) ) ; 484+ ok (
485+ 486+ PackageIdSpec {
487+ name : String :: from ( "foo::bar" ) ,
488+ version : Some ( "1.2.3" . parse ( ) . unwrap ( ) ) ,
489+ url : None ,
490+ kind : None ,
491+ } ,
492+ 493+ ) ;
464494 ok (
465495466496 PackageIdSpec {
@@ -635,9 +665,15 @@ mod tests {
635665 } ,
636666 "path+file:///path/to/my/project/foo#bar" ,
637667 ) ;
638- err ! (
668+ ok (
669+ "path+file:///path/to/my/project/foo#foo::bar" ,
670+ PackageIdSpec {
671+ name : String :: from ( "foo::bar" ) ,
672+ version : None ,
673+ url : Some ( Url :: parse ( "file:///path/to/my/project/foo" ) . unwrap ( ) ) ,
674+ kind : Some ( SourceKind :: Path ) ,
675+ } ,
639676 "path+file:///path/to/my/project/foo#foo::bar" ,
640- ErrorKind :: PartialVersion ( _)
641677 ) ;
642678 ok (
643679 "path+file:///path/to/my/project/foo#bar:1.1.8" ,
@@ -649,9 +685,15 @@ mod tests {
649685 } ,
650686 "path+file:///path/to/my/project/foo#[email protected] " , 651687 ) ;
652- err ! (
688+ ok (
653689 "path+file:///path/to/my/project/foo#foo::bar:1.1.8" ,
654- ErrorKind :: PartialVersion ( _)
690+ PackageIdSpec {
691+ name : String :: from ( "foo::bar" ) ,
692+ version : Some ( "1.1.8" . parse ( ) . unwrap ( ) ) ,
693+ url : Some ( Url :: parse ( "file:///path/to/my/project/foo" ) . unwrap ( ) ) ,
694+ kind : Some ( SourceKind :: Path ) ,
695+ } ,
696+ "path+file:///path/to/my/project/foo#foo::[email protected] " , 655697 ) ;
656698 ok (
657699 "path+file:///path/to/my/project/foo#[email protected] " , @@ -663,9 +705,15 @@ mod tests {
663705 } ,
664706 "path+file:///path/to/my/project/foo#[email protected] " , 665707 ) ;
666- err ! (
708+ ok (
709+ "path+file:///path/to/my/project/foo#foo::[email protected] " , 710+ PackageIdSpec {
711+ name : String :: from ( "foo::bar" ) ,
712+ version : Some ( "1.1.8" . parse ( ) . unwrap ( ) ) ,
713+ url : Some ( Url :: parse ( "file:///path/to/my/project/foo" ) . unwrap ( ) ) ,
714+ kind : Some ( SourceKind :: Path ) ,
715+ } ,
667716 "path+file:///path/to/my/project/foo#foo::[email protected] " , 668- ErrorKind :: PartialVersion ( _)
669717 ) ;
670718 }
671719
@@ -676,8 +724,8 @@ mod tests {
676724 err ! ( "baz@" , ErrorKind :: PartialVersion ( _) ) ;
677725 err ! ( "baz@*" , ErrorKind :: PartialVersion ( _) ) ;
678726 err ! ( "baz@^1.0" , ErrorKind :: PartialVersion ( _) ) ;
679- err ! ( "https://baz:1.0" , ErrorKind :: PartialVersion ( _) ) ;
680- err ! ( "https://#baz:1.0" , ErrorKind :: PartialVersion ( _) ) ;
727+ err ! ( "https://baz:1.0" , ErrorKind :: NameValidation ( _) ) ;
728+ err ! ( "https://#baz:1.0" , ErrorKind :: NameValidation ( _) ) ;
681729 err ! (
682730 "foobar+https://github.com/rust-lang/crates.io-index" ,
683731 ErrorKind :: UnsupportedProtocol ( _)
0 commit comments