diff --git a/Makefile b/Makefile index 27f1c8112..26e6ccf32 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,7 @@ include common.mk +SRC_DIR=$(shell pwd) + # Possible programs PROGS := \ base64 \ @@ -136,4 +138,23 @@ ifeq ($(MULTICALL), 1) $(foreach crate,$(CRATES),$(eval $(call CRATE_BUILD,$(crate),$(shell $(RUSTC) --crate-type rlib --crate-file-name --out-dir build $(crate)/$(crate).rs)))) endif -.PHONY: all test clean +# Test under the busybox testsuite +ifeq ($(MULTICALL), 1) +build/busybox: build/uutils + rm -f build/busybox + ln -s $(SRC_DIR)/build/uutils build/busybox + +ifeq ($(BUSYBOX_SRC),) +busytest: + @echo + @echo "To run \`busytest\` set BUSYBOX_SRC to the directory of the compiled busybox source code." + @echo "Optionally set RUNTEST_ARGS to arguments to pass to the busybox \`runtest\` program." + @echo + @false +else +busytest: build/busybox + (cd $(BUSYBOX_SRC)/testsuite && bindir=$(SRC_DIR)/build tstdir=$(BUSYBOX_SRC)/testsuite $(BUSYBOX_SRC)/testsuite/runtest $(RUNTEST_ARGS)) +endif +endif + +.PHONY: all test clean busytest diff --git a/base64/base64.rs b/base64/base64.rs index dc7da32b0..fd240f5b4 100644 --- a/base64/base64.rs +++ b/base64/base64.rs @@ -105,7 +105,7 @@ fn decode(input: &mut Reader, ignore_garbage: bool) { let standard_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; to_decode = to_decode.as_slice() .trim_chars(|c| !standard_chars.contains_char(c)) - .into_owned() + .into_string() } match to_decode.as_slice().from_base64() { diff --git a/cat/cat.rs b/cat/cat.rs index 0614bdfbb..557a9feef 100644 --- a/cat/cat.rs +++ b/cat/cat.rs @@ -82,7 +82,7 @@ pub fn uumain(args: Vec) { exec(files, number_mode, show_nonprint, show_ends, show_tabs, squeeze_blank); } -#[deriving(Eq)] +#[deriving(Eq, PartialEq)] enum NumberingMode { NumberNone, NumberNonEmpty, diff --git a/comm/comm.rs b/comm/comm.rs index 6303b0e3f..7296d9ef3 100644 --- a/comm/comm.rs +++ b/comm/comm.rs @@ -11,7 +11,7 @@ extern crate getopts; -use std::cmp::TotalOrd; +use std::cmp::Ord; use std::io::{BufferedReader, IoResult, print}; use std::io::fs::File; use std::io::stdio::stdin; diff --git a/cp/cp.rs b/cp/cp.rs index 87f89b56c..9cdc33817 100644 --- a/cp/cp.rs +++ b/cp/cp.rs @@ -24,7 +24,7 @@ use getopts::{ usage, }; -#[deriving(Eq)] +#[deriving(Eq, PartialEq)] pub enum Mode { Copy, Help, diff --git a/env/env.rs b/env/env.rs index bd303f31f..b3d365af5 100644 --- a/env/env.rs +++ b/env/env.rs @@ -87,7 +87,7 @@ pub fn uumain(args: Vec) { match (name, value) { (Some(n), Some(v)) => { - opts.sets.push((n.into_owned(), v.into_owned())); + opts.sets.push((n.into_string(), v.into_string())); } _ => { // read the program now @@ -159,7 +159,7 @@ pub fn uumain(args: Vec) { match (name, value) { (Some(n), Some(v)) => { // yes - opts.sets.push((n.into_owned(), v.into_owned())); + opts.sets.push((n.into_string(), v.into_string())); wait_cmd = true; } // no, its a program-like opt diff --git a/md5sum/rust-crypto b/md5sum/rust-crypto index 616786cae..adde85617 160000 --- a/md5sum/rust-crypto +++ b/md5sum/rust-crypto @@ -1 +1 @@ -Subproject commit 616786caeba62773a9ff8dc541cc4d50bf384d59 +Subproject commit adde85617a776ea98249504d653cb547a2353c98 diff --git a/mkdir/test.rs b/mkdir/test.rs index 568d4af5c..2ed17930d 100644 --- a/mkdir/test.rs +++ b/mkdir/test.rs @@ -9,8 +9,8 @@ static test_dir4: &'static str = "tmp/mkdir_test4/mkdir_test4_1"; static test_dir5: &'static str = "tmp/mkdir_test5/mkdir_test5_1"; fn cleanup(dir: &'static str) { - let d = dir.into_owned(); - let p = Path::new(d.into_owned()); + let d = dir.into_string(); + let p = Path::new(d.into_string()); if p.exists() { rmdir(&p).unwrap(); } diff --git a/rm/rm.rs b/rm/rm.rs index 89f838c00..057013c1b 100644 --- a/rm/rm.rs +++ b/rm/rm.rs @@ -20,7 +20,7 @@ use std::io::{print, stdin, stdio, fs, BufferedReader}; #[path = "../common/util.rs"] mod util; -#[deriving(Eq)] +#[deriving(Eq, PartialEq)] enum InteractiveMode { InteractiveNone, InteractiveOnce, diff --git a/tac/tac.rs b/tac/tac.rs index 7fc9f99f9..90307d040 100644 --- a/tac/tac.rs +++ b/tac/tac.rs @@ -86,7 +86,7 @@ fn tac(filenames: Vec, before: bool, _: bool, separator: &str) { let mut buf = data.into_string(); let len = buf.len(); buf.truncate(len - 1); - data = buf.into_owned(); + data = buf.into_string(); } let split_vec: Vec<&str> = data.as_slice().split_str(separator).collect(); let rev: String = split_vec.iter().rev().fold(String::new(), |mut a, &b| { diff --git a/truncate/truncate.rs b/truncate/truncate.rs index 1188f1f54..aada407e3 100644 --- a/truncate/truncate.rs +++ b/truncate/truncate.rs @@ -33,7 +33,7 @@ macro_rules! get_file_size( }) ) -#[deriving(Eq)] +#[deriving(Eq, PartialEq)] enum TruncateMode { Reference, Extend, diff --git a/uutils/uutils.rs b/uutils/uutils.rs index 6a91e6f40..8c708c123 100644 --- a/uutils/uutils.rs +++ b/uutils/uutils.rs @@ -114,12 +114,13 @@ fn usage(cmap: &HashMap<&str, fn(Vec)>) { println!(""); println!("Usage:"); println!(" {} [util [arguments...]", NAME); - println!("Utils:"); + println!("Currently defined functions:"); let mut utils: Vec<&str> = cmap.keys().map(|&s| s).collect(); utils.sort(); for util in utils.iter() { println!("\t{}", util); } + println!(""); } fn main() { @@ -128,24 +129,54 @@ fn main() { // try binary name as util name. let binary = Path::new(args.get(0).as_slice()); - let util = binary.filename_str().unwrap(); - if umap.contains_key(&util) { - let &uumain = umap.get(&util); + let binary_as_util = binary.filename_str().unwrap(); + if umap.contains_key(&binary_as_util) { + let &uumain = umap.get(&binary_as_util); uumain(args); return + } else if binary_as_util.starts_with("uutils") + || binary_as_util.starts_with("busybox") { + // uutils can be called as either "uutils", "busybox" + // "uutils-suffix" or "busybox-suffix". Not sure + // what busybox uses the -suffix pattern for. + } else { + println!("{}: applet not found", binary_as_util); + os::set_exit_status(1); + return } // try first arg as util name. if args.len() >= 2 { args.shift(); - let util = args.get(0).as_slice().clone(); + let util = args.get(0).as_slice(); if umap.contains_key(&util) { let &uumain = umap.get(&util); uumain(args.clone()); return + } else if args.get(0).as_slice() == "--help" { + // see if they want help on a specific util + if args.len() >= 2 { + let util = args.get(1).as_slice(); + if umap.contains_key(&util) { + let &uumain = umap.get(&util); + uumain(vec!["--help".to_string()]); + return + } else { + println!("{}: applet not found", util); + os::set_exit_status(1); + return + } + } + usage(&umap); + return + } else { + println!("{}: applet not found", util); + os::set_exit_status(1); + return } + } else { + // no arguments provided + usage(&umap); + return } - - usage(&umap); - os::set_exit_status(1); }