]> git.lizzy.rs Git - rust.git/commitdiff
rustpkg: Compute hash to find crate
authorklutzy <klutzytheklutzy@gmail.com>
Fri, 10 Jan 2014 04:12:59 +0000 (13:12 +0900)
committerklutzy <klutzytheklutzy@gmail.com>
Wed, 22 Jan 2014 18:03:55 +0000 (03:03 +0900)
Previously rustpkg tried to parse filenames to find crate. Now ue use
deterministic hashes, so it becomes possible to directly construct
filename and check if the file exists.

src/librustpkg/crate_id.rs
src/librustpkg/package_source.rs
src/librustpkg/path_util.rs
src/librustpkg/tests.rs
src/librustpkg/util.rs

index 9415e850e98ed0e28dc711042e3140c894ac94c3..4a87bcb70f50a586364595ff42549dfe2dc8a7c9 100644 (file)
@@ -9,8 +9,9 @@
 // except according to those terms.
 
 use std::hash::Streaming;
-use std::hash;
 use syntax::crateid;
+use extra::hex::ToHex;
+use rustc::util::sha2::{Digest, Sha256};
 
 /// Path-fragment identifier of a package such as
 /// 'github.com/graydon/test'; path must be a relative
@@ -41,7 +42,7 @@ fn eq(&self, other: &CrateId) -> bool {
 }
 
 impl CrateId {
-    pub fn get_version<'a>(&'a self) -> &'a str {
+    pub fn version_or_default<'a>(&'a self) -> &'a str {
         match self.version {
             Some(ref ver) => ver.as_slice(),
             None => "0.0"
@@ -66,16 +67,24 @@ pub fn new(s: &str) -> CrateId {
         }
     }
 
+    pub fn to_crate_id_str(&self) -> ~str {
+        format!("{}\\#{}", self.path.as_str().unwrap(), self.version_or_default())
+    }
+
+    pub fn to_lib_name(&self) -> ~str {
+        format!("{}-{}-{}", self.short_name, self.hash(), self.version_or_default())
+    }
+
     pub fn hash(&self) -> ~str {
-        // FIXME (#9639): hash should take a &[u8] so we can hash the real path
-        self.path.display().with_str(|s| {
-            let vers = self.get_version();
-            format!("{}-{}-{}", s, hash(s + vers), vers)
-        })
+        let mut hasher = Sha256::new();
+        hasher.reset();
+        hasher.input_str(self.to_crate_id_str());
+        let hash = hasher.result_bytes().to_hex();
+        hash.slice_chars(0, 8).to_owned()
     }
 
     pub fn short_name_with_version(&self) -> ~str {
-        format!("{}-{}", self.short_name, self.get_version())
+        format!("{}-{}", self.short_name, self.version_or_default())
     }
 
     /// True if the ID has multiple components
@@ -126,18 +135,10 @@ fn next(&mut self) -> Option<(Path, Path)> {
 impl ToStr for CrateId {
     fn to_str(&self) -> ~str {
         // should probably use the filestem and not the whole path
-        format!("{}-{}", self.path.as_str().unwrap(), self.get_version())
+        format!("{}-{}", self.path.as_str().unwrap(), self.version_or_default())
     }
 }
 
-
 pub fn write<W: Writer>(writer: &mut W, string: &str) {
     writer.write(string.as_bytes());
 }
-
-pub fn hash(data: ~str) -> ~str {
-    let hasher = &mut hash::default_state();
-    write(hasher, data);
-    hasher.result_str()
-}
-
index fce2f9e4d0c6b135e368326114344da6c20c00fd..2bc1966bff0e4873289cf12aa8adba7b29406e6b 100644 (file)
@@ -287,7 +287,7 @@ pub fn fetch_git(local: &Path, crateid: &CrateId) -> Option<Path> {
                 // FIXME (#9639): This needs to handle non-utf8 paths
                 let url = format!("https://{}", crateid.path.as_str().unwrap());
                 debug!("Fetching package: git clone {} {} [version={}]",
-                        url, clone_target.display(), crateid.get_version());
+                        url, clone_target.display(), crateid.version_or_default());
 
                 let mut failed = false;
 
index d8dee82d09e8aa34f3f53caae28c73401efebfef..1412b99d285f1b993eeceb489daea0993470a5ea 100644 (file)
 
 pub use crate_id::CrateId;
 pub use target::{OutputType, Main, Lib, Test, Bench, Target, Build, Install};
-pub use version::{Version, split_version, split_version_general,
-    try_parsing_version};
+pub use version::{Version, split_version, split_version_general, try_parsing_version};
 pub use rustc::metadata::filesearch::rust_path;
-use rustc::metadata::filesearch::{libdir, relative_target_lib_path};
-use rustc::driver::driver::host_triple;
 
 use std::libc;
 use std::libc::consts::os::posix88::{S_IRUSR, S_IWUSR, S_IXUSR};
 use std::os;
 use std::io;
 use std::io::fs;
+use rustc::metadata::filesearch::{libdir, relative_target_lib_path};
+use rustc::driver::driver::host_triple;
 use messages::*;
 
 pub fn default_workspace() -> Path {
@@ -173,151 +172,57 @@ fn output_in_workspace(crateid: &CrateId, workspace: &Path, what: OutputType) ->
 /// Figure out what the library name for <crateid> in <workspace>'s build
 /// directory is, and if the file exists, return it.
 pub fn built_library_in_workspace(crateid: &CrateId, workspace: &Path) -> Option<Path> {
-    library_in_workspace(&crateid.path, crateid.short_name, Build, workspace, "build",
-                         &crateid.version)
+    library_in_workspace(crateid, Build, workspace)
 }
 
 /// Does the actual searching stuff
-pub fn installed_library_in_workspace(pkg_path: &Path, workspace: &Path) -> Option<Path> {
+pub fn installed_library_in_workspace(crate_id: &CrateId, workspace: &Path) -> Option<Path> {
     // This could break once we're handling multiple versions better -- I should add a test for it
     // FIXME (#9639): This needs to handle non-utf8 paths
-    match pkg_path.filename_str() {
+    match crate_id.path.filename_str() {
         None => None,
-        Some(short_name) => library_in_workspace(pkg_path,
-                                                 short_name,
-                                                 Install,
-                                                 workspace,
-                                                 libdir(),
-                                                 &None)
+        Some(_short_name) => library_in_workspace(crate_id, Install, workspace)
     }
 }
 
 /// `workspace` is used to figure out the directory to search.
 /// `short_name` is taken as the link name of the library.
-pub fn library_in_workspace(path: &Path, short_name: &str, where: Target,
-                        workspace: &Path, prefix: &str, version: &Version) -> Option<Path> {
+pub fn library_in_workspace(crate_id: &CrateId, where: Target, workspace: &Path) -> Option<Path> {
     debug!("library_in_workspace: checking whether a library named {} exists",
-           short_name);
-
-    // We don't know what the hash is, so we have to search through the directory
-    // contents
-
-    debug!("short_name = {} where = {:?} workspace = {} \
-            prefix = {}", short_name, where, workspace.display(), prefix);
+           crate_id.short_name);
 
     let dir_to_search = match where {
-        Build => target_build_dir(workspace).join(path),
+        Build => target_build_dir(workspace).join(&crate_id.path),
         Install => target_lib_dir(workspace)
     };
 
-    library_in(short_name, version, &dir_to_search)
+    library_in(crate_id, &dir_to_search)
 }
 
 pub fn system_library(sysroot: &Path, crate_id: &str) -> Option<Path> {
-    let (lib_name, version) = split_crate_id(crate_id);
-    library_in(lib_name, &version, &sysroot.join(relative_target_lib_path(host_triple())))
-}
-
-fn library_in(short_name: &str, version: &Version, dir_to_search: &Path) -> Option<Path> {
-    debug!("Listing directory {}", dir_to_search.display());
-    let dir_contents = {
-        let _guard = io::ignore_io_error();
-        fs::readdir(dir_to_search)
-    };
-    debug!("dir has {:?} entries", dir_contents.len());
-
-    let dll_prefix = format!("{}{}", os::consts::DLL_PREFIX, short_name);
-    let dll_filetype = os::consts::DLL_EXTENSION;
-    let rlib_prefix = format!("{}{}", "lib", short_name);
-    let rlib_filetype = "rlib";
-
-    debug!("dll_prefix = {} and dll_filetype = {}", dll_prefix, dll_filetype);
-    debug!("rlib_prefix = {} and rlib_filetype = {}", rlib_prefix, rlib_filetype);
-
-    // Find a filename that matches the pattern:
-    // (lib_prefix)-hash-(version)(lib_suffix)
-    let mut libraries = dir_contents.iter().filter(|p| {
-        let extension = p.extension_str();
-        debug!("p = {}, p's extension is {:?}", p.display(), extension);
-        match extension {
-            None => false,
-            Some(ref s) => dll_filetype == *s || rlib_filetype == *s,
+    library_in(&CrateId::new(crate_id), &sysroot.join(relative_target_lib_path(host_triple())))
+}
+
+fn library_in(crate_id: &CrateId, dir_to_search: &Path) -> Option<Path> {
+    let lib_name = crate_id.to_lib_name();
+    let filenames = [
+        format!("{}{}.{}", "lib", lib_name, "rlib"),
+        format!("{}{}{}", os::consts::DLL_PREFIX, lib_name, os::consts::DLL_SUFFIX),
+    ];
+
+    for filename in filenames.iter() {
+        debug!("filename = {}", filename.as_slice());
+        let path = dir_to_search.join(filename.as_slice());
+        if path.exists() {
+            debug!("found: {}", path.display());
+            return Some(path);
         }
-    });
-
-    let mut result_filename = None;
-    for p_path in libraries {
-        // Find a filename that matches the pattern: (lib_prefix)-hash-(version)(lib_suffix)
-        // and remember what the hash was
-        let mut f_name = match p_path.filestem_str() {
-            Some(s) => s, None => continue
-        };
-        // Already checked the filetype above
-
-         // This is complicated because library names and versions can both contain dashes
-         loop {
-            if f_name.is_empty() { break; }
-            match f_name.rfind('-') {
-                Some(i) => {
-                    debug!("Maybe {} is a version", f_name.slice(i + 1, f_name.len()));
-                    match try_parsing_version(f_name.slice(i + 1, f_name.len())) {
-                        Some(ref found_vers) if version == &Some(found_vers.to_owned()) ||
-                                                version == &None => {
-                            match f_name.slice(0, i).rfind('-') {
-                                Some(j) => {
-                                    let lib_prefix = match p_path.extension_str() {
-                                        Some(ref s) if dll_filetype == *s => &dll_prefix,
-                                        _ => &rlib_prefix,
-                                    };
-                                    debug!("Maybe {} equals {}", f_name.slice(0, j), *lib_prefix);
-                                    if f_name.slice(0, j) == *lib_prefix {
-                                        result_filename = Some(p_path.clone());
-                                    }
-                                    break;
-                                }
-                                None => break
-                            }
-                       }
-                       _ => { f_name = f_name.slice(0, i); }
-                 }
-               }
-               None => break
-         } // match
-       } // loop
-    } // for
-
-    if result_filename.is_none() {
-        debug!("warning: library_in_workspace didn't find a library in {} for {}",
-                  dir_to_search.display(), short_name);
-    }
-
-    // Return the filename that matches, which we now know exists
-    // (if result_filename != None)
-    let abs_path = result_filename.map(|result_filename| {
-        let absolute_path = dir_to_search.join(&result_filename);
-        debug!("result_filename = {}", absolute_path.display());
-        absolute_path
-    });
-
-    abs_path
-}
-
-fn split_crate_id<'a>(crate_id: &'a str) -> (&'a str, Version) {
-    match split_version(crate_id) {
-        Some((name, vers)) =>
-            match vers {
-                Some(ref v) => match v.find('-') {
-                    Some(pos) => (name, Some(v.slice(0, pos).to_owned())),
-                    None => (name, Some(v.to_owned()))
-                },
-                _ => (name, vers)
-            },
-        None => (crate_id, None)
     }
+    debug!("warning: library_in_workspace didn't find a library in {} for {}",
+           dir_to_search.display(), crate_id.short_name);
+    return None;
 }
 
-
-
 /// Returns the executable that would be installed for <crateid>
 /// in <workspace>
 /// As a side effect, creates the bin-dir if it doesn't exist
index be5b6859c74e438e610ffb43686ad06e11e75cea..4bc9714fa2ac2bd4c6021382d3a8224dfeef5126 100644 (file)
@@ -343,13 +343,13 @@ fn create_local_package_with_custom_build_hook(crateid: &CrateId,
 
 }
 
-fn assert_lib_exists(repo: &Path, pkg_path: &Path, v: Option<~str>) {
-    assert!(lib_exists(repo, pkg_path, v));
+fn assert_lib_exists(repo: &Path, crate_id: &CrateId) {
+    assert!(lib_exists(repo, crate_id));
 }
 
-fn lib_exists(repo: &Path, pkg_path: &Path, _v: Option<~str>) -> bool { // ??? version?
-    debug!("assert_lib_exists: repo = {}, pkg_path = {}", repo.display(), pkg_path.display());
-    let lib = installed_library_in_workspace(pkg_path, repo);
+fn lib_exists(repo: &Path, crate_id: &CrateId) -> bool {
+    debug!("assert_lib_exists: repo = {}, crate_id = {}", repo.display(), crate_id.to_str());
+    let lib = installed_library_in_workspace(crate_id, repo);
     debug!("assert_lib_exists: checking whether {:?} exists", lib);
     lib.is_some() && {
         let libname = lib.get_ref();
@@ -465,12 +465,9 @@ fn command_line_test_output_with_env(args: &[~str], env: ~[(~str, ~str)]) -> ~[~
 fn lib_output_file_name(workspace: &Path, short_name: &str) -> Path {
     debug!("lib_output_file_name: given {} and short name {}",
            workspace.display(), short_name);
-    library_in_workspace(&Path::new(short_name),
-                         short_name,
+    library_in_workspace(&CrateId::new(short_name),
                          Build,
-                         workspace,
-                         "build",
-                         &None).expect("lib_output_file_name")
+                         workspace).expect("lib_output_file_name")
 }
 
 #[cfg(target_os = "linux")]
@@ -578,7 +575,7 @@ fn test_install_valid() {
     assert!(exec.exists());
     assert!(is_rwx(&exec));
 
-    let lib = installed_library_in_workspace(&temp_pkg_id.path, temp_workspace);
+    let lib = installed_library_in_workspace(&temp_pkg_id, temp_workspace);
     debug!("lib = {:?}", lib);
     assert!(lib.as_ref().map_or(false, |l| l.exists()));
     assert!(lib.as_ref().map_or(false, |l| is_rwx(l)));
@@ -629,7 +626,7 @@ fn test_install_valid_external() {
     assert!(exec.exists());
     assert!(is_rwx(&exec));
 
-    let lib = installed_library_in_workspace(&temp_pkg_id.path, temp_workspace);
+    let lib = installed_library_in_workspace(&temp_pkg_id, temp_workspace);
     debug!("lib = {:?}", lib);
     assert!(lib.as_ref().map_or(false, |l| l.exists()));
     assert!(lib.as_ref().map_or(false, |l| is_rwx(l)));
@@ -687,7 +684,7 @@ fn test_install_git() {
     let _built_lib =
         built_library_in_workspace(&temp_pkg_id,
                                    &ws).expect("test_install_git: built lib should exist");
-    assert_lib_exists(&ws, &temp_pkg_id.path, temp_pkg_id.version.clone());
+    assert_lib_exists(&ws, &temp_pkg_id);
     let built_test = built_test_in_workspace(&temp_pkg_id,
                          &ws).expect("test_install_git: built test should exist");
     assert!(built_test.exists());
@@ -768,7 +765,7 @@ fn test_package_request_version() {
 
     command_line_test([~"install", format!("{}\\#0.3", local_path)], repo);
 
-    assert!(match installed_library_in_workspace(&Path::new("test_pkg_version"),
+    assert!(match installed_library_in_workspace(&CrateId::new(format!("{}\\#0.3", local_path)),
                                                  &repo.join(".rust")) {
         Some(p) => {
             debug!("installed: {}", p.display());
@@ -812,10 +809,10 @@ fn rustpkg_library_target() {
               "#[test] pub fn f() { (); }");
     writeFile(&package_dir.join("bench.rs"),
               "#[bench] pub fn f() { (); }");
+    add_git_tag(&package_dir, ~"0.0");
 
-    add_git_tag(&package_dir, ~"1.0");
     command_line_test([~"install", ~"foo"], foo_repo);
-    assert_lib_exists(&foo_repo.join(".rust"), &Path::new("foo"), Some(~"1.0"));
+    assert_lib_exists(&foo_repo.join(".rust"), &CrateId::new("foo"));
 }
 
 #[test]
@@ -838,7 +835,7 @@ fn package_script_with_default_build() {
     debug!("package_script_with_default_build: {}", source.display());
     fs::copy(&source, &dir.join_many(["src", "fancy-lib-0.0", "pkg.rs"]));
     command_line_test([~"install", ~"fancy-lib"], dir);
-    assert_lib_exists(dir, &Path::new("fancy-lib"), None);
+    assert_lib_exists(dir, &CrateId::new("fancy-lib"));
     assert!(target_build_dir(dir).join_many([~"fancy-lib", ~"generated.rs"]).exists());
     let generated_path = target_build_dir(dir).join_many([~"fancy-lib", ~"generated.rs"]);
     debug!("generated path = {}", generated_path.display());
@@ -869,7 +866,7 @@ fn rustpkg_install_no_arg() {
               "fn main() { let _x = (); }");
     debug!("install_no_arg: dir = {}", package_dir.display());
     command_line_test([~"install"], &package_dir);
-    assert_lib_exists(&tmp, &Path::new("foo"), None);
+    assert_lib_exists(&tmp, &CrateId::new("foo"));
 }
 
 #[test]
@@ -1047,7 +1044,7 @@ fn no_recopying() {
     let workspace = create_local_package(&p_id);
     let workspace = workspace.path();
     command_line_test([~"install", ~"foo"], workspace);
-    let foo_lib = installed_library_in_workspace(&p_id.path, workspace);
+    let foo_lib = installed_library_in_workspace(&p_id, workspace);
     assert!(foo_lib.is_some());
     // Now make `foo` read-only so that subsequent attempts to copy to it will fail
     assert!(chmod_read_only(&foo_lib.unwrap()));
@@ -1352,11 +1349,11 @@ fn rust_path_hack_test(hack_flag: bool) {
                foo_path.as_str().unwrap()))]);
    command_line_test_with_env(~[~"install"] + if hack_flag { ~[~"--rust-path-hack"] } else { ~[] } +
                                ~[~"foo"], dest_workspace, rust_path);
-   assert_lib_exists(dest_workspace, &Path::new("foo"), None);
+   assert_lib_exists(dest_workspace, &CrateId::new("foo"));
    assert_executable_exists(dest_workspace, "foo");
    assert_built_library_exists(dest_workspace, "foo");
    assert_built_executable_exists(dest_workspace, "foo");
-   assert!(!lib_exists(workspace, &Path::new("foo"), None));
+   assert!(!lib_exists(workspace, &CrateId::new("foo")));
    assert!(!executable_exists(workspace, "foo"));
    assert!(!built_library_exists(workspace, "foo"));
    assert!(!built_executable_exists(workspace, "foo"));
@@ -1397,9 +1394,9 @@ fn rust_path_hack_cwd() {
    let rust_path = Some(~[(~"RUST_PATH", dest_workspace.as_str().unwrap().to_owned())]);
    command_line_test_with_env([~"install", ~"--rust-path-hack", ~"foo"], &cwd, rust_path);
    debug!("Checking that foo exists in {}", dest_workspace.display());
-   assert_lib_exists(dest_workspace, &Path::new("foo"), None);
+   assert_lib_exists(dest_workspace, &CrateId::new("foo"));
    assert_built_library_exists(dest_workspace, "foo");
-   assert!(!lib_exists(&cwd, &Path::new("foo"), None));
+   assert!(!lib_exists(&cwd, &CrateId::new("foo")));
    assert!(!built_library_exists(&cwd, "foo"));
 }
 
@@ -1418,9 +1415,9 @@ fn rust_path_hack_multi_path() {
    let rust_path = Some(~[(~"RUST_PATH", dest_workspace.as_str().unwrap().to_owned())]);
    command_line_test_with_env([~"install", ~"--rust-path-hack", name.clone()], &subdir, rust_path);
    debug!("Checking that {} exists in {}", name, dest_workspace.display());
-   assert_lib_exists(dest_workspace, &Path::new("quux"), None);
+   assert_lib_exists(dest_workspace, &CrateId::new("foo/bar/quux"));
    assert_built_library_exists(dest_workspace, name);
-   assert!(!lib_exists(&subdir, &Path::new("quux"), None));
+   assert!(!lib_exists(&subdir, &CrateId::new("foo/bar/quux")));
    assert!(!built_library_exists(&subdir, name));
 }
 
@@ -1439,9 +1436,9 @@ fn rust_path_hack_install_no_arg() {
    let rust_path = Some(~[(~"RUST_PATH", dest_workspace.as_str().unwrap().to_owned())]);
    command_line_test_with_env([~"install", ~"--rust-path-hack"], &source_dir, rust_path);
    debug!("Checking that foo exists in {}", dest_workspace.display());
-   assert_lib_exists(dest_workspace, &Path::new("foo"), None);
+   assert_lib_exists(dest_workspace, &CrateId::new("foo"));
    assert_built_library_exists(dest_workspace, "foo");
-   assert!(!lib_exists(&source_dir, &Path::new("foo"), None));
+   assert!(!lib_exists(&source_dir, &CrateId::new("foo")));
    assert!(!built_library_exists(cwd, "foo"));
 }
 
@@ -1603,7 +1600,7 @@ fn notrans_flag_fail() {
                           workspace, None, BAD_FLAG_CODE);
         assert!(!built_executable_exists(workspace, "foo"));
         assert!(!object_file_exists(workspace, "foo"));
-        assert!(!lib_exists(workspace, &Path::new("foo"), None));
+        assert!(!lib_exists(workspace, &CrateId::new("foo")));
     }
 }
 
@@ -1834,10 +1831,10 @@ fn crateid_pointing_to_subdir() {
     fs::mkdir_recursive(&foo_dir, io::UserRWX);
     fs::mkdir_recursive(&bar_dir, io::UserRWX);
     writeFile(&foo_dir.join("lib.rs"),
-              "#[crate_id=\"mockgithub.com/mozilla/some_repo/extras/rust-foo#foo:0.0\"];" +
+              "#[crate_id=\"mockgithub.com/mozilla/some_repo/extras/foo\"];" +
               "pub fn f() {}");
     writeFile(&bar_dir.join("lib.rs"),
-              "#[crate_id=\"mockgithub.com/mozilla/some_repo/extras/rust-bar#bar:0.0\"];" +
+              "#[crate_id=\"mockgithub.com/mozilla/some_repo/extras/bar\"];" +
               "pub fn g() {}");
 
     debug!("Creating a file in {}", workspace.display());
@@ -1875,9 +1872,9 @@ fn test_recursive_deps() {
     command_line_test_with_env([~"install", ~"a"],
                                a_workspace,
                                environment);
-    assert_lib_exists(a_workspace, &Path::new("a"), None);
-    assert_lib_exists(b_workspace, &Path::new("b"), None);
-    assert_lib_exists(b_workspace, &Path::new("c"), None);
+    assert_lib_exists(a_workspace, &CrateId::new("a"));
+    assert_lib_exists(b_workspace, &CrateId::new("b"));
+    assert_lib_exists(b_workspace, &CrateId::new("c"));
 }
 
 #[test]
@@ -1932,7 +1929,7 @@ fn test_target_specific_install_dir() {
                        ~"foo"],
                       workspace);
     assert!(workspace.join_many([~"lib", host_triple()]).is_dir());
-    assert_lib_exists(workspace, &Path::new("foo"), None);
+    assert_lib_exists(workspace, &CrateId::new("foo"));
     assert!(fs::readdir(&workspace.join("lib")).len() == 1);
     assert!(workspace.join("bin").is_dir());
     assert_executable_exists(workspace, "foo");
@@ -1960,7 +1957,7 @@ fn install_after_build() {
     command_line_test([~"build", ~"b"], workspace);
     command_line_test([~"install", ~"b"], workspace);
     assert_executable_exists(workspace, b_id.short_name);
-    assert_lib_exists(workspace, &b_id.path, None);
+    assert_lib_exists(workspace, &b_id);
 }
 
 #[test]
@@ -1972,7 +1969,7 @@ fn reinstall() {
     // and make sure executable was re-installed
     command_line_test([~"install", ~"b"], workspace);
     assert_executable_exists(workspace, b.short_name);
-    assert_lib_exists(workspace, &b.path, None);
+    assert_lib_exists(workspace, &b);
     remove_executable_file(&b, workspace);
     command_line_test([~"install", ~"b"], workspace);
     assert_executable_exists(workspace, b.short_name);
@@ -2023,13 +2020,13 @@ fn correct_package_name_with_rust_path_hack() {
                                   // FIXME #3408: Should be NONEXISTENT_PACKAGE_CODE
                                dest_workspace, rust_path, COPY_FAILED_CODE);
     assert!(!executable_exists(dest_workspace, "bar"));
-    assert!(!lib_exists(dest_workspace, &bar_id.path.clone(), bar_id.version.clone()));
+    assert!(!lib_exists(dest_workspace, &bar_id));
     assert!(!executable_exists(dest_workspace, "foo"));
-    assert!(!lib_exists(dest_workspace, &foo_id.path.clone(), foo_id.version.clone()));
+    assert!(!lib_exists(dest_workspace, &foo_id));
     assert!(!executable_exists(foo_workspace, "bar"));
-    assert!(!lib_exists(foo_workspace, &bar_id.path.clone(), bar_id.version.clone()));
+    assert!(!lib_exists(foo_workspace, &bar_id));
     assert!(!executable_exists(foo_workspace, "foo"));
-    assert!(!lib_exists(foo_workspace, &foo_id.path.clone(), foo_id.version.clone()));
+    assert!(!lib_exists(foo_workspace, &foo_id));
 }
 
 #[test]
index 18e773d5f15a8ec02385a7d837ab1cf62d00bc06..4c2fc98a305a96f19c9c616674d5d03d799dc203 100644 (file)
@@ -135,7 +135,7 @@ struct CrateSetup<'a> {
     ctx: &'a mut ReadyCtx<'a>,
 }
 
-impl<'a> fold::Folder for CrateSetup<'a> {
+impl<'a> Folder for CrateSetup<'a> {
     fn fold_item(&mut self, item: @ast::Item) -> SmallVector<@ast::Item> {
         fold_item(item, self)
     }
@@ -162,7 +162,7 @@ pub fn ready_crate(sess: session::Session,
 
 pub fn compile_input(context: &BuildContext,
                      exec: &mut workcache::Exec,
-                     pkg_id: &CrateId,
+                     crate_id: &CrateId,
                      in_file: &Path,
                      workspace: &Path,
                      deps: &mut DepMap,
@@ -177,7 +177,7 @@ pub fn compile_input(context: &BuildContext,
     // not sure if we should support anything else
 
     let mut out_dir = target_build_dir(workspace);
-    out_dir.push(&pkg_id.path);
+    out_dir.push(&crate_id.path);
     // Make the output directory if it doesn't exist already
     fs::mkdir_recursive(&out_dir, io::UserRWX);
 
@@ -276,7 +276,7 @@ pub fn compile_input(context: &BuildContext,
     let (mut crate, ast_map) = {
         let installer = CrateInstaller {
             context: context,
-            parent: pkg_id,
+            parent: crate_id,
             parent_crate: in_file,
             sess: sess,
             exec: exec,
@@ -312,10 +312,7 @@ pub fn compile_input(context: &BuildContext,
     if !attr::contains_name(crate.attrs, "crate_id") {
         // FIXME (#9639): This needs to handle non-utf8 paths
         let crateid_attr =
-            attr::mk_name_value_item_str(@"crate_id",
-                                         format!("{}\\#{}",
-                                                 pkg_id.path.as_str().unwrap(),
-                                                 pkg_id.get_version()).to_managed());
+            attr::mk_name_value_item_str(@"crate_id", crate_id.to_crate_id_str().to_managed());
 
         debug!("crateid attr: {:?}", crateid_attr);
         crate.attrs.push(attr::mk_attr(crateid_attr));
@@ -333,7 +330,7 @@ pub fn compile_input(context: &BuildContext,
                                           what);
     // Discover the output
     let discovered_output = if what == Lib  {
-        built_library_in_workspace(pkg_id, workspace) // Huh???
+        built_library_in_workspace(crate_id, workspace) // Huh???
     }
     else {
         result
@@ -435,7 +432,7 @@ pub fn exe_suffix() -> ~str { ~"" }
 // Called by build_crates
 pub fn compile_crate(ctxt: &BuildContext,
                      exec: &mut workcache::Exec,
-                     pkg_id: &CrateId,
+                     crate_id: &CrateId,
                      crate: &Path,
                      workspace: &Path,
                      deps: &mut DepMap,
@@ -444,11 +441,11 @@ pub fn compile_crate(ctxt: &BuildContext,
                      opt: session::OptLevel,
                      what: OutputType) -> Option<Path> {
     debug!("compile_crate: crate={}, workspace={}", crate.display(), workspace.display());
-    debug!("compile_crate: short_name = {}, flags =...", pkg_id.to_str());
+    debug!("compile_crate: short_name = {}, flags =...", crate_id.to_str());
     for fl in flags.iter() {
         debug!("+++ {}", *fl);
     }
-    compile_input(ctxt, exec, pkg_id, crate, workspace, deps, flags, cfgs, opt, what)
+    compile_input(ctxt, exec, crate_id, crate, workspace, deps, flags, cfgs, opt, what)
 }
 
 struct CrateInstaller<'a> {
@@ -497,10 +494,10 @@ fn install_crate(&mut self, vi: &ast::ViewItem) {
                         debug!("Trying to install library {}, rebuilding it",
                                lib_name.to_str());
                         // Try to install it
-                        let pkg_id = CrateId::new(lib_name);
+                        let crate_id = CrateId::new(lib_name);
                         // Find all the workspaces in the RUST_PATH that contain this package.
                         let workspaces = pkg_parent_workspaces(&self.context.context,
-                                                               &pkg_id);
+                                                               &crate_id);
                         // Three cases:
                         // (a) `workspaces` is empty. That means there's no local source
                         // for this package. In that case, we pass the default workspace
@@ -530,7 +527,7 @@ fn install_crate(&mut self, vi: &ast::ViewItem) {
                                  error(format!("Package {} depends on {}, but I don't know \
                                                how to find it",
                                                self.parent.path.display(),
-                                               pkg_id.path.display()));
+                                               crate_id.path.display()));
                                  fail!()
                         }).inside(|| {
                             PkgSrc::new(source_workspace.clone(),
@@ -538,7 +535,7 @@ fn install_crate(&mut self, vi: &ast::ViewItem) {
                                         // Use the rust_path_hack to search for dependencies iff
                                         // we were already using it
                                         self.context.context.use_rust_path_hack,
-                                        pkg_id.clone())
+                                        crate_id.clone())
                         });
                         let (outputs_disc, inputs_disc) =
                             self.context.install(