mirror of
https://github.com/uutils/coreutils.git
synced 2026-06-10 15:48:22 -07:00
Merge pull request #204 from brson/master
RFC: Improve busybox compatibility using their test suite
This commit is contained in:
@@ -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
|
||||
|
||||
+1
-1
@@ -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() {
|
||||
|
||||
+1
-1
@@ -82,7 +82,7 @@ pub fn uumain(args: Vec<String>) {
|
||||
exec(files, number_mode, show_nonprint, show_ends, show_tabs, squeeze_blank);
|
||||
}
|
||||
|
||||
#[deriving(Eq)]
|
||||
#[deriving(Eq, PartialEq)]
|
||||
enum NumberingMode {
|
||||
NumberNone,
|
||||
NumberNonEmpty,
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
@@ -24,7 +24,7 @@ use getopts::{
|
||||
usage,
|
||||
};
|
||||
|
||||
#[deriving(Eq)]
|
||||
#[deriving(Eq, PartialEq)]
|
||||
pub enum Mode {
|
||||
Copy,
|
||||
Help,
|
||||
|
||||
Vendored
+2
-2
@@ -87,7 +87,7 @@ pub fn uumain(args: Vec<String>) {
|
||||
|
||||
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<String>) {
|
||||
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
|
||||
|
||||
+1
-1
Submodule md5sum/rust-crypto updated: 616786caeb...adde85617a
+2
-2
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
+1
-1
@@ -86,7 +86,7 @@ fn tac(filenames: Vec<String>, 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| {
|
||||
|
||||
@@ -33,7 +33,7 @@ macro_rules! get_file_size(
|
||||
})
|
||||
)
|
||||
|
||||
#[deriving(Eq)]
|
||||
#[deriving(Eq, PartialEq)]
|
||||
enum TruncateMode {
|
||||
Reference,
|
||||
Extend,
|
||||
|
||||
+39
-8
@@ -114,12 +114,13 @@ fn usage(cmap: &HashMap<&str, fn(Vec<String>)>) {
|
||||
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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user