diff --git a/.gitignore b/.gitignore index 08d1c60..55d0c0e 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ target/ # These are backup files generated by rustfmt **/*.rs.bk +.DS_Store +.idea +.env \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index bbb2c36..61a782f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.15.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" dependencies = [ "gimli", ] @@ -26,11 +26,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "android_system_properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7ed72e1635e121ca3e79420540282af22da58be50de153d36f81ddc6b83aa9e" +dependencies = [ + "libc", +] + [[package]] name = "ansi_term" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ "winapi", ] @@ -68,15 +77,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.60" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" +checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" dependencies = [ "addr2line", "cc", @@ -89,9 +98,9 @@ dependencies = [ [[package]] name = "base-x" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" [[package]] name = "base64" @@ -101,9 +110,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "beef" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6736e2428df2ca2848d846c43e88745121a6654696e349ce0054a420815a7409" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" [[package]] name = "bincode" @@ -116,9 +125,9 @@ dependencies = [ [[package]] name = "bit-set" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ "bit-vec", ] @@ -143,9 +152,9 @@ checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "bstr" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ "lazy_static", "memchr", @@ -154,9 +163,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" [[package]] name = "byteorder" @@ -166,9 +175,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.69" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" [[package]] name = "cfg-if" @@ -184,15 +193,17 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "serde", "time 0.1.44", + "wasm-bindgen", "winapi", ] @@ -214,9 +225,9 @@ checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" [[package]] name = "clap" -version = "2.33.3" +version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", @@ -251,9 +262,9 @@ dependencies = [ [[package]] name = "color-eyre" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ebf286c900a6d5867aeff75cfee3192857bb7f24b547d4f0df2ed6baa812c90" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" dependencies = [ "backtrace", "eyre", @@ -273,16 +284,24 @@ dependencies = [ "toml", ] +[[package]] +name = "conpty" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "977baae4026273d7f9bb69a0a8eb4aed7ab9dac98799f742dce09173a9734754" +dependencies = [ + "windows", +] + [[package]] name = "console" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31" +checksum = "89eab4d20ce20cea182308bca13088fecea9c05f6776cf287205d41a0ed3c847" dependencies = [ "encode_unicode", "libc", "once_cell", - "regex", "terminal_size", "unicode-width", "winapi", @@ -290,31 +309,37 @@ dependencies = [ [[package]] name = "const_fn" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92cfa0fd5690b3cf8c1ef2cabbd9b7ef22fa53cf5e1f92b05103f6d5d1cf6e7" +checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "crossbeam" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae5588f6b3c3cb05239e90bd110f257254aecd01e4635400391aeae07497845" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" dependencies = [ "cfg-if 1.0.0", - "crossbeam-channel 0.5.1", + "crossbeam-channel 0.5.6", "crossbeam-deque", "crossbeam-epoch", "crossbeam-queue", - "crossbeam-utils 0.8.5", + "crossbeam-utils 0.8.11", ] [[package]] @@ -329,46 +354,47 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.1" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.5", + "crossbeam-utils 0.8.11", ] [[package]] name = "crossbeam-deque" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if 1.0.0", "crossbeam-epoch", - "crossbeam-utils 0.8.5", + "crossbeam-utils 0.8.11", ] [[package]] name = "crossbeam-epoch" -version = "0.9.5" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" dependencies = [ + "autocfg", "cfg-if 1.0.0", - "crossbeam-utils 0.8.5", - "lazy_static", + "crossbeam-utils 0.8.11", "memoffset", + "once_cell", "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.2" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b10ddc024425c88c2ad148c1b0fd53f4c6d38db9697c9f1588381212fa657c9" +checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.5", + "crossbeam-utils 0.8.11", ] [[package]] @@ -384,12 +410,12 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.5" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" dependencies = [ "cfg-if 1.0.0", - "lazy_static", + "once_cell", ] [[package]] @@ -429,9 +455,9 @@ dependencies = [ [[package]] name = "defer-drop" -version = "1.0.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18ae055245e14ed411f56dddf2a78caae87c25d9d6a18fb61f398a596cad77b4" +checksum = "828aca0e5e4341b0320a319209cbc6255b8b06254849ce8a5f33d33f7f2fa0f0" dependencies = [ "crossbeam-channel 0.4.4", "once_cell", @@ -464,9 +490,9 @@ dependencies = [ [[package]] name = "dialoguer" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c8ae48e400addc32a8710c8d62d55cb84249a7d58ac4cd959daecfbaddc545" +checksum = "a92e7e37ecef6857fdc0c0c5d42fd5b0938e46590c2183cc92dd310a6d078eb1" dependencies = [ "console", "tempfile", @@ -500,20 +526,20 @@ dependencies = [ ] [[package]] -name = "dirs" -version = "2.0.2" +name = "dirs-next" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ - "cfg-if 0.1.10", - "dirs-sys", + "cfg-if 1.0.0", + "dirs-sys-next", ] [[package]] name = "dirs-sys" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", "redox_users", @@ -545,9 +571,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "either" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "encode_unicode" @@ -569,13 +595,15 @@ dependencies = [ ] [[package]] -name = "error-chain" -version = "0.12.4" +name = "expectrl" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +checksum = "2795e11f4ee3124984d454f25ac899515a5fa6d956562ef2b147fef6050b02f8" dependencies = [ - "backtrace", - "version_check", + "conpty", + "nix 0.23.1", + "ptyprocess", + "regex", ] [[package]] @@ -600,22 +628,20 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" dependencies = [ "instant", ] [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if 1.0.0", "crc32fast", - "libc", "miniz_oxide", ] @@ -674,26 +700,26 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] name = "gimli" -version = "0.24.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" [[package]] name = "globset" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" dependencies = [ "aho-corasick", "bstr", @@ -721,9 +747,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "heck" @@ -761,6 +787,19 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "iana-time-zone" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad2bfd338099682614d3ee3fe0cd72e0b6a41ca6a87f6a74a3bd593c91650501" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "js-sys", + "wasm-bindgen", + "winapi", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -786,9 +825,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", "hashbrown", @@ -796,45 +835,44 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.16.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b" +checksum = "fcc42b206e70d86ec03285b123e65a5458c92027d1fb2ae3555878b8113b3ddf" dependencies = [ "console", - "lazy_static", "number_prefix", - "regex", + "unicode-width", ] [[package]] name = "instant" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "itertools" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" [[package]] name = "js-sys" -version = "0.3.51" +version = "0.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" dependencies = [ "wasm-bindgen", ] @@ -845,17 +883,11 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" -version = "0.2.112" +version = "0.2.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" [[package]] name = "line-wrap" @@ -868,24 +900,25 @@ dependencies = [ [[package]] name = "linked-hash-map" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", ] @@ -901,9 +934,9 @@ dependencies = [ [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "maybe-uninit" @@ -913,52 +946,76 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ "autocfg", ] [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" dependencies = [ "adler", - "autocfg", ] [[package]] name = "nix" -version = "0.14.1" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce" +checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2" dependencies = [ "bitflags", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", - "void", ] [[package]] name = "nix" -version = "0.19.1" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2" +checksum = "77d9f3521ea8e0641a153b3cddaf008dcbf26acd4ed739a2517295e0760d12c7" dependencies = [ "bitflags", "cc", "cfg-if 1.0.0", "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", + "memoffset", ] [[package]] @@ -969,9 +1026,9 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -979,18 +1036,18 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", @@ -1042,24 +1099,24 @@ dependencies = [ [[package]] name = "object" -version = "0.25.3" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.8.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" [[package]] name = "owo-colors" -version = "3.2.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20448fd678ec04e6ea15bbe0476874af65e98a01515d667aa49f1434dc44ebf4" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] name = "parking_lot" @@ -1102,7 +1159,7 @@ dependencies = [ "indexmap", "line-wrap", "serde", - "time 0.3.9", + "time 0.3.13", "xml-rs", ] @@ -1122,18 +1179,18 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57e35a3326b75e49aa85f5dc6ec15b41108cf5aee58eabb1f274dd18b73c2451" +checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb" [[package]] name = "predicates-tree" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f553275e5721409451eb85e15fd9a860a6e5ab4496eb215987502b5f5391f2" +checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032" dependencies = [ "predicates-core", - "treeline", + "termtree", ] [[package]] @@ -1168,27 +1225,36 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.39" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" dependencies = [ "unicode-ident", ] +[[package]] +name = "ptyprocess" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69c28fcebfd842bfe19d69409fc321230ea8c1bebe31f274906485c761ce1917" +dependencies = [ + "nix 0.21.2", +] + [[package]] name = "quote" -version = "1.0.9" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] [[package]] name = "rayon" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", "crossbeam-deque", @@ -1198,41 +1264,41 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ - "crossbeam-channel 0.5.1", + "crossbeam-channel 0.5.6", "crossbeam-deque", - "crossbeam-utils 0.8.5", - "lazy_static", + "crossbeam-utils 0.8.11", "num_cpus", ] [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", "redox_syscall", + "thiserror", ] [[package]] name = "regex" -version = "1.5.6" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" dependencies = [ "aho-corasick", "memchr", @@ -1247,9 +1313,9 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-syntax" -version = "0.6.26" +version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "remove_dir_all" @@ -1260,18 +1326,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "rexpect" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862c0149d91461fab225ddd06a5af919913f5c57405ed4f27d2466d6cc877186" -dependencies = [ - "error-chain", - "nix 0.14.1", - "regex", - "tempfile", -] - [[package]] name = "ring" version = "0.16.20" @@ -1289,9 +1343,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc_version" @@ -1304,9 +1358,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.2" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37e5e2290f3e040b594b1a9e04377c2c671f1a1cfd9bfdef82106ac1c113f84" +checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" dependencies = [ "log", "ring", @@ -1316,15 +1370,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" [[package]] name = "safemem" @@ -1380,15 +1434,15 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.137" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" dependencies = [ "proc-macro2", "quote", @@ -1397,9 +1451,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.81" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" dependencies = [ "itoa", "ryu", @@ -1408,21 +1462,31 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.8.24" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707d15895415db6628332b737c838b88c598522e4dc70647e59b72312924aebc" +checksum = "7a09f551ccc8210268ef848f0bab37b306e87b85b2e017b899e7fb815f5aed62" dependencies = [ "indexmap", + "itoa", "ryu", "serde", - "yaml-rust", + "unsafe-libyaml", ] [[package]] name = "sha1" -version = "0.6.0" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" +dependencies = [ + "sha1_smol", +] + +[[package]] +name = "sha1_smol" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" [[package]] name = "shlex" @@ -1467,7 +1531,7 @@ checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" dependencies = [ "crc32fast", "crossbeam-epoch", - "crossbeam-utils 0.8.5", + "crossbeam-utils 0.8.11", "fs2", "fxhash", "libc", @@ -1477,9 +1541,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.6.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" [[package]] name = "spin" @@ -1583,15 +1647,15 @@ dependencies = [ [[package]] name = "strum" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96acfc1b70604b8b2f1ffa4c57e59176c7dbb05d556c71ecd2f5498a1dee7f8" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" [[package]] name = "strum_macros" -version = "0.24.0" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.0", "proc-macro2", @@ -1602,9 +1666,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.96" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" dependencies = [ "proc-macro2", "quote", @@ -1613,9 +1677,9 @@ dependencies = [ [[package]] name = "syntect" -version = "4.6.0" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b20815bbe80ee0be06e6957450a841185fcf690fe0178f14d77a05ce2caa031" +checksum = "c6c454c27d9d7d9a84c7803aaa3c50cd088d2906fe3c6e42da3209aa623576a8" dependencies = [ "bincode", "bitflags", @@ -1623,12 +1687,13 @@ dependencies = [ "flate2", "fnv", "lazy_static", - "lazycell", + "once_cell", "plist", "regex-syntax", "serde", "serde_derive", "serde_json", + "thiserror", "walkdir", "yaml-rust", ] @@ -1649,11 +1714,12 @@ dependencies = [ [[package]] name = "term" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0863a3345e70f61d613eab32ee046ccd1bcc5f9105fe402c61fcd0c13eeb8b5" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" dependencies = [ - "dirs", + "dirs-next", + "rustversion", "winapi", ] @@ -1676,6 +1742,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "termtree" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" + [[package]] name = "textwrap" version = "0.11.0" @@ -1698,13 +1770,13 @@ dependencies = [ "confy", "dialoguer", "directories-next", + "expectrl", "eyre", "grep-cli", "hex", "indicatif", "predicates", "regex", - "rexpect", "serde", "serde_derive", "serde_json", @@ -1723,18 +1795,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" dependencies = [ "proc-macro2", "quote", @@ -1743,9 +1815,9 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" dependencies = [ "once_cell", ] @@ -1757,7 +1829,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", - "wasi", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] @@ -1778,9 +1850,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.9" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +checksum = "db76ff9fa4b1458b3c7f077f3ff9887394058460d21e634355b273aaf11eea45" dependencies = [ "itoa", "libc", @@ -1821,9 +1893,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.2.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -1836,68 +1908,65 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] -[[package]] -name = "treeline" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" - [[package]] name = "tuikit" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c628cfc5752254a33ebccf73eb79ef6508fab77de5d5ef76246b5e45010a51f" +checksum = "667c8e002675e76d98358d8869021793a472d28e3a50fbd750284a1d211abd09" dependencies = [ "bitflags", "lazy_static", "log", - "nix 0.14.1", + "nix 0.24.2", "term", "unicode-width", ] [[package]] name = "unicode-bidi" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-ident" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "931179334a56395bcf64ba5e0ff56781381c1a5832178280c7d7f91d1679aeb0" [[package]] name = "untrusted" @@ -1907,9 +1976,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "ureq" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9399fa2f927a3d327187cbd201480cee55bee6ac5d3c77dd27f0c6814cff16d5" +checksum = "b97acb4c28a254fd7a4aeec976c46a7fa404eac4d7c134b30c75144846d7cb8f" dependencies = [ "base64", "chunked_transfer", @@ -1950,15 +2019,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" - -[[package]] -name = "void" -version = "1.0.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vte" @@ -2007,11 +2070,17 @@ version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" -version = "0.2.74" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -2019,13 +2088,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.74" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", @@ -2034,9 +2103,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.74" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2044,9 +2113,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.74" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" dependencies = [ "proc-macro2", "quote", @@ -2057,15 +2126,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.74" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" +checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" [[package]] name = "web-sys" -version = "0.3.51" +version = "0.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" +checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -2083,9 +2152,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.22.2" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552ceb903e957524388c4d3475725ff2c8b7960922063af6ce53c9a43da07449" +checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" dependencies = [ "webpki", ] @@ -2121,6 +2190,49 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac7fef12f4b59cd0a29339406cc9203ab44e440ddff6b3f5a41455349fa9cf3" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d027175d00b01e0cbeb97d6ab6ebe03b12330a35786cbaca5252b1c4bf5d9b" + +[[package]] +name = "windows_i686_gnu" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8793f59f7b8e8b01eda1a652b2697d87b93097198ae85f823b969ca5b89bba58" + +[[package]] +name = "windows_i686_msvc" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8602f6c418b67024be2996c512f5f995de3ba417f4c75af68401ab8756796ae4" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d615f419543e0bd7d2b3323af0d86ff19cbc4f816e6453f36a2c2ce889c354" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d95421d9ed3672c280884da53201a5c46b7b2765ca6faf34b0d71cf34a3561" + [[package]] name = "x11-clipboard" version = "0.3.3" @@ -2142,9 +2254,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" [[package]] name = "yaml-rust" @@ -2157,6 +2269,6 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.3.0" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" diff --git a/Cargo.toml b/Cargo.toml index 8877312..926a76f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,49 +25,49 @@ directories-next = "1.0.2" # Error management eyre = "0.6.8" -color-eyre = { version = "0.6.1", default-features = false } -thiserror = "1.0.31" +color-eyre = { version = "0.6.2", default-features = false } +thiserror = "1.0.32" # Database related sled = "0.34.7" bincode = "1.3.3" # Serializing -serde = "1.0.137" -serde_json = "1.0.81" -serde_derive = "1.0.137" -serde_yaml = "0.8.24" +serde = "1.0.144" +serde_json = "1.0.85" +serde_derive = "1.0.144" +serde_yaml = "0.9.10" # Parsing and manipulating dates -chrono = { version = "0.4.19", features = ["serde"] } +chrono = { version = "0.4.22", features = ["serde"] } chrono-english = "0.1.7" # Taking user input and showing progress -dialoguer = "0.10.1" -indicatif = "0.16.2" +dialoguer = "0.10.2" +indicatif = "0.17.0" # Fuzzy search skim = "0.9.4" # Terminal syntax highlighting -syntect = { version = "4.6.0", default-features = false, features = ["default-fancy"] } +syntect = { version = "5.0.0", default-features = false, features = ["default-fancy"] } hex = "0.4.3" grep-cli = "0.1.6" termcolor = "1.1.3" # Sync to Gist/GitLab -ureq = { version = "2.4.0", features = ["json"] } -strum = "0.24.0" -strum_macros = "0.24.0" +ureq = { version = "2.5.0", features = ["json"] } +strum = "0.24.1" +strum_macros = "0.24.3" # pattern filter and filling shell script variables -regex = "1.5.6" +regex = "1.6.0" [dev-dependencies] assert_cmd = "2.0.4" predicates = "2.1.1" tempfile = "3.3.0" -rexpect = "0.4.0" +expectrl = "0.5.2" [target.'cfg(target_os = "macos")'.dev-dependencies] clipboard = "0.5.0" diff --git a/src/language.rs b/src/language.rs index 87049ba..d321c04 100644 --- a/src/language.rs +++ b/src/language.rs @@ -356,7 +356,7 @@ impl CodeHighlight { let mut h = HighlightLines::new(syntax, &self.theme_set.themes[&self.theme_name]); for line in LinesWithEndings::from(code) { colorized.extend( - h.highlight(line, &self.syntax_set) + h.highlight_line(line, &self.syntax_set)? .into_iter() .map(|(style, s)| (style, s.to_owned())), ); diff --git a/src/the_way/cli.rs b/src/the_way/cli.rs index 5870303..9e4925a 100644 --- a/src/the_way/cli.rs +++ b/src/the_way/cli.rs @@ -17,8 +17,11 @@ global_settings = & [AppSettings::DeriveDisplayOrder] /// Record, retrieve, search, and categorize code snippets pub struct TheWayCLI { /// Force colorization even when not in TTY mode - #[structopt(short, long, global = true)] + #[structopt(short, long)] pub colorize: bool, + /// Turn off colorization + #[structopt(short, long, conflicts_with = "colorize")] + pub plain: bool, #[structopt(subcommand)] pub cmd: TheWaySubcommand, } diff --git a/src/the_way/mod.rs b/src/the_way/mod.rs index 2bcabe1..4c2c53d 100644 --- a/src/the_way/mod.rs +++ b/src/the_way/mod.rs @@ -42,6 +42,8 @@ pub struct TheWay { highlighter: CodeHighlight, /// colorize output even if terminal is not in tty mode colorize: bool, + /// don't colorize output even if terminal is in tty mode + plain: bool, } // All command-line related functions @@ -65,6 +67,7 @@ impl TheWay { highlighter: CodeHighlight::new(&config.theme, config.themes_dir.clone())?, config, colorize: cli.colorize, + plain: cli.plain, }; the_way.set_merge()?; the_way.run(cli)?; @@ -73,6 +76,7 @@ impl TheWay { fn run(&mut self, cli: TheWayCLI) -> color_eyre::Result<()> { self.colorize = cli.colorize; + self.plain = cli.plain; match cli.cmd { TheWaySubcommand::New => self.the_way(), TheWaySubcommand::Cmd { code } => self.the_way_cmd(code), @@ -165,6 +169,7 @@ impl TheWay { )?, false, self.colorize, + self.plain, )?; Ok(()) } @@ -273,7 +278,7 @@ impl TheWay { )?, ); } - utils::smart_print(&colorized, false, self.colorize)?; + utils::smart_print(&colorized, false, self.colorize, self.plain)?; Ok(()) } @@ -403,6 +408,7 @@ impl TheWay { &[(self.highlighter.main_style, input.to_string())], false, self.colorize, + self.plain, )?; Ok(()) } diff --git a/src/utils.rs b/src/utils.rs index cdd2673..753e833 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -2,7 +2,7 @@ use std::io::Write; use std::process::{Command, Stdio}; use std::str; -use chrono::{Date, DateTime, Utc, MAX_DATE, MIN_DATE}; +use chrono::{Date, DateTime, Utc}; use chrono_english::{parse_date_string, Dialect}; use color_eyre::Help; use dialoguer::{Confirm, Editor, Input}; @@ -142,7 +142,7 @@ pub fn parse_date(date_string: &str) -> color_eyre::Result> { pub fn date_start(from_date: Option>) -> DateTime { match from_date { Some(from_date) => from_date.and_hms(0, 0, 0), - None => MIN_DATE.and_hms(0, 0, 0), + None => Date::::MIN_UTC.and_hms(0, 0, 0), } } @@ -151,7 +151,7 @@ pub fn date_start(from_date: Option>) -> DateTime { pub fn date_end(to_date: Option>) -> DateTime { match to_date { Some(to_date) => to_date.and_hms(23, 59, 59), - None => MAX_DATE.and_hms(23, 59, 59), + None => Date::::MAX_UTC.and_hms(23, 59, 59), } } @@ -240,11 +240,18 @@ pub fn highlight_strings(inputs: &[(Style, String)], bg: bool) -> String { } /// Print with color if stdout is tty else without -pub fn smart_print(inputs: &[(Style, String)], bg: bool, colorize: bool) -> color_eyre::Result<()> { +/// if colorize, always uses color +/// if plain, doesn't use color +pub fn smart_print( + inputs: &[(Style, String)], + bg: bool, + colorize: bool, + plain: bool, +) -> color_eyre::Result<()> { write!( grep_cli::stdout(termcolor::ColorChoice::Auto), "{}", - if grep_cli::is_tty_stdout() | colorize { + if !plain & (grep_cli::is_tty_stdout() | colorize) { highlight_strings(inputs, bg) } else { inputs diff --git a/tests/cli.rs b/tests/cli.rs index 8d7d485..888f98a 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -3,14 +3,14 @@ use std::fs; use std::path::{Path, PathBuf}; use assert_cmd::Command; +use expectrl::repl::{spawn_bash, ReplSession}; use predicates::prelude::*; -use rexpect::session::PtyReplSession; -use rexpect::spawn_bash; use tempfile::{tempdir, TempDir}; use the_way::configuration::TheWayConfig; use the_way::gist::{Gist, GistClient, GistContent, UpdateGistPayload}; -fn make_config_file(temp_dir: &TempDir) -> color_eyre::Result { +fn setup_the_way() -> color_eyre::Result<(TempDir, PathBuf)> { + let temp_dir = tempdir()?; let db_dir = temp_dir.path().join("db"); let themes_dir = temp_dir.path().join("themes"); let config_contents = format!( @@ -22,19 +22,19 @@ themes_dir = \"{}\"", ); let config_file = temp_dir.path().join("the-way.toml"); fs::write(&config_file, config_contents)?; - Ok(config_file.to_path_buf()) + Ok((temp_dir, config_file)) } #[test] fn it_works() -> color_eyre::Result<()> { - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; let mut cmd = Command::cargo_bin("the-way")?; // Pretty much the only command that works without assuming any input or modifying anything - cmd.env("THE_WAY_CONFIG", config_file) + cmd.env("THE_WAY_CONFIG", &config_file) .arg("list") .assert() .success(); + drop(config_file); temp_dir.close()?; Ok(()) } @@ -44,29 +44,28 @@ fn change_config_file() -> color_eyre::Result<()> { // Test nonexistent file let config_file = "no-such-file"; let mut cmd = Command::cargo_bin("the-way")?; - cmd.env("THE_WAY_CONFIG", config_file) + cmd.env("THE_WAY_CONFIG", &config_file) .arg("config") .arg("get") .assert() .failure(); // Test changing file - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; let mut cmd = Command::cargo_bin("the-way")?; cmd.env("THE_WAY_CONFIG", &config_file) .arg("config") .arg("get") .assert() .stdout(predicate::str::contains(config_file.to_string_lossy())); + drop(config_file); temp_dir.close()?; Ok(()) } #[test] fn change_theme() -> color_eyre::Result<()> { - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; // Test nonexistent theme let theme = "no-such-theme"; let mut cmd = Command::cargo_bin("the-way")?; @@ -92,155 +91,160 @@ fn change_theme() -> color_eyre::Result<()> { .arg("get") .assert() .stdout(predicate::str::contains(theme)); + drop(config_file); temp_dir.close()?; Ok(()) } -fn add_snippet_rexpect(config_file: PathBuf) -> rexpect::errors::Result { - let mut p = spawn_bash(Some(3000))?; +fn add_snippet_interactive(config_file: &Path) -> color_eyre::Result { + let mut p = spawn_bash()?; p.send_line(&format!( "export THE_WAY_CONFIG={}", config_file.to_string_lossy() ))?; let executable = env!("CARGO_BIN_EXE_the-way"); - p.wait_for_prompt()?; + p.expect_prompt()?; p.send_line(&format!("{} config get", executable))?; - p.exp_regex(config_file.to_string_lossy().as_ref())?; - p.wait_for_prompt()?; - p.execute(&format!("{} new", executable), "Description")?; + p.expect(config_file.to_string_lossy().as_ref())?; + p.expect_prompt()?; + p.send_line(&format!("{} new", executable))?; + p.expect("Description")?; p.send_line("test description 1")?; - p.exp_string("Language")?; + p.expect("Language")?; p.send_line("rust")?; - p.exp_regex("Tags")?; + p.expect("Tags")?; p.send_line("tag1 tag2")?; - p.exp_regex("Code snippet")?; + p.expect("Code snippet")?; p.send_line("code")?; - p.exp_regex("Snippet #1 added")?; - p.wait_for_prompt()?; + p.expect("Snippet #1 added")?; + p.expect_prompt()?; Ok(p) } -fn add_two_snippets_rexpect(config_file: PathBuf) -> rexpect::errors::Result<()> { - let mut p = spawn_bash(Some(3000))?; +fn add_two_snippets_interactive(config_file: &Path) -> color_eyre::Result<()> { + let mut p = spawn_bash()?; p.send_line(&format!( "export THE_WAY_CONFIG={}", config_file.to_string_lossy() ))?; let executable = env!("CARGO_BIN_EXE_the-way"); - p.wait_for_prompt()?; + p.expect_prompt()?; p.send_line(&format!("{} config get", executable))?; - p.exp_regex(config_file.to_string_lossy().as_ref())?; - p.execute(&format!("{} new", executable), "Description")?; + p.expect(config_file.to_string_lossy().as_ref())?; + p.send_line(&format!("{} new", executable))?; + p.expect("Description")?; p.send_line("test description 1")?; - p.exp_string("Language")?; + p.expect("Language")?; p.send_line("rust")?; - p.exp_regex("Tags")?; + p.expect("Tags")?; p.send_line("tag1 tag2")?; - p.exp_regex("Code snippet")?; + p.expect("Code snippet")?; p.send_line("code")?; - p.exp_regex("Snippet #1 added")?; - p.wait_for_prompt()?; - p.execute(&format!("{} new", executable), "Description")?; + p.expect("Snippet #1 added")?; + p.expect_prompt()?; + p.send_line(&format!("{} new", executable))?; + p.expect("Description")?; p.send_line("test description 2")?; - p.exp_string("Language")?; + p.expect("Language")?; p.send_line("python")?; - p.exp_regex("Tags")?; + p.expect("Tags")?; p.send_line("tag1 tag2")?; - p.exp_regex("Code snippet")?; + p.expect("Code snippet")?; p.send_line("code")?; - p.exp_regex("Snippet #2 added")?; + p.expect("Snippet #2 added")?; Ok(()) } -fn change_snippet_rexpect(config_file: PathBuf) -> rexpect::errors::Result<()> { - let mut p = add_snippet_rexpect(config_file)?; +fn change_snippet_interactive(config_file: &Path) -> color_eyre::Result<()> { + let mut p = add_snippet_interactive(config_file)?; let executable = env!("CARGO_BIN_EXE_the-way"); - p.execute(&format!("{} edit 1", executable), "Description")?; + p.send_line(&format!("{} edit 1", executable))?; + p.expect("Description")?; p.send_line("test description 2")?; - p.exp_string("Language")?; + p.expect("Language")?; p.send_line("")?; - p.exp_regex("Tags")?; + p.expect("Tags")?; p.send_line("")?; - p.exp_regex("Date")?; + p.expect("Date")?; p.send_line("")?; - p.exp_regex("Edit snippet")?; + p.expect("Edit snippet")?; p.send_line("")?; - p.exp_regex("Snippet #1 changed")?; - p.wait_for_prompt()?; + p.expect("Snippet #1 changed")?; + p.expect_prompt()?; p.send_line(&format!("{} view 1", executable))?; - assert!(p.wait_for_prompt()?.contains("test description 2")); + p.expect("test description 2")?; Ok(()) } -fn add_two_cmd_snippets_rexpect(config_file: PathBuf) -> rexpect::errors::Result<()> { - let mut p = spawn_bash(Some(3000))?; +fn add_two_cmd_snippets_interactive(config_file: &Path) -> color_eyre::Result<()> { + let mut p = spawn_bash()?; + println!("Spawned"); p.send_line(&format!( "export THE_WAY_CONFIG={}", config_file.to_string_lossy() ))?; let executable = env!("CARGO_BIN_EXE_the-way"); - p.wait_for_prompt()?; + p.expect_prompt()?; p.send_line(&format!("{} config get", executable))?; - p.exp_regex(config_file.to_string_lossy().as_ref())?; + p.expect(config_file.to_string_lossy().as_ref())?; // as argument - p.execute( - &format!("{} cmd \"shell snippet 1\"", executable), - "Command", - )?; + p.send_line(&format!("{} cmd \"shell snippet 1\"", executable))?; + p.expect("Command")?; p.send_line("\n")?; - p.exp_string("Description")?; + p.expect("Description")?; p.send_line("test description 1")?; - p.exp_regex("Tags")?; + p.expect("Tags")?; p.send_line("tag1 tag2")?; - p.exp_regex("Snippet #1 added")?; - p.wait_for_prompt()?; + p.expect("Snippet #1 added")?; + p.expect_prompt()?; // interactively - p.execute(&format!("{} cmd", executable), "Command")?; + p.send_line(&format!("{} cmd", executable))?; + p.expect("Command")?; p.send_line("shell snippet 2")?; - p.exp_string("Description")?; + p.expect("Description")?; p.send_line("test description 2")?; - p.exp_regex("Tags")?; + p.expect("Tags")?; p.send_line("tag1 tag2")?; - p.exp_regex("Snippet #2 added")?; + p.expect("Snippet #2 added")?; Ok(()) } #[ignore] // expensive, and change_snippet tests both #[test] fn add_snippet() -> color_eyre::Result<()> { - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; - assert!(add_snippet_rexpect(config_file).is_ok()); + let (temp_dir, config_file) = setup_the_way()?; + assert!(add_snippet_interactive(&config_file).is_ok()); + drop(config_file); temp_dir.close()?; Ok(()) } #[test] fn add_two_snippets() -> color_eyre::Result<()> { - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; - assert!(add_two_snippets_rexpect(config_file).is_ok()); + let (temp_dir, config_file) = setup_the_way()?; + add_two_snippets_interactive(&config_file).unwrap(); + drop(config_file); temp_dir.close()?; Ok(()) } #[test] fn add_two_cmd_snippets() -> color_eyre::Result<()> { - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; - assert!(add_two_cmd_snippets_rexpect(config_file).is_ok()); + let (temp_dir, config_file) = setup_the_way()?; + add_two_cmd_snippets_interactive(&config_file).unwrap(); + drop(config_file); temp_dir.close()?; Ok(()) } #[test] fn change_snippet() -> color_eyre::Result<()> { - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; - assert!(change_snippet_rexpect(config_file).is_ok()); + let (temp_dir, config_file) = setup_the_way()?; + assert!(change_snippet_interactive(&config_file).is_ok()); + drop(config_file); temp_dir.close()?; Ok(()) } @@ -248,8 +252,8 @@ fn change_snippet() -> color_eyre::Result<()> { #[test] fn import_single_show() -> color_eyre::Result<()> { let contents = r#"{"description":"test description","language":"rust","tags":["tag1","tag2"],"code":"some\ntest\ncode\n"}"#; - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + + let (temp_dir, config_file) = setup_the_way()?; let mut cmd = Command::cargo_bin("the-way")?; cmd.env("THE_WAY_CONFIG", &config_file) .arg("import") @@ -262,6 +266,7 @@ fn import_single_show() -> color_eyre::Result<()> { .arg("1") .assert() .stdout(predicate::str::contains("test description")); + drop(config_file); temp_dir.close()?; Ok(()) } @@ -272,8 +277,8 @@ fn import_multiple_no_tags() -> color_eyre::Result<()> { let contents_2 = r#"{"description":"test description 2","language":"python","code":"some\ntest\ncode\n"}"#; let contents = format!("{}\n{}", contents_1, contents_2); - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + + let (temp_dir, config_file) = setup_the_way()?; let mut cmd = Command::cargo_bin("the-way")?; cmd.env("THE_WAY_CONFIG", &config_file) .arg("import") @@ -288,6 +293,7 @@ fn import_multiple_no_tags() -> color_eyre::Result<()> { predicate::str::contains("test description 1") .and(predicate::str::contains("test description 2")), ); + drop(config_file); temp_dir.close()?; Ok(()) } @@ -297,8 +303,7 @@ fn import_multiple_no_tags() -> color_eyre::Result<()> { #[ignore] #[test] fn import_gist() -> color_eyre::Result<()> { - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; let mut cmd = Command::cargo_bin("the-way")?; cmd.env("THE_WAY_CONFIG", &config_file) .arg("import") @@ -313,6 +318,7 @@ fn import_gist() -> color_eyre::Result<()> { .stdout(predicate::str::contains( "the-way Test - e5deab8d78ce838f22f160c9b14daf17 - TestTheWay.java", )); + drop(config_file); temp_dir.close()?; Ok(()) } @@ -323,9 +329,7 @@ fn import_gist() -> color_eyre::Result<()> { #[test] fn import_the_way_gist() -> color_eyre::Result<()> { use the_way::the_way::snippet::Snippet; - - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; let mut cmd = Command::cargo_bin("the-way")?; cmd.env("THE_WAY_CONFIG", &config_file) .arg("import") @@ -354,6 +358,7 @@ fn import_the_way_gist() -> color_eyre::Result<()> { .collect::, _>>()?; assert_eq!(snippets, test_snippets); + drop(config_file); temp_dir.close()?; Ok(()) } @@ -366,8 +371,7 @@ fn export() -> color_eyre::Result<()> { let contents_2 = r#"{"description":"test description 2","language":"python","code":"some\ntest\ncode\n"}"#; let contents = format!("{}\n{}", contents_1, contents_2); - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; // import let mut cmd = Command::cargo_bin("the-way")?; @@ -395,6 +399,7 @@ fn export() -> color_eyre::Result<()> { for snippet in snippets { assert_eq!(snippet.code, "some\ntest\ncode\n"); } + drop(config_file); temp_dir.close()?; Ok(()) } @@ -405,8 +410,7 @@ fn delete() -> color_eyre::Result<()> { let contents_2 = r#"{"description":"test description 2","language":"python","code":"some\ntest\ncode\n"}"#; let contents = format!("{}\n{}", contents_1, contents_2); - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; let mut cmd = Command::cargo_bin("the-way")?; cmd.env("THE_WAY_CONFIG", &config_file) .arg("import") @@ -456,6 +460,7 @@ fn delete() -> color_eyre::Result<()> { .arg("2") .assert() .failure(); + drop(config_file); temp_dir.close()?; Ok(()) } @@ -466,8 +471,7 @@ fn copy() -> color_eyre::Result<()> { use clipboard::{ClipboardContext, ClipboardProvider}; let contents = r#"{"description":"test description","language":"rust","tags":["tag1","tag2"],"code":"some\ntest\ncode\n"}"#; - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; let mut cmd = Command::cargo_bin("the-way")?; cmd.env("THE_WAY_CONFIG", &config_file) .arg("import") @@ -497,6 +501,7 @@ fn copy() -> color_eyre::Result<()> { assert!(contents.is_ok()); let contents = contents.unwrap(); assert!(contents.contains("some\ntest\ncode")); + drop(config_file); temp_dir.close()?; Ok(()) } @@ -505,10 +510,8 @@ fn copy() -> color_eyre::Result<()> { #[test] fn copy_shell_script() -> color_eyre::Result<()> { use clipboard::{ClipboardContext, ClipboardProvider}; - - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; - assert!(copy_shell_script_rexpect(config_file).is_ok()); + let (temp_dir, config_file) = setup_the_way()?; + assert!(copy_shell_script_interactive(&config_file).is_ok()); let ctx: color_eyre::Result = ClipboardProvider::new(); assert!(ctx.is_ok()); let mut ctx = ctx.unwrap(); @@ -516,42 +519,42 @@ fn copy_shell_script() -> color_eyre::Result<()> { assert!(contents.is_ok()); let contents = contents.unwrap(); assert!(contents.contains("shell snippet value1 code value2 value1")); + drop(config_file); temp_dir.close()?; Ok(()) } -fn copy_shell_script_rexpect(config_file: PathBuf) -> rexpect::errors::Result<()> { - let mut p = spawn_bash(Some(3000))?; +fn copy_shell_script_interactive(config_file: &Path) -> color_eyre::Result<()> { + let mut p = spawn_bash()?; p.send_line(&format!( "export THE_WAY_CONFIG={}", config_file.to_string_lossy() ))?; let executable = env!("CARGO_BIN_EXE_the-way"); - p.wait_for_prompt()?; + p.expect_prompt()?; p.send_line(&format!("{} config get", executable))?; - p.exp_regex(config_file.to_string_lossy().as_ref())?; + p.expect(config_file.to_string_lossy().as_ref())?; // add a shell snippet - p.execute( - &format!( - "{} cmd \"shell snippet code \"", - executable - ), - "Command", - )?; + p.send_line(&format!( + "{} cmd \"shell snippet code \"", + executable + ))?; + p.expect("Command")?; p.send_line("\n")?; - p.exp_string("Description")?; + p.expect("Description")?; p.send_line("test description 1")?; - p.exp_regex("Tags")?; + p.expect("Tags")?; p.send_line("tag1 tag2")?; - p.exp_regex("Snippet #1 added")?; - p.wait_for_prompt()?; + p.expect("Snippet #1 added")?; + p.expect_prompt()?; // Test interactive copy - p.execute(&format!("{} cp 1", executable), "param1")?; + p.send_line(&format!("{} cp 1", executable))?; + p.expect("param1")?; p.send_line("\n")?; - p.exp_string("param2")?; + p.expect("param2")?; p.send_line("value2")?; - p.exp_regex("Snippet #1 copied to clipboard")?; + p.expect("Snippet #1 copied to clipboard")?; Ok(()) } @@ -663,8 +666,7 @@ fn sync_edit(config_file: &Path, gist: &Gist, client: &GistClient) -> color_eyre /// Tests `the-way sync date` functionality. Needs to have the environment variable $THE_WAY_GITHUB_TOKEN set! /// Ignored by default since Travis doesn't allow secret/encrypted environment variables in PRs fn sync_date() -> color_eyre::Result<()> { - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; let token = &std::env::var("THE_WAY_GITHUB_TOKEN")?; let client = GistClient::new(Some(token))?; @@ -724,6 +726,7 @@ fn sync_date() -> color_eyre::Result<()> { // delete Gist assert!(client.delete_gist(&gist.id).is_ok()); assert!(client.get_gist(&gist.id).is_err()); + drop(config_file); temp_dir.close()?; Ok(()) } @@ -733,8 +736,7 @@ fn sync_date() -> color_eyre::Result<()> { /// Tests `the-way sync local` functionality. Needs to have the environment variable $THE_WAY_GITHUB_TOKEN set! /// Ignored by default since Travis doesn't allow secret/encrypted environment variables in PRs fn sync_local() -> color_eyre::Result<()> { - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; let token = &std::env::var("THE_WAY_GITHUB_TOKEN")?; let client = GistClient::new(Some(token))?; @@ -795,6 +797,7 @@ fn sync_local() -> color_eyre::Result<()> { // delete Gist assert!(client.delete_gist(&gist.id).is_ok()); assert!(client.get_gist(&gist.id).is_err()); + drop(config_file); temp_dir.close()?; Ok(()) } @@ -804,8 +807,7 @@ fn sync_local() -> color_eyre::Result<()> { /// Tests `the-way sync gist` functionality. Needs to have the environment variable $THE_WAY_GITHUB_TOKEN set! /// Ignored by default since Travis doesn't allow secret/encrypted environment variables in PRs fn sync_gist() -> color_eyre::Result<()> { - let temp_dir = tempdir()?; - let config_file = make_config_file(&temp_dir)?; + let (temp_dir, config_file) = setup_the_way()?; let token = &std::env::var("THE_WAY_GITHUB_TOKEN")?; let client = GistClient::new(Some(token))?; @@ -883,6 +885,7 @@ fn sync_gist() -> color_eyre::Result<()> { // delete Gist assert!(client.delete_gist(&gist.id).is_ok()); assert!(client.get_gist(&gist.id).is_err()); + drop(config_file); temp_dir.close()?; Ok(()) }