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]