From 74e45e7c052e9d83485bc70712fbb8d75df66d2c Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Sat, 13 Jul 2019 01:55:06 -0700 Subject: [PATCH] Remove dependency on brev (#462) Just's dependency on brev was the cause of a fairly deep branch of the transitive dependency tree. To decrease build time and make the life of packagers easier, this diff moves the functionality that Just was using in Brev into Just itself, and removes the dependency on Brev. Fortunately, the only functionality that Just was using was the output function and OutputError enum, so this was easily done. --- Cargo.lock | 152 ---------------------------------- Cargo.toml | 1 - src/assignment_evaluator.rs | 3 +- src/common.rs | 18 ++-- src/function.rs | 2 - src/lib.rs | 3 + src/output.rs | 34 ++++++++ src/output_error.rs | 28 +++++++ src/platform.rs | 27 +----- src/platform_interface.rs | 20 +++++ src/recipe.rs | 13 +-- src/runtime_error.rs | 2 - tests/invocation_directory.rs | 16 +++- 13 files changed, 123 insertions(+), 196 deletions(-) create mode 100644 src/output.rs create mode 100644 src/output_error.rs create mode 100644 src/platform_interface.rs diff --git a/Cargo.lock b/Cargo.lock index b3fd937..3788dc2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,23 +16,6 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "argon2rs" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "arrayvec" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "assert_matches" version = "1.3.0" @@ -78,25 +61,6 @@ name = "bitflags" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "blake2-rfc" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "brev" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "dirs 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "c2-chacha" version = "0.2.2" @@ -130,19 +94,6 @@ dependencies = [ "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "ctor" version = "0.1.9" @@ -166,26 +117,6 @@ name = "difference" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "dirs" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "dirs-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "dirs-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "dotenv" version = "0.13.0" @@ -243,11 +174,6 @@ dependencies = [ "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "getrandom" version = "0.1.6" @@ -257,11 +183,6 @@ dependencies = [ "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "humantime" version = "1.2.0" @@ -285,7 +206,6 @@ dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "brev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "dotenv 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -340,11 +260,6 @@ dependencies = [ "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "nodrop" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "numtoa" version = "0.1.0" @@ -417,19 +332,6 @@ dependencies = [ "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "rand_core" version = "0.5.0" @@ -446,27 +348,6 @@ dependencies = [ "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "redox_syscall" version = "0.1.56" @@ -480,17 +361,6 @@ dependencies = [ "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "redox_users" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "regex" version = "1.1.9" @@ -524,11 +394,6 @@ name = "rustc-demangle" version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "scoped_threadpool" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "spin" version = "0.5.0" @@ -682,27 +547,19 @@ dependencies = [ [metadata] "checksum aho-corasick 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "36b7aa1ccb7d7ea3f437cf025a2ab1c47cc6c1bc9fc84918ff449def12f5e282" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392" -"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" "checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" "checksum backtrace 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "18b50f5258d1a9ad8396d2d345827875de4261b158124d4c819d9b351454fae5" "checksum backtrace-sys 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)" = "5b3a000b9c543553af61bc01cbfc403b04b5caa9e421033866f2e98061eb3e61" "checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" -"checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" -"checksum brev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77369cf7ebfdaf402cbcbac3dd918859e84711ed5dbd689745ae1d93e5236a47" "checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" "checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" "checksum ctor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3b4c17619643c1252b5f690084b82639dd7fac141c57c8e77a00e0148132092c" "checksum ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c7dfd2d8b4c82121dfdff120f818e09fc4380b0b7e17a742081a89b94853e87f" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" -"checksum dirs 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1c4ef5a8b902d393339e2a2c7fe573af92ce7e0ee5a3ff827b4c9ad7e07e4fa1" -"checksum dirs-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "937756392ec77d1f2dd9dc3ac9d69867d109a2121479d72c364e42f4cab21e2d" "checksum dotenv 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0d0a1279c96732bc6800ce6337b6a614697b0e74ae058dc03c62ebeb78b4d86" "checksum edit-distance 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbbaaaf38131deb9ca518a274a45bfdb8771f139517b073b16c2d3d32ae5037b" "checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" @@ -710,9 +567,7 @@ dependencies = [ "checksum executable-path 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ebc5a6d89e3c90b84e8f33c8737933dda8f1c106b5415900b38b9d433841478" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum getrandom 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e65cce4e5084b14874c4e7097f38cab54f47ee554f9194673456ea379dcc4c55" -"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" @@ -720,7 +575,6 @@ dependencies = [ "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce" -"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" "checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b" @@ -730,20 +584,14 @@ dependencies = [ "checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d47eab0e83d9693d40f825f86948aa16eff6750ead4bdffc4ab95b8b3a7f052c" "checksum rand_chacha 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e193067942ef6f485a349a113329140d0ab9e2168ce92274499bb0e9a4190d9d" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "615e683324e75af5d43d8f7a39ffe3ee4a9dc42c5c701167a71dc59c3a493aca" "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe5204c3a17e97dde73f285d49be585df59ed84b50a872baf416e73b62c3828" "checksum regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d9d8297cc20bbb6184f8b45ff61c8ee6a9ac56c156cec8e38c3e5084773c44ad" "checksum regex-syntax 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "9b01330cce219c1c6b2e209e5ed64ccd587ae5c67bed91c0b49eecf02ae40e21" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" "checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" -"checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" "checksum syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d960b829a55e56db167e861ddb43602c003c7be0bee1d345021703fac2fb7c" diff --git a/Cargo.toml b/Cargo.toml index 55f662c..a0cc563 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ edition = "2018" ansi_term = "0.11" assert_matches = "1" atty = "0.2" -brev = "0.2" clap = "2.33" dotenv = "0.13" edit-distance = "2" diff --git a/src/assignment_evaluator.rs b/src/assignment_evaluator.rs index 9ab50cd..3d6662a 100644 --- a/src/assignment_evaluator.rs +++ b/src/assignment_evaluator.rs @@ -154,7 +154,7 @@ impl<'a, 'b> AssignmentEvaluator<'a, 'b> { }); InterruptHandler::guard(|| { - brev::output(cmd).map_err(|output_error| RuntimeError::Backtick { + output(cmd).map_err(|output_error| RuntimeError::Backtick { token: token.clone(), output_error, }) @@ -166,7 +166,6 @@ impl<'a, 'b> AssignmentEvaluator<'a, 'b> { mod test { use super::*; use crate::testing::parse; - use brev::OutputError; fn no_cwd_err() -> Result { Err(String::from("no cwd in tests")) diff --git a/src/common.rs b/src/common.rs index 29d89d4..fc06755 100644 --- a/src/common.rs +++ b/src/common.rs @@ -7,8 +7,7 @@ pub(crate) use std::{ fs, io, iter, ops::{Range, RangeInclusive}, path::{Path, PathBuf}, - process, - process::Command, + process::{self, Command}, str::Chars, sync::{Mutex, MutexGuard}, usize, vec, @@ -30,6 +29,7 @@ pub(crate) use crate::testing; pub(crate) use crate::{ load_dotenv::load_dotenv, misc::{default, empty}, + output::output, }; // Structs and enums @@ -39,11 +39,12 @@ pub(crate) use crate::{ compilation_error_kind::CompilationErrorKind, configuration::Configuration, expression::Expression, fragment::Fragment, function::Function, function_context::FunctionContext, functions::Functions, interrupt_guard::InterruptGuard, - interrupt_handler::InterruptHandler, justfile::Justfile, lexer::Lexer, parameter::Parameter, - parser::Parser, position::Position, recipe::Recipe, recipe_context::RecipeContext, - recipe_resolver::RecipeResolver, runtime_error::RuntimeError, search_error::SearchError, - shebang::Shebang, state::State, string_literal::StringLiteral, token::Token, - token_kind::TokenKind, use_color::UseColor, variables::Variables, verbosity::Verbosity, + interrupt_handler::InterruptHandler, justfile::Justfile, lexer::Lexer, output_error::OutputError, + parameter::Parameter, parser::Parser, platform::Platform, position::Position, recipe::Recipe, + recipe_context::RecipeContext, recipe_resolver::RecipeResolver, runtime_error::RuntimeError, + search_error::SearchError, shebang::Shebang, state::State, string_literal::StringLiteral, + token::Token, token_kind::TokenKind, use_color::UseColor, variables::Variables, + verbosity::Verbosity, }; pub type CompilationResult<'a, T> = Result>; @@ -61,3 +62,6 @@ pub(crate) use crate::range_ext::RangeExt; #[allow(unused_imports)] pub(crate) use crate::ordinal::Ordinal; + +#[allow(unused_imports)] +pub(crate) use crate::platform_interface::PlatformInterface; diff --git a/src/function.rs b/src/function.rs index 2df48de..dd34250 100644 --- a/src/function.rs +++ b/src/function.rs @@ -2,8 +2,6 @@ use crate::common::*; use target; -use crate::platform::{Platform, PlatformInterface}; - lazy_static! { static ref FUNCTIONS: BTreeMap<&'static str, Function> = vec![ ("arch", Function::Nullary(arch)), diff --git a/src/lib.rs b/src/lib.rs index 2ec3471..9e5abe5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -33,9 +33,12 @@ mod lexer; mod load_dotenv; mod misc; mod ordinal; +mod output; +mod output_error; mod parameter; mod parser; mod platform; +mod platform_interface; mod position; mod range_ext; mod recipe; diff --git a/src/output.rs b/src/output.rs new file mode 100644 index 0000000..31e9340 --- /dev/null +++ b/src/output.rs @@ -0,0 +1,34 @@ +use crate::common::*; + +/// Run a command and return the data it wrote to stdout as a string +pub fn output(mut command: Command) -> Result { + match command.output() { + Ok(output) => { + if let Some(code) = output.status.code() { + if code != 0 { + return Err(OutputError::Code(code)); + } + } else { + let signal = Platform::signal_from_exit_status(output.status); + return Err(match signal { + Some(signal) => OutputError::Signal(signal), + None => OutputError::Unknown, + }); + } + match std::str::from_utf8(&output.stdout) { + Err(error) => Err(OutputError::Utf8(error)), + Ok(utf8) => Ok( + if utf8.ends_with('\n') { + &utf8[0..utf8.len() - 1] + } else if utf8.ends_with("\r\n") { + &utf8[0..utf8.len() - 2] + } else { + utf8 + } + .to_string(), + ), + } + } + Err(io_error) => Err(OutputError::Io(io_error)), + } +} diff --git a/src/output_error.rs b/src/output_error.rs new file mode 100644 index 0000000..9efc6e2 --- /dev/null +++ b/src/output_error.rs @@ -0,0 +1,28 @@ +use crate::common::*; + +#[derive(Debug)] +pub enum OutputError { + /// Non-zero exit code + Code(i32), + /// IO error + Io(io::Error), + /// Terminated by signal + Signal(i32), + /// Unknown failure + Unknown, + /// Stdout not UTF-8 + Utf8(std::str::Utf8Error), +} + +impl Display for OutputError { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + match *self { + OutputError::Code(code) => write!(f, "Process exited with status code {}", code), + OutputError::Io(ref io_error) => write!(f, "Error executing process: {}", io_error), + OutputError::Signal(signal) => write!(f, "Process terminated by signal {}", signal), + OutputError::Unknown => write!(f, "Process experienced an unknown failure"), + OutputError::Utf8(ref err) => write!(f, "Could not convert process stdout to UTF-8: {}", err), + } + } +} + diff --git a/src/platform.rs b/src/platform.rs index 6c21488..762893f 100644 --- a/src/platform.rs +++ b/src/platform.rs @@ -2,32 +2,13 @@ use crate::common::*; pub struct Platform; -pub trait PlatformInterface { - /// Construct a command equivalent to running the script at `path` with the - /// shebang line `shebang` - fn make_shebang_command( - path: &Path, - command: &str, - argument: Option<&str>, - ) -> Result; - - /// Set the execute permission on the file pointed to by `path` - fn set_execute_permission(path: &Path) -> Result<(), io::Error>; - - /// Extract the signal from a process exit status, if it was terminated by a signal - fn signal_from_exit_status(exit_status: process::ExitStatus) -> Option; - - /// Translate a path from a "native" path to a path the interpreter expects - fn to_shell_path(path: &Path) -> Result; -} - #[cfg(unix)] impl PlatformInterface for Platform { fn make_shebang_command( path: &Path, _command: &str, _argument: Option<&str>, - ) -> Result { + ) -> Result { // shebang scripts can be executed directly on unix Ok(Command::new(path)) } @@ -65,13 +46,13 @@ impl PlatformInterface for Platform { path: &Path, command: &str, argument: Option<&str>, - ) -> Result { + ) -> Result { // Translate path to the interpreter from unix style to windows style let mut cygpath = Command::new("cygpath"); cygpath.arg("--windows"); cygpath.arg(command); - let mut cmd = Command::new(brev::output(cygpath)?); + let mut cmd = Command::new(output(cygpath)?); if let Some(argument) = argument { cmd.arg(argument); } @@ -96,6 +77,6 @@ impl PlatformInterface for Platform { let mut cygpath = Command::new("cygpath"); cygpath.arg("--unix"); cygpath.arg(path); - brev::output(cygpath).map_err(|e| format!("Error converting shell path: {}", e)) + output(cygpath).map_err(|e| format!("Error converting shell path: {}", e)) } } diff --git a/src/platform_interface.rs b/src/platform_interface.rs new file mode 100644 index 0000000..151383a --- /dev/null +++ b/src/platform_interface.rs @@ -0,0 +1,20 @@ +use crate::common::*; + +pub trait PlatformInterface { + /// Construct a command equivalent to running the script at `path` with the + /// shebang line `shebang` + fn make_shebang_command( + path: &Path, + command: &str, + argument: Option<&str>, + ) -> Result; + + /// Set the execute permission on the file pointed to by `path` + fn set_execute_permission(path: &Path) -> Result<(), io::Error>; + + /// Extract the signal from a process exit status, if it was terminated by a signal + fn signal_from_exit_status(exit_status: process::ExitStatus) -> Option; + + /// Translate a path from a "native" path to a path the interpreter expects + fn to_shell_path(path: &Path) -> Result; +} diff --git a/src/recipe.rs b/src/recipe.rs index d059040..92dcead 100644 --- a/src/recipe.rs +++ b/src/recipe.rs @@ -2,8 +2,6 @@ use crate::common::*; use std::process::{Command, ExitStatus, Stdio}; -use crate::platform::{Platform, PlatformInterface}; - /// Return a `RuntimeError::Signal` if the process was terminated by a signal, /// otherwise return an `RuntimeError::UnknownFailure` fn error_from_signal( @@ -132,10 +130,13 @@ impl<'a> Recipe<'a> { return Ok(()); } - let tmp = tempfile::Builder::new().prefix("just").tempdir().map_err(|error| RuntimeError::TmpdirIoError { - recipe: self.name, - io_error: error, - })?; + let tmp = tempfile::Builder::new() + .prefix("just") + .tempdir() + .map_err(|error| RuntimeError::TmpdirIoError { + recipe: self.name, + io_error: error, + })?; let mut path = tmp.path().to_path_buf(); path.push(self.name); { diff --git a/src/runtime_error.rs b/src/runtime_error.rs index d32ad70..758e96e 100644 --- a/src/runtime_error.rs +++ b/src/runtime_error.rs @@ -1,7 +1,5 @@ use crate::common::*; -use brev::OutputError; - use crate::misc::{maybe_s, ticks, write_error_context, And, Or, Tick}; #[derive(Debug)] diff --git a/tests/invocation_directory.rs b/tests/invocation_directory.rs index 59efc43..c544164 100644 --- a/tests/invocation_directory.rs +++ b/tests/invocation_directory.rs @@ -21,7 +21,21 @@ fn to_shell_path(path: &Path) -> String { let mut cygpath = process::Command::new("cygpath"); cygpath.arg("--unix"); cygpath.arg(path); - brev::output(cygpath).expect("converting cygwin path failed") + + let output = cygpath.output().expect("executing cygpath failed"); + + assert!(output.status.success()); + + let stdout = str::from_utf8(&output.stdout).expect("cygpath output was not utf8"); + + if stdout.ends_with('\n') { + &stdout[0..stdout.len() - 1] + } else if stdout.ends_with("\r\n") { + &stdout[0..stdout.len() - 2] + } else { + stdout + } + .to_owned() } #[test]