mirror of
https://github.com/uutils/coreutils
synced 2024-10-06 16:09:08 +00:00
Merge branch 'master' into expr-regex
This commit is contained in:
commit
1a28a48ca3
253
Cargo.lock
generated
253
Cargo.lock
generated
|
@ -37,7 +37,7 @@ dependencies = [
|
|||
"install 0.0.1",
|
||||
"kill 0.0.1",
|
||||
"lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"link 0.0.1",
|
||||
"ln 0.0.1",
|
||||
"logname 0.0.1",
|
||||
|
@ -82,7 +82,7 @@ dependencies = [
|
|||
"tee 0.0.1",
|
||||
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"test 0.0.1",
|
||||
"time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"timeout 0.0.1",
|
||||
"touch 0.0.1",
|
||||
"tr 0.0.1",
|
||||
|
@ -140,7 +140,7 @@ version = "0.1.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -150,7 +150,7 @@ version = "0.2.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -200,7 +200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.0.0"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
|
@ -212,9 +212,14 @@ dependencies = [
|
|||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "0.1.1"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
|
@ -229,7 +234,7 @@ dependencies = [
|
|||
name = "chmod"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
"walker 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -248,8 +253,8 @@ name = "chrono"
|
|||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -264,7 +269,7 @@ dependencies = [
|
|||
name = "cksum"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -286,10 +291,10 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "cmake"
|
||||
version = "0.1.24"
|
||||
version = "0.1.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cc 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -297,7 +302,7 @@ name = "comm"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -305,9 +310,17 @@ dependencies = [
|
|||
name = "cp"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"clap 2.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"filetime 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ioctl-sys 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quick-error 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
"walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"xattr 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -343,7 +356,7 @@ dependencies = [
|
|||
name = "dirname"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -351,7 +364,7 @@ dependencies = [
|
|||
name = "du"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -371,7 +384,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
name = "env"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -388,8 +401,8 @@ dependencies = [
|
|||
name = "expr"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"onig 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"onig 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -410,14 +423,14 @@ name = "filetime"
|
|||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fmt"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
@ -466,7 +479,7 @@ name = "hashsum"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -478,7 +491,7 @@ dependencies = [
|
|||
name = "head"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -486,7 +499,7 @@ dependencies = [
|
|||
name = "hostid"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -494,7 +507,7 @@ dependencies = [
|
|||
name = "hostname"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -510,10 +523,15 @@ name = "install"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ioctl-sys"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.6.0"
|
||||
|
@ -535,7 +553,7 @@ dependencies = [
|
|||
name = "kill"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -546,19 +564,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.24"
|
||||
source = "git+https://github.com/rust-lang/libc.git#83f5543e761bad58c1f061447c28df4a0201c761"
|
||||
version = "0.2.26"
|
||||
source = "git+https://github.com/rust-lang/libc.git#c43c0770db6b85ade0b70009464603ff9be4b37d"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.24"
|
||||
version = "0.2.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "link"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -566,7 +584,7 @@ dependencies = [
|
|||
name = "ln"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -574,7 +592,7 @@ dependencies = [
|
|||
name = "logname"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -587,7 +605,7 @@ dependencies = [
|
|||
"pretty-bytes 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"term_grid 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"termsize 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
@ -597,7 +615,7 @@ name = "memchr"
|
|||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -605,7 +623,7 @@ name = "mkdir"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -614,7 +632,7 @@ name = "mkfifo"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -623,7 +641,7 @@ name = "mknod"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -659,7 +677,7 @@ name = "nice"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -669,8 +687,8 @@ version = "0.8.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -680,7 +698,7 @@ version = "0.0.1"
|
|||
dependencies = [
|
||||
"aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -692,7 +710,7 @@ name = "nohup"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -701,41 +719,41 @@ name = "nproc"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num"
|
||||
version = "0.1.39"
|
||||
version = "0.1.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num-integer 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-iter 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-integer"
|
||||
version = "0.1.34"
|
||||
version = "0.1.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.33"
|
||||
version = "0.1.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num-integer 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.1.39"
|
||||
version = "0.1.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
|
@ -743,38 +761,38 @@ name = "num_cpus"
|
|||
version = "1.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "od"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"half 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "onig"
|
||||
version = "1.3.0"
|
||||
version = "1.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"onig_sys 63.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"onig_sys 65.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "onig_sys"
|
||||
version = "63.0.2"
|
||||
version = "65.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cmake 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cmake 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -791,7 +809,7 @@ name = "pathchk"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -813,7 +831,7 @@ version = "0.2.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -838,7 +856,7 @@ version = "0.0.1"
|
|||
dependencies = [
|
||||
"aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -863,7 +881,7 @@ name = "rand"
|
|||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -871,7 +889,7 @@ name = "readlink"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -885,7 +903,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.1.19"
|
||||
version = "0.1.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
|
@ -913,12 +931,23 @@ dependencies = [
|
|||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "remove_dir_all"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rm"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"remove_dir_all 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
"walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -935,10 +964,10 @@ version = "0.2.36"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -995,9 +1024,9 @@ version = "0.0.1"
|
|||
dependencies = [
|
||||
"filetime 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -1041,7 +1070,7 @@ name = "stat"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -1072,7 +1101,7 @@ version = "0.0.1"
|
|||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -1091,7 +1120,7 @@ version = "0.0.1"
|
|||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -1101,7 +1130,7 @@ name = "tee"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -1119,7 +1148,7 @@ version = "2.1.5"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1139,7 +1168,7 @@ version = "0.3.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -1150,7 +1179,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
dependencies = [
|
||||
"atty 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -1158,7 +1187,7 @@ dependencies = [
|
|||
name = "test"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -1182,12 +1211,12 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "time"
|
||||
version = "0.1.37"
|
||||
version = "0.1.38"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -1196,8 +1225,8 @@ name = "timeout"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -1207,7 +1236,7 @@ version = "0.0.1"
|
|||
dependencies = [
|
||||
"filetime 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -1246,7 +1275,7 @@ name = "tty"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -1294,8 +1323,8 @@ name = "unix_socket"
|
|||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1303,7 +1332,7 @@ name = "unlink"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"uucore 0.0.1",
|
||||
]
|
||||
|
||||
|
@ -1342,8 +1371,8 @@ version = "0.0.1"
|
|||
dependencies = [
|
||||
"data-encoding 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.24 (git+https://github.com/rust-lang/libc.git)",
|
||||
"time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.26 (git+https://github.com/rust-lang/libc.git)",
|
||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1415,6 +1444,14 @@ name = "winapi-build"
|
|||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "xattr"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "yes"
|
||||
version = "0.0.1"
|
||||
|
@ -1433,11 +1470,12 @@ dependencies = [
|
|||
"checksum bit-vec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "02b4ff8b16e6076c3e14220b39fbc1fabb6737522281a388998046859400895f"
|
||||
"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
|
||||
"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
|
||||
"checksum byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c40977b0ee6b9885c9013cd41d9feffdd22deb3bb4dc3a71d901cc7a77de18c8"
|
||||
"checksum cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c47d456a36ebf0536a6705c83c1cbbcb9255fbc1d905a6ded104f479268a29"
|
||||
"checksum byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff81738b726f5d099632ceaffe7fb65b90212e8dce59d518729e7e8634032d3d"
|
||||
"checksum cc 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7db2f146208d7e0fbee761b09cd65a7f51ccc38705d4e7262dad4d73b12a76b1"
|
||||
"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
|
||||
"checksum chrono 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c20ebe0b2b08b0aeddba49c609fe7957ba2e33449882cb186a180bc60682fa9"
|
||||
"checksum clap 2.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "867a885995b4184be051b70a592d4d70e32d7a188db6e8dff626af286a962771"
|
||||
"checksum cmake 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b8ebbb35d3dc9cd09497168f33de1acb79b265d350ab0ac34133b98f8509af1f"
|
||||
"checksum cmake 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "357c07e7a1fc95732793c1edb5901e1a1f305cfcf63a90eb12dbd22bdb6b789d"
|
||||
"checksum data-encoding 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d867ddbf09de0b73e09ec798972fb7f870495a0893f6f736c1855448c5a56789"
|
||||
"checksum either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18785c1ba806c258137c937e44ada9ee7e69a37e3c72077542cd2f069d78562a"
|
||||
"checksum filetime 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "5363ab8e4139b8568a6237db5248646e5a8a2f89bd5ccb02092182b11fd3e922"
|
||||
|
@ -1446,27 +1484,29 @@ dependencies = [
|
|||
"checksum getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9047cfbd08a437050b363d35ef160452c5fe8ea5187ae0a624708c91581d685"
|
||||
"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
|
||||
"checksum half 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "63d68db75012a85555434ee079e7e6337931f87a087ab2988becbadf64673a7f"
|
||||
"checksum ioctl-sys 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5e2c4b26352496eaaa8ca7cfa9bd99e93419d3f7983dc6e99c2a35fe9e33504a"
|
||||
"checksum itertools 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "772a0928a97246167d59a2a4729df5871f1327ab8b36fd24c4224b229cb47b99"
|
||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
||||
"checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf"
|
||||
"checksum libc 0.2.24 (git+https://github.com/rust-lang/libc.git)" = "<none>"
|
||||
"checksum libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)" = "38f5c2b18a287cf78b4097db62e20f43cace381dc76ae5c0a3073067f78b7ddc"
|
||||
"checksum libc 0.2.26 (git+https://github.com/rust-lang/libc.git)" = "<none>"
|
||||
"checksum libc 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)" = "30885bcb161cf67054244d10d4a7f4835ffd58773bc72e07d35fecf472295503"
|
||||
"checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4"
|
||||
"checksum nix 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "47e49f6982987135c5e9620ab317623e723bd06738fd85377e8d55f57c8b6487"
|
||||
"checksum num 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "2c3a3dc9f30bf824141521b30c908a859ab190b76e20435fcd89f35eb6583887"
|
||||
"checksum num-integer 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "ef1a4bf6f9174aa5783a9b4cc892cacd11aebad6c69ad027a0b65c6ca5f8aa37"
|
||||
"checksum num-iter 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d1891bd7b936f12349b7d1403761c8a0b85a18b148e9da4429d5d102c1a41e"
|
||||
"checksum num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "1708c0628602a98b52fad936cf3edb9a107af06e52e49fdf0707e884456a6af6"
|
||||
"checksum num 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "a311b77ebdc5dd4cf6449d81e4135d9f0e3b153839ac90e648a8ef538f923525"
|
||||
"checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba"
|
||||
"checksum num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "7485fcc84f85b4ecd0ea527b14189281cf27d60e583ae65ebc9c088b13dffe01"
|
||||
"checksum num-traits 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "99843c856d68d8b4313b03a17e33c4bb42ae8f6610ea81b28abe076ac721b9b0"
|
||||
"checksum num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aec53c34f2d0247c5ca5d32cca1478762f301740468ee9ee6dcb7a0dd7a0c584"
|
||||
"checksum onig 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee619da9cf707b167098e84fb00f10db61d5a662d1d29b59822bcac3a81553dd"
|
||||
"checksum onig_sys 63.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "531682ab45a2cd40eff91f29340dae975f25336d2b61e624adabed39e61d7fb3"
|
||||
"checksum onig 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1271a3f93197303deda8aedcd96ed2dbb908f61c0954ae70bf7a42f536dc35d7"
|
||||
"checksum onig_sys 65.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fbdee58fb75f5b7749ebc8f601f570961eed595dfe4c2bb9a542e2f7ae20b946"
|
||||
"checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
|
||||
"checksum pretty-bytes 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3095b93999fae14b4e0bb661c53875a441d9058b7b1a7ba2dfebc104d3776349"
|
||||
"checksum quick-error 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c36987d4978eb1be2e422b1e0423a557923a5c3e7e6f31d5699e9aafaefa469"
|
||||
"checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d"
|
||||
"checksum redox_syscall 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "e4a357d14a12e90a37d658725df0e6468504750b5948b9710f83f94a0c5818e8"
|
||||
"checksum redox_syscall 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "9df6a71a1e67be2104410736b2389fb8e383c1d7e9e792d629ff13c02867147a"
|
||||
"checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"
|
||||
"checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
|
||||
"checksum remove_dir_all 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0882bc41b0ba6131c7f0ce97233b62d8099e3f3abc60d4938185d3e35439c0cc"
|
||||
"checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a"
|
||||
"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
|
||||
"checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084"
|
||||
|
@ -1482,7 +1522,7 @@ dependencies = [
|
|||
"checksum termsize 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3a225cb94c3630aabd2e289cad545679dd38b5f4891524e92da1be10aae6e4e8"
|
||||
"checksum textwrap 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f86300c3e7416ee233abd7cda890c492007a3980f941f79185c753a701257167"
|
||||
"checksum thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1697c4b57aeeb7a536b647165a2825faddffb1d3bad386d507709bd51a90bb14"
|
||||
"checksum time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "ffd7ccbf969a892bf83f1e441126968a07a3941c24ff522a26af9f9f4585d1a3"
|
||||
"checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520"
|
||||
"checksum unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18127285758f0e2c6cf325bb3f3d138a12fee27de4f23e146cd6a179f26c2cf3"
|
||||
"checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
|
||||
"checksum unindent 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3508be0ce1bacc38d579b69bffb4b8d469f5af0c388ff4890b2b294e61671ffe"
|
||||
|
@ -1496,3 +1536,4 @@ dependencies = [
|
|||
"checksum walker 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0488b82b198ac3588ba688f5e56cbd53e0b6dad64f075e67c15647e54aac610"
|
||||
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
||||
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
||||
"checksum xattr 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "abb373b92de38a4301d66bec009929b4fb83120ea1c4a401be89dbe0b9777443"
|
||||
|
|
18
Cargo.toml
18
Cargo.toml
|
@ -238,17 +238,17 @@ whoami = { optional=true, path="src/whoami" }
|
|||
yes = { optional=true, path="src/yes" }
|
||||
|
||||
[dev-dependencies]
|
||||
time = "*"
|
||||
filetime = "*"
|
||||
libc = "*"
|
||||
regex="*"
|
||||
rand="*"
|
||||
tempdir="*"
|
||||
unindent="*"
|
||||
lazy_static = "*"
|
||||
time = "0.1.38"
|
||||
filetime = "0.1.10"
|
||||
libc = "0.2.26"
|
||||
regex = "0.2.2"
|
||||
rand = "0.3.15"
|
||||
tempdir = "0.3.5"
|
||||
unindent = "0.1.0"
|
||||
lazy_static = "0.2.2"
|
||||
|
||||
[target.'cfg(unix)'.dev-dependencies]
|
||||
unix_socket = "*"
|
||||
unix_socket = "0.5.0"
|
||||
|
||||
[[bin]]
|
||||
name = "uutils"
|
||||
|
|
193
README.md
193
README.md
|
@ -4,6 +4,7 @@ uutils coreutils
|
|||
[![License](http://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/uutils/coreutils/blob/master/LICENSE)
|
||||
[![Build Status](https://api.travis-ci.org/uutils/coreutils.svg?branch=master)](https://travis-ci.org/uutils/coreutils)
|
||||
[![Build status](https://ci.appveyor.com/api/projects/status/787ltcxgy86r20le?svg=true)](https://ci.appveyor.com/project/Arcterus/coreutils)
|
||||
[![LOC](https://tokei.rs/b1/github/uutils/coreutils?category=code)](https://github.com/Aaronepower/tokei)
|
||||
|
||||
uutils is an attempt at writing universal (as in cross-platform) CLI
|
||||
utils in [Rust](http://www.rust-lang.org). This repo is to aggregate the GNU
|
||||
|
@ -144,110 +145,96 @@ Contribute
|
|||
|
||||
To contribute to coreutils, please see [CONTRIBUTING](CONTRIBUTING.md).
|
||||
|
||||
To do
|
||||
-----
|
||||
Utilities
|
||||
---------
|
||||
|
||||
* [x] arch
|
||||
* [x] base32
|
||||
* [x] base64
|
||||
* [x] basename
|
||||
* [x] cat
|
||||
* [ ] chcon
|
||||
* [x] chgrp
|
||||
* [x] chmod
|
||||
* [x] chown
|
||||
* [x] chroot
|
||||
* [x] cksum
|
||||
* [x] comm
|
||||
* [ ] cp (not much done)
|
||||
* [ ] csplit
|
||||
* [x] cut
|
||||
* [ ] date
|
||||
* [ ] dd
|
||||
* [ ] df
|
||||
* [x] dircolors
|
||||
* [x] dirname
|
||||
* [x] du
|
||||
* [x] echo
|
||||
* [x] env
|
||||
* [x] expand
|
||||
* [x] expr
|
||||
* [x] factor
|
||||
* [x] false
|
||||
* [x] fmt
|
||||
* [x] fold
|
||||
* [x] groups
|
||||
* [x] hashsum
|
||||
* [x] head
|
||||
* [x] hostid
|
||||
* [x] hostname
|
||||
* [x] id
|
||||
* [ ] install (a couple of missing options)
|
||||
* [ ] join
|
||||
* [x] kill
|
||||
* [x] link
|
||||
* [x] ln
|
||||
* [x] logname
|
||||
* [ ] ls
|
||||
* [x] ~~md5sum~~, ~~sha1sum~~, ~~sha224sum~~, ~~sha256sum~~, ~~sha384sum~~, ~~sha512sum~~ (replaced by [hashsum](https://github.com/uutils/coreutils/blob/master/src/hashsum/hashsum.rs))
|
||||
* [x] mkdir
|
||||
* [x] mkfifo
|
||||
* [x] mknod
|
||||
* [x] mktemp
|
||||
* [x] mv
|
||||
* [ ] more (in progress, needs lots of work)
|
||||
* [x] nice
|
||||
* [x] nl
|
||||
* [x] nohup
|
||||
* [x] nproc
|
||||
* [ ] numfmt
|
||||
* [ ] od (almost complete, `--strings` and 128-bit datatypes are missing)
|
||||
* [x] paste
|
||||
* [x] pathchk
|
||||
* [x] pinky
|
||||
* [ ] pr
|
||||
* [x] printenv
|
||||
* [ ] printf
|
||||
* [x] ptx
|
||||
* [x] pwd
|
||||
* [x] readlink
|
||||
* [x] realpath
|
||||
* [x] relpath
|
||||
* [x] rm
|
||||
* [x] rmdir
|
||||
* [ ] runcon
|
||||
* [x] seq
|
||||
* [x] shred
|
||||
* [x] shuf
|
||||
* [x] sleep
|
||||
* [ ] sort (a couple of options implemented)
|
||||
* [ ] split (a couple of missing options)
|
||||
* [x] stat
|
||||
* [x] stdbuf
|
||||
* [ ] stty
|
||||
* [x] sum
|
||||
* [x] sync
|
||||
* [x] tac
|
||||
* [ ] tail (not all features implemented)
|
||||
* [x] tee
|
||||
* [ ] test (not all features implemented)
|
||||
* [x] timeout
|
||||
* [x] touch
|
||||
* [x] tr
|
||||
* [x] true
|
||||
* [x] truncate
|
||||
* [x] tsort
|
||||
* [x] tty
|
||||
* [x] uname
|
||||
* [x] unexpand
|
||||
* [x] uniq
|
||||
* [x] unlink
|
||||
* [x] uptime
|
||||
* [x] users
|
||||
* [x] wc
|
||||
* [x] who
|
||||
* [x] whoami
|
||||
* [x] yes
|
||||
| Done | Semi-Done | To Do |
|
||||
|-----------|-----------|--------|
|
||||
| arch | cp | chcon |
|
||||
| base32 | expr | csplit |
|
||||
| base64 | install | dd |
|
||||
| basename | ls | df |
|
||||
| cat | more | join |
|
||||
| chgrp | od (`--strings` and 128-bit data types missing) | numfmt |
|
||||
| chmod | printf | pr |
|
||||
| chown | sort | runcon |
|
||||
| chroot | split | stty |
|
||||
| cksum | tail | |
|
||||
| comm | test | |
|
||||
| cut | date | |
|
||||
| dircolors | | |
|
||||
| dirname | | |
|
||||
| du | | |
|
||||
| echo | | |
|
||||
| env | | |
|
||||
| expand | | |
|
||||
| factor | | |
|
||||
| false | | |
|
||||
| fmt | | |
|
||||
| fold | | |
|
||||
| groups | | |
|
||||
| hashsum | | |
|
||||
| head | | |
|
||||
| hostid | | |
|
||||
| hostname | | |
|
||||
| id | | |
|
||||
| kill | | |
|
||||
| link | | |
|
||||
| ln | | |
|
||||
| logname | | |
|
||||
| ~~md5sum~~ (replaced by [hashsum](https://github.com/uutils/coreutils/blob/master/src/hashsum/hashsum.rs)) | |
|
||||
| ~~sha1sum~~ (replaced by [hashsum](https://github.com/uutils/coreutils/blob/master/src/hashsum/hashsum.rs)) | |
|
||||
| ~~sha224sum~~ (replaced by [hashsum](https://github.com/uutils/coreutils/blob/master/src/hashsum/hashsum.rs)) | |
|
||||
| ~~sha256sum~~ (replaced by [hashsum](https://github.com/uutils/coreutils/blob/master/src/hashsum/hashsum.rs)) | |
|
||||
| ~~sha384sum~~ (replaced by [hashsum](https://github.com/uutils/coreutils/blob/master/src/hashsum/hashsum.rs)) | |
|
||||
| ~~sha512sum~~ (replaced by [hashsum](https://github.com/uutils/coreutils/blob/master/src/hashsum/hashsum.rs)) | |
|
||||
| mkdir | | |
|
||||
| mkfifo | | |
|
||||
| mknod | | |
|
||||
| mktemp | | |
|
||||
| mv | | |
|
||||
| nice | | |
|
||||
| nl | | |
|
||||
| nohup | | |
|
||||
| nproc | | |
|
||||
| paste | | |
|
||||
| pathchk | | |
|
||||
| pinky | | |
|
||||
| printenv | | |
|
||||
| ptx | | |
|
||||
| pwd | | |
|
||||
| readlink | | |
|
||||
| realpath | | |
|
||||
| relpath | | |
|
||||
| rm | | |
|
||||
| rmdir | | |
|
||||
| seq | | |
|
||||
| shred | | |
|
||||
| shuf | | |
|
||||
| sleep | | |
|
||||
| stat | | |
|
||||
| stdbuf | | |
|
||||
| sum | | |
|
||||
| sync | | |
|
||||
| tac | | |
|
||||
| tee | | |
|
||||
| timeout | | |
|
||||
| touch | | |
|
||||
| tr | | |
|
||||
| true | | |
|
||||
| truncate | | |
|
||||
| tsort | | |
|
||||
| tty | | |
|
||||
| uname | | |
|
||||
| unexpand | | |
|
||||
| uniq | | |
|
||||
| unlink | | |
|
||||
| uptime | | |
|
||||
| users | | |
|
||||
| wc | | |
|
||||
| who | | |
|
||||
| whoami | | |
|
||||
| yes | | |
|
||||
|
||||
License
|
||||
-------
|
||||
|
|
|
@ -11,7 +11,7 @@ path = "base32.rs"
|
|||
uucore = { path="../uucore" }
|
||||
|
||||
[dependencies.clippy]
|
||||
version = "*"
|
||||
version = "0.0.143"
|
||||
optional = true
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_chgrp"
|
|||
path = "chgrp.rs"
|
||||
|
||||
[dependencies]
|
||||
walkdir = "*"
|
||||
walkdir = "1.0.7"
|
||||
|
||||
[dependencies.uucore]
|
||||
path = "../uucore"
|
||||
|
|
|
@ -8,9 +8,9 @@ name = "uu_chmod"
|
|||
path = "chmod.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
walker = "*"
|
||||
walker = "1.0.0"
|
||||
|
||||
[[bin]]
|
||||
name = "chmod"
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
#[cfg(unix)]
|
||||
extern crate libc;
|
||||
extern crate walker;
|
||||
|
||||
|
@ -16,9 +17,9 @@ extern crate walker;
|
|||
extern crate uucore;
|
||||
|
||||
use std::error::Error;
|
||||
use std::ffi::CString;
|
||||
use std::io::{self, Write};
|
||||
use std::mem;
|
||||
use std::fs;
|
||||
use std::io::Write;
|
||||
use std::os::unix::fs::{MetadataExt, PermissionsExt};
|
||||
use std::path::Path;
|
||||
use walker::Walker;
|
||||
|
||||
|
@ -74,16 +75,10 @@ pub fn uumain(mut args: Vec<String>) -> i32 {
|
|||
let verbose = matches.opt_present("verbose");
|
||||
let preserve_root = matches.opt_present("preserve-root");
|
||||
let recursive = matches.opt_present("recursive");
|
||||
let fmode = matches.opt_str("reference").and_then(|fref| {
|
||||
let s = CString::new(fref).unwrap_or_else( |_| {
|
||||
crash!(1, "reference file name contains internal nul byte")
|
||||
});
|
||||
let mut stat : libc::stat = unsafe { mem::uninitialized() };
|
||||
let statres = unsafe { libc::stat(s.as_ptr() as *const _, &mut stat as *mut libc::stat) };
|
||||
if statres == 0 {
|
||||
Some(stat.st_mode)
|
||||
} else {
|
||||
crash!(1, "cannot stat attribues of '{}': {}", matches.opt_str("reference").unwrap(), io::Error::last_os_error())
|
||||
let fmode = matches.opt_str("reference").and_then(|ref fref| {
|
||||
match fs::metadata(fref) {
|
||||
Ok(meta) => Some(meta.mode()),
|
||||
Err(err) => crash!(1, "cannot stat attribues of '{}': {}", fref, err)
|
||||
}
|
||||
});
|
||||
let cmode =
|
||||
|
@ -108,7 +103,7 @@ pub fn uumain(mut args: Vec<String>) -> i32 {
|
|||
0
|
||||
}
|
||||
|
||||
fn chmod(files: Vec<String>, changes: bool, quiet: bool, verbose: bool, preserve_root: bool, recursive: bool, fmode: Option<libc::mode_t>, cmode: Option<&String>) -> Result<(), i32> {
|
||||
fn chmod(files: Vec<String>, changes: bool, quiet: bool, verbose: bool, preserve_root: bool, recursive: bool, fmode: Option<u32>, cmode: Option<&String>) -> Result<(), i32> {
|
||||
let mut r = Ok(());
|
||||
|
||||
for filename in &files {
|
||||
|
@ -157,28 +152,25 @@ fn chmod(files: Vec<String>, changes: bool, quiet: bool, verbose: bool, preserve
|
|||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
fn chmod_file(file: &Path, name: &str, changes: bool, quiet: bool, verbose: bool, fmode: Option<libc::mode_t>, cmode: Option<&String>) -> Result<(), i32> {
|
||||
fn chmod_file(file: &Path, name: &str, changes: bool, quiet: bool, verbose: bool, fmode: Option<u32>, cmode: Option<&String>) -> Result<(), i32> {
|
||||
// chmod is useless on Windows
|
||||
// it doesn't set any permissions at all
|
||||
// instead it just sets the readonly attribute on the file
|
||||
Err(0)
|
||||
}
|
||||
#[cfg(unix)]
|
||||
fn chmod_file(file: &Path, name: &str, changes: bool, quiet: bool, verbose: bool, fmode: Option<libc::mode_t>, cmode: Option<&String>) -> Result<(), i32> {
|
||||
let path = CString::new(name).unwrap_or_else(|e| panic!("{}", e));
|
||||
let mut stat: libc::stat = unsafe { mem::uninitialized() };
|
||||
let statres = unsafe { libc::stat(path.as_ptr(), &mut stat as *mut libc::stat) };
|
||||
let mut fperm =
|
||||
if statres == 0 {
|
||||
stat.st_mode & 0o7777
|
||||
} else {
|
||||
#[cfg(any(unix, target_os = "redox"))]
|
||||
fn chmod_file(file: &Path, name: &str, changes: bool, quiet: bool, verbose: bool, fmode: Option<u32>, cmode: Option<&String>) -> Result<(), i32> {
|
||||
let mut fperm = match fs::metadata(name) {
|
||||
Ok(meta) => meta.mode() & 0o7777,
|
||||
Err(err) => {
|
||||
if !quiet {
|
||||
show_error!("{}", io::Error::last_os_error());
|
||||
show_error!("{}", err);
|
||||
}
|
||||
return Err(1);
|
||||
};
|
||||
}
|
||||
};
|
||||
match fmode {
|
||||
Some(mode) => try!(change_file(fperm, mode, file, &path, verbose, changes, quiet)),
|
||||
Some(mode) => try!(change_file(fperm, mode, file, name, verbose, changes, quiet)),
|
||||
None => {
|
||||
for mode in cmode.unwrap().split(',') { // cmode is guaranteed to be Some in this case
|
||||
let arr: &[char] = &['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
|
||||
|
@ -190,7 +182,7 @@ fn chmod_file(file: &Path, name: &str, changes: bool, quiet: bool, verbose: bool
|
|||
};
|
||||
match result {
|
||||
Ok(mode) => {
|
||||
try!(change_file(fperm, mode, file, &path, verbose, changes, quiet));
|
||||
try!(change_file(fperm, mode, file, name, verbose, changes, quiet));
|
||||
fperm = mode;
|
||||
}
|
||||
Err(f) => {
|
||||
|
@ -207,13 +199,13 @@ fn chmod_file(file: &Path, name: &str, changes: bool, quiet: bool, verbose: bool
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn parse_numeric(fperm: libc::mode_t, mut mode: &str) -> Result<libc::mode_t, String> {
|
||||
fn parse_numeric(fperm: u32, mut mode: &str) -> Result<u32, String> {
|
||||
let (op, pos) = try!(parse_op(mode, Some('=')));
|
||||
mode = mode[pos..].trim_left_matches('0');
|
||||
if mode.len() > 4 {
|
||||
Err(format!("mode is too large ({} > 7777)", mode))
|
||||
} else {
|
||||
match libc::mode_t::from_str_radix(mode, 8) {
|
||||
match u32::from_str_radix(mode, 8) {
|
||||
Ok(change) => {
|
||||
Ok(match op {
|
||||
'+' => fperm | change,
|
||||
|
@ -227,14 +219,23 @@ fn parse_numeric(fperm: libc::mode_t, mut mode: &str) -> Result<libc::mode_t, St
|
|||
}
|
||||
}
|
||||
|
||||
fn parse_symbolic(mut fperm: libc::mode_t, mut mode: &str, file: &Path) -> Result<libc::mode_t, String> {
|
||||
fn parse_symbolic(mut fperm: u32, mut mode: &str, file: &Path) -> Result<u32, String> {
|
||||
#[cfg(unix)]
|
||||
use libc::umask;
|
||||
|
||||
#[cfg(target_os = "redox")]
|
||||
unsafe fn umask(_mask: u32) -> u32 {
|
||||
// XXX Redox does not currently have umask
|
||||
0
|
||||
}
|
||||
|
||||
let (mask, pos) = parse_levels(mode);
|
||||
if pos == mode.len() {
|
||||
return Err(format!("invalid mode ({})", mode));
|
||||
}
|
||||
let respect_umask = pos == 0;
|
||||
let last_umask = unsafe {
|
||||
libc::umask(0)
|
||||
umask(0)
|
||||
};
|
||||
mode = &mode[pos..];
|
||||
while mode.len() > 0 {
|
||||
|
@ -242,7 +243,7 @@ fn parse_symbolic(mut fperm: libc::mode_t, mut mode: &str, file: &Path) -> Resul
|
|||
mode = &mode[pos..];
|
||||
let (mut srwx, pos) = parse_change(mode, fperm, file);
|
||||
if respect_umask {
|
||||
srwx &= !last_umask;
|
||||
srwx &= !(last_umask as u32);
|
||||
}
|
||||
mode = &mode[pos..];
|
||||
match op {
|
||||
|
@ -253,12 +254,12 @@ fn parse_symbolic(mut fperm: libc::mode_t, mut mode: &str, file: &Path) -> Resul
|
|||
}
|
||||
}
|
||||
unsafe {
|
||||
libc::umask(last_umask);
|
||||
umask(last_umask);
|
||||
}
|
||||
Ok(fperm)
|
||||
}
|
||||
|
||||
fn parse_levels(mode: &str) -> (libc::mode_t, usize) {
|
||||
fn parse_levels(mode: &str) -> (u32, usize) {
|
||||
let mut mask = 0;
|
||||
let mut pos = 0;
|
||||
for ch in mode.chars() {
|
||||
|
@ -290,7 +291,7 @@ fn parse_op(mode: &str, default: Option<char>) -> Result<(char, usize), String>
|
|||
}
|
||||
}
|
||||
|
||||
fn parse_change(mode: &str, fperm: libc::mode_t, file: &Path) -> (libc::mode_t, usize) {
|
||||
fn parse_change(mode: &str, fperm: u32, file: &Path) -> (u32, usize) {
|
||||
let mut srwx = fperm & 0o7000;
|
||||
let mut pos = 0;
|
||||
for ch in mode.chars() {
|
||||
|
@ -318,24 +319,24 @@ fn parse_change(mode: &str, fperm: libc::mode_t, file: &Path) -> (libc::mode_t,
|
|||
(srwx, pos)
|
||||
}
|
||||
|
||||
fn change_file(fperm: libc::mode_t, mode: libc::mode_t, file: &Path, path: &CString, verbose: bool, changes: bool, quiet: bool) -> Result<(), i32> {
|
||||
fn change_file(fperm: u32, mode: u32, file: &Path, path: &str, verbose: bool, changes: bool, quiet: bool) -> Result<(), i32> {
|
||||
if fperm == mode {
|
||||
if verbose && !changes {
|
||||
show_info!("mode of '{}' retained as {:o}", file.display(), fperm);
|
||||
}
|
||||
Ok(())
|
||||
} else if unsafe { libc::chmod(path.as_ptr(), mode) } == 0 {
|
||||
if verbose || changes {
|
||||
show_info!("mode of '{}' changed from {:o} to {:o}", file.display(), fperm, mode);
|
||||
}
|
||||
Ok(())
|
||||
} else {
|
||||
} else if let Err(err) = fs::set_permissions(Path::new(path), fs::Permissions::from_mode(mode)) {
|
||||
if !quiet {
|
||||
show_error!("{}", io::Error::last_os_error());
|
||||
show_error!("{}", err);
|
||||
}
|
||||
if verbose {
|
||||
show_info!("failed to change mode of file '{}' from {:o} to {:o}", file.display(), fperm, mode);
|
||||
}
|
||||
return Err(1);
|
||||
Err(1)
|
||||
} else {
|
||||
if verbose || changes {
|
||||
show_info!("mode of '{}' changed from {:o} to {:o}", file.display(), fperm, mode);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_chown"
|
|||
path = "chown.rs"
|
||||
|
||||
[dependencies]
|
||||
glob = "*"
|
||||
glob = "0.2.11"
|
||||
walkdir = "0.1"
|
||||
|
||||
[dependencies.uucore]
|
||||
|
@ -17,7 +17,7 @@ default-features = false
|
|||
features = ["entries", "fs"]
|
||||
|
||||
[dependencies.clippy]
|
||||
version = "*"
|
||||
version = "0.0.143"
|
||||
optional = true
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_chroot"
|
|||
path = "chroot.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
|
||||
[dependencies.uucore]
|
||||
path = "../uucore"
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_cksum"
|
|||
path = "cksum.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_comm"
|
|||
path = "comm.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
getopts = "*"
|
||||
libc = "0.2.26"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -1,16 +1,33 @@
|
|||
[package]
|
||||
name = "cp"
|
||||
version = "0.0.1"
|
||||
authors = []
|
||||
authors = [
|
||||
"Jordy Dickinson <jordy.dickinson@gmail.com>",
|
||||
"Joshua S. Miller <jsmiller@uchicago.edu>",
|
||||
]
|
||||
|
||||
[lib]
|
||||
name = "uu_cp"
|
||||
path = "cp.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
walkdir = "1.0.7"
|
||||
clap = "2.20.0"
|
||||
quick-error = "1.1.0"
|
||||
uucore = { path="../uucore" }
|
||||
filetime = "0.1"
|
||||
|
||||
[target.'cfg(target_os = "linux")'.dependencies]
|
||||
ioctl-sys = "0.5.2"
|
||||
|
||||
[target.'cfg(target_os = "windows")'.dependencies]
|
||||
kernel32-sys = "*"
|
||||
winapi = "*"
|
||||
|
||||
[target.'cfg(unix)'.dependencies]
|
||||
xattr="0.2.1"
|
||||
|
||||
[[bin]]
|
||||
name = "cp"
|
||||
|
|
38
src/cp/README.md
Normal file
38
src/cp/README.md
Normal file
|
@ -0,0 +1,38 @@
|
|||
## Feature list
|
||||
|
||||
### To Do
|
||||
|
||||
- [ ] archive
|
||||
- [ ] attributes-only
|
||||
- [ ] copy-contents
|
||||
- [ ] no-dereference-preserve-linkgs
|
||||
- [ ] dereference
|
||||
- [ ] no-dereference
|
||||
- [ ] preserve-default-attributes
|
||||
- [ ] preserve
|
||||
- [ ] no-preserve
|
||||
- [ ] parents
|
||||
- [ ] reflink
|
||||
- [ ] sparse
|
||||
- [ ] strip-trailing-slashes
|
||||
- [ ] update
|
||||
- [ ] one-file-system
|
||||
- [ ] context
|
||||
- [ ] cli-symbolic-links
|
||||
|
||||
### Completed
|
||||
|
||||
- [x] backup
|
||||
- [x] force (Not implemented on Windows)
|
||||
- [x] interactive
|
||||
- [x] link
|
||||
- [x] no-clobber
|
||||
- [x] no-target-directory
|
||||
- [x] paths
|
||||
- [x] recursive
|
||||
- [x] remove-destination (On Windows, current only works for writeable files)
|
||||
- [x] suffix
|
||||
- [x] symbolic-link
|
||||
- [x] target-directory
|
||||
- [x] verbose
|
||||
- [x] version
|
1217
src/cp/cp.rs
1217
src/cp/cp.rs
File diff suppressed because it is too large
Load diff
|
@ -8,8 +8,8 @@ name = "uu_date"
|
|||
path = "date.rs"
|
||||
|
||||
[dependencies]
|
||||
chrono = "0.4"
|
||||
clap = "2.25"
|
||||
chrono = "0.4.0"
|
||||
clap = "2.24.1"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
extern crate uu_echo;
|
||||
extern crate uu_date;
|
||||
|
||||
fn main() {
|
||||
std::process::exit(uu_date::uumain(std::env::args().collect()));
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_dircolors"
|
|||
path = "dircolors.rs"
|
||||
|
||||
[dependencies]
|
||||
glob = "*"
|
||||
glob = "0.2.11"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_dirname"
|
|||
path = "dirname.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_du"
|
|||
path = "du.rs"
|
||||
|
||||
[dependencies]
|
||||
time = "*"
|
||||
time = "0.1.38"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
2
src/env/Cargo.toml
vendored
2
src/env/Cargo.toml
vendored
|
@ -8,7 +8,7 @@ name = "uu_env"
|
|||
path = "env.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_expand"
|
|||
path = "expand.rs"
|
||||
|
||||
[dependencies]
|
||||
unicode-width = "*"
|
||||
getopts = "*"
|
||||
unicode-width = "0.1.4"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_expr"
|
|||
path = "expr.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
onig = "1.3"
|
||||
libc = "0.2.26"
|
||||
onig = "1.3.0"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_factor"
|
|||
path = "factor.rs"
|
||||
|
||||
[dependencies]
|
||||
rand = "*"
|
||||
rand = "0.3.15"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_fmt"
|
|||
path = "fmt.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
unicode-width = "*"
|
||||
libc = "0.2.26"
|
||||
unicode-width = "0.1.4"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,12 +8,12 @@ name = "uu_hashsum"
|
|||
path = "hashsum.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
regex = "*"
|
||||
regex-syntax = "*"
|
||||
rust-crypto = "*"
|
||||
rustc-serialize = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
regex = "0.2.2"
|
||||
regex-syntax = "0.4.1"
|
||||
rust-crypto = "0.2.36"
|
||||
rustc-serialize = "0.3.24"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_head"
|
|||
path = "head.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_hostid"
|
|||
path = "hostid.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_hostname"
|
|||
path = "hostname.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,12 +8,12 @@ name = "uu_install"
|
|||
path = "install.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = ">= 0.2"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[dev-dependencies]
|
||||
time = "*"
|
||||
time = "0.1.38"
|
||||
|
||||
[[bin]]
|
||||
name = "install"
|
||||
|
|
|
@ -27,12 +27,12 @@ static SUMMARY: &'static str = "Copy SOURCE to DEST or multiple SOURCE(s) to the
|
|||
DIRECTORY, while setting permission modes and owner/group";
|
||||
static LONG_HELP: &'static str = "";
|
||||
|
||||
const DEFAULT_MODE: libc::mode_t = 755;
|
||||
const DEFAULT_MODE: u32 = 755;
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub struct Behaviour {
|
||||
main_function: MainFunction,
|
||||
specified_mode: Option<libc::mode_t>,
|
||||
specified_mode: Option<u32>,
|
||||
suffix: String,
|
||||
verbose: bool
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ pub enum MainFunction {
|
|||
|
||||
impl Behaviour {
|
||||
/// Determine the mode for chmod after copy.
|
||||
pub fn mode(&self) -> libc::mode_t {
|
||||
pub fn mode(&self) -> u32 {
|
||||
match self.specified_mode {
|
||||
Some(x) => x,
|
||||
None => DEFAULT_MODE
|
||||
|
@ -138,8 +138,7 @@ fn parse_opts(args: Vec<String>) -> getopts::Matches {
|
|||
DIRECTORY", "DIRECTORY")
|
||||
// TODO implement flag
|
||||
.optflag("T", "no-target-directory", "(unimplemented) treat DEST as a normal file")
|
||||
// TODO implement flag
|
||||
.optflag("v", "verbose", "(unimplemented) explain what is being done")
|
||||
.optflag("v", "verbose", "explain what is being done")
|
||||
// TODO implement flag
|
||||
.optflag("P", "preserve-context", "(unimplemented) preserve security context")
|
||||
// TODO implement flag
|
||||
|
@ -181,8 +180,6 @@ fn check_unimplemented(matches: &getopts::Matches) -> Result<(), &str> {
|
|||
Err("--target-directory, -t")
|
||||
} else if matches.opt_present("no-target-directory") {
|
||||
Err("--no-target-directory, -T")
|
||||
} else if matches.opt_present("verbose") {
|
||||
Err("--verbose, -v")
|
||||
} else if matches.opt_present("preserve-context") {
|
||||
Err("--preserve-context, -P")
|
||||
} else if matches.opt_present("context") {
|
||||
|
@ -209,7 +206,7 @@ fn behaviour(matches: &getopts::Matches) -> Result<Behaviour, i32> {
|
|||
|
||||
let considering_dir: bool = MainFunction::Directory == main_function;
|
||||
|
||||
let specified_mode: Option<libc::mode_t> = if matches.opt_present("mode") {
|
||||
let specified_mode: Option<u32> = if matches.opt_present("mode") {
|
||||
match matches.opt_str("mode") {
|
||||
Some(x) => {
|
||||
match mode::parse(&x[..], considering_dir) {
|
||||
|
@ -367,7 +364,7 @@ fn copy(from: &PathBuf, to: &PathBuf, b: &Behaviour) -> Result<(), ()> {
|
|||
}
|
||||
|
||||
if b.verbose {
|
||||
print!("‘{}’ -> ‘{}’", from.display(), to.display());
|
||||
show_info!("'{}' -> '{}'", from.display(), to.display());
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
|
|
@ -2,9 +2,10 @@ extern crate libc;
|
|||
|
||||
use std::io::Write;
|
||||
use std::path::Path;
|
||||
use std::fs;
|
||||
|
||||
/// Takes a user-supplied string and tries to parse to u16 mode bitmask.
|
||||
pub fn parse(mode_string: &str, considering_dir: bool) -> Result<libc::mode_t, String> {
|
||||
pub fn parse(mode_string: &str, considering_dir: bool) -> Result<u32, String> {
|
||||
let numbers: &[char] = &['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
|
||||
|
||||
// Passing 000 as the existing permissions seems to mirror GNU behaviour.
|
||||
|
@ -19,21 +20,12 @@ pub fn parse(mode_string: &str, considering_dir: bool) -> Result<libc::mode_t, S
|
|||
///
|
||||
/// Adapted from mkdir.rs. Handles own error printing.
|
||||
///
|
||||
#[cfg(unix)]
|
||||
pub fn chmod(path: &Path, mode: libc::mode_t) -> Result<(), ()> {
|
||||
use std::ffi::CString;
|
||||
use std::io::Error;
|
||||
|
||||
let file = CString::new(path.as_os_str().to_str().unwrap()).
|
||||
unwrap_or_else(|e| crash!(1, "{}", e));
|
||||
let mode = mode as libc::mode_t;
|
||||
|
||||
if unsafe { libc::chmod(file.as_ptr(), mode) } != 0 {
|
||||
show_info!("{}: chmod failed with errno {}", path.display(),
|
||||
Error::last_os_error().raw_os_error().unwrap());
|
||||
return Err(());
|
||||
}
|
||||
Ok(())
|
||||
#[cfg(any(unix, target_os = "redox"))]
|
||||
pub fn chmod(path: &Path, mode: u32) -> Result<(), ()> {
|
||||
use std::os::unix::fs::PermissionsExt;
|
||||
fs::set_permissions(path, fs::Permissions::from_mode(mode)).map_err(|err| {
|
||||
show_info!("{}: chmod failed with error {}", path.display(), err);
|
||||
})
|
||||
}
|
||||
|
||||
/// chmod a file or directory on Windows.
|
||||
|
@ -41,7 +33,7 @@ pub fn chmod(path: &Path, mode: libc::mode_t) -> Result<(), ()> {
|
|||
/// Adapted from mkdir.rs.
|
||||
///
|
||||
#[cfg(windows)]
|
||||
pub fn chmod(path: &Path, mode: libc::mode_t) -> Result<(), ()> {
|
||||
pub fn chmod(path: &Path, mode: u32) -> Result<(), ()> {
|
||||
// chmod on Windows only sets the readonly flag, which isn't even honored on directories
|
||||
Ok(())
|
||||
}
|
||||
|
@ -53,13 +45,13 @@ pub fn chmod(path: &Path, mode: libc::mode_t) -> Result<(), ()> {
|
|||
mod chmod_rs {
|
||||
extern crate libc;
|
||||
|
||||
pub fn parse_numeric(fperm: libc::mode_t, mut mode: &str) -> Result<libc::mode_t, String> {
|
||||
pub fn parse_numeric(fperm: u32, mut mode: &str) -> Result<u32, String> {
|
||||
let (op, pos) = try!(parse_op(mode, Some('=')));
|
||||
mode = mode[pos..].trim_left_matches('0');
|
||||
if mode.len() > 4 {
|
||||
Err(format!("mode is too large ({} > 7777)", mode))
|
||||
} else {
|
||||
match libc::mode_t::from_str_radix(mode, 8) {
|
||||
match u32::from_str_radix(mode, 8) {
|
||||
Ok(change) => {
|
||||
Ok(match op {
|
||||
'+' => fperm | change,
|
||||
|
@ -73,14 +65,23 @@ mod chmod_rs {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn parse_symbolic(mut fperm: libc::mode_t, mut mode: &str, considering_dir: bool) -> Result<libc::mode_t, String> {
|
||||
pub fn parse_symbolic(mut fperm: u32, mut mode: &str, considering_dir: bool) -> Result<u32, String> {
|
||||
#[cfg(unix)]
|
||||
use libc::umask;
|
||||
|
||||
#[cfg(target_os = "redox")]
|
||||
unsafe fn umask(_mask: u32) -> u32 {
|
||||
// XXX Redox does not currently have umask
|
||||
0
|
||||
}
|
||||
|
||||
let (mask, pos) = parse_levels(mode);
|
||||
if pos == mode.len() {
|
||||
return Err(format!("invalid mode ({})", mode));
|
||||
}
|
||||
let respect_umask = pos == 0;
|
||||
let last_umask = unsafe {
|
||||
libc::umask(0)
|
||||
umask(0)
|
||||
};
|
||||
mode = &mode[pos..];
|
||||
while mode.len() > 0 {
|
||||
|
@ -88,7 +89,7 @@ mod chmod_rs {
|
|||
mode = &mode[pos..];
|
||||
let (mut srwx, pos) = parse_change(mode, fperm, considering_dir);
|
||||
if respect_umask {
|
||||
srwx &= !last_umask;
|
||||
srwx &= !(last_umask as u32);
|
||||
}
|
||||
mode = &mode[pos..];
|
||||
match op {
|
||||
|
@ -99,12 +100,12 @@ mod chmod_rs {
|
|||
}
|
||||
}
|
||||
unsafe {
|
||||
libc::umask(last_umask);
|
||||
umask(last_umask);
|
||||
}
|
||||
Ok(fperm)
|
||||
}
|
||||
|
||||
fn parse_levels(mode: &str) -> (libc::mode_t, usize) {
|
||||
fn parse_levels(mode: &str) -> (u32, usize) {
|
||||
let mut mask = 0;
|
||||
let mut pos = 0;
|
||||
for ch in mode.chars() {
|
||||
|
@ -136,7 +137,7 @@ mod chmod_rs {
|
|||
}
|
||||
}
|
||||
|
||||
fn parse_change(mode: &str, fperm: libc::mode_t, considering_dir: bool) -> (libc::mode_t, usize) {
|
||||
fn parse_change(mode: &str, fperm: u32, considering_dir: bool) -> (u32, usize) {
|
||||
let mut srwx = fperm & 0o7000;
|
||||
let mut pos = 0;
|
||||
for ch in mode.chars() {
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_kill"
|
|||
path = "kill.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_link"
|
|||
path = "link.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_ln"
|
|||
path = "ln.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_logname"
|
|||
path = "logname.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,13 +8,13 @@ name = "uu_ls"
|
|||
path = "ls.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
pretty-bytes = "*"
|
||||
term_grid = "*"
|
||||
termsize = "*"
|
||||
time = "*"
|
||||
lazy_static = "*"
|
||||
unicode-width = "*"
|
||||
getopts = "0.2.14"
|
||||
pretty-bytes = "0.2.1"
|
||||
term_grid = "0.1.5"
|
||||
termsize = "0.1.4"
|
||||
time = "0.1.38"
|
||||
lazy_static = "0.2.8"
|
||||
unicode-width = "0.1.4"
|
||||
|
||||
[dependencies.uucore]
|
||||
path = "../uucore"
|
||||
|
|
31
src/ls/ls.rs
31
src/ls/ls.rs
|
@ -31,10 +31,11 @@ use std::fs;
|
|||
use std::fs::{DirEntry, FileType, Metadata};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::io::Write;
|
||||
use std::cmp::Reverse;
|
||||
#[cfg(unix)]
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[cfg(unix)]
|
||||
#[cfg(any(unix, target_os = "redox"))]
|
||||
use std::os::unix::fs::MetadataExt;
|
||||
#[cfg(unix)]
|
||||
use std::os::unix::fs::FileTypeExt;
|
||||
|
@ -44,13 +45,13 @@ use unicode_width::UnicodeWidthStr;
|
|||
#[cfg(windows)]
|
||||
use std::os::windows::fs::MetadataExt;
|
||||
|
||||
static NAME: &'static str = "ls";
|
||||
static SUMMARY: &'static str = "";
|
||||
static NAME: &'static str = "ls";
|
||||
static SUMMARY: &'static str = "";
|
||||
static LONG_HELP: &'static str = "
|
||||
By default, ls will list the files and contents of any directories on
|
||||
the command line, expect that it will ignore files and directories
|
||||
By default, ls will list the files and contents of any directories on
|
||||
the command line, expect that it will ignore files and directories
|
||||
whose names start with '.'
|
||||
";
|
||||
";
|
||||
|
||||
#[cfg(unix)]
|
||||
static DEFAULT_COLORS: &'static str = "rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:";
|
||||
|
@ -183,17 +184,22 @@ fn list(options: getopts::Matches) {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
#[cfg(any(unix, target_os = "redox"))]
|
||||
fn sort_entries(entries: &mut Vec<PathBuf>, options: &getopts::Matches) {
|
||||
let mut reverse = options.opt_present("r");
|
||||
if options.opt_present("t") {
|
||||
if options.opt_present("c") {
|
||||
entries.sort_by_key(|k| get_metadata(k, options).map(|md| md.ctime()).unwrap_or(0));
|
||||
entries.sort_by_key(|k| {
|
||||
Reverse(get_metadata(k, options)
|
||||
.map(|md| md.ctime())
|
||||
.unwrap_or(0))
|
||||
});
|
||||
} else {
|
||||
entries.sort_by_key(|k| {
|
||||
get_metadata(k, options)
|
||||
// Newest first
|
||||
Reverse(get_metadata(k, options)
|
||||
.and_then(|md| md.modified())
|
||||
.unwrap_or(std::time::UNIX_EPOCH)
|
||||
.unwrap_or(std::time::UNIX_EPOCH))
|
||||
});
|
||||
}
|
||||
} else if options.opt_present("S") {
|
||||
|
@ -213,9 +219,10 @@ fn sort_entries(entries: &mut Vec<PathBuf>, options: &getopts::Matches) {
|
|||
let mut reverse = options.opt_present("r");
|
||||
if options.opt_present("t") {
|
||||
entries.sort_by_key(|k| {
|
||||
get_metadata(k, options)
|
||||
// Newest first
|
||||
Reverse(get_metadata(k, options)
|
||||
.and_then(|md| md.modified())
|
||||
.unwrap_or(std::time::UNIX_EPOCH)
|
||||
.unwrap_or(std::time::UNIX_EPOCH))
|
||||
});
|
||||
} else if options.opt_present("S") {
|
||||
entries.sort_by_key(|k| get_metadata(k, options).map(|md| md.file_size()).unwrap_or(0));
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_mkdir"
|
|||
path = "mkdir.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_mkfifo"
|
|||
path = "mkfifo.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_mknod"
|
|||
path = "mknod.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "^0.2.4"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
|
|
|
@ -9,9 +9,9 @@ path = "mktemp.rs"
|
|||
|
||||
[dependencies]
|
||||
uucore = { path="../uucore" }
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
rand = "0.3"
|
||||
tempfile = "*"
|
||||
tempfile = "2.1.5"
|
||||
|
||||
[[bin]]
|
||||
name = "mktemp"
|
||||
|
|
|
@ -11,7 +11,7 @@ use std::path::Path;
|
|||
// enough that an attacker will run out of luck before we run out of patience.
|
||||
const NUM_RETRIES: u32 = 1 << 31;
|
||||
|
||||
#[cfg(unix)]
|
||||
#[cfg(any(unix, target_os = "redox"))]
|
||||
fn create_dir<P: AsRef<Path>>(path: P) -> IOResult<()> {
|
||||
use std::fs::DirBuilder;
|
||||
use std::os::unix::fs::DirBuilderExt;
|
||||
|
|
|
@ -8,11 +8,11 @@ name = "uu_more"
|
|||
path = "more.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[target.'cfg(all(unix, not(target_os = "fuchsia")))'.dependencies]
|
||||
nix = "*"
|
||||
nix = "0.8.1"
|
||||
|
||||
[[bin]]
|
||||
name = "more"
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_mv"
|
|||
path = "mv.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_nice"
|
|||
path = "nice.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,12 +8,12 @@ name = "uu_nl"
|
|||
path = "nl.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
aho-corasick = "*"
|
||||
memchr = "*"
|
||||
regex = "*"
|
||||
regex-syntax = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
aho-corasick = "0.6.3"
|
||||
memchr = "1.0.1"
|
||||
regex = "0.2.2"
|
||||
regex-syntax = "0.4.1"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_nohup"
|
|||
path = "nohup.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_nproc"
|
|||
path = "nproc.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
num_cpus = "1.5"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
|
|
|
@ -8,10 +8,10 @@ name = "uu_od"
|
|||
path = "od.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
byteorder = "*"
|
||||
half = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
byteorder = "1.1.0"
|
||||
half = "1.0.0"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_paste"
|
|||
path = "paste.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_pathchk"
|
|||
path = "pathchk.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_printenv"
|
|||
path = "printenv.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_printf"
|
|||
path = "printf.rs"
|
||||
|
||||
[dependencies]
|
||||
"itertools" = "*"
|
||||
"itertools" = "0.6.0"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -3,13 +3,12 @@
|
|||
#![allow(dead_code)]
|
||||
|
||||
extern crate itertools;
|
||||
extern crate uucore;
|
||||
|
||||
mod cli;
|
||||
mod memo;
|
||||
mod tokenize;
|
||||
|
||||
#[macro_use]
|
||||
extern crate uucore;
|
||||
|
||||
static NAME: &'static str = "printf";
|
||||
static VERSION: &'static str = "0.0.1";
|
||||
|
@ -39,12 +38,12 @@ static LONGHELP_BODY: &'static str = "
|
|||
ESCAPE SEQUENCES
|
||||
|
||||
The following escape sequences, organized here in alphabetical order,
|
||||
will print the corresponding character literal:
|
||||
will print the corresponding character literal:
|
||||
|
||||
\" double quote
|
||||
|
||||
\\\\ backslash
|
||||
|
||||
|
||||
\\a alert (BEL)
|
||||
|
||||
\\b backspace
|
||||
|
@ -64,7 +63,7 @@ static LONGHELP_BODY: &'static str = "
|
|||
\\v vertical tab
|
||||
|
||||
\\NNN byte with value expressed in octal value NNN (1 to 3 digits)
|
||||
values greater than 256 will be treated
|
||||
values greater than 256 will be treated
|
||||
|
||||
\\xHH byte with value expressed in hexadecimal value NN (1 to 2 digits)
|
||||
|
||||
|
@ -80,14 +79,14 @@ static LONGHELP_BODY: &'static str = "
|
|||
|
||||
Fields
|
||||
|
||||
%s - string
|
||||
%b - string parsed for literals
|
||||
%s - string
|
||||
%b - string parsed for literals
|
||||
second parameter is max length
|
||||
|
||||
%c - char
|
||||
no second parameter
|
||||
|
||||
%i or %d - 64-bit integer
|
||||
%i or %d - 64-bit integer
|
||||
%u - 64 bit unsigned integer
|
||||
%x or %X - 64-bit unsigned integer as hex
|
||||
%o - 64-bit unsigned integer as octal
|
||||
|
@ -97,7 +96,7 @@ static LONGHELP_BODY: &'static str = "
|
|||
%f or %F - decimal floating point value
|
||||
%e or %E - scientific notation floating point value
|
||||
%g or %G - shorter of specially interpreted decimal or SciNote floating point value.
|
||||
second parameter is
|
||||
second parameter is
|
||||
-max places after decimal point for floating point output
|
||||
-max number of significant digits for scientific notation output
|
||||
|
||||
|
@ -108,7 +107,7 @@ static LONGHELP_BODY: &'static str = "
|
|||
printf '%4.3i' 7
|
||||
has a first parameter of 4
|
||||
and a second parameter of 3
|
||||
will result in ' 007'
|
||||
will result in ' 007'
|
||||
|
||||
printf '%.1s' abcde
|
||||
has no first parameter
|
||||
|
@ -121,7 +120,7 @@ static LONGHELP_BODY: &'static str = "
|
|||
will result in ' q'
|
||||
|
||||
The first parameter of a field is the minimum width to pad the output to
|
||||
if the output is less than this absolute value of this width,
|
||||
if the output is less than this absolute value of this width,
|
||||
it will be padded with leading spaces, or, if the argument is negative,
|
||||
with trailing spaces. the default is zero.
|
||||
|
||||
|
@ -132,7 +131,7 @@ static LONGHELP_BODY: &'static str = "
|
|||
0 (e.g. 010) - interpret argument as octal (integer output fields only)
|
||||
0x (e.g. 0xABC) - interpret argument as hex (numeric output fields only)
|
||||
\' (e.g. \'a) - interpret argument as a character constant
|
||||
|
||||
|
||||
HOW TO USE SUBSTITUTIONS
|
||||
|
||||
Substitutions are used to pass additional argument(s) into the FORMAT string, to be formatted a
|
||||
|
@ -140,14 +139,14 @@ static LONGHELP_BODY: &'static str = "
|
|||
|
||||
printf 'the letter %X comes before the letter %X' 10 11
|
||||
|
||||
will print
|
||||
|
||||
'the letter A comes before the letter B'
|
||||
will print
|
||||
|
||||
'the letter A comes before the letter B'
|
||||
|
||||
because the substitution field %X means
|
||||
'take an integer argument and write it as a hexadecimal number'
|
||||
|
||||
Passing more arguments than are in the format string will cause the format string to be
|
||||
Passing more arguments than are in the format string will cause the format string to be
|
||||
repeated for the remaining substitutions
|
||||
|
||||
printf 'it is %i F in %s \n' 22 Portland 25 Boston 27 New York
|
||||
|
@ -160,18 +159,18 @@ static LONGHELP_BODY: &'static str = "
|
|||
'
|
||||
If a format string is printed but there are less arguments remaining
|
||||
than there are substitution fields, substitution fields without
|
||||
an argument will default to empty strings, or for numeric fields
|
||||
an argument will default to empty strings, or for numeric fields
|
||||
the value 0
|
||||
|
||||
AVAILABLE SUBSTITUTIONS
|
||||
|
||||
This program, like GNU coreutils printf,
|
||||
interprets a modified subset of the POSIX C printf spec,
|
||||
a quick reference to substitutions is below.
|
||||
This program, like GNU coreutils printf,
|
||||
interprets a modified subset of the POSIX C printf spec,
|
||||
a quick reference to substitutions is below.
|
||||
|
||||
STRING SUBSTITUTIONS
|
||||
All string fields have a 'max width' parameter
|
||||
%.3s means 'print no more than three characters of the original input'
|
||||
All string fields have a 'max width' parameter
|
||||
%.3s means 'print no more than three characters of the original input'
|
||||
|
||||
%s - string
|
||||
|
||||
|
@ -193,7 +192,7 @@ static LONGHELP_BODY: &'static str = "
|
|||
%.4i means an integer which if it is less than 4 digits in length,
|
||||
is padded with leading zeros until it is 4 digits in length.
|
||||
|
||||
%d or %i - 64-bit integer
|
||||
%d or %i - 64-bit integer
|
||||
|
||||
%u - 64 bit unsigned integer
|
||||
|
||||
|
@ -202,7 +201,7 @@ static LONGHELP_BODY: &'static str = "
|
|||
|
||||
%o - 64 bit unsigned integer printed in octal (base 8)
|
||||
|
||||
FLOATING POINT SUBSTITUTIONS
|
||||
FLOATING POINT SUBSTITUTIONS
|
||||
|
||||
All floating point fields have a 'max decimal places / max significant digits' parameter
|
||||
%.10f means a decimal floating point with 7 decimal places past 0
|
||||
|
@ -212,7 +211,7 @@ static LONGHELP_BODY: &'static str = "
|
|||
Like with GNU coreutils, the value after the decimal point is these outputs is parsed as a double first before being rendered to text. For both implementations do not expect meaningful precision past the 18th decimal place. When using a number of decimal places that is 18 or higher, you can expect variation in output between GNU coreutils printf and this printf at the 18th decimal place of +/- 1
|
||||
|
||||
%f - floating point value presented in decimal, truncated and displayed to 6 decimal places by default.
|
||||
There is not past-double behavior parity with Coreutils printf, values are not estimated or adjusted beyond input values.
|
||||
There is not past-double behavior parity with Coreutils printf, values are not estimated or adjusted beyond input values.
|
||||
|
||||
%e or %E - floating point value presented in scientific notation
|
||||
7 significant digits by default
|
||||
|
@ -225,9 +224,9 @@ static LONGHELP_BODY: &'static str = "
|
|||
Sci Note has 6 significant digits by default
|
||||
Trailing zeroes are removed
|
||||
Instead of being truncated, digit after last is rounded
|
||||
|
||||
Like other behavior in this utility, the design choices of floating point
|
||||
behavior in this utility is selected to reproduce in exact
|
||||
|
||||
Like other behavior in this utility, the design choices of floating point
|
||||
behavior in this utility is selected to reproduce in exact
|
||||
the behavior of GNU coreutils' printf from an inputs and outputs standpoint.
|
||||
|
||||
USING PARAMETERS
|
||||
|
@ -239,8 +238,8 @@ static LONGHELP_BODY: &'static str = "
|
|||
leading spaces
|
||||
The 2nd parameter is proceeded by a dot.
|
||||
You do not have to use parameters
|
||||
|
||||
SPECIAL FORMS OF INPUT
|
||||
|
||||
SPECIAL FORMS OF INPUT
|
||||
For numeric input, the following additional forms of input are accepted besides decimal:
|
||||
|
||||
Octal (only with integer): if the argument begins with a 0 the proceeding characters
|
||||
|
@ -255,13 +254,13 @@ static LONGHELP_BODY: &'static str = "
|
|||
of the next character will be interpreted as an 8-bit unsigned integer. If there are
|
||||
additional bytes, they will throw an error (unless the environment variable POSIXLY_CORRECt is set)
|
||||
|
||||
WRITTEN BY :
|
||||
WRITTEN BY :
|
||||
Nathan E. Ross, et al. for the uutils project
|
||||
|
||||
MORE INFO :
|
||||
MORE INFO :
|
||||
https://github.com/uutils/coreutils
|
||||
|
||||
COPYRIGHT :
|
||||
COPYRIGHT :
|
||||
Copyright 2015 uutils project.
|
||||
Licensed under the MIT License, please see LICENSE file for details
|
||||
|
||||
|
@ -279,7 +278,7 @@ pub fn uumain(args: Vec<String>) -> i32 {
|
|||
if formatstr == "--help" {
|
||||
print!("{} {}", LONGHELP_LEAD, LONGHELP_BODY);
|
||||
} else if formatstr == "--version" {
|
||||
println!("{} {}", NAME, VERSION);
|
||||
println!("{} {}", NAME, VERSION);
|
||||
} else {
|
||||
let printf_args = &args[2..];
|
||||
memo::Memo::run_all(formatstr, printf_args);
|
||||
|
|
|
@ -8,12 +8,12 @@ name = "uu_ptx"
|
|||
path = "ptx.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "0.2"
|
||||
libc = "0.2"
|
||||
aho-corasick = "0.6"
|
||||
memchr = "1.0"
|
||||
regex-syntax = "0.4"
|
||||
regex = "0.2"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
aho-corasick = "0.6.3"
|
||||
memchr = "1.0.1"
|
||||
regex-syntax = "0.4.1"
|
||||
regex = "0.2.2"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_pwd"
|
|||
path = "pwd.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_readlink"
|
|||
path = "readlink.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_realpath"
|
|||
path = "realpath.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_relpath"
|
|||
path = "relpath.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,9 @@ name = "uu_rm"
|
|||
path = "rm.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
walkdir = "1.0.7"
|
||||
remove_dir_all = "0.2"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
243
src/rm/rm.rs
243
src/rm/rm.rs
|
@ -10,6 +10,8 @@
|
|||
*/
|
||||
|
||||
extern crate getopts;
|
||||
extern crate remove_dir_all;
|
||||
extern crate walkdir;
|
||||
|
||||
#[macro_use]
|
||||
extern crate uucore;
|
||||
|
@ -18,7 +20,9 @@ use std::collections::VecDeque;
|
|||
use std::fs;
|
||||
use std::io::{stdin, stderr, BufRead, Write};
|
||||
use std::ops::BitOr;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::path::Path;
|
||||
use remove_dir_all::remove_dir_all;
|
||||
use walkdir::{DirEntry, WalkDir};
|
||||
|
||||
#[derive(Eq, PartialEq, Clone, Copy)]
|
||||
enum InteractiveMode {
|
||||
|
@ -27,6 +31,17 @@ enum InteractiveMode {
|
|||
InteractiveAlways
|
||||
}
|
||||
|
||||
struct Options {
|
||||
force: bool,
|
||||
interactive: InteractiveMode,
|
||||
#[allow(dead_code)]
|
||||
one_fs: bool,
|
||||
preserve_root: bool,
|
||||
recursive: bool,
|
||||
dir: bool,
|
||||
verbose: bool
|
||||
}
|
||||
|
||||
static NAME: &'static str = "rm";
|
||||
static VERSION: &'static str = env!("CARGO_PKG_VERSION");
|
||||
|
||||
|
@ -77,32 +92,36 @@ pub fn uumain(args: Vec<String>) -> i32 {
|
|||
show_error!("for help, try '{0} --help'", NAME);
|
||||
return 1;
|
||||
} else {
|
||||
let force = matches.opt_present("force");
|
||||
let interactive =
|
||||
if matches.opt_present("i") {
|
||||
InteractiveMode::InteractiveAlways
|
||||
} else if matches.opt_present("I") {
|
||||
InteractiveMode::InteractiveOnce
|
||||
} else if matches.opt_present("interactive") {
|
||||
match &matches.opt_str("interactive").unwrap()[..] {
|
||||
"none" => InteractiveMode::InteractiveNone,
|
||||
"once" => InteractiveMode::InteractiveOnce,
|
||||
"always" => InteractiveMode::InteractiveAlways,
|
||||
val => {
|
||||
crash!(1, "Invalid argument to interactive ({})", val)
|
||||
let options = Options {
|
||||
force: matches.opt_present("force"),
|
||||
interactive: {
|
||||
if matches.opt_present("i") {
|
||||
InteractiveMode::InteractiveAlways
|
||||
} else if matches.opt_present("I") {
|
||||
InteractiveMode::InteractiveOnce
|
||||
} else if matches.opt_present("interactive") {
|
||||
match &matches.opt_str("interactive").unwrap()[..] {
|
||||
"none" => InteractiveMode::InteractiveNone,
|
||||
"once" => InteractiveMode::InteractiveOnce,
|
||||
"always" => InteractiveMode::InteractiveAlways,
|
||||
val => {
|
||||
crash!(1, "Invalid argument to interactive ({})", val)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
InteractiveMode::InteractiveNone
|
||||
}
|
||||
} else {
|
||||
InteractiveMode::InteractiveNone
|
||||
};
|
||||
let one_fs = matches.opt_present("one-file-system");
|
||||
let preserve_root = !matches.opt_present("no-preserve-root");
|
||||
let recursive = matches.opt_present("recursive");
|
||||
let dir = matches.opt_present("dir");
|
||||
let verbose = matches.opt_present("verbose");
|
||||
if interactive == InteractiveMode::InteractiveOnce && (recursive || matches.free.len() > 3) {
|
||||
},
|
||||
one_fs: matches.opt_present("one-file-system"),
|
||||
preserve_root: !matches.opt_present("no-preserve-root"),
|
||||
recursive: matches.opt_present("recursive"),
|
||||
dir: matches.opt_present("dir"),
|
||||
verbose: matches.opt_present("verbose")
|
||||
};
|
||||
if options.interactive == InteractiveMode::InteractiveOnce
|
||||
&& (options.recursive || matches.free.len() > 3) {
|
||||
let msg =
|
||||
if recursive {
|
||||
if options.recursive {
|
||||
"Remove all arguments recursively? "
|
||||
} else {
|
||||
"Remove all arguments? "
|
||||
|
@ -112,7 +131,7 @@ pub fn uumain(args: Vec<String>) -> i32 {
|
|||
}
|
||||
}
|
||||
|
||||
if remove(matches.free, force, interactive, one_fs, preserve_root, recursive, dir, verbose) {
|
||||
if remove(matches.free, options) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -120,118 +139,100 @@ pub fn uumain(args: Vec<String>) -> i32 {
|
|||
0
|
||||
}
|
||||
|
||||
// TODO: implement one-file-system
|
||||
#[allow(unused_variables)]
|
||||
fn remove(files: Vec<String>, force: bool, interactive: InteractiveMode, one_fs: bool, preserve_root: bool, recursive: bool, dir: bool, verbose: bool) -> bool {
|
||||
// TODO: implement one-file-system (this may get partially implemented in walkdir)
|
||||
fn remove(files: Vec<String>, options: Options) -> bool {
|
||||
let mut had_err = false;
|
||||
|
||||
for filename in &files {
|
||||
let filename = &filename[..];
|
||||
let file = Path::new(filename);
|
||||
match file.symlink_metadata() {
|
||||
Ok(metadata) => if metadata.is_dir() {
|
||||
if recursive && (filename != "/" || !preserve_root) {
|
||||
if interactive != InteractiveMode::InteractiveAlways {
|
||||
if let Err(e) = fs::remove_dir_all(file) {
|
||||
had_err = true;
|
||||
show_error!("could not remove '{}': {}", filename, e);
|
||||
};
|
||||
} else {
|
||||
let mut dirs: VecDeque<PathBuf> = VecDeque::new();
|
||||
let mut files: Vec<PathBuf> = Vec::new();
|
||||
let mut rmdirstack: Vec<PathBuf> = Vec::new();
|
||||
dirs.push_back(file.to_path_buf());
|
||||
|
||||
while !dirs.is_empty() {
|
||||
let dir = dirs.pop_front().unwrap();
|
||||
if !prompt(&(format!("rm: descend into directory '{}'? ", dir.display()))[..]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// iterate over items in this directory, adding to either file or
|
||||
// directory queue
|
||||
match fs::read_dir(dir.as_path()) {
|
||||
Ok(rdir) => {
|
||||
for ent in rdir {
|
||||
match ent {
|
||||
Ok(ref f) => match f.file_type() {
|
||||
Ok(t) => {
|
||||
if t.is_dir() {
|
||||
dirs.push_back(f.path());
|
||||
} else {
|
||||
files.push(f.path());
|
||||
}
|
||||
},
|
||||
Err(e) => {
|
||||
had_err = true;
|
||||
show_error!("reading '{}': {}", f.path().display(), e);
|
||||
},
|
||||
},
|
||||
Err(ref e) => {
|
||||
had_err = true;
|
||||
show_error!("recursing into '{}': {}", filename, e);
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
Err(e) => {
|
||||
had_err = true;
|
||||
show_error!("could not recurse into '{}': {}", dir.display(), e);
|
||||
continue;
|
||||
},
|
||||
};
|
||||
|
||||
for f in &files {
|
||||
had_err = remove_file(f.as_path(), interactive, verbose).bitor(had_err);
|
||||
}
|
||||
|
||||
files.clear();
|
||||
rmdirstack.push(dir);
|
||||
}
|
||||
|
||||
for d in rmdirstack.iter().rev() {
|
||||
had_err = remove_dir(d.as_path(), interactive, verbose).bitor(had_err);
|
||||
}
|
||||
}
|
||||
} else if dir && (filename != "/" || !preserve_root) {
|
||||
had_err = remove_dir(&file, interactive, verbose).bitor(had_err);
|
||||
had_err = match file.symlink_metadata() {
|
||||
Ok(metadata) => {
|
||||
if metadata.is_dir() {
|
||||
handle_dir(file, &options)
|
||||
} else {
|
||||
if recursive {
|
||||
show_error!("could not remove directory '{}'", filename);
|
||||
had_err = true;
|
||||
} else {
|
||||
show_error!("could not remove directory '{}' (did you mean to pass '-r'?)", filename);
|
||||
had_err = true;
|
||||
}
|
||||
remove_file(file, &options)
|
||||
}
|
||||
} else {
|
||||
had_err = remove_file(&file, interactive, verbose).bitor(had_err);
|
||||
},
|
||||
Err(e) => {
|
||||
}
|
||||
Err(_e) => {
|
||||
// TODO: actually print out the specific error
|
||||
// TODO: When the error is not about missing files
|
||||
// (e.g., permission), even rm -f should fail with
|
||||
// outputting the error, but there's no easy eay.
|
||||
if !force {
|
||||
had_err = true;
|
||||
if !options.force {
|
||||
show_error!("no such file or directory '{}'", filename);
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
}.bitor(had_err);
|
||||
}
|
||||
|
||||
had_err
|
||||
}
|
||||
|
||||
fn handle_dir(path: &Path, options: &Options) -> bool {
|
||||
let mut had_err = false;
|
||||
|
||||
let is_root = path.has_root() && path.parent().is_none();
|
||||
if options.recursive && (!is_root || !options.preserve_root) {
|
||||
if options.interactive != InteractiveMode::InteractiveAlways {
|
||||
// we need the extra crate because apparently fs::remove_dir_all() does not function
|
||||
// correctly on Windows
|
||||
if let Err(e) = remove_dir_all(path) {
|
||||
had_err = true;
|
||||
show_error!("could not remove '{}': {}", path.display(), e);
|
||||
}
|
||||
} else {
|
||||
let mut dirs: VecDeque<DirEntry> = VecDeque::new();
|
||||
|
||||
for entry in WalkDir::new(path) {
|
||||
match entry {
|
||||
Ok(entry) => {
|
||||
let file_type = entry.file_type();
|
||||
if file_type.is_dir() {
|
||||
dirs.push_back(entry);
|
||||
} else {
|
||||
had_err = remove_file(entry.path(), options).bitor(had_err);
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
had_err = true;
|
||||
show_error!("recursing in '{}': {}", path.display(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for dir in dirs.iter().rev() {
|
||||
had_err = remove_dir(dir.path(), options).bitor(had_err);
|
||||
}
|
||||
}
|
||||
} else if options.dir && (!is_root || !options.preserve_root) {
|
||||
had_err = remove_dir(path, options).bitor(had_err);
|
||||
} else {
|
||||
if options.recursive {
|
||||
show_error!("could not remove directory '{}'", path.display());
|
||||
had_err = true;
|
||||
} else {
|
||||
show_error!("could not remove directory '{}' (did you mean to pass '-r'?)",
|
||||
path.display());
|
||||
had_err = true;
|
||||
}
|
||||
}
|
||||
|
||||
had_err
|
||||
}
|
||||
|
||||
fn remove_dir(path: &Path, interactive: InteractiveMode, verbose: bool) -> bool {
|
||||
fn remove_dir(path: &Path, options: &Options) -> bool {
|
||||
let response =
|
||||
if interactive == InteractiveMode::InteractiveAlways {
|
||||
if options.interactive == InteractiveMode::InteractiveAlways {
|
||||
prompt_file(path, true)
|
||||
} else {
|
||||
true
|
||||
};
|
||||
if response {
|
||||
match fs::remove_dir(path) {
|
||||
Ok(_) => if verbose { println!("removed '{}'", path.display()); },
|
||||
Ok(_) => if options.verbose { println!("removed '{}'", path.display()); },
|
||||
Err(e) => {
|
||||
show_error!("removing '{}': {}", path.display(), e);
|
||||
return true;
|
||||
|
@ -242,16 +243,16 @@ fn remove_dir(path: &Path, interactive: InteractiveMode, verbose: bool) -> bool
|
|||
false
|
||||
}
|
||||
|
||||
fn remove_file(path: &Path, interactive: InteractiveMode, verbose: bool) -> bool {
|
||||
fn remove_file(path: &Path, options: &Options) -> bool {
|
||||
let response =
|
||||
if interactive == InteractiveMode::InteractiveAlways {
|
||||
if options.interactive == InteractiveMode::InteractiveAlways {
|
||||
prompt_file(path, false)
|
||||
} else {
|
||||
true
|
||||
};
|
||||
if response {
|
||||
match fs::remove_file(path) {
|
||||
Ok(_) => if verbose { println!("removed '{}'", path.display()); },
|
||||
Ok(_) => if options.verbose { println!("removed '{}'", path.display()); },
|
||||
Err(e) => {
|
||||
show_error!("removing '{}': {}", path.display(), e);
|
||||
return true;
|
||||
|
@ -264,22 +265,24 @@ fn remove_file(path: &Path, interactive: InteractiveMode, verbose: bool) -> bool
|
|||
|
||||
fn prompt_file(path: &Path, is_dir: bool) -> bool {
|
||||
if is_dir {
|
||||
prompt(&(format!("rm: remove directory '{}'? ", path.display()))[..])
|
||||
prompt(&(format!("rm: remove directory '{}'? ", path.display())))
|
||||
} else {
|
||||
prompt(&(format!("rm: remove file '{}'? ", path.display()))[..])
|
||||
prompt(&(format!("rm: remove file '{}'? ", path.display())))
|
||||
}
|
||||
}
|
||||
|
||||
fn prompt(msg: &str) -> bool {
|
||||
stderr().write_all(msg.as_bytes()).unwrap_or(());
|
||||
stderr().flush().unwrap_or(());
|
||||
let _ = stderr().write_all(msg.as_bytes());
|
||||
let _ = stderr().flush();
|
||||
|
||||
let mut buf = Vec::new();
|
||||
let stdin = stdin();
|
||||
let mut stdin = stdin.lock();
|
||||
|
||||
match stdin.read_until('\n' as u8, &mut buf) {
|
||||
Ok(x) if x > 0 => {
|
||||
match buf[0] {
|
||||
0x59 | 0x79 => true,
|
||||
b'y' | b'Y' => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_rmdir"
|
|||
path = "rmdir.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_seq"
|
|||
path = "seq.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -9,10 +9,10 @@ path = "shred.rs"
|
|||
|
||||
[dependencies]
|
||||
rand = "0.3"
|
||||
filetime = "*"
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
time = "*"
|
||||
filetime = "0.1.10"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
time = "0.1.38"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_shuf"
|
|||
path = "shuf.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
rand = "*"
|
||||
getopts = "0.2.14"
|
||||
rand = "0.3.15"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_sleep"
|
|||
path = "sleep.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,9 +8,9 @@ name = "uu_sort"
|
|||
path = "sort.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
semver = "*"
|
||||
itertools = "*"
|
||||
getopts = "0.2.14"
|
||||
semver = "0.7.0"
|
||||
itertools = "0.6.0"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -16,7 +16,6 @@ extern crate semver;
|
|||
|
||||
#[macro_use]
|
||||
extern crate uucore;
|
||||
#[macro_use]
|
||||
extern crate itertools;
|
||||
|
||||
use std::cmp::Ordering;
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_split"
|
|||
path = "split.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_stat"
|
|||
path = "stat.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
time = "*"
|
||||
getopts = "0.2.14"
|
||||
time = "0.1.38"
|
||||
|
||||
[dependencies.uucore]
|
||||
path = "../uucore"
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_stdbuf"
|
|||
path = "stdbuf.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_sum"
|
|||
path = "sum.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,10 +8,10 @@ name = "uu_sync"
|
|||
path = "sync.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
winapi = "*"
|
||||
kernel32-sys = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
winapi = "0.2.8"
|
||||
kernel32-sys = "0.2.2"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -14,9 +14,13 @@
|
|||
extern crate getopts;
|
||||
extern crate libc;
|
||||
|
||||
#[cfg(windows)]
|
||||
#[macro_use]
|
||||
extern crate uucore;
|
||||
|
||||
#[cfg(not(windows))]
|
||||
extern crate uucore;
|
||||
|
||||
static NAME: &'static str = "sync";
|
||||
static VERSION: &'static str = env!("CARGO_PKG_VERSION");
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_tac"
|
|||
path = "tac.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,10 +8,10 @@ name = "uu_tail"
|
|||
path = "tail.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
kernel32-sys = "*"
|
||||
libc = "*"
|
||||
winapi = "*"
|
||||
getopts = "0.2.14"
|
||||
kernel32-sys = "0.2.2"
|
||||
libc = "0.2.26"
|
||||
winapi = "0.2.8"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_tee"
|
|||
path = "tee.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_test"
|
|||
path = "test.rs"
|
||||
|
||||
[dependencies]
|
||||
libc = "*"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,9 +8,9 @@ name = "uu_timeout"
|
|||
path = "timeout.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
time = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
time = "0.1.38"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,9 +8,9 @@ name = "uu_touch"
|
|||
path = "touch.rs"
|
||||
|
||||
[dependencies]
|
||||
filetime = "*"
|
||||
getopts = "*"
|
||||
time = "*"
|
||||
filetime = "0.1.10"
|
||||
getopts = "0.2.14"
|
||||
time = "0.1.38"
|
||||
|
||||
[dependencies.uucore]
|
||||
path = "../uucore"
|
||||
|
|
|
@ -8,9 +8,9 @@ name = "uu_tr"
|
|||
path = "tr.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
bit-set = "*"
|
||||
fnv = "*"
|
||||
getopts = "0.2.14"
|
||||
bit-set = "0.4.0"
|
||||
fnv = "1.0.5"
|
||||
|
||||
[dependencies.uucore]
|
||||
path = "../uucore"
|
||||
|
|
199
src/tr/tr.rs
199
src/tr/tr.rs
|
@ -32,66 +32,131 @@ static NAME: &'static str = "tr";
|
|||
static VERSION: &'static str = env!("CARGO_PKG_VERSION");
|
||||
const BUFFER_LEN: usize = 1024;
|
||||
|
||||
fn delete(set: ExpandSet, complement: bool) {
|
||||
let mut bset = BitSet::new();
|
||||
let stdin = stdin();
|
||||
let mut locked_stdin = stdin.lock();
|
||||
let mut buffered_stdout = BufWriter::new(stdout());
|
||||
let mut buf = String::with_capacity(BUFFER_LEN + 4);
|
||||
let mut char_output_buffer: [u8; 4] = [0;4];
|
||||
trait SymbolTranslator {
|
||||
fn translate(&self, c: &char, prev_c: &char) -> Option<char>;
|
||||
}
|
||||
|
||||
for c in set {
|
||||
bset.insert(c as usize);
|
||||
}
|
||||
struct DeleteOperation {
|
||||
bset: BitSet,
|
||||
complement: bool,
|
||||
}
|
||||
|
||||
let is_allowed = |c : char| {
|
||||
if complement {
|
||||
bset.contains(c as usize)
|
||||
} else {
|
||||
!bset.contains(c as usize)
|
||||
impl DeleteOperation {
|
||||
fn new(set: ExpandSet, complement: bool) -> DeleteOperation {
|
||||
DeleteOperation {
|
||||
bset: set.map(|c| c as usize).collect(),
|
||||
complement: complement
|
||||
}
|
||||
};
|
||||
|
||||
while let Ok(length) = locked_stdin.read_line(&mut buf) {
|
||||
if length == 0 { break }
|
||||
{ // isolation to make borrow checker happy
|
||||
let filtered = buf.chars().filter(|c| is_allowed(*c));
|
||||
for c in filtered {
|
||||
let char_as_bytes = c.encode_utf8(&mut char_output_buffer);
|
||||
buffered_stdout.write_all(char_as_bytes.as_bytes()).unwrap();
|
||||
}
|
||||
}
|
||||
buf.clear();
|
||||
}
|
||||
}
|
||||
|
||||
fn tr<'a>(set1: ExpandSet<'a>, mut set2: ExpandSet<'a>) {
|
||||
let mut map = FnvHashMap::default();
|
||||
let stdin = stdin();
|
||||
let mut locked_stdin = stdin.lock();
|
||||
let mut buffered_stdout = BufWriter::new(stdout());
|
||||
let mut buf = String::with_capacity(BUFFER_LEN + 4);
|
||||
let mut char_output_buffer: [u8; 4] = [0;4];
|
||||
|
||||
let mut s2_prev = '_';
|
||||
for i in set1 {
|
||||
s2_prev = set2.next().unwrap_or(s2_prev);
|
||||
|
||||
map.insert(i as usize, s2_prev);
|
||||
}
|
||||
|
||||
while let Ok(length) = locked_stdin.read_line(&mut buf) {
|
||||
if length == 0 { break }
|
||||
|
||||
{ // isolation to make borrow checker happy
|
||||
let output_stream = buf.chars().map(|c| *map.get(&(c as usize)).unwrap_or(&c));
|
||||
for c in output_stream {
|
||||
let char_as_bytes = c.encode_utf8(&mut char_output_buffer);
|
||||
buffered_stdout.write_all(char_as_bytes.as_bytes()).unwrap();
|
||||
}
|
||||
impl SymbolTranslator for DeleteOperation {
|
||||
fn translate(&self, c: &char, _prev_c: &char) -> Option<char> {
|
||||
let uc = *c as usize;
|
||||
if self.complement == self.bset.contains(uc) {
|
||||
Some(*c)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct SqueezeOperation {
|
||||
squeeze_set: BitSet,
|
||||
complement: bool,
|
||||
}
|
||||
|
||||
impl SqueezeOperation {
|
||||
fn new(squeeze_set: ExpandSet, complement: bool) -> SqueezeOperation {
|
||||
SqueezeOperation {
|
||||
squeeze_set: squeeze_set.map(|c| c as usize).collect(),
|
||||
complement: complement
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl SymbolTranslator for SqueezeOperation {
|
||||
fn translate(&self, c: &char, prev_c: &char) -> Option<char> {
|
||||
if *prev_c == *c && self.complement != self.squeeze_set.contains(*c as usize) {
|
||||
None
|
||||
} else {
|
||||
Some(*c)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct DeleteAndSqueezeOperation {
|
||||
delete_set: BitSet,
|
||||
squeeze_set: BitSet,
|
||||
complement: bool,
|
||||
}
|
||||
|
||||
impl DeleteAndSqueezeOperation {
|
||||
fn new(delete_set: ExpandSet, squeeze_set: ExpandSet, complement: bool) -> DeleteAndSqueezeOperation {
|
||||
DeleteAndSqueezeOperation {
|
||||
delete_set: delete_set.map(|c| c as usize).collect(),
|
||||
squeeze_set: squeeze_set.map(|c| c as usize).collect(),
|
||||
complement: complement
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl SymbolTranslator for DeleteAndSqueezeOperation {
|
||||
fn translate(&self, c: &char, prev_c: &char) -> Option<char> {
|
||||
if self.complement != self.delete_set.contains(*c as usize) || *prev_c == *c && self.squeeze_set.contains(*c as usize) {
|
||||
None
|
||||
} else {
|
||||
Some(*c)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct TranslateOperation {
|
||||
translate_map: FnvHashMap<usize, char>,
|
||||
}
|
||||
|
||||
impl TranslateOperation {
|
||||
fn new(set1: ExpandSet, set2: &mut ExpandSet) -> TranslateOperation {
|
||||
let mut map = FnvHashMap::default();
|
||||
let mut s2_prev = '_';
|
||||
for i in set1 {
|
||||
s2_prev = set2.next().unwrap_or(s2_prev);
|
||||
|
||||
map.insert(i as usize, s2_prev);
|
||||
}
|
||||
TranslateOperation {
|
||||
translate_map: map,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl SymbolTranslator for TranslateOperation {
|
||||
fn translate(&self, c: &char, _prev_c: &char) -> Option<char> {
|
||||
Some(*self.translate_map.get(&(*c as usize)).unwrap_or(c))
|
||||
}
|
||||
}
|
||||
|
||||
fn translate_input<T: SymbolTranslator>(input: &mut BufRead, output: &mut Write, translator: T) {
|
||||
let mut buf = String::with_capacity(BUFFER_LEN + 4);
|
||||
let mut output_buf = String::with_capacity(BUFFER_LEN + 4);
|
||||
|
||||
while let Ok(length) = input.read_line(&mut buf) {
|
||||
let mut prev_c = 0 as char;
|
||||
if length == 0 { break }
|
||||
{ // isolation to make borrow checker happy
|
||||
let filtered = buf.chars().filter_map(|c| {
|
||||
let res = translator.translate(&c, &prev_c);
|
||||
if res.is_some() {
|
||||
prev_c = c;
|
||||
}
|
||||
res
|
||||
});
|
||||
|
||||
output_buf.extend(filtered);
|
||||
output.write_all(output_buf.as_bytes()).unwrap();
|
||||
}
|
||||
buf.clear();
|
||||
output_buf.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,6 +176,7 @@ pub fn uumain(args: Vec<String>) -> i32 {
|
|||
opts.optflag("C", "", "same as -c");
|
||||
opts.optflag("d", "delete", "delete characters in SET1");
|
||||
opts.optflag("h", "help", "display this help and exit");
|
||||
opts.optflag("s", "squeeze", "replace each sequence of a repeated character that is listed in the last specified SET, with a single occurrence of that character");
|
||||
opts.optflag("V", "version", "output version information and exit");
|
||||
|
||||
let matches = match opts.parse(&args[1..]) {
|
||||
|
@ -138,20 +204,37 @@ pub fn uumain(args: Vec<String>) -> i32 {
|
|||
|
||||
let dflag = matches.opt_present("d");
|
||||
let cflag = matches.opts_present(&["c".to_owned(), "C".to_owned()]);
|
||||
let sflag = matches.opt_present("s");
|
||||
let sets = matches.free;
|
||||
|
||||
if cflag && !dflag {
|
||||
show_error!("-c is only supported with -d");
|
||||
if cflag && !dflag && !sflag {
|
||||
show_error!("-c is only supported with -d or -s");
|
||||
return 1;
|
||||
}
|
||||
|
||||
let stdin = stdin();
|
||||
let mut locked_stdin = stdin.lock();
|
||||
let stdout = stdout();
|
||||
let locked_stdout = stdout.lock();
|
||||
let mut buffered_stdout = BufWriter::new(locked_stdout);
|
||||
|
||||
let set1 = ExpandSet::new(sets[0].as_ref());
|
||||
if dflag {
|
||||
let set1 = ExpandSet::new(sets[0].as_ref());
|
||||
delete(set1, cflag);
|
||||
if sflag {
|
||||
let set2 = ExpandSet::new(sets[1].as_ref());
|
||||
let op = DeleteAndSqueezeOperation::new(set1, set2, cflag);
|
||||
translate_input(&mut locked_stdin, &mut buffered_stdout, op);
|
||||
} else {
|
||||
let op = DeleteOperation::new(set1, cflag);
|
||||
translate_input(&mut locked_stdin, &mut buffered_stdout, op);
|
||||
}
|
||||
} else if sflag {
|
||||
let op = SqueezeOperation::new(set1, cflag);
|
||||
translate_input(&mut locked_stdin, &mut buffered_stdout, op);
|
||||
} else {
|
||||
let set1 = ExpandSet::new(sets[0].as_ref());
|
||||
let set2 = ExpandSet::new(sets[1].as_ref());
|
||||
tr(set1, set2);
|
||||
let mut set2 = ExpandSet::new(sets[1].as_ref());
|
||||
let op = TranslateOperation::new(set1, &mut set2);
|
||||
translate_input(&mut locked_stdin, &mut buffered_stdout, op)
|
||||
}
|
||||
|
||||
0
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_truncate"
|
|||
path = "truncate.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_tsort"
|
|||
path = "tsort.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_tty"
|
|||
path = "tty.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_unexpand"
|
|||
path = "unexpand.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
unicode-width = "*"
|
||||
getopts = "0.2.14"
|
||||
unicode-width = "0.1.4"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_uniq"
|
|||
path = "uniq.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
|
||||
[dependencies.uucore]
|
||||
path="../uucore"
|
||||
|
|
|
@ -8,8 +8,8 @@ name = "uu_unlink"
|
|||
path = "unlink.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
libc = "*"
|
||||
getopts = "0.2.14"
|
||||
libc = "0.2.26"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_uptime"
|
|||
path = "uptime.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
|
||||
[dependencies.uucore]
|
||||
path = "../uucore"
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_users"
|
|||
path = "users.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
|
||||
[dependencies.uucore]
|
||||
default-features = false
|
||||
|
|
|
@ -16,9 +16,8 @@
|
|||
#![allow(dead_code)]
|
||||
|
||||
extern crate getopts;
|
||||
|
||||
#[macro_use]
|
||||
extern crate uucore;
|
||||
|
||||
use uucore::utmpx::*;
|
||||
|
||||
use getopts::Options;
|
||||
|
|
|
@ -4,8 +4,8 @@ version = "0.0.1"
|
|||
authors = []
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
time = { version = "*", optional = true }
|
||||
getopts = "0.2.14"
|
||||
time = { version = "0.1.38", optional = true }
|
||||
data-encoding = { version = "^1.1", optional = true }
|
||||
|
||||
[dependencies.libc]
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_wc"
|
|||
path = "wc.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -13,7 +13,7 @@ default-features = false
|
|||
features = ["utmpx"]
|
||||
|
||||
[dependencies.clippy]
|
||||
version = "*"
|
||||
version = "0.0.143"
|
||||
optional = true
|
||||
|
||||
[[bin]]
|
||||
|
|
|
@ -8,9 +8,9 @@ name = "uu_whoami"
|
|||
path = "whoami.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
winapi = "*"
|
||||
advapi32-sys = "*"
|
||||
getopts = "0.2.14"
|
||||
winapi = "0.2.8"
|
||||
advapi32-sys = "0.2.0"
|
||||
|
||||
[dependencies.uucore]
|
||||
path = "../uucore"
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "uu_yes"
|
|||
path = "yes.rs"
|
||||
|
||||
[dependencies]
|
||||
getopts = "*"
|
||||
getopts = "0.2.14"
|
||||
uucore = { path="../uucore" }
|
||||
|
||||
[[bin]]
|
||||
|
|
1
tests/fixtures/cp/existing_file.txt
vendored
Normal file
1
tests/fixtures/cp/existing_file.txt
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
Cogito ergo sum.
|
1
tests/fixtures/cp/how_are_you.txt
vendored
Normal file
1
tests/fixtures/cp/how_are_you.txt
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
How are you?
|
237
tests/test_cp.rs
237
tests/test_cp.rs
|
@ -1,10 +1,17 @@
|
|||
use common::util::*;
|
||||
use std::fs::set_permissions;
|
||||
|
||||
static TEST_HELLO_WORLD_SOURCE: &'static str = "hello_world.txt";
|
||||
static TEST_HELLO_WORLD_DEST: &'static str = "copy_of_hello_world.txt";
|
||||
static TEST_COPY_TO_FOLDER: &'static str = "hello_dir/";
|
||||
static TEST_COPY_TO_FOLDER_FILE: &'static str = "hello_dir/hello_world.txt";
|
||||
static TEST_COPY_FROM_FOLDER_FILE: &'static str = "hello_dir_with_file/hello_world.txt";
|
||||
static TEST_EXISTING_FILE: &str = "existing_file.txt";
|
||||
static TEST_HELLO_WORLD_SOURCE: &str = "hello_world.txt";
|
||||
static TEST_HELLO_WORLD_DEST: &str = "copy_of_hello_world.txt";
|
||||
static TEST_HOW_ARE_YOU_SOURCE: &str = "how_are_you.txt";
|
||||
static TEST_HOW_ARE_YOU_DEST: &str = "hello_dir/how_are_you.txt";
|
||||
static TEST_COPY_TO_FOLDER: &str = "hello_dir/";
|
||||
static TEST_COPY_TO_FOLDER_FILE: &str = "hello_dir/hello_world.txt";
|
||||
static TEST_COPY_FROM_FOLDER: &str = "hello_dir_with_file/";
|
||||
static TEST_COPY_FROM_FOLDER_FILE: &str = "hello_dir_with_file/hello_world.txt";
|
||||
static TEST_COPY_TO_FOLDER_NEW: &str = "hello_dir_new/";
|
||||
static TEST_COPY_TO_FOLDER_NEW_FILE: &str = "hello_dir_new/hello_world.txt";
|
||||
|
||||
#[test]
|
||||
fn test_cp_cp() {
|
||||
|
@ -22,6 +29,73 @@ fn test_cp_cp() {
|
|||
assert_eq!(at.read(TEST_HELLO_WORLD_DEST), "Hello, World!\n");
|
||||
}
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_cp_duplicate_files() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg(TEST_COPY_TO_FOLDER)
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
assert!(result.stderr.contains("specified more than once"));
|
||||
assert_eq!(at.read(TEST_COPY_TO_FOLDER_FILE), "Hello, World!\n");
|
||||
}
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_cp_multiple_files_target_is_file() {
|
||||
let (_, mut ucmd) = at_and_ucmd!();
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg(TEST_EXISTING_FILE)
|
||||
.run();
|
||||
|
||||
assert!(!result.success);
|
||||
assert!(result.stderr.contains("not a directory"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cp_directory_not_recursive() {
|
||||
let (_, mut ucmd) = at_and_ucmd!();
|
||||
let result = ucmd.arg(TEST_COPY_TO_FOLDER)
|
||||
.arg(TEST_HELLO_WORLD_DEST)
|
||||
.run();
|
||||
|
||||
assert!(!result.success);
|
||||
assert!(result.stderr.contains("omitting directory"));
|
||||
}
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_cp_multiple_files() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg(TEST_HOW_ARE_YOU_SOURCE)
|
||||
.arg(TEST_COPY_TO_FOLDER)
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
assert_eq!(at.read(TEST_COPY_TO_FOLDER_FILE), "Hello, World!\n");
|
||||
assert_eq!(at.read(TEST_HOW_ARE_YOU_DEST), "How are you?\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cp_recurse() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
|
||||
let result = ucmd
|
||||
.arg("-r")
|
||||
.arg(TEST_COPY_FROM_FOLDER)
|
||||
.arg(TEST_COPY_TO_FOLDER_NEW)
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
// Check the content of the destination file that was copied.
|
||||
assert_eq!(at.read(TEST_COPY_TO_FOLDER_NEW_FILE), "Hello, World!\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cp_with_dirs_t() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
|
@ -56,3 +130,156 @@ fn test_cp_with_dirs() {
|
|||
assert!(result_from_dir.success);
|
||||
assert_eq!(at.read(TEST_HELLO_WORLD_DEST), "Hello, World!\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cp_arg_target_directory() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg("-t")
|
||||
.arg(TEST_COPY_TO_FOLDER)
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
assert_eq!(at.read(TEST_COPY_TO_FOLDER_FILE), "Hello, World!\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cp_arg_no_target_directory() {
|
||||
let (_, mut ucmd) = at_and_ucmd!();
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg("-v")
|
||||
.arg("-T")
|
||||
.arg(TEST_COPY_TO_FOLDER)
|
||||
.run();
|
||||
|
||||
assert!(!result.success);
|
||||
assert!(result.stderr.contains("cannot overwrite directory"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cp_arg_interactive() {
|
||||
let (_, mut ucmd) = at_and_ucmd!();
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg(TEST_HOW_ARE_YOU_SOURCE)
|
||||
.arg("-i")
|
||||
.pipe_in("N\n")
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
assert!(result.stderr.contains("Not overwriting"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(target_os="unix")]
|
||||
fn test_cp_arg_link() {
|
||||
use std::os::linux::fs::MetadataExt;
|
||||
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg("--link")
|
||||
.arg(TEST_HELLO_WORLD_DEST)
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
assert_eq!(at.metadata(TEST_HELLO_WORLD_SOURCE).st_nlink(), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cp_arg_symlink() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg("--symbolic-link")
|
||||
.arg(TEST_HELLO_WORLD_DEST)
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
assert!(at.is_symlink(TEST_HELLO_WORLD_DEST));
|
||||
}
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_cp_arg_no_clobber() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg("--no-clobber")
|
||||
.arg(TEST_HOW_ARE_YOU_SOURCE)
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "How are you?\n");
|
||||
assert!(result.stderr.contains("Not overwriting"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(not(windows))]
|
||||
fn test_cp_arg_force() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
|
||||
// create dest without write permissions
|
||||
let mut permissions = at.make_file(TEST_HELLO_WORLD_DEST).metadata().unwrap().permissions();
|
||||
permissions.set_readonly(true);
|
||||
set_permissions(at.plus(TEST_HELLO_WORLD_DEST), permissions).unwrap();
|
||||
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg("--force")
|
||||
.arg(TEST_HELLO_WORLD_DEST)
|
||||
.run();
|
||||
|
||||
println!("{:?}", result.stderr);
|
||||
println!("{:?}", result.stdout);
|
||||
|
||||
assert!(result.success);
|
||||
assert_eq!(at.read(TEST_HELLO_WORLD_DEST), "Hello, World!\n");
|
||||
}
|
||||
|
||||
/// TODO: write a better test that differentiates --remove-destination
|
||||
/// from --force. Also this test currently doesn't work on
|
||||
/// Windows. This test originally checked file timestamps, which
|
||||
/// proved to be unreliable per target / CI platform
|
||||
#[test]
|
||||
#[cfg(not(windows))]
|
||||
fn test_cp_arg_remove_destination() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
|
||||
// create dest without write permissions
|
||||
let mut permissions = at.make_file(TEST_HELLO_WORLD_DEST).metadata().unwrap().permissions();
|
||||
permissions.set_readonly(true);
|
||||
set_permissions(at.plus(TEST_HELLO_WORLD_DEST), permissions).unwrap();
|
||||
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg("--remove-destination")
|
||||
.arg(TEST_HELLO_WORLD_DEST)
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
assert_eq!(at.read(TEST_HELLO_WORLD_DEST), "Hello, World!\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cp_arg_backup() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg("--backup")
|
||||
.arg(TEST_HOW_ARE_YOU_SOURCE)
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n");
|
||||
assert_eq!(at.read(&*format!("{}~", TEST_HOW_ARE_YOU_SOURCE)), "How are you?\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cp_arg_suffix() {
|
||||
let (at, mut ucmd) = at_and_ucmd!();
|
||||
|
||||
let result = ucmd.arg(TEST_HELLO_WORLD_SOURCE)
|
||||
.arg("--suffix")
|
||||
.arg(".bak")
|
||||
.arg(TEST_HOW_ARE_YOU_SOURCE)
|
||||
.run();
|
||||
|
||||
assert!(result.success);
|
||||
assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n");
|
||||
assert_eq!(at.read(&*format!("{}.bak", TEST_HOW_ARE_YOU_SOURCE)), "How are you?\n");
|
||||
}
|
||||
|
|
|
@ -32,3 +32,28 @@ fn test_delete_complement() {
|
|||
new_ucmd!()
|
||||
.args(&["-d", "-c", "a-z"]).pipe_in("aBcD").run().stdout_is("ac");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_squeeze() {
|
||||
new_ucmd!()
|
||||
.args(&["-s", "a-z"]).pipe_in("aaBBcDcc").run().stdout_is("aBBcDc");
|
||||
}
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_squeeze_complement() {
|
||||
new_ucmd!()
|
||||
.args(&["-sc", "a-z"]).pipe_in("aaBBcDcc").run().stdout_is("aaBcDcc");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_delete_and_squeeze() {
|
||||
new_ucmd!()
|
||||
.args(&["-ds", "a-z", "A-Z"]).pipe_in("abBcB").run().stdout_is("B");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_delete_and_squeeze_complement() {
|
||||
new_ucmd!()
|
||||
.args(&["-dsc", "a-z", "A-Z"]).pipe_in("abBcB").run().stdout_is("abc");
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue