<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/500bb44a1b9aefea8b1cdbee11e27ca0a44b7601">https://github.com/macports/macports-ports/commit/500bb44a1b9aefea8b1cdbee11e27ca0a44b7601</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 500bb44a1b9 watchman, edencommon: Update to 2023.11.13.00
</span>500bb44a1b9 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 500bb44a1b9aefea8b1cdbee11e27ca0a44b7601
</span>Author: Clemens Lang <cal@macports.org>
AuthorDate: Wed Nov 15 14:03:51 2023 +0100
<span style='display:block; white-space:pre;color:#404040;'> watchman, edencommon: Update to 2023.11.13.00
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Fix packaging of pywatchman and specify the watchman version number
</span><span style='display:block; white-space:pre;color:#404040;'> (which cannot be determined from git in our setup).
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Drop the first patch, which does no longer seem to be required.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Update edencommon to the same version, because the build will fail
</span><span style='display:block; white-space:pre;color:#404040;'> otherwise.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> This fixes the watchman prebuilt package, which is broken since the last
</span><span style='display:block; white-space:pre;color:#404040;'> libsodium update in 86381201edd2b233a20f15a542eae461de5eabb6 and was not
</span><span style='display:block; white-space:pre;color:#404040;'> fixed in https://github.com/macports/macports-ports/pull/20537 either.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Closes: https://trac.macports.org/ticket/65475
</span><span style='display:block; white-space:pre;color:#404040;'> Closes: https://trac.macports.org/ticket/68702
</span>---
devel/edencommon/Portfile | 10 +-
devel/edencommon/files/no-tests.diff | 25 +-
sysutils/watchman/Portfile | 166 +++---
.../files/0001-revert-optionset-move.patch | 627 ---------------------
.../watchman/files/0005-python-install-path.patch | 17 +
5 files changed, 118 insertions(+), 727 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/edencommon/Portfile b/devel/edencommon/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 51d850ae6bd..5259c173c48 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/edencommon/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/edencommon/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -13,11 +13,11 @@ legacysupport.newest_darwin_requires_legacy 10
</span>
boost.version 1.81
<span style='display:block; white-space:pre;background:#ffe0e0;'>-github.setup facebookexperimental edencommon 2023.05.15.00 v
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-revision 3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums rmd160 2c47fb75bfdcf2d0e24c7fb1266882180f85913f \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sha256 faa599ef131aaa252971f971a7dc56db297ccb62c24c462e405e162b46c6c45e \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- size 146561
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup facebookexperimental edencommon 2023.11.13.00 v
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums rmd160 e5ae41740848e5ffa2a88b65fd0f7ba11f40f778 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 9c42c126cc650107258792b773a7e3fe0fcd4190652a343f144b5d23fd7fde6e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 151898
</span>
categories devel
license BSD
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/edencommon/files/no-tests.diff b/devel/edencommon/files/no-tests.diff
</span><span style='display:block; white-space:pre;color:#808080;'>index d58c4ac8256..17b5f36165a 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/edencommon/files/no-tests.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/edencommon/files/no-tests.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,6 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git CMakeLists.txt CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -46,12 +46,6 @@ include_directories(${GLOG_INCLUDE_DIR})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./CMakeLists.txt.orig 2023-11-11 02:06:57
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./CMakeLists.txt 2023-11-15 13:09:46
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -50,11 +50,6 @@
</span> find_package(folly CONFIG REQUIRED)
include_directories(${FOLLY_INCLUDE_DIR})
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -10,16 +9,22 @@ diff --git CMakeLists.txt CMakeLists.txt
</span> -include(GoogleTest)
-enable_testing()
-
<span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_subdirectory(eden/common/os)
</span> add_subdirectory(eden/common/utils)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- # Install our own CMake package files for dependent projects.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git eden/common/utils/CMakeLists.txt eden/common/utils/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- eden/common/utils/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ eden/common/utils/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -50,5 +50,3 @@ install(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- eden/common/utils/CMakeLists.txt.orig 2023-11-11 02:06:57
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ eden/common/utils/CMakeLists.txt 2023-11-15 13:06:08
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -36,5 +36,3 @@
</span> FILES ${utils_headers}
DESTINATION ${INCLUDE_INSTALL_DIR}/eden/common/utils
)
-
-add_subdirectory(test)
<span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./eden/common/os/CMakeLists.txt.orig 2023-11-15 13:27:03
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./eden/common/os/CMakeLists.txt 2023-11-15 13:27:12
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -41,5 +41,3 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ FILES ${os_headers}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ DESTINATION ${INCLUDE_INSTALL_DIR}/eden/common/os
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-add_subdirectory(test)
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/sysutils/watchman/Portfile b/sysutils/watchman/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 17d82efeddd..6537abc9848 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/sysutils/watchman/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/sysutils/watchman/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -9,8 +9,8 @@ PortGroup compiler_blacklist_versions 1.0
</span>
boost.version 1.81
<span style='display:block; white-space:pre;background:#ffe0e0;'>-github.setup facebook watchman 2023.05.15.00 v
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-revision 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup facebook watchman 2023.11.13.00 v
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 0
</span>
categories sysutils
maintainers {danchr @danchr} openmaintainer
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -40,7 +40,8 @@ configure.args-append \
</span> -DPython3_Development_FOUND=NO \
-DBoost_INCLUDE_DIR=[boost::include_dir] \
-DWATCHMAN_STATE_DIR= \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- -DINSTALL_WATCHMAN_STATE_DIR=NO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -DINSTALL_WATCHMAN_STATE_DIR=NO \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -DWATCHMAN_VERSION_OVERRIDE=${version}
</span>
configure.env-append \
NODE_BIN= \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -48,21 +49,15 @@ configure.env-append \
</span> DESTDIR=${destroot}
patch.pre_args -p1
<span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles 0001-revert-optionset-move.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 0002-cmake-rust-build-target.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles 0002-cmake-rust-build-target.patch \
</span> 0003-no-tests.patch \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- 0004-cmake-rust-build-offline.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0004-cmake-rust-build-offline.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 0005-python-install-path.patch
</span>
post-patch {
reinplace "s,/usr/bin,${prefix}," CMakeLists.txt
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-post-destroot {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # the custom build machinery does something weird with DESTDIR and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # prefixes; just suppress the python binaries instead
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- file delete -force ${destroot}${prefix}${prefix}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> # Fix error: invalid output constraint '=@ccc' in asm
compiler.blacklist-append \
{clang < 1200}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -71,124 +66,125 @@ compiler.cxx_standard \
</span> 2017
checksums ${distname}${extract.suffix} \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- rmd160 8e29a018137fa2a90d31d42a80ba8d8bac87bd44 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sha256 99492beb2a89a22feb89336dd789938d615f5e3019143a74f325875b9058c7ae \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- size 3963951
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rmd160 82a1d48b44a4aff4a0ee8e66433f3a263a73e2c2 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 310ad46549e795038bbdaaa761b13bec1cc3aeb1973257d40ccf517cfa7ccaa8 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 3968994 \
</span>
cargo.crates \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ahash 0.8.3 2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ addr2line 0.21.0 8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ adler 1.0.2 f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ahash 0.8.6 91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a \
</span> ansi_term 0.12.1 d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- anyhow 1.0.71 9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ anyhow 1.0.72 3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854 \
</span> atty 0.2.14 d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8 \
autocfg 1.1.0 d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa \
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ backtrace 0.3.69 2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837 \
</span> bitflags 1.3.2 bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- byteorder 1.4.3 14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- bytes 1.4.0 89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ byteorder 1.5.0 1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bytes 1.5.0 a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cc 1.0.83 f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0 \
</span> cfg-if 1.0.0 baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd \
clap 2.34.0 a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c \
core-foundation-sys 0.8.4 e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa \
crossbeam 0.8.2 2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c \
crossbeam-channel 0.5.8 a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200 \
crossbeam-deque 0.8.3 ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- crossbeam-epoch 0.9.14 46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crossbeam-epoch 0.9.15 ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7 \
</span> crossbeam-queue 0.3.8 d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- crossbeam-utils 0.8.15 3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crossbeam-utils 0.8.16 5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294 \
</span> duct 0.13.6 37ae3fc31835f74c2a7ceda3aeede378b0ae2e74c8f1c36559fcc9ae2a4e7d3e \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- either 1.8.1 7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ either 1.9.0 a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07 \
</span> futures 0.1.31 3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- futures 0.3.28 23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- futures-channel 0.3.28 955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- futures-core 0.3.28 4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- futures-executor 0.3.28 ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- futures-io 0.3.28 4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- futures-macro 0.3.28 89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- futures-sink 0.3.28 f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- futures-task 0.3.28 76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- futures-util 0.3.28 26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- getrandom 0.2.9 c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ futures 0.3.29 da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ futures-channel 0.3.29 ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ futures-core 0.3.29 eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ futures-executor 0.3.29 0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ futures-io 0.3.29 8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ futures-macro 0.3.29 53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ futures-sink 0.3.29 e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ futures-task 0.3.29 efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ futures-util 0.3.29 a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ getrandom 0.2.11 fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ gimli 0.28.0 6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0 \
</span> heck 0.3.3 6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c \
hermit-abi 0.1.19 62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- hermit-abi 0.2.6 ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- itoa 1.0.6 453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ hermit-abi 0.3.3 d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ itoa 1.0.9 af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38 \
</span> jwalk 0.6.2 5dbcda57db8b6dc067e589628b7348639014e793d9e8137d8cf215e8b133a0bd \
lazy_static 1.4.0 e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- libc 0.2.144 2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- lock_api 0.4.9 435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- log 0.4.17 abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ libc 0.2.150 89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lock_api 0.4.11 3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ log 0.4.20 b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f \
</span> maplit 1.0.2 3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- memchr 2.5.0 2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memchr 2.6.4 f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167 \
</span> memoffset 0.6.5 5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- memoffset 0.8.0 d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mio 0.8.6 5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ memoffset 0.9.0 5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ miniz_oxide 0.7.1 e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mio 0.8.9 3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0 \
</span> nix 0.25.1 f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4 \
ntapi 0.4.1 e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- num_cpus 1.15.0 0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- once_cell 1.17.1 b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ num_cpus 1.16.0 4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ object 0.32.1 9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ once_cell 1.18.0 dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d \
</span> os_pipe 1.1.4 0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177 \
parking_lot 0.12.1 3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- parking_lot_core 0.9.7 9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- pin-project-lite 0.2.9 e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ parking_lot_core 0.9.9 4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pin-project-lite 0.2.13 8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58 \
</span> pin-utils 0.1.0 8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184 \
proc-macro-error 1.0.4 da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c \
proc-macro-error-attr 1.0.4 a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- proc-macro2 1.0.57 c4ec6d5fe0b140acb27c9a0444118cf55bfbb4e0b259739429abb4521dd67c16 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- quote 1.0.27 8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- rayon 1.7.0 1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- rayon-core 1.11.0 4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- redox_syscall 0.2.16 fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ryu 1.0.13 f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- scopeguard 1.1.0 d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- serde 1.0.163 2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- serde_bytes 0.11.9 416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- serde_derive 1.0.163 8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- serde_json 1.0.96 057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ proc-macro2 1.0.69 134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ quote 1.0.33 5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rayon 1.8.0 9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rayon-core 1.12.0 5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ redox_syscall 0.4.1 4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rustc-demangle 0.1.23 d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ryu 1.0.15 1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ scopeguard 1.2.0 94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ serde 1.0.192 bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ serde_bytes 0.11.12 ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ serde_derive 1.0.192 d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ serde_json 1.0.108 3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b \
</span> shared_child 1.0.0 b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef \
signal-hook-registry 1.4.1 d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- slab 0.4.8 6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- smallvec 1.10.0 a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- socket2 0.4.9 64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ slab 0.4.9 8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ smallvec 1.11.2 4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ socket2 0.5.5 7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9 \
</span> strsim 0.8.0 8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a \
structopt 0.3.26 0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10 \
structopt-derive 0.4.18 dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0 \
syn 1.0.109 72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- syn 2.0.16 a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ syn 2.0.39 23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a \
</span> sysinfo 0.26.9 5c18a6156d1f27a9592ee18c1a846ca8dd5c258b7179fc193ae87c74ebb666f5 \
tabular 0.2.0 d9a2882c514780a1973df90de9d68adcd8871bacc9a6331c3f28e6d2ff91a3d1 \
textwrap 0.11.0 d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- thiserror 1.0.40 978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- thiserror-impl 1.0.40 f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tokio 1.28.1 0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tokio-macros 2.1.0 630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ thiserror 1.0.50 f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ thiserror-impl 1.0.50 266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tokio 1.34.0 d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tokio-macros 2.2.0 5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b \
</span> tokio-util 0.6.10 36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- tracing 0.1.37 8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tracing-core 0.1.31 0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- unicode-ident 1.0.8 e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tracing 0.1.40 c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tracing-core 0.1.32 c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unicode-ident 1.0.12 3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b \
</span> unicode-segmentation 1.10.1 1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- unicode-width 0.1.10 c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unicode-width 0.1.11 e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85 \
</span> vec_map 0.8.2 f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191 \
version_check 0.9.4 49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- wasi 0.11.0+wasi-snapshot-preview1 9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ wasi 0.11.0+wasi-snapshot-preview1 9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423 \
</span> winapi 0.3.9 5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419 \
winapi-i686-pc-windows-gnu 0.4.0 ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6 \
winapi-x86_64-pc-windows-gnu 0.4.0 712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- windows-sys 0.45.0 75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0 \
</span> windows-sys 0.48.0 677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- windows-targets 0.42.2 8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows-targets 0.48.0 7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_aarch64_gnullvm 0.42.2 597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_aarch64_gnullvm 0.48.0 91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_aarch64_msvc 0.42.2 e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_aarch64_msvc 0.48.0 b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_i686_gnu 0.42.2 c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_i686_gnu 0.48.0 622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_i686_msvc 0.42.2 44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_i686_msvc 0.48.0 4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_x86_64_gnu 0.42.2 8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_x86_64_gnu 0.48.0 ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_x86_64_gnullvm 0.42.2 26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_x86_64_gnullvm 0.48.0 7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_x86_64_msvc 0.42.2 9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- windows_x86_64_msvc 0.48.0 1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ windows-targets 0.48.5 9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ windows_aarch64_gnullvm 0.48.5 2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ windows_aarch64_msvc 0.48.5 dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ windows_i686_gnu 0.48.5 a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ windows_i686_msvc 0.48.5 8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ windows_x86_64_gnu 0.48.5 53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ windows_x86_64_gnullvm 0.48.5 0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ windows_x86_64_msvc 0.48.5 ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ zerocopy 0.7.26 e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ zerocopy-derive 0.7.26 dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f
</span>
cmake.generator Ninja
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/sysutils/watchman/files/0001-revert-optionset-move.patch b/sysutils/watchman/files/0001-revert-optionset-move.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index fc71065596d..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/sysutils/watchman/files/0001-revert-optionset-move.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,627 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From c92684a617284e628ad2c748051b1fbdc2ea0755 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: Sergey Fedorov <vital.had@gmail.com>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Tue, 31 Jan 2023 02:45:22 +0800
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 1/3] revert optionset move
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- CMakeLists.txt | 9 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- build/fbcode_builder/manifests/watchman | 4 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- watchman/Client.cpp | 23 +--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- watchman/Client.h | 22 ---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- watchman/CommandRegistry.h | 4 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- watchman/OptionSet.h | 207 ++++++++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- watchman/PendingCollection.h | 4 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- watchman/cmds/debug.cpp | 40 +----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- watchman/test/OptionSetTest.cpp | 90 +++++++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 9 files changed, 308 insertions(+), 95 deletions(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 watchman/OptionSet.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 watchman/test/OptionSetTest.cpp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/CMakeLists.txt b/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 850ebdc4d..97671a487 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -342,7 +342,6 @@ find_package(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- find_package(LibEvent REQUIRED)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- get_filename_component(LIBEVENT_LIBDIR "${LIBEVENT_LIB}" DIRECTORY)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- link_directories(${LIBEVENT_LIBDIR})
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--find_package(edencommon CONFIG REQUIRED)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- find_package(fmt CONFIG REQUIRED)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- find_package(folly CONFIG REQUIRED)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -352,6 +351,7 @@ if (ENABLE_EDEN_SUPPORT)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- find_package(FBThrift CONFIG REQUIRED)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- find_package(fb303 CONFIG REQUIRED)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- find_package(cpptoml CONFIG REQUIRED)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ find_package(edencommon CONFIG REQUIRED)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- include_directories(${FB303_INCLUDE_DIR})
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- endif()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if(DEFINED ENV{NODE_BIN})
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -455,7 +455,6 @@ target_link_libraries(third_party_deps INTERFACE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- gflags
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ${Boost_LIBRARIES}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- fmt::fmt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- edencommon::edencommon_utils
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- target_include_directories(third_party_deps INTERFACE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ${FOLLY_INCLUDE_DIR}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -464,12 +463,11 @@ target_include_directories(third_party_deps INTERFACE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ${Boost_INCLUDE_DIRS}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (ENABLE_EDEN_SUPPORT)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- target_link_libraries(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- third_party_deps
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- INTERFACE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ target_link_libraries(third_party_deps INTERFACE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ${YARPL_LIBRARIES}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- FBThrift::thriftcpp2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- cpptoml
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ edencommon::edencommon_utils
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- endif()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if(PCRE2_FOUND)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -774,6 +772,7 @@ t_test(ignore watchman/test/BserTest.cpp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #t_test(inmemoryview watchman/test/InMemoryViewTest.cpp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- t_test(log watchman/test/LogTest.cpp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- t_test(maputil watchman/test/MapUtilTest.cpp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+t_test(optionset watchman/test/OptionSetTest.cpp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- t_test(pendingcollection watchman/test/PendingCollectionTest.cpp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Linking this test needs the targets graph to be cleaned up.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #t_test(perfsample watchman/test/PerfSampleTest.cpp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/build/fbcode_builder/manifests/watchman b/build/fbcode_builder/manifests/watchman
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index b733a0c09..d50eafd45 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/build/fbcode_builder/manifests/watchman
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/build/fbcode_builder/manifests/watchman
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -13,7 +13,6 @@ builder = cmake
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- [dependencies]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- boost
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- cpptoml
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--edencommon
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- fb303
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- fbthrift
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- folly
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -26,13 +25,12 @@ rust
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- [shipit.pathmap]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- fbcode/watchman = watchman
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- fbcode/watchman/oss = .
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--fbcode/eden/fs = eden/fs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- [shipit.strip]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ^fbcode/eden/fs/(?!.*\.thrift|service/shipit_test_file\.txt)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- [cmake.defines.fb=on]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--ENABLE_EDEN_SUPPORT=ON
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ENABLE_EDEN_SUPPORT=OFF
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- IS_FB_BUILD=ON
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # FB macos specific settings
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/watchman/Client.cpp b/watchman/Client.cpp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 10ef94397..568045756 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/watchman/Client.cpp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/watchman/Client.cpp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -23,17 +23,6 @@ namespace watchman {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- namespace {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--using namespace facebook::eden;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--ProcessNameCache& getProcessNameCache() {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- static auto* pnc = new ProcessNameCache;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return *pnc;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--ProcessNameHandle lookupProcessName(pid_t pid) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return getProcessNameCache().lookup(pid);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- constexpr size_t kResponseLogLimit = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- folly::Synchronized<std::unordered_set<UserClient*>> clients;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -220,10 +209,7 @@ void UserClient::create(std::unique_ptr<watchman_stream> stm) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- UserClient::UserClient(PrivateBadge, std::unique_ptr<watchman_stream> stm)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- : Client{std::move(stm)},
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- since_{std::chrono::system_clock::now()},
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- peerPid_{this->stm->getPeerProcessID()},
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- peerName_{lookupProcessName(peerPid_)} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ : Client(std::move(stm)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- clients.wlock()->insert(this);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -260,13 +246,6 @@ std::vector<ClientDebugStatus> UserClient::getStatusForAllClients() {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ClientDebugStatus UserClient::getDebugStatus() const {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ClientDebugStatus rv;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- rv.state = status_.getName();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (peerPid_) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- rv.peer.emplace();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- rv.peer->pid = peerPid_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- // May briefly, once, block on the ProcessNameCache thread.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- rv.peer->name = peerName_.get();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- rv.since = std::chrono::system_clock::to_time_t(since_);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return rv;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/watchman/Client.h b/watchman/Client.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index da19a9670..70fcad348 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/watchman/Client.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/watchman/Client.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -7,10 +7,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #pragma once
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#include <eden/common/utils/ProcessNameCache.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <fmt/core.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#include <chrono>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <deque>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <unordered_map>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -159,27 +156,12 @@ class ClientStatus {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- std::atomic<State> state_{THREAD_STARTING};
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--struct PeerInfo : serde::Object {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- int32_t pid;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- std::string name;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- template <typename X>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- void map(X& x) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- x("pid", pid);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- x("name", name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--};
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- struct ClientDebugStatus : serde::Object {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- std::string state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- std::optional<PeerInfo> peer;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- std::optional<int64_t> since;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- template <typename X>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void map(X& x) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- x("state", state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- x("peer", peer);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- x("since", since);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -234,10 +216,6 @@ class UserClient final : public Client {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void clientThread() noexcept;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- const std::chrono::system_clock::time_point since_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- const pid_t peerPid_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- const facebook::eden::ProcessNameHandle peerName_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ClientStatus status_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/watchman/CommandRegistry.h b/watchman/CommandRegistry.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index e0915449f..465a2c4ca 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/watchman/CommandRegistry.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/watchman/CommandRegistry.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -12,7 +12,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // TODO: We could avoid the Client dependency fi CommandHandler returned a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // json_ref response or error rather than taking a Client.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#include "eden/common/utils/OptionSet.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "watchman/OptionSet.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "watchman/Serde.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "watchman/thirdparty/jansson/jansson.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "watchman/watchman_preprocessor.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -101,7 +101,7 @@ using CommandHandler =
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- using ResultPrinter = void (*)(const json_ref& result);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--struct CommandFlags : facebook::eden::OptionSet<CommandFlags, uint8_t> {};
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+struct CommandFlags : OptionSet<CommandFlags, uint8_t> {};
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- inline constexpr auto CMD_DAEMON = CommandFlags::raw(1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- inline constexpr auto CMD_CLIENT = CommandFlags::raw(2);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/watchman/OptionSet.h b/watchman/OptionSet.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-new file mode 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 000000000..976f128ad
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/watchman/OptionSet.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,207 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Copyright (c) Meta Platforms, Inc. and affiliates.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * This source code is licensed under the MIT license found
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * in the LICENSE file in the root directory of this source tree.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#pragma once
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <assert.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <string.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <initializer_list>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <iosfwd>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <string>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <string_view>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <utility>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+namespace watchman {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Typed wrapper around bit sets. Inspired by Swift's OptionSet.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * See OptionSetTest.cpp for example usage.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+template <typename Derived, typename Underlying>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+class OptionSet {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ static_assert(std::is_integral_v<Underlying>);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ using zero_t = struct zero_t***;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ public:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ using UnderlyingType = Underlying;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ using NameTable = std::initializer_list<std::pair<Derived, std::string_view>>;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ constexpr OptionSet() = default;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Allows initialization from literal 0.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* implicit */ constexpr OptionSet(zero_t) {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ///* implicit */ constexpr OptionSet(Derived v) : value_{v.value_} {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* implicit */ constexpr OptionSet(std::initializer_list<Derived> args) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ for (Derived v : args) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ value_ |= v;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ constexpr static Derived raw(Underlying raw) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Derived d;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ d.value_ = raw;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return d;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ explicit operator bool() const {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return value_ != 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Returns the raw bits.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Underlying asRaw() const {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return value_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Returns true if every bit in `set` is set here too.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Alias for `containsAllOf`.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ bool contains(Derived set) const {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return containsAllOf(set);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Returns true if every bit in `set` is set here too.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ bool containsAllOf(Derived set) const {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return (value_ & set.value_) == set.value_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Returns true if any bit in `set` in set here too.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ bool containsAnyOf(Derived set) const {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return (value_ & set.value_) != 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Returns true if all bits in `set` are unset here.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ bool containsNoneOf(Derived set) const {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return (value_ & set.value_) == 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Returns true if no bits are set.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ bool empty() const {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return value_ == 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Turns on the specified bits.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ void set(Derived set) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ value_ |= set.value_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Clears the specified bits.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ void clear(Derived set) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ value_ &= ~set.value_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Returns a space-delimited string representing the names of each set bit.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * The name mapping is defined by `Derived::table`.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ std::string format() const {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // TODO: It might be nice to move the implementation of this function behind
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // a template on Raw to reduce the number of possible expansions. That would
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // require some sort of constexpr mapping from Derived onto Raw. Perhaps
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // that's as easy as asserting they have the same representation and casting
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // pointers.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ constexpr const NameTable& table = Derived::table;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (empty() || std::empty(table)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return {};
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // Precompute the length to avoid multiple allocations.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ size_t length = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ for (auto [bit, name] : table) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // TODO: Should this assert bits are exact powers of two?
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (containsAllOf(bit)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (length) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ length++;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ length += name.size();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ std::string result(length, 0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char* p = result.data();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ for (auto [bit, name] : table) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (containsAllOf(bit)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (p != result.data()) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *p++ = ' ';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ memcpy(p, name.data(), name.size());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ p += name.size();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ assert(static_cast<size_t>(p - result.data()) == length);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return result;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ template <typename... A>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ friend std::basic_ostream<A...>& operator<<(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ std::basic_ostream<A...>& out,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ const OptionSet& opts) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return out << opts.format();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Derived& operator|=(Derived that) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ value_ |= that.value_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return static_cast<Derived&>(*this);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Derived& operator&=(Derived that) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ value_ &= that.value_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return static_cast<Derived&>(*this);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Returns the union of both sets.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ constexpr friend Derived operator|(Derived lhs, Derived rhs) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return raw(lhs.value_ | rhs.value_);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /**
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Returns the intersection of both sets.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ constexpr friend Derived operator&(Derived lhs, Derived rhs) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return raw(lhs.value_ & rhs.value_);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ constexpr friend bool operator==(Derived lhs, Derived rhs) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return lhs.value_ == rhs.value_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ constexpr friend bool operator!=(Derived lhs, Derived rhs) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return lhs.value_ != rhs.value_;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ private:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Underlying value_{};
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+};
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+} // namespace watchman
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/watchman/PendingCollection.h b/watchman/PendingCollection.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 2dd43af8f..47617cd58 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/watchman/PendingCollection.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/watchman/PendingCollection.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -11,7 +11,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <folly/futures/Promise.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <chrono>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <condition_variable>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#include "eden/common/utils/OptionSet.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "watchman/OptionSet.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "watchman/thirdparty/libart/src/art.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "watchman/watchman_string.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -19,7 +19,7 @@ struct watchman_dir;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- namespace watchman {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--struct PendingFlags : facebook::eden::OptionSet<PendingFlags, uint8_t> {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+struct PendingFlags : OptionSet<PendingFlags, uint8_t> {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- using OptionSet::OptionSet;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static const NameTable table;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/watchman/cmds/debug.cpp b/watchman/cmds/debug.cpp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 9042616b1..e5e39e641 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/watchman/cmds/debug.cpp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/watchman/cmds/debug.cpp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -7,11 +7,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <unordered_map>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#include <fmt/chrono.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#include <folly/String.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <folly/chrono/Conv.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#include <folly/system/Shell.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "watchman/Client.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "watchman/InMemoryView.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -263,28 +259,6 @@ W_CMD_REG(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- CMD_DAEMON,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- w_cmd_realpath_root);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--namespace {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--std::string shellQuoteCommand(std::string_view command) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- std::vector<std::string> argv;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- folly::split('\0', command, argv);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- // Every argument in a command line is null-terminated. Remove the last, empty
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- // argument.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (argv.size() && argv.back().empty()) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- argv.pop_back();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- for (auto& arg : argv) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- // TODO: shellQuote is not particularly good. It always brackets with ' and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- // does not handle non-printable characters. We should write our own.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- arg = folly::shellQuote(arg);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return folly::join(' ', argv);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--} // namespace
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- struct DebugStatusCommand : PrettyCommand<DebugStatusCommand> {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static constexpr std::string_view name = "debug-status";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -331,25 +305,13 @@ struct DebugStatusCommand : PrettyCommand<DebugStatusCommand> {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- fmt::print("CLIENTS\n-------\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- for (auto& client : response.clients) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (client.peer) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- fmt::print(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- "{}: {}\n", client.peer->pid, shellQuoteCommand(client.peer->name));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- fmt::print("unknown peer\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (client.since) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- fmt::print(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- " - since: {}\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- std::chrono::system_clock::from_time_t(client.since.value()));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- fmt::print(" - state: {}\n", client.state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- fmt::print("\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // fmt does not flush, so when the stream is not line buffered the stream
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // needs to be manually flushed (or else nothing is written to stdout).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // eventually this can be fmt::flush instead:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // https://github.com/vgc/vgc/issues/519
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- // TODO(T136788014): why doesn't macOS do this for us.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // TODO (T136788014): why doesn't macOS do this for us.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- fflush(stdout);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/watchman/test/OptionSetTest.cpp b/watchman/test/OptionSetTest.cpp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-new file mode 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 000000000..ede31d735
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/watchman/test/OptionSetTest.cpp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,90 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Copyright (c) Meta Platforms, Inc. and affiliates.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * This source code is licensed under the MIT license found
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * in the LICENSE file in the root directory of this source tree.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "watchman/OptionSet.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <folly/portability/GTest.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+using namespace watchman;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+namespace {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+struct ColorSet : OptionSet<ColorSet, uint8_t> {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ using OptionSet::OptionSet;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ static const NameTable table;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+};
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+constexpr inline auto CM_RED = ColorSet::raw(1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+constexpr inline auto CM_GREEN = ColorSet::raw(2);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+constexpr inline auto CM_BLUE = ColorSet::raw(4);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+const ColorSet::NameTable ColorSet::table = {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ {CM_RED, "RED"},
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ {CM_GREEN, "GREEN"},
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ {CM_BLUE, "BLUE"},
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+};
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+} // namespace
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+TEST(OptionSet, initialization_from_zero) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ColorSet set = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ set = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // Does not compile:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // set = 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // Does not compile:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // int i = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // set = i;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+TEST(OptionSet, default_is_empty) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ColorSet set;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_FALSE(set);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+TEST(OptionSet, assignment_operators) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ColorSet set;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ set |= CM_RED;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_EQ(CM_RED, set);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ set &= CM_GREEN;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_EQ(ColorSet{}, set);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+TEST(OptionSet, format) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_EQ("", ColorSet{}.format());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_EQ("RED", CM_RED.format());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_EQ("GREEN", CM_GREEN.format());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_EQ("BLUE", CM_BLUE.format());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_EQ("RED GREEN", (CM_RED | CM_GREEN).format());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_EQ("GREEN BLUE", (CM_GREEN | CM_BLUE).format());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_EQ("RED GREEN BLUE", (CM_RED | CM_GREEN | CM_BLUE).format());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+TEST(OptionSet, containsAllOf) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_TRUE((CM_RED | CM_GREEN).contains(CM_RED));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_FALSE((CM_RED | CM_GREEN).contains(CM_BLUE));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_FALSE((CM_RED | CM_GREEN).contains(CM_RED | CM_BLUE));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_TRUE((CM_RED | CM_GREEN).containsAllOf(CM_RED));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_FALSE((CM_RED | CM_GREEN).containsAllOf(CM_BLUE));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_FALSE((CM_RED | CM_GREEN).containsAllOf(CM_RED | CM_BLUE));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+TEST(OptionSet, intersect) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_FALSE(CM_RED & CM_BLUE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_EQ(CM_GREEN, (CM_RED | CM_GREEN) & (CM_GREEN | CM_BLUE));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+TEST(OptionSet, containsAnyOf) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_TRUE((CM_RED | CM_GREEN).containsAnyOf(CM_GREEN | CM_BLUE));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_FALSE((CM_RED | CM_GREEN).containsAnyOf(CM_BLUE));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+TEST(OptionSet, containsNoneOf) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_FALSE((CM_RED | CM_GREEN).containsNoneOf(CM_GREEN | CM_BLUE));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EXPECT_TRUE(CM_RED.containsNoneOf(CM_GREEN | CM_BLUE));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.39.1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/sysutils/watchman/files/0005-python-install-path.patch b/sysutils/watchman/files/0005-python-install-path.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..01e1e672109
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/sysutils/watchman/files/0005-python-install-path.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CMakeLists.txt: Fix Python install path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+It seems Python already prepends MacPorts' install prefix by default, so
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+there's no need to add ${CMAKE_INSTALL_PREFIX} a second time.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Upstream-Status: Inappropriate [configuration]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./CMakeLists.txt.orig 2023-11-15 13:44:07
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./CMakeLists.txt 2023-11-15 13:44:39
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -409,7 +409,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${CMAKE_COMMAND} -E env
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${Python3_EXECUTABLE} ${SETUP_PY} install
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- --root $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ --root $ENV{DESTDIR}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ RESULT_VARIABLE STATUS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (NOT STATUS STREQUAL 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ message(FATAL_ERROR \"pywatchman install failed\")
</span></pre><pre style='margin:0'>
</pre>