Skip to content

Commit 6a9c3bd

Browse files
committed
auto merge of #6418 : catamorphism/rust/rustpkg, r=catamorphism
r? @brson This patch implements package IDs like github.com/catamorphism/test-pkg. To support such package IDs, I changed the PkgId struct to contain a LocalPath and a RemotePath field, where the RemotePath reflects the actual URL and the LocalPath reflects the file name of the cached copy. Right now, the only difference is that the local path doesn't contain dashes, but this will change when we implement #6407. Also, PkgIds now have a short_name field -- though the short name can be derived from the LocalPath, I thought it was cleaner not to call option::get() wantonly.
2 parents 8a15333 + 80a7e26 commit 6a9c3bd

File tree

7 files changed

+297
-432
lines changed

7 files changed

+297
-432
lines changed

src/librustpkg/conditions.rs

+4
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,7 @@ condition! {
2828
condition! {
2929
missing_pkg_files: (super::PkgId) -> ();
3030
}
31+
32+
condition! {
33+
bad_pkg_id: (super::Path, ~str) -> ::util::PkgId;
34+
}

src/librustpkg/path_util.rs

+60-48
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,10 @@
1010

1111
// rustpkg utilities having to do with paths and directories
1212

13-
use util::PkgId;
13+
pub use util::{PkgId, RemotePath, LocalPath};
1414
use core::libc::consts::os::posix88::{S_IRUSR, S_IWUSR, S_IXUSR};
1515
use core::os::mkdir_recursive;
16-
17-
#[deriving(Eq)]
18-
pub enum OutputType { Main, Lib, Bench, Test }
16+
pub use util::{normalize, OutputType, Main, Lib, Bench, Test};
1917

2018
/// Returns the value of RUST_PATH, as a list
2119
/// of Paths. In general this should be read from the
@@ -31,67 +29,73 @@ pub static u_rwx: i32 = (S_IRUSR | S_IWUSR | S_IXUSR) as i32;
3129
/// succeeded.
3230
pub fn make_dir_rwx(p: &Path) -> bool { os::make_dir(p, u_rwx) }
3331

34-
/// Replace all occurrences of '-' in the stem part of path with '_'
35-
/// This is because we treat rust-foo-bar-quux and rust_foo_bar_quux
36-
/// as the same name
37-
pub fn normalize(p: ~Path) -> ~Path {
38-
match p.filestem() {
39-
None => p,
40-
Some(st) => {
41-
let replaced = str::replace(st, "-", "_");
42-
if replaced != st {
43-
~p.with_filestem(replaced)
44-
}
45-
else {
46-
p
47-
}
48-
}
49-
}
50-
}
51-
5232
// n.b. So far this only handles local workspaces
5333
// n.b. The next three functions ignore the package version right
5434
// now. Should fix that.
5535

5636
/// True if there's a directory in <workspace> with
5737
/// pkgid's short name
5838
pub fn workspace_contains_package_id(pkgid: &PkgId, workspace: &Path) -> bool {
59-
let pkgpath = workspace.push("src").push(pkgid.path.to_str());
39+
let pkgpath = workspace.push("src").push(pkgid.local_path.to_str());
6040
os::path_is_dir(&pkgpath)
6141
}
6242

6343
/// Return the directory for <pkgid>'s source files in <workspace>.
6444
/// Doesn't check that it exists.
6545
pub fn pkgid_src_in_workspace(pkgid: &PkgId, workspace: &Path) -> Path {
6646
let result = workspace.push("src");
67-
result.push(pkgid.path.to_str())
47+
result.push(pkgid.local_path.to_str())
6848
}
6949

7050
/// Figure out what the executable name for <pkgid> in <workspace>'s build
7151
/// directory is, and if the file exists, return it.
7252
pub fn built_executable_in_workspace(pkgid: &PkgId, workspace: &Path) -> Option<Path> {
7353
let mut result = workspace.push("build");
74-
result = result.push_rel(&pkgid.path);
7554
// should use a target-specific subdirectory
76-
result = mk_output_path(Main, fmt!("%s-%s", pkgid.path.to_str(), pkgid.version.to_str()),
77-
result);
55+
result = mk_output_path(Main, pkgid, &result);
7856
debug!("built_executable_in_workspace: checking whether %s exists",
7957
result.to_str());
8058
if os::path_exists(&result) {
8159
Some(result)
8260
}
8361
else {
62+
// This is not an error, but it's worth logging it
63+
error!(fmt!("built_executable_in_workspace: %s does not exist", result.to_str()));
8464
None
8565
}
8666
}
8767

88-
/// Figure out what the library name for <pkgid> in <workspace>'s build
68+
/// Figure out what the test name for <pkgid> in <workspace>'s build
8969
/// directory is, and if the file exists, return it.
90-
pub fn built_library_in_workspace(pkgid: &PkgId, workspace: &Path) -> Option<Path> {
70+
pub fn built_test_in_workspace(pkgid: &PkgId, workspace: &Path) -> Option<Path> {
71+
output_in_workspace(pkgid, workspace, Test)
72+
}
73+
74+
/// Figure out what the test name for <pkgid> in <workspace>'s build
75+
/// directory is, and if the file exists, return it.
76+
pub fn built_bench_in_workspace(pkgid: &PkgId, workspace: &Path) -> Option<Path> {
77+
output_in_workspace(pkgid, workspace, Bench)
78+
}
79+
80+
fn output_in_workspace(pkgid: &PkgId, workspace: &Path, what: OutputType) -> Option<Path> {
9181
let mut result = workspace.push("build");
92-
result = result.push_rel(&pkgid.path);
9382
// should use a target-specific subdirectory
94-
result = mk_output_path(Lib, pkgid.path.to_str(), result);
83+
result = mk_output_path(what, pkgid, &result);
84+
debug!("output_in_workspace: checking whether %s exists",
85+
result.to_str());
86+
if os::path_exists(&result) {
87+
Some(result)
88+
}
89+
else {
90+
error!(fmt!("output_in_workspace: %s does not exist", result.to_str()));
91+
None
92+
}
93+
}
94+
95+
/// Figure out what the library name for <pkgid> in <workspace>'s build
96+
/// directory is, and if the file exists, return it.
97+
pub fn built_library_in_workspace(pkgid: &PkgId, workspace: &Path) -> Option<Path> {
98+
let result = mk_output_path(Lib, pkgid, &workspace.push("build"));
9599
debug!("built_library_in_workspace: checking whether %s exists",
96100
result.to_str());
97101

@@ -100,8 +104,7 @@ pub fn built_library_in_workspace(pkgid: &PkgId, workspace: &Path) -> Option<Pat
100104
let dir_contents = os::list_dir(&result.pop());
101105
debug!("dir has %? entries", dir_contents.len());
102106

103-
// n.b. This code assumes the pkgid's path only has one element
104-
let lib_prefix = fmt!("%s%s", os::consts::DLL_PREFIX, pkgid.path.to_str());
107+
let lib_prefix = fmt!("%s%s", os::consts::DLL_PREFIX, pkgid.short_name);
105108
let lib_filetype = fmt!("%s%s", pkgid.version.to_str(), os::consts::DLL_SUFFIX);
106109

107110
debug!("lib_prefix = %s and lib_filetype = %s", lib_prefix, lib_filetype);
@@ -173,12 +176,14 @@ pub fn target_library_in_workspace(pkgid: &PkgId, workspace: &Path) -> Path {
173176

174177
/// Returns the test executable that would be installed for <pkgid>
175178
/// in <workspace>
179+
/// note that we *don't* install test executables, so this is just for unit testing
176180
pub fn target_test_in_workspace(pkgid: &PkgId, workspace: &Path) -> Path {
177181
target_file_in_workspace(pkgid, workspace, Test)
178182
}
179183

180184
/// Returns the bench executable that would be installed for <pkgid>
181185
/// in <workspace>
186+
/// note that we *don't* install bench executables, so this is just for unit testing
182187
pub fn target_bench_in_workspace(pkgid: &PkgId, workspace: &Path) -> Path {
183188
target_file_in_workspace(pkgid, workspace, Bench)
184189
}
@@ -187,18 +192,14 @@ fn target_file_in_workspace(pkgid: &PkgId, workspace: &Path,
187192
what: OutputType) -> Path {
188193
use conditions::bad_path::cond;
189194

190-
let (subdir, create_dir) = match what {
191-
Main => ("bin", true), Lib => ("lib", true), Test | Bench => ("build", false)
195+
let subdir = match what {
196+
Lib => "lib", Main | Test | Bench => "bin"
192197
};
193198
let result = workspace.push(subdir);
194-
if create_dir {
195-
if !os::path_exists(&result) && !mkdir_recursive(&result, u_rwx) {
196-
cond.raise((copy result,
197-
fmt!("I couldn't create the %s dir", subdir)));
198-
}
199+
if !os::path_exists(&result) && !mkdir_recursive(&result, u_rwx) {
200+
cond.raise((copy result, fmt!("I couldn't create the %s dir", subdir)));
199201
}
200-
mk_output_path(what, pkgid.path.to_str(), result)
201-
202+
mk_output_path(what, pkgid, &result)
202203
}
203204

204205
/// Return the directory for <pkgid>'s build artifacts in <workspace>.
@@ -209,7 +210,7 @@ pub fn build_pkg_id_in_workspace(pkgid: &PkgId, workspace: &Path) -> Path {
209210
let mut result = workspace.push("build");
210211
// n.b. Should actually use a target-specific
211212
// subdirectory of build/
212-
result = result.push(normalize(~copy pkgid.path).to_str());
213+
result = result.push_rel(&*pkgid.local_path);
213214
if os::path_exists(&result) || os::mkdir_recursive(&result, u_rwx) {
214215
result
215216
}
@@ -220,15 +221,26 @@ pub fn build_pkg_id_in_workspace(pkgid: &PkgId, workspace: &Path) -> Path {
220221

221222
/// Return the output file for a given directory name,
222223
/// given whether we're building a library and whether we're building tests
223-
pub fn mk_output_path(what: OutputType, short_name: ~str, dir: Path) -> Path {
224-
match what {
225-
Lib => dir.push(os::dll_filename(short_name)),
226-
_ => dir.push(fmt!("%s%s%s", short_name,
224+
pub fn mk_output_path(what: OutputType, pkg_id: &PkgId, workspace: &Path) -> Path {
225+
let short_name_with_version = pkg_id.short_name_with_version();
226+
// Not local_path.dir_path()! For package foo/bar/blat/, we want
227+
// the executable blat-0.5 to live under blat/
228+
let dir = workspace.push_rel(&*pkg_id.local_path);
229+
debug!("mk_output_path: short_name = %s, path = %s",
230+
if what == Lib { copy short_name_with_version } else { copy pkg_id.short_name },
231+
dir.to_str());
232+
let output_path = match what {
233+
// this code is duplicated from elsewhere; fix this
234+
Lib => dir.push(os::dll_filename(short_name_with_version)),
235+
// executable names *aren't* versioned
236+
_ => dir.push(fmt!("%s%s%s", copy pkg_id.short_name,
227237
match what {
228238
Test => "test",
229239
Bench => "bench",
230240
_ => ""
231241
}
232242
os::EXE_SUFFIX))
233-
}
243+
};
244+
debug!("mk_output_path: returning %s", output_path.to_str());
245+
output_path
234246
}

0 commit comments

Comments
 (0)