@@ -210,7 +210,10 @@ impl PackageIdSpec {
210
210
}
211
211
212
212
fn 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 {
214
217
return Ok ( None ) ;
215
218
} ;
216
219
let name = name. to_owned ( ) ;
@@ -438,7 +441,16 @@ mod tests {
438
441
} ,
439
442
"foo" ,
440
443
) ;
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
+ ) ;
442
454
ok (
443
455
"foo:1.2.3" ,
444
456
PackageIdSpec {
@@ -449,7 +461,16 @@ mod tests {
449
461
} ,
450
462
451
463
) ;
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
+ ) ;
453
474
ok (
454
475
455
476
PackageIdSpec {
@@ -460,7 +481,16 @@ mod tests {
460
481
} ,
461
482
462
483
) ;
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
+ ) ;
464
494
ok (
465
495
466
496
PackageIdSpec {
@@ -635,9 +665,15 @@ mod tests {
635
665
} ,
636
666
"path+file:///path/to/my/project/foo#bar" ,
637
667
) ;
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
+ } ,
639
676
"path+file:///path/to/my/project/foo#foo::bar" ,
640
- ErrorKind :: PartialVersion ( _)
641
677
) ;
642
678
ok (
643
679
"path+file:///path/to/my/project/foo#bar:1.1.8" ,
@@ -649,9 +685,15 @@ mod tests {
649
685
} ,
650
686
"path+file:///path/to/my/project/foo#[email protected] " ,
651
687
) ;
652
- err ! (
688
+ ok (
653
689
"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] " ,
655
697
) ;
656
698
ok (
657
699
"path+file:///path/to/my/project/foo#[email protected] " ,
@@ -663,9 +705,15 @@ mod tests {
663
705
} ,
664
706
"path+file:///path/to/my/project/foo#[email protected] " ,
665
707
) ;
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
+ } ,
667
716
"path+file:///path/to/my/project/foo#foo::[email protected] " ,
668
- ErrorKind :: PartialVersion ( _)
669
717
) ;
670
718
}
671
719
@@ -676,8 +724,8 @@ mod tests {
676
724
err ! ( "baz@" , ErrorKind :: PartialVersion ( _) ) ;
677
725
err ! ( "baz@*" , ErrorKind :: PartialVersion ( _) ) ;
678
726
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 ( _) ) ;
681
729
err ! (
682
730
"foobar+https://github.com/rust-lang/crates.io-index" ,
683
731
ErrorKind :: UnsupportedProtocol ( _)
0 commit comments