From f25d4e11143fcb481bda09f3b75831fce7aa6c09 Mon Sep 17 00:00:00 2001 From: Alex Lyon Date: Tue, 22 May 2018 09:55:05 -0700 Subject: [PATCH 1/2] uucore: update data_encoding and add wrap_write() --- Cargo.lock | 88 ++++++++++++++++++++++++++++++++++++++++-- src/uucore/Cargo.toml | 6 ++- src/uucore/encoding.rs | 78 ++++++++++++++++++++++++------------- src/uucore/lib.rs | 5 +++ 4 files changed, 146 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2db13b2bf..0527a152d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -41,6 +41,27 @@ dependencies = [ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "backtrace" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace-sys 0.1.16 (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.39 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "backtrace-sys" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "base32" version = "0.0.1" @@ -347,7 +368,7 @@ dependencies = [ [[package]] name = "data-encoding" -version = "1.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -453,6 +474,25 @@ dependencies = [ "uucore 0.0.1", ] +[[package]] +name = "failure" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "failure_derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fake-simd" version = "0.1.2" @@ -1205,6 +1245,11 @@ dependencies = [ "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustc-demangle" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "same-file" version = "0.1.3" @@ -1396,6 +1441,16 @@ dependencies = [ "uucore 0.0.1", ] +[[package]] +name = "syn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "syn" version = "0.12.14" @@ -1417,6 +1472,23 @@ dependencies = [ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "synom" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "synstructure" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tac" version = "0.0.1" @@ -1716,7 +1788,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "uucore" version = "0.0.1" dependencies = [ - "data-encoding 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1943,6 +2017,8 @@ dependencies = [ "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "af80143d6f7608d746df1520709e5d141c96f240b0e62b0aa41bdfb53374d9d4" +"checksum backtrace 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea58cd16fd6c9d120b5bcb01d63883ae4cc7ba2aed35c1841b862a3c7ef6639" +"checksum backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "44585761d6161b0f57afc49482ab6bd067e4edef48c12a152c237eb0203f7661" "checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c" "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" @@ -1966,11 +2042,13 @@ dependencies = [ "checksum cpp_syn 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8cd649bf5b3804d92fe12a60c7698f5a538a6033ed8a668bf5241d4d4f1644e" "checksum cpp_synmap 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "897e4f9cdbe2874edd3ffe53718ee5d8b89e2a970057b2c93d3214104f2e90b6" "checksum cpp_synom 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1fc8da5694233b646150c785118f77835ad0a49680c7f312a10ef30957c67b6d" -"checksum data-encoding 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d867ddbf09de0b73e09ec798972fb7f870495a0893f6f736c1855448c5a56789" +"checksum data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "67df0571a74bf0d97fb8b2ed22abdd9a48475c96bd327db968b7d9cace99655e" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" "checksum duct 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8c553d79f40e74f7f611e49bf3429b6760cff79596b61818291c27cc0b18549d" "checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" +"checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82" +"checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum filetime 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "714653f3e34871534de23771ac7b26e999651a0a228f47beb324dfdf1dd4b10f" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" @@ -2023,6 +2101,7 @@ dependencies = [ "checksum remove_dir_all 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0882bc41b0ba6131c7f0ce97233b62d8099e3f3abc60d4938185d3e35439c0cc" "checksum remove_dir_all 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b5d2f806b0fcdabd98acd380dc8daef485e22bcb7cddc811d1337967f2528cf5" "checksum rust-users 0.6.0 (git+https://github.com/uutils/rust-users)" = "" +"checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649" "checksum same-file 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d931a44fdaa43b8637009e7632a02adc4f2b2e0733c08caa4cf00e8da4a117a7" "checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" "checksum semver 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fdd61b85a0fa777f7fb7c454b9189b2941b110d1385ce84d7f76efdf1606a85" @@ -2036,7 +2115,10 @@ dependencies = [ "checksum sha3 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26405905b6a56a94c60109cfda62610507ac14a65be531f5767dec5c5a8dd6a0" "checksum shared_child 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcd5e483b3475af9bc2a35311c2f3bbf0bd98fde91410ab15a0d4ba3c3127b4e" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" +"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum syn 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)" = "8c5bc2d6ff27891209efa5f63e9de78648d7801f085e4653701a692ce938d6fd" +"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" +"checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" "checksum tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f73eebdb68c14bcb24aef74ea96079830e7fa7b31a6106e42ea7ee887c1e134e" "checksum tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "11ce2fe9db64b842314052e2421ac61a73ce41b898dc8e3750398b219c5fc1e0" "checksum term_grid 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "230d3e804faaed5a39b08319efb797783df2fd9671b39b7596490cb486d702cf" diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 37f16289c..98b8282dd 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -5,8 +5,10 @@ authors = [] [dependencies] getopts = "0.2.14" +failure = { version = "0.1.1", optional = true } +failure_derive = { version = "0.1.1", optional = true } time = { version = "0.1.38", optional = true } -data-encoding = { version = "^1.1", optional = true } +data-encoding = { version = "^2.1", optional = true } libc = { version = "0.2.34", optional = true } [target.'cfg(target_os = "redox")'.dependencies] @@ -15,7 +17,7 @@ termion = "1.5" [features] fs = ["libc"] utf8 = [] -encoding = ["data-encoding"] +encoding = ["data-encoding", "failure", "failure_derive"] parse_time = [] mode = ["libc"] utmpx = ["time", "libc"] diff --git a/src/uucore/encoding.rs b/src/uucore/encoding.rs index f2ff75dd2..0bc8d5be8 100644 --- a/src/uucore/encoding.rs +++ b/src/uucore/encoding.rs @@ -7,10 +7,30 @@ // extern crate data_encoding; -use self::data_encoding::{decode, base32, base64}; -use std::io::Read; +use self::data_encoding::{DecodeError, BASE32, BASE64}; +use std::io::{self, Read, Write}; -pub type DecodeResult = Result, decode::Error>; +#[derive(Fail, Debug)] +pub enum EncodingError { + #[fail(display = "{}", _0)] + Decode(#[cause] DecodeError), + #[fail(display = "{}", _0)] + Io(#[cause] io::Error), +} + +impl From for EncodingError { + fn from(err: io::Error) -> EncodingError { + EncodingError::Io(err) + } +} + +impl From for EncodingError { + fn from(err: DecodeError) -> EncodingError { + EncodingError::Decode(err) + } +} + +pub type DecodeResult = Result, EncodingError>; #[derive(Clone, Copy)] pub enum Format { @@ -21,16 +41,16 @@ use self::Format::*; pub fn encode(f: Format, input: &[u8]) -> String { match f { - Base32 => base32::encode(input), - Base64 => base64::encode(input), + Base32 => BASE32.encode(input), + Base64 => BASE64.encode(input), } } pub fn decode(f: Format, input: &[u8]) -> DecodeResult { - match f { - Base32 => base32::decode(input), - Base64 => base64::decode(input), - } + Ok(match f { + Base32 => BASE32.decode(input)?, + Base64 => BASE64.decode(input)?, + }) } pub struct Data { @@ -38,7 +58,7 @@ pub struct Data { ignore_garbage: bool, input: R, format: Format, - alphabet: &'static str, + alphabet: &'static [u8], } impl Data { @@ -49,8 +69,8 @@ impl Data { input: input, format: format, alphabet: match format { - Base32 => "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", - Base64 => "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789=+/", + Base32 => b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", + Base64 => b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789=+/", }, } } @@ -66,18 +86,14 @@ impl Data { } pub fn decode(&mut self) -> DecodeResult { - let mut buf = String::new(); - self.input.read_to_string(&mut buf).unwrap(); - let clean = if self.ignore_garbage { - buf.chars() - .filter(|&c| self.alphabet.contains(c)) - .collect::() + let mut buf = vec![]; + self.input.read_to_end(&mut buf)?; + if self.ignore_garbage { + buf.retain(|c| self.alphabet.contains(c)); } else { - buf.chars() - .filter(|&c| c != '\r' && c != '\n') - .collect::() + buf.retain(|&c| c != b'\r' && c != b'\n'); }; - decode(self.format, clean.as_bytes()) + decode(self.format, &buf) } pub fn encode(&mut self) -> String { @@ -87,15 +103,25 @@ impl Data { } } +// NOTE: this will likely be phased out at some point pub fn wrap_print(line_wrap: usize, res: String) { - if line_wrap == 0 { - return print!("{}", res); - } + let stdout = io::stdout(); + wrap_write(stdout.lock(), line_wrap, res).unwrap(); +} + +pub fn wrap_write(mut writer: W, line_wrap: usize, res: String) -> io::Result<()> { use std::cmp::min; + + if line_wrap == 0 { + return write!(writer, "{}", res); + } + let mut start = 0; while start < res.len() { let end = min(start + line_wrap, res.len()); - println!("{}", &res[start..end]); + writeln!(writer, "{}", &res[start..end])?; start = end; } + + Ok(()) } diff --git a/src/uucore/lib.rs b/src/uucore/lib.rs index dbbc1b825..bfa111564 100644 --- a/src/uucore/lib.rs +++ b/src/uucore/lib.rs @@ -2,6 +2,11 @@ pub extern crate libc; #[cfg(feature = "winapi")] pub extern crate winapi; +#[cfg(feature = "failure")] +extern crate failure; +#[cfg(feature = "failure_derive")] +#[macro_use] +extern crate failure_derive; #[macro_use] mod macros; From 38968061a94d63ff9a7b1592c83ffaca85a76077 Mon Sep 17 00:00:00 2001 From: Alex Lyon Date: Sat, 26 May 2018 16:03:39 -0700 Subject: [PATCH 2/2] Stop trying to install libstdbuf.so when using the Makefile --- .travis.yml | 3 +++ Makefile | 11 ----------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index d9498f8de..6985b4ef1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,6 +40,9 @@ before_install: script: - cargo build $CARGO_ARGS --features "$FEATURES" - if [ ! $REDOX ]; then cargo test $CARGO_ARGS --features "$FEATURES" --no-fail-fast; fi + - mkdir installdir_test + - DESTDIR=installdir_test make install + - [ `ls installdir_test/usr/bin | wc -l` -gt 0 ] addons: apt: diff --git a/Makefile b/Makefile index 235f8656e..3e90613e3 100644 --- a/Makefile +++ b/Makefile @@ -21,11 +21,9 @@ CARGOFLAGS ?= PREFIX ?= /usr/local DESTDIR ?= BINDIR ?= /bin -LIBDIR ?= /lib MANDIR ?= /man/man1 INSTALLDIR_BIN=$(DESTDIR)$(PREFIX)$(BINDIR) -INSTALLDIR_LIB=$(DESTDIR)$(PREFIX)$(LIBDIR) INSTALLDIR_MAN=$(DESTDIR)$(PREFIX)/share/$(MANDIR) $(shell test -d $(INSTALLDIR_MAN)) ifneq ($(.SHELLSTATUS),0) @@ -248,12 +246,6 @@ ifeq ($(SYSTEM),Darwin) DYLIB_FLAGS := -dynamiclib -undefined dynamic_lookup endif -# Libaries to install -LIBS := -ifneq (,$(findstring stdbuf, $(INSTALLEES))) -LIBS += libstdbuf.$(DYLIB_EXT) -endif - all: build do_install = $(INSTALL) ${1} @@ -308,7 +300,6 @@ distclean: clean install: build mkdir -p $(INSTALLDIR_BIN) - mkdir -p $(INSTALLDIR_LIB) mkdir -p $(INSTALLDIR_MAN) ifeq (${MULTICALL}, y) $(INSTALL) $(BUILDDIR)/uutils $(INSTALLDIR_BIN)/$(PROG_PREFIX)uutils @@ -319,7 +310,6 @@ else $(foreach prog, $(INSTALLEES), \ $(INSTALL) $(BUILDDIR)/$(prog) $(INSTALLDIR_BIN)/$(PROG_PREFIX)$(prog);) endif - $(foreach lib, $(LIBS), $(INSTALL) $(BUILDDIR)/build/*/out/$(lib) $(INSTALLDIR_LIB)/$(PROG_PREFIX)$(lib) &&) : $(foreach man, $(filter $(INSTALLEES), $(basename $(notdir $(wildcard $(DOCSDIR)/_build/man/*)))), \ cat $(DOCSDIR)/_build/man/$(man).1 | gzip > $(INSTALLDIR_MAN)/$(PROG_PREFIX)$(man).1.gz &&) : @@ -330,6 +320,5 @@ endif rm -f $(addprefix $(INSTALLDIR_MAN)/,$(PROG_PREFIX)uutils.1.gz) rm -f $(addprefix $(INSTALLDIR_BIN)/$(PROG_PREFIX),$(PROGS)) rm -f $(addprefix $(INSTALLDIR_MAN)/$(PROG_PREFIX),$(addsuffix .1.gz,$(PROGS))) - rm -f $(addprefix $(INSTALLDIR_LIB)/$(PROG_PREFIX),$(LIBS)) .PHONY: all build build-uutils build-pkgs build-docs test distclean clean busytest install uninstall