From 3a0477c39816c20fc798a33cde56e8b99ddb32b1 Mon Sep 17 00:00:00 2001 From: Jonathan Sternberg Date: Sun, 1 Apr 2012 11:39:17 -0400 Subject: [PATCH] Fixing issue 1919. list_dir is the more general version that returns a vector with the contents of the directory. list_dir_path contains the old behavior (as a convenience function). --- src/cargo/cargo.rs | 6 +++--- src/compiletest/compiletest.rs | 2 +- src/fuzzer/fuzzer.rs | 2 +- src/libcore/os.rs | 39 ++++++++++++++++++++++------------ src/rustc/util/filesearch.rs | 2 +- 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/cargo/cargo.rs b/src/cargo/cargo.rs index 51edc90589a..9cad4bb3f94 100644 --- a/src/cargo/cargo.rs +++ b/src/cargo/cargo.rs @@ -434,7 +434,7 @@ fn for_each_package(c: cargo, b: fn(source, package)) { // Runs all programs in directory fn run_programs(buildpath: str) { - let newv = os::list_dir(buildpath); + let newv = os::list_dir_path(buildpath); for ct: str in newv { run::run_program(ct, []); } @@ -471,7 +471,7 @@ fn install_one_crate(c: cargo, path: str, cf: str) { none { ret; } some(bp) { bp } }; - let newv = os::list_dir(buildpath); + let newv = os::list_dir_path(buildpath); let exec_suffix = os::exe_suffix(); for ct: str in newv { if (exec_suffix != "" && str::ends_with(ct, exec_suffix)) || @@ -524,7 +524,7 @@ fn rustc_sysroot() -> str { fn install_source(c: cargo, path: str) { #debug("source: %s", path); os::change_dir(path); - let contents = os::list_dir("."); + let contents = os::list_dir_path("."); #debug("contents: %s", str::connect(contents, ", ")); diff --git a/src/compiletest/compiletest.rs b/src/compiletest/compiletest.rs index ed159d6a073..0ea7fecda75 100644 --- a/src/compiletest/compiletest.rs +++ b/src/compiletest/compiletest.rs @@ -127,7 +127,7 @@ fn test_opts(config: config) -> test::test_opts { fn make_tests(config: config) -> [test::test_desc] { #debug("making tests from %s", config.src_base); let mut tests = []; - for file: str in os::list_dir(config.src_base) { + for file: str in os::list_dir_path(config.src_base) { let file = file; #debug("inspecting file %s", file); if is_test(config, file) { diff --git a/src/fuzzer/fuzzer.rs b/src/fuzzer/fuzzer.rs index 70fe1afa876..87dece998b0 100644 --- a/src/fuzzer/fuzzer.rs +++ b/src/fuzzer/fuzzer.rs @@ -25,7 +25,7 @@ fn find_rust_files(&files: [str], path: str) { } else if os::path_is_dir(path) && !contains(path, "compile-fail") && !contains(path, "build") { - for p in os::list_dir(path) { + for p in os::list_dir_path(path) { find_rust_files(files, p); } } diff --git a/src/libcore/os.rs b/src/libcore/os.rs index 8d9cd47fdf8..d7e4af2a15a 100644 --- a/src/libcore/os.rs +++ b/src/libcore/os.rs @@ -29,8 +29,8 @@ export close, fclose, fsync_fd, waitpid; export env, getenv, setenv, fdopen, pipe; export getcwd, dll_filename, self_exe_path; export exe_suffix, dll_suffix, sysname; -export homedir, list_dir, path_is_dir, path_exists, make_absolute, - make_dir, remove_dir, change_dir, remove_file; +export homedir, list_dir, list_dir_path, path_is_dir, path_exists, + make_absolute, make_dir, remove_dir, change_dir, remove_file; // FIXME: move these to str perhaps? export as_c_charp, fill_charp_buf; @@ -452,26 +452,37 @@ fn list_dir(p: path) -> [str] { #[cfg(target_os = "linux")] #[cfg(target_os = "macos")] #[cfg(target_os = "freebsd")] - fn star() -> str { "" } + fn star(p: str) -> str { p } #[cfg(target_os = "win32")] - fn star() -> str { "*" } + fn star(p: str) -> str { + let pl = str::len(p); + if pl == 0u || (p[pl - 1u] as char != path::consts::path_sep + ** p[pl - 1u] as char != path::consts::alt_path_sep) { + p + path::path_sep() + "*" + } else { + p + "*" + } + } + rustrt::rust_list_files(star(p)).filter {|filename| + !str::eq(filename, ".") || !str::eq(filename, "..") + } +} + +#[doc = " +Lists the contents of a directory + +This version prepends each entry with the directory. +"] +fn list_dir_path(p: path) -> [str] { let mut p = p; let pl = str::len(p); if pl == 0u || (p[pl - 1u] as char != path::consts::path_sep && p[pl - 1u] as char != path::consts::alt_path_sep) { p += path::path_sep(); } - let mut full_paths: [str] = []; - for vec::each(rustrt::rust_list_files(p + star())) {|filename| - if !str::eq(filename, ".") { - if !str::eq(filename, "..") { - full_paths += [p + filename]; - } - } - } - ret full_paths; + os::list_dir(p).map {|f| p + f} } #[doc = "Removes a directory at the specified path"] @@ -750,4 +761,4 @@ mod tests { assert (!os::path_exists("test/nonexistent-bogus-path")); } -} \ No newline at end of file +} diff --git a/src/rustc/util/filesearch.rs b/src/rustc/util/filesearch.rs index ac535f39bef..75327597ce9 100644 --- a/src/rustc/util/filesearch.rs +++ b/src/rustc/util/filesearch.rs @@ -69,7 +69,7 @@ fn mk_filesearch(maybe_sysroot: option, fn search(filesearch: filesearch, pick: pick) -> option { for lib_search_path in filesearch.lib_search_paths() { #debug("searching %s", lib_search_path); - for path in os::list_dir(lib_search_path) { + for path in os::list_dir_path(lib_search_path) { #debug("testing %s", path); let maybe_picked = pick(path); if option::is_some(maybe_picked) {