Skip to content

Commit 7d9c638

Browse files
committed
auto merge of #6124 : catamorphism/rust/rustpkg, r=catamorphism
r? @graydon
2 parents 517bfc9 + 9f76ca6 commit 7d9c638

File tree

12 files changed

+428
-132
lines changed

12 files changed

+428
-132
lines changed

src/libcore/os.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,28 @@ pub fn list_dir_path(p: &Path) -> ~[~Path] {
772772
list_dir(p).map(|f| ~p.push(*f))
773773
}
774774
775+
/// Removes a directory at the specified path, after removing
776+
/// all its contents. Use carefully!
777+
pub fn remove_dir_recursive(p: &Path) -> bool {
778+
let mut error_happened = false;
779+
for walk_dir(p) |inner| {
780+
if !error_happened {
781+
if path_is_dir(inner) {
782+
if !remove_dir_recursive(inner) {
783+
error_happened = true;
784+
}
785+
}
786+
else {
787+
if !remove_file(inner) {
788+
error_happened = true;
789+
}
790+
}
791+
}
792+
};
793+
// Directory should now be empty
794+
!error_happened && remove_dir(p)
795+
}
796+
775797
/// Removes a directory at the specified path
776798
pub fn remove_dir(p: &Path) -> bool {
777799
return rmdir(p);
@@ -877,6 +899,10 @@ pub fn copy_file(from: &Path, to: &Path) -> bool {
877899
if istream as uint == 0u {
878900
return false;
879901
}
902+
// Preserve permissions
903+
let from_mode = from.get_mode().expect("copy_file: couldn't get permissions \
904+
for source file");
905+
880906
let ostream = do as_c_charp(to.to_str()) |top| {
881907
do as_c_charp("w+b") |modebuf| {
882908
libc::fopen(top, modebuf)
@@ -908,6 +934,15 @@ pub fn copy_file(from: &Path, to: &Path) -> bool {
908934
}
909935
fclose(istream);
910936
fclose(ostream);
937+
938+
// Give the new file the old file's permissions
939+
unsafe {
940+
if do str::as_c_str(to.to_str()) |to_buf| {
941+
libc::chmod(to_buf, from_mode as mode_t)
942+
} != 0 {
943+
return false; // should be a condition...
944+
}
945+
}
911946
return ok;
912947
}
913948
}
@@ -1594,13 +1629,15 @@ mod tests {
15941629
== buf.len() as size_t))
15951630
}
15961631
assert!((libc::fclose(ostream) == (0u as c_int)));
1632+
let in_mode = in.get_mode();
15971633
let rs = os::copy_file(&in, &out);
15981634
if (!os::path_exists(&in)) {
15991635
fail!(fmt!("%s doesn't exist", in.to_str()));
16001636
}
16011637
assert!((rs));
16021638
let rslt = run::run_program(~"diff", ~[in.to_str(), out.to_str()]);
16031639
assert!((rslt == 0));
1640+
assert!(out.get_mode() == in_mode);
16041641
assert!((remove_file(&in)));
16051642
assert!((remove_file(&out)));
16061643
}

src/librustc/back/rpath.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub fn get_rpath_flags(sess: session::Session, out_filename: &Path)
4040
// where rustrt is and we know every rust program needs it
4141
let libs = vec::append_one(libs, get_sysroot_absolute_rt_lib(sess));
4242

43-
let rpaths = get_rpaths(os, &sysroot, output, libs,
43+
let rpaths = get_rpaths(os, sysroot, output, libs,
4444
sess.opts.target_triple);
4545
rpaths_to_flags(rpaths)
4646
}

src/librustc/driver/driver.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ pub fn build_session_options(binary: @~str,
603603
link::output_type_bitcode
604604
} else { link::output_type_exe };
605605
let sysroot_opt = getopts::opt_maybe_str(matches, ~"sysroot");
606-
let sysroot_opt = sysroot_opt.map(|m| Path(*m));
606+
let sysroot_opt = sysroot_opt.map(|m| @Path(*m));
607607
let target_opt = getopts::opt_maybe_str(matches, ~"target");
608608
let target_feature_opt = getopts::opt_maybe_str(matches, ~"target-feature");
609609
let save_temps = getopts::opt_present(matches, ~"save-temps");

src/librustc/driver/session.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ pub struct options {
125125
output_type: back::link::output_type,
126126
addl_lib_search_paths: ~[Path],
127127
linker_args: ~[~str],
128-
maybe_sysroot: Option<Path>,
128+
maybe_sysroot: Option<@Path>,
129129
target_triple: ~str,
130130
target_feature: ~str,
131131
// User-specified cfg meta items. The compiler itself will add additional

src/librustc/metadata/filesearch.rs

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,41 +20,48 @@ pub fn pick_file(file: Path, path: &Path) -> Option<Path> {
2020
}
2121

2222
pub trait FileSearch {
23-
fn sysroot(&self) -> Path;
24-
fn lib_search_paths(&self) -> ~[Path];
23+
fn sysroot(&self) -> @Path;
24+
fn for_each_lib_search_path(&self, f: &fn(&Path) -> bool);
2525
fn get_target_lib_path(&self) -> Path;
2626
fn get_target_lib_file_path(&self, file: &Path) -> Path;
2727
}
2828

29-
pub fn mk_filesearch(maybe_sysroot: &Option<Path>,
29+
pub fn mk_filesearch(maybe_sysroot: &Option<@Path>,
3030
target_triple: &str,
3131
addl_lib_search_paths: ~[Path])
3232
-> @FileSearch {
3333
struct FileSearchImpl {
34-
sysroot: Path,
34+
sysroot: @Path,
3535
addl_lib_search_paths: ~[Path],
3636
target_triple: ~str
3737
}
3838
impl FileSearch for FileSearchImpl {
39-
fn sysroot(&self) -> Path { /*bad*/copy self.sysroot }
40-
fn lib_search_paths(&self) -> ~[Path] {
41-
let mut paths = /*bad*/copy self.addl_lib_search_paths;
42-
43-
paths.push(
44-
make_target_lib_path(&self.sysroot,
45-
self.target_triple));
46-
match get_rustpkg_lib_path_nearest() {
47-
result::Ok(ref p) => paths.push((/*bad*/copy *p)),
48-
result::Err(_) => ()
39+
fn sysroot(&self) -> @Path { self.sysroot }
40+
fn for_each_lib_search_path(&self, f: &fn(&Path) -> bool) {
41+
debug!("filesearch: searching additional lib search paths");
42+
// a little weird
43+
self.addl_lib_search_paths.each(f);
44+
45+
debug!("filesearch: searching target lib path");
46+
if !f(&make_target_lib_path(self.sysroot,
47+
self.target_triple)) {
48+
return;
4949
}
50-
match get_rustpkg_lib_path() {
51-
result::Ok(ref p) => paths.push((/*bad*/copy *p)),
52-
result::Err(_) => ()
53-
}
54-
paths
50+
debug!("filesearch: searching rustpkg lib path nearest");
51+
if match get_rustpkg_lib_path_nearest() {
52+
result::Ok(ref p) => f(p),
53+
result::Err(_) => true
54+
} {
55+
return;
56+
}
57+
debug!("filesearch: searching rustpkg lib path");
58+
match get_rustpkg_lib_path() {
59+
result::Ok(ref p) => f(p),
60+
result::Err(_) => true
61+
};
5562
}
5663
fn get_target_lib_path(&self) -> Path {
57-
make_target_lib_path(&self.sysroot, self.target_triple)
64+
make_target_lib_path(self.sysroot, self.target_triple)
5865
}
5966
fn get_target_lib_file_path(&self, file: &Path) -> Path {
6067
self.get_target_lib_path().push_rel(file)
@@ -72,7 +79,7 @@ pub fn mk_filesearch(maybe_sysroot: &Option<Path>,
7279

7380
pub fn search<T:Copy>(filesearch: @FileSearch, pick: pick<T>) -> Option<T> {
7481
let mut rslt = None;
75-
for filesearch.lib_search_paths().each |lib_search_path| {
82+
for filesearch.for_each_lib_search_path() |lib_search_path| {
7683
debug!("searching %s", lib_search_path.to_str());
7784
for os::list_dir_path(lib_search_path).each |path| {
7885
debug!("testing %s", path.to_str());
@@ -108,10 +115,10 @@ fn get_or_default_sysroot() -> Path {
108115
}
109116
}
110117
111-
fn get_sysroot(maybe_sysroot: &Option<Path>) -> Path {
118+
fn get_sysroot(maybe_sysroot: &Option<@Path>) -> @Path {
112119
match *maybe_sysroot {
113-
option::Some(ref sr) => (/*bad*/copy *sr),
114-
option::None => get_or_default_sysroot()
120+
option::Some(sr) => sr,
121+
option::None => @get_or_default_sysroot()
115122
}
116123
}
117124

src/librustpkg/conditions.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,13 @@ condition! {
1818
}
1919

2020
condition! {
21-
nonexistent_package: (super::PkgId, ~str) -> super::Path;
21+
nonexistent_package: (super::PkgId, ~str) -> ();
22+
}
23+
24+
condition! {
25+
copy_failed: (super::Path, super::Path) -> ();
26+
}
27+
28+
condition! {
29+
missing_pkg_files: (super::PkgId) -> ();
2230
}

src/librustpkg/context.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
use core::hashmap::HashMap;
1414

1515
pub struct Ctx {
16+
// Sysroot -- if this is None, uses rustc filesearch's
17+
// idea of the default
18+
sysroot_opt: Option<@Path>,
1619
// I'm not sure what this is for
1720
json: bool,
1821
// Cache of hashes of things already installed

0 commit comments

Comments
 (0)