9
9
// except according to those terms.
10
10
11
11
use version:: { try_getting_version, try_getting_local_version,
12
- Version , NoVersion , split_version } ;
12
+ Version , NoVersion , ExactRevision } ;
13
13
use std:: hash:: Streaming ;
14
14
use std:: hash;
15
+ use syntax:: crateid;
15
16
16
17
/// Path-fragment identifier of a package such as
17
18
/// 'github.com/graydon/test'; path must be a relative
@@ -45,27 +46,14 @@ impl CrateId {
45
46
pub fn new ( s : & str ) -> CrateId {
46
47
use conditions:: bad_pkg_id:: cond;
47
48
48
- let mut given_version = None ;
49
-
50
- // Did the user request a specific version?
51
- let s = match split_version ( s) {
52
- Some ( ( path, v) ) => {
53
- given_version = Some ( v) ;
54
- path
55
- }
56
- None => {
57
- s
58
- }
59
- } ;
60
-
61
- let path = Path :: new ( s) ;
62
- if !path. is_relative ( ) {
63
- return cond. raise ( ( path, ~"absolute crate_id") ) ;
64
- }
65
- if path. filename ( ) . is_none ( ) {
66
- return cond. raise ( ( path, ~"0 -length crate_id") ) ;
49
+ let raw_crateid: Option < crateid:: CrateId > = from_str ( s) ;
50
+ if raw_crateid. is_none ( ) {
51
+ return cond. raise ( ( Path :: new ( s) , ~"bad crateid") )
67
52
}
68
- let short_name = path. filestem_str ( ) . expect ( format ! ( "Strange path! {}" , s) ) ;
53
+ let raw_crateid = raw_crateid. unwrap ( ) ;
54
+ let crateid:: CrateId { path, name, version } = raw_crateid;
55
+ let path = Path :: new ( path) ;
56
+ let given_version = version. map ( |v| ExactRevision ( v) ) ;
69
57
70
58
let version = match given_version {
71
59
Some ( v) => v,
@@ -79,8 +67,8 @@ impl CrateId {
79
67
} ;
80
68
81
69
CrateId {
82
- path : path. clone ( ) ,
83
- short_name : short_name . to_owned ( ) ,
70
+ path : path,
71
+ short_name : name ,
84
72
version : version
85
73
}
86
74
}
0 commit comments