diff --git a/Cargo.lock b/Cargo.lock index 0c71538..962da64 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,21 +37,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27" - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" [[package]] name = "assert_cmd" @@ -69,13 +57,14 @@ dependencies = [ [[package]] name = "async-broadcast" -version = "0.3.4" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90622698a1218e0b2fb846c97b5f19a0831f6baddee73d9454156365ccfa473b" +checksum = "1bbd92a9bd0e9c1298118ecf8a2f825e86b12c3ec9e411573e34aaf3a0c03cdd" dependencies = [ "easy-parallel", "event-listener", "futures-core", + "parking_lot", ] [[package]] @@ -105,9 +94,9 @@ dependencies = [ [[package]] name = "async-io" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" +checksum = "e5e18f61464ae81cde0a23e713ae8fd299580c54d697a35820cfd0625b8b0e07" dependencies = [ "concurrent-queue", "futures-lite", @@ -131,6 +120,15 @@ dependencies = [ "event-listener", ] +[[package]] +name = "async-priority-channel" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c21678992e1b21bebfe2bc53ab5f5f68c106eddab31b24e0bb06e9b715a86640" +dependencies = [ + "event-listener", +] + [[package]] name = "async-recursion" version = "0.3.2" @@ -182,9 +180,9 @@ checksum = "30696a84d817107fc028e049980e09d5e140e8da8f1caeb17e8e950658a3cea9" [[package]] name = "async-trait" -version = "0.1.52" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" dependencies = [ "proc-macro2", "quote", @@ -215,10 +213,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] -name = "backtrace" -version = "0.3.64" +name = "axum" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e121dee8023ce33ab248d9ce1493df03c3b38a659b240096fcbd7048ff9c31f" +checksum = "dc47084705629d09d15060d70a8dbfce479c842303d05929ce29c74c995916ae" +dependencies = [ + "async-trait", + "axum-core", + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde", + "sync_wrapper", + "tokio", + "tower", + "tower-http", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2efed1c501becea07ce48118786ebcf229531d0d3b28edf224a720020d9e106" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", +] + +[[package]] +name = "backtrace" +version = "0.3.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" dependencies = [ "addr2line", "cc", @@ -241,17 +282,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - [[package]] name = "block" version = "0.1.6" @@ -305,19 +335,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "time", - "winapi", -] - [[package]] name = "clap" version = "2.34.0" @@ -332,11 +349,11 @@ dependencies = [ [[package]] name = "clearscreen" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ed49b0e894fe6264a58496c7ec4e9d3c46f66b59efae527cd5bee429d0a418" +checksum = "c969a6b6dadff9f3349b1f783f553e2411104763ca4789e1c6ca6a41f46a57b0" dependencies = [ - "nix 0.22.3", + "nix 0.24.1", "terminfo", "thiserror", "which", @@ -379,22 +396,21 @@ dependencies = [ [[package]] name = "console-api" -version = "0.1.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc347c19eb5b940f396ac155822caee6662f850d97306890ac3773ed76c90c5a" +checksum = "06c5fd425783d81668ed68ec98408a80498fb4ae2fd607797539e1a9dfa3618f" dependencies = [ "prost", "prost-types", "tonic", - "tonic-build", "tracing-core", ] [[package]] name = "console-subscriber" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "565a7dfea2d10dd0e5c57cc394d5d441b1910960d8c9211ed14135e0e6ec3a20" +checksum = "31432bc31ff8883bf6a693a79371862f73087822470c82d6a1ec778781ee3978" dependencies = [ "console-api", "crossbeam-channel", @@ -414,12 +430,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "crc32fast" version = "1.3.2" @@ -431,9 +441,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdbfe11fe19ff083c48923cf179540e8cd0535903dc35e178a1fdeeb59aef51f" +checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -466,17 +476,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" -[[package]] -name = "dirs" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" -dependencies = [ - "libc", - "redox_users 0.3.5", - "winapi", -] - [[package]] name = "dirs" version = "2.0.2" @@ -496,6 +495,16 @@ dependencies = [ "dirs-sys", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + [[package]] name = "dirs-sys" version = "0.3.7" @@ -503,7 +512,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", - "redox_users 0.4.2", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", "winapi", ] @@ -533,9 +553,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "embed-resource" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e813aabad49e547de6abcc81004dfced79226fb3a14d73c26aabc2816ee8c7f" +checksum = "ecc24ff8d764818e9ab17963b0593c535f077a513f565e75e4352d758bc4d8c0" dependencies = [ "cc", "rustc_version", @@ -552,9 +572,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "enumflags2" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25c90b056b3f84111cf183cbeddef0d3a0bbe9a674f057e1a1533c315f24def" +checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" dependencies = [ "enumflags2_derive", "serde", @@ -562,9 +582,9 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144ec79496cbab6f84fa125dc67be9264aef22eb8a28da8454d9c33f15108da4" +checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" dependencies = [ "proc-macro2", "quote", @@ -610,31 +630,23 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.11", + "redox_syscall", "winapi", ] -[[package]] -name = "fixedbitset" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" - [[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", ] @@ -770,9 +782,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if 1.0.0", "libc", @@ -787,10 +799,11 @@ checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" [[package]] name = "git-config" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b21a3fec9a7437ebee54c52f1fcb6795bf8e97a5f058d4bde015fc37ff8193a3" +checksum = "a552e3de993c389623e23b71a888c8356acfcb6e4232ce8420fba4710a44921b" dependencies = [ + "bstr", "dirs 4.0.0", "git-features", "memchr", @@ -812,9 +825,9 @@ dependencies = [ [[package]] name = "git-hash" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "106e7c3a08b97285bf0bca7f109e67d286e7fbf34b222faf742443b021de2bb4" +checksum = "e05d7e760613f4118cdccaf881fc9d1323c3ea596d156aac25a4eb44b428f11e" dependencies = [ "hex", "quick-error", @@ -822,9 +835,9 @@ dependencies = [ [[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", @@ -835,9 +848,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62eeb471aa3e3c9197aa4bfeabfe02982f6dc96f750486c0bb0009ac58b26d2b" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ "bytes", "fnv", @@ -848,7 +861,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.6.9", + "tokio-util", "tracing", ] @@ -897,9 +910,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ "bytes", "fnv", @@ -908,9 +921,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", @@ -918,10 +931,16 @@ dependencies = [ ] [[package]] -name = "httparse" -version = "1.6.0" +name = "http-range-header" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" +checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" + +[[package]] +name = "httparse" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -937,9 +956,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.17" +version = "0.14.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043f0e083e9901b6cc658a77d1eb86f4fc650bbb977a4337dd63192826aa85dd" +checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" dependencies = [ "bytes", "futures-channel", @@ -991,9 +1010,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "e6012d540c5baa3589337a98ce73408de9b5a25ec9fc2c6fd6be8f0d39e0ca5a" dependencies = [ "autocfg", "hashbrown", @@ -1021,9 +1040,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.13.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7e1911532a662f6b08b68f884080850f2fd9544963c3ab23a5af42bda1eac" +checksum = "bcc3e639bcba360d9237acabd22014c16f3df772db463b7446cd81b070714767" dependencies = [ "console", "once_cell", @@ -1059,15 +1078,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "kqueue" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058a107a784f8be94c7d35c1300f4facced2e93d2fbe5b1452b44e905ddca4a9" +checksum = "4d6112e8f37b59803ac47a42d14f1f3a59bbf72fc6857ffc5be455e28a691f8e" dependencies = [ "kqueue-sys", "libc", @@ -1091,15 +1110,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.120" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad5c14e80759d0939d013e6ca49930e59fc53dd8e5009132f76240c179380c09" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "libmimalloc-sys" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7705fc40f6ed493f73584abbb324e74f96b358ff60dfe5659a0f8fc12c590a69" +checksum = "11ca136052550448f55df7898c6dbe651c6b574fe38a0d9ea687a9f8088a2e2c" dependencies = [ "cc", ] @@ -1112,32 +1131,34 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +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", ] [[package]] name = "mac-notification-sys" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb6b71a9a89cd38b395d994214297447e8e63b1ba5708a9a2b0b1048ceda76" +checksum = "297c13fc8ff9fa8b2d0e53850f80e0aa962628e865d447031ce58cdb062e5b29" dependencies = [ "cc", - "chrono", - "dirs 1.0.5", + "dirs-next", "objc-foundation", + "objc_id", + "time", ] [[package]] @@ -1159,10 +1180,16 @@ dependencies = [ ] [[package]] -name = "memchr" -version = "2.4.1" +name = "matchit" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -1205,13 +1232,19 @@ dependencies = [ [[package]] name = "mimalloc" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0dfa131390c2f6bdb3242f65ff271fcdaca5ff7b6c08f28398be7f2280e3926" +checksum = "2f64ad83c969af2e732e907564deb0d0ed393cec4af80776f77dd77a1a427698" dependencies = [ "libmimalloc-sys", ] +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1220,43 +1253,25 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[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 = "mio" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" dependencies = [ "libc", "log", - "miow", - "ntapi", "wasi 0.11.0+wasi-snapshot-preview1", - "winapi", + "windows-sys", ] -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", -] - -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" - [[package]] name = "nix" version = "0.22.3" @@ -1283,6 +1298,17 @@ dependencies = [ "memoffset", ] +[[package]] +name = "nix" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", +] + [[package]] name = "nom" version = "5.1.2" @@ -1323,9 +1349,9 @@ dependencies = [ [[package]] name = "notify-rust" -version = "4.5.6" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "367e1355a950d3e758e414f3ca1b3981a57a2aa1fa3338eb0059f5b230b6ffa4" +checksum = "a995a3d2834cefa389218e7a35156e8ce544bc95f836900da01ee0b26a07e9d4" dependencies = [ "mac-notification-sys", "serde", @@ -1335,30 +1361,11 @@ dependencies = [ "zvariant_derive", ] -[[package]] -name = "ntapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" -dependencies = [ - "winapi", -] - -[[package]] -name = "num-integer" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" -dependencies = [ - "autocfg", - "num-traits", -] - [[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", ] @@ -1373,6 +1380,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "objc" version = "0.2.7" @@ -1404,18 +1420,18 @@ dependencies = [ [[package]] name = "object" -version = "0.27.1" +version = "0.28.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" [[package]] name = "ordered-stream" @@ -1429,9 +1445,9 @@ dependencies = [ [[package]] name = "owo-colors" -version = "3.2.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20448fd678ec04e6ea15bbe0476874af65e98a01515d667aa49f1434dc44ebf4" +checksum = "decf7381921fea4dcb2549c5667eda59b3ec297ab7e2b5fc33eac69d2e7da87b" [[package]] name = "parking" @@ -1441,25 +1457,27 @@ checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" [[package]] name = "parking_lot" -version = "0.12.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ + "instant", "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ "cfg-if 1.0.0", + "instant", "libc", - "redox_syscall 0.2.11", + "redox_syscall", "smallvec", - "windows-sys", + "winapi", ] [[package]] @@ -1468,16 +1486,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -[[package]] -name = "petgraph" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" -dependencies = [ - "fixedbitset", - "indexmap", -] - [[package]] name = "phf" version = "0.8.0" @@ -1538,9 +1546,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -1606,48 +1614,28 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "prost" -version = "0.9.0" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" dependencies = [ "bytes", "prost-derive", ] -[[package]] -name = "prost-build" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" -dependencies = [ - "bytes", - "heck", - "itertools", - "lazy_static", - "log", - "multimap", - "petgraph", - "prost", - "prost-types", - "regex", - "tempfile", - "which", -] - [[package]] name = "prost-derive" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +checksum = "7b670f45da57fb8542ebdbb6105a925fe571b67f9e7ed9f47a06a84e72b4e7cc" dependencies = [ "anyhow", "itertools", @@ -1658,9 +1646,9 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" +checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" dependencies = [ "bytes", "prost", @@ -1684,9 +1672,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quote" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4af2ec4714533fcdf07e886f17025ace8b997b9ce51204ee69b6da831c3da57" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] @@ -1751,7 +1739,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.5", + "getrandom 0.2.6", ] [[package]] @@ -1774,46 +1762,29 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.3.5" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.1.16", - "redox_syscall 0.1.57", - "rust-argon2", -] - -[[package]] -name = "redox_users" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7776223e2696f1aa4c6b0170e83212f47296a00424305117d013dfe86fb0fe55" -dependencies = [ - "getrandom 0.2.5", - "redox_syscall 0.2.11", + "getrandom 0.2.6", + "redox_syscall", "thiserror", ] [[package]] name = "regex" -version = "1.5.5" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" dependencies = [ "aho-corasick", "memchr", @@ -1831,9 +1802,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "remove_dir_all" @@ -1844,18 +1815,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "rust-argon2" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" -dependencies = [ - "base64", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils", -] - [[package]] name = "rustc-demangle" version = "0.1.21" @@ -1873,9 +1832,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "same-file" @@ -1894,24 +1853,24 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "semver" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d" +checksum = "a41d061efea015927ac527063765e73601444cdc344ba855bc7bd44578b25e1c" [[package]] name = "serde" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -1920,9 +1879,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ "itoa", "ryu", @@ -1931,9 +1890,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" +checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" dependencies = [ "proc-macro2", "quote", @@ -1942,9 +1901,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" +checksum = "707d15895415db6628332b737c838b88c598522e4dc70647e59b72312924aebc" dependencies = [ "indexmap", "ryu", @@ -1999,9 +1958,9 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "smallvec" @@ -2082,15 +2041,21 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.89" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54" +checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" + [[package]] name = "synstructure" version = "0.12.6" @@ -2112,7 +2077,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "libc", - "redox_syscall 0.2.11", + "redox_syscall", "remove_dir_all", "winapi", ] @@ -2179,18 +2144,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", @@ -2208,19 +2173,19 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" dependencies = [ "libc", - "winapi", + "num_threads", ] [[package]] name = "tokio" -version = "1.17.0" +version = "1.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" dependencies = [ "bytes", "libc", @@ -2228,7 +2193,6 @@ dependencies = [ "mio", "num_cpus", "once_cell", - "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", @@ -2249,9 +2213,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ "proc-macro2", "quote", @@ -2260,9 +2224,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" dependencies = [ "futures-core", "pin-project-lite", @@ -2271,49 +2235,36 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ "bytes", "futures-core", "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64910e1b9c1901aaf5375561e35b9c057d95ff41a44ede043a03e09279eabaf1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", "pin-project-lite", "tokio", + "tracing", ] [[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 = "tonic" -version = "0.6.2" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff08f4649d10a70ffa3522ca559031285d8e421d727ac85c60825761818f5d0a" +checksum = "5be9d60db39854b30b835107500cf0aca0b0d14d6e1c3de124217c23a29c2ddb" dependencies = [ "async-stream", "async-trait", + "axum", "base64", "bytes", "futures-core", @@ -2329,7 +2280,7 @@ dependencies = [ "prost-derive", "tokio", "tokio-stream", - "tokio-util 0.6.9", + "tokio-util", "tower", "tower-layer", "tower-service", @@ -2337,18 +2288,6 @@ dependencies = [ "tracing-futures", ] -[[package]] -name = "tonic-build" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757" -dependencies = [ - "proc-macro2", - "prost-build", - "quote", - "syn", -] - [[package]] name = "tower" version = "0.4.12" @@ -2363,12 +2302,31 @@ dependencies = [ "rand 0.8.5", "slab", "tokio", - "tokio-util 0.7.0", + "tokio-util", "tower-layer", "tower-service", "tracing", ] +[[package]] +name = "tower-http" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.1" @@ -2383,9 +2341,9 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.32" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" dependencies = [ "cfg-if 1.0.0", "log", @@ -2396,9 +2354,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ "proc-macro2", "quote", @@ -2407,11 +2365,11 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" +checksum = "7709595b8878a4965ce5e87ebf880a7d39c9afc6837721b21a5a816a8117d921" dependencies = [ - "lazy_static", + "once_cell", "valuable", ] @@ -2438,9 +2396,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0ab7bdc962035a87fba73f3acca9b8a8d0034c2e6f60b84aeaaddddc155dce" +checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" dependencies = [ "ansi_term", "lazy_static", @@ -2460,6 +2418,16 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "uds_windows" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" +dependencies = [ + "tempfile", + "winapi", +] + [[package]] name = "unicase" version = "2.6.0" @@ -2475,6 +2443,12 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63ec69f541d875b783ca40184d655f2927c95f0bffd486faa83cd3ac3529ec32" +[[package]] +name = "unicode-ident" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + [[package]] name = "unicode-linebreak" version = "0.1.2" @@ -2498,9 +2472,9 @@ checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "valuable" @@ -2592,6 +2566,7 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" name = "watchexec" version = "2.0.0-pre.14" dependencies = [ + "async-priority-channel", "async-recursion 1.0.0", "async-stream", "atomic-take", @@ -2649,9 +2624,9 @@ dependencies = [ [[package]] name = "which" -version = "4.2.4" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5a7e487e921cf220206864a94a89b6c6905bfc19f1057fa26a4cb360e5c1d2" +checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" dependencies = [ "either", "lazy_static", @@ -2703,22 +2678,22 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ "windows_aarch64_msvc", - "windows_i686_gnu 0.32.0", - "windows_i686_msvc 0.32.0", - "windows_x86_64_gnu 0.32.0", - "windows_x86_64_msvc 0.32.0", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", ] [[package]] name = "windows_aarch64_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_i686_gnu" @@ -2728,9 +2703,9 @@ checksum = "c0866510a3eca9aed73a077490bbbf03e5eaac4e1fd70849d89539e5830501fd" [[package]] name = "windows_i686_gnu" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_msvc" @@ -2740,9 +2715,9 @@ checksum = "bf0ffed56b7e9369a29078d2ab3aaeceea48eb58999d2cff3aa2494a275b95c6" [[package]] name = "windows_i686_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_x86_64_gnu" @@ -2752,9 +2727,9 @@ checksum = "384a173630588044205a2993b6864a2f56e5a8c1e7668c07b93ec18cf4888dc4" [[package]] name = "windows_x86_64_gnu" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_msvc" @@ -2764,9 +2739,9 @@ checksum = "9bd8f062d8ca5446358159d79a90be12c543b3a965c847c8f3eedf14b321d399" [[package]] name = "windows_x86_64_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "winreg" @@ -2805,9 +2780,9 @@ dependencies = [ [[package]] name = "zbus" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb86f3d4592e26a48b2719742aec94f8ae6238ebde20d98183ee185d1275e9a" +checksum = "53819092b9db813b2c6168b097b4b13ad284d81c9f2b0165a0a1b190e505a1f3" dependencies = [ "async-broadcast", "async-channel", @@ -2834,6 +2809,7 @@ dependencies = [ "serde_repr", "sha1", "static_assertions", + "uds_windows", "winapi", "zbus_macros", "zbus_names", @@ -2842,9 +2818,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36823cc10fddc3c6b19f048903262dacaf8274170e9a255784bdd8b4570a8040" +checksum = "c7174ebe6722c280d6d132d694bb5664ce50a788cb70eeb518e7fc1ca095a114" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2866,9 +2842,9 @@ dependencies = [ [[package]] name = "zvariant" -version = "3.1.2" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ea5dc38b2058fae6a5b79009388143dadce1e91c26a67f984a0fc0381c8033" +checksum = "cbd1abd8bc2c855412b9c8af9fc11c0d695c73c732ad5a1a1be10f3fd4bf19b2" dependencies = [ "byteorder", "enumflags2", @@ -2880,9 +2856,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.1.2" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2cecc5a61c2a053f7f653a24cd15b3b0195d7f7ddb5042c837fb32e161fb7a" +checksum = "abebd57382dfacf3e7bbdd7b7c3d162d6ed0687a78f046263ddef4ddabc275ae" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 42e092d..77f4574 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -37,11 +37,10 @@ default-features = false features = ["wrap_help"] [dependencies.tokio] -version = "1.15.0" +version = "1.19.2" features = [ "fs", "io-std", - "parking_lot", "process", "rt", "rt-multi-thread", diff --git a/cli/src/filterer/globset.rs b/cli/src/filterer/globset.rs index 01df479..c361bd3 100644 --- a/cli/src/filterer/globset.rs +++ b/cli/src/filterer/globset.rs @@ -10,7 +10,7 @@ use watchexec::{ error::RuntimeError, event::{ filekind::{FileEventKind, ModifyKind}, - Event, Tag, + Event, Priority, Tag, }, filter::{globset::GlobsetFilterer, Filterer}, }; @@ -77,7 +77,7 @@ pub struct WatchexecFilterer { } impl Filterer for WatchexecFilterer { - fn check_event(&self, event: &Event) -> Result { + fn check_event(&self, event: &Event, priority: Priority) -> Result { let is_meta = event.tags.iter().any(|tag| { matches!( tag, @@ -88,7 +88,7 @@ impl Filterer for WatchexecFilterer { if self.no_meta && is_meta { Ok(false) } else { - self.inner.check_event(event) + self.inner.check_event(event, priority) } } } diff --git a/cli/src/main.rs b/cli/src/main.rs index 12ab106..3349d6f 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -2,10 +2,13 @@ use std::env::var; -use tracing_log::LogTracer; use miette::{IntoDiagnostic, Result}; use tracing::debug; -use watchexec::{event::Event, Watchexec}; +use tracing_log::LogTracer; +use watchexec::{ + event::{Event, Priority}, + Watchexec, +}; mod args; mod config; @@ -67,7 +70,7 @@ async fn main() -> Result<()> { let wx = Watchexec::new(init, runtime)?; if !args.is_present("postpone") { - wx.send_event(Event::default()).await?; + wx.send_event(Event::default(), Priority::Urgent).await?; } wx.main().await.into_diagnostic()??; diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 3b78d51..143d5cf 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -16,6 +16,7 @@ rust-version = "1.58.0" edition = "2021" [dependencies] +async-priority-channel = "0.1.0" async-recursion = "1.0.0" async-stream = "0.3.2" atomic-take = "1.0.0" @@ -40,11 +41,10 @@ features = ["with-tokio"] version = "=5.0.0-pre.14" [dependencies.tokio] -version = "1.15.0" +version = "1.19.2" features = [ "fs", "io-std", - "parking_lot", "process", "rt", "rt-multi-thread", diff --git a/lib/examples/fs.rs b/lib/examples/fs.rs index ef05209..aa6339d 100644 --- a/lib/examples/fs.rs +++ b/lib/examples/fs.rs @@ -1,11 +1,15 @@ use std::time::Duration; +use async_priority_channel as priority; use miette::{IntoDiagnostic, Result}; use tokio::{ sync::{mpsc, watch}, time::sleep, }; -use watchexec::{event::Event, fs}; +use watchexec::{ + event::{Event, Priority}, + fs, +}; // Run with: `env RUST_LOG=debug cargo run --example fs`, // then touch some files within the first 15 seconds, and afterwards. @@ -13,7 +17,7 @@ use watchexec::{event::Event, fs}; async fn main() -> Result<()> { tracing_subscriber::fmt::init(); - let (ev_s, mut ev_r) = mpsc::channel::(1024); + let (ev_s, ev_r) = priority::bounded::(1024); let (er_s, mut er_r) = mpsc::channel(64); let (wd_s, wd_r) = watch::channel(fs::WorkingData::default()); @@ -22,14 +26,14 @@ async fn main() -> Result<()> { wd_s.send(wkd.clone()).into_diagnostic()?; tokio::spawn(async move { - while let Some(e) = ev_r.recv().await { - tracing::info!("event: {:?}", e); + while let Ok((event, priority)) = ev_r.recv().await { + tracing::info!("event ({priority:?}): {event:?}"); } }); tokio::spawn(async move { - while let Some(e) = er_r.recv().await { - tracing::error!("error: {}", e); + while let Some(error) = er_r.recv().await { + tracing::error!("error: {error}"); } }); diff --git a/lib/examples/signal.rs b/lib/examples/signal.rs index 86218fb..0f77e52 100644 --- a/lib/examples/signal.rs +++ b/lib/examples/signal.rs @@ -1,9 +1,10 @@ use std::process::exit; +use async_priority_channel as priority; use miette::Result; use tokio::sync::mpsc; use watchexec::{ - event::{Event, Tag}, + event::{Event, Priority, Tag}, signal::{self, source::MainSignal}, }; @@ -14,22 +15,22 @@ use watchexec::{ async fn main() -> Result<()> { tracing_subscriber::fmt::init(); - let (ev_s, mut ev_r) = mpsc::channel::(1024); + let (ev_s, ev_r) = priority::bounded::(1024); let (er_s, mut er_r) = mpsc::channel(64); tokio::spawn(async move { - while let Some(e) = ev_r.recv().await { - tracing::info!("event: {:?}", e); + while let Ok((event, priority)) = ev_r.recv().await { + tracing::info!("event {priority:?}: {event:?}"); - if e.tags.contains(&Tag::Signal(MainSignal::Terminate)) { + if event.tags.contains(&Tag::Signal(MainSignal::Terminate)) { exit(0); } } }); tokio::spawn(async move { - while let Some(e) = er_r.recv().await { - tracing::error!("{}", e); + while let Some(error) = er_r.recv().await { + tracing::error!("error: {error}"); } }); diff --git a/lib/src/action/outcome_worker.rs b/lib/src/action/outcome_worker.rs index eefd6a1..d48f48d 100644 --- a/lib/src/action/outcome_worker.rs +++ b/lib/src/action/outcome_worker.rs @@ -3,6 +3,7 @@ use std::sync::{ Arc, }; +use async_priority_channel as priority; use clearscreen::ClearScreen; use futures::Future; use tokio::{ @@ -11,7 +12,12 @@ use tokio::{ }; use tracing::{debug, error, trace, warn}; -use crate::{command::Supervisor, error::RuntimeError, event::Event, handler::rte}; +use crate::{ + command::Supervisor, + error::RuntimeError, + event::{Event, Priority}, + handler::rte, +}; use super::{process_holder::ProcessHolder, Outcome, PostSpawn, PreSpawn, WorkingData}; @@ -23,7 +29,7 @@ pub struct OutcomeWorker { gen: usize, gencheck: Arc, errors_c: mpsc::Sender, - events_c: mpsc::Sender, + events_c: priority::Sender, } impl OutcomeWorker { @@ -38,7 +44,7 @@ impl OutcomeWorker { process: ProcessHolder, gencheck: Arc, errors_c: mpsc::Sender, - events_c: mpsc::Sender, + events_c: priority::Sender, ) { let gen = gencheck.fetch_add(1, Ordering::SeqCst).wrapping_add(1); let this = Self { diff --git a/lib/src/action/worker.rs b/lib/src/action/worker.rs index debae9b..831dbec 100644 --- a/lib/src/action/worker.rs +++ b/lib/src/action/worker.rs @@ -3,6 +3,7 @@ use std::{ time::{Duration, Instant}, }; +use async_priority_channel as priority; use tokio::{ sync::{ mpsc, @@ -14,7 +15,7 @@ use tracing::{debug, trace}; use crate::{ error::{CriticalError, RuntimeError}, - event::Event, + event::{Event, Priority}, handler::rte, }; @@ -28,8 +29,8 @@ use super::{outcome_worker::OutcomeWorker, process_holder::ProcessHolder, Action pub async fn worker( working: watch::Receiver, errors: mpsc::Sender, - events_tx: mpsc::Sender, - mut events: mpsc::Receiver, + events_tx: priority::Sender, + events: priority::Receiver, ) -> Result<(), CriticalError> { let mut last = Instant::now(); let mut set = Vec::new(); @@ -37,6 +38,11 @@ pub async fn worker( let outcome_gen = OutcomeWorker::newgen(); loop { + if events.is_closed() { + trace!("events channel closed, stopping"); + break; + } + let maxtime = if set.is_empty() { trace!("nothing in set, waiting forever for next event"); Duration::from_secs(u64::MAX) @@ -54,19 +60,27 @@ pub async fn worker( } } else { trace!(?maxtime, "waiting for event"); - match timeout(maxtime, events.recv()).await { + let maybe_event = timeout(maxtime, events.recv()).await; + if events.is_closed() { + trace!("events channel closed during timeout, stopping"); + break; + } + + match maybe_event { Err(_timeout) => { trace!("timed out, cycling"); continue; } - Ok(None) => break, - Ok(Some(event)) => { - trace!(?event, "got event"); + Ok(Err(_empty)) => break, + Ok(Ok((event, priority))) => { + trace!(?event, ?priority, "got event"); - if event.is_empty() { + if priority == Priority::Urgent { + trace!("urgent event, by-passing filters"); + } else if event.is_empty() { trace!("empty event, by-passing filters"); } else { - let filtered = working.borrow().filterer.check_event(&event); + let filtered = working.borrow().filterer.check_event(&event, priority); match filtered { Err(err) => { trace!(%err, "filter errored on event"); diff --git a/lib/src/command/supervisor.rs b/lib/src/command/supervisor.rs index ad0da3d..0c551f6 100644 --- a/lib/src/command/supervisor.rs +++ b/lib/src/command/supervisor.rs @@ -1,3 +1,4 @@ +use async_priority_channel as priority; use command_group::AsyncCommandGroup; use tokio::{ process::Command, @@ -11,7 +12,7 @@ use tracing::{debug, error, trace}; use crate::{ error::RuntimeError, - event::{Event, Source, Tag}, + event::{Event, Priority, Source, Tag}, signal::process::SubSignal, }; @@ -39,7 +40,7 @@ impl Supervisor { /// Spawns the command, the supervision task, and returns a new control object. pub fn spawn( errors: Sender, - events: Sender, + events: priority::Sender, command: &mut Command, grouped: bool, ) -> Result { @@ -140,7 +141,7 @@ impl Supervisor { }; debug!(?event, "creating synthetic process completion event"); - if let Err(err) = events.send(event).await { + if let Err(err) = events.send(event, Priority::Low).await { error!(%err, "while sending process completion event"); errors .send(RuntimeError::EventChannelSend { diff --git a/lib/src/error/critical.rs b/lib/src/error/critical.rs index 338cf03..873bfdb 100644 --- a/lib/src/error/critical.rs +++ b/lib/src/error/critical.rs @@ -2,7 +2,7 @@ use miette::Diagnostic; use thiserror::Error; use tokio::{sync::mpsc, task::JoinError}; -use crate::event::Event; +use crate::event::{Event, Priority}; use super::RuntimeError; @@ -60,7 +60,7 @@ pub enum CriticalError { /// Error received when an event cannot be sent to the events channel. #[error("cannot send event to internal channel: {0}")] #[diagnostic(code(watchexec::critical::event_channel_send))] - EventChannelSend(#[from] mpsc::error::SendError), + EventChannelSend(#[from] async_priority_channel::SendError<(Event, Priority)>), /// Error received when joining the main watchexec task. #[error("main task join: {0}")] diff --git a/lib/src/error/runtime.rs b/lib/src/error/runtime.rs index 04c4dbb..884ce46 100644 --- a/lib/src/error/runtime.rs +++ b/lib/src/error/runtime.rs @@ -2,9 +2,12 @@ use std::path::PathBuf; use miette::Diagnostic; use thiserror::Error; -use tokio::sync::mpsc; -use crate::{event::Event, fs::Watcher, signal::process::SubSignal}; +use crate::{ + event::{Event, Priority}, + fs::Watcher, + signal::process::SubSignal, +}; /// Errors which _may_ be recoverable, transient, or only affect a part of the operation, and should /// be reported to the user and/or acted upon programatically, but will not outright stop watchexec. @@ -65,7 +68,7 @@ pub enum RuntimeError { /// The underlying error. #[source] - err: mpsc::error::SendError, + err: async_priority_channel::SendError<(Event, Priority)>, }, /// Error received when an event cannot be sent to the event channel. @@ -79,7 +82,7 @@ pub enum RuntimeError { /// The underlying error. #[source] - err: mpsc::error::TrySendError, + err: async_priority_channel::TrySendError<(Event, Priority)>, }, /// Error received when a [`Handler`][crate::handler::Handler] errors. diff --git a/lib/src/event.rs b/lib/src/event.rs index 3f03442..9fb683f 100644 --- a/lib/src/event.rs +++ b/lib/src/event.rs @@ -256,6 +256,45 @@ impl fmt::Display for Source { } } +/// The priority of the event in the queue. +/// +/// In the event queue, events are inserted with a priority, such that more important events are +/// delivered ahead of others. This is especially important when there is a large amount of events +/// generated and relatively slow filtering, as events can become noticeably delayed, and may give +/// the impression of stalling. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)] +pub enum Priority { + /// Low priority + /// + /// Used for: + /// - process completion events + Low, + + /// Normal priority + /// + /// Used for: + /// - filesystem events + Normal, + + /// High priority + /// + /// Used for: + /// - signals to main process, except Interrupt and Terminate + High, + + /// Urgent events bypass filtering entirely. + /// + /// Used for: + /// - Interrupt and Terminate signals to main process + Urgent, +} + +impl Default for Priority { + fn default() -> Self { + Self::Normal + } +} + impl Event { /// Returns true if the event has an Internal source tag. pub fn is_internal(&self) -> bool { diff --git a/lib/src/filter.rs b/lib/src/filter.rs index 44c7655..3ffe1ab 100644 --- a/lib/src/filter.rs +++ b/lib/src/filter.rs @@ -2,7 +2,10 @@ use std::sync::Arc; -use crate::{error::RuntimeError, event::Event}; +use crate::{ + error::RuntimeError, + event::{Event, Priority}, +}; pub mod globset; pub mod tagged; @@ -19,17 +22,17 @@ pub trait Filterer: std::fmt::Debug + Send + Sync { /// the watchexec error handler. While the type signature supports any [`RuntimeError`], it's /// preferred that you create your own error type and return it wrapped in the /// [`RuntimeError::Filterer`] variant with the name of your filterer as `kind`. - fn check_event(&self, event: &Event) -> Result; + fn check_event(&self, event: &Event, priority: Priority) -> Result; } impl Filterer for () { - fn check_event(&self, _event: &Event) -> Result { + fn check_event(&self, _event: &Event, _priority: Priority) -> Result { Ok(true) } } impl Filterer for Arc { - fn check_event(&self, event: &Event) -> Result { - Arc::as_ref(self).check_event(event) + fn check_event(&self, event: &Event, priority: Priority) -> Result { + Arc::as_ref(self).check_event(event, priority) } } diff --git a/lib/src/filter/globset.rs b/lib/src/filter/globset.rs index f208441..eacf2bf 100644 --- a/lib/src/filter/globset.rs +++ b/lib/src/filter/globset.rs @@ -7,7 +7,7 @@ use ignore::gitignore::{Gitignore, GitignoreBuilder}; use tracing::{debug, trace, trace_span}; use crate::error::RuntimeError; -use crate::event::{Event, FileType}; +use crate::event::{Event, FileType, Priority}; use crate::filter::Filterer; use crate::ignore::{IgnoreFile, IgnoreFilterer}; @@ -105,14 +105,14 @@ impl Filterer for GlobsetFilterer { /// Filter an event. /// /// This implementation never errors. - fn check_event(&self, event: &Event) -> Result { + fn check_event(&self, event: &Event, priority: Priority) -> Result { let _span = trace_span!("filterer_check").entered(); { trace!("checking internal ignore filterer"); if !self .ignore_files - .check_event(event) + .check_event(event, priority) .expect("IgnoreFilterer never errors") { trace!("internal ignore filterer matched (fail)"); diff --git a/lib/src/filter/tagged.rs b/lib/src/filter/tagged.rs index 2a8194d..dbd6e74 100644 --- a/lib/src/filter/tagged.rs +++ b/lib/src/filter/tagged.rs @@ -13,7 +13,7 @@ use unicase::UniCase; use crate::error::RuntimeError; use crate::error::TaggedFiltererError; -use crate::event::{Event, FileType, ProcessEnd, Tag}; +use crate::event::{Event, FileType, Priority, ProcessEnd, Tag}; use crate::filter::Filterer; use crate::ignore::{IgnoreFile, IgnoreFilterer}; use crate::signal::process::SubSignal; @@ -70,7 +70,8 @@ mod parse; /// | [Source](Matcher::Source) | `:=` (in set) | /// | [Process](Matcher::Process) | `:=` (in set) | /// | [Signal](Matcher::Signal) | `:=` (in set) | -/// | [ProcessCompletion](Matcher::ProcessCompletion) | `*=` (glob) | +/// | [ProcessCompletion](Matcher::ProcessCompletion) | `*=` (glob) | +/// | [Priority](Matcher::Priority) | `:=` (in set) | /// /// [Matchers][Matcher] correspond to Tags, but are not one-to-one: the `path` matcher operates on /// the `path` part of the `Path` tag, and the `type` matcher operates on the `file_type`, for @@ -86,6 +87,7 @@ mod parse; /// | [Process](Matcher::Process) | `process` or `pid` | [Process](Tag::Process) | /// | [Signal](Matcher::Signal) | `signal` | [Signal](Tag::Signal) | /// | [ProcessCompletion](Matcher::ProcessCompletion) | `complete` or `exit` | [ProcessCompletion](Tag::ProcessCompletion) | +/// | [Priority](Matcher::Priority) | `priority` | special: event [Priority] | /// /// Filters are checked in order, grouped per tag and per matcher. Filter groups may be checked in /// any order, but the filters in the groups are checked in add order. Path glob filters are always @@ -125,20 +127,60 @@ pub struct TaggedFilterer { } impl Filterer for TaggedFilterer { - fn check_event(&self, event: &Event) -> Result { - self.check(event).map_err(|e| e.into()) + fn check_event(&self, event: &Event, priority: Priority) -> Result { + self.check(event, priority).map_err(|e| e.into()) } } impl TaggedFilterer { - fn check(&self, event: &Event) -> Result { + fn check(&self, event: &Event, priority: Priority) -> Result { let _span = trace_span!("filterer_check").entered(); - trace!(?event, "checking event"); + trace!(?event, ?priority, "checking event"); + + { + trace!("checking priority"); + if let Some(filters) = self.filters.borrow().get(&Matcher::Priority).cloned() { + trace!(filters=%filters.len(), "found some filters for priority"); + // + let mut pri_match = true; + for filter in &filters { + let _span = trace_span!("checking filter against priority", ?filter).entered(); + let applies = filter.matches(match priority { + Priority::Low => "low", + Priority::Normal => "normal", + Priority::High => "high", + Priority::Urgent => unreachable!("urgent by-passes filtering"), + })?; + if filter.negate { + if applies { + trace!(prev=%pri_match, now=%true, "negate filter passes, passing this priority"); + pri_match = true; + break; + } else { + trace!(prev=%pri_match, now=%pri_match, "negate filter fails, ignoring"); + } + } else { + trace!(prev=%pri_match, this=%applies, now=%(pri_match&applies), "filter applies to priority"); + pri_match &= applies; + } + } + + if !pri_match { + trace!("priority fails check, failing entire event"); + return Ok(false); + } + } else { + trace!("no filters for priority, skipping (pass)"); + } + } { trace!("checking internal ignore filterer"); let igf = self.ignore_filterer.borrow(); - if !igf.check_event(event).expect("IgnoreFilterer never errors") { + if !igf + .check_event(event, priority) + .expect("IgnoreFilterer never errors") + { trace!("internal ignore filterer matched (fail)"); return Ok(false); } @@ -687,9 +729,6 @@ impl Filter { #[non_exhaustive] pub enum Matcher { /// The presence of a tag on an event. - /// - /// You should be extremely careful using this, as it's possible to make it impossible to quit - /// Watchexec by e.g. not allowing signals to go through and thus ignoring Ctrl-C. Tag, /// A path in a filesystem event. Paths are always canonicalised. @@ -732,8 +771,11 @@ pub enum Matcher { /// A signal sent to the main process. /// /// This can be matched both on the signal number as an integer, and on the signal name as a - /// string. On Windows, only these signal names is supported: `BREAK`, and `CTRL_C`. Matching is + /// string. On Windows, only `BREAK` is supported; `CTRL_C` parses but won't work. Matching is /// on both uppercase and lowercase forms. + /// + /// Interrupt signals (`TERM` and `INT` on Unix, `CTRL_C` on Windows) are parsed, but these are + /// marked Urgent internally to Watchexec, and thus bypass filtering entirely. Signal, /// The exit status of a subprocess. @@ -741,6 +783,11 @@ pub enum Matcher { /// This is only present for events issued when the subprocess exits. The value is matched on /// both the exit code as an integer, and either `success` or `fail`, whichever succeeds. ProcessCompletion, + + /// The [`Priority`] of the event. + /// + /// This is never `urgent`, as urgent events bypass filtering. + Priority, } impl Matcher { diff --git a/lib/src/filter/tagged/parse.rs b/lib/src/filter/tagged/parse.rs index a811050..fbc4aa9 100644 --- a/lib/src/filter/tagged/parse.rs +++ b/lib/src/filter/tagged/parse.rs @@ -29,6 +29,7 @@ impl FromStr for Filter { tag_no_case("fek"), tag_no_case("source"), tag_no_case("src"), + tag_no_case("priority"), tag_no_case("process"), tag_no_case("pid"), tag_no_case("signal"), @@ -42,6 +43,7 @@ impl FromStr for Filter { "type" => Ok(Matcher::FileType), "kind" | "fek" => Ok(Matcher::FileEventKind), "source" | "src" => Ok(Matcher::Source), + "priority" => Ok(Matcher::Priority), "process" | "pid" => Ok(Matcher::Process), "signal" | "sig" => Ok(Matcher::Signal), "complete" | "exit" => Ok(Matcher::ProcessCompletion), diff --git a/lib/src/fs.rs b/lib/src/fs.rs index 0eff8a4..a866a28 100644 --- a/lib/src/fs.rs +++ b/lib/src/fs.rs @@ -8,13 +8,14 @@ use std::{ time::Duration, }; +use async_priority_channel as priority; use notify::Watcher as _; use tokio::sync::{mpsc, watch}; use tracing::{debug, error, trace, warn}; use crate::{ error::{CriticalError, FsWatcherError, RuntimeError}, - event::{Event, Source, Tag}, + event::{Event, Priority, Source, Tag}, }; /// What kind of filesystem watcher to use. @@ -135,12 +136,13 @@ impl AsRef for WatchedPath { /// Direct usage: /// /// ```no_run +/// use async_priority_channel as priority; /// use tokio::sync::{mpsc, watch}; /// use watchexec::fs::{worker, WorkingData}; /// /// #[tokio::main] /// async fn main() -> Result<(), Box> { -/// let (ev_s, _) = mpsc::channel(1024); +/// let (ev_s, _) = priority::bounded(1024); /// let (er_s, _) = mpsc::channel(64); /// let (wd_s, wd_r) = watch::channel(WorkingData::default()); /// @@ -155,7 +157,7 @@ impl AsRef for WatchedPath { pub async fn worker( mut working: watch::Receiver, errors: mpsc::Sender, - events: mpsc::Sender, + events: priority::Sender, ) -> Result<(), CriticalError> { debug!("launching filesystem worker"); @@ -291,7 +293,7 @@ fn notify_multi_path_errors( fn process_event( nev: Result, kind: Watcher, - n_events: mpsc::Sender, + n_events: priority::Sender, ) -> Result<(), RuntimeError> { let nev = nev.map_err(|err| RuntimeError::FsWatcher { kind, @@ -331,7 +333,7 @@ fn process_event( trace!(event = ?ev, "processed notify event into watchexec event"); n_events - .try_send(ev) + .try_send(ev, Priority::Normal) .map_err(|err| RuntimeError::EventChannelTrySend { ctx: "fs watcher", err, diff --git a/lib/src/ignore/files.rs b/lib/src/ignore/files.rs index 92682af..9d09b10 100644 --- a/lib/src/ignore/files.rs +++ b/lib/src/ignore/files.rs @@ -474,7 +474,7 @@ impl DirTourist { pub(crate) async fn add_last_file_to_filter( &mut self, - files: &mut Vec, + files: &mut [IgnoreFile], errors: &mut Vec, ) { if let Some(ig) = files.last() { diff --git a/lib/src/ignore/filter.rs b/lib/src/ignore/filter.rs index efe7af4..5052692 100644 --- a/lib/src/ignore/filter.rs +++ b/lib/src/ignore/filter.rs @@ -10,7 +10,7 @@ use tracing::{trace, trace_span}; use crate::{ error::RuntimeError, - event::{Event, FileType}, + event::{Event, FileType, Priority}, filter::Filterer, }; @@ -259,8 +259,8 @@ impl Filterer for IgnoreFilterer { /// Filter an event. /// /// This implementation never errors. It returns `Ok(false)` if the event is ignored according - /// to the ignore files, and `Ok(true)` otherwise. - fn check_event(&self, event: &Event) -> Result { + /// to the ignore files, and `Ok(true)` otherwise. It ignores event priority. + fn check_event(&self, event: &Event, _priority: Priority) -> Result { let _span = trace_span!("filterer_check").entered(); let mut pass = true; diff --git a/lib/src/signal/source.rs b/lib/src/signal/source.rs index ac820da..8340c4c 100644 --- a/lib/src/signal/source.rs +++ b/lib/src/signal/source.rs @@ -1,11 +1,12 @@ //! Event source for signals / notifications sent to the main process. +use async_priority_channel as priority; use tokio::{select, sync::mpsc}; use tracing::{debug, trace}; use crate::{ error::{CriticalError, RuntimeError}, - event::{Event, Source, Tag}, + event::{Event, Priority, Source, Tag}, }; /// A notification sent to the main (watchexec) process. @@ -76,11 +77,12 @@ pub enum MainSignal { /// /// ```no_run /// use tokio::sync::mpsc; +/// use async_priority_channel as priority; /// use watchexec::signal::source::worker; /// /// #[tokio::main] /// async fn main() -> Result<(), Box> { -/// let (ev_s, _) = mpsc::channel(1024); +/// let (ev_s, _) = priority::bounded(1024); /// let (er_s, _) = mpsc::channel(64); /// /// worker(er_s, ev_s).await?; @@ -89,7 +91,7 @@ pub enum MainSignal { /// ``` pub async fn worker( errors: mpsc::Sender, - events: mpsc::Sender, + events: priority::Sender, ) -> Result<(), CriticalError> { imp_worker(errors, events).await } @@ -97,7 +99,7 @@ pub async fn worker( #[cfg(unix)] async fn imp_worker( errors: mpsc::Sender, - events: mpsc::Sender, + events: priority::Sender, ) -> Result<(), CriticalError> { use tokio::signal::unix::{signal, SignalKind}; @@ -137,7 +139,7 @@ async fn imp_worker( #[cfg(windows)] async fn imp_worker( errors: mpsc::Sender, - events: mpsc::Sender, + events: priority::Sender, ) -> Result<(), CriticalError> { use tokio::signal::windows::{ctrl_break, ctrl_c}; @@ -166,10 +168,9 @@ async fn imp_worker( } } -// TODO: figure out how to prioritise signals. async fn send_event( errors: mpsc::Sender, - events: mpsc::Sender, + events: priority::Sender, sig: MainSignal, ) -> Result<(), CriticalError> { let tags = vec![ @@ -187,7 +188,16 @@ async fn send_event( }; trace!(?event, "processed signal into event"); - if let Err(err) = events.send(event).await { + if let Err(err) = events + .send( + event, + match sig { + MainSignal::Interrupt | MainSignal::Terminate => Priority::Urgent, + _ => Priority::High, + }, + ) + .await + { errors .send(RuntimeError::EventChannelSend { ctx: "signals", diff --git a/lib/src/watchexec.rs b/lib/src/watchexec.rs index da6ca31..faa9063 100644 --- a/lib/src/watchexec.rs +++ b/lib/src/watchexec.rs @@ -1,17 +1,21 @@ use std::{ fmt, + future::Future, mem::{replace, take}, + ops::{Deref, DerefMut}, + pin::Pin, sync::Arc, + task::{Context, Poll}, }; +use async_priority_channel as priority; use atomic_take::AtomicTake; -use futures::FutureExt; use miette::Diagnostic; use once_cell::sync::OnceCell; use tokio::{ spawn, sync::{mpsc, watch, Notify}, - task::{JoinError, JoinHandle}, + task::JoinHandle, try_join, }; use tracing::{debug, error, trace}; @@ -20,7 +24,7 @@ use crate::{ action, config::{InitConfig, RuntimeConfig}, error::{CriticalError, ReconfigError, RuntimeError}, - event::Event, + event::{Event, Priority}, fs, handler::{rte, Handler}, signal, @@ -40,7 +44,7 @@ pub struct Watchexec { action_watch: watch::Sender, fs_watch: watch::Sender, - event_input: mpsc::Sender, + event_input: priority::Sender, } impl fmt::Debug for Watchexec { @@ -71,7 +75,7 @@ impl Watchexec { ) -> Result, CriticalError> { debug!(?init, ?runtime, pid=%std::process::id(), version=%env!("CARGO_PKG_VERSION"), "initialising"); - let (ev_s, ev_r) = mpsc::channel(init.event_channel_size); + let (ev_s, ev_r) = priority::bounded(init.event_channel_size); let (ac_s, ac_r) = watch::channel(take(&mut runtime.action)); let (fs_s, fs_r) = watch::channel(fs::WorkingData::default()); @@ -94,26 +98,23 @@ impl Watchexec { let eh = replace(&mut init.error_handler, Box::new(()) as _); - macro_rules! subtask { - ($name:ident, $task:expr) => {{ - debug!(subtask=%stringify!($name), "spawning subtask"); - spawn($task).then(|jr| async { flatten(jr) }) - }}; - } - - let action = subtask!( - action, - action::worker(ac_r, er_s.clone(), ev_s.clone(), ev_r) + let action = SubTask::spawn( + "action", + action::worker(ac_r, er_s.clone(), ev_s.clone(), ev_r), ); - let fs = subtask!(fs, fs::worker(fs_r, er_s.clone(), ev_s.clone())); - let signal = subtask!(signal, signal::source::worker(er_s.clone(), ev_s.clone())); + let fs = SubTask::spawn("fs", fs::worker(fs_r, er_s.clone(), ev_s.clone())); + let signal = + SubTask::spawn("signal", signal::source::worker(er_s.clone(), ev_s.clone())); - let error_hook = subtask!(error_hook, error_hook(er_r, eh)); + let error_hook = SubTask::spawn("error_hook", error_hook(er_r, eh)); // Use Tokio TaskSet when that lands try_join!(action, error_hook, fs, signal) .map(drop) .or_else(|e| { + // Close event channel to signal worker task to stop + ev_s.close(); + if matches!(e, CriticalError::Exit) { trace!("got graceful exit request via critical error, erasing the error"); Ok(()) @@ -152,8 +153,8 @@ impl Watchexec { /// (for example, on start). /// /// Hint: use [`Event::default()`] to send an empty event (which won't be filtered). - pub async fn send_event(&self, event: Event) -> Result<(), CriticalError> { - self.event_input.send(event).await?; + pub async fn send_event(&self, event: Event, priority: Priority) -> Result<(), CriticalError> { + self.event_input.send(event, priority).await?; Ok(()) } @@ -174,13 +175,6 @@ impl Watchexec { } } -#[inline] -fn flatten(join_res: Result, JoinError>) -> Result<(), CriticalError> { - join_res - .map_err(CriticalError::MainTaskJoin) - .and_then(|x| x) -} - async fn error_hook( mut errors: mpsc::Receiver, mut handler: Box + Send>, @@ -276,3 +270,62 @@ impl ErrorHook { .ok(); } } + +#[derive(Debug)] +struct SubTask { + name: &'static str, + handle: JoinHandle>, +} + +impl SubTask { + pub fn spawn( + name: &'static str, + task: impl Future> + Send + 'static, + ) -> Self { + debug!(subtask=%name, "spawning subtask"); + Self { + name, + handle: spawn(task), + } + } +} + +impl Drop for SubTask { + fn drop(&mut self) { + debug!(subtask=%self.name, "aborting subtask"); + self.handle.abort(); + } +} + +impl Deref for SubTask { + type Target = JoinHandle>; + + fn deref(&self) -> &Self::Target { + &self.handle + } +} + +impl DerefMut for SubTask { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.handle + } +} + +impl Future for SubTask { + type Output = Result<(), CriticalError>; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let subtask = self.name; + match Pin::new(&mut Pin::into_inner(self).handle).poll(cx) { + Poll::Pending => Poll::Pending, + Poll::Ready(join_res) => { + debug!(%subtask, "finishing subtask"); + Poll::Ready( + join_res + .map_err(CriticalError::MainTaskJoin) + .and_then(|x| x), + ) + } + } + } +} diff --git a/lib/tests/filter_globset.rs b/lib/tests/filter_globset.rs index 9644e5b..d59eed1 100644 --- a/lib/tests/filter_globset.rs +++ b/lib/tests/filter_globset.rs @@ -219,7 +219,6 @@ async fn ignore_exact_filename_in_hidden_folder() { filterer.dir_doesnt_pass("/test/.sub/Cargo.toml"); } - #[tokio::test] async fn ignore_exact_filenames_multiple() { let filterer = filt(&[], &["Cargo.toml", "package.json"], &[]).await; @@ -401,7 +400,7 @@ async fn multipath_allow_on_any_one_pass() { metadata: Default::default(), }; - assert!(filterer.check_event(&event).unwrap()); + assert!(filterer.check_event(&event, Priority::Normal).unwrap()); } #[tokio::test] @@ -451,17 +450,23 @@ async fn nonpath_event_passes() { let filterer = filt(&[], &[], &["py"]).await; assert!(filterer - .check_event(&Event { - tags: vec![Tag::Source(Source::Internal)], - metadata: Default::default(), - }) + .check_event( + &Event { + tags: vec![Tag::Source(Source::Internal)], + metadata: Default::default(), + }, + Priority::Normal + ) .unwrap()); assert!(filterer - .check_event(&Event { - tags: vec![Tag::Source(Source::Keyboard)], - metadata: Default::default(), - }) + .check_event( + &Event { + tags: vec![Tag::Source(Source::Keyboard)], + metadata: Default::default(), + }, + Priority::Normal + ) .unwrap()); } diff --git a/lib/tests/filter_tagged_nonpaths.rs b/lib/tests/filter_tagged_nonpaths.rs index 2cb42c2..5f617b4 100644 --- a/lib/tests/filter_tagged_nonpaths.rs +++ b/lib/tests/filter_tagged_nonpaths.rs @@ -426,3 +426,30 @@ async fn complete_with_any_signal() { filterer.complete_doesnt_pass(Some(ProcessEnd::Success)); filterer.complete_doesnt_pass(None); } + +#[tokio::test] +async fn priority_auto() { + let filterer = filt(&[filter("priority=normal")]).await; + + filterer.priority_doesnt_pass(Priority::Low); + filterer.priority_does_pass(Priority::Normal); + filterer.priority_doesnt_pass(Priority::High); +} + +#[tokio::test] +async fn priority_set() { + let filterer = filt(&[filter("priority:=normal,high")]).await; + + filterer.priority_doesnt_pass(Priority::Low); + filterer.priority_does_pass(Priority::Normal); + filterer.priority_does_pass(Priority::High); +} + +#[tokio::test] +async fn priority_none() { + let filterer = filt(&[]).await; + + filterer.priority_does_pass(Priority::Low); + filterer.priority_does_pass(Priority::Normal); + filterer.priority_does_pass(Priority::High); +} diff --git a/lib/tests/helpers.rs b/lib/tests/helpers/mod.rs similarity index 88% rename from lib/tests/helpers.rs rename to lib/tests/helpers/mod.rs index 0b2b3eb..fdd9710 100644 --- a/lib/tests/helpers.rs +++ b/lib/tests/helpers/mod.rs @@ -9,7 +9,7 @@ use std::{ use watchexec::{ error::RuntimeError, - event::{filekind::FileEventKind, Event, FileType, ProcessEnd, Source, Tag}, + event::{filekind::FileEventKind, Event, FileType, Priority, ProcessEnd, Source, Tag}, filter::{ globset::GlobsetFilterer, tagged::{files::FilterFile, Filter, Matcher, Op, Pattern, TaggedFilterer}, @@ -25,6 +25,7 @@ pub mod ignore { pub use super::ignore_filt as filt; pub use super::Applies; pub use super::PathHarness; + pub use watchexec::event::Priority; } pub mod globset { @@ -32,6 +33,7 @@ pub mod globset { pub use super::ig_file as file; pub use super::Applies; pub use super::PathHarness; + pub use watchexec::event::Priority; } pub mod tagged { @@ -42,6 +44,7 @@ pub mod tagged { pub use super::PathHarness; pub use super::TaggedHarness; pub use super::{filter, glob_filter, notglob_filter}; + pub use watchexec::event::Priority; } pub mod tagged_ff { @@ -61,7 +64,7 @@ pub trait PathHarness: Filterer { metadata: Default::default(), }; - self.check_event(&event) + self.check_event(&event, Priority::Normal) } fn path_pass(&self, path: &str, file_type: Option, pass: bool) { @@ -122,16 +125,35 @@ impl PathHarness for TaggedFilterer {} impl PathHarness for IgnoreFilterer {} pub trait TaggedHarness { - fn check_tag(&self, tag: Tag) -> std::result::Result; + fn check_tag(&self, tag: Tag, priority: Priority) -> std::result::Result; + + fn priority_pass(&self, priority: Priority, pass: bool) { + tracing::info!(?priority, ?pass, "check"); + + assert_eq!( + self.check_tag(Tag::Source(Source::Filesystem), priority) + .unwrap(), + pass, + "{priority:?} (expected {})", + if pass { "pass" } else { "fail" } + ); + } + + fn priority_does_pass(&self, priority: Priority) { + self.priority_pass(priority, true); + } + + fn priority_doesnt_pass(&self, priority: Priority) { + self.priority_pass(priority, false); + } fn tag_pass(&self, tag: Tag, pass: bool) { tracing::info!(?tag, ?pass, "check"); assert_eq!( - self.check_tag(tag.clone()).unwrap(), + self.check_tag(tag.clone(), Priority::Normal).unwrap(), pass, - "{:?} (expected {})", - tag, + "{tag:?} (expected {})", if pass { "pass" } else { "fail" } ); } @@ -178,13 +200,13 @@ pub trait TaggedHarness { } impl TaggedHarness for TaggedFilterer { - fn check_tag(&self, tag: Tag) -> std::result::Result { + fn check_tag(&self, tag: Tag, priority: Priority) -> std::result::Result { let event = Event { tags: vec![tag], metadata: Default::default(), }; - self.check_event(&event) + self.check_event(&event, priority) } }