@@ -56,6 +56,15 @@ impl PackageIdSpec {
56
56
return PackageIdSpec :: from_url ( url) ;
57
57
}
58
58
if !spec. contains ( "://" ) {
59
+ if spec. starts_with ( '/' ) {
60
+ // This is out of current pkgid spec.
61
+ // Only for fixing rust-lang/cargo#9041
62
+ bail ! (
63
+ "pkgid urls with local paths must be prefixed \
64
+ with a `file://` scheme: {}",
65
+ spec
66
+ )
67
+ }
59
68
if let Ok ( url) = Url :: parse ( & format ! ( "cargo://{}" , spec) ) {
60
69
return PackageIdSpec :: from_url ( url) ;
61
70
}
@@ -97,9 +106,6 @@ impl PackageIdSpec {
97
106
98
107
/// Tries to convert a valid `Url` to a `PackageIdSpec`.
99
108
fn from_url ( mut url : Url ) -> CargoResult < PackageIdSpec > {
100
- if url. host ( ) . is_none ( ) {
101
- bail ! ( "pkgid urls must have a host: {}" , url)
102
- }
103
109
if url. query ( ) . is_some ( ) {
104
110
bail ! ( "cannot have a query string in a pkgid: {}" , url)
105
111
}
@@ -279,8 +285,7 @@ impl fmt::Display for PackageIdSpec {
279
285
match self . url {
280
286
Some ( ref url) => {
281
287
if url. scheme ( ) == "cargo" {
282
- let host = url. host ( ) . unwrap_or ( url:: Host :: Domain ( "" ) ) ;
283
- write ! ( f, "{}{}" , host, url. path( ) ) ?;
288
+ write ! ( f, "{}{}" , url. host( ) . unwrap( ) , url. path( ) ) ?;
284
289
} else {
285
290
write ! ( f, "{}" , url) ?;
286
291
}
@@ -409,7 +414,6 @@ mod tests {
409
414
assert ! ( PackageIdSpec :: parse( "baz:1.0" ) . is_err( ) ) ;
410
415
assert ! ( PackageIdSpec :: parse( "https://baz:1.0" ) . is_err( ) ) ;
411
416
assert ! ( PackageIdSpec :: parse( "https://#baz:1.0" ) . is_err( ) ) ;
412
- assert ! ( PackageIdSpec :: parse( "file:///baz" ) . is_err( ) ) ;
413
417
assert ! ( PackageIdSpec :: parse( "/baz" ) . is_err( ) ) ;
414
418
}
415
419
0 commit comments