Full Code of facebook/watchman for AI

main 540e6b036a23 cached
896 files
9.5 MB
2.5M tokens
3953 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (10,093K chars total). Download the full file to get everything.
Repository: facebook/watchman
Branch: main
Commit: 540e6b036a23
Files: 896
Total size: 9.5 MB

Directory structure:
gitextract_tb73yhxd/

├── .gitattributes
├── .github/
│   └── workflows/
│       ├── generate-release-yml.rs
│       ├── getdeps_linux.yml
│       ├── getdeps_mac.yml
│       ├── getdeps_windows.yml
│       ├── package.yml
│       ├── release.yml
│       └── release.yml.in
├── .gitignore
├── CMakeLists.txt
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.markdown
├── autogen.cmd
├── autogen.sh
├── build/
│   ├── deps/
│   │   └── github_hashes/
│   │       ├── facebook/
│   │       │   ├── fb303-rev.txt
│   │       │   ├── fbthrift-rev.txt
│   │       │   ├── folly-rev.txt
│   │       │   ├── mvfst-rev.txt
│   │       │   └── wangle-rev.txt
│   │       ├── facebookexperimental/
│   │       │   └── edencommon-rev.txt
│   │       └── facebookincubator/
│   │           └── fizz-rev.txt
│   └── fbcode_builder/
│       ├── .gitignore
│       ├── CMake/
│       │   ├── FBBuildOptions.cmake
│       │   ├── FBCMakeParseArgs.cmake
│       │   ├── FBCompilerSettings.cmake
│       │   ├── FBCompilerSettingsMSVC.cmake
│       │   ├── FBCompilerSettingsUnix.cmake
│       │   ├── FBPythonBinary.cmake
│       │   ├── FBPythonTestAddTests.cmake
│       │   ├── FBThriftCppLibrary.cmake
│       │   ├── FBThriftLibrary.cmake
│       │   ├── FBThriftPyLibrary.cmake
│       │   ├── FindCares.cmake
│       │   ├── FindDoubleConversion.cmake
│       │   ├── FindGMock.cmake
│       │   ├── FindGflags.cmake
│       │   ├── FindGlog.cmake
│       │   ├── FindLMDB.cmake
│       │   ├── FindLibEvent.cmake
│       │   ├── FindLibUnwind.cmake
│       │   ├── FindLibiberty.cmake
│       │   ├── FindPCRE.cmake
│       │   ├── FindPCRE2.cmake
│       │   ├── FindRe2.cmake
│       │   ├── FindSodium.cmake
│       │   ├── FindXxhash.cmake
│       │   ├── FindZstd.cmake
│       │   ├── Findibverbs.cmake
│       │   ├── RustStaticLibrary.cmake
│       │   ├── fb_py_test_main.py
│       │   ├── fb_py_win_main.c
│       │   └── make_fbpy_archive.py
│       ├── LICENSE
│       ├── README.md
│       ├── getdeps/
│       │   ├── __init__.py
│       │   ├── builder.py
│       │   ├── buildopts.py
│       │   ├── cache.py
│       │   ├── cargo.py
│       │   ├── copytree.py
│       │   ├── dyndeps.py
│       │   ├── envfuncs.py
│       │   ├── errors.py
│       │   ├── expr.py
│       │   ├── fetcher.py
│       │   ├── include_rewriter.py
│       │   ├── load.py
│       │   ├── manifest.py
│       │   ├── platform.py
│       │   ├── py_wheel_builder.py
│       │   ├── runcmd.py
│       │   ├── subcmd.py
│       │   └── test/
│       │       ├── expr_test.py
│       │       ├── fixtures/
│       │       │   └── duplicate/
│       │       │       ├── foo
│       │       │       └── subdir/
│       │       │           └── foo
│       │       ├── manifest_test.py
│       │       ├── platform_test.py
│       │       ├── retry_test.py
│       │       ├── scratch_test.py
│       │       └── strip_marker_test.py
│       ├── getdeps.py
│       ├── manifests/
│       │   ├── CLI11
│       │   ├── autoconf
│       │   ├── automake
│       │   ├── benchmark
│       │   ├── blake3
│       │   ├── boost
│       │   ├── boost-python
│       │   ├── bz2
│       │   ├── c-ares
│       │   ├── cabal
│       │   ├── cachelib
│       │   ├── cinderx-3_14
│       │   ├── cinderx-main
│       │   ├── clang
│       │   ├── clang19
│       │   ├── cmake
│       │   ├── cpptoml
│       │   ├── double-conversion
│       │   ├── double-conversion-python
│       │   ├── eden
│       │   ├── edencommon
│       │   ├── exprtk
│       │   ├── fast_float
│       │   ├── fatal
│       │   ├── fb303
│       │   ├── fboss
│       │   ├── fbthrift
│       │   ├── fbthrift-python
│       │   ├── fizz
│       │   ├── fizz-python
│       │   ├── fmt
│       │   ├── fmt-python
│       │   ├── folly
│       │   ├── folly-python
│       │   ├── gcc12
│       │   ├── gcc14
│       │   ├── gflags
│       │   ├── ghc
│       │   ├── git-lfs
│       │   ├── glean
│       │   ├── glog
│       │   ├── googletest
│       │   ├── gperf
│       │   ├── hexdump
│       │   ├── hsthrift
│       │   ├── iproute2
│       │   ├── jom
│       │   ├── jq
│       │   ├── katran
│       │   ├── libaio
│       │   ├── libaio-python
│       │   ├── libbpf
│       │   ├── libcurl
│       │   ├── libdwarf
│       │   ├── libdwarf-python
│       │   ├── libelf
│       │   ├── libevent
│       │   ├── libevent-python
│       │   ├── libffi
│       │   ├── libgit2
│       │   ├── libgpiod
│       │   ├── libiberty
│       │   ├── libiberty-python
│       │   ├── libibverbs
│       │   ├── libmnl
│       │   ├── libnl
│       │   ├── liboqs
│       │   ├── libsai
│       │   ├── libsodium
│       │   ├── libunwind
│       │   ├── libusb
│       │   ├── libyaml
│       │   ├── llvm
│       │   ├── lmdb
│       │   ├── lz4
│       │   ├── lz4-python
│       │   ├── magic_enum
│       │   ├── mcrouter
│       │   ├── mononoke
│       │   ├── mononoke_integration
│       │   ├── moxygen
│       │   ├── mvfst
│       │   ├── mvfst-python
│       │   ├── ncurses
│       │   ├── nghttp2
│       │   ├── ninja
│       │   ├── nlohmann-json
│       │   ├── nmap
│       │   ├── numa
│       │   ├── openr
│       │   ├── openssl
│       │   ├── osxfuse
│       │   ├── patchelf
│       │   ├── pcre2
│       │   ├── perl
│       │   ├── pexpect
│       │   ├── proxygen
│       │   ├── python
│       │   ├── python-3_14
│       │   ├── python-click
│       │   ├── python-filelock
│       │   ├── python-main
│       │   ├── python-psutil
│       │   ├── python-ptyprocess
│       │   ├── python-pyyaml
│       │   ├── python-setuptools
│       │   ├── python-setuptools-69
│       │   ├── python-six
│       │   ├── python-toml
│       │   ├── ragel
│       │   ├── range-v3
│       │   ├── rdma-core
│       │   ├── re2
│       │   ├── rebalancer
│       │   ├── ripgrep
│       │   ├── rocksdb
│       │   ├── rust-shed
│       │   ├── sapling
│       │   ├── snappy
│       │   ├── sparsemap
│       │   ├── sqlite3
│       │   ├── systemd
│       │   ├── tabulate
│       │   ├── tree
│       │   ├── wangle
│       │   ├── wangle-python
│       │   ├── watchman
│       │   ├── xxhash
│       │   ├── xz
│       │   ├── yaml-cpp
│       │   ├── zlib
│       │   ├── zlib-python
│       │   ├── zstd
│       │   └── zstd-python
│       └── patches/
│           ├── boost_1_83_0.patch
│           ├── iproute2_oss.patch
│           ├── libiberty_install_pic_lib.patch
│           └── zlib_dont_build_more_than_needed.patch
├── clippy.toml
├── install-system-packages.sh
├── run-tests.sh
├── rustfmt.toml
├── watchman/
│   ├── .clang-format
│   ├── .clang-tidy
│   ├── .codex/
│   │   └── AGENTS.md
│   ├── .llms/
│   │   └── rules/
│   │       └── AGENTS.md
│   ├── .projectid
│   ├── BUCK
│   ├── ChildProcess.cpp
│   ├── ChildProcess.h
│   ├── Client.cpp
│   ├── Client.h
│   ├── ClientContext.h
│   ├── Clock.cpp
│   ├── Clock.h
│   ├── Command.cpp
│   ├── Command.h
│   ├── CommandRegistry.cpp
│   ├── CommandRegistry.h
│   ├── Connect.cpp
│   ├── Connect.h
│   ├── Constants.h
│   ├── ContentHash.cpp
│   ├── ContentHash.h
│   ├── Cookie.h
│   ├── CookieSync.cpp
│   ├── CookieSync.h
│   ├── Errors.cpp
│   ├── Errors.h
│   ├── FlagMap.cpp
│   ├── FlagMap.h
│   ├── GroupLookup.cpp
│   ├── GroupLookup.h
│   ├── Hash.h
│   ├── IgnoreSet.cpp
│   ├── IgnoreSet.h
│   ├── InMemoryView.cpp
│   ├── InMemoryView.h
│   ├── LRUCache.h
│   ├── LogConfig.cpp
│   ├── LogConfig.h
│   ├── Logging.cpp
│   ├── Logging.h
│   ├── MapUtil.h
│   ├── Options.cpp
│   ├── Options.h
│   ├── PDU.cpp
│   ├── PDU.h
│   ├── PathUtils.cpp
│   ├── PathUtils.h
│   ├── PendingCollection.cpp
│   ├── PendingCollection.h
│   ├── PerfSample.cpp
│   ├── PerfSample.h
│   ├── Poison.cpp
│   ├── Poison.h
│   ├── ProcessLock.cpp
│   ├── ProcessLock.h
│   ├── ProcessUtil.cpp
│   ├── ProcessUtil.h
│   ├── PubSub.cpp
│   ├── PubSub.h
│   ├── QueryableView.cpp
│   ├── QueryableView.h
│   ├── Result.h
│   ├── RingBuffer.h
│   ├── SanityCheck.cpp
│   ├── SanityCheck.h
│   ├── Serde.h
│   ├── Shutdown.cpp
│   ├── Shutdown.h
│   ├── SignalHandler.cpp
│   ├── SignalHandler.h
│   ├── SymlinkTargets.cpp
│   ├── SymlinkTargets.h
│   ├── ThreadPool.cpp
│   ├── ThreadPool.h
│   ├── TriggerCommand.cpp
│   ├── TriggerCommand.h
│   ├── UserDir.cpp
│   ├── UserDir.h
│   ├── WatchmanConfig.cpp
│   ├── WatchmanConfig.h
│   ├── XattrUtils.cpp
│   ├── XattrUtils.h
│   ├── benchmarks/
│   │   ├── BUCK
│   │   ├── bser.cpp
│   │   └── string.cpp
│   ├── bser.cpp
│   ├── bser.h
│   ├── build/
│   │   ├── package/
│   │   │   ├── fedora-env/
│   │   │   │   └── Dockerfile
│   │   │   ├── make-deb.sh
│   │   │   ├── make-packages.sh
│   │   │   ├── make-rpm.sh
│   │   │   ├── substcontrol.py
│   │   │   ├── ubuntu-env/
│   │   │   │   └── Dockerfile
│   │   │   ├── watchman-build/
│   │   │   │   └── Dockerfile
│   │   │   ├── watchman-deb/
│   │   │   │   ├── DEBIAN/
│   │   │   │   │   ├── control
│   │   │   │   │   └── postinst
│   │   │   │   ├── Dockerfile
│   │   │   │   └── make-deb.sh
│   │   │   └── watchman.spec
│   │   └── vagrant/
│   │       ├── .gitignore
│   │       ├── README.md
│   │       └── Vagrantfile
│   ├── cli/
│   │   ├── BUCK
│   │   ├── CMakeLists.txt
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── audit.rs
│   │       ├── main.rs
│   │       └── rage/
│   │           ├── mod.rs
│   │           └── stream.rs
│   ├── cmds/
│   │   ├── debug.cpp
│   │   ├── find.cpp
│   │   ├── heapprof.cpp
│   │   ├── info.cpp
│   │   ├── log.cpp
│   │   ├── query.cpp
│   │   ├── since.cpp
│   │   ├── state.cpp
│   │   ├── subscribe.cpp
│   │   ├── trigger.cpp
│   │   └── watch.cpp
│   ├── cppclient/
│   │   ├── BUCK
│   │   ├── CLI.cpp
│   │   ├── WatchmanClient.cpp
│   │   ├── WatchmanClient.h
│   │   ├── WatchmanConnection.cpp
│   │   ├── WatchmanConnection.h
│   │   ├── WatchmanResponseError.cpp
│   │   └── watchmanclient.pc.in
│   ├── docs/
│   │   └── sync.md
│   ├── facebook/
│   │   ├── BUCK
│   │   └── saved_state/
│   │       └── BUCK
│   ├── fs/
│   │   ├── BUCK
│   │   ├── DirHandle.h
│   │   ├── FSDetect.cpp
│   │   ├── FSDetect.h
│   │   ├── FileDescriptor.cpp
│   │   ├── FileDescriptor.h
│   │   ├── FileInformation.cpp
│   │   ├── FileInformation.h
│   │   ├── FileSystem.cpp
│   │   ├── FileSystem.h
│   │   ├── ParallelWalk.cpp
│   │   ├── ParallelWalk.h
│   │   ├── ParallelWalkMain.cpp
│   │   ├── Pipe.cpp
│   │   ├── Pipe.h
│   │   ├── UnixDirHandle.cpp
│   │   ├── WinDirHandle.cpp
│   │   ├── WindowsTime.cpp
│   │   └── WindowsTime.h
│   ├── fuzz/
│   │   ├── BUCK
│   │   ├── BserDecode.cpp
│   │   ├── JsonDecode.cpp
│   │   └── PyBserDecode.cpp
│   ├── integration/
│   │   ├── BUCK
│   │   ├── CMakeLists.txt
│   │   ├── __init__.py
│   │   ├── capabilities.js
│   │   ├── case.js
│   │   ├── cat.py
│   │   ├── cppclient.cpp
│   │   ├── eden/
│   │   │   ├── BUCK
│   │   │   ├── test_eden_glob_upper_bound.py
│   │   │   ├── test_eden_journal.py
│   │   │   ├── test_eden_pathgen.py
│   │   │   ├── test_eden_query.py
│   │   │   ├── test_eden_scm.py
│   │   │   ├── test_eden_sha1.py
│   │   │   ├── test_eden_shutdown.py
│   │   │   ├── test_eden_since.py
│   │   │   ├── test_eden_subscribe.py
│   │   │   ├── test_eden_suffix.py
│   │   │   ├── test_eden_takeover.py
│   │   │   ├── test_eden_unmount.py
│   │   │   ├── test_eden_watch_parent.py
│   │   │   └── test_eden_watch_root.py
│   │   ├── facebook/
│   │   │   └── BUCK
│   │   ├── lib/
│   │   │   ├── BUCK
│   │   │   ├── Interrupt.py
│   │   │   ├── TempDir.py
│   │   │   ├── WatchmanEdenTestCase.py
│   │   │   ├── WatchmanInstance.py
│   │   │   ├── WatchmanSCMTestCase.py
│   │   │   ├── WatchmanTestCase.py
│   │   │   ├── __init__.py
│   │   │   ├── node.py
│   │   │   └── path_utils.py
│   │   ├── node_basic.js
│   │   ├── site_spawn.py
│   │   ├── site_spawn_fail.py
│   │   ├── test_absroot.py
│   │   ├── test_age_file.py
│   │   ├── test_age_watch.py
│   │   ├── test_auth.py
│   │   ├── test_big.py
│   │   ├── test_big_file.py
│   │   ├── test_bsdish.py
│   │   ├── test_bser_cli.py
│   │   ├── test_bulkstat.py
│   │   ├── test_capabilities.py
│   │   ├── test_case_sensitive.py
│   │   ├── test_clock.py
│   │   ├── test_command.py
│   │   ├── test_content_hash.py
│   │   ├── test_cookie.py
│   │   ├── test_cppclient.py
│   │   ├── test_cursor.py
│   │   ├── test_dir_move.py
│   │   ├── test_dirname.py
│   │   ├── test_empty.py
│   │   ├── test_fields.py
│   │   ├── test_find.py
│   │   ├── test_fishy.py
│   │   ├── test_force_recrawl.py
│   │   ├── test_fork.py
│   │   ├── test_fsevents_resync.py
│   │   ├── test_fstype.py
│   │   ├── test_glob.py
│   │   ├── test_ignore.py
│   │   ├── test_info.py
│   │   ├── test_invalid_expr.py
│   │   ├── test_invalid_watchmanconfig.py
│   │   ├── test_kqueue_and_fsevents_recrawl.py
│   │   ├── test_local_saved_state.py
│   │   ├── test_log.py
│   │   ├── test_match.py
│   │   ├── test_name.py
│   │   ├── test_nice.py
│   │   ├── test_nodejs.py
│   │   ├── test_path_generator.py
│   │   ├── test_pcre.py
│   │   ├── test_perms.py
│   │   ├── test_remove.py
│   │   ├── test_remove_then_add.py
│   │   ├── test_request_id.py
│   │   ├── test_restrictions.py
│   │   ├── test_saved_state.py
│   │   ├── test_scm.py
│   │   ├── test_since.py
│   │   ├── test_since_term.py
│   │   ├── test_site_spawn.py
│   │   ├── test_size.py
│   │   ├── test_sock_perms.py
│   │   ├── test_subscribe.py
│   │   ├── test_suffix.py
│   │   ├── test_suffix_generator.py
│   │   ├── test_trigger.py
│   │   ├── test_trigger_chdir.py
│   │   ├── test_trigger_error.py
│   │   ├── test_two_deep.py
│   │   ├── test_type.py
│   │   ├── test_watch_del_all.py
│   │   ├── test_watch_project.py
│   │   ├── test_wm_wait.py
│   │   ├── touch.py
│   │   ├── trig-cwd.py
│   │   ├── trig.py
│   │   └── trigjson.py
│   ├── java/
│   │   ├── .buckconfig
│   │   ├── .gitignore
│   │   ├── .nobuckcheck
│   │   ├── BUCK
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── pom.xml
│   │   ├── sandcastle.ini
│   │   ├── src/
│   │   │   └── com/
│   │   │       └── facebook/
│   │   │           └── watchman/
│   │   │               ├── Callback.java
│   │   │               ├── CapabilitiesStrategy.java
│   │   │               ├── Deserializer.java
│   │   │               ├── WatchmanClient.java
│   │   │               ├── WatchmanClientImpl.java
│   │   │               ├── WatchmanConnection.java
│   │   │               ├── WatchmanException.java
│   │   │               ├── WatchmanTransport.java
│   │   │               ├── WatchmanTransportBuilder.java
│   │   │               ├── WatchmanTransportUnavailableException.java
│   │   │               ├── bser/
│   │   │               │   ├── BserConstants.java
│   │   │               │   ├── BserDeserializer.java
│   │   │               │   └── BserSerializer.java
│   │   │               ├── environment/
│   │   │               │   ├── ExecutableFinder.java
│   │   │               │   └── FileFinder.java
│   │   │               ├── unixsocket/
│   │   │               │   ├── ReferenceCountedFileDescriptor.java
│   │   │               │   ├── UnixDomainSocket.java
│   │   │               │   └── UnixDomainSocketLibrary.java
│   │   │               └── windowspipe/
│   │   │                   ├── WindowsNamedPipe.java
│   │   │                   └── WindowsNamedPipeLibrary.java
│   │   ├── test/
│   │   │   └── com/
│   │   │       └── facebook/
│   │   │           └── watchman/
│   │   │               ├── CapabilitiesTest.java
│   │   │               ├── WatchmanClientTest.java
│   │   │               ├── WatchmanConnectionTest.java
│   │   │               ├── WatchmanTestBase.java
│   │   │               ├── bser/
│   │   │               │   ├── BserDeserializerTest.java
│   │   │               │   └── BserSerializerTest.java
│   │   │               ├── environment/
│   │   │               │   ├── ExecutableFinderTest.java
│   │   │               │   └── FileFinderTest.java
│   │   │               ├── fakes/
│   │   │               │   └── FakeWatchmanClient.java
│   │   │               └── util/
│   │   │                   └── TemporaryPaths.java
│   │   └── third-party/
│   │       ├── guava/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── hamcrest/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── immutables/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── jna/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── jsr-305/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── junit/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── mockito/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── nuprocess/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       └── objenesis/
│   │           ├── BUCK
│   │           └── README
│   ├── listener-user.cpp
│   ├── listener.cpp
│   ├── listener.h
│   ├── main.cpp
│   ├── node/
│   │   ├── .flowconfig
│   │   ├── README.md
│   │   ├── bser/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── README.md
│   │   │   ├── index.js
│   │   │   ├── package.json
│   │   │   ├── test/
│   │   │   │   └── bser.js
│   │   │   └── test_bser.py
│   │   ├── example.js
│   │   ├── index.js
│   │   └── package.json
│   ├── portability/
│   │   ├── BUCK
│   │   ├── Backtrace.cpp
│   │   ├── Backtrace.h
│   │   ├── GetOpt.h
│   │   ├── PosixSpawn.cpp
│   │   ├── PosixSpawn.h
│   │   ├── WinError.cpp
│   │   └── WinError.h
│   ├── python/
│   │   ├── .gitignore
│   │   ├── CMakeLists.txt
│   │   ├── LICENSE
│   │   ├── MANIFEST.in
│   │   ├── README.md
│   │   ├── bin/
│   │   │   ├── BUCK
│   │   │   ├── watchman-diag
│   │   │   ├── watchman-make
│   │   │   ├── watchman-replicate-subscription
│   │   │   ├── watchman-wait
│   │   │   └── watchman-wait-aio
│   │   ├── publish-pypi.sh
│   │   ├── pyproject.toml
│   │   ├── pywatchman/
│   │   │   ├── BUCK
│   │   │   ├── CMakeLists.txt
│   │   │   ├── __init__.py
│   │   │   ├── bser.c
│   │   │   ├── bser.h
│   │   │   ├── bsermodule.c
│   │   │   ├── capabilities.py
│   │   │   ├── encoding.py
│   │   │   ├── load.py
│   │   │   ├── pybser.py
│   │   │   └── windows.py
│   │   ├── pywatchman_aio/
│   │   │   ├── BUCK
│   │   │   └── __init__.py
│   │   ├── setup.py
│   │   └── tests/
│   │       ├── BUCK
│   │       ├── __init__.py
│   │       └── tests.py
│   ├── query/
│   │   ├── FileResult.cpp
│   │   ├── FileResult.h
│   │   ├── GlobEscaping.cpp
│   │   ├── GlobEscaping.h
│   │   ├── GlobTree.cpp
│   │   ├── GlobTree.h
│   │   ├── LocalFileResult.cpp
│   │   ├── LocalFileResult.h
│   │   ├── Query.cpp
│   │   ├── Query.h
│   │   ├── QueryContext.cpp
│   │   ├── QueryContext.h
│   │   ├── QueryExpr.h
│   │   ├── QueryResult.cpp
│   │   ├── QueryResult.h
│   │   ├── TermRegistry.cpp
│   │   ├── TermRegistry.h
│   │   ├── base.cpp
│   │   ├── dirname.cpp
│   │   ├── empty.cpp
│   │   ├── eval.cpp
│   │   ├── eval.h
│   │   ├── fieldlist.cpp
│   │   ├── glob.cpp
│   │   ├── intcompare.cpp
│   │   ├── intcompare.h
│   │   ├── match.cpp
│   │   ├── name.cpp
│   │   ├── parse.cpp
│   │   ├── parse.h
│   │   ├── pcre.cpp
│   │   ├── since.cpp
│   │   ├── suffix.cpp
│   │   └── type.cpp
│   ├── root/
│   │   ├── Root.h
│   │   ├── ageout.cpp
│   │   ├── dir.cpp
│   │   ├── file.cpp
│   │   ├── init.cpp
│   │   ├── iothread.cpp
│   │   ├── notifythread.cpp
│   │   ├── reap.cpp
│   │   ├── resolve.cpp
│   │   ├── resolve.h
│   │   ├── sync.cpp
│   │   ├── test/
│   │   │   ├── BUCK
│   │   │   └── RootTest.cpp
│   │   ├── threading.cpp
│   │   ├── warnerr.cpp
│   │   ├── warnerr.h
│   │   ├── watchlist.cpp
│   │   └── watchlist.h
│   ├── ruby/
│   │   └── ruby-watchman/
│   │       ├── .gitignore
│   │       ├── .rspec
│   │       ├── Gemfile
│   │       ├── LICENSE.txt
│   │       ├── README.md
│   │       ├── Rakefile
│   │       ├── ext/
│   │       │   └── ruby-watchman/
│   │       │       ├── depend
│   │       │       ├── extconf.rb
│   │       │       └── watchman.c
│   │       ├── lib/
│   │       │   ├── ruby-watchman/
│   │       │   │   └── version.rb
│   │       │   └── ruby-watchman.rb
│   │       ├── ruby-watchman.gemspec
│   │       └── spec/
│   │           ├── ruby_watchman_spec.rb
│   │           └── spec_helper.rb
│   ├── runtests.py
│   ├── rust/
│   │   ├── .gitignore
│   │   ├── serde_bser/
│   │   │   ├── BUCK
│   │   │   ├── Cargo.toml
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   └── src/
│   │   │       ├── bytestring.rs
│   │   │       ├── de/
│   │   │       │   ├── bunser.rs
│   │   │       │   ├── map.rs
│   │   │       │   ├── mod.rs
│   │   │       │   ├── read.rs
│   │   │       │   ├── reentrant.rs
│   │   │       │   ├── seq.rs
│   │   │       │   ├── template.rs
│   │   │       │   ├── test.rs
│   │   │       │   └── variant.rs
│   │   │       ├── errors.rs
│   │   │       ├── header.rs
│   │   │       ├── lib.rs
│   │   │       ├── ser/
│   │   │       │   ├── count_write.rs
│   │   │       │   ├── mod.rs
│   │   │       │   └── test.rs
│   │   │       └── value.rs
│   │   └── watchman_client/
│   │       ├── BUCK
│   │       ├── Cargo.toml
│   │       ├── LICENSE
│   │       ├── examples/
│   │       │   ├── glob.rs
│   │       │   ├── since.rs
│   │       │   ├── state.rs
│   │       │   ├── subscribe.rs
│   │       │   └── trigger.rs
│   │       └── src/
│   │           ├── expr.rs
│   │           ├── fields.rs
│   │           ├── lib.rs
│   │           ├── named_pipe.rs
│   │           └── pdu.rs
│   ├── saved_state/
│   │   ├── BUCK
│   │   ├── LocalSavedStateInterface.cpp
│   │   ├── LocalSavedStateInterface.h
│   │   ├── SavedStateFactory.cpp
│   │   ├── SavedStateFactory.h
│   │   ├── SavedStateInterface.cpp
│   │   └── SavedStateInterface.h
│   ├── scm/
│   │   ├── Git.cpp
│   │   ├── Git.h
│   │   ├── Mercurial.cpp
│   │   ├── Mercurial.h
│   │   ├── SCM.cpp
│   │   └── SCM.h
│   ├── sockname.cpp
│   ├── sockname.h
│   ├── state.cpp
│   ├── state.h
│   ├── stream.cpp
│   ├── stream_stdout.cpp
│   ├── stream_unix.cpp
│   ├── stream_win.cpp
│   ├── string.cpp
│   ├── telemetry/
│   │   ├── BUCK
│   │   ├── LogEvent.cpp
│   │   ├── LogEvent.h
│   │   ├── WatchmanStats.cpp
│   │   ├── WatchmanStats.h
│   │   ├── WatchmanStructuredLogger.cpp
│   │   └── WatchmanStructuredLogger.h
│   ├── test/
│   │   ├── ArtTest.cpp
│   │   ├── BUCK
│   │   ├── BserTest.cpp
│   │   ├── CacheTest.cpp
│   │   ├── ChildProcTest.cpp
│   │   ├── FSDetectTest.cpp
│   │   ├── FailsToStartViewTest.cpp
│   │   ├── GlobUpperBoundTest.cpp
│   │   ├── IgnoreTest.cpp
│   │   ├── InMemoryViewTest.cpp
│   │   ├── JsonBenchmark.cpp
│   │   ├── JsonTest.cpp
│   │   ├── LocalSavedStateInterfaceTest.cpp
│   │   ├── LogTest.cpp
│   │   ├── MapUtilTest.cpp
│   │   ├── MercurialTest.cpp
│   │   ├── PathUtilsTest.cpp
│   │   ├── PendingCollectionTest.cpp
│   │   ├── PerfSampleTest.cpp
│   │   ├── ResultTest.cpp
│   │   ├── ReturnOnlyFilesTest.cpp
│   │   ├── RingBufferTest.cpp
│   │   ├── SerdeTest.cpp
│   │   ├── StringTest.cpp
│   │   ├── SuffixQueryTest.cpp
│   │   ├── WatcherSelectionDarwinTest.cpp
│   │   ├── WildmatchTest.cpp
│   │   ├── WildmatchTest.json
│   │   ├── async/
│   │   │   ├── AsyncWatchmanTestCase.py
│   │   │   ├── test_dead_socket.py
│   │   │   └── test_subscribe_async.py
│   │   ├── facebook/
│   │   │   └── BUCK
│   │   ├── lib/
│   │   │   ├── BUCK
│   │   │   ├── FakeFileSystem.cpp
│   │   │   ├── FakeFileSystem.h
│   │   │   ├── FakeFileSystemTest.cpp
│   │   │   ├── FakeWatcher.cpp
│   │   │   └── FakeWatcher.h
│   │   └── run.sh
│   ├── thirdparty/
│   │   ├── deelevate_binding/
│   │   │   ├── .gitignore
│   │   │   ├── BUCK
│   │   │   ├── CMakeLists.txt
│   │   │   ├── Cargo.toml
│   │   │   ├── include/
│   │   │   │   └── deelevate.h
│   │   │   └── src/
│   │   │       └── lib.rs
│   │   ├── getopt/
│   │   │   ├── BUCK
│   │   │   ├── GetOpt.cpp
│   │   │   └── GetOpt.h
│   │   ├── jansson/
│   │   │   ├── BUCK
│   │   │   ├── dump.cpp
│   │   │   ├── error.cpp
│   │   │   ├── jansson.h
│   │   │   ├── jansson_private.h
│   │   │   ├── load.cpp
│   │   │   ├── strconv.cpp
│   │   │   ├── utf.cpp
│   │   │   ├── utf.h
│   │   │   └── value.cpp
│   │   ├── libart/
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── src/
│   │   │   │   ├── BUCK
│   │   │   │   ├── art-inl.h
│   │   │   │   └── art.h
│   │   │   └── tests/
│   │   │       ├── runner.c
│   │   │       ├── uuid.txt
│   │   │       └── words.txt
│   │   └── wildmatch/
│   │       ├── .dir-locals.el
│   │       ├── BUCK
│   │       ├── wildmatch.c
│   │       └── wildmatch.h
│   ├── watcher/
│   │   ├── Watcher.cpp
│   │   ├── Watcher.h
│   │   ├── WatcherRegistry.cpp
│   │   ├── WatcherRegistry.h
│   │   ├── eden.cpp
│   │   ├── fsevents.cpp
│   │   ├── fsevents.h
│   │   ├── inotify.cpp
│   │   ├── kqueue.cpp
│   │   ├── kqueue.h
│   │   ├── kqueue_and_fsevents.cpp
│   │   ├── portfs.cpp
│   │   └── win32.cpp
│   ├── watchman_cmd.h
│   ├── watchman_dir.h
│   ├── watchman_file.h
│   ├── watchman_preprocessor.h
│   ├── watchman_stream.h
│   ├── watchman_string.h
│   ├── watchman_system.h
│   ├── watchman_time.h
│   └── winbuild/
│       ├── BUCK
│       └── susres.cpp
└── website/
    ├── .eslintrc.js
    ├── .gitignore
    ├── .npmrc
    ├── .prettierignore
    ├── .prettierrc
    ├── .stylelintrc.js
    ├── README.md
    ├── babel.config.js
    ├── docs/
    │   ├── bser.md
    │   ├── capabilities.md
    │   ├── casefolding.md
    │   ├── cli-options.md
    │   ├── clockspec.md
    │   ├── cmd/
    │   │   ├── _category_.json
    │   │   ├── clock.md
    │   │   ├── find.md
    │   │   ├── flush-subscriptions.md
    │   │   ├── get-config.md
    │   │   ├── get-sockname.md
    │   │   ├── list-capabilities.md
    │   │   ├── log-level.md
    │   │   ├── log.md
    │   │   ├── query.md
    │   │   ├── shutdown-server.md
    │   │   ├── since.md
    │   │   ├── state-enter.md
    │   │   ├── state-leave.md
    │   │   ├── subscribe.md
    │   │   ├── trigger-del.md
    │   │   ├── trigger-list.md
    │   │   ├── trigger.md
    │   │   ├── unsubscribe.md
    │   │   ├── version.md
    │   │   ├── watch-del-all.md
    │   │   ├── watch-del.md
    │   │   ├── watch-list.md
    │   │   ├── watch-project.md
    │   │   └── watch.md
    │   ├── compatibility.md
    │   ├── config.md
    │   ├── contributing.md
    │   ├── cookies.md
    │   ├── cppclient.md
    │   ├── expr/
    │   │   ├── _category_.json
    │   │   ├── allof.md
    │   │   ├── anyof.md
    │   │   ├── dirname.md
    │   │   ├── empty.md
    │   │   ├── exists.md
    │   │   ├── false.md
    │   │   ├── match.md
    │   │   ├── name.md
    │   │   ├── not.md
    │   │   ├── pcre.md
    │   │   ├── since.md
    │   │   ├── size.md
    │   │   ├── suffix.md
    │   │   ├── true.md
    │   │   └── type.md
    │   ├── file-query.md
    │   ├── install.md
    │   ├── nodejs.md
    │   ├── release-notes.md
    │   ├── scm-query.md
    │   ├── simple-query.md
    │   ├── socket-interface.md
    │   ├── troubleshooting.md
    │   ├── watchman-make.md
    │   ├── watchman-replicate-subscription.md
    │   └── watchman-wait.md
    ├── docusaurus.config.js
    ├── package.json
    ├── sidebars.js
    ├── src/
    │   ├── css/
    │   │   └── custom.css
    │   └── pages/
    │       ├── index.js
    │       ├── index.module.css
    │       ├── styles.module.css
    │       └── support.md
    └── static/
        └── .nojekyll

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
* text eol=lf
*.png binary


================================================
FILE: .github/workflows/generate-release-yml.rs
================================================
#!/usr/bin/env rust-script
//! Copyright (c) Meta Platforms, Inc. and affiliates.
//!
//! This source code is licensed under the MIT license found in the
//! LICENSE file in the root directory of this source tree.
//!
//! ```cargo
//! [dependencies]
//! anyhow = "1.0.72"
//! atomicwrites = "0.4.1"
//! yaml-rust = "0.4.5"
//! ```

use std::io::Write;
use std::path::Path;

use anyhow::anyhow;
use anyhow::bail;
use atomicwrites::AllowOverwrite;
use atomicwrites::AtomicFile;
use yaml_rust::Yaml;
use yaml_rust::YamlEmitter;
use yaml_rust::YamlLoader;
use yaml_rust::yaml::Hash;

type Pattern = Box<dyn Fn(&str, &str) -> String + 'static>;

fn parse_pattern(pattern: &String) -> Option<(Pattern, Vec<&'static str>)> {
    // TODO: generalize this with an external table or something
    if pattern.contains("%UBUNTU_LTS_VERSION%") {
        Some((
            Box::new(move |p: &str, s: &str| p.replace("%UBUNTU_LTS_VERSION%", s)),
            vec!["22", "24"],
        ))
    } else if pattern.contains("%FEDORA_STABLE_VERSION%") {
        Some((
            Box::new(move |p: &str, s: &str| p.replace("%FEDORA_STABLE_VERSION%", s)),
            vec!["40", "41", "42"],
        ))
    } else {
        None
    }
}

fn substitute_value(pattern: &Pattern, value: &Yaml, substitution: &str) -> Yaml {
    match value {
        Yaml::String(str) => Yaml::String(pattern(&str, substitution)),
        Yaml::Array(arr) => Yaml::Array(
            arr.iter()
                .map(|v| substitute_value(pattern, v, substitution))
                .collect(),
        ),
        Yaml::Hash(hm) => {
            let mut new = Hash::new();
            for (key, value) in hm.iter() {
                new.insert(
                    substitute_value(pattern, &key, substitution),
                    substitute_value(pattern, &value, substitution),
                );
            }
            Yaml::Hash(new)
        }
        otherwise => otherwise.clone(),
    }
}

fn expand_value(value: &Yaml) -> Yaml {
    match value {
        Yaml::Array(arr) => Yaml::Array(arr.iter().map(expand_value).collect()),
        Yaml::Hash(hm) => {
            let mut new = Hash::new();
            for (key, value) in hm.iter() {
                //println!("key = {:?}", key);
                if let Yaml::String(key_str) = key {
                    if let Some((pat, substitutions)) = parse_pattern(&key_str) {
                        for substitution in substitutions {
                            new.insert(
                                Yaml::String(pat(&key_str, substitution)),
                                substitute_value(&pat, &value, substitution),
                            );
                        }
                    } else {
                        new.insert(key.clone(), expand_value(value));
                    }
                } else {
                    // What does a non-string key mean anyways?
                    new.insert(key.clone(), expand_value(value));
                }
            }
            Yaml::Hash(new)
        }
        otherwise => otherwise.clone(),
    }
}

fn main() -> anyhow::Result<()> {
    let Some(base_path) = std::env::var_os("RUST_SCRIPT_BASE_PATH") else {
        bail!("RUST_SCRIPT_BASE_PATH must be set");
    };
    let base_path = Path::new(&base_path);
    let input_path = base_path.join("release.yml.in");
    let output_path = base_path.join("release.yml");

    let contents = match std::fs::read_to_string(&input_path) {
        Ok(contents) => contents,
        Err(e) => {
            bail!("Unable to read {}: {}", input_path.display(), e);
        }
    };
    let doc = match YamlLoader::load_from_str(&contents) {
        Ok(doc) => doc,
        Err(e) => {
            bail!("Unable to parse {}: {}", input_path.display(), e);
        }
    };

    let new_doc: Vec<Yaml> = doc.iter().map(expand_value).collect();

    let mut out_str = String::new();
    out_str.extend("# \x40generated by generate-release-yml.rs\n".chars());

    let mut emitter = YamlEmitter::new(&mut out_str);
    for doc in new_doc {
        match emitter.dump(&doc) {
            Ok(()) => (),
            Err(e) => {
                bail!("Unable to generate {}: {}", output_path.display(), e);
            }
        }
    }

    let af = AtomicFile::new(&output_path, AllowOverwrite);
    af.write(|f| f.write_all(&out_str.as_bytes()))
        .map_err(|e| anyhow!("Unable to write {}: {}", output_path.display(), e))
}


================================================
FILE: .github/workflows/getdeps_linux.yml
================================================
# This file was @generated by getdeps.py

name: linux

on:
  push:
    branches:
    - main
  pull_request:
    branches:
    - main

permissions:
  contents: read  #  to fetch code (actions/checkout)

jobs:
  build:
    runs-on: ubuntu-22.04
    steps:
    - uses: actions/checkout@v6
    - name: Show disk space at start
      run: df -h
    - name: Free up disk space
      run: sudo rm -rf /usr/local/lib/android
    - name: Show disk space after freeing up
      run: df -h
    - name: Update system package info
      run: sudo --preserve-env=http_proxy apt-get update
    - name: Install system deps
      run: sudo --preserve-env=http_proxy python3 build/fbcode_builder/getdeps.py --allow-system-packages install-system-deps --recursive watchman && sudo --preserve-env=http_proxy python3 build/fbcode_builder/getdeps.py --allow-system-packages install-system-deps --recursive patchelf
    - id: paths
      name: Query paths
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages query-paths --recursive --src-dir=. watchman  >> "$GITHUB_OUTPUT"
    - name: Install Rust Stable
      uses: dtolnay/rust-toolchain@stable
    - name: Fetch boost
      if: ${{ steps.paths.outputs.boost_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests boost
    - name: Fetch ninja
      if: ${{ steps.paths.outputs.ninja_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests ninja
    - name: Fetch cmake
      if: ${{ steps.paths.outputs.cmake_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests cmake
    - name: Fetch cpptoml
      if: ${{ steps.paths.outputs.cpptoml_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests cpptoml
    - name: Fetch fmt
      if: ${{ steps.paths.outputs.fmt_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fmt
    - name: Fetch gflags
      if: ${{ steps.paths.outputs.gflags_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests gflags
    - name: Fetch glog
      if: ${{ steps.paths.outputs.glog_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests glog
    - name: Fetch googletest
      if: ${{ steps.paths.outputs.googletest_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests googletest
    - name: Fetch xxhash
      if: ${{ steps.paths.outputs.xxhash_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests xxhash
    - name: Fetch zstd
      if: ${{ steps.paths.outputs.zstd_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests zstd
    - name: Fetch double-conversion
      if: ${{ steps.paths.outputs.double-conversion_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests double-conversion
    - name: Fetch fast_float
      if: ${{ steps.paths.outputs.fast_float_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fast_float
    - name: Fetch libaio
      if: ${{ steps.paths.outputs.libaio_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libaio
    - name: Fetch libdwarf
      if: ${{ steps.paths.outputs.libdwarf_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libdwarf
    - name: Fetch libevent
      if: ${{ steps.paths.outputs.libevent_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libevent
    - name: Fetch lz4
      if: ${{ steps.paths.outputs.lz4_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests lz4
    - name: Fetch snappy
      if: ${{ steps.paths.outputs.snappy_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests snappy
    - name: Fetch pcre2
      if: ${{ steps.paths.outputs.pcre2_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests pcre2
    - name: Fetch python-setuptools-69
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests python-setuptools-69
    - name: Fetch zlib
      if: ${{ steps.paths.outputs.zlib_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests zlib
    - name: Fetch openssl
      if: ${{ steps.paths.outputs.openssl_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests openssl
    - name: Fetch liboqs
      if: ${{ steps.paths.outputs.liboqs_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests liboqs
    - name: Fetch autoconf
      if: ${{ steps.paths.outputs.autoconf_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests autoconf
    - name: Fetch automake
      if: ${{ steps.paths.outputs.automake_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests automake
    - name: Fetch libtool
      if: ${{ steps.paths.outputs.libtool_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libtool
    - name: Fetch libsodium
      if: ${{ steps.paths.outputs.libsodium_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libsodium
    - name: Fetch libiberty
      if: ${{ steps.paths.outputs.libiberty_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libiberty
    - name: Fetch libunwind
      if: ${{ steps.paths.outputs.libunwind_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libunwind
    - name: Fetch xz
      if: ${{ steps.paths.outputs.xz_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests xz
    - name: Fetch folly
      if: ${{ steps.paths.outputs.folly_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests folly
    - name: Fetch fizz
      if: ${{ steps.paths.outputs.fizz_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fizz
    - name: Fetch mvfst
      if: ${{ steps.paths.outputs.mvfst_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests mvfst
    - name: Fetch wangle
      if: ${{ steps.paths.outputs.wangle_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests wangle
    - name: Fetch fbthrift
      if: ${{ steps.paths.outputs.fbthrift_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fbthrift
    - name: Fetch fb303
      if: ${{ steps.paths.outputs.fb303_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fb303
    - name: Fetch edencommon
      if: ${{ steps.paths.outputs.edencommon_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests edencommon
    - name: Restore boost from cache
      id: restore_boost
      if: ${{ steps.paths.outputs.boost_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.boost_INSTALL }}
       key: ${{ steps.paths.outputs.boost_CACHE_KEY }}-install
    - name: Build boost
      if: ${{ steps.paths.outputs.boost_SOURCE && ! steps.restore_boost.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests boost
    - name: Save boost to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.boost_SOURCE && ! steps.restore_boost.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.boost_INSTALL }}
       key: ${{ steps.paths.outputs.boost_CACHE_KEY }}-install
    - name: Restore ninja from cache
      id: restore_ninja
      if: ${{ steps.paths.outputs.ninja_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.ninja_INSTALL }}
       key: ${{ steps.paths.outputs.ninja_CACHE_KEY }}-install
    - name: Build ninja
      if: ${{ steps.paths.outputs.ninja_SOURCE && ! steps.restore_ninja.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests ninja
    - name: Save ninja to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.ninja_SOURCE && ! steps.restore_ninja.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.ninja_INSTALL }}
       key: ${{ steps.paths.outputs.ninja_CACHE_KEY }}-install
    - name: Restore cmake from cache
      id: restore_cmake
      if: ${{ steps.paths.outputs.cmake_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.cmake_INSTALL }}
       key: ${{ steps.paths.outputs.cmake_CACHE_KEY }}-install
    - name: Build cmake
      if: ${{ steps.paths.outputs.cmake_SOURCE && ! steps.restore_cmake.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests cmake
    - name: Save cmake to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.cmake_SOURCE && ! steps.restore_cmake.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.cmake_INSTALL }}
       key: ${{ steps.paths.outputs.cmake_CACHE_KEY }}-install
    - name: Restore cpptoml from cache
      id: restore_cpptoml
      if: ${{ steps.paths.outputs.cpptoml_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.cpptoml_INSTALL }}
       key: ${{ steps.paths.outputs.cpptoml_CACHE_KEY }}-install
    - name: Build cpptoml
      if: ${{ steps.paths.outputs.cpptoml_SOURCE && ! steps.restore_cpptoml.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests cpptoml
    - name: Save cpptoml to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.cpptoml_SOURCE && ! steps.restore_cpptoml.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.cpptoml_INSTALL }}
       key: ${{ steps.paths.outputs.cpptoml_CACHE_KEY }}-install
    - name: Restore fmt from cache
      id: restore_fmt
      if: ${{ steps.paths.outputs.fmt_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fmt_INSTALL }}
       key: ${{ steps.paths.outputs.fmt_CACHE_KEY }}-install
    - name: Build fmt
      if: ${{ steps.paths.outputs.fmt_SOURCE && ! steps.restore_fmt.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests fmt
    - name: Save fmt to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fmt_SOURCE && ! steps.restore_fmt.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fmt_INSTALL }}
       key: ${{ steps.paths.outputs.fmt_CACHE_KEY }}-install
    - name: Restore gflags from cache
      id: restore_gflags
      if: ${{ steps.paths.outputs.gflags_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.gflags_INSTALL }}
       key: ${{ steps.paths.outputs.gflags_CACHE_KEY }}-install
    - name: Build gflags
      if: ${{ steps.paths.outputs.gflags_SOURCE && ! steps.restore_gflags.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests gflags
    - name: Save gflags to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.gflags_SOURCE && ! steps.restore_gflags.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.gflags_INSTALL }}
       key: ${{ steps.paths.outputs.gflags_CACHE_KEY }}-install
    - name: Restore glog from cache
      id: restore_glog
      if: ${{ steps.paths.outputs.glog_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.glog_INSTALL }}
       key: ${{ steps.paths.outputs.glog_CACHE_KEY }}-install
    - name: Build glog
      if: ${{ steps.paths.outputs.glog_SOURCE && ! steps.restore_glog.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests glog
    - name: Save glog to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.glog_SOURCE && ! steps.restore_glog.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.glog_INSTALL }}
       key: ${{ steps.paths.outputs.glog_CACHE_KEY }}-install
    - name: Restore googletest from cache
      id: restore_googletest
      if: ${{ steps.paths.outputs.googletest_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.googletest_INSTALL }}
       key: ${{ steps.paths.outputs.googletest_CACHE_KEY }}-install
    - name: Build googletest
      if: ${{ steps.paths.outputs.googletest_SOURCE && ! steps.restore_googletest.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests googletest
    - name: Save googletest to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.googletest_SOURCE && ! steps.restore_googletest.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.googletest_INSTALL }}
       key: ${{ steps.paths.outputs.googletest_CACHE_KEY }}-install
    - name: Restore xxhash from cache
      id: restore_xxhash
      if: ${{ steps.paths.outputs.xxhash_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.xxhash_INSTALL }}
       key: ${{ steps.paths.outputs.xxhash_CACHE_KEY }}-install
    - name: Build xxhash
      if: ${{ steps.paths.outputs.xxhash_SOURCE && ! steps.restore_xxhash.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests xxhash
    - name: Save xxhash to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.xxhash_SOURCE && ! steps.restore_xxhash.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.xxhash_INSTALL }}
       key: ${{ steps.paths.outputs.xxhash_CACHE_KEY }}-install
    - name: Restore zstd from cache
      id: restore_zstd
      if: ${{ steps.paths.outputs.zstd_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.zstd_INSTALL }}
       key: ${{ steps.paths.outputs.zstd_CACHE_KEY }}-install
    - name: Build zstd
      if: ${{ steps.paths.outputs.zstd_SOURCE && ! steps.restore_zstd.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests zstd
    - name: Save zstd to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.zstd_SOURCE && ! steps.restore_zstd.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.zstd_INSTALL }}
       key: ${{ steps.paths.outputs.zstd_CACHE_KEY }}-install
    - name: Restore double-conversion from cache
      id: restore_double-conversion
      if: ${{ steps.paths.outputs.double-conversion_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.double-conversion_INSTALL }}
       key: ${{ steps.paths.outputs.double-conversion_CACHE_KEY }}-install
    - name: Build double-conversion
      if: ${{ steps.paths.outputs.double-conversion_SOURCE && ! steps.restore_double-conversion.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests double-conversion
    - name: Save double-conversion to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.double-conversion_SOURCE && ! steps.restore_double-conversion.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.double-conversion_INSTALL }}
       key: ${{ steps.paths.outputs.double-conversion_CACHE_KEY }}-install
    - name: Restore fast_float from cache
      id: restore_fast_float
      if: ${{ steps.paths.outputs.fast_float_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fast_float_INSTALL }}
       key: ${{ steps.paths.outputs.fast_float_CACHE_KEY }}-install
    - name: Build fast_float
      if: ${{ steps.paths.outputs.fast_float_SOURCE && ! steps.restore_fast_float.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests fast_float
    - name: Save fast_float to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fast_float_SOURCE && ! steps.restore_fast_float.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fast_float_INSTALL }}
       key: ${{ steps.paths.outputs.fast_float_CACHE_KEY }}-install
    - name: Restore libaio from cache
      id: restore_libaio
      if: ${{ steps.paths.outputs.libaio_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libaio_INSTALL }}
       key: ${{ steps.paths.outputs.libaio_CACHE_KEY }}-install
    - name: Build libaio
      if: ${{ steps.paths.outputs.libaio_SOURCE && ! steps.restore_libaio.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libaio
    - name: Save libaio to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libaio_SOURCE && ! steps.restore_libaio.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libaio_INSTALL }}
       key: ${{ steps.paths.outputs.libaio_CACHE_KEY }}-install
    - name: Restore libdwarf from cache
      id: restore_libdwarf
      if: ${{ steps.paths.outputs.libdwarf_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libdwarf_INSTALL }}
       key: ${{ steps.paths.outputs.libdwarf_CACHE_KEY }}-install
    - name: Build libdwarf
      if: ${{ steps.paths.outputs.libdwarf_SOURCE && ! steps.restore_libdwarf.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libdwarf
    - name: Save libdwarf to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libdwarf_SOURCE && ! steps.restore_libdwarf.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libdwarf_INSTALL }}
       key: ${{ steps.paths.outputs.libdwarf_CACHE_KEY }}-install
    - name: Restore libevent from cache
      id: restore_libevent
      if: ${{ steps.paths.outputs.libevent_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libevent_INSTALL }}
       key: ${{ steps.paths.outputs.libevent_CACHE_KEY }}-install
    - name: Build libevent
      if: ${{ steps.paths.outputs.libevent_SOURCE && ! steps.restore_libevent.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libevent
    - name: Save libevent to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libevent_SOURCE && ! steps.restore_libevent.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libevent_INSTALL }}
       key: ${{ steps.paths.outputs.libevent_CACHE_KEY }}-install
    - name: Restore lz4 from cache
      id: restore_lz4
      if: ${{ steps.paths.outputs.lz4_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.lz4_INSTALL }}
       key: ${{ steps.paths.outputs.lz4_CACHE_KEY }}-install
    - name: Build lz4
      if: ${{ steps.paths.outputs.lz4_SOURCE && ! steps.restore_lz4.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests lz4
    - name: Save lz4 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.lz4_SOURCE && ! steps.restore_lz4.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.lz4_INSTALL }}
       key: ${{ steps.paths.outputs.lz4_CACHE_KEY }}-install
    - name: Restore snappy from cache
      id: restore_snappy
      if: ${{ steps.paths.outputs.snappy_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.snappy_INSTALL }}
       key: ${{ steps.paths.outputs.snappy_CACHE_KEY }}-install
    - name: Build snappy
      if: ${{ steps.paths.outputs.snappy_SOURCE && ! steps.restore_snappy.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests snappy
    - name: Save snappy to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.snappy_SOURCE && ! steps.restore_snappy.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.snappy_INSTALL }}
       key: ${{ steps.paths.outputs.snappy_CACHE_KEY }}-install
    - name: Restore pcre2 from cache
      id: restore_pcre2
      if: ${{ steps.paths.outputs.pcre2_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.pcre2_INSTALL }}
       key: ${{ steps.paths.outputs.pcre2_CACHE_KEY }}-install
    - name: Build pcre2
      if: ${{ steps.paths.outputs.pcre2_SOURCE && ! steps.restore_pcre2.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests pcre2
    - name: Save pcre2 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.pcre2_SOURCE && ! steps.restore_pcre2.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.pcre2_INSTALL }}
       key: ${{ steps.paths.outputs.pcre2_CACHE_KEY }}-install
    - name: Restore python-setuptools-69 from cache
      id: restore_python-setuptools-69
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.python-setuptools-69_INSTALL }}
       key: ${{ steps.paths.outputs.python-setuptools-69_CACHE_KEY }}-install
    - name: Build python-setuptools-69
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE && ! steps.restore_python-setuptools-69.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests python-setuptools-69
    - name: Save python-setuptools-69 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE && ! steps.restore_python-setuptools-69.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.python-setuptools-69_INSTALL }}
       key: ${{ steps.paths.outputs.python-setuptools-69_CACHE_KEY }}-install
    - name: Restore zlib from cache
      id: restore_zlib
      if: ${{ steps.paths.outputs.zlib_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.zlib_INSTALL }}
       key: ${{ steps.paths.outputs.zlib_CACHE_KEY }}-install
    - name: Build zlib
      if: ${{ steps.paths.outputs.zlib_SOURCE && ! steps.restore_zlib.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests zlib
    - name: Save zlib to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.zlib_SOURCE && ! steps.restore_zlib.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.zlib_INSTALL }}
       key: ${{ steps.paths.outputs.zlib_CACHE_KEY }}-install
    - name: Restore openssl from cache
      id: restore_openssl
      if: ${{ steps.paths.outputs.openssl_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.openssl_INSTALL }}
       key: ${{ steps.paths.outputs.openssl_CACHE_KEY }}-install
    - name: Build openssl
      if: ${{ steps.paths.outputs.openssl_SOURCE && ! steps.restore_openssl.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests openssl
    - name: Save openssl to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.openssl_SOURCE && ! steps.restore_openssl.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.openssl_INSTALL }}
       key: ${{ steps.paths.outputs.openssl_CACHE_KEY }}-install
    - name: Restore liboqs from cache
      id: restore_liboqs
      if: ${{ steps.paths.outputs.liboqs_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.liboqs_INSTALL }}
       key: ${{ steps.paths.outputs.liboqs_CACHE_KEY }}-install
    - name: Build liboqs
      if: ${{ steps.paths.outputs.liboqs_SOURCE && ! steps.restore_liboqs.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests liboqs
    - name: Save liboqs to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.liboqs_SOURCE && ! steps.restore_liboqs.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.liboqs_INSTALL }}
       key: ${{ steps.paths.outputs.liboqs_CACHE_KEY }}-install
    - name: Restore autoconf from cache
      id: restore_autoconf
      if: ${{ steps.paths.outputs.autoconf_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.autoconf_INSTALL }}
       key: ${{ steps.paths.outputs.autoconf_CACHE_KEY }}-install
    - name: Build autoconf
      if: ${{ steps.paths.outputs.autoconf_SOURCE && ! steps.restore_autoconf.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests autoconf
    - name: Save autoconf to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.autoconf_SOURCE && ! steps.restore_autoconf.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.autoconf_INSTALL }}
       key: ${{ steps.paths.outputs.autoconf_CACHE_KEY }}-install
    - name: Restore automake from cache
      id: restore_automake
      if: ${{ steps.paths.outputs.automake_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.automake_INSTALL }}
       key: ${{ steps.paths.outputs.automake_CACHE_KEY }}-install
    - name: Build automake
      if: ${{ steps.paths.outputs.automake_SOURCE && ! steps.restore_automake.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests automake
    - name: Save automake to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.automake_SOURCE && ! steps.restore_automake.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.automake_INSTALL }}
       key: ${{ steps.paths.outputs.automake_CACHE_KEY }}-install
    - name: Restore libtool from cache
      id: restore_libtool
      if: ${{ steps.paths.outputs.libtool_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libtool_INSTALL }}
       key: ${{ steps.paths.outputs.libtool_CACHE_KEY }}-install
    - name: Build libtool
      if: ${{ steps.paths.outputs.libtool_SOURCE && ! steps.restore_libtool.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libtool
    - name: Save libtool to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libtool_SOURCE && ! steps.restore_libtool.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libtool_INSTALL }}
       key: ${{ steps.paths.outputs.libtool_CACHE_KEY }}-install
    - name: Restore libsodium from cache
      id: restore_libsodium
      if: ${{ steps.paths.outputs.libsodium_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libsodium_INSTALL }}
       key: ${{ steps.paths.outputs.libsodium_CACHE_KEY }}-install
    - name: Build libsodium
      if: ${{ steps.paths.outputs.libsodium_SOURCE && ! steps.restore_libsodium.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libsodium
    - name: Save libsodium to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libsodium_SOURCE && ! steps.restore_libsodium.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libsodium_INSTALL }}
       key: ${{ steps.paths.outputs.libsodium_CACHE_KEY }}-install
    - name: Restore libiberty from cache
      id: restore_libiberty
      if: ${{ steps.paths.outputs.libiberty_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libiberty_INSTALL }}
       key: ${{ steps.paths.outputs.libiberty_CACHE_KEY }}-install
    - name: Build libiberty
      if: ${{ steps.paths.outputs.libiberty_SOURCE && ! steps.restore_libiberty.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libiberty
    - name: Save libiberty to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libiberty_SOURCE && ! steps.restore_libiberty.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libiberty_INSTALL }}
       key: ${{ steps.paths.outputs.libiberty_CACHE_KEY }}-install
    - name: Restore libunwind from cache
      id: restore_libunwind
      if: ${{ steps.paths.outputs.libunwind_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libunwind_INSTALL }}
       key: ${{ steps.paths.outputs.libunwind_CACHE_KEY }}-install
    - name: Build libunwind
      if: ${{ steps.paths.outputs.libunwind_SOURCE && ! steps.restore_libunwind.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libunwind
    - name: Save libunwind to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libunwind_SOURCE && ! steps.restore_libunwind.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libunwind_INSTALL }}
       key: ${{ steps.paths.outputs.libunwind_CACHE_KEY }}-install
    - name: Restore xz from cache
      id: restore_xz
      if: ${{ steps.paths.outputs.xz_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.xz_INSTALL }}
       key: ${{ steps.paths.outputs.xz_CACHE_KEY }}-install
    - name: Build xz
      if: ${{ steps.paths.outputs.xz_SOURCE && ! steps.restore_xz.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests xz
    - name: Save xz to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.xz_SOURCE && ! steps.restore_xz.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.xz_INSTALL }}
       key: ${{ steps.paths.outputs.xz_CACHE_KEY }}-install
    - name: Restore folly from cache
      id: restore_folly
      if: ${{ steps.paths.outputs.folly_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.folly_INSTALL }}
       key: ${{ steps.paths.outputs.folly_CACHE_KEY }}-install
    - name: Build folly
      if: ${{ steps.paths.outputs.folly_SOURCE && ! steps.restore_folly.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests folly
    - name: Save folly to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.folly_SOURCE && ! steps.restore_folly.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.folly_INSTALL }}
       key: ${{ steps.paths.outputs.folly_CACHE_KEY }}-install
    - name: Restore fizz from cache
      id: restore_fizz
      if: ${{ steps.paths.outputs.fizz_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fizz_INSTALL }}
       key: ${{ steps.paths.outputs.fizz_CACHE_KEY }}-install
    - name: Build fizz
      if: ${{ steps.paths.outputs.fizz_SOURCE && ! steps.restore_fizz.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests fizz
    - name: Save fizz to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fizz_SOURCE && ! steps.restore_fizz.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fizz_INSTALL }}
       key: ${{ steps.paths.outputs.fizz_CACHE_KEY }}-install
    - name: Restore mvfst from cache
      id: restore_mvfst
      if: ${{ steps.paths.outputs.mvfst_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.mvfst_INSTALL }}
       key: ${{ steps.paths.outputs.mvfst_CACHE_KEY }}-install
    - name: Build mvfst
      if: ${{ steps.paths.outputs.mvfst_SOURCE && ! steps.restore_mvfst.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests mvfst
    - name: Save mvfst to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.mvfst_SOURCE && ! steps.restore_mvfst.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.mvfst_INSTALL }}
       key: ${{ steps.paths.outputs.mvfst_CACHE_KEY }}-install
    - name: Restore wangle from cache
      id: restore_wangle
      if: ${{ steps.paths.outputs.wangle_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.wangle_INSTALL }}
       key: ${{ steps.paths.outputs.wangle_CACHE_KEY }}-install
    - name: Build wangle
      if: ${{ steps.paths.outputs.wangle_SOURCE && ! steps.restore_wangle.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests wangle
    - name: Save wangle to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.wangle_SOURCE && ! steps.restore_wangle.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.wangle_INSTALL }}
       key: ${{ steps.paths.outputs.wangle_CACHE_KEY }}-install
    - name: Restore fbthrift from cache
      id: restore_fbthrift
      if: ${{ steps.paths.outputs.fbthrift_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fbthrift_INSTALL }}
       key: ${{ steps.paths.outputs.fbthrift_CACHE_KEY }}-install
    - name: Build fbthrift
      if: ${{ steps.paths.outputs.fbthrift_SOURCE && ! steps.restore_fbthrift.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests fbthrift
    - name: Save fbthrift to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fbthrift_SOURCE && ! steps.restore_fbthrift.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fbthrift_INSTALL }}
       key: ${{ steps.paths.outputs.fbthrift_CACHE_KEY }}-install
    - name: Restore fb303 from cache
      id: restore_fb303
      if: ${{ steps.paths.outputs.fb303_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fb303_INSTALL }}
       key: ${{ steps.paths.outputs.fb303_CACHE_KEY }}-install
    - name: Build fb303
      if: ${{ steps.paths.outputs.fb303_SOURCE && ! steps.restore_fb303.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests fb303
    - name: Save fb303 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fb303_SOURCE && ! steps.restore_fb303.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fb303_INSTALL }}
       key: ${{ steps.paths.outputs.fb303_CACHE_KEY }}-install
    - name: Restore edencommon from cache
      id: restore_edencommon
      if: ${{ steps.paths.outputs.edencommon_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.edencommon_INSTALL }}
       key: ${{ steps.paths.outputs.edencommon_CACHE_KEY }}-install
    - name: Build edencommon
      if: ${{ steps.paths.outputs.edencommon_SOURCE && ! steps.restore_edencommon.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests edencommon
    - name: Save edencommon to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.edencommon_SOURCE && ! steps.restore_edencommon.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.edencommon_INSTALL }}
       key: ${{ steps.paths.outputs.edencommon_CACHE_KEY }}-install
    - name: Build watchman
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --src-dir=. watchman --project-install-prefix watchman:/usr/local
    - name: Copy artifacts
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fixup-dyn-deps --strip --src-dir=. watchman _artifacts/linux --project-install-prefix watchman:/usr/local --final-install-prefix /usr/local
    - uses: actions/upload-artifact@v6
      with:
        name: watchman
        path: _artifacts
    - name: Test watchman
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages test --src-dir=. watchman --project-install-prefix watchman:/usr/local
    - name: Show disk space at end
      if: always()
      run: df -h


================================================
FILE: .github/workflows/getdeps_mac.yml
================================================
# This file was @generated by getdeps.py

name: mac

on:
  push:
    branches:
    - main
  pull_request:
    branches:
    - main

permissions:
  contents: read  #  to fetch code (actions/checkout)

jobs:
  build:
    runs-on: macOS-latest
    steps:
    - uses: actions/checkout@v6
    - name: Show disk space at start
      run: df -h
    - name: Free up disk space
      run: sudo rm -rf /usr/local/lib/android
    - name: Show disk space after freeing up
      run: df -h
    - name: Install system deps
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages install-system-deps --recursive watchman
    - id: paths
      name: Query paths
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages query-paths --recursive --src-dir=. watchman  >> "$GITHUB_OUTPUT"
    - name: Install Rust Stable
      uses: dtolnay/rust-toolchain@stable
    - name: Fetch boost
      if: ${{ steps.paths.outputs.boost_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests boost
    - name: Fetch ninja
      if: ${{ steps.paths.outputs.ninja_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests ninja
    - name: Fetch cmake
      if: ${{ steps.paths.outputs.cmake_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests cmake
    - name: Fetch cpptoml
      if: ${{ steps.paths.outputs.cpptoml_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests cpptoml
    - name: Fetch fmt
      if: ${{ steps.paths.outputs.fmt_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fmt
    - name: Fetch gflags
      if: ${{ steps.paths.outputs.gflags_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests gflags
    - name: Fetch glog
      if: ${{ steps.paths.outputs.glog_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests glog
    - name: Fetch googletest
      if: ${{ steps.paths.outputs.googletest_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests googletest
    - name: Fetch xxhash
      if: ${{ steps.paths.outputs.xxhash_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests xxhash
    - name: Fetch zstd
      if: ${{ steps.paths.outputs.zstd_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests zstd
    - name: Fetch double-conversion
      if: ${{ steps.paths.outputs.double-conversion_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests double-conversion
    - name: Fetch fast_float
      if: ${{ steps.paths.outputs.fast_float_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fast_float
    - name: Fetch libdwarf
      if: ${{ steps.paths.outputs.libdwarf_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libdwarf
    - name: Fetch lz4
      if: ${{ steps.paths.outputs.lz4_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests lz4
    - name: Fetch openssl
      if: ${{ steps.paths.outputs.openssl_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests openssl
    - name: Fetch snappy
      if: ${{ steps.paths.outputs.snappy_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests snappy
    - name: Fetch pcre2
      if: ${{ steps.paths.outputs.pcre2_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests pcre2
    - name: Fetch python-setuptools-69
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests python-setuptools-69
    - name: Fetch libevent
      if: ${{ steps.paths.outputs.libevent_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libevent
    - name: Fetch liboqs
      if: ${{ steps.paths.outputs.liboqs_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests liboqs
    - name: Fetch zlib
      if: ${{ steps.paths.outputs.zlib_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests zlib
    - name: Fetch autoconf
      if: ${{ steps.paths.outputs.autoconf_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests autoconf
    - name: Fetch automake
      if: ${{ steps.paths.outputs.automake_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests automake
    - name: Fetch libtool
      if: ${{ steps.paths.outputs.libtool_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libtool
    - name: Fetch libsodium
      if: ${{ steps.paths.outputs.libsodium_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests libsodium
    - name: Fetch xz
      if: ${{ steps.paths.outputs.xz_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests xz
    - name: Fetch folly
      if: ${{ steps.paths.outputs.folly_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests folly
    - name: Fetch fizz
      if: ${{ steps.paths.outputs.fizz_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fizz
    - name: Fetch mvfst
      if: ${{ steps.paths.outputs.mvfst_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests mvfst
    - name: Fetch wangle
      if: ${{ steps.paths.outputs.wangle_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests wangle
    - name: Fetch fbthrift
      if: ${{ steps.paths.outputs.fbthrift_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fbthrift
    - name: Fetch fb303
      if: ${{ steps.paths.outputs.fb303_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests fb303
    - name: Fetch edencommon
      if: ${{ steps.paths.outputs.edencommon_SOURCE }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fetch --no-tests edencommon
    - name: Restore boost from cache
      id: restore_boost
      if: ${{ steps.paths.outputs.boost_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.boost_INSTALL }}
       key: ${{ steps.paths.outputs.boost_CACHE_KEY }}-install
    - name: Build boost
      if: ${{ steps.paths.outputs.boost_SOURCE && ! steps.restore_boost.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests boost
    - name: Save boost to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.boost_SOURCE && ! steps.restore_boost.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.boost_INSTALL }}
       key: ${{ steps.paths.outputs.boost_CACHE_KEY }}-install
    - name: Restore ninja from cache
      id: restore_ninja
      if: ${{ steps.paths.outputs.ninja_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.ninja_INSTALL }}
       key: ${{ steps.paths.outputs.ninja_CACHE_KEY }}-install
    - name: Build ninja
      if: ${{ steps.paths.outputs.ninja_SOURCE && ! steps.restore_ninja.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests ninja
    - name: Save ninja to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.ninja_SOURCE && ! steps.restore_ninja.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.ninja_INSTALL }}
       key: ${{ steps.paths.outputs.ninja_CACHE_KEY }}-install
    - name: Restore cmake from cache
      id: restore_cmake
      if: ${{ steps.paths.outputs.cmake_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.cmake_INSTALL }}
       key: ${{ steps.paths.outputs.cmake_CACHE_KEY }}-install
    - name: Build cmake
      if: ${{ steps.paths.outputs.cmake_SOURCE && ! steps.restore_cmake.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests cmake
    - name: Save cmake to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.cmake_SOURCE && ! steps.restore_cmake.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.cmake_INSTALL }}
       key: ${{ steps.paths.outputs.cmake_CACHE_KEY }}-install
    - name: Restore cpptoml from cache
      id: restore_cpptoml
      if: ${{ steps.paths.outputs.cpptoml_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.cpptoml_INSTALL }}
       key: ${{ steps.paths.outputs.cpptoml_CACHE_KEY }}-install
    - name: Build cpptoml
      if: ${{ steps.paths.outputs.cpptoml_SOURCE && ! steps.restore_cpptoml.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests cpptoml
    - name: Save cpptoml to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.cpptoml_SOURCE && ! steps.restore_cpptoml.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.cpptoml_INSTALL }}
       key: ${{ steps.paths.outputs.cpptoml_CACHE_KEY }}-install
    - name: Restore fmt from cache
      id: restore_fmt
      if: ${{ steps.paths.outputs.fmt_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fmt_INSTALL }}
       key: ${{ steps.paths.outputs.fmt_CACHE_KEY }}-install
    - name: Build fmt
      if: ${{ steps.paths.outputs.fmt_SOURCE && ! steps.restore_fmt.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests fmt
    - name: Save fmt to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fmt_SOURCE && ! steps.restore_fmt.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fmt_INSTALL }}
       key: ${{ steps.paths.outputs.fmt_CACHE_KEY }}-install
    - name: Restore gflags from cache
      id: restore_gflags
      if: ${{ steps.paths.outputs.gflags_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.gflags_INSTALL }}
       key: ${{ steps.paths.outputs.gflags_CACHE_KEY }}-install
    - name: Build gflags
      if: ${{ steps.paths.outputs.gflags_SOURCE && ! steps.restore_gflags.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests gflags
    - name: Save gflags to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.gflags_SOURCE && ! steps.restore_gflags.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.gflags_INSTALL }}
       key: ${{ steps.paths.outputs.gflags_CACHE_KEY }}-install
    - name: Restore glog from cache
      id: restore_glog
      if: ${{ steps.paths.outputs.glog_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.glog_INSTALL }}
       key: ${{ steps.paths.outputs.glog_CACHE_KEY }}-install
    - name: Build glog
      if: ${{ steps.paths.outputs.glog_SOURCE && ! steps.restore_glog.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests glog
    - name: Save glog to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.glog_SOURCE && ! steps.restore_glog.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.glog_INSTALL }}
       key: ${{ steps.paths.outputs.glog_CACHE_KEY }}-install
    - name: Restore googletest from cache
      id: restore_googletest
      if: ${{ steps.paths.outputs.googletest_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.googletest_INSTALL }}
       key: ${{ steps.paths.outputs.googletest_CACHE_KEY }}-install
    - name: Build googletest
      if: ${{ steps.paths.outputs.googletest_SOURCE && ! steps.restore_googletest.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests googletest
    - name: Save googletest to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.googletest_SOURCE && ! steps.restore_googletest.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.googletest_INSTALL }}
       key: ${{ steps.paths.outputs.googletest_CACHE_KEY }}-install
    - name: Restore xxhash from cache
      id: restore_xxhash
      if: ${{ steps.paths.outputs.xxhash_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.xxhash_INSTALL }}
       key: ${{ steps.paths.outputs.xxhash_CACHE_KEY }}-install
    - name: Build xxhash
      if: ${{ steps.paths.outputs.xxhash_SOURCE && ! steps.restore_xxhash.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests xxhash
    - name: Save xxhash to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.xxhash_SOURCE && ! steps.restore_xxhash.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.xxhash_INSTALL }}
       key: ${{ steps.paths.outputs.xxhash_CACHE_KEY }}-install
    - name: Restore zstd from cache
      id: restore_zstd
      if: ${{ steps.paths.outputs.zstd_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.zstd_INSTALL }}
       key: ${{ steps.paths.outputs.zstd_CACHE_KEY }}-install
    - name: Build zstd
      if: ${{ steps.paths.outputs.zstd_SOURCE && ! steps.restore_zstd.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests zstd
    - name: Save zstd to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.zstd_SOURCE && ! steps.restore_zstd.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.zstd_INSTALL }}
       key: ${{ steps.paths.outputs.zstd_CACHE_KEY }}-install
    - name: Restore double-conversion from cache
      id: restore_double-conversion
      if: ${{ steps.paths.outputs.double-conversion_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.double-conversion_INSTALL }}
       key: ${{ steps.paths.outputs.double-conversion_CACHE_KEY }}-install
    - name: Build double-conversion
      if: ${{ steps.paths.outputs.double-conversion_SOURCE && ! steps.restore_double-conversion.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests double-conversion
    - name: Save double-conversion to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.double-conversion_SOURCE && ! steps.restore_double-conversion.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.double-conversion_INSTALL }}
       key: ${{ steps.paths.outputs.double-conversion_CACHE_KEY }}-install
    - name: Restore fast_float from cache
      id: restore_fast_float
      if: ${{ steps.paths.outputs.fast_float_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fast_float_INSTALL }}
       key: ${{ steps.paths.outputs.fast_float_CACHE_KEY }}-install
    - name: Build fast_float
      if: ${{ steps.paths.outputs.fast_float_SOURCE && ! steps.restore_fast_float.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests fast_float
    - name: Save fast_float to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fast_float_SOURCE && ! steps.restore_fast_float.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fast_float_INSTALL }}
       key: ${{ steps.paths.outputs.fast_float_CACHE_KEY }}-install
    - name: Restore libdwarf from cache
      id: restore_libdwarf
      if: ${{ steps.paths.outputs.libdwarf_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libdwarf_INSTALL }}
       key: ${{ steps.paths.outputs.libdwarf_CACHE_KEY }}-install
    - name: Build libdwarf
      if: ${{ steps.paths.outputs.libdwarf_SOURCE && ! steps.restore_libdwarf.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libdwarf
    - name: Save libdwarf to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libdwarf_SOURCE && ! steps.restore_libdwarf.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libdwarf_INSTALL }}
       key: ${{ steps.paths.outputs.libdwarf_CACHE_KEY }}-install
    - name: Restore lz4 from cache
      id: restore_lz4
      if: ${{ steps.paths.outputs.lz4_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.lz4_INSTALL }}
       key: ${{ steps.paths.outputs.lz4_CACHE_KEY }}-install
    - name: Build lz4
      if: ${{ steps.paths.outputs.lz4_SOURCE && ! steps.restore_lz4.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests lz4
    - name: Save lz4 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.lz4_SOURCE && ! steps.restore_lz4.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.lz4_INSTALL }}
       key: ${{ steps.paths.outputs.lz4_CACHE_KEY }}-install
    - name: Restore openssl from cache
      id: restore_openssl
      if: ${{ steps.paths.outputs.openssl_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.openssl_INSTALL }}
       key: ${{ steps.paths.outputs.openssl_CACHE_KEY }}-install
    - name: Build openssl
      if: ${{ steps.paths.outputs.openssl_SOURCE && ! steps.restore_openssl.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests openssl
    - name: Save openssl to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.openssl_SOURCE && ! steps.restore_openssl.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.openssl_INSTALL }}
       key: ${{ steps.paths.outputs.openssl_CACHE_KEY }}-install
    - name: Restore snappy from cache
      id: restore_snappy
      if: ${{ steps.paths.outputs.snappy_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.snappy_INSTALL }}
       key: ${{ steps.paths.outputs.snappy_CACHE_KEY }}-install
    - name: Build snappy
      if: ${{ steps.paths.outputs.snappy_SOURCE && ! steps.restore_snappy.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests snappy
    - name: Save snappy to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.snappy_SOURCE && ! steps.restore_snappy.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.snappy_INSTALL }}
       key: ${{ steps.paths.outputs.snappy_CACHE_KEY }}-install
    - name: Restore pcre2 from cache
      id: restore_pcre2
      if: ${{ steps.paths.outputs.pcre2_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.pcre2_INSTALL }}
       key: ${{ steps.paths.outputs.pcre2_CACHE_KEY }}-install
    - name: Build pcre2
      if: ${{ steps.paths.outputs.pcre2_SOURCE && ! steps.restore_pcre2.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests pcre2
    - name: Save pcre2 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.pcre2_SOURCE && ! steps.restore_pcre2.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.pcre2_INSTALL }}
       key: ${{ steps.paths.outputs.pcre2_CACHE_KEY }}-install
    - name: Restore python-setuptools-69 from cache
      id: restore_python-setuptools-69
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.python-setuptools-69_INSTALL }}
       key: ${{ steps.paths.outputs.python-setuptools-69_CACHE_KEY }}-install
    - name: Build python-setuptools-69
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE && ! steps.restore_python-setuptools-69.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests python-setuptools-69
    - name: Save python-setuptools-69 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE && ! steps.restore_python-setuptools-69.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.python-setuptools-69_INSTALL }}
       key: ${{ steps.paths.outputs.python-setuptools-69_CACHE_KEY }}-install
    - name: Restore libevent from cache
      id: restore_libevent
      if: ${{ steps.paths.outputs.libevent_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libevent_INSTALL }}
       key: ${{ steps.paths.outputs.libevent_CACHE_KEY }}-install
    - name: Build libevent
      if: ${{ steps.paths.outputs.libevent_SOURCE && ! steps.restore_libevent.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libevent
    - name: Save libevent to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libevent_SOURCE && ! steps.restore_libevent.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libevent_INSTALL }}
       key: ${{ steps.paths.outputs.libevent_CACHE_KEY }}-install
    - name: Restore liboqs from cache
      id: restore_liboqs
      if: ${{ steps.paths.outputs.liboqs_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.liboqs_INSTALL }}
       key: ${{ steps.paths.outputs.liboqs_CACHE_KEY }}-install
    - name: Build liboqs
      if: ${{ steps.paths.outputs.liboqs_SOURCE && ! steps.restore_liboqs.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests liboqs
    - name: Save liboqs to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.liboqs_SOURCE && ! steps.restore_liboqs.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.liboqs_INSTALL }}
       key: ${{ steps.paths.outputs.liboqs_CACHE_KEY }}-install
    - name: Restore zlib from cache
      id: restore_zlib
      if: ${{ steps.paths.outputs.zlib_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.zlib_INSTALL }}
       key: ${{ steps.paths.outputs.zlib_CACHE_KEY }}-install
    - name: Build zlib
      if: ${{ steps.paths.outputs.zlib_SOURCE && ! steps.restore_zlib.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests zlib
    - name: Save zlib to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.zlib_SOURCE && ! steps.restore_zlib.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.zlib_INSTALL }}
       key: ${{ steps.paths.outputs.zlib_CACHE_KEY }}-install
    - name: Restore autoconf from cache
      id: restore_autoconf
      if: ${{ steps.paths.outputs.autoconf_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.autoconf_INSTALL }}
       key: ${{ steps.paths.outputs.autoconf_CACHE_KEY }}-install
    - name: Build autoconf
      if: ${{ steps.paths.outputs.autoconf_SOURCE && ! steps.restore_autoconf.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests autoconf
    - name: Save autoconf to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.autoconf_SOURCE && ! steps.restore_autoconf.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.autoconf_INSTALL }}
       key: ${{ steps.paths.outputs.autoconf_CACHE_KEY }}-install
    - name: Restore automake from cache
      id: restore_automake
      if: ${{ steps.paths.outputs.automake_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.automake_INSTALL }}
       key: ${{ steps.paths.outputs.automake_CACHE_KEY }}-install
    - name: Build automake
      if: ${{ steps.paths.outputs.automake_SOURCE && ! steps.restore_automake.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests automake
    - name: Save automake to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.automake_SOURCE && ! steps.restore_automake.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.automake_INSTALL }}
       key: ${{ steps.paths.outputs.automake_CACHE_KEY }}-install
    - name: Restore libtool from cache
      id: restore_libtool
      if: ${{ steps.paths.outputs.libtool_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libtool_INSTALL }}
       key: ${{ steps.paths.outputs.libtool_CACHE_KEY }}-install
    - name: Build libtool
      if: ${{ steps.paths.outputs.libtool_SOURCE && ! steps.restore_libtool.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libtool
    - name: Save libtool to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libtool_SOURCE && ! steps.restore_libtool.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libtool_INSTALL }}
       key: ${{ steps.paths.outputs.libtool_CACHE_KEY }}-install
    - name: Restore libsodium from cache
      id: restore_libsodium
      if: ${{ steps.paths.outputs.libsodium_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libsodium_INSTALL }}
       key: ${{ steps.paths.outputs.libsodium_CACHE_KEY }}-install
    - name: Build libsodium
      if: ${{ steps.paths.outputs.libsodium_SOURCE && ! steps.restore_libsodium.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests libsodium
    - name: Save libsodium to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libsodium_SOURCE && ! steps.restore_libsodium.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libsodium_INSTALL }}
       key: ${{ steps.paths.outputs.libsodium_CACHE_KEY }}-install
    - name: Restore xz from cache
      id: restore_xz
      if: ${{ steps.paths.outputs.xz_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.xz_INSTALL }}
       key: ${{ steps.paths.outputs.xz_CACHE_KEY }}-install
    - name: Build xz
      if: ${{ steps.paths.outputs.xz_SOURCE && ! steps.restore_xz.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests xz
    - name: Save xz to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.xz_SOURCE && ! steps.restore_xz.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.xz_INSTALL }}
       key: ${{ steps.paths.outputs.xz_CACHE_KEY }}-install
    - name: Restore folly from cache
      id: restore_folly
      if: ${{ steps.paths.outputs.folly_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.folly_INSTALL }}
       key: ${{ steps.paths.outputs.folly_CACHE_KEY }}-install
    - name: Build folly
      if: ${{ steps.paths.outputs.folly_SOURCE && ! steps.restore_folly.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests folly
    - name: Save folly to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.folly_SOURCE && ! steps.restore_folly.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.folly_INSTALL }}
       key: ${{ steps.paths.outputs.folly_CACHE_KEY }}-install
    - name: Restore fizz from cache
      id: restore_fizz
      if: ${{ steps.paths.outputs.fizz_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fizz_INSTALL }}
       key: ${{ steps.paths.outputs.fizz_CACHE_KEY }}-install
    - name: Build fizz
      if: ${{ steps.paths.outputs.fizz_SOURCE && ! steps.restore_fizz.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests fizz
    - name: Save fizz to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fizz_SOURCE && ! steps.restore_fizz.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fizz_INSTALL }}
       key: ${{ steps.paths.outputs.fizz_CACHE_KEY }}-install
    - name: Restore mvfst from cache
      id: restore_mvfst
      if: ${{ steps.paths.outputs.mvfst_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.mvfst_INSTALL }}
       key: ${{ steps.paths.outputs.mvfst_CACHE_KEY }}-install
    - name: Build mvfst
      if: ${{ steps.paths.outputs.mvfst_SOURCE && ! steps.restore_mvfst.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests mvfst
    - name: Save mvfst to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.mvfst_SOURCE && ! steps.restore_mvfst.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.mvfst_INSTALL }}
       key: ${{ steps.paths.outputs.mvfst_CACHE_KEY }}-install
    - name: Restore wangle from cache
      id: restore_wangle
      if: ${{ steps.paths.outputs.wangle_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.wangle_INSTALL }}
       key: ${{ steps.paths.outputs.wangle_CACHE_KEY }}-install
    - name: Build wangle
      if: ${{ steps.paths.outputs.wangle_SOURCE && ! steps.restore_wangle.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests wangle
    - name: Save wangle to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.wangle_SOURCE && ! steps.restore_wangle.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.wangle_INSTALL }}
       key: ${{ steps.paths.outputs.wangle_CACHE_KEY }}-install
    - name: Restore fbthrift from cache
      id: restore_fbthrift
      if: ${{ steps.paths.outputs.fbthrift_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fbthrift_INSTALL }}
       key: ${{ steps.paths.outputs.fbthrift_CACHE_KEY }}-install
    - name: Build fbthrift
      if: ${{ steps.paths.outputs.fbthrift_SOURCE && ! steps.restore_fbthrift.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests fbthrift
    - name: Save fbthrift to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fbthrift_SOURCE && ! steps.restore_fbthrift.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fbthrift_INSTALL }}
       key: ${{ steps.paths.outputs.fbthrift_CACHE_KEY }}-install
    - name: Restore fb303 from cache
      id: restore_fb303
      if: ${{ steps.paths.outputs.fb303_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fb303_INSTALL }}
       key: ${{ steps.paths.outputs.fb303_CACHE_KEY }}-install
    - name: Build fb303
      if: ${{ steps.paths.outputs.fb303_SOURCE && ! steps.restore_fb303.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests fb303
    - name: Save fb303 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fb303_SOURCE && ! steps.restore_fb303.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fb303_INSTALL }}
       key: ${{ steps.paths.outputs.fb303_CACHE_KEY }}-install
    - name: Restore edencommon from cache
      id: restore_edencommon
      if: ${{ steps.paths.outputs.edencommon_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.edencommon_INSTALL }}
       key: ${{ steps.paths.outputs.edencommon_CACHE_KEY }}-install
    - name: Build edencommon
      if: ${{ steps.paths.outputs.edencommon_SOURCE && ! steps.restore_edencommon.outputs.cache-hit }}
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --free-up-disk --no-tests edencommon
    - name: Save edencommon to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.edencommon_SOURCE && ! steps.restore_edencommon.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.edencommon_INSTALL }}
       key: ${{ steps.paths.outputs.edencommon_CACHE_KEY }}-install
    - name: Build watchman
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages build --src-dir=. watchman --project-install-prefix watchman:/usr/local
    - name: Copy artifacts
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fixup-dyn-deps --src-dir=. watchman _artifacts/mac --project-install-prefix watchman:/usr/local --final-install-prefix /usr/local
    - uses: actions/upload-artifact@v6
      with:
        name: watchman
        path: _artifacts
    - name: Test watchman
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages test --src-dir=. watchman --project-install-prefix watchman:/usr/local
    - name: Show disk space at end
      if: always()
      run: df -h


================================================
FILE: .github/workflows/getdeps_windows.yml
================================================
# This file was @generated by getdeps.py

name: windows

on:
  push:
    branches:
    - main
  pull_request:
    branches:
    - main

permissions:
  contents: read  #  to fetch code (actions/checkout)

jobs:
  build:
    runs-on: windows-2022
    steps:
    - name: Export boost environment
      run: "echo BOOST_ROOT=%BOOST_ROOT_1_83_0% >> %GITHUB_ENV%"
      shell: cmd
    - name: Fix Git config
      run: >
        git config --system core.longpaths true &&
        git config --system core.autocrlf false &&
        git config --system core.symlinks true
      shell: cmd
    - uses: actions/checkout@v6
    - id: paths
      name: Query paths
      run: python build/fbcode_builder/getdeps.py query-paths --recursive --src-dir=. watchman  >> $env:GITHUB_OUTPUT
      shell: pwsh
    - name: Install Rust Stable
      uses: dtolnay/rust-toolchain@stable
    - name: Fetch boost
      if: ${{ steps.paths.outputs.boost_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests boost
    - name: Fetch ninja
      if: ${{ steps.paths.outputs.ninja_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests ninja
    - name: Fetch cmake
      if: ${{ steps.paths.outputs.cmake_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests cmake
    - name: Fetch cpptoml
      if: ${{ steps.paths.outputs.cpptoml_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests cpptoml
    - name: Fetch fmt
      if: ${{ steps.paths.outputs.fmt_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests fmt
    - name: Fetch gflags
      if: ${{ steps.paths.outputs.gflags_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests gflags
    - name: Fetch glog
      if: ${{ steps.paths.outputs.glog_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests glog
    - name: Fetch googletest
      if: ${{ steps.paths.outputs.googletest_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests googletest
    - name: Fetch libsodium
      if: ${{ steps.paths.outputs.libsodium_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests libsodium
    - name: Fetch xxhash
      if: ${{ steps.paths.outputs.xxhash_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests xxhash
    - name: Fetch zstd
      if: ${{ steps.paths.outputs.zstd_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests zstd
    - name: Fetch double-conversion
      if: ${{ steps.paths.outputs.double-conversion_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests double-conversion
    - name: Fetch fast_float
      if: ${{ steps.paths.outputs.fast_float_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests fast_float
    - name: Fetch libdwarf
      if: ${{ steps.paths.outputs.libdwarf_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests libdwarf
    - name: Fetch lz4
      if: ${{ steps.paths.outputs.lz4_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests lz4
    - name: Fetch snappy
      if: ${{ steps.paths.outputs.snappy_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests snappy
    - name: Fetch zlib
      if: ${{ steps.paths.outputs.zlib_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests zlib
    - name: Fetch pcre2
      if: ${{ steps.paths.outputs.pcre2_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests pcre2
    - name: Fetch python-setuptools-69
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests python-setuptools-69
    - name: Fetch jom
      if: ${{ steps.paths.outputs.jom_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests jom
    - name: Fetch perl
      if: ${{ steps.paths.outputs.perl_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests perl
    - name: Fetch openssl
      if: ${{ steps.paths.outputs.openssl_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests openssl
    - name: Fetch libevent
      if: ${{ steps.paths.outputs.libevent_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests libevent
    - name: Fetch folly
      if: ${{ steps.paths.outputs.folly_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests folly
    - name: Fetch liboqs
      if: ${{ steps.paths.outputs.liboqs_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests liboqs
    - name: Fetch fizz
      if: ${{ steps.paths.outputs.fizz_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests fizz
    - name: Fetch mvfst
      if: ${{ steps.paths.outputs.mvfst_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests mvfst
    - name: Fetch wangle
      if: ${{ steps.paths.outputs.wangle_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests wangle
    - name: Fetch fbthrift
      if: ${{ steps.paths.outputs.fbthrift_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests fbthrift
    - name: Fetch fb303
      if: ${{ steps.paths.outputs.fb303_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests fb303
    - name: Fetch edencommon
      if: ${{ steps.paths.outputs.edencommon_SOURCE }}
      run: python build/fbcode_builder/getdeps.py fetch --no-tests edencommon
    - name: Restore boost from cache
      id: restore_boost
      if: ${{ steps.paths.outputs.boost_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.boost_INSTALL }}
       key: ${{ steps.paths.outputs.boost_CACHE_KEY }}-install
    - name: Build boost
      if: ${{ steps.paths.outputs.boost_SOURCE && ! steps.restore_boost.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests boost
    - name: Save boost to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.boost_SOURCE && ! steps.restore_boost.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.boost_INSTALL }}
       key: ${{ steps.paths.outputs.boost_CACHE_KEY }}-install
    - name: Restore ninja from cache
      id: restore_ninja
      if: ${{ steps.paths.outputs.ninja_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.ninja_INSTALL }}
       key: ${{ steps.paths.outputs.ninja_CACHE_KEY }}-install
    - name: Build ninja
      if: ${{ steps.paths.outputs.ninja_SOURCE && ! steps.restore_ninja.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests ninja
    - name: Save ninja to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.ninja_SOURCE && ! steps.restore_ninja.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.ninja_INSTALL }}
       key: ${{ steps.paths.outputs.ninja_CACHE_KEY }}-install
    - name: Restore cmake from cache
      id: restore_cmake
      if: ${{ steps.paths.outputs.cmake_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.cmake_INSTALL }}
       key: ${{ steps.paths.outputs.cmake_CACHE_KEY }}-install
    - name: Build cmake
      if: ${{ steps.paths.outputs.cmake_SOURCE && ! steps.restore_cmake.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests cmake
    - name: Save cmake to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.cmake_SOURCE && ! steps.restore_cmake.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.cmake_INSTALL }}
       key: ${{ steps.paths.outputs.cmake_CACHE_KEY }}-install
    - name: Restore cpptoml from cache
      id: restore_cpptoml
      if: ${{ steps.paths.outputs.cpptoml_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.cpptoml_INSTALL }}
       key: ${{ steps.paths.outputs.cpptoml_CACHE_KEY }}-install
    - name: Build cpptoml
      if: ${{ steps.paths.outputs.cpptoml_SOURCE && ! steps.restore_cpptoml.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests cpptoml
    - name: Save cpptoml to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.cpptoml_SOURCE && ! steps.restore_cpptoml.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.cpptoml_INSTALL }}
       key: ${{ steps.paths.outputs.cpptoml_CACHE_KEY }}-install
    - name: Restore fmt from cache
      id: restore_fmt
      if: ${{ steps.paths.outputs.fmt_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fmt_INSTALL }}
       key: ${{ steps.paths.outputs.fmt_CACHE_KEY }}-install
    - name: Build fmt
      if: ${{ steps.paths.outputs.fmt_SOURCE && ! steps.restore_fmt.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests fmt
    - name: Save fmt to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fmt_SOURCE && ! steps.restore_fmt.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fmt_INSTALL }}
       key: ${{ steps.paths.outputs.fmt_CACHE_KEY }}-install
    - name: Restore gflags from cache
      id: restore_gflags
      if: ${{ steps.paths.outputs.gflags_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.gflags_INSTALL }}
       key: ${{ steps.paths.outputs.gflags_CACHE_KEY }}-install
    - name: Build gflags
      if: ${{ steps.paths.outputs.gflags_SOURCE && ! steps.restore_gflags.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests gflags
    - name: Save gflags to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.gflags_SOURCE && ! steps.restore_gflags.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.gflags_INSTALL }}
       key: ${{ steps.paths.outputs.gflags_CACHE_KEY }}-install
    - name: Restore glog from cache
      id: restore_glog
      if: ${{ steps.paths.outputs.glog_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.glog_INSTALL }}
       key: ${{ steps.paths.outputs.glog_CACHE_KEY }}-install
    - name: Build glog
      if: ${{ steps.paths.outputs.glog_SOURCE && ! steps.restore_glog.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests glog
    - name: Save glog to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.glog_SOURCE && ! steps.restore_glog.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.glog_INSTALL }}
       key: ${{ steps.paths.outputs.glog_CACHE_KEY }}-install
    - name: Restore googletest from cache
      id: restore_googletest
      if: ${{ steps.paths.outputs.googletest_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.googletest_INSTALL }}
       key: ${{ steps.paths.outputs.googletest_CACHE_KEY }}-install
    - name: Build googletest
      if: ${{ steps.paths.outputs.googletest_SOURCE && ! steps.restore_googletest.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests googletest
    - name: Save googletest to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.googletest_SOURCE && ! steps.restore_googletest.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.googletest_INSTALL }}
       key: ${{ steps.paths.outputs.googletest_CACHE_KEY }}-install
    - name: Restore libsodium from cache
      id: restore_libsodium
      if: ${{ steps.paths.outputs.libsodium_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libsodium_INSTALL }}
       key: ${{ steps.paths.outputs.libsodium_CACHE_KEY }}-install
    - name: Build libsodium
      if: ${{ steps.paths.outputs.libsodium_SOURCE && ! steps.restore_libsodium.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests libsodium
    - name: Save libsodium to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libsodium_SOURCE && ! steps.restore_libsodium.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libsodium_INSTALL }}
       key: ${{ steps.paths.outputs.libsodium_CACHE_KEY }}-install
    - name: Restore xxhash from cache
      id: restore_xxhash
      if: ${{ steps.paths.outputs.xxhash_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.xxhash_INSTALL }}
       key: ${{ steps.paths.outputs.xxhash_CACHE_KEY }}-install
    - name: Build xxhash
      if: ${{ steps.paths.outputs.xxhash_SOURCE && ! steps.restore_xxhash.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests xxhash
    - name: Save xxhash to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.xxhash_SOURCE && ! steps.restore_xxhash.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.xxhash_INSTALL }}
       key: ${{ steps.paths.outputs.xxhash_CACHE_KEY }}-install
    - name: Restore zstd from cache
      id: restore_zstd
      if: ${{ steps.paths.outputs.zstd_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.zstd_INSTALL }}
       key: ${{ steps.paths.outputs.zstd_CACHE_KEY }}-install
    - name: Build zstd
      if: ${{ steps.paths.outputs.zstd_SOURCE && ! steps.restore_zstd.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests zstd
    - name: Save zstd to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.zstd_SOURCE && ! steps.restore_zstd.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.zstd_INSTALL }}
       key: ${{ steps.paths.outputs.zstd_CACHE_KEY }}-install
    - name: Restore double-conversion from cache
      id: restore_double-conversion
      if: ${{ steps.paths.outputs.double-conversion_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.double-conversion_INSTALL }}
       key: ${{ steps.paths.outputs.double-conversion_CACHE_KEY }}-install
    - name: Build double-conversion
      if: ${{ steps.paths.outputs.double-conversion_SOURCE && ! steps.restore_double-conversion.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests double-conversion
    - name: Save double-conversion to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.double-conversion_SOURCE && ! steps.restore_double-conversion.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.double-conversion_INSTALL }}
       key: ${{ steps.paths.outputs.double-conversion_CACHE_KEY }}-install
    - name: Restore fast_float from cache
      id: restore_fast_float
      if: ${{ steps.paths.outputs.fast_float_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fast_float_INSTALL }}
       key: ${{ steps.paths.outputs.fast_float_CACHE_KEY }}-install
    - name: Build fast_float
      if: ${{ steps.paths.outputs.fast_float_SOURCE && ! steps.restore_fast_float.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests fast_float
    - name: Save fast_float to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fast_float_SOURCE && ! steps.restore_fast_float.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fast_float_INSTALL }}
       key: ${{ steps.paths.outputs.fast_float_CACHE_KEY }}-install
    - name: Restore libdwarf from cache
      id: restore_libdwarf
      if: ${{ steps.paths.outputs.libdwarf_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libdwarf_INSTALL }}
       key: ${{ steps.paths.outputs.libdwarf_CACHE_KEY }}-install
    - name: Build libdwarf
      if: ${{ steps.paths.outputs.libdwarf_SOURCE && ! steps.restore_libdwarf.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests libdwarf
    - name: Save libdwarf to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libdwarf_SOURCE && ! steps.restore_libdwarf.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libdwarf_INSTALL }}
       key: ${{ steps.paths.outputs.libdwarf_CACHE_KEY }}-install
    - name: Restore lz4 from cache
      id: restore_lz4
      if: ${{ steps.paths.outputs.lz4_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.lz4_INSTALL }}
       key: ${{ steps.paths.outputs.lz4_CACHE_KEY }}-install
    - name: Build lz4
      if: ${{ steps.paths.outputs.lz4_SOURCE && ! steps.restore_lz4.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests lz4
    - name: Save lz4 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.lz4_SOURCE && ! steps.restore_lz4.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.lz4_INSTALL }}
       key: ${{ steps.paths.outputs.lz4_CACHE_KEY }}-install
    - name: Restore snappy from cache
      id: restore_snappy
      if: ${{ steps.paths.outputs.snappy_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.snappy_INSTALL }}
       key: ${{ steps.paths.outputs.snappy_CACHE_KEY }}-install
    - name: Build snappy
      if: ${{ steps.paths.outputs.snappy_SOURCE && ! steps.restore_snappy.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests snappy
    - name: Save snappy to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.snappy_SOURCE && ! steps.restore_snappy.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.snappy_INSTALL }}
       key: ${{ steps.paths.outputs.snappy_CACHE_KEY }}-install
    - name: Restore zlib from cache
      id: restore_zlib
      if: ${{ steps.paths.outputs.zlib_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.zlib_INSTALL }}
       key: ${{ steps.paths.outputs.zlib_CACHE_KEY }}-install
    - name: Build zlib
      if: ${{ steps.paths.outputs.zlib_SOURCE && ! steps.restore_zlib.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests zlib
    - name: Save zlib to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.zlib_SOURCE && ! steps.restore_zlib.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.zlib_INSTALL }}
       key: ${{ steps.paths.outputs.zlib_CACHE_KEY }}-install
    - name: Restore pcre2 from cache
      id: restore_pcre2
      if: ${{ steps.paths.outputs.pcre2_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.pcre2_INSTALL }}
       key: ${{ steps.paths.outputs.pcre2_CACHE_KEY }}-install
    - name: Build pcre2
      if: ${{ steps.paths.outputs.pcre2_SOURCE && ! steps.restore_pcre2.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests pcre2
    - name: Save pcre2 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.pcre2_SOURCE && ! steps.restore_pcre2.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.pcre2_INSTALL }}
       key: ${{ steps.paths.outputs.pcre2_CACHE_KEY }}-install
    - name: Restore python-setuptools-69 from cache
      id: restore_python-setuptools-69
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.python-setuptools-69_INSTALL }}
       key: ${{ steps.paths.outputs.python-setuptools-69_CACHE_KEY }}-install
    - name: Build python-setuptools-69
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE && ! steps.restore_python-setuptools-69.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests python-setuptools-69
    - name: Save python-setuptools-69 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.python-setuptools-69_SOURCE && ! steps.restore_python-setuptools-69.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.python-setuptools-69_INSTALL }}
       key: ${{ steps.paths.outputs.python-setuptools-69_CACHE_KEY }}-install
    - name: Restore jom from cache
      id: restore_jom
      if: ${{ steps.paths.outputs.jom_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.jom_INSTALL }}
       key: ${{ steps.paths.outputs.jom_CACHE_KEY }}-install
    - name: Build jom
      if: ${{ steps.paths.outputs.jom_SOURCE && ! steps.restore_jom.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests jom
    - name: Save jom to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.jom_SOURCE && ! steps.restore_jom.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.jom_INSTALL }}
       key: ${{ steps.paths.outputs.jom_CACHE_KEY }}-install
    - name: Restore perl from cache
      id: restore_perl
      if: ${{ steps.paths.outputs.perl_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.perl_INSTALL }}
       key: ${{ steps.paths.outputs.perl_CACHE_KEY }}-install
    - name: Build perl
      if: ${{ steps.paths.outputs.perl_SOURCE && ! steps.restore_perl.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests perl
    - name: Save perl to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.perl_SOURCE && ! steps.restore_perl.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.perl_INSTALL }}
       key: ${{ steps.paths.outputs.perl_CACHE_KEY }}-install
    - name: Restore openssl from cache
      id: restore_openssl
      if: ${{ steps.paths.outputs.openssl_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.openssl_INSTALL }}
       key: ${{ steps.paths.outputs.openssl_CACHE_KEY }}-install
    - name: Build openssl
      if: ${{ steps.paths.outputs.openssl_SOURCE && ! steps.restore_openssl.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests openssl
    - name: Save openssl to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.openssl_SOURCE && ! steps.restore_openssl.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.openssl_INSTALL }}
       key: ${{ steps.paths.outputs.openssl_CACHE_KEY }}-install
    - name: Restore libevent from cache
      id: restore_libevent
      if: ${{ steps.paths.outputs.libevent_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.libevent_INSTALL }}
       key: ${{ steps.paths.outputs.libevent_CACHE_KEY }}-install
    - name: Build libevent
      if: ${{ steps.paths.outputs.libevent_SOURCE && ! steps.restore_libevent.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests libevent
    - name: Save libevent to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.libevent_SOURCE && ! steps.restore_libevent.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.libevent_INSTALL }}
       key: ${{ steps.paths.outputs.libevent_CACHE_KEY }}-install
    - name: Restore folly from cache
      id: restore_folly
      if: ${{ steps.paths.outputs.folly_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.folly_INSTALL }}
       key: ${{ steps.paths.outputs.folly_CACHE_KEY }}-install
    - name: Build folly
      if: ${{ steps.paths.outputs.folly_SOURCE && ! steps.restore_folly.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests folly
    - name: Save folly to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.folly_SOURCE && ! steps.restore_folly.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.folly_INSTALL }}
       key: ${{ steps.paths.outputs.folly_CACHE_KEY }}-install
    - name: Restore liboqs from cache
      id: restore_liboqs
      if: ${{ steps.paths.outputs.liboqs_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.liboqs_INSTALL }}
       key: ${{ steps.paths.outputs.liboqs_CACHE_KEY }}-install
    - name: Build liboqs
      if: ${{ steps.paths.outputs.liboqs_SOURCE && ! steps.restore_liboqs.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests liboqs
    - name: Save liboqs to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.liboqs_SOURCE && ! steps.restore_liboqs.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.liboqs_INSTALL }}
       key: ${{ steps.paths.outputs.liboqs_CACHE_KEY }}-install
    - name: Restore fizz from cache
      id: restore_fizz
      if: ${{ steps.paths.outputs.fizz_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fizz_INSTALL }}
       key: ${{ steps.paths.outputs.fizz_CACHE_KEY }}-install
    - name: Build fizz
      if: ${{ steps.paths.outputs.fizz_SOURCE && ! steps.restore_fizz.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests fizz
    - name: Save fizz to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fizz_SOURCE && ! steps.restore_fizz.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fizz_INSTALL }}
       key: ${{ steps.paths.outputs.fizz_CACHE_KEY }}-install
    - name: Restore mvfst from cache
      id: restore_mvfst
      if: ${{ steps.paths.outputs.mvfst_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.mvfst_INSTALL }}
       key: ${{ steps.paths.outputs.mvfst_CACHE_KEY }}-install
    - name: Build mvfst
      if: ${{ steps.paths.outputs.mvfst_SOURCE && ! steps.restore_mvfst.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests mvfst
    - name: Save mvfst to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.mvfst_SOURCE && ! steps.restore_mvfst.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.mvfst_INSTALL }}
       key: ${{ steps.paths.outputs.mvfst_CACHE_KEY }}-install
    - name: Restore wangle from cache
      id: restore_wangle
      if: ${{ steps.paths.outputs.wangle_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.wangle_INSTALL }}
       key: ${{ steps.paths.outputs.wangle_CACHE_KEY }}-install
    - name: Build wangle
      if: ${{ steps.paths.outputs.wangle_SOURCE && ! steps.restore_wangle.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests wangle
    - name: Save wangle to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.wangle_SOURCE && ! steps.restore_wangle.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.wangle_INSTALL }}
       key: ${{ steps.paths.outputs.wangle_CACHE_KEY }}-install
    - name: Restore fbthrift from cache
      id: restore_fbthrift
      if: ${{ steps.paths.outputs.fbthrift_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fbthrift_INSTALL }}
       key: ${{ steps.paths.outputs.fbthrift_CACHE_KEY }}-install
    - name: Build fbthrift
      if: ${{ steps.paths.outputs.fbthrift_SOURCE && ! steps.restore_fbthrift.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests fbthrift
    - name: Save fbthrift to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fbthrift_SOURCE && ! steps.restore_fbthrift.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fbthrift_INSTALL }}
       key: ${{ steps.paths.outputs.fbthrift_CACHE_KEY }}-install
    - name: Restore fb303 from cache
      id: restore_fb303
      if: ${{ steps.paths.outputs.fb303_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.fb303_INSTALL }}
       key: ${{ steps.paths.outputs.fb303_CACHE_KEY }}-install
    - name: Build fb303
      if: ${{ steps.paths.outputs.fb303_SOURCE && ! steps.restore_fb303.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests fb303
    - name: Save fb303 to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.fb303_SOURCE && ! steps.restore_fb303.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.fb303_INSTALL }}
       key: ${{ steps.paths.outputs.fb303_CACHE_KEY }}-install
    - name: Restore edencommon from cache
      id: restore_edencommon
      if: ${{ steps.paths.outputs.edencommon_SOURCE }}
      uses: actions/cache/restore@v4
      with:
       path: ${{ steps.paths.outputs.edencommon_INSTALL }}
       key: ${{ steps.paths.outputs.edencommon_CACHE_KEY }}-install
    - name: Build edencommon
      if: ${{ steps.paths.outputs.edencommon_SOURCE && ! steps.restore_edencommon.outputs.cache-hit }}
      run: python build/fbcode_builder/getdeps.py build --free-up-disk --no-tests edencommon
    - name: Save edencommon to cache
      uses: actions/cache/save@v4
      if: ${{ steps.paths.outputs.edencommon_SOURCE && ! steps.restore_edencommon.outputs.cache-hit }}
      with:
       path: ${{ steps.paths.outputs.edencommon_INSTALL }}
       key: ${{ steps.paths.outputs.edencommon_CACHE_KEY }}-install
    - name: Build watchman
      run: python build/fbcode_builder/getdeps.py build --src-dir=. watchman
    - name: Copy artifacts
      run: python build/fbcode_builder/getdeps.py fixup-dyn-deps --src-dir=. watchman _artifacts/windows --final-install-prefix /usr/local
    - uses: actions/upload-artifact@v6
      with:
        name: watchman
        path: _artifacts
    - name: Test watchman
      run: python build/fbcode_builder/getdeps.py test --src-dir=. watchman


================================================
FILE: .github/workflows/package.yml
================================================
name: package

on: push

jobs:
  docker-ubuntu:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          build-args: "UBUNTU_VERSION=24.04"
          file: watchman/build/package/ubuntu-env/Dockerfile
          push: true
          tags: ${{ format('ghcr.io/{0}/watchman-build-env:latest', github.repository) }}

  clone-and-build-and-package-ubuntu:
    needs: docker-ubuntu
    runs-on: ubuntu-latest
    container:
      image: ${{ format('ghcr.io/{0}/watchman-build-env:latest', github.repository) }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: rustup default stable
        run: rustup default stable

      - name: Install system dependencies
        run: ./install-system-packages.sh

      - name: Test cargo
        run: cargo --help

      - name: Fix dubious ownership
        run: git config --global --add safe.directory /__w/watchman/watchman

      - name: Build Watchman binaries
        run: ./autogen.sh

      - name: Make .deb
        run: ./watchman/build/package/make-deb.sh


================================================
FILE: .github/workflows/release.yml
================================================
# @generated by generate-release-yml.rs
---
name: release
"on":
  push:
    tags:
      - v*
permissions:
  contents: write
  packages: write
jobs:
  prepare:
    runs-on: ubuntu-latest
    outputs:
      release: "${{ steps.info.outputs.name }}"
      upload_url: "${{ steps.create_release.outputs.upload_url }}"
    steps:
      - name: Prepare release info
        id: info
        env:
          TAG: "${{ github.ref }}"
        run: "python -c \"print('::set-output name=name::' + '$TAG'.lstrip('refs/tags/'))\""
      - name: Create release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
        with:
          tag_name: "${{ github.ref }}"
          release_name: "${{ github.ref }}"
  docker-ubuntu-22:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: "${{ github.repository_owner }}"
          password: "${{ secrets.GITHUB_TOKEN }}"
      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: "."
          build-args: UBUNTU_VERSION=22.04
          file: watchman/build/package/ubuntu-env/Dockerfile
          push: true
          tags: "${{ format('ghcr.io/{0}/watchman-build-env:ubuntu-22-latest', github.repository) }}"
  docker-ubuntu-24:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: "${{ github.repository_owner }}"
          password: "${{ secrets.GITHUB_TOKEN }}"
      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: "."
          build-args: UBUNTU_VERSION=24.04
          file: watchman/build/package/ubuntu-env/Dockerfile
          push: true
          tags: "${{ format('ghcr.io/{0}/watchman-build-env:ubuntu-24-latest', github.repository) }}"
  docker-fedora-40:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: "${{ github.repository_owner }}"
          password: "${{ secrets.GITHUB_TOKEN }}"
      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: "."
          build-args: FEDORA_VERSION=40
          file: watchman/build/package/fedora-env/Dockerfile
          push: true
          tags: "${{ format('ghcr.io/{0}/watchman-build-env:fedora-40-latest', github.repository) }}"
  docker-fedora-41:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: "${{ github.repository_owner }}"
          password: "${{ secrets.GITHUB_TOKEN }}"
      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: "."
          build-args: FEDORA_VERSION=41
          file: watchman/build/package/fedora-env/Dockerfile
          push: true
          tags: "${{ format('ghcr.io/{0}/watchman-build-env:fedora-41-latest', github.repository) }}"
  docker-fedora-42:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: "${{ github.repository_owner }}"
          password: "${{ secrets.GITHUB_TOKEN }}"
      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: "."
          build-args: FEDORA_VERSION=42
          file: watchman/build/package/fedora-env/Dockerfile
          push: true
          tags: "${{ format('ghcr.io/{0}/watchman-build-env:fedora-42-latest', github.repository) }}"
  clone-build-package-ubuntu-22:
    needs:
      - prepare
      - docker-ubuntu-22
    runs-on: ubuntu-latest
    container:
      image: "${{ format('ghcr.io/{0}/watchman-build-env:ubuntu-22-latest', github.repository) }}"
    steps:
      - name: Fix HOME
        run: echo HOME=/root >> $GITHUB_ENV
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Install system dependencies
        run: "./install-system-packages.sh"
      - name: Fix dubious ownership
        run: git config --global --add safe.directory /__w/watchman/watchman
      - name: Build Watchman binaries
        run: "./autogen.sh"
      - name: Make .deb
        env:
          UBUNTU_VERSION: "22.04"
        run: "./watchman/build/package/make-deb.sh"
      - name: Upload .deb
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
        uses: actions/upload-release-asset@v1
        with:
          upload_url: "${{ needs.prepare.outputs.upload_url }}"
          asset_path: /_debs/watchman.deb
          asset_name: "watchman_ubuntu22.04_${{ needs.prepare.outputs.release }}.deb"
          asset_content_type: application/x-deb
  clone-build-package-ubuntu-24:
    needs:
      - prepare
      - docker-ubuntu-24
    runs-on: ubuntu-latest
    container:
      image: "${{ format('ghcr.io/{0}/watchman-build-env:ubuntu-24-latest', github.repository) }}"
    steps:
      - name: Fix HOME
        run: echo HOME=/root >> $GITHUB_ENV
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Install system dependencies
        run: "./install-system-packages.sh"
      - name: Fix dubious ownership
        run: git config --global --add safe.directory /__w/watchman/watchman
      - name: Build Watchman binaries
        run: "./autogen.sh"
      - name: Make .deb
        env:
          UBUNTU_VERSION: "24.04"
        run: "./watchman/build/package/make-deb.sh"
      - name: Upload .deb
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
        uses: actions/upload-release-asset@v1
        with:
          upload_url: "${{ needs.prepare.outputs.upload_url }}"
          asset_path: /_debs/watchman.deb
          asset_name: "watchman_ubuntu24.04_${{ needs.prepare.outputs.release }}.deb"
          asset_content_type: application/x-deb
  clone-build-package-fedora-40:
    needs:
      - prepare
      - docker-fedora-40
    runs-on: ubuntu-latest
    container:
      image: "${{ format('ghcr.io/{0}/watchman-build-env:fedora-40-latest', github.repository) }}"
    steps:
      - name: Fix HOME
        run: echo HOME=/root >> $GITHUB_ENV
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Install system dependencies
        run: "./install-system-packages.sh"
      - name: Fix dubious ownership
        run: git config --global --add safe.directory /__w/watchman/watchman
      - name: Build Watchman binaries
        run: "./autogen.sh"
      - name: Make .rpm
        id: make_rpm
        env:
          FEDORA_VERSION: "40"
        run: "./watchman/build/package/make-rpm.sh"
      - name: Upload .rpm
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
        uses: actions/upload-release-asset@v1
        with:
          upload_url: "${{ needs.prepare.outputs.upload_url }}"
          asset_path: "${{ steps.make_rpm.outputs.rpm_path }}"
          asset_name: "${{ steps.make_rpm.outputs.rpm_name }}"
          asset_content_type: application/x-rpm
  clone-build-package-fedora-41:
    needs:
      - prepare
      - docker-fedora-41
    runs-on: ubuntu-latest
    container:
      image: "${{ format('ghcr.io/{0}/watchman-build-env:fedora-41-latest', github.repository) }}"
    steps:
      - name: Fix HOME
        run: echo HOME=/root >> $GITHUB_ENV
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Install system dependencies
        run: "./install-system-packages.sh"
      - name: Fix dubious ownership
        run: git config --global --add safe.directory /__w/watchman/watchman
      - name: Build Watchman binaries
        run: "./autogen.sh"
      - name: Make .rpm
        id: make_rpm
        env:
          FEDORA_VERSION: "41"
        run: "./watchman/build/package/make-rpm.sh"
      - name: Upload .rpm
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
        uses: actions/upload-release-asset@v1
        with:
          upload_url: "${{ needs.prepare.outputs.upload_url }}"
          asset_path: "${{ steps.make_rpm.outputs.rpm_path }}"
          asset_name: "${{ steps.make_rpm.outputs.rpm_name }}"
          asset_content_type: application/x-rpm
  clone-build-package-fedora-42:
    needs:
      - prepare
      - docker-fedora-42
    runs-on: ubuntu-latest
    container:
      image: "${{ format('ghcr.io/{0}/watchman-build-env:fedora-42-latest', github.repository) }}"
    steps:
      - name: Fix HOME
        run: echo HOME=/root >> $GITHUB_ENV
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Install system dependencies
        run: "./install-system-packages.sh"
      - name: Fix dubious ownership
        run: git config --global --add safe.directory /__w/watchman/watchman
      - name: Build Watchman binaries
        run: "./autogen.sh"
      - name: Make .rpm
        id: make_rpm
        env:
          FEDORA_VERSION: "42"
        run: "./watchman/build/package/make-rpm.sh"
      - name: Upload .rpm
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
        uses: actions/upload-release-asset@v1
        with:
          upload_url: "${{ needs.prepare.outputs.upload_url }}"
          asset_path: "${{ steps.make_rpm.outputs.rpm_path }}"
          asset_name: "${{ steps.make_rpm.outputs.rpm_name }}"
          asset_content_type: application/x-rpm
  linux-build:
    continue-on-error: true
    needs: prepare
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4
      - name: Build watchman
        run: "python3 build/fbcode_builder/getdeps.py build --src-dir=. watchman  --project-install-prefix watchman:/usr/local"
      - name: Copy artifacts
        run: "python3 build/fbcode_builder/getdeps.py fixup-dyn-deps --strip --src-dir=. watchman _artifacts/linux  --project-install-prefix watchman:/usr/local --final-install-prefix /usr/local"
      - name: Test watchman
        run: "python3 build/fbcode_builder/getdeps.py test --src-dir=. watchman  --project-install-prefix watchman:/usr/local"
      - name: Package watchman
        run: "mv _artifacts/linux \"watchman-${{ needs.prepare.outputs.release }}-linux\" && zip -r watchman-${{ needs.prepare.outputs.release }}-linux.zip \"watchman-${{ needs.prepare.outputs.release }}-linux/\""
      - name: Upload Linux release
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
        uses: actions/upload-release-asset@v1
        with:
          upload_url: "${{ needs.prepare.outputs.upload_url }}"
          asset_path: "./watchman-${{ needs.prepare.outputs.release }}-linux.zip"
          asset_name: "watchman-${{ needs.prepare.outputs.release }}-linux.zip"
          asset_content_type: application/zip
  mac-build:
    continue-on-error: true
    needs: prepare
    runs-on: macOS-10.15
    steps:
      - uses: actions/checkout@v4
      - name: Build watchman
        run: "SDKROOT=$(xcrun --show-sdk-path --sdk macosx11.1) python3 build/fbcode_builder/getdeps.py --allow-system-packages build --src-dir=. watchman  --project-install-prefix watchman:/usr/local"
      - name: Copy artifacts
        run: "python3 build/fbcode_builder/getdeps.py --allow-system-packages fixup-dyn-deps --src-dir=. watchman _artifacts/mac  --project-install-prefix watchman:/usr/local --final-install-prefix /usr/local"
      - name: Test watchman
        run: "python3 build/fbcode_builder/getdeps.py --allow-system-packages test --src-dir=. watchman  --project-install-prefix watchman:/usr/local"
      - name: Package watchman
        run: "mv _artifacts/mac \"watchman-${{ needs.prepare.outputs.release }}-macos\" && zip -r watchman-${{ needs.prepare.outputs.release }}-macos.zip \"watchman-${{ needs.prepare.outputs.release }}-macos/\""
      - name: Upload macOS release
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
        uses: actions/upload-release-asset@v1
        with:
          upload_url: "${{ needs.prepare.outputs.upload_url }}"
          asset_path: "./watchman-${{ needs.prepare.outputs.release }}-macos.zip"
          asset_name: "watchman-${{ needs.prepare.outputs.release }}-macos.zip"
          asset_content_type: application/zip
  windows-build:
    continue-on-error: true
    needs: prepare
    runs-on: windows-2019
    steps:
      - uses: actions/checkout@v4
      - name: Export boost environment
        run: echo BOOST_ROOT=%BOOST_ROOT_1_69_0% >> %GITHUB_ENV%
        shell: cmd
      - name: Fix Git config
        run: git config --system core.longpaths true
      - name: Build watchman
        run: python build/fbcode_builder/getdeps.py --allow-system-packages build --src-dir=. watchman
      - name: Copy artifacts
        run: python build/fbcode_builder/getdeps.py --allow-system-packages fixup-dyn-deps --src-dir=. watchman _artifacts/windows  --final-install-prefix /usr/local
      - name: Test watchman
        run: python build/fbcode_builder/getdeps.py --allow-system-packages test --src-dir=. watchman
      - name: Package watchman
        run: "mv _artifacts/windows \"watchman-${{ needs.prepare.outputs.release }}-windows\" && Compress-Archive -DestinationPath \"watchman-${{ needs.prepare.outputs.release }}-windows.zip\" -Path \"watchman-${{ needs.prepare.outputs.release }}-windows/\""
      - name: Upload Windows release
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
        uses: actions/upload-release-asset@v1
        with:
          upload_url: "${{ needs.prepare.outputs.upload_url }}"
          asset_path: "./watchman-${{ needs.prepare.outputs.release }}-windows.zip"
          asset_name: "watchman-${{ needs.prepare.outputs.release }}-windows.zip"
          asset_content_type: application/zip

================================================
FILE: .github/workflows/release.yml.in
================================================
name: release

on:
  push:
    tags:
      - v*

permissions:
  contents: write  #  to create a release
  packages: write  #  to upload a package

jobs:
  prepare:
    runs-on: ubuntu-latest
    outputs:
      release: ${{ steps.info.outputs.name }}
      upload_url: ${{ steps.create_release.outputs.upload_url }}
    steps:
      - name: Prepare release info
        id: info
        env:
          TAG: ${{ github.ref }}
        run: python -c "print('::set-output name=name::' + '$TAG'.lstrip('refs/tags/'))"
      - name: Create release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: ${{ github.ref }}

  docker-ubuntu-%UBUNTU_LTS_VERSION%:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          build-args: "UBUNTU_VERSION=%UBUNTU_LTS_VERSION%.04"
          file: watchman/build/package/ubuntu-env/Dockerfile
          push: true
          tags: ${{ format('ghcr.io/{0}/watchman-build-env:ubuntu-%UBUNTU_LTS_VERSION%-latest', github.repository) }}

  docker-fedora-%FEDORA_STABLE_VERSION%:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          build-args: "FEDORA_VERSION=%FEDORA_STABLE_VERSION%"
          file: watchman/build/package/fedora-env/Dockerfile
          push: true
          tags: ${{ format('ghcr.io/{0}/watchman-build-env:fedora-%FEDORA_STABLE_VERSION%-latest', github.repository) }}

  clone-build-package-ubuntu-%UBUNTU_LTS_VERSION%:
    needs:
      - prepare
      - docker-ubuntu-%UBUNTU_LTS_VERSION%
    runs-on: ubuntu-latest
    container:
      image: ${{ format('ghcr.io/{0}/watchman-build-env:ubuntu-%UBUNTU_LTS_VERSION%-latest', github.repository) }}
    steps:
      # This allows rustup toolchains to survive between container construction and use.
      # https://github.com/actions/runner/issues/863
      - name: Fix HOME
        run: echo HOME=/root >> $GITHUB_ENV

      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install system dependencies
        run: ./install-system-packages.sh

      - name: Fix dubious ownership
        run: git config --global --add safe.directory /__w/watchman/watchman

      - name: Build Watchman binaries
        run: ./autogen.sh

      - name: Make .deb
        env:
          UBUNTU_VERSION: "%UBUNTU_LTS_VERSION%.04"
        run: ./watchman/build/package/make-deb.sh

      - name: Upload .deb
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        uses: actions/upload-release-asset@v1
        with:
          upload_url: ${{ needs.prepare.outputs.upload_url }}
          asset_path: /_debs/watchman.deb
          asset_name: watchman_ubuntu%UBUNTU_LTS_VERSION%.04_${{ needs.prepare.outputs.release }}.deb
          asset_content_type: application/x-deb
  
  clone-build-package-fedora-%FEDORA_STABLE_VERSION%:
    needs:
      - prepare
      - docker-fedora-%FEDORA_STABLE_VERSION%
    runs-on: ubuntu-latest
    container:
      image: ${{ format('ghcr.io/{0}/watchman-build-env:fedora-%FEDORA_STABLE_VERSION%-latest', github.repository) }}
    steps:
      # This allows rustup toolchains to survive between container construction and use.
      # https://github.com/actions/runner/issues/863
      - name: Fix HOME
        run: echo HOME=/root >> $GITHUB_ENV

      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install system dependencies
        run: ./install-system-packages.sh

      - name: Fix dubious ownership
        run: git config --global --add safe.directory /__w/watchman/watchman

      - name: Build Watchman binaries
        run: ./autogen.sh

      - name: Make .rpm
        id: make_rpm
        env:
          FEDORA_VERSION: "%FEDORA_STABLE_VERSION%"
        run: ./watchman/build/package/make-rpm.sh

      - name: Upload .rpm
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        uses: actions/upload-release-asset@v1
        with:
          upload_url: ${{ needs.prepare.outputs.upload_url }}
          asset_path: ${{ steps.make_rpm.outputs.rpm_path }}
          asset_name: ${{ steps.make_rpm.outputs.rpm_name }}
          asset_content_type: application/x-rpm

  linux-build:
    continue-on-error: true
    needs: prepare
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v4
    - name: Build watchman
      run: python3 build/fbcode_builder/getdeps.py build --src-dir=. watchman  --project-install-prefix watchman:/usr/local
    - name: Copy artifacts
      run: python3 build/fbcode_builder/getdeps.py fixup-dyn-deps --strip --src-dir=. watchman _artifacts/linux  --project-install-prefix watchman:/usr/local --final-install-prefix /usr/local
    - name: Test watchman
      run: python3 build/fbcode_builder/getdeps.py test --src-dir=. watchman  --project-install-prefix watchman:/usr/local
    - name: Package watchman
      run: mv _artifacts/linux "watchman-${{ needs.prepare.outputs.release }}-linux" && zip -r watchman-${{ needs.prepare.outputs.release }}-linux.zip "watchman-${{ needs.prepare.outputs.release }}-linux/"
    - name: Upload Linux release
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      uses: actions/upload-release-asset@v1
      with:
        upload_url: ${{ needs.prepare.outputs.upload_url }}
        asset_path: ./watchman-${{ needs.prepare.outputs.release }}-linux.zip
        asset_name: watchman-${{ needs.prepare.outputs.release }}-linux.zip
        asset_content_type: application/zip

  mac-build:
    continue-on-error: true
    needs: prepare
    # This release targets macOS 11.1 (Big Sur), which is available in
    # Xcode 12.4 on the macOS-10.15 image.
    runs-on: macOS-10.15
    steps:
    - uses: actions/checkout@v4
    - name: Build watchman
      run: SDKROOT=$(xcrun --show-sdk-path --sdk macosx11.1) python3 build/fbcode_builder/getdeps.py --allow-system-packages build --src-dir=. watchman  --project-install-prefix watchman:/usr/local
    - name: Copy artifacts
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages fixup-dyn-deps --src-dir=. watchman _artifacts/mac  --project-install-prefix watchman:/usr/local --final-install-prefix /usr/local
    - name: Test watchman
      run: python3 build/fbcode_builder/getdeps.py --allow-system-packages test --src-dir=. watchman  --project-install-prefix watchman:/usr/local
    - name: Package watchman
      run: mv _artifacts/mac "watchman-${{ needs.prepare.outputs.release }}-macos" && zip -r watchman-${{ needs.prepare.outputs.release }}-macos.zip "watchman-${{ needs.prepare.outputs.release }}-macos/"
    - name: Upload macOS release
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      uses: actions/upload-release-asset@v1
      with:
        upload_url: ${{ needs.prepare.outputs.upload_url }}
        asset_path: ./watchman-${{ needs.prepare.outputs.release }}-macos.zip
        asset_name: watchman-${{ needs.prepare.outputs.release }}-macos.zip
        asset_content_type: application/zip

  windows-build:
    continue-on-error: true
    needs: prepare
    runs-on: windows-2019
    steps:
    - uses: actions/checkout@v4
    - name: Export boost environment
      run: "echo BOOST_ROOT=%BOOST_ROOT_1_69_0% >> %GITHUB_ENV%"
      shell: cmd
    - name: Fix Git config
      run: git config --system core.longpaths true
    - name: Build watchman
      run: python build/fbcode_builder/getdeps.py --allow-system-packages build --src-dir=. watchman
    - name: Copy artifacts
      run: python build/fbcode_builder/getdeps.py --allow-system-packages fixup-dyn-deps --src-dir=. watchman _artifacts/windows  --final-install-prefix /usr/local
    - name: Test watchman
      run: python build/fbcode_builder/getdeps.py --allow-system-packages test --src-dir=. watchman
    - name: Package watchman
      run: mv _artifacts/windows "watchman-${{ needs.prepare.outputs.release }}-windows" && Compress-Archive -DestinationPath "watchman-${{ needs.prepare.outputs.release }}-windows.zip" -Path "watchman-${{ needs.prepare.outputs.release }}-windows/"
    - name: Upload Windows release
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      uses: actions/upload-release-asset@v1
      with:
        upload_url: ${{ needs.prepare.outputs.upload_url }}
        asset_path: ./watchman-${{ needs.prepare.outputs.release }}-windows.zip
        asset_name: watchman-${{ needs.prepare.outputs.release }}-windows.zip
        asset_content_type: application/zip


================================================
FILE: .gitignore
================================================
/built/
/external
buck-out
buck-cache
.buckd
.idea
*.iml
/Makefile.in
/test-driver
/aclocal.m4
/autom4te.cache/
/configure
/depcomp
/install-sh
/missing
/config.log
.deps/
.windeps
/*.in
/Makefile
*.o
/config.status
*.swp
/compile
/stamp-h1
/config.h*
/thirdparty/jansson/jansson_config.h
/compile
/tests/*.t
/*.t
.dirstamp
*.a
/tests/integration/.watchman.*
*.rpm
/config.sub
/config.guess
/configure.lineno
/python/build
/python/dist/
/watchman/python/pywatchman.egg-info/
*.pyc
*.pyd
*.so
*.obj
*.exe
*.dll
*.pdb
/test-suite.log
/tests/*.log
/tests/*.trs
/a
/arc
/node/package-lock.json
/node/node_modules
/node/bser/node_modules
/website/node_modules
/website/build
/website/src/watchman/docs
/website/src/watchman/*.js
/website/core/metadata.js
/website/.sass-cache
/website/_site
/npm-debug.log
/Debug
.deps
*.dep
*.nativecodeanalysis.xml
/watchman-test.log
Watchman.vcxproj.*
Watchman.vcxproj
*.opensdf
*.sdf
*.sln
*.suo
m4/
.libs/
*.lo
*.la
/tests/integration/cppclient.t
libtool
ltmain.sh
cppclient/watchmanclient.pc
/website/.jekyll-metadata
/CMakeCache.txt
/CMakeFiles
/*.cmake
/Testing
/install_manifest.txt
*.vcxproj
*.dir
/x64
/Release
/Debug
*.filters
/.vs
/external
/common
/eden


================================================
FILE: CMakeLists.txt
================================================
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.

cmake_minimum_required(VERSION 3.8 FATAL_ERROR)

set(CMAKE_MODULE_PATH
  # For in-fbsource builds on mac
  "${CMAKE_CURRENT_SOURCE_DIR}/../opensource/fbcode_builder/CMake"
  # For shipit-transformed builds
  "${CMAKE_CURRENT_SOURCE_DIR}/build/fbcode_builder/CMake"
  ${CMAKE_MODULE_PATH})

if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 20)
  set(CMAKE_CXX_STANDARD_REQUIRED ON)
  message(STATUS "setting C++ standard to C++${CMAKE_CXX_STANDARD}")
endif()

# Explicitly enable coroutine support, since GCC does not enable it
# by default when targeting C++17/20.
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fcoroutines>)
endif()

if (WIN32)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32_LEAN_AND_MEAN -DNOMINMAX -DSTRICT")
endif()

# Tell CMake to also look in the directories where getdeps.py installs
# our third-party dependencies.
list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/install")

option(BUILD_SHARED_LIBS
  "If enabled, build libraries as a shared library.  \
  This is generally discouraged, since we do not commit to having \
  a stable ABI."
  OFF
)
# Mark BUILD_SHARED_LIBS as an "advanced" option, since enabling it
# is generally discouraged.
mark_as_advanced(BUILD_SHARED_LIBS)

option(USE_SYS_PYTHON
  "If enabled, prefers to use the system installed python vs the user \
  installed python. Flipping this switch will change which python is used \
  during packaging and should be set to maximize portability."
  ON
)

enable_testing()
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/external/install/include")

option(ENABLE_EDEN_SUPPORT "If enabled, add support for the Eden \
  virtual filesystem.  That requires fbthrift."
  ON)

# Determine whether we are the git repo produced by shipit, a staging
# area produced by shipit in the FB internal CI, or whether
# we are building in the source monorepo.
# For the FB internal CI flavor running shipit, CMAKE_CURRENT_SOURCE_DIR
# will have a value like "..../shipit_projects/watchman".
if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git" OR
    "${CMAKE_CURRENT_SOURCE_DIR}" MATCHES "shipit_projects")
  set(IS_SHIPPED_IT TRUE)
else()
  set(IS_SHIPPED_IT FALSE)
endif()

# If we're building from inside the monorepo, make the local directory
# look like the shipit-transformed source in the git repo.
# On windows we do a dumb recursive copy of the files because we cannot
# guarantee that we'll be successful in setting up a symlink.
# On everything else we set up a simple symlink.
# In theory we can tell cmake to add a non-child subdir and avoid the
# copy/symlink thing, but we'd need to teach various targets how to resolve
# the path and that is rather a lot of work (I spent a couple of hours on this
# before throwing in the towel).
function(maybe_shipit_dir MONOREPO_RELATIVE_PATH)
  get_filename_component(base "${MONOREPO_RELATIVE_PATH}" NAME)
  if (NOT IS_SHIPPED_IT AND
      NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${base})
    if (WIN32)
      file(COPY
        "${CMAKE_CURRENT_SOURCE_DIR}/${MONOREPO_RELATIVE_PATH}"
        DESTINATION ${CMAKE_CURRENT_SOURCE_DIR})
    else()
      execute_process(COMMAND
        ln -s ${MONOREPO_RELATIVE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/${base})
    endif()
  endif()
endfunction()

if (ENABLE_EDEN_SUPPORT)
  # We use shipit to mirror in these locations from the monorepo
  maybe_shipit_dir("../eden")
endif()

# A nonsensical version that doesn't correspond to any manually
# released version.
set(PACKAGE_VERSION "0.0.0")
set(WATCHMAN_VERSION_OVERRIDE "" CACHE STRING "Use this version code for \
    Watchman version instead of the default computed from the repo")
set(WATCHMAN_BUILDINFO_OVERRIDE "" CACHE STRING "Use this version code for \
    Watchman build info instead of the default (nothing)")

if (WATCHMAN_VERSION_OVERRIDE)
  set(PACKAGE_VERSION "${WATCHMAN_VERSION_OVERRIDE}")
elseif(DEFINED ENV{WATCHMAN_VERSION_OVERRIDE})
  set(PACKAGE_VERSION "$ENV{WATCHMAN_VERSION_OVERRIDE}")
elseif(DEFINED ENV{FBSOURCE_DATE})
  # If set, we expect FBSOURCE_DATE to have the form "20200324.113140"
  set(PACKAGE_VERSION "$ENV{FBSOURCE_DATE}.0")
  set(BUILD_INFO "$ENV{FBSOURCE_HASH}")
else()
  find_program(GIT git)
  if(GIT)
    execute_process(
      COMMAND "${GIT}" "show" "-s" "--format=%H;%cd" "--date=format:%Y%m%d.%H%M%S.0"
      WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
      RESULT_VARIABLE git_result
      OUTPUT_VARIABLE git_data
      ERROR_VARIABLE git_err
      OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    if(git_result EQUAL 0)
      list(GET git_data 0 BUILD_INFO)
      list(GET git_data 1 PACKAGE_VERSION)
    endif()
  endif()
endif()
message(STATUS "PACKAGE_VERSION=${PACKAGE_VERSION}, BUILD_INFO=${BUILD_INFO}")

set(PACKAGE_NAME      "watchman")
set(PACKAGE_STRING    "${PACKAGE_NAME} ${PACKAGE_VERSION}")
set(PACKAGE_TARNAME   "${PACKAGE_NAME}-${PACKAGE_VERSION}")
set(PACKAGE_BUGREPORT "https://github.com/facebook/watchman/issues")
project(${PACKAGE_NAME} CXX C)

find_package(GMock MODULE REQUIRED)
include_directories(${GMOCK_INCLUDEDIR} ${LIBGMOCK_INCLUDE_DIR})
include(GoogleTest)
enable_testing()

include(FBThriftCppLibrary)
include(CheckFunctionExists)
include(CheckIncludeFiles)
include(CheckStructHasMember)
include(CheckSymbolExists)
include(RustStaticLibrary)

# configure_file wants us to define a separate file.  I'd rather not
# have boilerplate for the same thing in two difference files, so we
# roll the checks in together with writing out the features to config.h
# ourselves here.
function(config_h LINE)
  file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/watchman/config.h.new" "${LINE}\n")
endfunction()

file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/watchman/config.h.new" "#pragma once\n")

if(NOT WIN32)
  set(WATCHMAN_STATE_DIR "${CMAKE_INSTALL_PREFIX}/var/run/watchman" CACHE STRING
    "Run-time path of the persistent state directory")
  set(INSTALL_WATCHMAN_STATE_DIR OFF CACHE BOOL
    "Whether WATCHMAN_STATE_DIR should be created by the cmake install
    target.  Disabling this is useful in the case where the CMAKE_INSTALL_PREFIX
    is owned by a non-privileged user but where the WATCHMAN_STATE_DIR requires
    administrative rights to create and set its permissions.")
  option(WATCHMAN_USE_XDG_STATE_HOME
    "If enabled, use $XDG_STATE_HOME/watchman as the Watchman state directory. \
    XDG_STATE_HOME defaults to $HOME/.local/state."
    OFF
  )
else()
  set(WATCHMAN_STATE_DIR)
  set(INSTALL_WATCHMAN_STATE_DIR)
endif()

if(WATCHMAN_STATE_DIR AND INSTALL_WATCHMAN_STATE_DIR)
  install(DIRECTORY DESTINATION ${WATCHMAN_STATE_DIR}
    DIRECTORY_PERMISSIONS
    OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE
    GROUP_EXECUTE WORLD_READ WORLD_WRITE WORLD_EXECUTE SETGID)
endif()

config_h("// Generated by cmake")
if(WIN32)
  config_h("#define WATCHMAN_CONFIG_FILE \
\"C:/ProgramData/facebook/watchman.json\"")
else()
  config_h("#define WATCHMAN_CONFIG_FILE \"/etc/watchman.json\"")
endif()

if(WATCHMAN_STATE_DIR)
  config_h("#define WATCHMAN_STATE_DIR \"${WATCHMAN_STATE_DIR}\"")
endif()
config_h("#define PACKAGE_VERSION \"${PACKAGE_VERSION}\"")

if(BUILD_INFO)
  config_h("#define WATCHMAN_BUILD_INFO \"${BUILD_INFO}\"")
endif ()

if(WATCHMAN_USE_XDG_STATE_HOME)
  config_h("#define WATCHMAN_USE_XDG_STATE_HOME 1")
endif()

# While most of these tests are not strictly needed on windows, it is vital
# that we probe for and find strtoll in order for the jansson build to use
# a 64-bit integer type, otherwise the mtime_us field renders as garbage
# in the integration tests.
foreach(wat_func
    accept4
    backtrace
    backtrace_symbols
    backtrace_symbols_fd
    close_range
    fdopendir
    getattrlistbulk
    inotify_init
    inotify_init1
    kqueue
    localeconv
    memmem
    mkostemp
    openat
    pipe2
    port_create
    statfs
    strtoll
    sys_siglist
)
  CHECK_FUNCTION_EXISTS(${wat_func} have_${wat_func})
  if (have_${wat_func})
    string(TOUPPER have_${wat_func} sym)
    config_h("#define ${sym} 1")
  endif()
endforeach(wat_func)

foreach(wat_header
    CoreServices/CoreServices.h
    execinfo.h
    fcntl.h
    inttypes.h
    locale.h
    port.h
    sys/event.h
    sys/inotify.h
    sys/mount.h
    sys/param.h
    sys/resource.h
    sys/socket.h
    sys/statfs.h
    sys/statvfs.h
    sys/types.h
    sys/ucred.h
    sys/vfs.h
    valgrind/valgrind.h
)
  string(TOUPPER have_${wat_header} sym)
  string(REGEX REPLACE [./] _ sym ${sym})
  CHECK_INCLUDE_FILES(${wat_header} ${sym})
  if (${sym})
    config_h("#define ${sym} 1")
  endif()
endforeach(wat_header)

CHECK_STRUCT_HAS_MEMBER(statvfs f_fstypename sys/statvfs.h
  HAVE_STRUCT_STATVFS_F_FSTYPENAME)
if (HAVE_STRUCT_STATVFS_F_BASETYPE)
  config_h("define HAVE_STRUCT_STATVFS_F_FSTYPENAME 1")
endif()

CHECK_STRUCT_HAS_MEMBER(statvfs f_basetype sys/statvfs.h
  HAVE_STRUCT_STATVFS_F_BASETYPE)
if (HAVE_STRUCT_STATVFS_F_BASETYPE)
  config_h("define HAVE_STRUCT_STATVFS_F_BASETYPE 1")
endif()

if(have_fcntl.h)
  CHECK_SYMBOL_EXISTS(O_SYMLINK fcntl.h HAVE_DECL_O_SYMLINK)
  if(HAVE_DECL_O_SYMLINK)
    config_h("#define HAVE_DECL_O_SYMLINK 1")
  endif()
endif()
find_package(PCRE2)
if(PCRE2_FOUND)
  config_h("#define HAVE_PCRE_H 1")
endif()

# Now close out config.h.  We only want to touch the file if the contents are
# different, so do a little dance to figure that out.
if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/watchman/config.h")
  file(MD5 "${CMAKE_CURRENT_BINARY_DIR}/watchman/config.h" orig_hash)
  file(MD5 "${CMAKE_CURRENT_BINARY_DIR}/watchman/config.h.new" this_hash)
  if(NOT orig_hash STREQUAL this_hash)
    file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/watchman/config.h.new"
      "${CMAKE_CURRENT_BINARY_DIR}/watchman/config.h")
  endif()
else()
  file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/watchman/config.h.new"
    "${CMAKE_CURRENT_BINARY_DIR}/watchman/config.h")
endif()

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

# This block is for cmake 3.0 which doesn't define the Threads::Threads
# interface section.  Test for that and define it for ourselves.
if(THREADS_FOUND AND NOT TARGET Threads::Threads)
  add_library(Threads::Threads INTERFACE IMPORTED)

  if(THREADS_HAVE_PTHREAD_ARG)
    set_property(TARGET Threads::Threads PROPERTY
      INTERFACE_COMPILE_OPTIONS "-pthread")
  endif()

  if(CMAKE_THREAD_LIBS_INIT)
    set_property(TARGET Threads::Threads PROPERTY
      INTERFACE_LINK_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}")
  endif()
endif()

find_package(OpenSSL)

# This block is for cmake 3.0 which doesn't define the OpenSSL::Crypto
# interface section.  Test for that and define it for ourselves.
if(OPENSSL_FOUND AND NOT TARGET OpenSSL::Crypto)
  add_library(OpenSSL::Crypto UNKNOWN IMPORTED)
    set_target_properties(OpenSSL::Crypto PROPERTIES
      INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
    if(EXISTS "${OPENSSL_CRYPTO_LIBRARY}")
      set_target_properties(OpenSSL::Crypto PROPERTIES
        IMPORTED_LINK_INTERFACE_LANGUAGES "C"
        IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}")
    endif()
endif()

find_package(Gflags REQUIRED)
include_directories(SYSTEM ${GFLAGS_INCLUDE_DIR})

find_package(Glog REQUIRED)
add_compile_definitions(GLOG_NO_ABBREVIATED_SEVERITIES)

# We indirectly depend on boost.  This logic needs to match
# the same criteria used in thrift, which wants static libs
# on windows.
if(MSVC)
  set(Boost_USE_STATIC_LIBS ON) #Force static lib in msvc
endif(MSVC)
find_package(
  Boost 1.54.0 REQUIRED #1.54.0 or greater
  COMPONENTS
    context
    thread
)

# We indirectly depend on libevent.  Folly pulls in linkage to
# event.lib, but on my system it does so as simply "event.lib"
# and that fails linking.  Let's probe for the library and force
# in the library directory for the linker. :-/
find_package(LibEvent REQUIRED)
get_filename_component(LIBEVENT_LIBDIR "${LIBEVENT_LIB}" DIRECTORY)
link_directories(${LIBEVENT_LIBDIR})
find_package(edencommon CONFIG REQUIRED)
find_package(fmt CONFIG REQUIRED)
find_package(folly CONFIG REQUIRED)

if (ENABLE_EDEN_SUPPORT)
  find_package(fizz CONFIG REQUIRED)
  find_package(wangle CONFIG REQUIRED)
  find_package(FBThrift CONFIG REQUIRED)
  find_package(fb303 CONFIG REQUIRED)
  find_package(cpptoml CONFIG REQUIRED)
  include_directories(${FB303_INCLUDE_DIR})
endif()
if(DEFINED ENV{NODE_BIN})
  set(NODE $ENV{NODE_BIN})
else()
  find_program(NODE node)
endif()
if(DEFINED ENV{YARN_PATH})
  set(YARN $ENV{YARN_PATH})
else()
  find_program(YARN yarn)
endif()


if(NOT WIN32)
  # Sometimes the environment has a Python installation earlier in the
  # PATH that is not suitable for building extensions. Prefer the
  # primary system installation.
  set(Python3_FIND_STRATEGY LOCATION)
  if(USE_SYS_PYTHON)
    message(STATUS "Using sys python")
    set(Python3_ROOT_DIR /usr/bin)
  else()
    message(STATUS "Using local python")
    set(Python3_ROOT_DIR /usr/local/bin)
  endif()
endif()

find_package(Python3 COMPONENTS Interpreter Development)

if(NOT Python3_Interpreter_FOUND)
  message(STATUS "python not found, using default python")
  unset(Python3_ROOT_DIR)
  unset(Python3_FIND_STRATEGY)
  find_package(Python3 COMPONENTS Interpreter Development)
endif()


if(Python3_Development_FOUND)
  set(PYOUT "${CMAKE_CURRENT_BINARY_DIR}/pywatchman")
  set(SETUP_PY "${CMAKE_CURRENT_SOURCE_DIR}/watchman/python/setup.py")
  set(PYWATCHMAN_BASE ${CMAKE_CURRENT_SOURCE_DIR}/watchman/python)
  file(GLOB PYWATCHMAN_PY_SRCS "watchman/python/pywatchman/*.py")
  file(MAKE_DIRECTORY ${PYOUT})
  add_custom_command(
    COMMENT "Building pywatchman"
    OUTPUT ${PYOUT}
    DEPENDS ${PYWATCHMAN_PY_SRCS} "watchman/python/pywatchman/bser.c"
    WORKING_DIRECTORY ${PYWATCHMAN_BASE}
    COMMAND ${CMAKE_COMMAND} -E env
      CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
      CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}
      ${Python3_EXECUTABLE} ${SETUP_PY} build --build-base ${PYOUT}
    COMMAND ${CMAKE_COMMAND} -E touch ${PYOUT}
  )
  add_custom_target(pybuild ALL DEPENDS ${PYOUT})
  install(CODE "
    execute_process(COMMAND
      ${CMAKE_COMMAND} -E env
        CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
        ${Python3_EXECUTABLE} ${SETUP_PY} install
        --root $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}
      WORKING_DIRECTORY ${PYWATCHMAN_BASE}
      RESULT_VARIABLE STATUS)
    if (NOT STATUS STREQUAL 0)
      message(FATAL_ERROR \"pywatchman install failed\")
    endif()
  ")
  include(FBPythonBinary)
  add_subdirectory(watchman/python)
  add_subdirectory(watchman/integration)
endif()

if(Python3_Interpreter_FOUND AND NODE AND YARN)
  add_subdirectory(watchman/node/bser)
endif()

if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
  # Check target architecture
  if (NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
    message(FATAL_ERROR "watchman requires a 64bit target architecture.")
  endif()
  add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)
  include_directories(${CMAKE_CURRENT_SOURCE_DIR}/watchman/winbuild)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /Zo /MP /Oi /EHsc /GL- /wd4250")
  set(CMAKE_SHARED_LINKER_FLAGS
    "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG /OPT:NOREF")
  set(CMAKE_EXE_LINKER_FLAGS
    "${CMAKE_EXE_LINKER_FLAGS} /DEBUG /OPT:NOREF")
  set(CMAKE_MODULE_LINKER_FLAGS
    "${CMAKE_MODULE_LINKER_FLAGS} /DEBUG /OPT:NOREF")
  set(CMAKE_STATIC_LIBRARY_FLAGS
    "${CMAKE_STATIC_LIBRARY_FLAGS} /DEBUG /OPT:NOREF")
else()
  set(CMAKE_CXX_FLAGS_COMMON "-g -Wall -Wextra -std=gnu++17")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_COMMON}")  # for cmake 3.0
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_COMMON}")
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_COMMON} -O3")
endif()

add_library(third_party_deps INTERFACE)
target_link_libraries(third_party_deps INTERFACE
  Folly::folly
  glog::glog
  gflags
  ${Boost_LIBRARIES}
  fb303::fb303
  fmt::fmt
  edencommon::edencommon_utils
  edencommon::edencommon_telemetry
)
target_include_directories(third_party_deps INTERFACE
  ${FOLLY_INCLUDE_DIR}
  ${GLOG_INCLUDE_DIR}
  ${GFLAGS_INCLUDE_DIR}
  ${Boost_INCLUDE_DIRS}
)
if (ENABLE_EDEN_SUPPORT)
  target_link_libraries(
    third_party_deps
    INTERFACE
    ${YARPL_LIBRARIES}
    FBThrift::thriftcpp2
    cpptoml
  )
endif()
if(PCRE2_FOUND)
  target_link_libraries(third_party_deps INTERFACE ${PCRE2_LIBRARY})
  target_include_directories(third_party_deps INTERFACE ${PCRE2_INCLUDE_DIR})
  target_compile_definitions(third_party_deps INTERFACE ${PCRE2_DEFINES})
  if (WIN32)
    # The pcre headers assume that the library is a dll by default
    # but our preferred build environment only builds them as
    # static, so be sure to ask for static pcre linkage
    target_compile_definitions(third_party_deps INTERFACE PCRE2_STATIC)
  endif()
endif()
target_link_libraries(third_party_deps INTERFACE Threads::Threads)
if(TARGET OpenSSL::Crypto)
  target_link_libraries(third_party_deps INTERFACE OpenSSL::Crypto)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
  target_link_libraries(third_party_deps INTERFACE "-framework CoreServices")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
  target_link_libraries(third_party_deps INTERFACE
    advapi32.lib
    dbghelp.lib
    shlwapi.lib
  )
endif()

add_library(wildmatch STATIC
  watchman/thirdparty/wildmatch/wildmatch.c
  watchman/thirdparty/wildmatch/wildmatch.h
)
add_library(log STATIC
  watchman/PubSub.cpp
  watchman/LogConfig.cpp
  watchman/Logging.cpp
  watchman/portability/Backtrace.cpp
)
target_link_libraries(log third_party_deps)
add_library(err STATIC watchman/Poison.cpp watchman/root/warnerr.cpp)
target_link_libraries(err third_party_deps)
add_library(jansson_utf STATIC watchman/thirdparty/jansson/utf.cpp)

add_library(string STATIC watchman/string.cpp)
target_link_libraries(string jansson_utf third_party_deps)

add_library(jansson STATIC
watchman/thirdparty/jansson/dump.cpp
watchman/thirdparty/jansson/error.cpp
watchman/thirdparty/jansson/load.cpp
watchman/thirdparty/jansson/strconv.cpp
watchman/thirdparty/jansson/value.cpp
)
target_link_libraries(jansson string third_party_deps)

list(APPEND testsupport_sources
watchman/ChildProcess.cpp
watchman/fs/FileDescriptor.cpp
watchman/fs/FileInformation.cpp
watchman/fs/FSDetect.cpp
watchman/FlagMap.cpp
watchman/IgnoreSet.cpp
watchman/PendingCollection.cpp
watchman/fs/Pipe.cpp
watchman/fs/WindowsTime.cpp
watchman/ThreadPool.cpp
watchman/WatchmanConfig.cpp
watchman/bser.cpp
watchman/fs/UnixDirHandle.cpp
watchman/fs/WinDirHandle.cpp
watchman/stream.cpp
watchman/stream_unix.cpp
watchman/stream_win.cpp
watchman/portability/PosixSpawn.cpp
watchman/portability/WinError.cpp
watchman/root/dir.cpp
watchman/root/file.cpp
)

add_library(testsupport STATIC ${testsupport_sources})
target_link_libraries(testsupport log string jansson third_party_deps)

if (ENABLE_EDEN_SUPPORT)
  add_fbthrift_cpp_library(
    eden_config_thrift
    eden/fs/config/eden_config.thrift
  )
  add_fbthrift_cpp_library(
    eden_service_thrift
    eden/fs/service/eden.thrift
    SERVICES
      EdenService
    DEPENDS
      eden_config_thrift
      fb303::fb303_thrift_cpp
  )
  add_fbthrift_cpp_library(
    streamingeden_thrift
    eden/fs/service/streamingeden.thrift
    SERVICES
      StreamingEdenService
    DEPENDS
      eden_service_thrift
      fb303::fb303_thrift_cpp
  )
endif()

list(APPEND watchman_sources
watchman/ChildProcess.cpp
watchman/Client.cpp
watchman/Clock.cpp
watchman/Command.cpp
watchman/CommandRegistry.cpp
watchman/Connect.cpp
watchman/ContentHash.cpp
watchman/CookieSync.cpp
watchman/Errors.cpp
watchman/fs/FileDescriptor.cpp
watchman/fs/FileInformation.cpp
watchman/fs/FileSystem.cpp
watchman/FlagMap.cpp
watchman/fs/FSDetect.cpp
watchman/GroupLookup.cpp
watchman/IgnoreSet.cpp
watchman/InMemoryView.cpp
watchman/Options.cpp
watchman/PathUtils.cpp
watchman/PDU.cpp
watchman/PendingCollection.cpp
watchman/PerfSample.cpp
watchman/fs/ParallelWalk.cpp
watchman/fs/Pipe.cpp
watchman/ProcessLock.cpp
watchman/ProcessUtil.cpp
# PubSub.cpp  (in liblog)
watchman/QueryableView.cpp
watchman/SanityCheck.cpp
watchman/Shutdown.cpp
watchman/SignalHandler.cpp
watchman/SymlinkTargets.cpp
watchman/ThreadPool.cpp
watchman/TriggerCommand.cpp
watchman/fs/UnixDirHandle.cpp
watchman/fs/WindowsTime.cpp
watchman/UserDir.cpp
watchman/WatchmanConfig.cpp
watchman/XattrUtils.cpp
watchman/fs/WinDirHandle.cpp
watchman/bser.cpp
watchman/listener-user.cpp
watchman/listener.cpp
watchman/main.cpp
watchman/sockname.cpp
watchman/state.cpp
watchman/stream.cpp
watchman/stream_unix.cpp
watchman/stream_stdout.cpp
watchman/stream_win.cpp
# string.cpp (in libstring)
watchman/portability/PosixSpawn.cpp
watchman/portability/WinError.cpp
watchman/query/FileResult.cpp
watchman/query/LocalFileResult.cpp
watchman/query/GlobEscaping.cpp
watchman/query/GlobTree.cpp
watchman/query/QueryContext.cpp
watchman/query/Query.cpp
watchman/query/QueryResult.cpp
watchman/query/TermRegistry.cpp
watchman/query/base.cpp
watchman/query/dirname.cpp
watchman/query/empty.cpp
watchman/query/eval.cpp
watchman/query/fieldlist.cpp
watchman/query/glob.cpp
watchman/query/intcompare.cpp
watchman/query/match.cpp
watchman/query/name.cpp
watchman/query/parse.cpp
watchman/query/pcre.cpp
watchman/query/since.cpp
watchman/query/suffix.cpp
watchman/query/type.cpp
watchman/cmds/debug.cpp
watchman/cmds/find.cpp
# cmds/heapprof.cpp
watchman/cmds/info.cpp
watchman/cmds/log.cpp
watchman/cmds/query.cpp
watchman/cmds/since.cpp
watchman/cmds/state.cpp
watchman/cmds/subscribe.cpp
watchman/cmds/trigger.cpp
watchman/cmds/watch.cpp
watchman/root/ageout.cpp
watchman/root/dir.cpp
watchman/root/file.cpp
watchman/root/init.cpp
watchman/root/iothread.cpp
watchman/root/notifythread.cpp
watchman/# root/poison.cpp (in liberr)
watchman/root/reap.cpp
watchman/root/resolve.cpp
watchman/root/sync.cpp
watchman/root/threading.cpp
# root/warnerr.cpp (in liberr)
watchman/root/watchlist.cpp
watchman/saved_state/LocalSavedStateInterface.cpp
watchman/saved_state/SavedStateFactory.cpp
watchman/saved_state/SavedStateInterface.cpp
watchman/scm/Git.cpp
watchman/scm/Mercurial.cpp
watchman/scm/SCM.cpp
watchman/telemetry/LogEvent.cpp
watchman/telemetry/WatchmanStats.cpp
watchman/telemetry/WatchmanStructuredLogger.cpp
watchman/thirdparty/getopt/GetOpt.cpp
watchman/watcher/Watcher.cpp
watchman/watcher/WatcherRegistry.cpp
watchman/watcher/fsevents.cpp
watchman/watcher/inotify.cpp
watchman/watcher/kqueue.cpp
watchman/watcher/portfs.cpp
watchman/watcher/kqueue_and_fsevents.cpp
watchman/watcher/win32.cpp
)

if (ENABLE_EDEN_SUPPORT)
  # We currently only support talking to eden on posix systems
  list(APPEND watchman_sources watchman/watcher/eden.cpp)
endif()

add_executable(watchman ${watchman_sources})
set_target_properties(watchman PROPERTIES
  RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
target_link_libraries(
  watchman
  log
  string
  err
  jansson
  wildmatch
  third_party_deps
)

if (WIN32)
  add_subdirectory(watchman/thirdparty/deelevate_binding)
  target_link_libraries(
    watchman
    libdeelevate
  )
  install_rust_executable(deelevate)
endif()

if (ENABLE_EDEN_SUPPORT)
  target_link_libraries(
    watchman
    streamingeden_thrift
  )
endif()

install(TARGETS watchman RUNTIME DESTINATION bin)

add_subdirectory(watchman/cli)

set(tests)
# Helper function to define a unit test executable
function(t_test NAME)
  add_executable(${NAME}.t ${ARGN})
  target_link_libraries(
    ${NAME}.t
    testsupport wildmatch third_party_deps
    ${LIBGMOCK_LIBRARIES}
  )
  target_compile_definitions(${NAME}.t
    PUBLIC WATCHMAN_TEST_SRC_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}\")
  gtest_discover_tests(${NAME}.t DISCOVERY_TIMEOUT 60)
  list(APPEND tests ${NAME}.t)
endfunction()

# The `check` target runs the unit tests
add_custom_target(check
  DEPENDS ${tests}
  COMMAND ${CMAKE_CTEST_COMMAND})

if(Python3_Interpreter_FOUND)
  if (WIN32)
    add_executable(susres watchman/winbuild/susres.cpp)
    target_link_libraries(susres third_party_deps)
    add_custom_target(make_susres ALL DEPENDS susres)
  endif()

  # The `integration` target runs the unit tests and integration tests
  add_custom_target(integration
    DEPENDS pybuild check
    COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/runtests.py
      --watchman-path ${CMAKE_CURRENT_BINARY_DIR}/watchman
      --pybuild-dir ${CMAKE_CURRENT_BINARY_DIR}/watchman/python
      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif()

t_test(art watchman/test/ArtTest.cpp)
t_test(bser watchman/test/BserTest.cpp)
t_test(cache watchman/test/CacheTest.cpp)
t_test(childproc watchman/test/ChildProcTest.cpp)
t_test(fsdetect watchman/test/FSDetectTest.cpp)
t_test(ignore watchman/test/BserTest.cpp)
# Linking this test needs the targets graph to be cleaned up.
#t_test(inmemoryview watchman/test/InMemoryViewTest.cpp)
t_test(log watchman/test/LogTest.cpp)
t_test(maputil watchman/test/MapUtilTest.cpp)
t_test(pendingcollection watchman/test/PendingCollectionTest.cpp)
# Linking this test needs the targets graph to be cleaned up.
#t_test(perfsample watchman/test/PerfSampleTest.cpp)
t_test(result watchman/test/ResultTest.cpp)
t_test(ringbuffer watchman/test/RingBufferTest.cpp)
t_test(string watchman/test/StringTest.cpp)
t_test(wildmatch watchman/test/WildmatchTest.cpp)


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
  advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
  address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies within all project spaces, and it also applies when
an individual is representing the project or its community in public spaces.
Examples of representing a project or community include using an official
project e-mail address, posting via an official social media account, or acting
as an appointed representative at an online or offline event. Representation of
a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at <opensource-conduct@fb.com>. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq



================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to watchman
We want to make contributing to this project as easy and transparent as
possible.

## Our Development Process
Watchman is currently developed in Meta's internal repositories and then exported out to GitHub by a Meta team member; however, we invite you to submit pull requests as described below.

## Pull Requests
We actively welcome your pull requests.

1. Fork the repo and create your branch from `main`.
2. If you've added code that should be tested, add tests.
3. If you've changed APIs, update the documentation.
4. Ensure the test suite passes.
5. Make sure your code lints.
6. If you haven't already, complete the Contributor License Agreement ("CLA").

## Getting Started
For more information on how to get started please see [contributing guide](https://facebook.github.io/watchman/docs/contributing).

## Contributor License Agreement ("CLA")
In order to accept your pull request, we need you to submit a CLA. You only need
to do this once to work on any of Meta's open source projects.

Complete your CLA here: <https://code.facebook.com/cla>

## Issues
We use GitHub issues to track public bugs. Please ensure your description is
clear and has sufficient instructions to be able to reproduce the issue.

Meta has a [bounty program](https://www.facebook.com/whitehat/) for the safe
disclosure of security bugs. In those cases, please go through the process
outlined on that page and do not file a public issue.

## Coding Style
* 2 spaces for indentation rather than tabs
* 80 character line length

## License
By contributing to watchman, you agree that your contributions will be licensed
under the LICENSE file in the root directory of this source tree (MIT License).


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) Meta Platforms, Inc. and its affiliates.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.markdown
================================================
<div align="center">
 <img src="website/static/img/logo.png" width="20%" height="20%" alt="watchman-logo">
 <h1>Watchman</h1>
 <h3>A file watching service.</h3>
</div>

## Purpose

Watchman exists to watch files and record when they actually change. It can
also trigger actions (such as rebuilding assets) when matching files change.

## Documentation

Head on over to https://facebook.github.io/watchman/

## License

Watchman is made available under the terms of the MIT License. See the
LICENSE file that accompanies this distribution for the full text of the
license.

## Support

Watchman is primarily maintained by the source control team at Meta Platforms, Inc. We support:

* Windows and macOS builds
* Linux builds on recent Ubuntu and Fedora releases
* Watchman's [compatibility commitment](https://facebook.github.io/watchman/docs/compatibility.html)
* Python, Rust, and JavaScript clients

Support for additional operating systems, release packaging, and language bindings is community-maintained:

* Homebrew
* FreeBSD
* Solaris

Please submit a [GitHub issue](https://github.com/facebook/watchman/issues/) to report any troubles.

## Contributing

Please see the [contributing document](CONTRIBUTING.md).


================================================
FILE: autogen.cmd
================================================
@ECHO OFF

python3 build/fbcode_builder/getdeps.py build --src-dir=. watchman "--project-install-prefix=watchman:%userprofile%" --scratch-path "C:\open\scratch"

python3 build/fbcode_builder/getdeps.py fixup-dyn-deps --src-dir=. watchman  built "--project-install-prefix=watchman:%userprofile%" --final-install-prefix "%userprofile%" --scratch-path "C:\open\scratch"

================================================
FILE: autogen.sh
================================================
#!/bin/bash -e
# vim:ts=2:sw=2:et:
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.

cd "$(dirname "$0")"

set -x
PREFIX=${PREFIX:-/usr/local}
python3 build/fbcode_builder/getdeps.py build \
        --allow-system-packages \
        --src-dir=. \
        "--project-install-prefix=watchman:$PREFIX" \
        watchman
python3 build/fbcode_builder/getdeps.py fixup-dyn-deps \
        --allow-system-packages \
        --src-dir=. \
        "--project-install-prefix=watchman:$PREFIX" \
        --final-install-prefix "$PREFIX" \
        watchman built

find built -ls


================================================
FILE: build/deps/github_hashes/facebook/fb303-rev.txt
================================================
Subproject commit 9d35ae460081808d28949a581898c3fd1b468648


================================================
FILE: build/deps/github_hashes/facebook/fbthrift-rev.txt
================================================
Subproject commit 4e81edbcf9740e628a26159d1779b27b1c457e98


================================================
FILE: build/deps/github_hashes/facebook/folly-rev.txt
================================================
Subproject commit 4321dae73b18961089fc62532ee6dc011cbf1915


================================================
FILE: build/deps/github_hashes/facebook/mvfst-rev.txt
================================================
Subproject commit b229e95977aa5d4c271da60775f2b4bdbc40262a


================================================
FILE: build/deps/github_hashes/facebook/wangle-rev.txt
================================================
Subproject commit dbe97d189ad17a732477ecf4defdcf8cdac2c013


================================================
FILE: build/deps/github_hashes/facebookexperimental/edencommon-rev.txt
================================================
Subproject commit 9d4731a59818eca38557fbf1a9c2c4abdb17b650


================================================
FILE: build/deps/github_hashes/facebookincubator/fizz-rev.txt
================================================
Subproject commit 8d74917ae1e80269c6e8e9da44f9713269d9c2ec


================================================
FILE: build/fbcode_builder/.gitignore
================================================
# Facebook-internal CI builds don't have write permission outside of the
# source tree, so we install all projects into this directory.
/facebook_ci
__pycache__/
*.pyc


================================================
FILE: build/fbcode_builder/CMake/FBBuildOptions.cmake
================================================
# Copyright (c) Facebook, Inc. and its affiliates.

function (fb_activate_static_library_option)
  option(USE_STATIC_DEPS_ON_UNIX
    "If enabled, use static dependencies on unix systems. This is generally discouraged."
    OFF
  )
  # Mark USE_STATIC_DEPS_ON_UNIX as an "advanced" option, since enabling it
  # is generally discouraged.
  mark_as_advanced(USE_STATIC_DEPS_ON_UNIX)

  if(UNIX AND USE_STATIC_DEPS_ON_UNIX)
    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE)
  endif()

  option(PREFER_STATIC_DEPS_ON_UNIX
    "If enabled, use static dependencies on unix systems as possible as we can. This is generally discouraged."
    OFF
  )
  # Mark PREFER_STATIC_DEPS_ON_UNIX as an "advanced" option, since enabling it
  # is generally discouraged.
  mark_as_advanced(PREFER_STATIC_DEPS_ON_UNIX)

  if(UNIX AND PREFER_STATIC_DEPS_ON_UNIX)
    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".so" PARENT_SCOPE)
  endif()
endfunction()


================================================
FILE: build/fbcode_builder/CMake/FBCMakeParseArgs.cmake
================================================
#
# Copyright (c) Facebook, Inc. and its affiliates.
#
# Helper function for parsing arguments to a CMake function.
#
# This function is very similar to CMake's built-in cmake_parse_arguments()
# function, with some improvements:
# - This function correctly handles empty arguments.  (cmake_parse_arguments()
#   ignores empty arguments.)
# - If a multi-value argument is specified more than once, the subsequent
#   arguments are appended to the original list rather than replacing it.  e.g.
#   if "SOURCES" is a multi-value argument, and the argument list contains
#   "SOURCES a b c SOURCES x y z" then the resulting value for SOURCES will be
#   "a;b;c;x;y;z" rather than "x;y;z"
# - This function errors out by default on unrecognized arguments.  You can
#   pass in an extra "ALLOW_UNPARSED_ARGS" argument to make it behave like
#   cmake_parse_arguments(), and return the unparsed arguments in a
#   <prefix>_UNPARSED_ARGUMENTS variable instead.
#
# It does look like cmake_parse_arguments() handled empty arguments correctly
# from CMake 3.0 through 3.3, but it seems like this was probably broken when
# it was turned into a built-in function in CMake 3.4.  Here is discussion and
# patches that fixed this behavior prior to CMake 3.0:
# https://cmake.org/pipermail/cmake-developers/2013-November/020607.html
#
# The one downside to this function over the built-in cmake_parse_arguments()
# is that I don't think we can achieve the PARSE_ARGV behavior in a non-builtin
# function, so we can't properly handle arguments that contain ";".  CMake will
# treat the ";" characters as list element separators, and treat it as multiple
# separate arguments.
#
function(fb_cmake_parse_args PREFIX OPTIONS ONE_VALUE_ARGS MULTI_VALUE_ARGS ARGS)
  foreach(option IN LISTS ARGN)
    if ("${option}" STREQUAL "ALLOW_UNPARSED_ARGS")
      set(ALLOW_UNPARSED_ARGS TRUE)
    else()
      message(
        FATAL_ERROR
        "unknown optional argument for fb_cmake_parse_args(): ${option}"
      )
    endif()
  endforeach()

  # Define all options as FALSE in the parent scope to start with
  foreach(var_name IN LISTS OPTIONS)
    set("${PREFIX}_${var_name}" "FALSE" PARENT_SCOPE)
  endforeach()

  # TODO: We aren't extremely strict about error checking for one-value
  # arguments here.  e.g., we don't complain if a one-value argument is
  # followed by another option/one-value/multi-value name rather than an
  # argument.  We also don't complain if a one-value argument is the last
  # argument and isn't followed by a value.

  list(APPEND all_args ${ONE_VALUE_ARGS})
  list(APPEND all_args ${MULTI_VALUE_ARGS})
  set(current_variable)
  set(unparsed_args)
  foreach(arg IN LISTS ARGS)
    list(FIND OPTIONS "${arg}" opt_index)
    if("${opt_index}" EQUAL -1)
      list(FIND all_args "${arg}" arg_index)
      if("${arg_index}" EQUAL -1)
        # This argument does not match an argument name,
        # must be an argument value
        if("${current_variable}" STREQUAL "")
          list(APPEND unparsed_args "${arg}")
        else()
          # Ugh, CMake lists have a pretty fundamental flaw: they cannot
          # distinguish between an empty list and a list with a single empty
          # element.  We track our own SEEN_VALUES_arg setting to help
          # distinguish this and behave properly here.
          if ("${SEEN_${current_variable}}" AND "${${current_variable}}" STREQUAL "")
            set("${current_variable}" ";${arg}")
          else()
            list(APPEND "${current_variable}" "${arg}")
          endif()
          set("SEEN_${current_variable}" TRUE)
        endif()
      else()
        # We found a single- or multi-value argument name
        set(current_variable "VALUES_${arg}")
        set("SEEN_${arg}" TRUE)
      endif()
    else()
      # We found an option variable
      set("${PREFIX}_${arg}" "TRUE" PARENT_SCOPE)
      set(current_variable)
    endif()
  endforeach()

  foreach(arg_name IN LISTS ONE_VALUE_ARGS)
    if(NOT "${SEEN_${arg_name}}")
      unset("${PREFIX}_${arg_name}" PARENT_SCOPE)
    elseif(NOT "${SEEN_VALUES_${arg_name}}")
      # If the argument was seen but a value wasn't specified, error out.
      # We require exactly one value to be specified.
      message(
        FATAL_ERROR "argument ${arg_name} was specified without a value"
      )
    else()
      list(LENGTH "VALUES_${arg_name}" num_args)
      if("${num_args}" EQUAL 0)
        # We know an argument was specified and that we called list(APPEND).
        # If CMake thinks the list is empty that means there is really a single
        # empty element in the list.
        set("${PREFIX}_${arg_name}" "" PARENT_SCOPE)
      elseif("${num_args}" EQUAL 1)
        list(GET "VALUES_${arg_name}" 0 arg_value)
        set("${PREFIX}_${arg_name}" "${arg_value}" PARENT_SCOPE)
      else()
        message(
          FATAL_ERROR "too many arguments specified for ${arg_name}: "
          "${VALUES_${arg_name}}"
        )
      endif()
    endif()
  endforeach()

  foreach(arg_name IN LISTS MULTI_VALUE_ARGS)
    # If this argument name was never seen, then unset the parent scope
    if (NOT "${SEEN_${arg_name}}")
      unset("${PREFIX}_${arg_name}" PARENT_SCOPE)
    else()
      # TODO: Our caller still won't be able to distinguish between an empty
      # list and a list with a single empty element.  We can tell which is
      # which, but CMake lists don't make it easy to show this to our caller.
      set("${PREFIX}_${arg_name}" "${VALUES_${arg_name}}" PARENT_SCOPE)
    endif()
  endforeach()

  # By default we fatal out on unparsed arguments, but return them to the
  # caller if ALLOW_UNPARSED_ARGS was specified.
  if (DEFINED unparsed_args)
    if ("${ALLOW_UNPARSED_ARGS}")
      set("${PREFIX}_UNPARSED_ARGUMENTS" "${unparsed_args}" PARENT_SCOPE)
    else()
      message(FATAL_ERROR "unrecognized arguments: ${unparsed_args}")
    endif()
  endif()
endfunction()


================================================
FILE: build/fbcode_builder/CMake/FBCompilerSettings.cmake
================================================
# Copyright (c) Facebook, Inc. and its affiliates.

# This file applies common compiler settings that are shared across
# a number of Facebook opensource projects.
# Please use caution and your best judgement before making changes
# to these shared compiler settings in order to avoid accidentally
# breaking a build in another project!

if (WIN32)
  include(FBCompilerSettingsMSVC)
else()
  include(FBCompilerSettingsUnix)
endif()


================================================
FILE: build/fbcode_builder/CMake/FBCompilerSettingsMSVC.cmake
================================================
# Copyright (c) Facebook, Inc. and its affiliates.

# This file applies common compiler settings that are shared across
# a number of Facebook opensource projects.
# Please use caution and your best judgement before making changes
# to these shared compiler settings in order to avoid accidentally
# breaking a build in another project!

add_compile_options(
  /wd4250 # 'class1' : inherits 'class2::member' via dominance
  /Zc:preprocessor # Enable conforming preprocessor for __VA_OPT__ support
)


================================================
FILE: build/fbcode_builder/CMake/FBCompilerSettingsUnix.cmake
================================================
# Copyright (c) Facebook, Inc. and its affiliates.

# This file applies common compiler settings that are shared across
# a number of Facebook opensource projects.
# Please use caution and your best judgement before making changes
# to these shared compiler settings in order to avoid accidentally
# breaking a build in another project!

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -Wextra -Wno-deprecated -Wno-deprecated-declarations")


================================================
FILE: build/fbcode_builder/CMake/FBPythonBinary.cmake
================================================
# Copyright (c) Facebook, Inc. and its affiliates.

include(FBCMakeParseArgs)

#
# This file contains helper functions for building self-executing Python
# binaries.
#
# This is somewhat different than typical python installation with
# distutils/pip/virtualenv/etc.  We primarily want to build a standalone
# executable, isolated from other Python packages on the system.  We don't want
# to install files into the standard library python paths.  This is more
# similar to PEX (https://github.com/pantsbuild/pex) and XAR
# (https://github.com/facebookincubator/xar).  (In the future it would be nice
# to update this code to also support directly generating XAR files if XAR is
# available.)
#
# We also want to be able to easily define "libraries" of python files that can
# be shared and re-used between these standalone python executables, and can be
# shared across projects in different repositories.  This means that we do need
# a way to "install" libraries so that they are visible to CMake builds in
# other repositories, without actually installing them in the standard python
# library paths.
#

# If the caller has not already found Python, do so now.
# If we fail to find python now we won't fail immediately, but
# add_fb_python_executable() or add_fb_python_library() will fatal out if they
# are used.
if(NOT TARGET Python3::Interpreter)
  # CMake 3.12+ ships with a FindPython3.cmake module.  Try using it first.
  # We find with QUIET here, since otherwise this generates some noisy warnings
  # on versions of CMake before 3.12
  if (WIN32)
    # On Windows we need both the Interpreter as well as the Development
    # libraries.
    find_package(Python3 COMPONENTS Interpreter Development QUIET)
  else()
    find_package(Python3 COMPONENTS Interpreter QUIET)
  endif()
  if(Python3_Interpreter_FOUND)
    message(STATUS "Found Python 3: ${Python3_EXECUTABLE}")
  else()
    # Try with the FindPythonInterp.cmake module available in older CMake
    # versions.  Check to see if the caller has already searched for this
    # themselves first.
    if(NOT PYTHONINTERP_FOUND)
      set(Python_ADDITIONAL_VERSIONS 3 3.6 3.5 3.4 3.3 3.2 3.1)
      find_package(PythonInterp)
      # TODO: On Windows we require the Python libraries as well.
      # We currently do not search for them on this code path.
      # For now we require building with CMake 3.12+ on Windows, so that the
      # FindPython3 code path above is available.
    endif()
    if(PYTHONINTERP_FOUND)
      if("${PYTHON_VERSION_MAJOR}" GREATER_EQUAL 3)
        set(Python3_EXECUTABLE "${PYTHON_EXECUTABLE}")
        add_custom_target(Python3::Interpreter)
      else()
        string(
          CONCAT FBPY_FIND_PYTHON_ERR
          "found Python ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}, "
          "but need Python 3"
        )
      endif()
    endif()
  endif()
endif()

# Find our helper program.
# We typically install this in the same directory as this .cmake file.
find_program(
  FB_MAKE_PYTHON_ARCHIVE "make_fbpy_archive.py"
  PATHS ${CMAKE_MODULE_PATH}
)
set(FB_PY_TEST_MAIN "${CMAKE_CURRENT_LIST_DIR}/fb_py_test_main.py")
set(
  FB_PY_TEST_DISCOVER_SCRIPT
  "${CMAKE_CURRENT_LIST_DIR}/FBPythonTestAddTests.cmake"
)
set(
  FB_PY_WIN_MAIN_C
  "${CMAKE_CURRENT_LIST_DIR}/fb_py_win_main.c"
)

# An option to control the default installation location for
# install_fb_python_library().  This is relative to ${CMAKE_INSTALL_PREFIX}
set(
  FBPY_LIB_INSTALL_DIR "lib/fb-py-libs" CACHE STRING
  "The subdirectory where FB python libraries should be installed"
)

#
# Build a self-executing python binary.
#
# This accepts the same arguments as add_fb_python_library().
#
# In addition, a MAIN_MODULE argument is accepted.  This argument specifies
# which module should be started as the __main__ module when the executable is
# run.  If left unspecified, a __main__.py script must be present in the
# manifest.
#
function(add_fb_python_executable TARGET)
  fb_py_check_available()

  # Parse the arguments
  set(one_value_args BASE_DIR NAMESPACE MAIN_MODULE TYPE)
  set(multi_value_args SOURCES DEPENDS)
  fb_cmake_parse_args(
    ARG "" "${one_value_args}" "${multi_value_args}" "${ARGN}"
  )
  fb_py_process_default_args(ARG_NAMESPACE ARG_BASE_DIR)

  # Use add_fb_python_library() to perform most of our source handling
  add_fb_python_library(
    "${TARGET}.main_lib"
    BASE_DIR "${ARG_BASE_DIR}"
    NAMESPACE "${ARG_NAMESPACE}"
    SOURCES ${ARG_SOURCES}
    DEPENDS ${ARG_DEPENDS}
  )

  set(
    manifest_files
    "$<TARGET_PROPERTY:${TARGET}.main_lib.py_lib,INTERFACE_INCLUDE_DIRECTORIES>"
  )
  set(
    source_files
    "$<TARGET_PROPERTY:${TARGET}.main_lib.py_lib,INTERFACE_SOURCES>"
  )

  # The command to build the executable archive.
  #
  # If we are using CMake 3.8+ we can use COMMAND_EXPAND_LISTS.
  # CMP0067 isn't really the policy we care about, but seems like the best way
  # to check if we are running 3.8+.
  if (POLICY CMP0067)
    set(extra_cmd_params COMMAND_EXPAND_LISTS)
    set(make_py_args "${manifest_files}")
  else()
    set(extra_cmd_params)
    set(make_py_args --manifest-separator "::" "$<JOIN:${manifest_files},::>")
  endif()

  set(output_file "${TARGET}${CMAKE_EXECUTABLE_SUFFIX}")
  if(WIN32)
    set(zipapp_output "${TARGET}.py_zipapp")
  else()
    set(zipapp_output "${output_file}")
  endif()
  set(zipapp_output_file "${zipapp_output}")

  set(is_dir_output FALSE)
  if(DEFINED ARG_TYPE)
    list(APPEND make_py_args "--type" "${ARG_TYPE}")
    if ("${ARG_TYPE}" STREQUAL "dir")
      set(is_dir_output TRUE)
      # CMake doesn't really seem to like having a directory specified as an
      # output; specify the __main__.py file as the output instead.
      set(zipapp_output_file "${zipapp_output}/__main__.py")
      # Update output_file to match zipapp_output_file for dir type
      set(output_file "${zipapp_output_file}")
      list(APPEND
        extra_cmd_params
        COMMAND "${CMAKE_COMMAND}" -E remove_directory "${zipapp_output}"
      )
    endif()
  endif()

  if(DEFINED ARG_MAIN_MODULE)
    list(APPEND make_py_args "--main" "${ARG_MAIN_MODULE}")
  endif()

  add_custom_command(
    OUTPUT "${zipapp_output_file}"
    ${extra_cmd_params}
    COMMAND
      "${Python3_EXECUTABLE}" "${FB_MAKE_PYTHON_ARCHIVE}"
      -o "${zipapp_output}"
      ${make_py_args}
    DEPENDS
      ${source_files}
      "${TARGET}.main_lib.py_sources_built"
      "${FB_MAKE_PYTHON_ARCHIVE}"
  )

  if(WIN32)
    if(is_dir_output)
      # TODO: generate a main executable that will invoke Python3
      # with the correct main module inside the output directory
    else()
      add_executable("${TARGET}.winmain" "${FB_PY_WIN_MAIN_C}")
      target_link_libraries("${TARGET}.winmain" Python3::Python)
      # The Python3::Python target doesn't seem to be set up completely
      # correctly on Windows for some reason, and we have to explicitly add
      # ${Python3_LIBRARY_DIRS} to the target link directories.
      target_link_directories(
        "${TARGET}.winmain"
        PUBLIC ${Python3_LIBRARY_DIRS}
      )
      add_custom_command(
        OUTPUT "${output_file}"
        DEPENDS "${TARGET}.winmain" "${zipapp_output_file}"
        COMMAND
          "cmd.exe" "/c" "copy" "/b"
          "${TARGET}.winmain${CMAKE_EXECUTABLE_SUFFIX}+${zipapp_output}"
          "${output_file}"
      )
    endif()
  endif()

  # Add an "ALL" target that depends on force ${TARGET},
  # so that ${TARGET} will be included in the default list of build targets.
  add_custom_target("${TARGET}.GEN_PY_EXE" ALL DEPENDS "${output_file}")

  # Allow resolving the executable path for the target that we generate
  # via a generator expression like:
  # "WATCHMAN_WAIT_PATH=$<TARGET_PROPERTY:watchman-wait.GEN_PY_EXE,EXECUTABLE>"
  set_property(TARGET "${TARGET}.GEN_PY_EXE"
      PROPERTY EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/${output_file}")
endfunction()

# Define a python unittest executable.
# The executable is built using add_fb_python_executable and has the
# following differences:
#
# Each of the source files specified in SOURCES will be imported
# and have unittest discovery performed upon them.
# Those sources will be imported in the top level namespace.
#
# The ENV argument allows specifying a list of "KEY=VALUE"
# pairs that will be used by the test runner to set up the environment
# in the child process prior to running the test.  This is useful for
# passing additional configuration to the test.
function(add_fb_python_unittest TARGET)
  # Parse the arguments
  set(multi_value_args SOURCES DEPENDS ENV PROPERTIES)
  set(
    one_value_args
    WORKING_DIRECTORY BASE_DIR NAMESPACE TEST_LIST DISCOVERY_TIMEOUT TYPE
  )
  fb_cmake_parse_args(
    ARG "" "${one_value_args}" "${multi_value_args}" "${ARGN}"
  )
  fb_py_process_default_args(ARG_NAMESPACE ARG_BASE_DIR)
  if(NOT ARG_WORKING_DIRECTORY)
    # Default the working directory to the current binary directory.
    # This matches the default behavior of add_test() and other standard
    # test functions like gtest_discover_tests()
    set(ARG_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  endif()
  if(NOT ARG_TEST_LIST)
    set(ARG_TEST_LIST "${TARGET}_TESTS")
  endif()
  if(NOT ARG_DISCOVERY_TIMEOUT)
    set(ARG_DISCOVERY_TIMEOUT 5)
  endif()

  # Tell our test program the list of modules to scan for tests.
  # We scan all modules directly listed in our SOURCES argument, and skip
  # modules that came from dependencies in the DEPENDS list.
  #
  # This is written into a __test_modules__.py module that the test runner
  # will look at.
  set(
    test_modules_path
    "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_test_modules.py"
  )
  file(WRITE "${test_modules_path}" "TEST_MODULES = [\n")
  string(REPLACE "." "/" namespace_dir "${ARG_NAMESPACE}")
  if (NOT "${namespace_dir}" STREQUAL "")
    set(namespace_dir "${namespace_dir}/")
  endif()
  set(test_modules)
  foreach(src_path IN LISTS ARG_SOURCES)
    fb_py_compute_dest_path(
      abs_source dest_path
      "${src_path}" "${namespace_dir}" "${ARG_BASE_DIR}"
    )
    string(REPLACE "/" "." module_name "${dest_path}")
    string(REGEX REPLACE "\\.py$" "" module_name "${module_name}")
    list(APPEND test_modules "${module_name}")
    file(APPEND "${test_modules_path}" "  '${module_name}',\n")
  endforeach()
  file(APPEND "${test_modules_path}" "]\n")

  # The __main__ is provided by our runner wrapper/bootstrap
  list(APPEND ARG_SOURCES "${FB_PY_TEST_MAIN}=__main__.py")
  list(APPEND ARG_SOURCES "${test_modules_path}=__test_modules__.py")

  if(NOT DEFINED ARG_TYPE)
    set(ARG_TYPE "zipapp")
  endif()

  add_fb_python_executable(
    "${TARGET}"
    TYPE "${ARG_TYPE}"
    NAMESPACE "${ARG_NAMESPACE}"
    BASE_DIR "${ARG_BASE_DIR}"
    SOURCES ${ARG_SOURCES}
    DEPENDS ${ARG_DEPENDS}
  )

  # Run test discovery after the test executable is built.
  # This logic is based on the code for gtest_discover_tests()
  set(ctest_file_base "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}")
  set(ctest_include_file "${ctest_file_base}_include.cmake")
  set(ctest_tests_file "${ctest_file_base}_tests.cmake")
  add_custom_command(
    TARGET "${TARGET}.GEN_PY_EXE" POST_BUILD
    BYPRODUCTS "${ctest_tests_file}"
    COMMAND
      "${CMAKE_COMMAND}"
      -D "TEST_TARGET=${TARGET}"
      -D "TEST_INTERPRETER=${Python3_EXECUTABLE}"
      -D "TEST_ENV=${ARG_ENV}"
      -D "TEST_EXECUTABLE=$<TARGET_PROPERTY:${TARGET}.GEN_PY_EXE,EXECUTABLE>"
      -D "TEST_WORKING_DIR=${ARG_WORKING_DIRECTORY}"
      -D "TEST_LIST=${ARG_TEST_LIST}"
      -D "TEST_PREFIX=${TARGET}::"
      -D "TEST_PROPERTIES=${ARG_PROPERTIES}"
      -D "CTEST_FILE=${ctest_tests_file}"
      -P "${FB_PY_TEST_DISCOVER_SCRIPT}"
    VERBATIM
  )

  file(
    WRITE "${ctest_include_file}"
    "if(EXISTS \"${ctest_tests_file}\")\n"
    "  include(\"${ctest_tests_file}\")\n"
    "else()\n"
    "  add_test(\"${TARGET}_NOT_BUILT\" \"${TARGET}_NOT_BUILT\")\n"
    "endif()\n"
  )
  set_property(
    DIRECTORY APPEND PROPERTY TEST_INCLUDE_FILES
    "${ctest_include_file}"
  )
endfunction()

#
# Define a python library.
#
# If you want to install a python library generated from this rule note that
# you need to use install_fb_python_library() rather than CMake's built-in
# install() function.  This will make it available for other downstream
# projects to use in their add_fb_python_executable() and
# add_fb_python_library() calls.  (You do still need to use `install(EXPORT)`
# later to install the CMake exports.)
#
# Parameters:
# - BASE_DIR <dir>:
#   The base directory path to strip off from each source path.  All source
#   files must be inside this directory.  If not specified it defaults to
#   ${CMAKE_CURRENT_SOURCE_DIR}.
# - NAMESPACE <namespace>:
#   The destination namespace where these files should be installed in python
#   binaries.  If not specified, this defaults to the current relative path of
#   ${CMAKE_CURRENT_SOURCE_DIR} inside ${CMAKE_SOURCE_DIR}.  e.g., a python
#   library defined in the directory repo_root/foo/bar will use a default
#   namespace of "foo.bar"
# - SOURCES <src1> <...>:
#   The python source files.
#   You may optionally specify as source using the form: PATH=ALIAS where
#   PATH is a relative path in the source tree and ALIAS is the relative
#   path into which PATH should be rewritten.  This is useful for mapping
#   an executable script to the main module in a python executable.
#   e.g.: `python/bin/watchman-wait=__main__.py`
# - DEPENDS <target1> <...>:
#   Other python libraries that this one depends on.
# - INSTALL_DIR <dir>:
#   The directory where this library should be installed.
#   install_fb_python_library() must still be called later to perform the
#   installation.  If a relative path is given it will be treated relative to
#   ${CMAKE_INSTALL_PREFIX}
#
# CMake is unfortunately pretty crappy at being able to define custom build
# rules & behaviors.  It doesn't support transitive property propagation
# between custom targets; only the built-in add_executable() and add_library()
# targets support transitive properties.
#
# We hack around this janky CMake behavior by (ab)using interface libraries to
# propagate some of the data we want between targets, without actually
# generating a C library.
#
# add_fb_python_library(SOMELIB) generates the following things:
# - An INTERFACE library rule named SOMELIB.py_lib which tracks some
#   information about transitive dependencies:
#   - the transitive set of source files in the INTERFACE_SOURCES property
#   - the transitive set of manifest files that this library depends on in
#     the INTERFACE_INCLUDE_DIRECTORIES property.
# - A custom command that generates a SOMELIB.manifest file.
#   This file contains the mapping of source files to desired destination
#   locations in executables that depend on this library.  This manifest file
#   will then be read at build-time in order to build executables.
#
function(add_fb_python_library LIB_NAME)
  fb_py_check_available()

  # Parse the arguments
  # We use fb_cmake_parse_args() rather than cmake_parse_arguments() since
  # cmake_parse_arguments() does not handle empty arguments, and it is common
  # for callers to want to specify an empty NAMESPACE parameter.
  set(one_value_args BASE_DIR NAMESPACE INSTALL_DIR)
  set(multi_value_args SOURCES DEPENDS)
  fb_cmake_parse_args(
    ARG "" "${one_value_args}" "${multi_value_args}" "${ARGN}"
  )
  fb_py_process_default_args(ARG_NAMESPACE ARG_BASE_DIR)

  string(REPLACE "." "/" namespace_dir "${ARG_NAMESPACE}")
  if (NOT "${namespace_dir}" STREQUAL "")
    set(namespace_dir "${namespace_dir}/")
  endif()

  if(NOT DEFINED ARG_INSTALL_DIR)
    set(install_dir "${FBPY_LIB_INSTALL_DIR}/")
  elseif("${ARG_INSTALL_DIR}" STREQUAL "")
    set(install_dir "")
  else()
    set(install_dir "${ARG_INSTALL_DIR}/")
  endif()

  # message(STATUS "fb py library ${LIB_NAME}: "
  #         "NS=${namespace_dir} BASE=${ARG_BASE_DIR}")

  # TODO: In the future it would be nice to support pre-compiling the source
  # files.  We could emit a rule to compile each source file and emit a
  # .pyc/.pyo file here, and then have the manifest reference the pyc/pyo
  # files.

  # Define a library target to help pass around information about the library,
  # and propagate dependency information.
  #
  # CMake make a lot of assumptions that libraries are C++ libraries.  To help
  # avoid confusion we name our target "${LIB_NAME}.py_lib" rather than just
  # "${LIB_NAME}".  This helps avoid confusion if callers try to use
  # "${LIB_NAME}" on their own as a target name.  (e.g., attempting to install
  # it directly with install(TARGETS) won't work.  Callers must use
  # install_fb_python_library() instead.)
  add_library("${LIB_NAME}.py_lib" INTERFACE)

  # Emit the manifest file.
  #
  # We write the manifest file to a temporary path first, then copy it with
  # configure_file(COPYONLY).  This is necessary to get CMake to understand
  # that "${manifest_path}" is generated by the CMake configure phase,
  # and allow using it as a dependency for add_custom_command().
  # (https://gitlab.kitware.com/cmake/cmake/issues/16367)
  set(manifest_path "${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}.manifest") 
  set(tmp_manifest "${manifest_path}.tmp")
  file(WRITE "${tmp_manifest}" "FBPY_MANIFEST 1\n")
  set(abs_sources)
  foreach(src_path IN LISTS ARG_SOURCES)
    fb_py_compute_dest_path(
      abs_source dest_path
      "${src_path}" "${namespace_dir}" "${ARG_BASE_DIR}"
    )
    list(APPEND abs_sources "${abs_source}")
    target_sources(
      "${LIB_NAME}.py_lib" INTERFACE
      "$<BUILD_INTERFACE:${abs_source}>"
      "$<INSTALL_INTERFACE:${install_dir}${LIB_NAME}/${dest_path}>"
    )
    file(
      APPEND "${tmp_manifest}"
      "${abs_source} :: ${dest_path}\n"
    )
  endforeach()
  configure_file("${tmp_manifest}" "${manifest_path}" COPYONLY)

  target_include_directories(
    "${LIB_NAME}.py_lib" INTERFACE
    "$<BUILD_INTERFACE:${manifest_path}>"
    "$<INSTALL_INTERFACE:${install_dir}${LIB_NAME}.manifest>"
  )

  # Add a target that depends on all of the source files.
  # This is needed in case some of the source files are generated.  This will
  # ensure that these source files are brought up-to-date before we build
  # any python binaries that depend on this library.
  add_custom_target("${LIB_NAME}.py_sources_built" DEPENDS ${abs_sources})
  add_dependencies("${LIB_NAME}.py_lib" "${LIB_NAME}.py_sources_built"
Download .txt
gitextract_tb73yhxd/

├── .gitattributes
├── .github/
│   └── workflows/
│       ├── generate-release-yml.rs
│       ├── getdeps_linux.yml
│       ├── getdeps_mac.yml
│       ├── getdeps_windows.yml
│       ├── package.yml
│       ├── release.yml
│       └── release.yml.in
├── .gitignore
├── CMakeLists.txt
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.markdown
├── autogen.cmd
├── autogen.sh
├── build/
│   ├── deps/
│   │   └── github_hashes/
│   │       ├── facebook/
│   │       │   ├── fb303-rev.txt
│   │       │   ├── fbthrift-rev.txt
│   │       │   ├── folly-rev.txt
│   │       │   ├── mvfst-rev.txt
│   │       │   └── wangle-rev.txt
│   │       ├── facebookexperimental/
│   │       │   └── edencommon-rev.txt
│   │       └── facebookincubator/
│   │           └── fizz-rev.txt
│   └── fbcode_builder/
│       ├── .gitignore
│       ├── CMake/
│       │   ├── FBBuildOptions.cmake
│       │   ├── FBCMakeParseArgs.cmake
│       │   ├── FBCompilerSettings.cmake
│       │   ├── FBCompilerSettingsMSVC.cmake
│       │   ├── FBCompilerSettingsUnix.cmake
│       │   ├── FBPythonBinary.cmake
│       │   ├── FBPythonTestAddTests.cmake
│       │   ├── FBThriftCppLibrary.cmake
│       │   ├── FBThriftLibrary.cmake
│       │   ├── FBThriftPyLibrary.cmake
│       │   ├── FindCares.cmake
│       │   ├── FindDoubleConversion.cmake
│       │   ├── FindGMock.cmake
│       │   ├── FindGflags.cmake
│       │   ├── FindGlog.cmake
│       │   ├── FindLMDB.cmake
│       │   ├── FindLibEvent.cmake
│       │   ├── FindLibUnwind.cmake
│       │   ├── FindLibiberty.cmake
│       │   ├── FindPCRE.cmake
│       │   ├── FindPCRE2.cmake
│       │   ├── FindRe2.cmake
│       │   ├── FindSodium.cmake
│       │   ├── FindXxhash.cmake
│       │   ├── FindZstd.cmake
│       │   ├── Findibverbs.cmake
│       │   ├── RustStaticLibrary.cmake
│       │   ├── fb_py_test_main.py
│       │   ├── fb_py_win_main.c
│       │   └── make_fbpy_archive.py
│       ├── LICENSE
│       ├── README.md
│       ├── getdeps/
│       │   ├── __init__.py
│       │   ├── builder.py
│       │   ├── buildopts.py
│       │   ├── cache.py
│       │   ├── cargo.py
│       │   ├── copytree.py
│       │   ├── dyndeps.py
│       │   ├── envfuncs.py
│       │   ├── errors.py
│       │   ├── expr.py
│       │   ├── fetcher.py
│       │   ├── include_rewriter.py
│       │   ├── load.py
│       │   ├── manifest.py
│       │   ├── platform.py
│       │   ├── py_wheel_builder.py
│       │   ├── runcmd.py
│       │   ├── subcmd.py
│       │   └── test/
│       │       ├── expr_test.py
│       │       ├── fixtures/
│       │       │   └── duplicate/
│       │       │       ├── foo
│       │       │       └── subdir/
│       │       │           └── foo
│       │       ├── manifest_test.py
│       │       ├── platform_test.py
│       │       ├── retry_test.py
│       │       ├── scratch_test.py
│       │       └── strip_marker_test.py
│       ├── getdeps.py
│       ├── manifests/
│       │   ├── CLI11
│       │   ├── autoconf
│       │   ├── automake
│       │   ├── benchmark
│       │   ├── blake3
│       │   ├── boost
│       │   ├── boost-python
│       │   ├── bz2
│       │   ├── c-ares
│       │   ├── cabal
│       │   ├── cachelib
│       │   ├── cinderx-3_14
│       │   ├── cinderx-main
│       │   ├── clang
│       │   ├── clang19
│       │   ├── cmake
│       │   ├── cpptoml
│       │   ├── double-conversion
│       │   ├── double-conversion-python
│       │   ├── eden
│       │   ├── edencommon
│       │   ├── exprtk
│       │   ├── fast_float
│       │   ├── fatal
│       │   ├── fb303
│       │   ├── fboss
│       │   ├── fbthrift
│       │   ├── fbthrift-python
│       │   ├── fizz
│       │   ├── fizz-python
│       │   ├── fmt
│       │   ├── fmt-python
│       │   ├── folly
│       │   ├── folly-python
│       │   ├── gcc12
│       │   ├── gcc14
│       │   ├── gflags
│       │   ├── ghc
│       │   ├── git-lfs
│       │   ├── glean
│       │   ├── glog
│       │   ├── googletest
│       │   ├── gperf
│       │   ├── hexdump
│       │   ├── hsthrift
│       │   ├── iproute2
│       │   ├── jom
│       │   ├── jq
│       │   ├── katran
│       │   ├── libaio
│       │   ├── libaio-python
│       │   ├── libbpf
│       │   ├── libcurl
│       │   ├── libdwarf
│       │   ├── libdwarf-python
│       │   ├── libelf
│       │   ├── libevent
│       │   ├── libevent-python
│       │   ├── libffi
│       │   ├── libgit2
│       │   ├── libgpiod
│       │   ├── libiberty
│       │   ├── libiberty-python
│       │   ├── libibverbs
│       │   ├── libmnl
│       │   ├── libnl
│       │   ├── liboqs
│       │   ├── libsai
│       │   ├── libsodium
│       │   ├── libunwind
│       │   ├── libusb
│       │   ├── libyaml
│       │   ├── llvm
│       │   ├── lmdb
│       │   ├── lz4
│       │   ├── lz4-python
│       │   ├── magic_enum
│       │   ├── mcrouter
│       │   ├── mononoke
│       │   ├── mononoke_integration
│       │   ├── moxygen
│       │   ├── mvfst
│       │   ├── mvfst-python
│       │   ├── ncurses
│       │   ├── nghttp2
│       │   ├── ninja
│       │   ├── nlohmann-json
│       │   ├── nmap
│       │   ├── numa
│       │   ├── openr
│       │   ├── openssl
│       │   ├── osxfuse
│       │   ├── patchelf
│       │   ├── pcre2
│       │   ├── perl
│       │   ├── pexpect
│       │   ├── proxygen
│       │   ├── python
│       │   ├── python-3_14
│       │   ├── python-click
│       │   ├── python-filelock
│       │   ├── python-main
│       │   ├── python-psutil
│       │   ├── python-ptyprocess
│       │   ├── python-pyyaml
│       │   ├── python-setuptools
│       │   ├── python-setuptools-69
│       │   ├── python-six
│       │   ├── python-toml
│       │   ├── ragel
│       │   ├── range-v3
│       │   ├── rdma-core
│       │   ├── re2
│       │   ├── rebalancer
│       │   ├── ripgrep
│       │   ├── rocksdb
│       │   ├── rust-shed
│       │   ├── sapling
│       │   ├── snappy
│       │   ├── sparsemap
│       │   ├── sqlite3
│       │   ├── systemd
│       │   ├── tabulate
│       │   ├── tree
│       │   ├── wangle
│       │   ├── wangle-python
│       │   ├── watchman
│       │   ├── xxhash
│       │   ├── xz
│       │   ├── yaml-cpp
│       │   ├── zlib
│       │   ├── zlib-python
│       │   ├── zstd
│       │   └── zstd-python
│       └── patches/
│           ├── boost_1_83_0.patch
│           ├── iproute2_oss.patch
│           ├── libiberty_install_pic_lib.patch
│           └── zlib_dont_build_more_than_needed.patch
├── clippy.toml
├── install-system-packages.sh
├── run-tests.sh
├── rustfmt.toml
├── watchman/
│   ├── .clang-format
│   ├── .clang-tidy
│   ├── .codex/
│   │   └── AGENTS.md
│   ├── .llms/
│   │   └── rules/
│   │       └── AGENTS.md
│   ├── .projectid
│   ├── BUCK
│   ├── ChildProcess.cpp
│   ├── ChildProcess.h
│   ├── Client.cpp
│   ├── Client.h
│   ├── ClientContext.h
│   ├── Clock.cpp
│   ├── Clock.h
│   ├── Command.cpp
│   ├── Command.h
│   ├── CommandRegistry.cpp
│   ├── CommandRegistry.h
│   ├── Connect.cpp
│   ├── Connect.h
│   ├── Constants.h
│   ├── ContentHash.cpp
│   ├── ContentHash.h
│   ├── Cookie.h
│   ├── CookieSync.cpp
│   ├── CookieSync.h
│   ├── Errors.cpp
│   ├── Errors.h
│   ├── FlagMap.cpp
│   ├── FlagMap.h
│   ├── GroupLookup.cpp
│   ├── GroupLookup.h
│   ├── Hash.h
│   ├── IgnoreSet.cpp
│   ├── IgnoreSet.h
│   ├── InMemoryView.cpp
│   ├── InMemoryView.h
│   ├── LRUCache.h
│   ├── LogConfig.cpp
│   ├── LogConfig.h
│   ├── Logging.cpp
│   ├── Logging.h
│   ├── MapUtil.h
│   ├── Options.cpp
│   ├── Options.h
│   ├── PDU.cpp
│   ├── PDU.h
│   ├── PathUtils.cpp
│   ├── PathUtils.h
│   ├── PendingCollection.cpp
│   ├── PendingCollection.h
│   ├── PerfSample.cpp
│   ├── PerfSample.h
│   ├── Poison.cpp
│   ├── Poison.h
│   ├── ProcessLock.cpp
│   ├── ProcessLock.h
│   ├── ProcessUtil.cpp
│   ├── ProcessUtil.h
│   ├── PubSub.cpp
│   ├── PubSub.h
│   ├── QueryableView.cpp
│   ├── QueryableView.h
│   ├── Result.h
│   ├── RingBuffer.h
│   ├── SanityCheck.cpp
│   ├── SanityCheck.h
│   ├── Serde.h
│   ├── Shutdown.cpp
│   ├── Shutdown.h
│   ├── SignalHandler.cpp
│   ├── SignalHandler.h
│   ├── SymlinkTargets.cpp
│   ├── SymlinkTargets.h
│   ├── ThreadPool.cpp
│   ├── ThreadPool.h
│   ├── TriggerCommand.cpp
│   ├── TriggerCommand.h
│   ├── UserDir.cpp
│   ├── UserDir.h
│   ├── WatchmanConfig.cpp
│   ├── WatchmanConfig.h
│   ├── XattrUtils.cpp
│   ├── XattrUtils.h
│   ├── benchmarks/
│   │   ├── BUCK
│   │   ├── bser.cpp
│   │   └── string.cpp
│   ├── bser.cpp
│   ├── bser.h
│   ├── build/
│   │   ├── package/
│   │   │   ├── fedora-env/
│   │   │   │   └── Dockerfile
│   │   │   ├── make-deb.sh
│   │   │   ├── make-packages.sh
│   │   │   ├── make-rpm.sh
│   │   │   ├── substcontrol.py
│   │   │   ├── ubuntu-env/
│   │   │   │   └── Dockerfile
│   │   │   ├── watchman-build/
│   │   │   │   └── Dockerfile
│   │   │   ├── watchman-deb/
│   │   │   │   ├── DEBIAN/
│   │   │   │   │   ├── control
│   │   │   │   │   └── postinst
│   │   │   │   ├── Dockerfile
│   │   │   │   └── make-deb.sh
│   │   │   └── watchman.spec
│   │   └── vagrant/
│   │       ├── .gitignore
│   │       ├── README.md
│   │       └── Vagrantfile
│   ├── cli/
│   │   ├── BUCK
│   │   ├── CMakeLists.txt
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── audit.rs
│   │       ├── main.rs
│   │       └── rage/
│   │           ├── mod.rs
│   │           └── stream.rs
│   ├── cmds/
│   │   ├── debug.cpp
│   │   ├── find.cpp
│   │   ├── heapprof.cpp
│   │   ├── info.cpp
│   │   ├── log.cpp
│   │   ├── query.cpp
│   │   ├── since.cpp
│   │   ├── state.cpp
│   │   ├── subscribe.cpp
│   │   ├── trigger.cpp
│   │   └── watch.cpp
│   ├── cppclient/
│   │   ├── BUCK
│   │   ├── CLI.cpp
│   │   ├── WatchmanClient.cpp
│   │   ├── WatchmanClient.h
│   │   ├── WatchmanConnection.cpp
│   │   ├── WatchmanConnection.h
│   │   ├── WatchmanResponseError.cpp
│   │   └── watchmanclient.pc.in
│   ├── docs/
│   │   └── sync.md
│   ├── facebook/
│   │   ├── BUCK
│   │   └── saved_state/
│   │       └── BUCK
│   ├── fs/
│   │   ├── BUCK
│   │   ├── DirHandle.h
│   │   ├── FSDetect.cpp
│   │   ├── FSDetect.h
│   │   ├── FileDescriptor.cpp
│   │   ├── FileDescriptor.h
│   │   ├── FileInformation.cpp
│   │   ├── FileInformation.h
│   │   ├── FileSystem.cpp
│   │   ├── FileSystem.h
│   │   ├── ParallelWalk.cpp
│   │   ├── ParallelWalk.h
│   │   ├── ParallelWalkMain.cpp
│   │   ├── Pipe.cpp
│   │   ├── Pipe.h
│   │   ├── UnixDirHandle.cpp
│   │   ├── WinDirHandle.cpp
│   │   ├── WindowsTime.cpp
│   │   └── WindowsTime.h
│   ├── fuzz/
│   │   ├── BUCK
│   │   ├── BserDecode.cpp
│   │   ├── JsonDecode.cpp
│   │   └── PyBserDecode.cpp
│   ├── integration/
│   │   ├── BUCK
│   │   ├── CMakeLists.txt
│   │   ├── __init__.py
│   │   ├── capabilities.js
│   │   ├── case.js
│   │   ├── cat.py
│   │   ├── cppclient.cpp
│   │   ├── eden/
│   │   │   ├── BUCK
│   │   │   ├── test_eden_glob_upper_bound.py
│   │   │   ├── test_eden_journal.py
│   │   │   ├── test_eden_pathgen.py
│   │   │   ├── test_eden_query.py
│   │   │   ├── test_eden_scm.py
│   │   │   ├── test_eden_sha1.py
│   │   │   ├── test_eden_shutdown.py
│   │   │   ├── test_eden_since.py
│   │   │   ├── test_eden_subscribe.py
│   │   │   ├── test_eden_suffix.py
│   │   │   ├── test_eden_takeover.py
│   │   │   ├── test_eden_unmount.py
│   │   │   ├── test_eden_watch_parent.py
│   │   │   └── test_eden_watch_root.py
│   │   ├── facebook/
│   │   │   └── BUCK
│   │   ├── lib/
│   │   │   ├── BUCK
│   │   │   ├── Interrupt.py
│   │   │   ├── TempDir.py
│   │   │   ├── WatchmanEdenTestCase.py
│   │   │   ├── WatchmanInstance.py
│   │   │   ├── WatchmanSCMTestCase.py
│   │   │   ├── WatchmanTestCase.py
│   │   │   ├── __init__.py
│   │   │   ├── node.py
│   │   │   └── path_utils.py
│   │   ├── node_basic.js
│   │   ├── site_spawn.py
│   │   ├── site_spawn_fail.py
│   │   ├── test_absroot.py
│   │   ├── test_age_file.py
│   │   ├── test_age_watch.py
│   │   ├── test_auth.py
│   │   ├── test_big.py
│   │   ├── test_big_file.py
│   │   ├── test_bsdish.py
│   │   ├── test_bser_cli.py
│   │   ├── test_bulkstat.py
│   │   ├── test_capabilities.py
│   │   ├── test_case_sensitive.py
│   │   ├── test_clock.py
│   │   ├── test_command.py
│   │   ├── test_content_hash.py
│   │   ├── test_cookie.py
│   │   ├── test_cppclient.py
│   │   ├── test_cursor.py
│   │   ├── test_dir_move.py
│   │   ├── test_dirname.py
│   │   ├── test_empty.py
│   │   ├── test_fields.py
│   │   ├── test_find.py
│   │   ├── test_fishy.py
│   │   ├── test_force_recrawl.py
│   │   ├── test_fork.py
│   │   ├── test_fsevents_resync.py
│   │   ├── test_fstype.py
│   │   ├── test_glob.py
│   │   ├── test_ignore.py
│   │   ├── test_info.py
│   │   ├── test_invalid_expr.py
│   │   ├── test_invalid_watchmanconfig.py
│   │   ├── test_kqueue_and_fsevents_recrawl.py
│   │   ├── test_local_saved_state.py
│   │   ├── test_log.py
│   │   ├── test_match.py
│   │   ├── test_name.py
│   │   ├── test_nice.py
│   │   ├── test_nodejs.py
│   │   ├── test_path_generator.py
│   │   ├── test_pcre.py
│   │   ├── test_perms.py
│   │   ├── test_remove.py
│   │   ├── test_remove_then_add.py
│   │   ├── test_request_id.py
│   │   ├── test_restrictions.py
│   │   ├── test_saved_state.py
│   │   ├── test_scm.py
│   │   ├── test_since.py
│   │   ├── test_since_term.py
│   │   ├── test_site_spawn.py
│   │   ├── test_size.py
│   │   ├── test_sock_perms.py
│   │   ├── test_subscribe.py
│   │   ├── test_suffix.py
│   │   ├── test_suffix_generator.py
│   │   ├── test_trigger.py
│   │   ├── test_trigger_chdir.py
│   │   ├── test_trigger_error.py
│   │   ├── test_two_deep.py
│   │   ├── test_type.py
│   │   ├── test_watch_del_all.py
│   │   ├── test_watch_project.py
│   │   ├── test_wm_wait.py
│   │   ├── touch.py
│   │   ├── trig-cwd.py
│   │   ├── trig.py
│   │   └── trigjson.py
│   ├── java/
│   │   ├── .buckconfig
│   │   ├── .gitignore
│   │   ├── .nobuckcheck
│   │   ├── BUCK
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── pom.xml
│   │   ├── sandcastle.ini
│   │   ├── src/
│   │   │   └── com/
│   │   │       └── facebook/
│   │   │           └── watchman/
│   │   │               ├── Callback.java
│   │   │               ├── CapabilitiesStrategy.java
│   │   │               ├── Deserializer.java
│   │   │               ├── WatchmanClient.java
│   │   │               ├── WatchmanClientImpl.java
│   │   │               ├── WatchmanConnection.java
│   │   │               ├── WatchmanException.java
│   │   │               ├── WatchmanTransport.java
│   │   │               ├── WatchmanTransportBuilder.java
│   │   │               ├── WatchmanTransportUnavailableException.java
│   │   │               ├── bser/
│   │   │               │   ├── BserConstants.java
│   │   │               │   ├── BserDeserializer.java
│   │   │               │   └── BserSerializer.java
│   │   │               ├── environment/
│   │   │               │   ├── ExecutableFinder.java
│   │   │               │   └── FileFinder.java
│   │   │               ├── unixsocket/
│   │   │               │   ├── ReferenceCountedFileDescriptor.java
│   │   │               │   ├── UnixDomainSocket.java
│   │   │               │   └── UnixDomainSocketLibrary.java
│   │   │               └── windowspipe/
│   │   │                   ├── WindowsNamedPipe.java
│   │   │                   └── WindowsNamedPipeLibrary.java
│   │   ├── test/
│   │   │   └── com/
│   │   │       └── facebook/
│   │   │           └── watchman/
│   │   │               ├── CapabilitiesTest.java
│   │   │               ├── WatchmanClientTest.java
│   │   │               ├── WatchmanConnectionTest.java
│   │   │               ├── WatchmanTestBase.java
│   │   │               ├── bser/
│   │   │               │   ├── BserDeserializerTest.java
│   │   │               │   └── BserSerializerTest.java
│   │   │               ├── environment/
│   │   │               │   ├── ExecutableFinderTest.java
│   │   │               │   └── FileFinderTest.java
│   │   │               ├── fakes/
│   │   │               │   └── FakeWatchmanClient.java
│   │   │               └── util/
│   │   │                   └── TemporaryPaths.java
│   │   └── third-party/
│   │       ├── guava/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── hamcrest/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── immutables/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── jna/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── jsr-305/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── junit/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── mockito/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       ├── nuprocess/
│   │       │   ├── BUCK
│   │       │   └── README
│   │       └── objenesis/
│   │           ├── BUCK
│   │           └── README
│   ├── listener-user.cpp
│   ├── listener.cpp
│   ├── listener.h
│   ├── main.cpp
│   ├── node/
│   │   ├── .flowconfig
│   │   ├── README.md
│   │   ├── bser/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── README.md
│   │   │   ├── index.js
│   │   │   ├── package.json
│   │   │   ├── test/
│   │   │   │   └── bser.js
│   │   │   └── test_bser.py
│   │   ├── example.js
│   │   ├── index.js
│   │   └── package.json
│   ├── portability/
│   │   ├── BUCK
│   │   ├── Backtrace.cpp
│   │   ├── Backtrace.h
│   │   ├── GetOpt.h
│   │   ├── PosixSpawn.cpp
│   │   ├── PosixSpawn.h
│   │   ├── WinError.cpp
│   │   └── WinError.h
│   ├── python/
│   │   ├── .gitignore
│   │   ├── CMakeLists.txt
│   │   ├── LICENSE
│   │   ├── MANIFEST.in
│   │   ├── README.md
│   │   ├── bin/
│   │   │   ├── BUCK
│   │   │   ├── watchman-diag
│   │   │   ├── watchman-make
│   │   │   ├── watchman-replicate-subscription
│   │   │   ├── watchman-wait
│   │   │   └── watchman-wait-aio
│   │   ├── publish-pypi.sh
│   │   ├── pyproject.toml
│   │   ├── pywatchman/
│   │   │   ├── BUCK
│   │   │   ├── CMakeLists.txt
│   │   │   ├── __init__.py
│   │   │   ├── bser.c
│   │   │   ├── bser.h
│   │   │   ├── bsermodule.c
│   │   │   ├── capabilities.py
│   │   │   ├── encoding.py
│   │   │   ├── load.py
│   │   │   ├── pybser.py
│   │   │   └── windows.py
│   │   ├── pywatchman_aio/
│   │   │   ├── BUCK
│   │   │   └── __init__.py
│   │   ├── setup.py
│   │   └── tests/
│   │       ├── BUCK
│   │       ├── __init__.py
│   │       └── tests.py
│   ├── query/
│   │   ├── FileResult.cpp
│   │   ├── FileResult.h
│   │   ├── GlobEscaping.cpp
│   │   ├── GlobEscaping.h
│   │   ├── GlobTree.cpp
│   │   ├── GlobTree.h
│   │   ├── LocalFileResult.cpp
│   │   ├── LocalFileResult.h
│   │   ├── Query.cpp
│   │   ├── Query.h
│   │   ├── QueryContext.cpp
│   │   ├── QueryContext.h
│   │   ├── QueryExpr.h
│   │   ├── QueryResult.cpp
│   │   ├── QueryResult.h
│   │   ├── TermRegistry.cpp
│   │   ├── TermRegistry.h
│   │   ├── base.cpp
│   │   ├── dirname.cpp
│   │   ├── empty.cpp
│   │   ├── eval.cpp
│   │   ├── eval.h
│   │   ├── fieldlist.cpp
│   │   ├── glob.cpp
│   │   ├── intcompare.cpp
│   │   ├── intcompare.h
│   │   ├── match.cpp
│   │   ├── name.cpp
│   │   ├── parse.cpp
│   │   ├── parse.h
│   │   ├── pcre.cpp
│   │   ├── since.cpp
│   │   ├── suffix.cpp
│   │   └── type.cpp
│   ├── root/
│   │   ├── Root.h
│   │   ├── ageout.cpp
│   │   ├── dir.cpp
│   │   ├── file.cpp
│   │   ├── init.cpp
│   │   ├── iothread.cpp
│   │   ├── notifythread.cpp
│   │   ├── reap.cpp
│   │   ├── resolve.cpp
│   │   ├── resolve.h
│   │   ├── sync.cpp
│   │   ├── test/
│   │   │   ├── BUCK
│   │   │   └── RootTest.cpp
│   │   ├── threading.cpp
│   │   ├── warnerr.cpp
│   │   ├── warnerr.h
│   │   ├── watchlist.cpp
│   │   └── watchlist.h
│   ├── ruby/
│   │   └── ruby-watchman/
│   │       ├── .gitignore
│   │       ├── .rspec
│   │       ├── Gemfile
│   │       ├── LICENSE.txt
│   │       ├── README.md
│   │       ├── Rakefile
│   │       ├── ext/
│   │       │   └── ruby-watchman/
│   │       │       ├── depend
│   │       │       ├── extconf.rb
│   │       │       └── watchman.c
│   │       ├── lib/
│   │       │   ├── ruby-watchman/
│   │       │   │   └── version.rb
│   │       │   └── ruby-watchman.rb
│   │       ├── ruby-watchman.gemspec
│   │       └── spec/
│   │           ├── ruby_watchman_spec.rb
│   │           └── spec_helper.rb
│   ├── runtests.py
│   ├── rust/
│   │   ├── .gitignore
│   │   ├── serde_bser/
│   │   │   ├── BUCK
│   │   │   ├── Cargo.toml
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   └── src/
│   │   │       ├── bytestring.rs
│   │   │       ├── de/
│   │   │       │   ├── bunser.rs
│   │   │       │   ├── map.rs
│   │   │       │   ├── mod.rs
│   │   │       │   ├── read.rs
│   │   │       │   ├── reentrant.rs
│   │   │       │   ├── seq.rs
│   │   │       │   ├── template.rs
│   │   │       │   ├── test.rs
│   │   │       │   └── variant.rs
│   │   │       ├── errors.rs
│   │   │       ├── header.rs
│   │   │       ├── lib.rs
│   │   │       ├── ser/
│   │   │       │   ├── count_write.rs
│   │   │       │   ├── mod.rs
│   │   │       │   └── test.rs
│   │   │       └── value.rs
│   │   └── watchman_client/
│   │       ├── BUCK
│   │       ├── Cargo.toml
│   │       ├── LICENSE
│   │       ├── examples/
│   │       │   ├── glob.rs
│   │       │   ├── since.rs
│   │       │   ├── state.rs
│   │       │   ├── subscribe.rs
│   │       │   └── trigger.rs
│   │       └── src/
│   │           ├── expr.rs
│   │           ├── fields.rs
│   │           ├── lib.rs
│   │           ├── named_pipe.rs
│   │           └── pdu.rs
│   ├── saved_state/
│   │   ├── BUCK
│   │   ├── LocalSavedStateInterface.cpp
│   │   ├── LocalSavedStateInterface.h
│   │   ├── SavedStateFactory.cpp
│   │   ├── SavedStateFactory.h
│   │   ├── SavedStateInterface.cpp
│   │   └── SavedStateInterface.h
│   ├── scm/
│   │   ├── Git.cpp
│   │   ├── Git.h
│   │   ├── Mercurial.cpp
│   │   ├── Mercurial.h
│   │   ├── SCM.cpp
│   │   └── SCM.h
│   ├── sockname.cpp
│   ├── sockname.h
│   ├── state.cpp
│   ├── state.h
│   ├── stream.cpp
│   ├── stream_stdout.cpp
│   ├── stream_unix.cpp
│   ├── stream_win.cpp
│   ├── string.cpp
│   ├── telemetry/
│   │   ├── BUCK
│   │   ├── LogEvent.cpp
│   │   ├── LogEvent.h
│   │   ├── WatchmanStats.cpp
│   │   ├── WatchmanStats.h
│   │   ├── WatchmanStructuredLogger.cpp
│   │   └── WatchmanStructuredLogger.h
│   ├── test/
│   │   ├── ArtTest.cpp
│   │   ├── BUCK
│   │   ├── BserTest.cpp
│   │   ├── CacheTest.cpp
│   │   ├── ChildProcTest.cpp
│   │   ├── FSDetectTest.cpp
│   │   ├── FailsToStartViewTest.cpp
│   │   ├── GlobUpperBoundTest.cpp
│   │   ├── IgnoreTest.cpp
│   │   ├── InMemoryViewTest.cpp
│   │   ├── JsonBenchmark.cpp
│   │   ├── JsonTest.cpp
│   │   ├── LocalSavedStateInterfaceTest.cpp
│   │   ├── LogTest.cpp
│   │   ├── MapUtilTest.cpp
│   │   ├── MercurialTest.cpp
│   │   ├── PathUtilsTest.cpp
│   │   ├── PendingCollectionTest.cpp
│   │   ├── PerfSampleTest.cpp
│   │   ├── ResultTest.cpp
│   │   ├── ReturnOnlyFilesTest.cpp
│   │   ├── RingBufferTest.cpp
│   │   ├── SerdeTest.cpp
│   │   ├── StringTest.cpp
│   │   ├── SuffixQueryTest.cpp
│   │   ├── WatcherSelectionDarwinTest.cpp
│   │   ├── WildmatchTest.cpp
│   │   ├── WildmatchTest.json
│   │   ├── async/
│   │   │   ├── AsyncWatchmanTestCase.py
│   │   │   ├── test_dead_socket.py
│   │   │   └── test_subscribe_async.py
│   │   ├── facebook/
│   │   │   └── BUCK
│   │   ├── lib/
│   │   │   ├── BUCK
│   │   │   ├── FakeFileSystem.cpp
│   │   │   ├── FakeFileSystem.h
│   │   │   ├── FakeFileSystemTest.cpp
│   │   │   ├── FakeWatcher.cpp
│   │   │   └── FakeWatcher.h
│   │   └── run.sh
│   ├── thirdparty/
│   │   ├── deelevate_binding/
│   │   │   ├── .gitignore
│   │   │   ├── BUCK
│   │   │   ├── CMakeLists.txt
│   │   │   ├── Cargo.toml
│   │   │   ├── include/
│   │   │   │   └── deelevate.h
│   │   │   └── src/
│   │   │       └── lib.rs
│   │   ├── getopt/
│   │   │   ├── BUCK
│   │   │   ├── GetOpt.cpp
│   │   │   └── GetOpt.h
│   │   ├── jansson/
│   │   │   ├── BUCK
│   │   │   ├── dump.cpp
│   │   │   ├── error.cpp
│   │   │   ├── jansson.h
│   │   │   ├── jansson_private.h
│   │   │   ├── load.cpp
│   │   │   ├── strconv.cpp
│   │   │   ├── utf.cpp
│   │   │   ├── utf.h
│   │   │   └── value.cpp
│   │   ├── libart/
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── src/
│   │   │   │   ├── BUCK
│   │   │   │   ├── art-inl.h
│   │   │   │   └── art.h
│   │   │   └── tests/
│   │   │       ├── runner.c
│   │   │       ├── uuid.txt
│   │   │       └── words.txt
│   │   └── wildmatch/
│   │       ├── .dir-locals.el
│   │       ├── BUCK
│   │       ├── wildmatch.c
│   │       └── wildmatch.h
│   ├── watcher/
│   │   ├── Watcher.cpp
│   │   ├── Watcher.h
│   │   ├── WatcherRegistry.cpp
│   │   ├── WatcherRegistry.h
│   │   ├── eden.cpp
│   │   ├── fsevents.cpp
│   │   ├── fsevents.h
│   │   ├── inotify.cpp
│   │   ├── kqueue.cpp
│   │   ├── kqueue.h
│   │   ├── kqueue_and_fsevents.cpp
│   │   ├── portfs.cpp
│   │   └── win32.cpp
│   ├── watchman_cmd.h
│   ├── watchman_dir.h
│   ├── watchman_file.h
│   ├── watchman_preprocessor.h
│   ├── watchman_stream.h
│   ├── watchman_string.h
│   ├── watchman_system.h
│   ├── watchman_time.h
│   └── winbuild/
│       ├── BUCK
│       └── susres.cpp
└── website/
    ├── .eslintrc.js
    ├── .gitignore
    ├── .npmrc
    ├── .prettierignore
    ├── .prettierrc
    ├── .stylelintrc.js
    ├── README.md
    ├── babel.config.js
    ├── docs/
    │   ├── bser.md
    │   ├── capabilities.md
    │   ├── casefolding.md
    │   ├── cli-options.md
    │   ├── clockspec.md
    │   ├── cmd/
    │   │   ├── _category_.json
    │   │   ├── clock.md
    │   │   ├── find.md
    │   │   ├── flush-subscriptions.md
    │   │   ├── get-config.md
    │   │   ├── get-sockname.md
    │   │   ├── list-capabilities.md
    │   │   ├── log-level.md
    │   │   ├── log.md
    │   │   ├── query.md
    │   │   ├── shutdown-server.md
    │   │   ├── since.md
    │   │   ├── state-enter.md
    │   │   ├── state-leave.md
    │   │   ├── subscribe.md
    │   │   ├── trigger-del.md
    │   │   ├── trigger-list.md
    │   │   ├── trigger.md
    │   │   ├── unsubscribe.md
    │   │   ├── version.md
    │   │   ├── watch-del-all.md
    │   │   ├── watch-del.md
    │   │   ├── watch-list.md
    │   │   ├── watch-project.md
    │   │   └── watch.md
    │   ├── compatibility.md
    │   ├── config.md
    │   ├── contributing.md
    │   ├── cookies.md
    │   ├── cppclient.md
    │   ├── expr/
    │   │   ├── _category_.json
    │   │   ├── allof.md
    │   │   ├── anyof.md
    │   │   ├── dirname.md
    │   │   ├── empty.md
    │   │   ├── exists.md
    │   │   ├── false.md
    │   │   ├── match.md
    │   │   ├── name.md
    │   │   ├── not.md
    │   │   ├── pcre.md
    │   │   ├── since.md
    │   │   ├── size.md
    │   │   ├── suffix.md
    │   │   ├── true.md
    │   │   └── type.md
    │   ├── file-query.md
    │   ├── install.md
    │   ├── nodejs.md
    │   ├── release-notes.md
    │   ├── scm-query.md
    │   ├── simple-query.md
    │   ├── socket-interface.md
    │   ├── troubleshooting.md
    │   ├── watchman-make.md
    │   ├── watchman-replicate-subscription.md
    │   └── watchman-wait.md
    ├── docusaurus.config.js
    ├── package.json
    ├── sidebars.js
    ├── src/
    │   ├── css/
    │   │   └── custom.css
    │   └── pages/
    │       ├── index.js
    │       ├── index.module.css
    │       ├── styles.module.css
    │       └── support.md
    └── static/
        └── .nojekyll
Download .txt
Showing preview only (326K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3953 symbols across 469 files)

FILE: .github/workflows/generate-release-yml.rs
  type Pattern (line 26) | type Pattern = Box<dyn Fn(&str, &str) -> String + 'static>;
  function parse_pattern (line 28) | fn parse_pattern(pattern: &String) -> Option<(Pattern, Vec<&'static str>...
  function substitute_value (line 45) | fn substitute_value(pattern: &Pattern, value: &Yaml, substitution: &str)...
  function expand_value (line 67) | fn expand_value(value: &Yaml) -> Yaml {
  function main (line 96) | fn main() -> anyhow::Result<()> {

FILE: build/fbcode_builder/CMake/fb_py_test_main.py
  class get_cpu_instr_counter (line 42) | class get_cpu_instr_counter:
    method read (line 43) | def read(self):
  class TestStatus (line 52) | class TestStatus:
  class PathMatcher (line 62) | class PathMatcher:
    method __init__ (line 63) | def __init__(self, include_patterns, omit_patterns):
    method omit (line 67) | def omit(self, path):
    method include (line 78) | def include(self, path):
  class DebugWipeFinder (line 82) | class DebugWipeFinder(PathFinder):
    method __init__ (line 88) | def __init__(self, matcher):
    method find_spec (line 91) | def find_spec(self, fullname, path=None, target=None):
  function optimize_for_coverage (line 128) | def optimize_for_coverage(cov, include_patterns, omit_patterns):
  class TeeStream (line 138) | class TeeStream:
    method __init__ (line 139) | def __init__(self, *streams):
    method write (line 142) | def write(self, data):
    method flush (line 146) | def flush(self):
    method isatty (line 150) | def isatty(self):
  class CallbackStream (line 154) | class CallbackStream:
    method __init__ (line 155) | def __init__(self, callback, bytes_callback=None, orig=None):
    method write (line 170) | def write(self, data):
    method flush (line 173) | def flush(self):
    method isatty (line 176) | def isatty(self):
    method fileno (line 179) | def fileno(self):
  class BuckTestResult (line 183) | class BuckTestResult(unittest.TextTestResult):
    method __init__ (line 191) | def __init__(
    method getResults (line 203) | def getResults(self):
    method startTest (line 206) | def startTest(self, test):
    method _find_next_test (line 227) | def _find_next_test(self, suite):
    method stopTest (line 245) | def stopTest(self, test):
    method stopTestRun (line 282) | def stopTestRun(self):
    method _withTest (line 288) | def _withTest(self, test):
    method _setStatus (line 293) | def _setStatus(self, test, status, message=None, stacktrace=None):
    method setStatus (line 302) | def setStatus(self, test, status, message=None, stacktrace=None):
    method setException (line 314) | def setException(self, test, status, excinfo):
    method addSuccess (line 323) | def addSuccess(self, test):
    method addError (line 327) | def addError(self, test, err):
    method addFailure (line 331) | def addFailure(self, test, err):
    method addSkip (line 335) | def addSkip(self, test, reason):
    method addExpectedFailure (line 339) | def addExpectedFailure(self, test, err):
    method addUnexpectedSuccess (line 343) | def addUnexpectedSuccess(self, test):
    method addStdout (line 347) | def addStdout(self, val):
    method addStdoutBytes (line 353) | def addStdoutBytes(self, val):
    method addStderr (line 357) | def addStderr(self, val):
    method addStderrBytes (line 363) | def addStderrBytes(self, val):
  class BuckTestRunner (line 368) | class BuckTestRunner(unittest.TextTestRunner):
    method __init__ (line 369) | def __init__(self, main_program, suite, show_output=True, **kwargs):
    method _makeResult (line 375) | def _makeResult(self):
  function _format_test_name (line 386) | def _format_test_name(test_class, attrname):
  class StderrLogHandler (line 390) | class StderrLogHandler(logging.StreamHandler):
    method __init__ (line 401) | def __init__(self):
    method stream (line 405) | def stream(self):
  class RegexTestLoader (line 409) | class RegexTestLoader(unittest.TestLoader):
    method __init__ (line 410) | def __init__(self, regex=None):
    method getTestCaseNames (line 414) | def getTestCaseNames(self, testCaseClass):
  class Loader (line 431) | class Loader:
    method __init__ (line 435) | def __init__(self, modules, regex=None):
    method load_all (line 439) | def load_all(self):
    method load_args (line 449) | def load_args(self, args):
  class MainProgram (line 486) | class MainProgram:
    method __init__ (line 495) | def __init__(self, argv):
    method init_option_parser (line 500) | def init_option_parser(self):
    method parse_options (line 580) | def parse_options(self, argv):
    method setup_logging (line 592) | def setup_logging(self):
    method create_loader (line 629) | def create_loader(self):
    method load_tests (line 634) | def load_tests(self):
    method get_tests (line 651) | def get_tests(self, test_suite):
    method run (line 662) | def run(self):
    method run_tests (line 680) | def run_tests(self, test_suite):
    method get_abbr_impl (line 704) | def get_abbr_impl(self):
    method start_coverage (line 718) | def start_coverage(self):
    method get_coverage (line 743) | def get_coverage(self):
    method convert_to_diff_cov_str (line 780) | def convert_to_diff_cov_str(self, analysis):
  function main (line 800) | def main(argv):

FILE: build/fbcode_builder/CMake/fb_py_win_main.c
  function locate_py_main (line 13) | int locate_py_main(int argc, wchar_t** argv) {
  function wmain (line 47) | int wmain() {

FILE: build/fbcode_builder/CMake/make_fbpy_archive.py
  class UsageError (line 19) | class UsageError(Exception):
    method __init__ (line 20) | def __init__(self, message):
    method __str__ (line 23) | def __str__(self):
  class BadManifestError (line 27) | class BadManifestError(UsageError):
    method __init__ (line 28) | def __init__(self, path, line_num, message):
  function parse_manifest (line 41) | def parse_manifest(manifest, path_map):
  function populate_install_tree (line 93) | def populate_install_tree(inst_dir, path_map):
  function build_pex (line 127) | def build_pex(args, path_map):
  function build_zipapp (line 157) | def build_zipapp(args, path_map):
  function create_main_module (line 177) | def create_main_module(args, inst_dir, path_map):
  function build_install_dir (line 198) | def build_install_dir(args, path_map):
  function ensure_directory (line 213) | def ensure_directory(path):
  function install_library (line 221) | def install_library(args, path_map):
  function parse_manifests (line 242) | def parse_manifests(args):
  function check_main_module (line 258) | def check_main_module(args, path_map):
  function main (line 303) | def main():

FILE: build/fbcode_builder/getdeps.py
  class UsageError (line 46) | class UsageError(Exception):
  class ValidateManifest (line 60) | class ValidateManifest(SubCmd):
    method run (line 61) | def run(self, args):
    method setup_parser (line 70) | def setup_parser(self, parser):
  class ShowHostType (line 75) | class ShowHostType(SubCmd):
    method run (line 76) | def run(self, args):
  class ProjectCmdBase (line 82) | class ProjectCmdBase(SubCmd):
    method run (line 83) | def run(self, args):
    method process_project_dir_arguments (line 120) | def process_project_dir_arguments(self, args, loader):
    method setup_parser (line 161) | def setup_parser(self, parser):
    method setup_project_cmd_parser (line 220) | def setup_project_cmd_parser(self, parser):
    method create_builder (line 223) | def create_builder(self, loader, manifest):
    method check_built (line 239) | def check_built(self, loader, manifest):
  class CachedProject (line 246) | class CachedProject:
    method __init__ (line 250) | def __init__(self, cache, loader, m):
    method is_cacheable (line 269) | def is_cacheable(self):
    method was_cached (line 273) | def was_cached(self):
    method download (line 277) | def download(self):
    method upload (line 302) | def upload(self):
  class FetchCmd (line 322) | class FetchCmd(ProjectCmdBase):
    method setup_project_cmd_parser (line 323) | def setup_project_cmd_parser(self, parser):
    method run_project_cmd (line 338) | def run_project_cmd(self, args, loader, manifest):
  class InstallSysDepsCmd (line 371) | class InstallSysDepsCmd(ProjectCmdBase):
    method setup_project_cmd_parser (line 372) | def setup_project_cmd_parser(self, parser):
    method run_project_cmd (line 409) | def run_project_cmd(self, args, loader, manifest):
  class ListDepsCmd (line 491) | class ListDepsCmd(ProjectCmdBase):
    method run_project_cmd (line 492) | def run_project_cmd(self, args, loader, manifest):
    method setup_project_cmd_parser (line 497) | def setup_project_cmd_parser(self, parser):
  function clean_dirs (line 507) | def clean_dirs(opts):
  class CleanCmd (line 516) | class CleanCmd(SubCmd):
    method run (line 517) | def run(self, args):
  class ShowScratchDirCmd (line 523) | class ShowScratchDirCmd(SubCmd):
    method run (line 524) | def run(self, args):
  class ShowBuildDirCmd (line 530) | class ShowBuildDirCmd(ProjectCmdBase):
    method run_project_cmd (line 531) | def run_project_cmd(self, args, loader, manifest):
    method setup_project_cmd_parser (line 541) | def setup_project_cmd_parser(self, parser):
  class ShowInstDirCmd (line 551) | class ShowInstDirCmd(ProjectCmdBase):
    method run_project_cmd (line 552) | def run_project_cmd(self, args, loader, manifest):
    method setup_project_cmd_parser (line 568) | def setup_project_cmd_parser(self, parser):
  class QueryPathsCmd (line 578) | class QueryPathsCmd(ProjectCmdBase):
    method run_project_cmd (line 579) | def run_project_cmd(self, args, loader, manifest):
    method setup_project_cmd_parser (line 600) | def setup_project_cmd_parser(self, parser):
  class ShowSourceDirCmd (line 610) | class ShowSourceDirCmd(ProjectCmdBase):
    method run_project_cmd (line 611) | def run_project_cmd(self, args, loader, manifest):
    method setup_project_cmd_parser (line 621) | def setup_project_cmd_parser(self, parser):
  class BuildCmd (line 631) | class BuildCmd(ProjectCmdBase):
    method run_project_cmd (line 632) | def run_project_cmd(self, args, loader, manifest):
    method compute_dep_change_status (line 757) | def compute_dep_change_status(self, m, built_marker, loader):
    method compute_source_change_status (line 793) | def compute_source_change_status(
    method setup_project_cmd_parser (line 834) | def setup_project_cmd_parser(self, parser):
  class FixupDeps (line 897) | class FixupDeps(ProjectCmdBase):
    method run_project_cmd (line 898) | def run_project_cmd(self, args, loader, manifest):
    method setup_project_cmd_parser (line 924) | def setup_project_cmd_parser(self, parser):
  class TestCmd (line 938) | class TestCmd(ProjectCmdBase):
    method run_project_cmd (line 939) | def run_project_cmd(self, args, loader, manifest):
    method setup_project_cmd_parser (line 953) | def setup_project_cmd_parser(self, parser):
  class DebugCmd (line 982) | class DebugCmd(ProjectCmdBase):
    method run_project_cmd (line 983) | def run_project_cmd(self, args, loader, manifest):
  class EnvCmd (line 991) | class EnvCmd(ProjectCmdBase):
    method setup_project_cmd_parser (line 992) | def setup_project_cmd_parser(self, parser):
    method run_project_cmd (line 1002) | def run_project_cmd(self, args, loader, manifest):
  class GenerateGitHubActionsCmd (line 1009) | class GenerateGitHubActionsCmd(ProjectCmdBase):
    method run_project_cmd (line 1021) | def run_project_cmd(self, args, loader, manifest):
    method get_run_on (line 1033) | def get_run_on(self, args):
    method write_job_for_platform (line 1066) | def write_job_for_platform(self, platform, args):  # noqa: C901
    method setup_project_cmd_parser (line 1415) | def setup_project_cmd_parser(self, parser):
  function get_arg_var_name (line 1486) | def get_arg_var_name(args):
  function parse_args (line 1494) | def parse_args():
  function main (line 1627) | def main():

FILE: build/fbcode_builder/getdeps/builder.py
  class BuilderBase (line 38) | class BuilderBase:
    method __init__ (line 39) | def __init__(
    method _get_cmd_prefix (line 79) | def _get_cmd_prefix(self) -> list[str]:
    method _check_cmd (line 101) | def _check_cmd(self, cmd: list[str], **kwargs: object) -> None:
    method _run_cmd (line 110) | def _run_cmd(
    method _reconfigure (line 143) | def _reconfigure(self, reconfigure: bool) -> bool:
    method _apply_patchfile (line 150) | def _apply_patchfile(self) -> None:
    method prepare (line 185) | def prepare(self, reconfigure: bool) -> None:
    method debug (line 191) | def debug(self, reconfigure: bool) -> None:
    method printenv (line 201) | def printenv(self, reconfigure: bool) -> None:
    method build (line 224) | def build(self, reconfigure: bool) -> None:
    method _job_weight_mib (line 254) | def _job_weight_mib(self) -> int:
    method num_jobs (line 273) | def num_jobs(self) -> int:
    method memory_limit_preexec_fn (line 277) | def memory_limit_preexec_fn(self) -> Callable[[], None] | None:
    method run_tests (line 285) | def run_tests(
    method _prepare (line 299) | def _prepare(self, reconfigure: bool) -> None:
    method _build (line 305) | def _build(self, reconfigure: bool) -> None:
    method _compute_env (line 312) | def _compute_env(self, env: Env | None = None) -> Env:
    method get_dev_run_script_path (line 325) | def get_dev_run_script_path(self) -> str:
    method get_dev_run_extra_path_dirs (line 329) | def get_dev_run_extra_path_dirs(
  class MakeBuilder (line 341) | class MakeBuilder(BuilderBase):
    method __init__ (line 342) | def __init__(
    method _make_binary (line 371) | def _make_binary(self) -> str | None:
    method _get_prefix (line 374) | def _get_prefix(self) -> list[str]:
    method _build (line 377) | def _build(self, reconfigure: bool) -> None:
    method run_tests (line 406) | def run_tests(
  class CMakeBootStrapBuilder (line 447) | class CMakeBootStrapBuilder(MakeBuilder):
    method _build (line 448) | def _build(self, reconfigure: bool) -> None:
  class AutoconfBuilder (line 459) | class AutoconfBuilder(BuilderBase):
    method __init__ (line 460) | def __init__(
    method _make_binary (line 493) | def _make_binary(self) -> str | None:
    method _build (line 496) | def _build(self, reconfigure: bool) -> None:
  class Iproute2Builder (line 540) | class Iproute2Builder(BuilderBase):
    method __init__ (line 545) | def __init__(
    method _build (line 567) | def _build(self, reconfigure: bool) -> None:
  class MesonBuilder (line 585) | class MesonBuilder(BuilderBase):
    method __init__ (line 588) | def __init__(
    method _build (line 610) | def _build(self, reconfigure: bool) -> None:
  class CMakeBuilder (line 644) | class CMakeBuilder(BuilderBase):
    method __init__ (line 757) | def __init__(
    method _invalidate_cache (line 801) | def _invalidate_cache(self) -> None:
    method _needs_reconfigure (line 813) | def _needs_reconfigure(self) -> bool:
    method _write_build_script (line 820) | def _write_build_script(self, **kwargs: object) -> None:
    method _compute_cmake_define_args (line 856) | def _compute_cmake_define_args(self, env: Env) -> list[str]:
    method _run_include_rewriter (line 924) | def _run_include_rewriter(self) -> None:
    method _build (line 941) | def _build(self, reconfigure: bool) -> None:
    method _build_targets (line 1005) | def _build_targets(self, targets: Sequence[str]) -> None:
    method _get_missing_test_executables (line 1044) | def _get_missing_test_executables(
    method run_tests (line 1082) | def run_tests(
  class NinjaBootstrap (line 1345) | class NinjaBootstrap(BuilderBase):
    method __init__ (line 1346) | def __init__(
    method _build (line 1368) | def _build(self, reconfigure: bool) -> None:
  class OpenSSLBuilder (line 1381) | class OpenSSLBuilder(BuilderBase):
    method __init__ (line 1382) | def __init__(
    method _build (line 1404) | def _build(self, reconfigure: bool) -> None:
  class Boost (line 1469) | class Boost(BuilderBase):
    method __init__ (line 1470) | def __init__(
    method _build (line 1499) | def _build(self, reconfigure: bool) -> None:
  class NopBuilder (line 1554) | class NopBuilder(BuilderBase):
    method __init__ (line 1555) | def __init__(
    method build (line 1569) | def build(self, reconfigure: bool) -> None:
  class SetupPyBuilder (line 1609) | class SetupPyBuilder(BuilderBase):
    method _build (line 1610) | def _build(self, reconfigure: bool) -> None:
    method run_tests (line 1640) | def run_tests(
  class SqliteBuilder (line 1667) | class SqliteBuilder(BuilderBase):
    method __init__ (line 1668) | def __init__(
    method _build (line 1690) | def _build(self, reconfigure: bool) -> None:

FILE: build/fbcode_builder/getdeps/buildopts.py
  function detect_project (line 34) | def detect_project(path: str) -> tuple[str | None, str | None]:
  class BuildOptions (line 53) | class BuildOptions:
    method __init__ (line 54) | def __init__(
    method manifests_dir (line 196) | def manifests_dir(self) -> str:
    method is_darwin (line 199) | def is_darwin(self) -> bool:
    method is_windows (line 202) | def is_windows(self) -> bool:
    method is_arm (line 205) | def is_arm(self) -> bool:
    method get_vcvars_path (line 208) | def get_vcvars_path(self) -> str | None:
    method is_linux (line 211) | def is_linux(self) -> bool:
    method is_freebsd (line 214) | def is_freebsd(self) -> bool:
    method get_num_jobs (line 217) | def get_num_jobs(self, job_weight: int) -> int:
    method get_context_generator (line 228) | def get_context_generator(
    method compute_env_for_install_dirs (line 251) | def compute_env_for_install_dirs(
    method add_homebrew_package_to_env (line 389) | def add_homebrew_package_to_env(self, package: str, env: Env) -> bool:
    method add_prefix_to_env (line 397) | def add_prefix_to_env(
  function list_win32_subst_letters (line 529) | def list_win32_subst_letters() -> dict[str, str]:
  function find_existing_win32_subst_for_path (line 545) | def find_existing_win32_subst_for_path(
  function find_unused_drive_letter (line 556) | def find_unused_drive_letter() -> str | None:
  function map_subst_path (line 580) | def map_subst_path(path: str) -> str:
  function _check_host_type (line 611) | def _check_host_type(args: argparse.Namespace, host_type: HostType | Non...
  function setup_build_options (line 623) | def setup_build_options(

FILE: build/fbcode_builder/getdeps/cache.py
  class ArtifactCache (line 11) | class ArtifactCache:
    method download_to_file (line 17) | def download_to_file(self, name: str, dest_file_name: str) -> bool:
    method upload_from_file (line 28) | def upload_from_file(self, name: str, source_file_name: str) -> None:
  function create_cache (line 38) | def create_cache() -> ArtifactCache | None:

FILE: build/fbcode_builder/getdeps/cargo.py
  class CargoBuilder (line 25) | class CargoBuilder(BuilderBase):
    method __init__ (line 26) | def __init__(
    method run_cargo (line 61) | def run_cargo(
    method build_source_dir (line 80) | def build_source_dir(self) -> str:
    method workspace_dir (line 83) | def workspace_dir(self) -> str:
    method manifest_dir (line 86) | def manifest_dir(self, manifest: str) -> str:
    method recreate_dir (line 89) | def recreate_dir(self, src: str, dst: str) -> None:
    method recreate_linked_dir (line 97) | def recreate_linked_dir(self, src: str, dst: str) -> None:
    method cargo_config_file (line 105) | def cargo_config_file(self) -> str:
    method _create_cargo_config (line 112) | def _create_cargo_config(self) -> dict[str, dict[str, str]]:
    method _prepare (line 178) | def _prepare(self, reconfigure: bool) -> None:
    method _build (line 187) | def _build(self, reconfigure: bool) -> None:
    method run_tests (line 223) | def run_tests(
    method _patchup_workspace (line 256) | def _patchup_workspace(self, dep_to_git: dict[str, dict[str, str]]) ->...
    method _resolve_config (line 325) | def _resolve_config(
    method _resolve_dep_to_git (line 360) | def _resolve_dep_to_git(self) -> dict[str, dict[str, str]]:
    method _resolve_dep_to_crates (line 448) | def _resolve_dep_to_crates(
    method _extract_crates_used (line 492) | def _extract_crates_used(
    method _resolve_crate_to_path (line 521) | def _resolve_crate_to_path(

FILE: build/fbcode_builder/getdeps/copytree.py
  function containing_repo_type (line 23) | def containing_repo_type(path: str) -> tuple[str | None, str | None]:
  function find_eden_root (line 36) | def find_eden_root(dirpath: str) -> str | None:
  function prefetch_dir_if_eden (line 55) | def prefetch_dir_if_eden(dirpath: str) -> None:
  function simple_copytree (line 73) | def simple_copytree(src_dir: str, dest_dir: str, symlinks: bool = False)...
  function _remove_readonly_and_try_again (line 106) | def _remove_readonly_and_try_again(
  function rmtree_more (line 134) | def rmtree_more(path: str) -> None:

FILE: build/fbcode_builder/getdeps/dyndeps.py
  function copyfile (line 29) | def copyfile(src: str, dest: str) -> None:
  class DepBase (line 34) | class DepBase:
    method __init__ (line 35) | def __init__(
    method list_dynamic_deps (line 53) | def list_dynamic_deps(self, objfile: str) -> list[str]:
    method interesting_dep (line 56) | def interesting_dep(self, d: str) -> bool:
    method process_deps (line 64) | def process_deps(
    method find_all_dependencies (line 97) | def find_all_dependencies(self, build_dir: str) -> list[str]:
    method munge_in_place (line 114) | def munge_in_place(self, objfile: str, final_lib_dir: str) -> None:
    method rewrite_dep (line 142) | def rewrite_dep(
    method resolve_loader_path (line 152) | def resolve_loader_path(self, dep: str) -> str | None:
    method list_objs_in_dir (line 163) | def list_objs_in_dir(
    method is_objfile (line 180) | def is_objfile(self, objfile: str) -> bool:
    method strip_debug_info (line 183) | def strip_debug_info(self, objfile: str) -> None:
    method check_call_verbose (line 188) | def check_call_verbose(self, args: list[str]) -> None:
  class WinDeps (line 193) | class WinDeps(DepBase):
    method __init__ (line 194) | def __init__(
    method find_dumpbin (line 204) | def find_dumpbin(self) -> str:
    method list_dynamic_deps (line 239) | def list_dynamic_deps(self, exe: str) -> list[str]:
    method rewrite_dep (line 254) | def rewrite_dep(
    method interesting_dep (line 282) | def interesting_dep(self, d: str) -> bool:
    method is_objfile (line 289) | def is_objfile(self, objfile: str) -> bool:
    method emit_dev_run_script (line 296) | def emit_dev_run_script(self, script_path: str, dep_dirs: list[str]) -...
    method compute_dependency_paths (line 312) | def compute_dependency_paths(self, build_dir: str) -> list[str]:
    method compute_dependency_paths_fast (line 328) | def compute_dependency_paths_fast(self, build_dir: str) -> list[str]:
    method read_custom_dep_dirs (line 344) | def read_custom_dep_dirs(self, build_dir: str) -> set[str]:
    method _get_dev_run_script_contents (line 364) | def _get_dev_run_script_contents(self, path_dirs: list[str]) -> str:
  class ElfDeps (line 382) | class ElfDeps(DepBase):
    method __init__ (line 383) | def __init__(
    method list_dynamic_deps (line 409) | def list_dynamic_deps(self, objfile: str) -> list[str]:
    method rewrite_dep (line 420) | def rewrite_dep(
    method is_objfile (line 436) | def is_objfile(self, objfile: str) -> bool:
    method strip_debug_info (line 444) | def strip_debug_info(self, objfile: str) -> None:
  class MachDeps (line 452) | class MachDeps(DepBase):
    method interesting_dep (line 453) | def interesting_dep(self, d: str) -> bool:
    method is_objfile (line 458) | def is_objfile(self, objfile: str) -> bool:
    method list_dynamic_deps (line 470) | def list_dynamic_deps(self, objfile: str) -> list[str]:
    method rewrite_dep (line 489) | def rewrite_dep(
  function create_dyn_dep_munger (line 514) | def create_dyn_dep_munger(

FILE: build/fbcode_builder/getdeps/envfuncs.py
  class Env (line 16) | class Env:
    method __init__ (line 17) | def __init__(self, src: Mapping[str, str] | None = None) -> None:
    method update (line 24) | def update(self, src: Mapping[str, str]) -> None:
    method copy (line 28) | def copy(self) -> Env:
    method _key (line 31) | def _key(self, key: str) -> str | None:
    method get (line 60) | def get(self, key: str, defval: str | None = None) -> str | None:
    method __getitem__ (line 66) | def __getitem__(self, key: str) -> str:
    method unset (line 72) | def unset(self, key: str) -> None:
    method __delitem__ (line 80) | def __delitem__(self, key: str) -> None:
    method __repr__ (line 83) | def __repr__(self) -> str:
    method set (line 86) | def set(self, key: str, value: str) -> None:
    method __setitem__ (line 107) | def __setitem__(self, key: str, value: str) -> None:
    method __iter__ (line 110) | def __iter__(self) -> Iterator[str]:
    method __len__ (line 113) | def __len__(self) -> int:
    method keys (line 116) | def keys(self) -> KeysView[str]:
    method values (line 119) | def values(self) -> ValuesView[str]:
    method items (line 122) | def items(self) -> ItemsView[str, str]:
  function add_path_entry (line 126) | def add_path_entry(
  function add_flag (line 145) | def add_flag(env: Env, name: str, flag: str, append: bool = True) -> None:
  function tpx_path (line 162) | def tpx_path() -> str:
  function path_search (line 166) | def path_search(
  function _perform_path_search (line 191) | def _perform_path_search(path: str, exename: str) -> str | None:

FILE: build/fbcode_builder/getdeps/errors.py
  class TransientFailure (line 9) | class TransientFailure(Exception):
  class ManifestNotFound (line 17) | class ManifestNotFound(Exception):
    method __init__ (line 18) | def __init__(self, manifest_name: str) -> None:

FILE: build/fbcode_builder/getdeps/expr.py
  function parse_expr (line 15) | def parse_expr(expr_text: str, valid_variables: set[str]) -> ExprNode:
  class ExprNode (line 44) | class ExprNode:
    method eval (line 45) | def eval(self, ctx: dict[str, str | None]) -> bool:
  class TrueExpr (line 49) | class TrueExpr(ExprNode):
    method eval (line 50) | def eval(self, ctx: dict[str, str | None]) -> bool:
    method __str__ (line 53) | def __str__(self) -> str:
  class NotExpr (line 57) | class NotExpr(ExprNode):
    method __init__ (line 58) | def __init__(self, node: ExprNode) -> None:
    method eval (line 61) | def eval(self, ctx: dict[str, str | None]) -> bool:
    method __str__ (line 64) | def __str__(self) -> str:
  class AllExpr (line 68) | class AllExpr(ExprNode):
    method __init__ (line 69) | def __init__(self, nodes: list[ExprNode]) -> None:
    method eval (line 72) | def eval(self, ctx: dict[str, str | None]) -> bool:
    method __str__ (line 78) | def __str__(self) -> str:
  class AnyExpr (line 85) | class AnyExpr(ExprNode):
    method __init__ (line 86) | def __init__(self, nodes: list[ExprNode]) -> None:
    method eval (line 89) | def eval(self, ctx: dict[str, str | None]) -> bool:
    method __str__ (line 95) | def __str__(self) -> str:
  class EqualExpr (line 102) | class EqualExpr(ExprNode):
    method __init__ (line 103) | def __init__(self, key: str, value: str) -> None:
    method eval (line 107) | def eval(self, ctx: dict[str, str | None]) -> bool:
    method __str__ (line 110) | def __str__(self) -> str:
  class Parser (line 114) | class Parser:
    method __init__ (line 115) | def __init__(self, text: str, valid_variables: set[str]) -> None:
    method parse (line 120) | def parse(self) -> ExprNode:
    method top (line 129) | def top(self) -> ExprNode:
    method ident (line 158) | def ident(self) -> str:
    method parse_not (line 164) | def parse_not(self) -> NotExpr:
    method parse_any (line 172) | def parse_any(self) -> AnyExpr:
    method parse_all (line 183) | def parse_all(self) -> AllExpr:

FILE: build/fbcode_builder/getdeps/fetcher.py
  function file_name_is_cmake_file (line 42) | def file_name_is_cmake_file(file_name: str) -> bool:
  class ChangeStatus (line 52) | class ChangeStatus:
    method __init__ (line 65) | def __init__(self, all_changed: bool = False) -> None:
    method record_change (line 76) | def record_change(self, file_name: str) -> None:
    method sources_changed (line 96) | def sources_changed(self) -> bool:
    method build_changed (line 103) | def build_changed(self) -> bool:
  class Fetcher (line 111) | class Fetcher(ABC):
    method update (line 117) | def update(self) -> ChangeStatus:
    method clean (line 126) | def clean(self) -> None:
    method hash (line 132) | def hash(self) -> str:
    method get_src_dir (line 146) | def get_src_dir(self) -> str:
  class LocalDirFetcher (line 152) | class LocalDirFetcher:
    method __init__ (line 159) | def __init__(self, path: str) -> None:
    method update (line 162) | def update(self) -> ChangeStatus:
    method hash (line 165) | def hash(self) -> str:
    method get_src_dir (line 168) | def get_src_dir(self) -> str:
    method clean (line 171) | def clean(self) -> None:
  class SystemPackageFetcher (line 175) | class SystemPackageFetcher:
    method __init__ (line 176) | def __init__(
    method packages_are_installed (line 188) | def packages_are_installed(self) -> bool:
    method update (line 224) | def update(self) -> ChangeStatus:
    method hash (line 228) | def hash(self) -> str:
    method get_src_dir (line 234) | def get_src_dir(self) -> None:
  class PreinstalledNopFetcher (line 238) | class PreinstalledNopFetcher(SystemPackageFetcher):
    method __init__ (line 239) | def __init__(self) -> None:
  class GitFetcher (line 243) | class GitFetcher(Fetcher):
    method __init__ (line 246) | def __init__(
    method _update (line 291) | def _update(self) -> ChangeStatus:
    method update (line 320) | def update(self) -> ChangeStatus:
    method _clone (line 326) | def _clone(self) -> None:
    method clean (line 347) | def clean(self) -> None:
    method hash (line 351) | def hash(self) -> str:
    method get_src_dir (line 354) | def get_src_dir(self) -> str:
  function does_file_need_update (line 358) | def does_file_need_update(
  function copy_if_different (line 392) | def copy_if_different(src_name: str, dest_name: str) -> bool:
  function filter_strip_marker (line 417) | def filter_strip_marker(dest_name: str, marker: str) -> None:
  function list_files_under_dir_newer_than_timestamp (line 442) | def list_files_under_dir_newer_than_timestamp(
  class ShipitPathMap (line 453) | class ShipitPathMap:
    method __init__ (line 454) | def __init__(self) -> None:
    method add_mapping (line 460) | def add_mapping(self, fbsource_dir: str, target_dir: str) -> None:
    method add_exclusion (line 468) | def add_exclusion(self, pattern: str) -> None:
    method _minimize_roots (line 472) | def _minimize_roots(self) -> None:
    method _sort_mapping (line 490) | def _sort_mapping(self) -> None:
    method _map_name (line 493) | def _map_name(self, norm_name: str, dest_root: str) -> str | None:
    method mirror (line 520) | def mirror(self, fbsource_root: str, dest_root: str) -> ChangeStatus:
  class FbsourceRepoData (line 594) | class FbsourceRepoData(NamedTuple):
  function get_fbsource_repo_data (line 602) | def get_fbsource_repo_data(build_options: BuildOptions) -> FbsourceRepoD...
  function is_public_commit (line 636) | def is_public_commit(build_options: BuildOptions) -> bool:  # noqa: C901
  class SimpleShipitTransformerFetcher (line 727) | class SimpleShipitTransformerFetcher(Fetcher):
    method __init__ (line 728) | def __init__(
    method clean (line 741) | def clean(self) -> None:
    method update (line 745) | def update(self) -> ChangeStatus:
    method hash (line 765) | def hash(self) -> str:
    method get_src_dir (line 771) | def get_src_dir(self) -> str:
  class SubFetcher (line 775) | class SubFetcher(Fetcher):
    method __init__ (line 778) | def __init__(self, base: Fetcher, subs: list[tuple[Fetcher, str]]) -> ...
    method update (line 782) | def update(self) -> ChangeStatus:
    method clean (line 794) | def clean(self) -> None:
    method hash (line 799) | def hash(self) -> str:
    method get_src_dir (line 805) | def get_src_dir(self) -> str:
  class ShipitTransformerFetcher (line 809) | class ShipitTransformerFetcher(Fetcher):
    method _shipit_paths (line 811) | def _shipit_paths(cls, build_options: BuildOptions) -> list[str]:
    method __init__ (line 824) | def __init__(
    method update (line 839) | def update(self) -> ChangeStatus:
    method clean (line 845) | def clean(self) -> None:
    method available (line 850) | def available(cls, build_options: BuildOptions) -> bool:
    method run_shipit (line 856) | def run_shipit(self) -> None:
    method hash (line 900) | def hash(self) -> str:
    method get_src_dir (line 904) | def get_src_dir(self) -> str:
  function download_url_to_file_with_progress (line 908) | def download_url_to_file_with_progress(url: str, file_name: str) -> None:
  class ArchiveFetcher (line 1011) | class ArchiveFetcher(Fetcher):
    method __init__ (line 1012) | def __init__(
    method _verify_hash (line 1034) | def _verify_hash(self) -> None:
    method _download_dir (line 1049) | def _download_dir(self) -> str:
    method _download (line 1056) | def _download(self) -> None:
    method clean (line 1074) | def clean(self) -> None:
    method update (line 1078) | def update(self) -> ChangeStatus:
    method hash (line 1148) | def hash(self) -> str:
    method get_src_dir (line 1151) | def get_src_dir(self) -> str:
  function homebrew_package_prefix (line 1155) | def homebrew_package_prefix(package: str) -> str | None:

FILE: build/fbcode_builder/getdeps/include_rewriter.py
  class IncludePathRewriter (line 27) | class IncludePathRewriter:
    method __init__ (line 43) | def __init__(self, mappings: list[tuple[str, str]], verbose: bool = Fa...
    method rewrite_file (line 65) | def rewrite_file(self, file_path: Path, dry_run: bool = False) -> bool:
    method process_directory (line 128) | def process_directory(self, source_dir: Path, dry_run: bool = False) -...
  function rewrite_includes_from_manifest (line 175) | def rewrite_includes_from_manifest(

FILE: build/fbcode_builder/getdeps/load.py
  class Loader (line 26) | class Loader:
    method _list_manifests (line 29) | def _list_manifests(self, build_opts: BuildOptions) -> Iterator[str]:
    method _load_manifest (line 39) | def _load_manifest(self, path: str) -> ManifestParser:
    method load_project (line 42) | def load_project(
    method load_all (line 55) | def load_all(self, build_opts: BuildOptions) -> dict[str, ManifestPars...
  class ResourceLoader (line 69) | class ResourceLoader(Loader):
    method __init__ (line 70) | def __init__(self, namespace: str, manifests_dir: str) -> None:
    method _list_manifests (line 74) | def _list_manifests(self, build_opts: BuildOptions) -> Iterator[str]:
    method _find_manifest (line 89) | def _find_manifest(self, project_name: str) -> str:
    method _load_manifest (line 97) | def _load_manifest(self, path: str) -> ManifestParser:
    method load_project (line 103) | def load_project(
  function patch_loader (line 114) | def patch_loader(namespace: str, manifests_dir: str = "manifests") -> None:
  function load_project (line 119) | def load_project(build_opts: BuildOptions, project_name: str) -> Manifes...
  function load_all_manifests (line 125) | def load_all_manifests(build_opts: BuildOptions) -> dict[str, ManifestPa...
  class ManifestLoader (line 129) | class ManifestLoader:
    method __init__ (line 137) | def __init__(
    method load_manifest (line 155) | def load_manifest(self, name: str) -> ManifestParser:
    method load_all_manifests (line 162) | def load_all_manifests(self) -> dict[str, ManifestParser]:
    method dependencies_of (line 177) | def dependencies_of(self, manifest: ManifestParser) -> list[ManifestPa...
    method manifests_in_dependency_order (line 185) | def manifests_in_dependency_order(
    method set_project_src_dir (line 263) | def set_project_src_dir(self, project_name: str, path: str) -> None:
    method set_project_build_dir (line 266) | def set_project_build_dir(self, project_name: str, path: str) -> None:
    method set_project_install_dir (line 269) | def set_project_install_dir(self, project_name: str, path: str) -> None:
    method set_project_install_prefix (line 272) | def set_project_install_prefix(self, project_name: str, path: str) -> ...
    method create_fetcher (line 275) | def create_fetcher(
    method get_project_hash (line 285) | def get_project_hash(self, manifest: ManifestParser) -> str:
    method _compute_project_hash (line 292) | def _compute_project_hash(self, manifest: ManifestParser) -> str:
    method _get_project_dir_name (line 368) | def _get_project_dir_name(self, manifest: ManifestParser) -> str:
    method get_project_install_dir (line 375) | def get_project_install_dir(self, manifest: ManifestParser) -> str:
    method get_project_build_dir (line 383) | def get_project_build_dir(self, manifest: ManifestParser) -> str:
    method get_project_install_prefix (line 391) | def get_project_install_prefix(self, manifest: ManifestParser) -> str ...
    method get_project_install_dir_respecting_install_prefix (line 394) | def get_project_install_dir_respecting_install_prefix(

FILE: build/fbcode_builder/getdeps/manifest.py
  function parse_conditional_section_name (line 166) | def parse_conditional_section_name(name: str, section_def: str) -> ExprN...
  function validate_allowed_fields (line 171) | def validate_allowed_fields(
  function validate_allow_values (line 192) | def validate_allow_values(
  function validate_section (line 208) | def validate_section(
  class ManifestParser (line 243) | class ManifestParser:
    method __init__ (line 244) | def __init__(self, file_name: str, fp: str | typing.IO[str] | None = N...
    method get (line 299) | def get(
    method get_dependencies (line 327) | def get_dependencies(self, ctx: ManifestContext) -> list[str]:
    method get_section_as_args (line 345) | def get_section_as_args(
    method get_section_as_ordered_pairs (line 377) | def get_section_as_ordered_pairs(
    method get_section_as_dict (line 403) | def get_section_as_dict(
    method update_hash (line 425) | def update_hash(self, hasher: hashlib._Hash, ctx: ManifestContext) -> ...
    method is_first_party_project (line 451) | def is_first_party_project(self) -> bool:
    method get_required_system_packages (line 455) | def get_required_system_packages(
    method _is_satisfied_by_preinstalled_environment (line 466) | def _is_satisfied_by_preinstalled_environment(self, ctx: ManifestConte...
    method get_repo_url (line 483) | def get_repo_url(self, ctx: ManifestContext) -> str | None:
    method _create_fetcher (line 486) | def _create_fetcher(
    method create_fetcher (line 574) | def create_fetcher(
    method get_builder_name (line 594) | def get_builder_name(self, ctx: ManifestContext) -> str:
    method create_builder (line 600) | def create_builder(  # noqa:C901
    method create_prepare_builders (line 817) | def create_prepare_builders(
    method create_cargo_builder (line 844) | def create_cargo_builder(
  class ManifestContext (line 876) | class ManifestContext:
    method __init__ (line 893) | def __init__(self, ctx_dict: dict[str, str | None]) -> None:
    method get (line 897) | def get(self, key: str) -> str | None:
    method set (line 900) | def set(self, key: str, value: str | None) -> None:
    method copy (line 904) | def copy(self) -> ManifestContext:
    method __str__ (line 907) | def __str__(self) -> str:
  class ContextGenerator (line 914) | class ContextGenerator:
    method __init__ (line 920) | def __init__(self, default_ctx: dict[str, str | None]) -> None:
    method set_value_for_project (line 924) | def set_value_for_project(
    method set_value_for_all_projects (line 933) | def set_value_for_all_projects(self, key: str, value: str | None) -> N...
    method get_context (line 938) | def get_context(self, project_name: str) -> ManifestContext:

FILE: build/fbcode_builder/getdeps/platform.py
  function is_windows (line 16) | def is_windows() -> bool:
  function get_linux_type (line 22) | def get_linux_type() -> tuple[str | None, str | None, str | None]:
  function _get_available_ram_linux (line 59) | def _get_available_ram_linux() -> int:
  function _get_available_ram_macos (line 90) | def _get_available_ram_macos() -> int:
  function _get_available_ram_windows (line 117) | def _get_available_ram_windows() -> int:
  function _get_available_ram_freebsd (line 148) | def _get_available_ram_freebsd() -> int:
  function get_available_ram (line 174) | def get_available_ram() -> int:
  function is_current_host_arm (line 192) | def is_current_host_arm() -> bool:
  class HostType (line 201) | class HostType:
    method __init__ (line 202) | def __init__(
    method is_windows (line 242) | def is_windows(self) -> bool:
    method is_arm (line 252) | def is_arm(self) -> bool:
    method is_darwin (line 255) | def is_darwin(self) -> bool:
    method is_linux (line 258) | def is_linux(self) -> bool:
    method is_freebsd (line 261) | def is_freebsd(self) -> bool:
    method as_tuple_string (line 264) | def as_tuple_string(self) -> str:
    method get_package_manager (line 271) | def get_package_manager(self) -> str | None:
    method from_tuple_string (line 287) | def from_tuple_string(s: str) -> HostType:
    method __eq__ (line 291) | def __eq__(self, b: object) -> bool:

FILE: build/fbcode_builder/getdeps/py_wheel_builder.py
  class PythonWheelBuilder (line 99) | class PythonWheelBuilder(BuilderBase):
    method _build (line 109) | def _build(self, reconfigure: bool) -> None:
    method _run_cmake_build (line 178) | def _run_cmake_build(self, reconfigure: bool) -> None:
    method _write_cmakelists (line 195) | def _write_cmakelists(
    method _write_cmake_config_template (line 222) | def _write_cmake_config_template(self) -> None:
    method _add_sources (line 229) | def _add_sources(
    method _parse_wheel_name (line 244) | def _parse_wheel_name(self) -> WheelNameInfo:
    method _read_wheel_metadata (line 281) | def _read_wheel_metadata(self, wheel_name: WheelNameInfo) -> email.mes...
  function _to_cmake_path (line 287) | def _to_cmake_path(path: str) -> str:

FILE: build/fbcode_builder/getdeps/runcmd.py
  class RunCommandError (line 21) | class RunCommandError(Exception):
  function make_memory_limit_preexec_fn (line 25) | def make_memory_limit_preexec_fn(
  function _print_env_diff (line 72) | def _print_env_diff(env: Env, log_fn: Callable[[str], None]) -> None:
  function check_cmd (line 94) | def check_cmd(
  function run_cmd (line 107) | def run_cmd(
  function _run_cmd (line 145) | def _run_cmd(
  function _pipe_output (line 218) | def _pipe_output(p: subprocess.Popen[bytes], log_fn: Callable[[str], Non...
  function _pipe_output (line 244) | def _pipe_output(p: subprocess.Popen[bytes], log_fn: Callable[[str], Non...

FILE: build/fbcode_builder/getdeps/subcmd.py
  class SubCmd (line 14) | class SubCmd:
    method run (line 18) | def run(self, args: argparse.Namespace) -> int:
    method setup_parser (line 22) | def setup_parser(self, parser: argparse.ArgumentParser) -> None:
  function add_subcommands (line 31) | def add_subcommands(
  function cmd (line 49) | def cmd(

FILE: build/fbcode_builder/getdeps/test/expr_test.py
  class ExprTest (line 14) | class ExprTest(unittest.TestCase):
    method test_equal (line 15) | def test_equal(self) -> None:
    method test_not_equal (line 22) | def test_not_equal(self) -> None:
    method test_bad_not (line 28) | def test_bad_not(self) -> None:
    method test_bad_variable (line 33) | def test_bad_variable(self) -> None:
    method test_all (line 38) | def test_all(self) -> None:
    method test_any (line 45) | def test_any(self) -> None:

FILE: build/fbcode_builder/getdeps/test/manifest_test.py
  class ManifestTest (line 16) | class ManifestTest(unittest.TestCase):
    method test_missing_section (line 17) | def test_missing_section(self) -> None:
    method test_missing_name (line 23) | def test_missing_name(self) -> None:
    method test_minimal (line 35) | def test_minimal(self) -> None:
    method test_minimal_with_fbsource_path (line 46) | def test_minimal_with_fbsource_path(self) -> None:
    method test_unknown_field (line 58) | def test_unknown_field(self) -> None:
    method test_invalid_section_name (line 75) | def test_invalid_section_name(self) -> None:
    method test_value_in_dependencies_section (line 90) | def test_value_in_dependencies_section(self) -> None:
    method test_invalid_conditional_section_name (line 110) | def test_invalid_conditional_section_name(self) -> None:
    method test_section_as_args (line 129) | def test_section_as_args(self) -> None:
    method test_section_as_dict (line 169) | def test_section_as_dict(self) -> None:
    method test_parse_common_manifests (line 207) | def test_parse_common_manifests(self) -> None:
    method test_mismatch_name (line 213) | def test_mismatch_name(self) -> None:
    method test_duplicate_manifest (line 226) | def test_duplicate_manifest(self) -> None:
    method assertRaisesRegex (line 235) | def assertRaisesRegex(self, *args, **kwargs):

FILE: build/fbcode_builder/getdeps/test/platform_test.py
  class PlatformTest (line 14) | class PlatformTest(unittest.TestCase):
    method test_create (line 15) | def test_create(self) -> None:
    method test_rendering_of_none (line 23) | def test_rendering_of_none(self) -> None:
    method test_is_methods (line 27) | def test_is_methods(self) -> None:

FILE: build/fbcode_builder/getdeps/test/retry_test.py
  class RetryTest (line 18) | class RetryTest(unittest.TestCase):
    method _get_build_opts (line 19) | def _get_build_opts(self) -> BuildOptions:
    method _get_manifest (line 24) | def _get_manifest(self) -> ManifestParser:
    method _get_archive_fetcher (line 29) | def _get_archive_fetcher(self) -> ArchiveFetcher:
    method test_no_retries (line 41) | def test_no_retries(
    method test_retries (line 77) | def test_retries(
    method test_all_retries (line 124) | def test_all_retries(

FILE: build/fbcode_builder/getdeps/test/scratch_test.py
  class Win32SubstTest (line 14) | class Win32SubstTest(unittest.TestCase):
    method test_no_existing_subst (line 15) | def test_no_existing_subst(self) -> None:
    method test_exact_match_returns_drive_path (line 29) | def test_exact_match_returns_drive_path(self) -> None:
    method test_multiple_exact_matches_returns_arbitrary_drive_path (line 45) | def test_multiple_exact_matches_returns_arbitrary_drive_path(self) -> ...
    method test_drive_letter_is_case_insensitive (line 58) | def test_drive_letter_is_case_insensitive(self) -> None:
    method test_path_components_are_case_insensitive (line 67) | def test_path_components_are_case_insensitive(self) -> None:

FILE: build/fbcode_builder/getdeps/test/strip_marker_test.py
  class ManifestStripMarkerTest (line 17) | class ManifestStripMarkerTest(unittest.TestCase):
    method test_default_strip_marker (line 18) | def test_default_strip_marker(self) -> None:
    method test_custom_strip_marker (line 28) | def test_custom_strip_marker(self) -> None:
  class FilterStripMarkerTest (line 40) | class FilterStripMarkerTest(unittest.TestCase):
    method _write_temp (line 41) | def _write_temp(self, content: str) -> str:
    method _read (line 48) | def _read(self, path: str) -> str:
    method test_single_line_removal (line 52) | def test_single_line_removal(self) -> None:
    method test_block_removal (line 60) | def test_block_removal(self) -> None:
    method test_no_marker_present_no_change (line 76) | def test_no_marker_present_no_change(self) -> None:
    method test_custom_marker_single_line (line 85) | def test_custom_marker_single_line(self) -> None:
    method test_custom_marker_block (line 94) | def test_custom_marker_block(self) -> None:
    method test_custom_marker_ignores_default (line 109) | def test_custom_marker_ignores_default(self) -> None:
    method test_mixed_single_and_block (line 119) | def test_mixed_single_and_block(self) -> None:
    method test_marker_with_regex_metacharacters (line 136) | def test_marker_with_regex_metacharacters(self) -> None:
    method test_binary_file_skipped (line 147) | def test_binary_file_skipped(self) -> None:

FILE: watchman/ChildProcess.cpp
  type watchman (line 17) | namespace watchman {
    function json_args_to_string_vec (line 268) | static std::vector<std::string_view> json_args_to_string_vec(
    function signo (line 422) | int signo

FILE: watchman/ChildProcess.h
  function namespace (line 21) | namespace watchman {

FILE: watchman/Client.cpp
  type watchman (line 28) | namespace watchman {
    function ClientContext (line 204) | ClientContext Client::getClientInfo() const {
    function ClientDebugStatus (line 285) | ClientDebugStatus UserClient::getDebugStatus() const {
  function w_leave_state (line 515) | void w_leave_state(

FILE: watchman/Client.h
  type Query (line 30) | struct Query
  type QueryResult (line 31) | struct QueryResult
  type ClientContext (line 32) | struct ClientContext
  function ClientContext (line 45) | ClientContext getClientInfo() const;
  type PrivateBadge (line 235) | struct PrivateBadge {}

FILE: watchman/ClientContext.h
  function namespace (line 12) | namespace watchman {

FILE: watchman/Clock.cpp
  type timeval (line 21) | struct timeval
  function QuerySince (line 130) | QuerySince ClockSpec::evaluate(
  function clock_id_string (line 198) | bool clock_id_string(
  function w_string (line 218) | w_string ClockPosition::toClockString() const {
  function json_ref (line 226) | json_ref ClockSpec::toJson() const {

FILE: watchman/Clock.h
  function namespace (line 15) | namespace watchman {
  type ClockPosition (line 60) | struct ClockPosition {
  function ClockTicks (line 62) | ClockTicks ticks{0}
  type Timestamp (line 72) | struct Timestamp {
  type Clock (line 76) | struct Clock {
  type NamedCursor (line 82) | struct NamedCursor {

FILE: watchman/Command.cpp
  type watchman (line 16) | namespace watchman {
    function Command (line 23) | Command Command::parse(const json_ref& pdu) {
    function json_ref (line 46) | json_ref Command::render() const {
    function is_pretty (line 118) | bool is_pretty(Pretty pretty, const FileDescriptor& stdOut) {

FILE: watchman/Command.h
  function namespace (line 15) | namespace watchman {

FILE: watchman/CommandRegistry.cpp
  type watchman (line 14) | namespace watchman {
    type CommandRegistry (line 20) | struct CommandRegistry {
      method CommandRegistry (line 23) | CommandRegistry() {
      method CommandRegistry (line 27) | static CommandRegistry& get() {
    function json_ref (line 46) | json_ref UntypedResponse::toJson() && {
    function CommandDefinition (line 79) | const CommandDefinition* CommandDefinition::lookup(std::string_view na...
    function capability_register (line 106) | void capability_register(std::string_view name) {
    function capability_supported (line 110) | bool capability_supported(std::string_view name) {
    function json_ref (line 116) | json_ref capability_get_list() {

FILE: watchman/CommandRegistry.h
  function namespace (line 20) | namespace watchman {
  function printResultRaw (line 213) | static void printResultRaw(const json_ref& result) {

FILE: watchman/Connect.cpp
  function w_stm_connect (line 15) | ResultErrno<std::unique_ptr<Stream>> w_stm_connect(int timeoutms) {

FILE: watchman/Connect.h
  function namespace (line 13) | namespace watchman {

FILE: watchman/Constants.h
  function namespace (line 12) | namespace watchman {

FILE: watchman/ContentHash.cpp
  type watchman (line 27) | namespace watchman {
    function HashValue (line 58) | HashValue ContentHashCache::computeHashImmediate(const char* fullPath) {
    function HashValue (line 141) | HashValue ContentHashCache::computeHashImmediate(
    function w_string (line 167) | const w_string& ContentHashCache::rootPath() const {
    function CacheStats (line 171) | CacheStats ContentHashCache::stats() const {

FILE: watchman/ContentHash.h
  function namespace (line 14) | namespace watchman {
  function namespace (line 29) | namespace std {
  function namespace (line 38) | namespace watchman {

FILE: watchman/Cookie.h
  function namespace (line 13) | namespace watchman {

FILE: watchman/CookieSync.cpp
  type watchman (line 16) | namespace watchman {

FILE: watchman/CookieSync.h
  function namespace (line 15) | namespace watchman {

FILE: watchman/Errors.cpp
  class error_category (line 28) | class error_category
  class inotify_category (line 56) | class inotify_category

FILE: watchman/Errors.h
  type class (line 26) | enum class
  function class (line 40) | class error_category : public std::error_category {
  function std (line 53) | inline std::error_condition make_error_condition(error_code e) {
  function std (line 59) | inline std::error_code make_error_code(error_code e) {
  type windows_error_code (line 72) | enum windows_error_code : uint32_t {}
  function std (line 77) | inline std::error_condition make_error_condition(windows_error_code e) {
  function std (line 84) | inline std::error_code make_error_code(windows_error_code e) {
  function class (line 91) | class inotify_category : public std::error_category {
  type NoPrefix (line 102) | struct NoPrefix {}
  function throwf (line 118) | [[noreturn]] static void throwf(
  function class (line 135) | class CommandValidationError : public WatchmanError<CommandValidationErr...
  function class (line 144) | class QueryParseError : public WatchmanError<QueryParseError> {
  function class (line 153) | class QueryExecError : public WatchmanError<QueryExecError> {
  function class (line 162) | class RootResolveError : public WatchmanError<RootResolveError> {
  function class (line 171) | class RootNotConnectedError : public WatchmanError<RootNotConnectedError> {
  function namespace (line 180) | namespace std {

FILE: watchman/FlagMap.cpp
  function w_expand_flags (line 12) | void w_expand_flags(

FILE: watchman/FlagMap.h
  type flag_map (line 13) | struct flag_map {
  type flag_map (line 25) | struct flag_map

FILE: watchman/GroupLookup.cpp
  type group (line 22) | struct group
  type group (line 26) | struct group

FILE: watchman/GroupLookup.h
  type group (line 19) | struct group

FILE: watchman/Hash.h
  function namespace (line 12) | namespace watchman {

FILE: watchman/IgnoreSet.cpp
  type watchman (line 16) | namespace watchman {

FILE: watchman/IgnoreSet.h
  function namespace (line 15) | namespace watchman {

FILE: watchman/InMemoryView.cpp
  type watchman (line 30) | namespace watchman {
    function make_path_name (line 37) | inline std::string make_path_name(
    type timespec (line 165) | struct timespec
    type timespec (line 169) | struct timespec
    type timespec (line 173) | struct timespec
    function w_string_piece (line 177) | w_string_piece InMemoryFileResult::baseName() {
    function w_string_piece (line 181) | w_string_piece InMemoryFileResult::dirName() {
    function watchman_dir (line 238) | watchman_dir* ViewDatabase::resolveDir(const w_string& dir_name, bool ...
    function watchman_dir (line 309) | const watchman_dir* ViewDatabase::resolveDir(const w_string& dir_name)...
    function watchman_file (line 355) | watchman_file* ViewDatabase::getOrCreateChildFile(
    type watchman_file (line 419) | struct watchman_file
    function json_ref (line 442) | json_ref InMemoryView::PendingChangeLogEntry::asJsonValue() const {
    function ClockStamp (line 493) | ClockStamp InMemoryView::ageOutFile(
    type watchman_file (line 600) | struct watchman_file
    type watchman_dir (line 704) | struct watchman_dir
    type watchman_dir (line 772) | struct watchman_dir
    type watchman_file (line 894) | struct watchman_file
    function ClockPosition (line 909) | ClockPosition InMemoryView::getMostRecentRootNumberAndTickValue() const {
    function w_string (line 913) | w_string InMemoryView::getCurrentClockString() const {
    function ClockTicks (line 922) | ClockTicks InMemoryView::getLastAgeOutTickValue() const {
    function w_string (line 1152) | const w_string& InMemoryView::getName() const {
    function json_ref (line 1160) | json_ref InMemoryView::getWatcherDebugInfo() const {
    function json_ref (line 1172) | json_ref InMemoryView::getViewDebugInfo() const {
    type watchman_file (line 1207) | struct watchman_file

FILE: watchman/InMemoryView.h
  type watchman_file (line 29) | struct watchman_file
  type GlobTree (line 35) | struct GlobTree
  type InMemoryViewCaches (line 39) | struct InMemoryViewCaches {
  function class (line 81) | class ViewDatabase {
  function ClockPosition (line 155) | ClockPosition getMostRecentRootNumberAndTickValue() const override;
  function ClockRoot (line 383) | const ClockRoot rootNumber_{0}
  function ClockTicks (line 386) | ClockTicks lastAgeOutTick_{0}
  function lastWarmedTick_ (line 428) | uint32_t lastWarmedTick_{0}
  type PendingChangeLogEntry (line 430) | struct PendingChangeLogEntry {

FILE: watchman/LRUCache.h
  function namespace (line 18) | namespace watchman {

FILE: watchman/LogConfig.cpp
  type watchman::logging (line 11) | namespace watchman::logging {

FILE: watchman/LogConfig.h
  function namespace (line 12) | namespace watchman::logging {

FILE: watchman/Logging.cpp
  function write_stderr (line 34) | void write_stderr(const String& str) {
  function write_stderr (line 41) | void write_stderr(const String& str, Strings&&... strings) {
  function log_stack_trace (line 47) | static void log_stack_trace() {
  type watchman (line 60) | namespace watchman {
    type levelMaps (line 63) | struct levelMaps {
      method levelMaps (line 69) | levelMaps()
    function levelMaps (line 85) | levelMaps& getLevelMaps() {
      method levelMaps (line 69) | levelMaps()
    function w_string (line 92) | const w_string& logLevelToLabel(LogLevel level) {
    function LogLevel (line 96) | LogLevel logLabelToLevel(const w_string& label) {
    function Log (line 106) | Log& getLog() {
    type tm (line 112) | struct tm
    type timeval (line 127) | struct timeval
    function LONG (line 229) | LONG WINAPI exception_filter(LPEXCEPTION_POINTERS excep) {

FILE: watchman/Logging.h
  function namespace (line 18) | namespace watchman {

FILE: watchman/MapUtil.h
  function namespace (line 10) | namespace watchman {

FILE: watchman/Options.cpp
  type watchman (line 19) | namespace watchman {
    function print_command_list_for_help (line 211) | void print_command_list_for_help(FILE* where) {
    function usage (line 228) | [[noreturn]] void usage(const OptDesc* opts_2, FILE* where) {
    function w_getopt (line 304) | std::vector<std::string>
    function parseOptions (line 444) | std::vector<std::string> parseOptions(int* argcp, char*** argvp) {

FILE: watchman/Options.h
  function namespace (line 14) | namespace watchman {

FILE: watchman/PDU.cpp
  type watchman (line 17) | namespace watchman {
    function PduType (line 76) | inline PduType PduBuffer::detectPdu() {
    function output_bytes (line 328) | static bool output_bytes(const char* buf, int x) {
    type jbuffer_write_data (line 487) | struct jbuffer_write_data {
      method flush (line 491) | bool flush() {
      method write (line 506) | static int write(const char* buffer, size_t size, void* ptr) {
      method write (line 511) | int write(const char* buffer, size_t size) {

FILE: watchman/PDU.h
  function namespace (line 14) | namespace watchman {

FILE: watchman/PathUtils.cpp
  type watchman (line 30) | namespace watchman {
    function verify_dir_ownership (line 32) | void verify_dir_ownership(const std::string& state_dir) {
    function create_state_dir (line 154) | void create_state_dir(const char* state_dir, std::error_code& ec) {
    function create_log_dir (line 186) | void create_log_dir(const char* log_dir, std::error_code& ec) {
    function compute_file_name (line 211) | void compute_file_name(

FILE: watchman/PathUtils.h
  function namespace (line 13) | namespace watchman {

FILE: watchman/PendingCollection.cpp
  type watchman (line 16) | namespace watchman {
    function is_path_prefix (line 26) | bool is_path_prefix(

FILE: watchman/PendingCollection.h
  type watchman_dir (line 18) | struct watchman_dir
  function namespace (line 20) | namespace watchman {

FILE: watchman/PerfSample.cpp
  type watchman (line 24) | namespace watchman {
    class PerfLogThread (line 26) | class PerfLogThread {
      type State (line 27) | struct State {
        method State (line 28) | explicit State(bool start) : running(start) {}
      method PerfLogThread (line 41) | explicit PerfLogThread(bool start) : state_(std::in_place, start) {
      method stop (line 51) | void stop() {
      method addSample (line 63) | void addSample(json_ref&& sample) {
    function PerfLogThread (line 70) | PerfLogThread& getPerfThread(bool start = true) {
      type State (line 27) | struct State {
        method State (line 28) | explicit State(bool start) : running(start) {}
      method PerfLogThread (line 41) | explicit PerfLogThread(bool start) : state_(std::in_place, start) {
      method stop (line 51) | void stop() {
      method addSample (line 63) | void addSample(json_ref&& sample) {
    function processSamples (line 78) | void processSamples(
    function perf_shutdown (line 357) | void perf_shutdown() {

FILE: watchman/PerfSample.h
  type RootMetadata (line 23) | struct RootMetadata {
  function json_ref (line 45) | json_ref meta_data{json_object()};

FILE: watchman/Poison.cpp
  type watchman (line 12) | namespace watchman {
    function set_poison_state (line 16) | void set_poison_state(

FILE: watchman/Poison.h
  function namespace (line 15) | namespace watchman {

FILE: watchman/ProcessLock.cpp
  type watchman (line 19) | namespace watchman {
    function ProcessLock (line 21) | ProcessLock ProcessLock::acquire(const std::string& pid_file) {

FILE: watchman/ProcessLock.h
  function namespace (line 15) | namespace watchman {

FILE: watchman/ProcessUtil.cpp
  type watchman (line 12) | namespace watchman {
    function ProcessInfoCache (line 17) | ProcessInfoCache& getProcessInfoCache() {
    function ProcessInfoHandle (line 23) | ProcessInfoHandle lookupProcessInfo(pid_t pid) {

FILE: watchman/ProcessUtil.h
  function namespace (line 12) | namespace facebook::eden {
  function namespace (line 16) | namespace watchman {

FILE: watchman/PubSub.cpp
  type watchman (line 12) | namespace watchman {
    function getPending (line 95) | void getPending(
    function json_ref (line 181) | json_ref Publisher::getDebugInfo() const {

FILE: watchman/PubSub.h
  function namespace (line 18) | namespace watchman {

FILE: watchman/QueryableView.cpp
  type watchman (line 12) | namespace watchman {
    function ClockTicks (line 38) | ClockTicks QueryableView::getLastAgeOutTickValue() const {

FILE: watchman/QueryableView.h
  function namespace (line 19) | namespace watchman {

FILE: watchman/Result.h
  function namespace (line 15) | namespace watchman {
  function error_type (line 230) | const error_type& error() const& {

FILE: watchman/RingBuffer.h
  function namespace (line 12) | namespace watchman {

FILE: watchman/SanityCheck.cpp
  type watchman (line 20) | namespace watchman {
    function decodeNext (line 24) | std::optional<json_ref>
    function check_my_sock (line 36) | void check_my_sock(watchman_stream* client) {
    function check_clock_command (line 88) | void check_clock_command(watchman_stream* client, const json_ref& root) {
    function json_ref (line 130) | json_ref get_watch_list(watchman_stream* client) {
    function do_clock_check (line 158) | void do_clock_check(watchman_stream* client) {
    function sanityCheckThread (line 195) | void sanityCheckThread() noexcept {
    function startSanityCheckThread (line 232) | void startSanityCheckThread() {

FILE: watchman/SanityCheck.h
  function namespace (line 10) | namespace watchman {

FILE: watchman/Serde.h
  function namespace (line 43) | namespace detail {
  type Object (line 119) | struct Object {}
  function json_ref (line 144) | static json_ref toJson(const T& v) {
  function T (line 155) | static T fromJson(const json_ref& v) {
  function json_ref (line 173) | struct Serde<json_ref> {
  function bool (line 183) | struct Serde<bool> {
  function json_int_t (line 195) | struct Serde<json_int_t> {
  function w_string (line 207) | struct Serde<w_string> {
  function string (line 219) | struct Serde<std::string> {
  function push (line 266) | static size_t push(
  function write (line 287) | static void write(
  function json_ref (line 309) | static json_ref toJson(const Tuple& tuple) {
  function Tuple (line 322) | static Tuple fromJson(const json_ref& j) {
  function json_ref (line 342) | static json_ref toJson(const std::optional<T>& o) {
  function std (line 346) | static std::optional<T> fromJson(const json_ref& j) {
  function throw (line 469) | throw MissingKey{"key is missing"}

FILE: watchman/Shutdown.cpp
  function w_is_stopping (line 20) | bool w_is_stopping() {
  function w_request_shutdown (line 24) | void w_request_shutdown() {
  function w_push_listener_thread_event (line 32) | void w_push_listener_thread_event(std::shared_ptr<watchman_event> event) {

FILE: watchman/Shutdown.h
  function namespace (line 12) | namespace watchman {

FILE: watchman/SignalHandler.cpp
  function crash_handler (line 21) | static void crash_handler(int signo, siginfo_t* si, void*) {
  function terminationHandler (line 142) | [[noreturn]] void terminationHandler() {
  type watchman (line 160) | namespace watchman {
    function setup_signal_handlers (line 162) | void setup_signal_handlers() {

FILE: watchman/SignalHandler.h
  function namespace (line 10) | namespace watchman {

FILE: watchman/SymlinkTargets.cpp
  type watchman (line 13) | namespace watchman {
    function w_string (line 38) | w_string SymlinkTargetCache::readLinkImmediate(
    function w_string (line 52) | const w_string& SymlinkTargetCache::rootPath() const {
    function CacheStats (line 56) | CacheStats SymlinkTargetCache::stats() const {

FILE: watchman/SymlinkTargets.h
  function namespace (line 16) | namespace watchman {
  function namespace (line 29) | namespace std {
  function namespace (line 38) | namespace watchman {

FILE: watchman/ThreadPool.cpp
  type watchman (line 11) | namespace watchman {
    function ThreadPool (line 13) | ThreadPool& getThreadPool() {

FILE: watchman/ThreadPool.h
  function namespace (line 17) | namespace watchman {

FILE: watchman/TriggerCommand.cpp
  type watchman (line 22) | namespace watchman {
    function parse_redirection (line 26) | void parse_redirection(
    function prepare_stdin (line 66) | ResultErrno<std::unique_ptr<watchman_stream>> prepare_stdin(
    function spawn_command (line 144) | void spawn_command(

FILE: watchman/TriggerCommand.h
  function namespace (line 16) | namespace watchman {

FILE: watchman/UserDir.cpp
  type watchman (line 25) | namespace watchman {
    function getWatchmanAppDataPath (line 43) | std::string getWatchmanAppDataPath() {
    function computeTemporaryDirectory (line 77) | std::string computeTemporaryDirectory() {
    function computeUserName (line 91) | std::string computeUserName() {
    function computeHomeDirectory (line 137) | std::string computeHomeDirectory() {
    function computeXDGStateHomeDirectory (line 177) | std::string computeXDGStateHomeDirectory() {
    function computeWatchmanStateDirectory (line 195) | std::string computeWatchmanStateDirectory(const std::string& user) {

FILE: watchman/UserDir.h
  function namespace (line 12) | namespace watchman {

FILE: watchman/WatchmanConfig.cpp
  type ConfigState (line 21) | struct ConfigState {
  function loadSystemConfig (line 27) | std::optional<std::pair<json_ref, w_string>> loadSystemConfig() {
  function loadUserConfig (line 91) | std::optional<json_ref> loadUserConfig() {
  function cfg_shutdown (line 130) | void cfg_shutdown() {
  function w_string (line 135) | w_string cfg_get_global_config_file_path() {
  function cfg_load_global_config_file (line 139) | void cfg_load_global_config_file() {
  function cfg_set_global (line 159) | void cfg_set_global(const char* name, const json_ref& val) {
  function cfg_get_json (line 168) | std::optional<json_ref> cfg_get_json(const char* name) {
  function is_array_of_strings (line 191) | static bool is_array_of_strings(const json_ref& ref) {
  function prepend_watchmanconfig_to_array (line 205) | static void prepend_watchmanconfig_to_array(std::vector<json_ref>& ref) {
  function cfg_compute_root_files (line 227) | std::optional<json_ref> cfg_compute_root_files(bool* enforcing) {
  function cfg_pretty_print_root_files (line 277) | std::string cfg_pretty_print_root_files(const json_ref& root_files) {
  function json_int_t (line 294) | json_int_t cfg_get_int(const char* name, json_int_t defval) {
  function cfg_get_bool (line 307) | bool cfg_get_bool(const char* name, bool defval) {
  function cfg_get_double (line 320) | double cfg_get_double(const char* name, double defval) {
  function mode_t (line 369) | mode_t cfg_get_perms(const char* name, bool write_bits, bool execute_bit...
  type watchman (line 395) | namespace watchman {
    function json_int_t (line 433) | json_int_t Configuration::getInt(const char* name, json_int_t defval) ...

FILE: watchman/WatchmanConfig.h
  function namespace (line 33) | namespace watchman {

FILE: watchman/XattrUtils.cpp
  type watchman (line 18) | namespace watchman {
    type acl_ea_entry (line 66) | struct acl_ea_entry {
    type acl_ea_header (line 72) | struct acl_ea_header {
    function setSecondaryGroupACL (line 79) | bool setSecondaryGroupACL(

FILE: watchman/XattrUtils.h
  function namespace (line 10) | namespace watchman {

FILE: watchman/benchmarks/bser.cpp
  function predictable_bser_data (line 16) | std::vector<char> predictable_bser_data() {
  function w_string (line 54) | w_string random_string(std::mt19937& mt) {
  function clamped_sub (line 75) | inline unsigned clamped_sub(unsigned x, unsigned y) {
  function json_ref (line 79) | json_ref random_array(std::mt19937& mt, unsigned depth) {
  function json_ref (line 91) | json_ref random_object(std::mt19937& mt, unsigned depth) {
  function json_ref (line 103) | json_ref random_value(std::mt19937& mt, unsigned depth = 0) {
  function unpredictable_bser_data (line 136) | std::vector<char> unpredictable_bser_data() {
  type ParseBenchmark (line 170) | struct ParseBenchmark {
    method run (line 173) | static void run(benchmark::State& state) {
  function bser_parse_predictable (line 187) | void bser_parse_predictable(benchmark::State& state) {
  function bser_parse_unpredictable (line 192) | void bser_parse_unpredictable(benchmark::State& state) {
  function main (line 199) | int main(int argc, char** argv) {

FILE: watchman/benchmarks/string.cpp
  function string_allocate_and_deallocate (line 13) | void string_allocate_and_deallocate(benchmark::State& state) {
  function string_hash (line 22) | void string_hash(benchmark::State& state) {
  function string_piece_hash (line 32) | void string_piece_hash(benchmark::State& state) {
  function main (line 44) | int main(int argc, char** argv) {

FILE: watchman/bser.cpp
  function limitedReservation (line 65) | void limitedReservation(T& container, size_t size) {
  function is_bser_version_supported (line 74) | bool is_bser_version_supported(const bser_ctx_t* ctx) {
  function bser_real (line 78) | int bser_real(const bser_ctx_t* ctx, double val, void* data) {
  function bser_int (line 90) | int bser_int(const bser_ctx_t* ctx, json_int_t val, void* data) {
  function bser_generic_string (line 135) | int bser_generic_string(
  function bser_bytestring (line 159) | int bser_bytestring(const bser_ctx_t* ctx, w_string_piece str, void* dat...
  function bser_utf8string (line 163) | int bser_utf8string(const bser_ctx_t* ctx, w_string_piece str, void* dat...
  function bser_mixedstring (line 171) | int bser_mixedstring(const bser_ctx_t* ctx, w_string_piece str, void* da...
  function bser_template (line 184) | int bser_template(
  function bser_array (line 242) | int bser_array(const bser_ctx_t* ctx, const json_ref& array, void* data) {
  function bser_object (line 270) | int bser_object(const bser_ctx_t* ctx, const json_ref& obj, void* data) {
  function w_bser_dump (line 303) | int w_bser_dump(const bser_ctx_t* ctx, const json_ref& json, void* data) {
  function measure (line 344) | int measure(const char*, size_t size, void* ptr) {
  function w_bser_write_pdu (line 352) | int w_bser_write_pdu(
  class BserParser (line 411) | class BserParser {
    method BserParser (line 413) | BserParser(const char* buf, const char* end)
    method json_ref (line 424) | json_ref expectValue() {
    method json_ref (line 428) | json_ref parseValue(char value_type) {
    method expectType (line 486) | char expectType(std::initializer_list<char> types) {
    method json_int_t (line 511) | json_int_t parseInteger() {
    method json_int_t (line 517) | json_int_t parseInteger(char type) {
    method parseReal (line 532) | double parseReal() {
    method json_int_t (line 543) | json_int_t expectInteger() {
    method expectSize (line 548) | size_t expectSize(const char* label) {
    method parseString (line 561) | std::string_view parseString() {
    method expectString (line 566) | std::string_view expectString() {
    method parseArray (line 571) | std::vector<json_ref> parseArray() {
    method expectArray (line 584) | std::vector<json_ref> expectArray() {
    method json_ref (line 589) | json_ref parseTemplate() {
    method json_ref (line 635) | json_ref parseObject() {
    type BumpDepth (line 660) | struct BumpDepth {
      method BumpDepth (line 661) | explicit BumpDepth(size_t& depth) : depth{depth} {
  function bunser_int (line 681) | std::optional<json_int_t>
  function json_ref (line 731) | json_ref bunser(const char* buf, const char* end) {

FILE: watchman/bser.h
  type bser_ctx_t (line 13) | typedef struct bser_ctx {
  function class (line 19) | class BserParseError : public std::exception {
  function class (line 43) | class BserParseTooDeep : public BserParseError {

FILE: watchman/build/package/substcontrol.py
  function main (line 33) | def main():

FILE: watchman/cli/src/audit.rs
  type AuditCmd (line 30) | pub(crate) struct AuditCmd {
    method to_audit_option (line 455) | fn to_audit_option(&self) -> AuditOption {
    method run (line 464) | pub async fn run(&self) -> anyhow::Result<()> {
  function is_cookie (line 66) | fn is_cookie<T: AsRef<Path>>(name: T) -> bool {
  function from_windows_epoch (line 77) | fn from_windows_epoch(epoch: i64) -> i64 {
  type AuditOption (line 82) | pub struct AuditOption {
  method default (line 90) | fn default() -> Self {
  function audit_repo (line 100) | pub async fn audit_repo(

FILE: watchman/cli/src/main.rs
  type MainCommand (line 17) | struct MainCommand {
  type TopLevelSubcommand (line 23) | enum TopLevelSubcommand {
    method run (line 29) | async fn run(&self) -> anyhow::Result<()> {
  function main (line 39) | async fn main() {

FILE: watchman/cli/src/rage/mod.rs
  type RageExpression (line 39) | struct RageExpression {
    method new (line 45) | fn new(expr: Expression, cmd: &'static str) -> Self {
    method config (line 52) | fn config<T: FnOnce(Expression) -> Expression>(mut self, fun: T) -> Se...
    method read (line 57) | fn read(&self) -> String {
  function getuid (line 72) | fn getuid() -> nix::unistd::Uid {
  type WatchmanRage (line 76) | struct WatchmanRage {
    method new (line 81) | async fn new() -> Self {
    method empty_line (line 88) | fn empty_line(&mut self) -> Result<()> {
    method run (line 93) | async fn run(&mut self) -> Result<()> {
    method print_system_info (line 124) | fn print_system_info(&mut self) -> Result<()> {
    method print_package_version (line 149) | fn print_package_version(&mut self) -> Result<()> {
    method print_package_version (line 159) | fn print_package_version(&mut self) -> Result<()> {
    method print_cli_version (line 168) | fn print_cli_version(&mut self) -> Result<()> {
    method print_watchman_env (line 177) | fn print_watchman_env(&mut self) -> Result<()> {
    method print_inotify (line 197) | fn print_inotify(&mut self) -> Result<()> {
    method print_launchd_info (line 256) | fn print_launchd_info(&mut self) -> Result<()> {
    method print_state_info (line 291) | fn print_state_info(&mut self) -> Result<()> {
    method print_running_watchman (line 373) | fn print_running_watchman(&mut self) -> Result<()> {
    method print_watchman_service_info (line 386) | async fn print_watchman_service_info(&mut self) -> Result<()> {
    method check_watchman_config (line 438) | async fn check_watchman_config(&mut self, client: &Client, root: &Reso...
    method collect_watch_info (line 481) | async fn collect_watch_info(&mut self, client: &Client, repo: &Path) -...
    method wait (line 557) | fn wait(self) {
  type RageCmd (line 563) | pub(crate) struct RageCmd {}
    method run (line 566) | pub(crate) async fn run(&self) -> Result<()> {

FILE: watchman/cli/src/rage/stream.rs
  type FbReporter (line 24) | pub struct FbReporter {}
    method new (line 27) | pub fn new(hostname: Option<String>) -> Result<Self> {
    method wait (line 31) | pub fn wait(mut self) {
  method write (line 37) | fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  method flush (line 41) | fn flush(&mut self) -> io::Result<()> {
  type Stream (line 50) | pub enum Stream {
    method new_stdout (line 57) | fn new_stdout() -> Self {
    method new (line 61) | pub fn new(hostname: Option<String>) -> Self {
    method is_redirected (line 72) | pub fn is_redirected(&self) -> bool {
    method out (line 80) | fn out(&mut self) -> &mut dyn Write {
    method wait (line 87) | pub fn wait(self) {
  method write (line 96) | fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  method flush (line 100) | fn flush(&mut self) -> io::Result<()> {

FILE: watchman/cmds/debug.cpp
  type watchman (line 25) | namespace watchman {
    function UntypedResponse (line 28) | static UntypedResponse cmd_debug_recrawl(Client* client, const json_re...
    function UntypedResponse (line 45) | static UntypedResponse cmd_debug_show_cursors(
    function UntypedResponse (line 76) | static UntypedResponse cmd_debug_ageout(Client* client, const json_ref...
    function UntypedResponse (line 94) | static UntypedResponse cmd_debug_poison(Client* client, const json_ref...
    function UntypedResponse (line 113) | static UntypedResponse cmd_debug_drop_privs(Client* client, const json...
    type DebugSetParallelCrawlCommand (line 122) | struct DebugSetParallelCrawlCommand
      type Response (line 129) | struct Response : BaseResponse {
        method map (line 133) | void map(X& x) {
      method Response (line 139) | static Response handle(Client* client, const Request& req) {
        method map (line 133) | void map(X& x) {
    function UntypedResponse (line 152) | static UntypedResponse cmd_debug_set_subscriptions_paused(
    function json_ref (line 193) | static json_ref getDebugSubscriptionInfo(Root* root) {
    function UntypedResponse (line 223) | static UntypedResponse cmd_debug_get_subscriptions(
    function UntypedResponse (line 246) | static UntypedResponse cmd_debug_get_asserted_states(
    function shellQuoteCommand (line 269) | std::string shellQuoteCommand(std::string_view command) {
    type DebugStatusCommand (line 289) | struct DebugStatusCommand : PrettyCommand<DebugStatusCommand> {
      type Response (line 296) | struct Response : BaseResponse {
        method map (line 301) | void map(X& x) {
      method Response (line 308) | static Response handle(Client*, const Request&) {
        method map (line 301) | void map(X& x) {
      method printResult (line 316) | static void printResult(const Response& response) {
    type DebugRootStatusCommand (line 359) | struct DebugRootStatusCommand : TypedCommand<DebugRootStatusCommand> {
      type Response (line 365) | struct Response : BaseResponse {
        method map (line 369) | void map(X& x) {
      method Response (line 375) | static Response handle(Client* client, const Request& req) {
        method map (line 369) | void map(X& x) {
    function UntypedResponse (line 385) | static UntypedResponse cmd_debug_watcher_info(
    function UntypedResponse (line 397) | static UntypedResponse cmd_debug_watcher_info_clear(
    function addCacheStats (line 413) | void addCacheStats(UntypedResponse& resp, const CacheStats& stats) {
    function UntypedResponse (line 426) | UntypedResponse debugContentHashCache(Client* client, const json_ref& ...
    function UntypedResponse (line 450) | UntypedResponse debugSymlinkTargetCache(Client* client, const json_ref...

FILE: watchman/cmds/find.cpp
  function UntypedResponse (line 20) | static UntypedResponse cmd_find(Client* client, const json_ref& args) {

FILE: watchman/cmds/heapprof.cpp
  function UntypedResponse (line 20) | static UntypedResponse cmd_debug_prof_dump(Client*, const json_ref&) {

FILE: watchman/cmds/info.cpp
  class VersionCommand (line 26) | class VersionCommand : public PrettyCommand<VersionCommand> {
    type RequestOptions (line 33) | struct RequestOptions : serde::Object {
      method map (line 38) | void map(X& x) {
    type Response (line 46) | struct Response : BaseResponse {
      method map (line 52) | void map(X& x) {
    method Response (line 60) | static Response handle(Client*, const Request& request) {
      method map (line 52) | void map(X& x) {
    method printResult (line 95) | static void printResult(const Response& response) {
  function UntypedResponse (line 115) | static UntypedResponse cmd_list_capabilities(Client*, const json_ref&) {
  function UntypedResponse (line 127) | static UntypedResponse cmd_get_sockname(Client*, const json_ref&) {
  function UntypedResponse (line 156) | static UntypedResponse cmd_get_config(Client* client, const json_ref& ar...

FILE: watchman/cmds/log.cpp
  function UntypedResponse (line 19) | static UntypedResponse cmd_loglevel(Client* client, const json_ref& args) {
  function UntypedResponse (line 57) | static UntypedResponse cmd_log(Client*, const json_ref& args) {
  function UntypedResponse (line 80) | static UntypedResponse cmd_global_log_level(Client*, const json_ref& arg...
  function UntypedResponse (line 105) | static UntypedResponse cmd_get_log(Client*, const json_ref& args) {

FILE: watchman/cmds/query.cpp
  function UntypedResponse (line 20) | static UntypedResponse cmd_query(Client* client, const json_ref& args) {

FILE: watchman/cmds/since.cpp
  function UntypedResponse (line 20) | static UntypedResponse cmd_since(Client* client, const json_ref& args) {

FILE: watchman/cmds/state.cpp
  type state_arg (line 19) | struct state_arg {
  function parse_state_arg (line 26) | static void parse_state_arg(Client*, const json_ref& args, state_arg* pa...
  type watchman (line 61) | namespace watchman {
    function UntypedResponse (line 63) | static UntypedResponse cmd_state_enter(
  function UntypedResponse (line 152) | static UntypedResponse cmd_state_leave(

FILE: watchman/cmds/subscribe.cpp
  type sub_action (line 61) | enum class sub_action { no_sync_needed, execute, defer, drop }
  function get_subscription_action (line 63) | static std::tuple<sub_action, w_string> get_subscription_action(
  function ClockSpec (line 308) | ClockSpec ClientSubscription::runSubscriptionRules(
  function UntypedResponse (line 323) | static UntypedResponse cmd_flush_subscriptions(
  function UntypedResponse (line 450) | static UntypedResponse cmd_unsubscribe(
  function UntypedResponse (line 480) | static UntypedResponse cmd_subscribe(Client* clientbase, const json_ref&...

FILE: watchman/cmds/trigger.cpp
  function UntypedResponse (line 25) | static UntypedResponse cmd_trigger_delete(
  function UntypedResponse (line 74) | static UntypedResponse cmd_trigger_list(Client* client, const json_ref& ...
  function json_ref (line 85) | static json_ref build_legacy_trigger(
  function UntypedResponse (line 134) | static UntypedResponse cmd_trigger(Client* client, const json_ref& args) {

FILE: watchman/cmds/watch.cpp
  function w_cmd_realpath_root (line 21) | void w_cmd_realpath_root(Command& command) {
  function annotate_with_clock (line 49) | static void annotate_with_clock(
  function UntypedResponse (line 61) | static UntypedResponse cmd_clock(Client* client, const json_ref& args) {
  function UntypedResponse (line 105) | static UntypedResponse cmd_watch_delete(Client* client, const json_ref& ...
  function UntypedResponse (line 123) | static UntypedResponse cmd_watch_del_all(Client*, const json_ref&) {
  function UntypedResponse (line 137) | static UntypedResponse cmd_watch_list(Client*, const json_ref&) {
  function find_file_in_dir_tree (line 154) | static bool find_file_in_dir_tree(
  function find_project_root (line 183) | bool find_project_root(
  function check_no_watchman (line 200) | void check_no_watchman(w_string resolved_root) {
  function w_string (line 217) | static w_string resolve_projpath(
  function UntypedResponse (line 281) | static UntypedResponse cmd_watch(Client* client, const json_ref& args) {
  function UntypedResponse (line 311) | static UntypedResponse cmd_watch_project(Client* client, const json_ref&...

FILE: watchman/cppclient/CLI.cpp
  function main (line 33) | int main(int argc, char** argv) {

FILE: watchman/cppclient/WatchmanClient.cpp
  type watchman (line 15) | namespace watchman {

FILE: watchman/cppclient/WatchmanClient.h
  function namespace (line 80) | namespace watchman {

FILE: watchman/cppclient/WatchmanConnection.cpp
  type watchman (line 25) | namespace watchman {

FILE: watchman/cppclient/WatchmanConnection.h
  function namespace (line 22) | namespace watchman {

FILE: watchman/cppclient/WatchmanResponseError.cpp
  type watchman (line 10) | namespace watchman {

FILE: watchman/fs/DirHandle.h
  function namespace (line 13) | namespace watchman {

FILE: watchman/fs/FSDetect.cpp
  type watchman (line 33) | namespace watchman {
    function CaseSensitivity (line 35) | CaseSensitivity getCaseSensitivityForPath([[maybe_unused]] const char*...
  function find_fstype_in_linux_proc_mounts (line 51) | std::optional<w_string> find_fstype_in_linux_proc_mounts(
  function w_string (line 111) | w_string w_fstype_detect_macos_nfs(w_string fstype, w_string edenfs_indi...
  function w_string (line 125) | w_string w_fstype([[maybe_unused]] const char* path) {

FILE: watchman/fs/FSDetect.h
  function namespace (line 15) | namespace watchman {

FILE: watchman/fs/FileDescriptor.cpp
  type watchman (line 27) | namespace watchman {
    function FileDescriptor (line 71) | FileDescriptor& FileDescriptor::operator=(FileDescriptor&& other) noex...
    function FileInformation (line 177) | FileInformation FileDescriptor::getInfo() const {
    function w_string (line 218) | w_string FileDescriptor::getOpenedPath() const {
    function w_string (line 318) | w_string FileDescriptor::readSymbolicLink() const {
    function FileDescriptor (line 463) | const FileDescriptor& FileDescriptor::stdIn() {
    function FileDescriptor (line 475) | const FileDescriptor& FileDescriptor::stdOut() {
    function FileDescriptor (line 487) | const FileDescriptor& FileDescriptor::stdErr() {
    function ULONG (line 501) | ULONG FileDescriptor::getReparseTag() const {

FILE: watchman/fs/FileDescriptor.h
  type FileInformation (line 18) | struct FileInformation
  type REPARSE_DATA_BUFFER (line 19) | struct REPARSE_DATA_BUFFER
  type class (line 21) | enum class
  function fdType (line 34) | struct OpenFileHandleOptions {

FILE: watchman/fs/FileInformation.cpp
  type watchman (line 13) | namespace watchman {
    type stat (line 16) | struct stat
    function DType (line 50) | DType FileInformation::dtype() const {
    function FileInformation (line 103) | FileInformation FileInformation::makeDeletedFileInformation() {
  function w_path_exists (line 116) | bool w_path_exists(const char* path) {

FILE: watchman/fs/FileInformation.h
  type class (line 55) | enum class
  type FileInformation (line 87) | struct FileInformation {
  function size (line 93) | uint64_t size{0}
  function gid_t (line 100) | gid_t gid{0}
  function ino_t (line 101) | ino_t ino{0}
  function dev_t (line 102) | dev_t dev{0}
  function nlink_t (line 103) | nlink_t nlink{0}
  function fileAttributes (line 106) | uint32_t fileAttributes{0}
  type timespec (line 109) | struct timespec
  type timespec (line 110) | struct timespec
  type timespec (line 111) | struct timespec
  function DType (line 114) | DType dtype() const;

FILE: watchman/fs/FileSystem.cpp
  type watchman (line 29) | namespace watchman {
    class RealFileSystem (line 33) | class RealFileSystem final : public FileSystem {
      method openDir (line 35) | std::unique_ptr<DirHandle> openDir(const char* path, bool strict = t...
      method FileInformation (line 40) | FileInformation getFileInformation(
      method touch (line 51) | void touch(const char* path) override {
    function checkCanonicalBaseName (line 76) | void checkCanonicalBaseName(const char* path) {
    function FileDescriptor (line 146) | FileDescriptor openFileHandle(
    function FileInformation (line 262) | FileInformation getFileInformation(
    function w_string (line 303) | w_string getCurrentDirectory() {
    function w_string (line 320) | w_string realPath(const char* path) {
    function w_string (line 341) | w_string readSymbolicLink(const char* path) {
    function isOnSameMount (line 385) | bool isOnSameMount(
  function mkdir (line 409) | int mkdir(const char* path, int) {

FILE: watchman/fs/FileSystem.h
  function namespace (line 27) | namespace watchman {

FILE: watchman/fs/ParallelWalk.cpp
  type watchman (line 14) | namespace watchman {
    type ParallelWalkerContext (line 19) | struct ParallelWalkerContext {
      method ParallelWalkerContext (line 33) | ParallelWalkerContext(
      method taskAwareDequeue (line 44) | std::optional<T> taskAwareDequeue(Queue<T>& queue) {
    function createExecutor (line 62) | folly::Executor::KeepAlive<> createExecutor(size_t threadCountHint) {
    function pathJoin (line 78) | folly::fbstring pathJoin(
    class ReadDirTaskCounter (line 91) | class ReadDirTaskCounter {
      method ReadDirTaskCounter (line 106) | explicit ReadDirTaskCounter(std::shared_ptr<ParallelWalkerContext> c...
      method ReadDirTaskCounter (line 111) | ReadDirTaskCounter(const ReadDirTaskCounter& rhs) {
      method ReadDirTaskCounter (line 116) | ReadDirTaskCounter() = delete;
      method ReadDirTaskCounter (line 120) | ReadDirTaskCounter(ReadDirTaskCounter&&) = default;
      method ReadDirTaskCounter (line 122) | ReadDirTaskCounter(ReadDirTaskCounter&&) = delete;
      method ReadDirTaskCounter (line 124) | ReadDirTaskCounter& operator=(const ReadDirTaskCounter&) = delete;
      method ReadDirTaskCounter (line 125) | ReadDirTaskCounter& operator=(ReadDirTaskCounter&&) = delete;
    function readDirTask (line 154) | void readDirTask(

FILE: watchman/fs/ParallelWalk.h
  function namespace (line 17) | namespace watchman {

FILE: watchman/fs/ParallelWalkMain.cpp
  function walk (line 15) | void walk(watchman::AbsolutePath path, size_t threadCountHint) {
  function main (line 62) | int main(int argc, char* argv[]) {

FILE: watchman/fs/Pipe.cpp
  type watchman (line 14) | namespace watchman {

FILE: watchman/fs/Pipe.h
  function namespace (line 11) | namespace watchman {

FILE: watchman/fs/UnixDirHandle.cpp
  type watchman (line 28) | namespace watchman {
    type timespec (line 48) | struct timespec
    type timespec (line 49) | struct timespec
    type timespec (line 50) | struct timespec
    class UnixDirHandle (line 64) | class UnixDirHandle : public DirHandle {
      type attrlist (line 68) | struct attrlist
      type DirEntry (line 74) | struct DirEntry
    function DIR (line 86) | static DIR* opendir_nofollow(const char* path) {
    function use_bulkstat_by_default (line 111) | static bool use_bulkstat_by_default() {
    function openDir (line 132) | std::unique_ptr<DirHandle> openDir(const char* path, bool strict) {
    function flagsToLabel (line 137) | static std::string flagsToLabel(
    function DirEntry (line 221) | const DirEntry* UnixDirHandle::readDir() {

FILE: watchman/fs/WinDirHandle.cpp
  type watchman (line 17) | namespace watchman {
    class WinDirHandle (line 22) | class WinDirHandle : public DirHandle {
      method WinDirHandle (line 39) | explicit WinDirHandle(const char* path, bool strict) {
      method DirEntry (line 61) | const DirEntry* readDir() override {
      method DirEntry (line 79) | const DirEntry* readDirWin8() {
      method DirEntry (line 127) | const DirEntry* readDirWin7() {
    function openDir (line 185) | std::unique_ptr<DirHandle> openDir(const char* path, bool strict) {

FILE: watchman/fs/WindowsTime.cpp
  type watchman (line 12) | namespace watchman {
    function FILETIME_LARGE_INTEGER_to_timespec (line 24) | void FILETIME_LARGE_INTEGER_to_timespec(LARGE_INTEGER ft, timespec* ts) {
    function FILETIME_to_timespec (line 33) | void FILETIME_to_timespec(const FILETIME* ft, timespec* ts) {

FILE: watchman/fs/WindowsTime.h
  function namespace (line 13) | namespace watchman {

FILE: watchman/fuzz/BserDecode.cpp
  function LLVMFuzzerTestOneInput (line 10) | int LLVMFuzzerTestOneInput(void const* data, size_t size) {

FILE: watchman/fuzz/JsonDecode.cpp
  function LLVMFuzzerTestOneInput (line 10) | int LLVMFuzzerTestOneInput(void const* data, size_t size) {

FILE: watchman/fuzz/PyBserDecode.cpp
  function LLVMFuzzerTestOneInput (line 10) | int LLVMFuzzerTestOneInput(void const* data, size_t size) {

FILE: watchman/integration/capabilities.js
  function optional (line 11) | function optional() {
  function required (line 22) | function required() {
  function synth (line 33) | function synth() {

FILE: watchman/integration/cppclient.cpp
  function main (line 27) | int main(int argc, char** argv) {

FILE: watchman/integration/eden/test_eden_glob_upper_bound.py
  function populate (line 17) | def populate(
  class TestEdenGlobUpperBound (line 39) | class TestEdenGlobUpperBound(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method setUp (line 40) | def setUp(self):
    method test_eden_since_upper_bound (line 44) | def test_eden_since_upper_bound(self) -> None:
    method test_eden_trailing_slash (line 73) | def test_eden_trailing_slash(self) -> None:
    method test_eden_since_empty_upper_bound (line 91) | def test_eden_since_empty_upper_bound(self) -> None:
    method test_eden_since_upper_bound_case_insensitive (line 116) | def test_eden_since_upper_bound_case_insensitive(self) -> None:
    method test_eden_since_upper_bound_includedotfiles (line 146) | def test_eden_since_upper_bound_includedotfiles(self) -> None:
    method test_eden_since_upper_bound_name_escaping (line 176) | def test_eden_since_upper_bound_name_escaping(self) -> None:
    method test_eden_since_upper_bound_name_normalization (line 203) | def test_eden_since_upper_bound_name_normalization(self) -> None:
    method test_eden_since_upper_bound_name_set_normalization (line 228) | def test_eden_since_upper_bound_name_set_normalization(self) -> None:
    method test_eden_since_upper_bound_match_noescape (line 255) | def test_eden_since_upper_bound_match_noescape(self) -> None:
    method test_eden_since_upper_bound_match_escape (line 279) | def test_eden_since_upper_bound_match_escape(self) -> None:
    method test_eden_since_upper_bound_dirname_escaping (line 303) | def test_eden_since_upper_bound_dirname_escaping(self) -> None:
    method test_eden_since_upper_bound_match_complex_pattern (line 326) | def test_eden_since_upper_bound_match_complex_pattern(self) -> None:
    method assertGlobUpperBound (line 374) | def assertGlobUpperBound(self, expected_patterns) -> None:

FILE: watchman/integration/eden/test_eden_journal.py
  class TestEdenJournal (line 16) | class TestEdenJournal(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method test_eden_journal (line 17) | def test_eden_journal(self) -> None:
    method test_two_rapid_checkouts_show_briefly_changed_files (line 103) | def test_two_rapid_checkouts_show_briefly_changed_files(self) -> None:
    method test_aba_checkouts_show_briefly_changed_files (line 160) | def test_aba_checkouts_show_briefly_changed_files(self) -> None:
    method test_querying_with_truncated_journal_returns_fresh_instance (line 213) | def test_querying_with_truncated_journal_returns_fresh_instance(self) ...
    method test_changing_root_tree (line 270) | def test_changing_root_tree(self) -> None:

FILE: watchman/integration/eden/test_eden_pathgen.py
  function populate (line 16) | def populate(repo) -> None:
  class TestEdenPathGenerator (line 32) | class TestEdenPathGenerator(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method test_defer_mtime (line 33) | def test_defer_mtime(self) -> None:
    method test_eden_readlink (line 47) | def test_eden_readlink(self) -> None:
    method test_non_existent_file (line 62) | def test_non_existent_file(self) -> None:
    method test_eden_watch (line 93) | def test_eden_watch(self) -> None:
    method test_path_and_glob_dotfiles (line 291) | def test_path_and_glob_dotfiles(self):

FILE: watchman/integration/eden/test_eden_query.py
  function populate (line 11) | def populate(repo) -> None:
  class TestEdenQuery (line 25) | class TestEdenQuery(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method test_eden_path_query (line 26) | def test_eden_path_query(self) -> None:

FILE: watchman/integration/eden/test_eden_scm.py
  function populate (line 12) | def populate(repo) -> None:
  class TestEdenScm (line 21) | class TestEdenScm(WatchmanEdenTestCase.WatchmanEdenTestCase, HgMixin):
    method test_eden_cachedScm (line 22) | def test_eden_cachedScm(self) -> None:

FILE: watchman/integration/eden/test_eden_sha1.py
  class TestEdenSha1 (line 16) | class TestEdenSha1(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method write_file_and_hash (line 17) | def write_file_and_hash(self, filename, content) -> str:
    method test_eden_sha1 (line 26) | def test_eden_sha1(self) -> None:

FILE: watchman/integration/eden/test_eden_shutdown.py
  class TestEdenShutdown (line 12) | class TestEdenShutdown(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method test_shutdown_and_restart (line 13) | def test_shutdown_and_restart(self) -> None:

FILE: watchman/integration/eden/test_eden_since.py
  function populate (line 18) | def populate(
  class TestEdenSince (line 41) | class TestEdenSince(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method test_eden_lazy_eval (line 42) | def test_eden_lazy_eval(self) -> None:
    method test_eden_empty_relative_root (line 58) | def test_eden_empty_relative_root(self) -> None:
    method test_eden_since (line 79) | def test_eden_since(self) -> None:
    method query_adir_change_since (line 213) | def query_adir_change_since(self, root, clock):
    method test_eden_since_removal (line 230) | def test_eden_since_removal(self) -> None:
    method test_eden_since_across_update (line 255) | def test_eden_since_across_update(self) -> None:
    method test_eden_since_over_threshold (line 296) | def test_eden_since_over_threshold(self) -> None:
    method test_eden_since_dotfiles_change (line 356) | def test_eden_since_dotfiles_change(self) -> None:
    method test_eden_since_fresh_instance_dotfiles (line 386) | def test_eden_since_fresh_instance_dotfiles(self) -> None:

FILE: watchman/integration/eden/test_eden_subscribe.py
  function possible_cookie (line 15) | def possible_cookie(name):
  class TestEdenSubscribe (line 19) | class TestEdenSubscribe(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method requiresPersistentSession (line 20) | def requiresPersistentSession(self) -> bool:
    method test_eden_subscribe (line 23) | def test_eden_subscribe(self) -> None:
    method assertWaitForAssertedStates (line 97) | def assertWaitForAssertedStates(self, root, states) -> None:
    method test_state_enter_leave (line 113) | def test_state_enter_leave(self) -> None:

FILE: watchman/integration/eden/test_eden_suffix.py
  function populate (line 11) | def populate(repo) -> None:
  class TestEdenQuery (line 28) | class TestEdenQuery(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method test_simple_suffix (line 29) | def test_simple_suffix(self) -> None:

FILE: watchman/integration/eden/test_eden_takeover.py
  function populate (line 12) | def populate(repo):
  class TestEdenTakeover (line 18) | class TestEdenTakeover(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method test_eden_takeover (line 19) | def test_eden_takeover(self) -> None:

FILE: watchman/integration/eden/test_eden_unmount.py
  function populate (line 14) | def populate(repo):
  class TestEdenUnmount (line 20) | class TestEdenUnmount(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method test_eden_unmount (line 21) | def test_eden_unmount(self) -> None:
    method test_eden_unmount_watch (line 35) | def test_eden_unmount_watch(self) -> None:

FILE: watchman/integration/eden/test_eden_watch_parent.py
  class TestEdenWatchParent (line 15) | class TestEdenWatchParent(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method test_eden_watch_parent (line 16) | def test_eden_watch_parent(self) -> None:

FILE: watchman/integration/eden/test_eden_watch_root.py
  class TestEdenWatchRoot (line 16) | class TestEdenWatchRoot(WatchmanEdenTestCase.WatchmanEdenTestCase):
    method test_eden_watch_root (line 17) | def test_eden_watch_root(self) -> None:

FILE: watchman/integration/lib/Interrupt.py
  function wasInterrupted (line 12) | def wasInterrupted() -> bool:
  function setInterrupted (line 17) | def setInterrupted() -> None:
  function checkInterrupt (line 22) | def checkInterrupt() -> None:

FILE: watchman/integration/lib/TempDir.py
  class TempDir (line 23) | class TempDir:
    method __init__ (line 33) | def __init__(self, keepAtShutdown: bool = False) -> None:
    method get_dir (line 65) | def get_dir(self):
    method set_keep (line 68) | def set_keep(self, value) -> None:
    method _retry_rmtree (line 71) | def _retry_rmtree(self, top) -> None:
  function _remove_readonly (line 83) | def _remove_readonly(func, path, exc_info) -> None:
  function get_temp_dir (line 105) | def get_temp_dir(keep=None):

FILE: watchman/integration/lib/WatchmanEdenTestCase.py
  function is_sandcastle (line 21) | def is_sandcastle():
  function is_buck_build (line 31) | def is_buck_build():
  function can_run_eden (line 40) | def can_run_eden():
  class WatchmanEdenTestCase (line 43) | class WatchmanEdenTestCase:
    method setUp (line 60) | def setUp(self) -> None:
    method _restoreHome (line 92) | def _restoreHome(self) -> None:
    method cleanUpEden (line 96) | def cleanUpEden(self) -> None:
    method cleanUpWatchman (line 99) | def cleanUpWatchman(self):
    method makeEdenMount (line 111) | def makeEdenMount(self, populate_fn=None):
    method repoForPath (line 130) | def repoForPath(self, path):
    method setDefaultConfiguration (line 139) | def setDefaultConfiguration(self):
    method isCaseSensitiveMount (line 142) | def isCaseSensitiveMount(self, path) -> bool:
  class WatchmanEdenTestCase (line 48) | class WatchmanEdenTestCase(WatchmanTestCase.WatchmanTestCase):
    method setUp (line 60) | def setUp(self) -> None:
    method _restoreHome (line 92) | def _restoreHome(self) -> None:
    method cleanUpEden (line 96) | def cleanUpEden(self) -> None:
    method cleanUpWatchman (line 99) | def cleanUpWatchman(self):
    method makeEdenMount (line 111) | def makeEdenMount(self, populate_fn=None):
    method repoForPath (line 130) | def repoForPath(self, path):
    method setDefaultConfiguration (line 139) | def setDefaultConfiguration(self):
    method isCaseSensitiveMount (line 142) | def isCaseSensitiveMount(self, path) -> bool:

FILE: watchman/integration/lib/WatchmanInstance.py
  function getSharedInstance (line 35) | def getSharedInstance(config=None):
  function mergeTestConfig (line 50) | def mergeTestConfig(config):
  class InitWithFilesMixin (line 56) | class InitWithFilesMixin:
    method _init_state (line 57) | def _init_state(self) -> None:
    method get_state_args (line 81) | def get_state_args(self):
  class InitWithDirMixin (line 91) | class InitWithDirMixin:
    method _init_state (line 97) | def _init_state(self) -> None:
    method get_state_args (line 121) | def get_state_args(self):
  class _Instance (line 125) | class _Instance:
    method __init__ (line 130) | def __init__(
    method __del__ (line 143) | def __del__(self) -> None:
    method __enter__ (line 146) | def __enter__(self) -> "_Instance":
    method __exit__ (line 149) | def __exit__(self, *exc_info) -> None:
    method getSockPath (line 152) | def getSockPath(self):
    method getUnixSockPath (line 157) | def getUnixSockPath(self):
    method getNamedPipePath (line 160) | def getNamedPipePath(self):
    method getCLILogContents (line 163) | def getCLILogContents(self) -> str:
    method getServerLogContents (line 168) | def getServerLogContents(self) -> str:
    method stop (line 173) | def stop(self) -> None:
    method watchmanBinary (line 179) | def watchmanBinary(self) -> str:
    method commandViaCLI (line 182) | def commandViaCLI(self, cmd, prefix=None):
    method start (line 197) | def start(self, extra_env=None) -> None:
    method _waitForSuspend (line 241) | def _waitForSuspend(self, suspended, timeout: float) -> bool:
    method _susresBinary (line 263) | def _susresBinary(self) -> str:
    method suspend (line 266) | def suspend(self) -> None:
    method resume (line 277) | def resume(self) -> None:
  class Instance (line 289) | class Instance(_Instance, InitWithFilesMixin):
  class InstanceWithStateDir (line 293) | class InstanceWithStateDir(_Instance, InitWithDirMixin):

FILE: watchman/integration/lib/WatchmanSCMTestCase.py
  class HgMixin (line 19) | class HgMixin:
    method hg (line 20) | def hg(self, args, cwd=None):
  class WatchmanSCMTestCase (line 55) | class WatchmanSCMTestCase(WatchmanTestCase.WatchmanTestCase, HgMixin):
    method __init__ (line 56) | def __init__(self, methodName: str = "run") -> None:
    method requiresPersistentSession (line 59) | def requiresPersistentSession(self) -> bool:
    method skipIfNoFSMonitor (line 62) | def skipIfNoFSMonitor(self) -> None:
    method checkOSApplicability (line 77) | def checkOSApplicability(self) -> None:
    method resolveCommitHash (line 81) | def resolveCommitHash(self, revset, cwd=None) -> str:
    method waitForStatesToVacate (line 86) | def waitForStatesToVacate(self, root) -> None:
    method getConsolidatedFileList (line 94) | def getConsolidatedFileList(self, dat):
    method getSubFatClocksOnly (line 100) | def getSubFatClocksOnly(self, subname, root):

FILE: watchman/integration/lib/WatchmanTestCase.py
  function wrap_with_backoff (line 33) | def wrap_with_backoff(fn):
  class TempDirPerTestMixin (line 59) | class TempDirPerTestMixin(unittest.TestCase):
    method __init__ (line 60) | def __init__(self, *args, **kwargs) -> None:
    method setUp (line 64) | def setUp(self) -> None:
    method _getTempDirName (line 74) | def _getTempDirName(self) -> str:
    method mkdtemp (line 77) | def mkdtemp(self, **kwargs):
    method mktemp (line 80) | def mktemp(self, prefix: str = "") -> str:
  class WatchmanTestCase (line 86) | class WatchmanTestCase(TempDirPerTestMixin, unittest.TestCase):
    method __init__ (line 96) | def __init__(self, methodName: str = "run") -> None:
    method requiresPersistentSession (line 106) | def requiresPersistentSession(self) -> bool:
    method checkPersistentSession (line 109) | def checkPersistentSession(self) -> None:
    method checkOSApplicability (line 113) | def checkOSApplicability(self) -> None:
    method skipIfCapabilityMissing (line 118) | def skipIfCapabilityMissing(self, cap, reason) -> None:
    method setUp (line 123) | def setUp(self) -> None:
    method tearDown (line 128) | def tearDown(self) -> None:
    method getClient (line 138) | def getClient(
    method __logTestInfo (line 157) | def __logTestInfo(self, test, msg):
    method setAttemptNumber (line 164) | def setAttemptNumber(self, attempt: int) -> None:
    method __clearClient (line 167) | def __clearClient(self):
    method _getTempDirName (line 172) | def _getTempDirName(self) -> str:
    method _getLongTestID (line 178) | def _getLongTestID(self) -> str:
    method run (line 182) | def run(self, result):
    method dumpLogs (line 202) | def dumpLogs(self) -> None:
    method getLogSample (line 207) | def getLogSample(self) -> str:
    method getServerLogContents (line 224) | def getServerLogContents(self):
    method setConfiguration (line 231) | def setConfiguration(
    method removeRelative (line 239) | def removeRelative(self, base, *fname) -> None:
    method touch (line 243) | def touch(self, fname, times=None) -> None:
    method touchRelative (line 253) | def touchRelative(self, base, *fname) -> None:
    method __clearWatches (line 257) | def __clearWatches(self):
    method __del__ (line 266) | def __del__(self) -> None:
    method watchmanCommand (line 269) | def watchmanCommand(self, *args):
    method watchmanInstance (line 273) | def watchmanInstance(self):
    method watchmanConfig (line 276) | def watchmanConfig(self):
    method _waitForCheck (line 284) | def _waitForCheck(self, cond, res_check, timeout: float):
    method waitFor (line 299) | def waitFor(self, cond, timeout=None):
    method waitForEqual (line 303) | def waitForEqual(self, expected, actual_cond, timeout=None):
    method getTimeout (line 307) | def getTimeout(self, timeout=None) -> float:
    method assertWaitFor (line 310) | def assertWaitFor(self, cond, timeout=None, message=None):
    method assertWaitForEqual (line 319) | def assertWaitForEqual(self, expected, actual_cond, timeout=None, mess...
    method getFileList (line 333) | def getFileList(self, root, cursor=None, relativeRoot=None):
    method waitForSync (line 344) | def waitForSync(self, root) -> None:
    method getWatchList (line 353) | def getWatchList(self):
    method assertFileListsEqual (line 358) | def assertFileListsEqual(self, list1, list2, message=None) -> None:
    method fileListsEqual (line 363) | def fileListsEqual(self, list1, list2) -> bool:
    method fileListContains (line 368) | def fileListContains(self, list1, list2) -> bool:
    method assertFileListContains (line 374) | def assertFileListContains(self, list1, list2, message=None) -> None:
    method assertFileList (line 380) | def assertFileList(
    method assertQueryRepsonseEqual (line 398) | def assertQueryRepsonseEqual(self, expected_resp, actual_resp) -> None:
    method assertWatchListContains (line 409) | def assertWatchListContains(self, roots, message=None) -> None:
    method waitForSub (line 416) | def waitForSub(
    method waitForSubFileList (line 444) | def waitForSubFileList(self, name, root, fileList: List[str], timeout=...
    method getSubscription (line 459) | def getSubscription(
    method normalizeFiles (line 470) | def normalizeFiles(self, data):
    method isCaseInsensitive (line 485) | def isCaseInsensitive(self):
    method suspendWatchman (line 493) | def suspendWatchman(self) -> None:
    method resumeWatchman (line 496) | def resumeWatchman(self) -> None:
    method rootIsWatched (line 499) | def rootIsWatched(self, r) -> bool:
  function skip_for (line 508) | def skip_for(transports=None, codecs=None):
  function expand_matrix (line 529) | def expand_matrix(test_class) -> None:

FILE: watchman/integration/lib/node.py
  function _find_node (line 13) | def _find_node():
  function _find_yarn (line 17) | def _find_yarn():
  function _ensure_can_run (line 23) | def _ensure_can_run(binary_path) -> None:

FILE: watchman/integration/lib/path_utils.py
  function open_file_win (line 17) | def open_file_win(path):
  function get_canonical_filesystem_path (line 32) | def get_canonical_filesystem_path(name):
  function get_canonical_filesystem_path (line 63) | def get_canonical_filesystem_path(name):
  function get_canonical_filesystem_path (line 75) | def get_canonical_filesystem_path(name):
  function norm_relative_path (line 79) | def norm_relative_path(path):
  function norm_absolute_path (line 88) | def norm_absolute_path(path):

FILE: watchman/integration/test_absroot.py
  class TestAbsoluteRoot (line 19) | class TestAbsoluteRoot(WatchmanTestCase.WatchmanTestCase):
    method test_dot (line 20) | def test_dot(self) -> None:
    method test_root (line 41) | def test_root(self) -> None:

FILE: watchman/integration/test_age_file.py
  class TestAgeOutFile (line 18) | class TestAgeOutFile(WatchmanTestCase.WatchmanTestCase):
    method test_age_file (line 20) | def test_age_file(self) -> None:

FILE: watchman/integration/test_age_watch.py
  class TestAgeOutWatch (line 19) | class TestAgeOutWatch(WatchmanTestCase.WatchmanTestCase):
    method makeRootAndConfig (line 20) | def makeRootAndConfig(self):
    method test_watchReap (line 27) | def test_watchReap(self) -> None:

FILE: watchman/integration/test_auth.py
  class TestAuth (line 15) | class TestAuth(WatchmanTestCase.WatchmanTestCase):
    method requiresPersistentSession (line 16) | def requiresPersistentSession(self) -> bool:
    method test_dropPriv (line 19) | def test_dropPriv(self) -> None:

FILE: watchman/integration/test_big.py
  function populate_tests (line 17) | def populate_tests(original_test_class):
  class TestBig (line 42) | class TestBig(WatchmanTestCase.WatchmanTestCase):
    method checkOSApplicability (line 43) | def checkOSApplicability(self) -> None:
    method do_test_bigQuery (line 47) | def do_test_bigQuery(self, sizes: List[int]) -> None:

FILE: watchman/integration/test_big_file.py
  class TestBigFile (line 17) | class TestBigFile(WatchmanTestCase.WatchmanTestCase):
    method test_big_file (line 18) | def test_big_file(self) -> None:

FILE: watchman/integration/test_bsdish.py
  class TestBSDish (line 16) | class TestBSDish(WatchmanTestCase.WatchmanTestCase):
    method test_bsdish_toplevel (line 17) | def test_bsdish_toplevel(self) -> None:

FILE: watchman/integration/test_bser_cli.py
  class TestDashJCliOption (line 21) | class TestDashJCliOption(unittest.TestCase):
    method getSockPath (line 22) | def getSockPath(self):
    method doJson (line 25) | def doJson(self, addNewLine, pretty: bool = False) -> None:
    method test_jsonInputNoNewLine (line 58) | def test_jsonInputNoNewLine(self) -> None:
    method test_jsonInputNewLine (line 61) | def test_jsonInputNewLine(self) -> None:
    method test_jsonInputPretty (line 64) | def test_jsonInputPretty(self) -> None:
    method test_bserInput (line 67) | def test_bserInput(self) -> None:

FILE: watchman/integration/test_bulkstat.py
  class TestBulkStat (line 13) | class TestBulkStat(WatchmanTestCase.WatchmanTestCase):
    method test_bulkstat_on (line 14) | def test_bulkstat_on(self) -> None:
    method test_bulkstat_off (line 28) | def test_bulkstat_off(self) -> None:

FILE: watchman/integration/test_capabilities.py
  class TestCapabilities (line 18) | class TestCapabilities(WatchmanTestCase.WatchmanTestCase):
    method test_capabilities (line 19) | def test_capabilities(self) -> None:
    method test_capabilityCheck (line 44) | def test_capabilityCheck(self) -> None:
    method test_capabilitySynth (line 66) | def test_capabilitySynth(self) -> None:
    method test_full_capability_set (line 100) | def test_full_capability_set(self) -> None:

FILE: watchman/integration/test_case_sensitive.py
  class TestCaseSensitive (line 15) | class TestCaseSensitive(WatchmanTestCase.WatchmanTestCase):
    method test_changeCase (line 16) | def test_changeCase(self) -> None:

FILE: watchman/integration/test_clock.py
  class TestClock (line 14) | class TestClock(WatchmanTestCase.WatchmanTestCase):
    method test_clock (line 15) | def test_clock(self) -> None:
    method test_clock_sync (line 22) | def test_clock_sync(self) -> None:

FILE: watchman/integration/test_command.py
  class TestCommand (line 15) | class TestCommand(WatchmanTestCase.WatchmanTestCase):
    method test_unknown_commands_print_json_error (line 16) | def test_unknown_commands_print_json_error(self) -> None:

FILE: watchman/integration/test_content_hash.py
  class TestContentHash (line 18) | class TestContentHash(WatchmanTestCase.WatchmanTestCase):
    method write_file_and_hash (line 19) | def write_file_and_hash(self, filename, content) -> str:
    method test_contentHash (line 28) | def test_contentHash(self) -> None:
    method test_contentHashWarming (line 115) | def test_contentHashWarming(self) -> None:
    method test_cacheLimit (line 145) | def test_cacheLimit(self) -> None:

FILE: watchman/integration/test_cookie.py
  class TestCookie (line 18) | class TestCookie(WatchmanTestCase.WatchmanTestCase):
    method test_delete_cookie_dir (line 19) | def test_delete_cookie_dir(self) -> None:
    method test_other_cookies (line 46) | def test_other_cookies(self) -> None:

FILE: watchman/integration/test_cppclient.py
  class TestCppClient (line 27) | class TestCppClient(unittest.TestCase):
    method setUp (line 28) | def setUp(self) -> None:
    method tearDown (line 32) | def tearDown(self) -> None:
    method test_cppclient (line 36) | def test_cppclient(self) -> None:

FILE: watchman/integration/test_cursor.py
  class TestCursor (line 16) | class TestCursor(WatchmanTestCase.WatchmanTestCase):
    method test_cursor (line 17) | def test_cursor(self) -> None:

FILE: watchman/integration/test_dir_move.py
  class TestDirMove (line 19) | class TestDirMove(WatchmanTestCase.WatchmanTestCase):
    method checkOSApplicability (line 22) | def checkOSApplicability(self) -> None:
    method build_under (line 26) | def build_under(self, root, name, latency: float = 0) -> None:
    method test_atomicMove (line 32) | def test_atomicMove(self) -> None:
    method test_NonAtomicMove (line 51) | def test_NonAtomicMove(self) -> None:

FILE: watchman/integration/test_dirname.py
  class TestDirName (line 16) | class TestDirName(WatchmanTestCase.WatchmanTestCase):
    method test_dirname (line 17) | def test_dirname(self) -> None:

FILE: watchman/integration/test_empty.py
  class TestEmpty (line 16) | class TestEmpty(WatchmanTestCase.WatchmanTestCase):
    method test_empty (line 17) | def test_empty(self) -> None:

FILE: watchman/integration/test_fields.py
  class TestFields (line 16) | class TestFields(WatchmanTestCase.WatchmanTestCase):
    method test_fields (line 17) | def test_fields(self) -> None:

FILE: watchman/integration/test_find.py
  class TestFind (line 17) | class TestFind(WatchmanTestCase.WatchmanTestCase):
    method test_find (line 18) | def test_find(self) -> None:

FILE: watchman/integration/test_fishy.py
  class TestFishy (line 16) | class TestFishy(WatchmanTestCase.WatchmanTestCase):
    method checkOSApplicability (line 17) | def checkOSApplicability(self) -> None:
    method test_fishy (line 21) | def test_fishy(self) -> None:
    method test_more_moves (line 45) | def test_more_moves(self) -> None:
    method test_even_more_moves (line 64) | def test_even_more_moves(self) -> None:
    method test_notify_dir (line 92) | def test_notify_dir(self) -> None:

FILE: watchman/integration/test_force_recrawl.py
  class TestForceRecrawl (line 15) | class TestForceRecrawl(WatchmanTestCase.WatchmanTestCase):
    method test_force_recrawl (line 16) | def test_force_recrawl(self) -> None:

FILE: watchman/integration/test_fork.py
  class TestSince (line 17) | class TestSince(WatchmanTestCase.WatchmanTestCase):
    method checkOSApplicability (line 18) | def checkOSApplicability(self) -> None:
    method test_forkclient (line 22) | def test_forkclient(self) -> None:

FILE: watchman/integration/test_fsevents_resync.py
  class TestFSEventsResync (line 20) | class TestFSEventsResync(WatchmanTestCase.WatchmanTestCase):
    method checkOSApplicability (line 21) | def checkOSApplicability(self) -> None:
    method test_resync (line 25) | def test_resync(self) -> None:

FILE: watchman/integration/test_fstype.py
  class TestIllegalFSType (line 15) | class TestIllegalFSType(WatchmanTestCase.WatchmanTestCase):
    method test_Illegal (line 16) | def test_Illegal(self) -> None:

FILE: watchman/integration/test_glob.py
  class TestGlob (line 19) | class TestGlob(WatchmanTestCase.WatchmanTestCase):
    method test_glob (line 20) | def test_glob(self) -> None:
    method test_glob_generator_empty (line 162) | def test_glob_generator_empty(self) -> None:
    method test_glob_generator_absolute (line 173) | def test_glob_generator_absolute(self) -> None:
    method test_case_sensitive (line 189) | def test_case_sensitive(self) -> None:

FILE: watchman/integration/test_ignore.py
  class TestIgnore (line 18) | class TestIgnore(WatchmanTestCase.WatchmanTestCase):
    method test_ignore_git (line 19) | def test_ignore_git(self) -> None:
    method test_invalid_ignore (line 35) | def test_invalid_ignore(self) -> None:
    method test_ignore_overlap_vcs_ignore (line 46) | def test_ignore_overlap_vcs_ignore(self) -> None:
    method test_ignore_generic (line 59) | def test_ignore_generic(self) -> None:

FILE: watchman/integration/test_info.py
  class TestInfo (line 17) | class TestInfo(WatchmanTestCase.WatchmanTestCase):
    method test_sock_name (line 18) | def test_sock_name(self) -> None:
    method test_get_config_empty (line 25) | def test_get_config_empty(self) -> None:
    method test_get_config (line 30) | def test_get_config(self) -> None:
    method get_config (line 38) | def get_config(self, root):

FILE: watchman/integration/test_invalid_expr.py
  class TestInvalidExpr (line 15) | class TestInvalidExpr(WatchmanTestCase.WatchmanTestCase):
    method test_invalid_expr_term (line 16) | def test_invalid_expr_term(self) -> None:
    method test_invalid_sync_timeout (line 41) | def test_invalid_sync_timeout(self) -> None:

FILE: watchman/integration/test_invalid_watchmanconfig.py
  class TestWatchmanConfigValid (line 16) | class TestWatchmanConfigValid(WatchmanTestCase.WatchmanTestCase):
    method test_trailing_comma (line 17) | def test_trailing_comma(self) -> None:

FILE: watchman/integration/test_kqueue_and_fsevents_recrawl.py
  class TestKQueueAndFSEventsRecrawl (line 18) | class TestKQueueAndFSEventsRecrawl(WatchmanTestCase.WatchmanTestCase):
    method checkOSApplicability (line 19) | def checkOSApplicability(self) -> None:
    method test_recrawl (line 23) | def test_recrawl(self) -> None:

FILE: watchman/integration/test_local_saved_state.py
  function is_ubuntu (line 16) | def is_ubuntu() -> bool:
  class TestSavedState (line 27) | class TestSavedState(WatchmanSCMTestCase.WatchmanSCMTestCase):
    method checkOSApplicability (line 28) | def checkOSApplicability(self) -> None:
    method setUp (line 36) | def setUp(self) -> None:
    method getQuery (line 102) | def getQuery(self, config):
    method getLocalFilename (line 117) | def getLocalFilename(self, saved_state_rev, metadata):
    method saveState (line 124) | def saveState(self, project, bookmark, local_storage, metadata=None):
    method getConfig (line 133) | def getConfig(self, result):
    method assertStorageTypeLocal (line 136) | def assertStorageTypeLocal(self, result) -> None:
    method assertCommitIDEquals (line 139) | def assertCommitIDEquals(self, result, commit_id) -> None:
    method assertCommitIDNotPresent (line 142) | def assertCommitIDNotPresent(self, result) -> None:
    method assertSavedStateErrorEquals (line 145) | def assertSavedStateErrorEquals(self, result, error_string) -> None:
    method assertSavedStateInfo (line 148) | def assertSavedStateInfo(self, result, path, commit_id) -> None:
    method assertMergebaseEquals (line 153) | def assertMergebaseEquals(self, result, mergebase) -> None:
    method test_localSavedStateErrorHandling (line 156) | def test_localSavedStateErrorHandling(self) -> None:
    method test_localSavedStateNoStateFound (line 170) | def test_localSavedStateNoStateFound(self) -> None:
    method test_localSavedStateNotWithinLimit (line 187) | def test_localSavedStateNotWithinLimit(self) -> None:
    method test_localSavedStateNotWithinLimitOmitChangedFiles (line 208) | def test_localSavedStateNotWithinLimitOmitChangedFiles(self) -> None:
    method test_localSavedStateNotWithinLimitError (line 230) | def test_localSavedStateNotWithinLimitError(self) -> None:
    method test_localSavedStateLookupSuccess (line 254) | def test_localSavedStateLookupSuccess(self) -> None:
    method test_localSavedStateLookupSuccessOmitChangedFiles (line 279) | def test_localSavedStateLookupSuccessOmitChangedFiles(self) -> None:
    method test_localSavedStateLookupSuccessWithMetadata (line 307) | def test_localSavedStateLookupSuccessWithMetadata(self) -> None:
    method test_localSavedStateFailureIfMetadataDoesNotMatch (line 333) | def test_localSavedStateFailureIfMetadataDoesNotMatch(self) -> None:
    method test_localSavedStateFailureIfNoMetadataForFileThatHasIt (line 352) | def test_localSavedStateFailureIfNoMetadataForFileThatHasIt(self) -> N...
    method test_localSavedStateSubscription (line 371) | def test_localSavedStateSubscription(self) -> None:

FILE: watchman/integration/test_log.py
  class TestLog (line 15) | class TestLog(WatchmanTestCase.WatchmanTestCase):
    method test_invalidNumArgsLogLevel (line 16) | def test_invalidNumArgsLogLevel(self) -> None:
    method test_invalidLevelLogLevel (line 23) | def test_invalidLevelLogLevel(self) -> None:
    method test_invalidNumArgsLog (line 29) | def test_invalidNumArgsLog(self) -> None:
    method test_invalidLevelLog (line 36) | def test_invalidLevelLog(self) -> None:

FILE: watchman/integration/test_match.py
  class TestMatch (line 17) | class TestMatch(WatchmanTestCase.WatchmanTestCase):
    method test_match (line 18) | def test_match(self) -> None:

FILE: watchman/integration/test_name.py
  class TestNameExpr (line 17) | class TestNameExpr(WatchmanTestCase.WatchmanTestCase):
    method test_name_expr (line 18) | def test_name_expr(self) -> None:

FILE: watchman/integration/test_nice.py
  class TestNice (line 18) | class TestNice(unittest.TestCase):
    method test_failing_to_start_when_nice (line 22) | def test_failing_to_start_when_nice(self) -> None:
    method test_failing_to_start_when_nice_foreground (line 31) | def test_failing_to_start_when_nice_foreground(self) -> None:

FILE: watchman/integration/test_nodejs.py
  function find_js_tests (line 26) | def find_js_tests(test_class) -> None:
  class NodeTestCase (line 66) | class NodeTestCase(WatchmanTestCase.TempDirPerTestMixin, unittest.TestCa...
    method setAttemptNumber (line 69) | def setAttemptNumber(self, attempt: int) -> None:
    method runTest (line 76) | def runTest(self) -> None:
    method _getTempDirName (line 121) | def _getTempDirName(self):

FILE: watchman/integration/test_path_generator.py
  class TestPathGenerator (line 16) | class TestPathGenerator(WatchmanTestCase.WatchmanTestCase):
    method test_path_generator_dot (line 17) | def test_path_generator_dot(self) -> None:
    method test_path_generator_case (line 32) | def test_path_generator_case(self) -> None:
    method test_path_generator_relative_root (line 60) | def test_path_generator_relative_root(self) -> None:
    method test_path_generator_empty (line 103) | def test_path_generator_empty(self) -> None:

FILE: watchman/integration/test_pcre.py
  class TestPcre (line 15) | class TestPcre(WatchmanTestCase.WatchmanTestCase):
    method check_pcre (line 16) | def check_pcre(self) -> None:
    method test_big_pcre (line 21) | def test_big_pcre(self) -> None:
    method test_pcre (line 46) | def test_pcre(self) -> None:

FILE: watchman/integration/test_perms.py
  function is_root (line 17) | def is_root() -> bool:
  class TestPerms (line 22) | class TestPerms(WatchmanTestCase.WatchmanTestCase):
    method checkOSApplicability (line 23) | def checkOSApplicability(self) -> None:
    method test_permDeniedSubDir (line 28) | def test_permDeniedSubDir(self) -> None:
    method test_permDeniedRoot (line 40) | def test_permDeniedRoot(self) -> None:

FILE: watchman/integration/test_remove.py
  class TestRemove (line 17) | class TestRemove(WatchmanTestCase.WatchmanTestCase):
    method test_remove (line 18) | def test_remove(self) -> None:

FILE: watchman/integration/test_remove_then_add.py
  class TestRemoveThenAdd (line 17) | class TestRemoveThenAdd(WatchmanTestCase.WatchmanTestCase):
    method checkOSApplicability (line 18) | def checkOSApplicability(self) -> None:
    method test_remove_then_add (line 22) | def test_remove_then_add(self) -> None:

FILE: watchman/integration/test_request_id.py
  function is_hg_installed (line 18) | def is_hg_installed() -> bool:
  class TestRequestId (line 38) | class TestRequestId(WatchmanTestCase.WatchmanTestCase):
    method test_queryRequestId (line 39) | def test_queryRequestId(self) -> None:
    method skipIfNoHgRequestIdSupport (line 55) | def skipIfNoHgRequestIdSupport(self) -> None:
    method test_scmHgRequestId (line 78) | def test_scmHgRequestId(self) -> None:

FILE: watchman/integration/test_restrictions.py
  class TestWatchRestrictions (line 17) | class TestWatchRestrictions(WatchmanTestCase.WatchmanTestCase):
    method test_rootRestrict (line 18) | def test_rootRestrict(self) -> None:
    method runWatchTests (line 30) | def runWatchTests(self, config, expect) -> None:
    method assertWatchSucceeds (line 57) | def assertWatchSucceeds(self, inst, client, path) -> None:
    method assertWatchProjectSucceeds (line 60) | def assertWatchProjectSucceeds(self, inst, client, path) -> None:
    method assertWatchIsRestricted (line 63) | def assertWatchIsRestricted(self, inst, client, path) -> None:
    method assertWatchProjectIsRestricted (line 94) | def assertWatchProjectIsRestricted(self, inst, client, path) -> None:
    method test_invalidRoot (line 119) | def test_invalidRoot(self) -> None:

FILE: watchman/integration/test_saved_state.py
  class TestSavedState (line 15) | class TestSavedState(WatchmanSCMTestCase.WatchmanSCMTestCase):
    method setUp (line 16) | def setUp(self) -> None:
    method get_skeleton_query (line 32) | def get_skeleton_query(self):
    method test_unsupportedStorageType (line 42) | def test_unsupportedStorageType(self) -> None:

FILE: watchman/integration/test_scm.py
  function is_ubuntu (line 17) | def is_ubuntu() -> bool:
  class TestScm (line 28) | class TestScm(WatchmanSCMTestCase.WatchmanSCMTestCase):
    method test_not_supported (line 29) | def test_not_supported(self) -> None:
    method test_scmHg (line 49) | def test_scmHg(self) -> None:

FILE: watchman/integration/test_since.py
  class TestSince (line 18) | class TestSince(WatchmanTestCase.WatchmanTestCase):
    method test_sinceIssue1 (line 19) | def test_sinceIssue1(self) -> None:
    method test_sinceIssue2 (line 38) | def test_sinceIssue2(self) -> None:
    method test_sinceRelativeRoot (line 77) | def test_sinceRelativeRoot(self) -> None:
    method assertFreshInstanceForSince (line 135) | def assertFreshInstanceForSince(self, root, cursor, empty: bool = Fals...
    method test_sinceFreshInstance (line 147) | def test_sinceFreshInstance(self) -> None:
    method test_reAddWatchFreshInstance (line 204) | def test_reAddWatchFreshInstance(self) -> None:
    method test_recrawlFreshInstance (line 229) | def test_recrawlFreshInstance(self) -> None:
    method test_recrawlFreshInstanceWarningSuppressed (line 250) | def test_recrawlFreshInstanceWarningSuppressed(self) -> None:

FILE: watchman/integration/test_since_term.py
  class TestSinceTerm (line 17) | class TestSinceTerm(WatchmanTestCase.WatchmanTestCase):
    method test_since_term (line 18) | def test_since_term(self) -> None:

FILE: watchman/integration/test_site_spawn.py
  class TestSiteSpawn (line 22) | class TestSiteSpawn(unittest.TestCase):
    method test_failingSpawner (line 23) | def test_failingSpawner(self) -> None:
    method test_no_site_spawner (line 37) | def test_no_site_spawner(self) -> None:
    method test_spawner (line 51) | def test_spawner(self) -> None:

FILE: watchman/integration/test_size.py
  class TestSizeExpr (line 16) | class TestSizeExpr(WatchmanTestCase.WatchmanTestCase):
    method test_size_expr (line 17) | def test_size_expr(self) -> None:

FILE: watchman/integration/test_sock_perms.py
  class TestSockPerms (line 35) | class TestSockPerms(unittest.TestCase):
    method _new_instance (line 36) | def _new_instance(self, config):
    method _get_custom_gid (line 42) | def _get_custom_gid(self):
    method _get_non_member_group (line 52) | def _get_non_member_group(self):
    method waitFor (line 60) | def waitFor(self, cond, timeout: float = 60):
    method assertWaitFor (line 73) | def assertWaitFor(
    method test_too_open_user_dir (line 85) | def test_too_open_user_dir(self) -> None:
    method test_invalid_sock_group (line 101) | def test_invalid_sock_group(self) -> None:
    method test_user_not_in_sock_group (line 131) | def test_user_not_in_sock_group(self) -> None:
    method test_default_sock_group (line 143) | def test_default_sock_group(self) -> None:
    method test_custom_sock_group (line 153) | def test_custom_sock_group(self) -> None:
    method test_user_previously_in_sock_group (line 163) | def test_user_previously_in_sock_group(self) -> None:
    method test_invalid_sock_access (line 193) | def test_invalid_sock_access(self) -> None:
    method test_default_sock_access (line 214) | def test_default_sock_access(self) -> None:
    method test_custom_sock_access_group (line 222) | def test_custom_sock_access_group(self) -> None:
    method test_custom_sock_access_others (line 230) | def test_custom_sock_access_others(self) -> None:
    method test_sock_access_upgrade (line 238) | def test_sock_access_upgrade(self) -> None:
    method test_sock_access_downgrade (line 248) | def test_sock_access_downgrade(self) -> None:
    method test_sock_access_group_change (line 258) | def test_sock_access_group_change(self) -> None:
    method test_sock_access_via_acl (line 271) | def test_sock_access_via_acl(self) -> None:
    method test_sock_access_via_acl_user_not_in_sock_group (line 281) | def test_sock_access_via_acl_user_not_in_sock_group(self) -> None:
    method test_sock_symlink (line 290) | def test_sock_symlink(self) -> None:
    method assertFileMode (line 328) | def assertFileMode(self, f, mode, follow_symlink=True) -> None:
    method assertFileGID (line 335) | def assertFileGID(self, f, gid, follow_symlink=True) -> None:
    method assertACL (line 342) | def assertACL(self, f, group, expected_regex) -> None:

FILE: watchman/integration/test_subscribe.py
  class TestSubscribe (line 21) | class TestSubscribe(WatchmanTestCase.WatchmanTestCase):
    method requiresPersistentSession (line 22) | def requiresPersistentSession(self) -> bool:
    method wlockExists (line 25) | def wlockExists(self, subdata, exists) -> bool:
    method matchStateSubscription (line 40) | def matchStateSubscription(self, subdata, mode):
    method assertWaitForAssertedStates (line 46) | def assertWaitForAssertedStates(self, root, states) -> None:
    method test_state_enter_leave (line 62) | def test_state_enter_leave(self) -> None:
    method test_defer_state (line 96) | def test_defer_state(self) -> None:
    method test_drop_state (line 174) | def test_drop_state(self) -> None:
    method test_defer_vcs (line 229) | def test_defer_vcs(self) -> None:
    method test_immediate_subscribe (line 285) | def test_immediate_subscribe(self) -> None:
    method test_multi_cancel (line 319) | def test_multi_cancel(self) -> None:
    method test_subscribe (line 346) | def test_subscribe(self) -> None:
    method test_flush_subscriptions (line 414) | def test_flush_subscriptions(self) -> None:
    method test_unsub_deadlock (line 601) | def test_unsub_deadlock(self) -> None:
    method test_subscription_cleanup (line 622) | def test_subscription_cleanup(self) -> None:
    method test_subscribe_unicode (line 678) | def test_subscribe_unicode(self) -> None:
    method test_unique_name_error (line 726) | def test_unique_name_error(self) -> None:
    method test_resubscribe_same_name_no_error (line 759) | def test_resubscribe_same_name_no_error(self) -> None:
    method test_resubscribe_same_name_no_warning (line 796) | def test_resubscribe_same_name_no_warning(self) -> None:
    method test_multi_client_same_name (line 836) | def test_multi_client_same_name(self) -> None:
    method test_unique_name_warning (line 901) | def test_unique_name_warning(self) -> None:
    method findSubscriptionContainingFile (line 921) | def findSubscriptionContainingFile(self, subdata, filename):
    method normFileList (line 928) | def normFileList(self, files):

FILE: watchman/integration/test_suffix.py
  class TestMatch (line 17) | class TestMatch(WatchmanTestCase.WatchmanTestCase):
    method test_match_suffix (line 18) | def test_match_suffix(self) -> None:
    method test_suffix_expr (line 141) | def test_suffix_expr(self) -> None:

FILE: watchman/integration/test_suffix_generator.py
  class TestSuffixGenerator (line 17) | class TestSuffixGenerator(WatchmanTestCase.WatchmanTestCase):
    method test_suffix_generator (line 18) | def test_suffix_generator(self) -> None:
    method test_suffix_generator_empty (line 60) | def test_suffix_generator_empty(self) -> None:

FILE: watchman/integration/test_trigger.py
  class TestTrigger (line 20) | class TestTrigger(WatchmanTestCase.WatchmanTestCase):
    method requiresPersistentSession (line 21) | def requiresPersistentSession(self) -> bool:
    method hasTriggerInLogs (line 25) | def hasTriggerInLogs(self, root, triggerName) -> bool:
    method test_triggerIssue141 (line 35) | def test_triggerIssue141(self) -> None:
    method validate_trigger_output (line 71) | def validate_trigger_output(self, root, files, context) -> None:
    method test_legacyTrigger (line 111) | def test_legacyTrigger(self) -> None:

FILE: watchman/integration/test_trigger_chdir.py
  class TestTrigger (line 24) | class TestTrigger(WatchmanTestCase.WatchmanTestCase):
    method fileContains (line 25) | def fileContains(self, file_name, thing) -> bool:
    method fileHasValidJson (line 33) | def fileHasValidJson(self, file_name) -> bool:
    method checkOSApplicability (line 44) | def checkOSApplicability(self) -> None:
    method test_triggerChdir (line 48) | def test_triggerChdir(self) -> None:
    method test_triggerChdirRelativeRoot (line 78) | def test_triggerChdirRelativeRoot(self) -> None:
    method test_triggerMaxFiles (line 118) | def test_triggerMaxFiles(self) -> None:
    method test_triggerNamePerLine (line 173) | def test_triggerNamePerLine(self) -> None:
    method test_triggerNamePerLineRelativeRoot (line 202) | def test_triggerNamePerLineRelativeRoot(self) -> None:
    method test_triggerNamePerLineAppend (line 225) | def test_triggerNamePerLineAppend(self) -> None:
    method test_triggerJsonNameOnly (line 253) | def test_triggerJsonNameOnly(self) -> None:
    method test_triggerJsonNameAndSize (line 277) | def test_triggerJsonNameAndSize(self) -> None:

FILE: watchman/integration/test_trigger_error.py
  class TestTriggerError (line 15) | class TestTriggerError(WatchmanTestCase.WatchmanTestCase):
    method assertTriggerRegError (line 16) | def assertTriggerRegError(self, err, *args) -> None:
    method test_bad_args (line 21) | def test_bad_args(self) -> None:

FILE: watchman/integration/test_two_deep.py
  class TestTwoDeep (line 17) | class TestTwoDeep(WatchmanTestCase.WatchmanTestCase):
    method test_two_deep (line 18) | def test_two_deep(self) -> None:

FILE: watchman/integration/test_type.py
  class TestTypeExpr (line 17) | class TestTypeExpr(WatchmanTestCase.WatchmanTestCase):
    method test_type_expr (line 18) | def test_type_expr(self) -> None:

FILE: watchman/integration/test_watch_del_all.py
  class TestWatchDelAll (line 16) | class TestWatchDelAll(WatchmanTestCase.WatchmanTestCase):
    method test_watch_del_all (line 17) | def test_watch_del_all(self) -> None:

FILE: watchman/integration/test_watch_project.py
  function make_empty_watchmanconfig (line 17) | def make_empty_watchmanconfig(dir) -> None:
  class TestWatchProject (line 23) | class TestWatchProject(WatchmanTestCase.WatchmanTestCase):
    method runProjectTests (line 24) | def runProjectTests(
    method test_watchProject (line 79) | def test_watchProject(self) -> None:
    method test_watchProjectWatchmanConfig (line 91) | def test_watchProjectWatchmanConfig(self) -> None:
    method test_watchProjectEnforcing (line 107) | def test_watchProjectEnforcing(self) -> None:
    method test_reUseNestedWatch (line 123) | def test_reUseNestedWatch(self) -> None:

FILE: watchman/integration/test_wm_wait.py
  class TestWatchmanWait (line 19) | class TestWatchmanWait(WatchmanTestCase.WatchmanTestCase):
    method requiresPersistentSession (line 20) | def requiresPersistentSession(self) -> bool:
    method spawnWatchmanWait (line 23) | def spawnWatchmanWait(self, cmdArgs):
    method assertWaitedFileList (line 44) | def assertWaitedFileList(self, stdout, expected) -> None:
    method assertWaitForWmWaitWatch (line 49) | def assertWaitForWmWaitWatch(self, root) -> None:
    method test_wait (line 67) | def test_wait(self) -> None:
    method test_rel_root (line 91) | def test_rel_root(self) -> None:

FILE: watchman/java/src/com/facebook/watchman/Callback.java
  type Callback (line 12) | public interface Callback {
    method call (line 13) | void call(Map<String, Object> message) throws Exception;

FILE: watchman/java/src/com/facebook/watchman/CapabilitiesStrategy.java
  class CapabilitiesStrategy (line 20) | public class CapabilitiesStrategy {
    method checkWatchProjectCapability (line 28) | public static boolean checkWatchProjectCapability(WatchmanClient clien...

FILE: watchman/java/src/com/facebook/watchman/Deserializer.java
  type Deserializer (line 14) | public interface Deserializer {
    method deserialize (line 21) | Map<String, Object> deserialize(InputStream stream) throws IOException;

FILE: watchman/java/src/com/facebook/watchman/WatchmanClient.java
  type WatchmanClient (line 19) | public interface WatchmanClient {
    method clock (line 21) | ListenableFuture<Map<String, Object>> clock(Path path);
    method clock (line 22) | ListenableFuture<Map<String, Object>> clock(Path path, Number syncTime...
    method watch (line 24) | ListenableFuture<Map<String, Object>> watch(Path path);
    method watchDel (line 26) | ListenableFuture<Map<String,Object>> watchDel(Path path);
    method unsubscribe (line 28) | ListenableFuture<Boolean> unsubscribe(SubscriptionDescriptor descriptor);
    method subscribe (line 30) | ListenableFuture<SubscriptionDescriptor> subscribe(
    method version (line 35) | ListenableFuture<Map<String, Object>> version();
    method version (line 37) | ListenableFuture<Map<String, Object>> version(
    method run (line 41) | ListenableFuture<Map<String, Object>> run(List<Object> command);
    method unsubscribeAll (line 43) | ListenableFuture<Boolean> unsubscribeAll();
    method close (line 45) | void close() throws IOException;
    method start (line 47) | void start();
    class SubscriptionDescriptor (line 49) | @Value.Immutable
      method root (line 52) | public abstract String root();
      method name (line 53) | public abstract String name();
      method hashCode (line 55) | @Override

FILE: watchman/java/src/com/facebook/watchman/WatchmanClientImpl.java
  class WatchmanClientImpl (line 39) | public class WatchmanClientImpl implements WatchmanClient {
    method WatchmanClientImpl (line 51) | public WatchmanClientImpl(WatchmanTransport transport) throws IOExcept...
    method WatchmanClientImpl (line 65) | @VisibleForTesting
    method clock (line 79) | @Override
    method clock (line 87) | @Override
    method watch (line 97) | @Override
    method watchDel (line 112) | @Override
    method unsubscribe (line 120) | @Override
    method subscribe (line 148) | @Override
    method version (line 180) | @Override
    method version (line 186) | @Override
    method run (line 197) | @Override
    method unsubscribeAll (line 205) | @Override
    method close (line 230) | @Override
    method start (line 235) | @Override
    class UnilateralCallbackImpl (line 240) | private class UnilateralCallbackImpl implements Callback {
      method call (line 242) | @Override

FILE: watchman/java/src/com/facebook/watchman/WatchmanConnection.java
  class WatchmanConnection (line 35) | public class WatchmanConnection {
    method WatchmanConnection (line 49) | public WatchmanConnection(WatchmanTransport transport) throws IOExcept...
    method WatchmanConnection (line 59) | public WatchmanConnection(
    method WatchmanConnection (line 72) | public WatchmanConnection(
    method WatchmanConnection (line 86) | public WatchmanConnection(
    method WatchmanConnection (line 98) | public WatchmanConnection(
    method WatchmanConnection (line 111) | public WatchmanConnection(
    method WatchmanConnection (line 125) | public WatchmanConnection(
    method checkMessageUnilateral (line 154) | private boolean checkMessageUnilateral(Map<String, Object> response) {
    method run (line 162) | public ListenableFuture<Map<String, Object>> run(final Object command) {
    method failAllCommands (line 203) | private void failAllCommands(Exception e) {
    method close (line 211) | public void close() throws IOException {
    method start (line 222) | public void start() {
    class IncomingMessageThread (line 226) | private class IncomingMessageThread implements Runnable {
      method run (line 228) | @Override
    type QueuedCommand (line 263) | @Value.Immutable
      method command (line 266) | Object command();
      method latch (line 267) | CountDownLatch latch();
      method resultRef (line 268) | AtomicReference<Map<String, Object>> resultRef();
      method errorRef (line 269) | AtomicReference<Exception> errorRef();
    type WatchmanCommandListener (line 282) | public interface WatchmanCommandListener {
      method onStart (line 283) | void onStart();
      method onSent (line 284) | void onSent();
      method onReceived (line 285) | void onReceived();
    method incomingMessageGetterFromTransport (line 292) | private static Callable<Map<String, Object>> incomingMessageGetterFrom...

FILE: watchman/java/src/com/facebook/watchman/WatchmanException.java
  class WatchmanException (line 12) | public class WatchmanException extends Exception {
    method WatchmanException (line 16) | public WatchmanException() {
    method WatchmanException (line 21) | public WatchmanException(String reason) {
    method WatchmanException (line 26) | public WatchmanException(String error, Map<String, Object> response) {
    method getResponse (line 31) | public Map<String, Object> getResponse() {

FILE: watchman/java/src/com/facebook/watchman/WatchmanTransport.java
  type WatchmanTransport (line 14) | public interface WatchmanTransport extends Closeable {
    method getInputStream (line 15) | InputStream getInputStream();
    method getOutputStream (line 16) | OutputStream getOutputStream();

FILE: watchman/java/src/com/facebook/watchman/WatchmanTransportBuilder.java
  class WatchmanTransportBuilder (line 36) | public class WatchmanTransportBuilder {
    class BufferingOutputHandler (line 37) | private static class BufferingOutputHandler extends NuAbstractProcessH...
      method BufferingOutputHandler (line 44) | public BufferingOutputHandler() {
      method onStart (line 50) | @Override
      method onStdout (line 56) | @Override
      method getOutput (line 69) | public ByteBuffer getOutput() throws IOException {
    method discoverTransport (line 77) | public static WatchmanTransport discoverTransport() throws WatchmanTra...
    method discoverTransport (line 81) | public static WatchmanTransport discoverTransport(long duration, TimeU...
    method discoverTransport (line 92) | public static WatchmanTransport discoverTransport(Path watchmanPath, l...

FILE: watchman/java/src/com/facebook/watchman/WatchmanTransportUnavailableException.java
  class WatchmanTransportUnavailableException (line 10) | public class WatchmanTransportUnavailableException extends Exception {
    method WatchmanTransportUnavailableException (line 12) | public WatchmanTransportUnavailableException() {
    method WatchmanTransportUnavailableException (line 16) | public WatchmanTransportUnavailableException(String message) {
    method WatchmanTransportUnavailableException (line 20) | public WatchmanTransportUnavailableException(String message, Throwable...

FILE: watchman/java/src/com/facebook/watchman/bser/BserConstants.java
  class BserConstants (line 10) | public class BserConstants {
    method BserConstants (line 12) | private BserConstants() { }

FILE: watchman/java/src/com/facebook/watchman/bser/BserDeserializer.java
  class BserDeserializer (line 42) | public class BserDeserializer implements Deserializer {
    type KeyOrdering (line 43) | public enum KeyOrdering {
    class BserEofException (line 52) | @SuppressWarnings("serial")
      method BserEofException (line 54) | public BserEofException(String message) {
      method BserEofException (line 58) | public BserEofException(String message, Throwable cause) {
    method BserDeserializer (line 72) | public BserDeserializer(KeyOrdering keyOrdering) {
    method deserializeBserValue (line 92) | @Nullable
    method deserialize (line 105) | @SuppressWarnings("unchecked")
    method readBserBuffer (line 110) | private ByteBuffer readBserBuffer(InputStream inputStream) throws IOEx...
    method deserializeIntLen (line 181) | private int deserializeIntLen(ByteBuffer buffer, byte type) throws IOE...
    method deserializeNumber (line 198) | private Number deserializeNumber(ByteBuffer buffer, byte type) throws ...
    method deserializeString (line 213) | private String deserializeString(ByteBuffer buffer) throws IOException {
    method deserializeArray (line 233) | private List<Object> deserializeArray(ByteBuffer buffer) throws IOExce...
    method deserializeObject (line 246) | private Map<String, Object> deserializeObject(ByteBuffer buffer) throw...
    method deserializeTemplate (line 273) | private List<Map<String, Object>> deserializeTemplate(ByteBuffer buffe...
    method deserializeRecursive (line 301) | @Nullable
    method deserializeRecursiveWithType (line 307) | private Object deserializeRecursiveWithType(ByteBuffer buffer, byte ty...

FILE: watchman/java/src/com/facebook/watchman/bser/BserSerializer.java
  class BserSerializer (line 36) | public class BserSerializer {
    type BserIntegralEncodedSize (line 40) | private enum BserIntegralEncodedSize {
      method BserIntegralEncodedSize (line 48) | private BserIntegralEncodedSize(int size) {
    method BserSerializer (line 55) | public BserSerializer() {
    method serializeToStream (line 64) | public void serializeToStream(Object value, OutputStream outputStream)...
    method serializeToBuffer (line 89) | public ByteBuffer serializeToBuffer(Object value, ByteBuffer buffer) t...
    method appendRecursive (line 101) | @SuppressWarnings("unchecked")
    method appendString (line 160) | private static ByteBuffer appendString(
    method appendLong (line 177) | private static ByteBuffer appendLong(ByteBuffer buffer, long value) {
    method getEncodedSize (line 183) | private static BserIntegralEncodedSize getEncodedSize(long value) {
    method appendLongWithSize (line 198) | private static ByteBuffer appendLongWithSize(
    method increaseBufferCapacityIfNeeded (line 225) | private static ByteBuffer increaseBufferCapacityIfNeeded(ByteBuffer bu...
    method resizeBufferWithCapacity (line 238) | private static ByteBuffer resizeBufferWithCapacity(ByteBuffer buffer, ...

FILE: watchman/java/src/com/facebook/watchman/environment/ExecutableFinder.java
  class ExecutableFinder (line 31) | public class ExecutableFinder {
    method apply (line 48) | @Override
    method apply (line 55) | @Override
    method getExecutable (line 61) | public static Path getExecutable(
    method getOptionalExecutable (line 73) | public static Optional<Path> getOptionalExecutable(
    method getOptionalExecutable (line 79) | public static Optional<Path> getOptionalExecutable(
    method isExecutable (line 100) | private static boolean isExecutable(Path exe) {
    method getPaths (line 126) | private static ImmutableSet<Path> getPaths(ImmutableMap<String, String...
    method getExecutableSuffixes (line 155) | private static ImmutableSet<String> getExecutableSuffixes(ImmutableMap...
    method ExecutableFinder (line 172) | private ExecutableFinder() {}

FILE: watchman/java/src/com/facebook/watchman/environment/FileFinder.java
  class FileFinder (line 23) | public class FileFinder {
    method apply (line 28) | @Override
    method apply (line 38) | @Override
    method apply (line 48) | @Override
    method combine (line 61) | public static ImmutableSet<String> combine(
    method getOptionalFile (line 96) | public static Optional<Path> getOptionalFile(
    method getOptionalFile (line 109) | public static Optional<Path> getOptionalFile(
    method getOptionalFile (line 125) | public static Optional<Path> getOptionalFile(
    method getOptionalFile (line 138) | public static Optional<Path> getOptionalFile(
    method FileFinder (line 158) | private FileFinder() {}

FILE: watchman/java/src/com/facebook/watchman/unixsocket/ReferenceCountedFileDescriptor.java
  class ReferenceCountedFileDescriptor (line 40) | class ReferenceCountedFileDescriptor {
    method ReferenceCountedFileDescriptor (line 45) | public ReferenceCountedFileDescriptor(int fd) {
    method finalize (line 51) | @Override
    method acquire (line 56) | public synchronized int acquire() {
    method release (line 61) | public synchronized void release() throws IOException {
    method close (line 68) | public synchronized void close() throws IOException {
    method doClose (line 81) | private void doClose() throws IOException {

FILE: watchman/java/src/com/facebook/watchman/unixsocket/UnixDomainSocket.java
  class UnixDomainSocket (line 52) | public class UnixDomainSocket extends Socket implements WatchmanTransport {
    method createSocketWithPath (line 60) | public static UnixDomainSocket createSocketWithPath(Path path) throws ...
    method UnixDomainSocket (line 82) | private UnixDomainSocket(ReferenceCountedFileDescriptor fd) {
    method getInputStream (line 88) | @Override
    method getOutputStream (line 93) | @Override
    method shutdownInput (line 98) | @Override
    method shutdownOutput (line 103) | @Override
    method doShutdown (line 108) | private void doShutdown(int how) throws IOException {
    method close (line 121) | @Override
    method finalize (line 136) | @Override
    class UnixDomainSocketInputStream (line 141) | private class UnixDomainSocketInputStream extends InputStream {
      method read (line 142) | @Override
      method read (line 155) | @Override
      method doRead (line 168) | private int doRead(ByteBuffer buf) throws IOException {
    class UnixDomainSocketOutputStream (line 183) | private class UnixDomainSocketOutputStream extends OutputStream {
      method write (line 185) | @Override
      method write (line 192) | @Override
      method doWrite (line 201) | private void doWrite(ByteBuffer buf) throws IOException {

FILE: watchman/java/src/com/facebook/watchman/unixsocket/UnixDomainSocketLibrary.java
  class UnixDomainSocketLibrary (line 43) | class UnixDomainSocketLibrary {
    method UnixDomainSocketLibrary (line 52) | private UnixDomainSocketLibrary() { }
    method isBsdish (line 57) | private static boolean isBsdish() {
    class SockaddrUn (line 66) | public static class SockaddrUn extends Structure implements Structure....
      class SunLenAndFamily (line 71) | public static class SunLenAndFamily extends Structure {
        method getFieldOrder (line 75) | @Override
      class SunFamily (line 85) | public static class SunFamily extends Union {
      method SockaddrUn (line 96) | public SockaddrUn() {
      method SockaddrUn (line 110) | public SockaddrUn(String path) throws IOException {
      method getFieldOrder (line 131) | @Override
    method socket (line 141) | public static native int socket(int domain, int type, int protocol) th...
    method connect (line 142) | public static native int connect(int fd, SockaddrUn address, int addre...
    method bind (line 144) | public static native int bind(int fd, SockaddrUn address, int addressLen)
    method listen (line 146) | public static native int listen(int fd, int backlog) throws LastErrorE...
    method accept (line 147) | public static native int accept(int fd, SockaddrUn address, IntByRefer...
    method read (line 149) | public static native int read(int fd, ByteBuffer buffer, int count)
    method write (line 151) | public static native int write(int fd, ByteBuffer buffer, int count)
    method close (line 153) | public static native int close(int fd) throws LastErrorException;
    method shutdown (line 154) | public static native int shutdown(int fd, int how) throws LastErrorExc...

FILE: watchman/java/src/com/facebook/watchman/windowspipe/WindowsNamedPipe.java
  class WindowsNamedPipe (line 28) | public class WindowsNamedPipe implements WatchmanTransport {
    method WindowsNamedPipe (line 39) | public WindowsNamedPipe(String path) throws IOException {
    method close (line 69) | @Override
    method getInputStream (line 76) | @Override
    method getOutputStream (line 81) | @Override
    class NamedPipeOutputStream (line 86) | private class NamedPipeOutputStream extends OutputStream {
      method write (line 87) | @Override
      method write (line 92) | @Override
    class NamedPipeInputStream (line 116) | private class NamedPipeInputStream extends InputStream {
      method read (line 118) | @Override
      method read (line 125) | @Override

FILE: watchman/java/src/com/facebook/watchman/windowspipe/WindowsNamedPipeLibrary.java
  type WindowsNamedPipeLibrary (line 18) | public interface WindowsNamedPipeLibrary extends WinNT {
    method GetOverlappedResult (line 22) | boolean GetOverlappedResult(HANDLE hFile,
    method ReadFile (line 27) | boolean ReadFile(HANDLE hFile, Memory pointer, int nNumberOfBytesToRead,
    method CreateFile (line 30) | HANDLE CreateFile(String lpFileName, int dwDesiredAccess, int dwShareM...
    method CreateEvent (line 35) | HANDLE CreateEvent(WinBase.SECURITY_ATTRIBUTES lpEventAttributes,
    method CloseHandle (line 38) | boolean CloseHandle(HANDLE hObject);
    method WriteFile (line 40) | boolean WriteFile(HANDLE hFile, byte[] lpBuffer, int nNumberOfBytesToW...
    method GetLastError (line 44) | int GetLastError();

FILE: watchman/java/test/com/facebook/watchman/CapabilitiesTest.java
  class CapabilitiesTest (line 22) | public class CapabilitiesTest {
    method testWatchProjectVersionCalled (line 30) | @Test
    method testWatchProjectCapabilitySupported (line 59) | @Test
    method testWatchProjectCapabilityUnsupported (line 84) | @Test
    method testIntegration (line 103) | @Test

FILE: watchman/java/test/com/facebook/watchman/WatchmanClientTest.java
  class WatchmanClientTest (line 35) | public class WatchmanClientTest extends WatchmanTestBase {
    method setClient (line 44) | @Before
    method subscribeTriggersListenerTest (line 59) | @SuppressWarnings("unchecked")
    method watchProjectWithUnilateralTest (line 98) | @SuppressWarnings("unchecked")
    method watchProjectRequestTest (line 122) | @SuppressWarnings("unchecked")
    method watchDelRequestTest (line 143) | @SuppressWarnings("unchecked")
    method watchRequestTest (line 165) | @SuppressWarnings("unchecked")
    method subscribeRequestTest (line 182) | @SuppressWarnings("unchecked")
    method unsubscribeRequestTest (line 208) | @SuppressWarnings("unchecked")
    method clockRequestWithoutTimeoutTest (line 239) | @SuppressWarnings("unchecked")
    method clockRequestWithTimeoutTest (line 262) | @SuppressWarnings("unchecked")
    method versionRequestTestNoCapabilities (line 289) | @SuppressWarnings("unchecked")
    method versionRequestTestWithCapabilities (line 310) | @SuppressWarnings("unchecked")

FILE: watchman/java/test/com/facebook/watchman/WatchmanConnectionTest.java
  class WatchmanConnectionTest (line 43) | public class WatchmanConnectionTest extends WatchmanTestBase {
    method sendCommandTest (line 53) | @SuppressWarnings("unchecked")
    method singleCommandTest (line 71) | @Test
    method exceptionThrownTest (line 120) | @SuppressWarnings("ThrowableInstanceNeverThrown")
    method testUnilateralMessageBeforeResponse (line 146) | @Test
    method testCurrentRequestCanceled (line 219) | @Test
    method propagatesDeserializationException (line 293) | @Test
    method propagatesInterruptionException (line 326) | @Test

FILE: watchman/java/test/com/facebook/watchman/WatchmanTestBase.java
  class WatchmanTestBase (line 22) | public class WatchmanTestBase {
    method setUp (line 28) | @Before
    method deepObjectEquals (line 40) | @SuppressWarnings("unchecked")
    method deepObjectEquals (line 61) | @SuppressWarnings("unchecked")

FILE: watchman/java/test/com/facebook/watchman/bser/BserDeserializerTest.java
  class BserDeserializerTest (line 41) | @SuppressWarnings("unchecked")
    method getByteStream (line 74) | private static InputStream getByteStream(String base16) {
    method deserializeEmptyArray (line 78) | @Test
    method deserializeEmptyArrayTwiceReturnsSameArray (line 87) | @Test
    method deserializeArrayOfInt8 (line 97) | @Test
    method deserializeString (line 106) | @Test
    method sameStringDeserializedTwiceReturnsSameInstance (line 115) | @Test
    method deserializeEmptyMap (line 125) | @Test
    method deserializeEmptyMapTwiceReturnsSameMap (line 134) | @Test
    method deserializeUnsortedMapOfStringToInt8 (line 144) | @Test
    method deserializeSortedMapOfStringToInt8 (line 155) | @Test
    method deserializeTemplate (line 166) | @Test
    method deserializeInt8 (line 191) | @Test
    method sameInt8DeserializedTwiceReturnsSameInstance (line 198) | @Test
    method deserializeInt16 (line 207) | @Test
    method deserializeInt32 (line 215) | @Test
    method deserializeInt64 (line 223) | @Test
    method deserializeReal (line 231) | @Test
    method deserializeTrue (line 239) | @Test
    method deserializeFalse (line 246) | @Test
    method deserializeNull (line 253) | @Test
    method throwIfSniffLengthTooShort (line 260) | @Test
    method throwIfInvalidHeader (line 268) | @Test
    method throwIfInvalidHeaderLengthType (line 276) | @Test
    method throwIfHeaderLengthIsNegative (line 284) | @Test
    method throwIfBodyLengthIsOverMaxInt (line 292) | @Test
    method throwIfHeaderLengthTooShort (line 300) | @Test
    method throwIfRemainingLengthTooShort (line 308) | @Test
    method throwIfStringNotUTF8 (line 316) | @Test
    method throwIfArrayLengthTooShort (line 323) | @Test
    method throwIfMapLengthTooShort (line 331) | @Test
    method throwIfMapKeyNotString (line 339) | @Test

FILE: watchman/java/test/com/facebook/watchman/bser/BserSerializerTest.java
  class BserSerializerTest (line 35) | public class BserSerializerTest {
    method setUp (line 106) | @Before
    method assertEncodingMatches (line 111) | private ByteBuffer assertEncodingMatches(Object object, String base16)...
    method serializeEmptyArray (line 126) | @Test
    method serializeArrayOfInt8 (line 131) | @Test
    method serializeString (line 138) | @Test
    method serializeEmptyMap (line 143) | @Test
    method serializeInt8Map (line 148) | @Test
    method serializeInt8 (line 158) | @Test
    method serializeInt16 (line 163) | @Test
    method serializeInt32 (line 168) | @Test
    method serializeInt64 (line 173) | @Test
    method serializeMinInt8 (line 178) | @Test
    method serializeMinInt16 (line 183) | @Test
    method serializeMinInt32 (line 188) | @Test
    method serializeMinInt64 (line 193) | @Test
    method serializeReal (line 198) | @Test
    method serializeTrue (line 203) | @Test
    method serializeFalse (line 208) | @Test
    method serializeNull (line 213) | @Test
    method throwIfStringNotUTF8 (line 218) | @Test
    method throwIfMapKeyNotString (line 226) | @Test
    method smallObjectReusesInputBuffer (line 234) | @Test
    method largeObjectAllocatesNewBuffer (line 241) | @Test
    method serializeTrueToStream (line 248) | @Test

FILE: watchman/java/test/com/facebook/watchman/environment/ExecutableFinderTest.java
  class ExecutableFinderTest (line 30) | public class ExecutableFinderTest {
    method testSearchPathsFileFoundReturnsPath (line 34) | @Test
    method testSearchPathsNonExecutableFileIsIgnored (line 49) | @Test
    method testSearchPathsDirAndFileFoundReturnsFileNotDir (line 66) | @Test
    method testSearchPathsMultipleFileFoundReturnsFirstPath (line 82) | @Test
    method testSearchPathsSymlinkToExecutableInsidePathReturnsPath (line 98) | @Test
    method testSearchPathsSymlinkToExecutableOutsideSearchPathReturnsPath (line 113) | @Test
    method testSearchPathsFileNotFoundReturnsAbsent (line 131) | @Test
    method testSearchPathsEmptyReturnsAbsent (line 145) | @Test
    method testSearchPathsWithIsExecutableFunctionFailure (line 155) | @Test
    method testSearchPathsWithExtensions (line 173) | @Test
    method testSearchPathsWithExtensionsNoMatch (line 186) | @Test
    method testThatADirectoryIsNotConsideredAnExecutable (line 199) | @Test
    method createExecutable (line 212) | private Path createExecutable(String executablePath) throws IOException {
    method makeExecutable (line 218) | public static void makeExecutable(Path file) throws IOException {

FILE: watchman/java/test/com/facebook/watchman/environment/FileFinderTest.java
  class FileFinderTest (line 24) | public class FileFinderTest {
    method combine (line 28) | @Test
    method firstMatchInPath (line 55) | @Test
    method matchAny (line 67) | @Test
    method noMatch (line 92) | @Test

FILE: watchman/java/test/com/facebook/watchman/fakes/FakeWatchmanClient.java
  class FakeWatchmanClient (line 21) | public class FakeWatchmanClient implements WatchmanClient {
    method clock (line 23) | @Override
    method clock (line 28) | @Override
    method watch (line 33) | @Override
    method watchDel (line 38) | @Override
    method unsubscribe (line 43) | @Override
    method subscribe (line 48) | @Override
    method version (line 54) | @Override
    method version (line 59) | @Override
    method run (line 65) | @Override
    method unsubscribeAll (line 70) | @Override
    method close (line 75) | @Override
    method start (line 80) | @Override

FILE: watchman/java/test/com/facebook/watchman/util/TemporaryPaths.java
  class TemporaryPaths (line 20) | public class TemporaryPaths extends ExternalResource {
    method TemporaryPaths (line 25) | public TemporaryPaths() {
    method TemporaryPaths (line 29) | public TemporaryPaths(boolean keepContents) {
    method before (line 33) | @Override
    method getRoot (line 38) | public Path getRoot() {
    method newFolder (line 42) | public Path newFolder() throws IOException {
    method after (line 46) | @Override
    method newFile (line 79) | public Path newFile(String fileName) throws IOException {
    method newFile (line 90) | public Path newFile() throws IOException {
    method newFolder (line 94) | public Path newFolder(String... name) throws IOException {

FILE: watchman/listener-user.cpp
  function UntypedResponse (line 23) | static UntypedResponse cmd_shutdown(Client*, const json_ref&) {
  function add_root_warnings_to_response (line 37) | void add_root_warnings_to_response(
  function doResolveOrCreateRoot (line 60) | std::shared_ptr<Root>
  function resolveRootByName (line 78) | std::shared_ptr<Root>
  function resolveRoot (line 115) | std::shared_ptr<Root> resolveRoot(Client* client, const json_ref& args) {
  function resolveOrCreateRoot (line 119) | std::shared_ptr<Root> resolveOrCreateRoot(

FILE: watchman/listener.cpp
  function w_listener_prep_inetd (line 51) | void w_listener_prep_inetd() {
  function FileDescriptor (line 66) | static FileDescriptor get_listener_unix_domain_socket(const char* path) {
  function FileDescriptor (line 172) | static FileDescriptor create_pipe_server(const char* path) {
  function named_pipe_accept_loop_internal (line 186) | static void named_pipe_accept_loop_internal(
  function named_pipe_accept_loop (line 256) | static void named_pipe_accept_loop() {
  class AcceptLoop (line 278) | class AcceptLoop {
    method AcceptLoop (line 283) | AcceptLoop(std::string name, FileDescriptor&& fd) {
    method AcceptLoop (line 298) | AcceptLoop(const AcceptLoop&) = delete;
    method AcceptLoop (line 299) | AcceptLoop& operator=(const AcceptLoop&) = delete;
    method AcceptLoop (line 301) | AcceptLoop(AcceptLoop&& other) {
    method AcceptLoop (line 305) | AcceptLoop& operator=(AcceptLoop&& other) {
    method join (line 320) | void join() {
    method accept_thread (line 329) | static void accept_thread(
  function w_start_listener (line 385) | bool w_start_listener() {
  function UntypedResponse (line 573) | static UntypedResponse cmd_get_pid(Client*, const json_ref&) {

FILE: watchman/main.cpp
  function detect_low_process_priority (line 86) | void detect_low_process_priority() {
  function detect_starting_command (line 112) | std::optional<std::string> detect_starting_command(pid_t ppid) {
  function run_service (line 129) | [[noreturn]] static void run_service(ProcessLock::Handle&&, pid_t ppid) {
  function close_random_fds (line 228) | static void close_random_fds() {
  function run_service_in_foreground (line 275) | [[noreturn]] static void run_service_in_foreground() {
  type SpawnResult (line 285) | struct [[nodiscard]] SpawnResult {
    type Status (line 286) | enum Status {
    method SpawnResult (line 291) | SpawnResult() = delete;
    method SpawnResult (line 293) | SpawnResult(Status s, std::string r = {})
    method exitIfFailed (line 296) | void exitIfFailed() {
  function SpawnResult (line 316) | static SpawnResult run_service_as_daemon() {
    type Status (line 286) | enum Status {
    method SpawnResult (line 291) | SpawnResult() = delete;
    method SpawnResult (line 293) | SpawnResult(Status s, std::string r = {})
    method exitIfFailed (line 296) | void exitIfFailed() {
  function SpawnResult (line 359) | static SpawnResult spawn_win32(const std::vector<std::string>& daemon_ar...
    type Status (line 286) | enum Status {
    method SpawnResult (line 291) | SpawnResult() = delete;
    method SpawnResult (line 293) | SpawnResult(Status s, std::string r = {})
    method exitIfFailed (line 296) | void exitIfFailed() {
  function SpawnResult (line 399) | static SpawnResult spawn_site_specific(
    type Status (line 286) | enum Status {
    method SpawnResult (line 291) | SpawnResult() = delete;
    method SpawnResult (line 293) | SpawnResult(Status s, std::string r = {})
    method exitIfFailed (line 296) | void exitIfFailed() {
  function escape_args_for_sh (line 456) | std::vector<std::string> escape_args_for_sh(
  function prep_args_for_plist (line 467) | std::string prep_args_for_plist(
  function SpawnResult (line 479) | static SpawnResult spawn_via_launchd() {
    type Status (line 286) | enum Status {
    method SpawnResult (line 291) | SpawnResult() = delete;
    method SpawnResult (line 293) | SpawnResult(Status s, std::string r = {})
    method exitIfFailed (line 296) | void exitIfFailed() {
  function parse_encoding (line 616) | static void parse_encoding(std::string_view enc, PduType* pdu) {
  function initialize_winsock (line 637) | bool initialize_winsock() {
  function initialize_uds (line 646) | bool initialize_uds() {
  function setup_sock_name (line 666) | static void setup_sock_name() {
  function try_command (line 746) | static ResultErrno<folly::Unit> try_command(
  function try_client_mode_command (line 771) | static bool try_client_mode_command(const Command& command, bool pretty) {
  function parse_cmdline (line 788) | static std::vector<std::string> parse_cmdline(int* argcp, char*** argvp) {
  function Command (line 810) | static Command build_command_from_stdin() {
  function Command (line 850) | static Command build_command(int argc, char** argv) {
  function SpawnResult (line 872) | static SpawnResult try_spawn_watchman(
    type Status (line 286) | enum Status {
    method SpawnResult (line 291) | SpawnResult() = delete;
    method SpawnResult (line 293) | SpawnResult(Status s, std::string r = {})
    method exitIfFailed (line 296) | void exitIfFailed() {
  function inner_main (line 911) | static int inner_main(int argc, char** argv) {
  function main (line 1038) | int main(int argc, char** argv) {

FILE: watchman/node/bser/index.js
  function nextPow2 (line 20) | function nextPow2(size) {
  function Accumulator (line 25) | function Accumulator(initsize) {
  function BunserBuf (line 220) | function BunserBuf() {
  function loadFromBuffer (line 439) | function loadFromBuffer(input) {
  function byteswap64 (line 456) | function byteswap64(buf) {
  function dump_int64 (line 464) | function dump_int64(buf, val) {
  function dump_int (line 481) | function dump_int(buf, val) {
  function dump_any (line 497) | function dump_any(buf, val) {
  function dumpToBuffer (line 570) | function dumpToBuffer(val) {

FILE: watchman/node/bser/test/bser.js
  function roundtrip (line 26) | function roundtrip(val) {

FILE: watchman/node/bser/test_bser.py
  class BserTestCase (line 22) | class BserTestCase(unittest.TestCase):
    method runTest (line 26) | def runTest(self):

FILE: watchman/node/index.js
  class WatchmanError (line 46) | class WatchmanError extends Error {
  class Client (line 56) | class Client extends EventEmitter {
    method constructor (line 64) | constructor(options /*: Options */) {
    method sendNextCommand (line 75) | sendNextCommand() {
    method cancelCommands (line 97) | cancelCommands(why /*: string*/) {
    method connect (line 116) | connect() {
    method command (line 277) | command(args /*: mixed*/, done /*: CommandCallback */ = () => {}) {
    method _synthesizeCapabilityCheck (line 296) | _synthesizeCapabilityCheck /*:: <T: { capabilities?: ?{[key: string]: ...
    method capabilityCheck (line 320) | capabilityCheck(
    method end (line 356) | end() {
  function vers_compare (line 376) | function vers_compare(aStr /*:string*/, bStr /*:string*/) {
  function have_cap (line 388) | function have_cap(vers /*:string */, name /*:string*/) {

FILE: watchman/portability/Backtrace.cpp
  function sym_init (line 41) | static void sym_init() {
  function backtrace (line 49) | size_t backtrace(void** frames, size_t n_frames) {
  function backtrace_from_exception (line 131) | size_t backtrace_from_exception(

FILE: watchman/portability/Backtrace.h
  type _EXCEPTION_POINTERS (line 17) | struct _EXCEPTION_POINTERS

FILE: watchman/portability/PosixSpawn.cpp
  function pid_t (line 23) | pid_t waitpid(pid_t pid, int* status, int options) {
  function posix_spawnattr_init (line 58) | int posix_spawnattr_init(posix_spawnattr_t* attrp) {
  function posix_spawnattr_setflags (line 63) | int posix_spawnattr_setflags(posix_spawnattr_t* attrp, short flags) {
  function posix_spawnattr_getflags (line 68) | int posix_spawnattr_getflags(posix_spawnattr_t* attrp, short* flags) {
  function posix_spawnattr_setcwd_np (line 73) | int posix_spawnattr_setcwd_np(posix_spawnattr_t* attrp, const char* path) {
  function posix_spawnattr_destroy (line 88) | int posix_spawnattr_destroy(posix_spawnattr_t* attrp) {
  function posix_spawn_file_actions_init (line 93) | int posix_spawn_file_actions_init(posix_spawn_file_actions_t* actions) {
  function posix_spawn_file_actions_adddup2 (line 98) | int posix_spawn_file_actions_adddup2(
  function posix_spawn_file_actions_adddup2_handle_np (line 117) | int posix_spawn_file_actions_adddup2_handle_np(
  function posix_spawn_file_actions_addopen (line 136) | int posix_spawn_file_actions_addopen(
  function posix_spawn_file_actions_destroy (line 165) | int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t* actions) {
  function posix_spawn_common (line 270) | static int posix_spawn_common(
  function posix_spawn (line 479) | int posix_spawn(
  function posix_spawnp (line 489) | int posix_spawnp(

FILE: watchman/portability/PosixSpawn.h
  type posix_spawnattr_t (line 21) | typedef struct _posix_spawnattr {
  type _posix_spawn_file_action (line 36) | struct _posix_spawn_file_action {
  type posix_spawn_file_actions_t (line 50) | typedef struct _posix_spawn_file_actions {

FILE: watchman/portability/WinError.cpp
  function map_win32_err (line 29) | int map_win32_err(uint32_t err) {

FILE: watchman/python/pywatchman/__init__.py
  function log (line 79) | def log(fmt, *args):
  function log (line 88) | def log(fmt, *args):
  function _win32_strerror (line 92) | def _win32_strerror(err):
  class WatchmanError (line 114) | class WatchmanError(Exception):
    method __init__ (line 126) | def __init__(self, msg=None, cmd=None):
    method setCommand (line 130) | def setCommand(self, cmd):
    method __str__ (line 133) | def __str__(self):
  class BSERv1Unsupported (line 139) | class BSERv1Unsupported(WatchmanError):
  class UseAfterFork (line 143) | class UseAfterFork(WatchmanError):
  class WatchmanEnvironmentError (line 147) | class WatchmanEnvironmentError(WatchmanError):
    method __init__ (line 148) | def __init__(self, msg, errno, errmsg, cmd=None):
  class SocketConnectError (line 154) | class SocketConnectError(WatchmanError):
    method __init__ (line 155) | def __init__(self, sockpath, exc):
  class SocketTimeout (line 163) | class SocketTimeout(WatchmanError):
  class CommandError (line 173) | class CommandError(WatchmanError):
    method __init__ (line 179) | def __init__(self, msg, cmd=None):
  function is_named_pipe_path (line 183) | def is_named_pipe_path(path: str) -> bool:
  class SockPath (line 188) | class SockPath:
    method __init__ (line 195) | def __init__(
    method legacy_sockpath (line 212) | def legacy_sockpath(self):
  class Transport (line 221) | class Transport:
    method close (line 226) | def close(self):
    method readBytes (line 230) | def readBytes(self, size):
    method write (line 234) | def write(self, buf):
    method setTimeout (line 238) | def setTimeout(self, value):
    method readLine (line 241) | def readLine(self):
  class Codec (line 266) | class Codec:
    method __init__ (line 271) | def __init__(self, transport):
    method receive (line 274) | def receive(self):
    method send (line 277) | def send(self, *args):
    method setTimeout (line 280) | def setTimeout(self, value):
  class SocketTransport (line 284) | class SocketTransport(Transport):
    method __init__ (line 290) | def __init__(self):
    method close (line 293) | def close(self):
    method setTimeout (line 298) | def setTimeout(self, value):
    method readBytes (line 302) | def readBytes(self, size):
    method write (line 311) | def write(self, data):
  class UnixSocketTransport (line 319) | class UnixSocketTransport(SocketTransport):
    method __init__ (line 322) | def __init__(self, sockpath, timeout):
  class WindowsUnixSocketTransport (line 337) | class WindowsUnixSocketTransport(SocketTransport):
    method __init__ (line 343) | def __init__(self, sockpath, timeout):
  class TcpSocketTransport (line 360) | class TcpSocketTransport(SocketTransport):
    method __init__ (line 363) | def __init__(self, sockpath, timeout):
  function _get_overlapped_result_ex_impl (line 393) | def _get_overlapped_result_ex_impl(pipe, olap, nbytes, millis, alertable):
  class WindowsNamedPipeTransport (line 433) | class WindowsNamedPipeTransport(Transport):
    method __init__ (line 436) | def __init__(self, sockpath, timeout):
    method _raise_win_err (line 475) | def _raise_win_err(self, msg, err):
    method _make_win_err (line 478) | def _make_win_err(self, msg, err):
    method close (line 481) | def close(self):
    method setTimeout (line 492) | def setTimeout(self, value):
    method readBytes (line 496) | def readBytes(self, size):
    method write (line 564) | def write(self, data):
  function _default_binpath (line 599) | def _default_binpath(binpath=None) -> str:
  class CLIProcessTransport (line 608) | class CLIProcessTransport(Transport):
    method __init__ (line 631) | def __init__(self, sockpath, timeout, binpath=None):
    method close (line 636) | def close(self):
    method _connect (line 645) | def _connect(self):
    method readBytes (line 665) | def readBytes(self, size):
    method write (line 673) | def write(self, data):
  class BserCodec (line 685) | class BserCodec(Codec):
    method __init__ (line 688) | def __init__(self, transport, value_encoding, value_errors):
    method _loads (line 693) | def _loads(self, response):
    method receive (line 700) | def receive(self):
    method send (line 719) | def send(self, *args):
  class ImmutableBserCodec (line 724) | class ImmutableBserCodec(BserCodec):
    method _loads (line 728) | def _loads(self, response):
  class Bser2WithFallbackCodec (line 737) | class Bser2WithFallbackCodec(BserCodec):
    method __init__ (line 740) | def __init__(self, transport, value_encoding, value_errors):
    method receive (line 763) | def receive(self):
    method send (line 787) | def send(self, *args):
  class ImmutableBser2Codec (line 797) | class ImmutableBser2Codec(Bser2WithFallbackCodec, ImmutableBserCodec):
  class JsonCodec (line 804) | class JsonCodec(Codec):
    method __init__ (line 809) | def __init__(self, transport):
    method receive (line 816) | def receive(self):
    method send (line 830) | def send(self, *args):
  class client (line 839) | class client:
    method __init__ (line 856) | def __init__(
    method _makeBSERCodec (line 929) | def _makeBSERCodec(self, codec):
    method _parseEncoding (line 935) | def _parseEncoding(self, enc):
    method _hasprop (line 951) | def _hasprop(self, result, name):
    method _resolvesockname (line 956) | def _resolvesockname(self):
    method _connect (line 1009) | def _connect(self):
    method __del__ (line 1031) | def __del__(self):
    method __enter__ (line 1034) | def __enter__(self):
    method __exit__ (line 1038) | def __exit__(self, exc_type, exc_value, exc_traceback):
    method close (line 1041) | def close(self):
    method receive (line 1048) | def receive(self):
    method isUnilateralResponse (line 1087) | def isUnilateralResponse(self, res):
    method getLog (line 1096) | def getLog(self, remove=True):
    method getSubscription (line 1107) | def getSubscription(self, name, remove=True, root=None):
    method query (line 1142) | def query(self, *args):
    method capabilityCheck (line 1174) | def capabilityCheck(self, optional=None, required=None):
    method listCapabilities (line 1188) | def listCapabilities(self):
    method setTimeout (line 1191) | def setTimeout(self, value):

FILE: watchman/python/pywatchman/bser.c
  function Py_ssize_t (line 10) | static Py_ssize_t bserobj_tuple_length(PyObject* o) {
  function PyObject (line 16) | static PyObject* bserobj_tuple_item(PyObject* o, Py_ssize_t i) {
  function bserobj_dealloc (line 35) | static void bserobj_dealloc(PyObject* o) {
  function PyObject (line 43) | static PyObject* bserobj_getattrro(PyObject* o, PyObject* name) {
  function bunser_int (line 164) | int bunser_int(const char** ptr, const char* end, int64_t* val) {
  function bunser_bytestring (line 222) | static int bunser_bytestring(
  function PyObject (line 245) | static PyObject*
  function PyObject (line 301) | static PyObject*
  function PyObject (line 394) | static PyObject*
  function PyObject (line 524) | PyObject* bser_loads_recursive(

FILE: watchman/python/pywatchman/bser.h
  type bserObject (line 44) | typedef struct {
  type unser_ctx_t (line 52) | typedef struct loads_ctx {

FILE: watchman/python/pywatchman/bsermodule.c
  type __int8 (line 18) | typedef __int8 int8_t;
  type __int16 (line 19) | typedef __int16 int16_t;
  type __int32 (line 20) | typedef __int32 int32_t;
  type __int64 (line 21) | typedef __int64 int64_t;
  function next_power_2 (line 47) | static inline uint32_t next_power_2(uint32_t n) {
  type bser_buffer (line 57) | struct bser_buffer {
  type bser_t (line 64) | typedef struct bser_buffer bser_t;
  function bser_append (line 66) | static int bser_append(bser_t* bser, const char* data, uint32_t len) {
  function bser_init (line 96) | static int bser_init(bser_t* bser, uint32_t version, uint32_t capabiliti...
  function bser_dtor (line 123) | static void bser_dtor(bser_t* bser) {
  function bser_long (line 128) | static int bser_long(bser_t* bser, int64_t val) {
  function bser_bytestring (line 170) | static int bser_bytestring(bser_t* bser, PyObject* sval) {
  function bser_recursive (line 213) | static int bser_recursive(bser_t* bser, PyObject* val) {
  function PyObject (line 324) | static PyObject* bser_dumps(PyObject* self, PyObject* args, PyObject* kw) {
  function _pdu_info_helper (line 374) | static int _pdu_info_helper(
  function pdu_info_helper (line 423) | static int pdu_info_helper(
  function PyObject (line 462) | static PyObject* bser_pdu_info(PyObject* self, PyObject* args) {
  function PyObject (line 471) | static PyObject* bser_pdu_len(PyObject* self, PyObject* args) {
  function PyObject (line 480) | static PyObject* bser_loads(PyObject* self, PyObject* args, PyObject* kw) {
  function PyObject (line 544) | static PyObject* bser_load(PyObject* self, PyObject* args, PyObject* kw) {
  type PyModuleDef (line 643) | struct PyModuleDef
  function PyMODINIT_FUNC (line 652) | PyMODINIT_FUNC PyInit_bser(void) {
  function PyMODINIT_FUNC (line 662) | PyMODINIT_FUNC initbser(void) {

FILE: watchman/python/pywatchman/capabilities.py
  function parse_version (line 9) | def parse_version(vstr) -> int:
  function check (line 27) | def check(version, name: str):
  function synthesize (line 33) | def synthesize(vers, opts):

FILE: watchman/python/pywatchman/encoding.py
  function get_local_encoding (line 19) | def get_local_encoding() -> str:
  function encode_local (line 28) | def encode_local(s):
  function decode_local (line 32) | def decode_local(bs):

FILE: watchman/python/pywatchman/load.py
  function _read_bytes (line 21) | def _read_bytes(fp, buf):
  function load (line 45) | def load(fp, mutable: bool = True, value_encoding=None, value_errors=None):

FILE: watchman/python/pywatchman/pybser.py
  function tobytes (line 34) | def tobytes(i):
  function _int_size (line 47) | def _int_size(x) -> int:
  function _buf_pos (line 61) | def _buf_pos(buf, pos) -> bytes:
  class _bser_buffer (line 69) | class _bser_buffer:
    method __init__ (line 70) | def __init__(self, version):
    method ensure_size (line 85) | def ensure_size(self, size):
    method append_long (line 94) | def append_long(self, val):
    method append_string (line 110) | def append_string(self, s):
    method append_recursive (line 161) | def append_recursive(self, val):
  function dumps (line 247) | def dumps(obj, version: int = 1, capabilities: int = 0):
  class _BunserDict (line 268) | class _BunserDict:
    method __init__ (line 271) | def __init__(self, keys, values):
    method __getattr__ (line 275) | def __getattr__(self, name):
    method __getitem__ (line 278) | def __getitem__(self, key):
    method __len__ (line 290) | def __len__(self):
  class Bunser (line 294) | class Bunser:
    method __init__ (line 295) | def __init__(self, mutable=True, value_encoding=None, value_errors=None):
    method unser_int (line 307) | def unser_int(buf, pos):
    method unser_utf8_string (line 332) | def unser_utf8_string(self, buf, pos):
    method unser_bytestring (line 337) | def unser_bytestring(self, buf, pos):
    method unser_array (line 345) | def unser_array(self, buf, pos):
    method unser_object (line 357) | def unser_object(self, buf, pos):
    method unser_template (line 379) | def unser_template(self, buf, pos):
    method loads_recursive (line 413) | def loads_recursive(self, buf, pos):
  function _pdu_info_helper (line 448) | def _pdu_info_helper(buf):
  function pdu_info (line 466) | def pdu_info(buf):
  function pdu_len (line 471) | def pdu_len(buf):
  function loads (line 476) | def loads(buf, mutable: bool = True, value_encoding=None, value_errors=N...
  function load (line 511) | def load(fp, mutable: bool = True, value_encoding=None, value_errors=None):

FILE: watchman/python/pywatchman/windows.py
  class OVERLAPPED (line 43) | class OVERLAPPED(ctypes.Structure):
    method __init__ (line 52) | def __init__(self):
  class WSAData64 (line 193) | class WSAData64(ctypes.Structure):
  class SOCKADDR_UN (line 210) | class SOCKADDR_UN(ctypes.Structure):
  class WindowsSocketException (line 214) | class WindowsSocketException(Exception):
    method __init__ (line 215) | def __init__(self, code: int) -> None:
  class WindowsSocketHandle (line 221) | class WindowsSocketHandle:
    method _checkReturnCode (line 229) | def _checkReturnCode(retcode):
    method __init__ (line 236) | def __init__(self):
    method fileno (line 248) | def fileno(self) -> int:
    method settimeout (line 251) | def settimeout(self, timeout: int) -> None:
    method connect (line 271) | def connect(self, address: str) -> None:
    method send (line 280) | def send(self, buff: bytes) -> int:
    method sendall (line 285) | def sendall(self, buff: bytes) -> None:
    method recv (line 294) | def recv(self, size: int) -> bytes:
    method getpeername (line 300) | def getpeername(self) -> str:
    method getsockname (line 303) | def getsockname(self) -> str:
    method close (line 306) | def close(self) -> int:

FILE: watchman/python/pywatchman_aio/__init__.py
  function _resolve_sockname_helper (line 33) | def _resolve_sockname_helper():
  function _resolve_sockname (line 66) | async def _resolve_sockname():
  class AsyncTransport (line 72) | class AsyncTransport:
    method activate (line 75) | async def activate(self, **kwargs):
    method read (line 79) | async def read(self, size):
    method write (line 83) | async def write(self, buf):
    method close (line 87) | def close(self):
  class AsyncUnixSocketTransport (line 92) | class AsyncUnixSocketTransport(AsyncTransport):
    method __init__ (line 95) | def __init__(self):
    method activate (line 100) | async def activate(self, **kwargs):
    method write (line 106) | async def write(self, data):
    method read (line 110) | async def read(self, size):
    method close (line 116) | def close(self):
  class AsyncCodec (line 121) | class AsyncCodec:
    method __init__ (line 124) | def __init__(self, transport):
    method receive (line 127) | async def receive(self):
    method send (line 131) | async def send(self, *args):
    method close (line 135) | def close(self):
  class AsyncBserCodec (line 142) | class AsyncBserCodec(AsyncCodec):
    method receive (line 145) | async def receive(self):
    method send (line 164) | async def send(self, *args):
    method _loads (line 168) | def _loads(self, response):
  class ReceiveLoopError (line 178) | class ReceiveLoopError(Exception):
  class AIOClient (line 182) | class AIOClient:
    method __init__ (line 201) | def __init__(self, connection):
    method __enter__ (line 210) | def __enter__(self):
    method __exit__ (line 213) | def __exit__(self, type, value, traceback):
    method receive_bilateral_response (line 217) | async def receive_bilateral_response(self):
    method query (line 225) | async def query(self, *args):
    method capability_check (line 236) | async def capability_check(self, optional=None, required=None):
    method get_subscription (line 245) | async def get_subscription(self, name, root):
    method pop_log (line 261) | async def pop_log(self):
    method close (line 268) | def close(self):
    method enable_receiving (line 276) | def enable_receiving(self, loop=None):
    method from_socket (line 292) | async def from_socket(cls, sockname: typing.Optional[str] = None) -> "...
    method _receive_loop (line 309) | async def _receive_loop(self):
    method _broadcast_exception (line 330) | async def _broadcast_exception(self, ex):
    method _check_error (line 337) | def _check_error(self, res):
    method _check_receive_loop (line 343) | def _check_receive_loop(self):
    method _is_unilateral (line 349) | def _is_unilateral(self, res):
    method _ensure_subscription_queue_exists (line 352) | def _ensure_subscription_queue_exists(self, name, root):
    method _process_unilateral_response (line 357) | async def _process_unilateral_response(self, response):

FILE: watchman/python/tests/tests.py
  class TestSocketTimeout (line 44) | class TestSocketTimeout(unittest.TestCase):
    method test_exception_handling (line 45) | def test_exception_handling(self):
  class TestTransportErrorHandling (line 52) | class TestTransportErrorHandling(unittest.TestCase):
    method test_transport_error (line 53) | def test_transport_error(self):
  class TestLocalTransport (line 100) | class TestLocalTransport(unittest.TestCase):
    method test_missing_socket_file_raises_connect_error (line 101) | def test_missing_socket_file_raises_connect_error(self):
    method make_deleted_socket_path (line 108) | def make_deleted_socket_path(self):
    method make_deleted_windows_socket_path (line 116) | def make_deleted_windows_socket_path(self):
    method make_deleted_unix_socket_path (line 119) | def make_deleted_unix_socket_path(self):
  function expand_bser_mods (line 124) | def expand_bser_mods(test_class):
  class FakeFile (line 156) | class FakeFile:
    method __init__ (line 157) | def __init__(self, data):
    method readinto (line 161) | def readinto(self, buf):
  class TestBSERDump (line 171) | class TestBSERDump(unittest.TestCase):
    method setUp (line 172) | def setUp(self):
    method raw (line 175) | def raw(self, structured_input, bser_output):
    method roundtrip (line 179) | def roundtrip(self, val, mutable=True, value_encoding=None, value_erro...
    method munged (line 194) | def munged(self, val, munged, value_encoding=None, value_errors=None):
    method test_raw (line 203) | def test_raw(self):
    method test_int (line 223) | def test_int(self):
    method test_negative_int (line 230) | def test_negative_int(self):
    method test_float (line 236) | def test_float(self):
    method test_bool (line 239) | def test_bool(self):
    method test_none (line 243) | def test_none(self):
    method test_string (line 246) | def test_string(self):
    method test_list (line 288) | def test_list(self):
    method test_tuple (line 292) | def test_tuple(self):
    method test_dict (line 296) | def test_dict(self):
    method assertItemAttributes (line 339) | def assertItemAttributes(self, dictish, attrish):
    method test_template (line 345) | def test_template(self):
    method test_pdu_info (line 367) | def test_pdu_info(self):
    method test_pdu_len (line 385) | def test_pdu_len(self):
    method test_garbage (line 395) | def test_garbage(self):
    method test_string_lengths (line 404) | def test_string_lengths(self):
    method test_big_string_lengths (line 422) | def test_big_string_lengths(self):
    method test_fuzz_examples (line 431) | def test_fuzz_examples(self):

FILE: watchman/query/FileResult.cpp
  type watchman (line 10) | namespace watchman {

FILE: watchman/query/FileResult.h
  type NotSymlink (line 18) | struct NotSymlink {}
  function Properties (line 85) | enum Property : Properties {

FILE: watchman/query/GlobEscaping.cpp
  type watchman (line 11) | namespace watchman {
    function w_string (line 12) | w_string convertLiteralPathToGlob(w_string_piece literal) {
    function w_string (line 29) | w_string convertNoEscapeGlobToGlob(w_string_piece noescapePattern) {

FILE: watchman/query/GlobEscaping.h
  function namespace (line 12) | namespace watchman {

FILE: watchman/query/GlobTree.cpp
  type watchman (line 13) | namespace watchman {

FILE: watchman/query/GlobTree.h
  function namespace (line 15) | namespace watchman {

FILE: watchman/query/LocalFileResult.cpp
  type watchman (line 11) | namespace watchman {
    type timespec (line 51) | struct timespec
    type timespec (line 59) | struct timespec
    type timespec (line 67) | struct timespec
    function w_string_piece (line 75) | w_string_piece LocalFileResult::baseName() {
    function w_string_piece (line 79) | w_string_piece LocalFileResult::dirName() {

FILE: watchman/query/LocalFileResult.h
  function namespace (line 16) | namespace watchman {

FILE: watchman/query/Query.cpp
  type watchman (line 12) | namespace watchman {

FILE: watchman/query/Query.h
  function namespace (line 17) | namespace watchman {

FILE: watchman/query/QueryContext.cpp
  function file_result_to_json (line 24) | std::optional<json_ref> file_result_to_json(
  function w_string (line 51) | const w_string& QueryContext::getWholeName() {
  function w_string (line 58) | w_string QueryContext::computeWholeName(FileResult* file) const {
  function RenderResult (line 147) | RenderResult QueryContext::renderResults() {

FILE: watchman/query/QueryContext.h
  type watchman_file (line 16) | struct watchman_file
  type Query (line 21) | struct Query
  type class (line 24) | enum class
  type QueryContext (line 34) | struct QueryContext
  function generationStarted (line 53) | void generationStarted() {
  function num_deduped (line 77) | uint32_t num_deduped{0}
  function disableFreshInstance (line 80) | bool disableFreshInstance{false};

FILE: watchman/query/QueryExpr.h
  function namespace (line 16) | namespace watchman {

FILE: watchman/query/QueryResult.cpp
  type watchman (line 10) | namespace watchman {
    function json_ref (line 12) | json_ref RenderResult::toJson() && {
    function json_ref (line 20) | json_ref QueryDebugInfo::render() const {

FILE: watchman/query/QueryResult.h
  function namespace (line 16) | namespace watchman {

FILE: watchman/query/TermRegistry.cpp
  type watchman (line 14) | namespace watchman {
    type RegisteredParser (line 18) | struct RegisteredParser {
    type Init (line 30) | struct Init {
      method Init (line 31) | Init() {
  function QueryExprParser (line 42) | QueryExprParser getQueryExprParser(const w_string& name) {
  function parseQueryExpr (line 55) | std::unique_ptr<QueryExpr> parseQueryExpr(Query* query, const json_ref& ...

FILE: watchman/query/TermRegistry.h
  function namespace (line 12) | namespace watchman {

FILE: watchman/query/base.cpp
  class NotExpr (line 21) | class NotExpr : public QueryExpr {
    method NotExpr (line 25) | explicit NotExpr(std::unique_ptr<QueryExpr> other_expr)
    method EvaluateResult (line 28) | EvaluateResult evaluate(QueryContextBase* ctx, FileResult* file) overr...
    method parse (line 36) | static std::unique_ptr<QueryExpr> parse(Query* query, const json_ref& ...
    method computeGlobUpperBound (line 47) | std::optional<std::vector<std::string>> computeGlobUpperBound(
    method ReturnOnlyFiles (line 58) | ReturnOnlyFiles listOnlyFiles() const override {
    method SimpleSuffixType (line 68) | SimpleSuffixType evaluateSimpleSuffix() const override
Copy disabled (too large) Download .json
Condensed preview — 896 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,503K chars).
[
  {
    "path": ".gitattributes",
    "chars": 27,
    "preview": "* text eol=lf\n*.png binary\n"
  },
  {
    "path": ".github/workflows/generate-release-yml.rs",
    "chars": 4461,
    "preview": "#!/usr/bin/env rust-script\n//! Copyright (c) Meta Platforms, Inc. and affiliates.\n//!\n//! This source code is licensed u"
  },
  {
    "path": ".github/workflows/getdeps_linux.yml",
    "chars": 37908,
    "preview": "# This file was @generated by getdeps.py\n\nname: linux\n\non:\n  push:\n    branches:\n    - main\n  pull_request:\n    branches"
  },
  {
    "path": ".github/workflows/getdeps_mac.yml",
    "chars": 34576,
    "preview": "# This file was @generated by getdeps.py\n\nname: mac\n\non:\n  push:\n    branches:\n    - main\n  pull_request:\n    branches:\n"
  },
  {
    "path": ".github/workflows/getdeps_windows.yml",
    "chars": 30662,
    "preview": "# This file was @generated by getdeps.py\n\nname: windows\n\non:\n  push:\n    branches:\n    - main\n  pull_request:\n    branch"
  },
  {
    "path": ".github/workflows/package.yml",
    "chars": 1522,
    "preview": "name: package\n\non: push\n\njobs:\n  docker-ubuntu:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout code\n      "
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 14774,
    "preview": "# @generated by generate-release-yml.rs\n---\nname: release\n\"on\":\n  push:\n    tags:\n      - v*\npermissions:\n  contents: wr"
  },
  {
    "path": ".github/workflows/release.yml.in",
    "chars": 9465,
    "preview": "name: release\n\non:\n  push:\n    tags:\n      - v*\n\npermissions:\n  contents: write  #  to create a release\n  packages: writ"
  },
  {
    "path": ".gitignore",
    "chars": 1196,
    "preview": "/built/\n/external\nbuck-out\nbuck-cache\n.buckd\n.idea\n*.iml\n/Makefile.in\n/test-driver\n/aclocal.m4\n/autom4te.cache/\n/configu"
  },
  {
    "path": "CMakeLists.txt",
    "chars": 25463,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3356,
    "preview": "# Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1710,
    "preview": "# Contributing to watchman\nWe want to make contributing to this project as easy and transparent as\npossible.\n\n## Our Dev"
  },
  {
    "path": "LICENSE",
    "chars": 1092,
    "preview": "MIT License\n\nCopyright (c) Meta Platforms, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to an"
  },
  {
    "path": "README.markdown",
    "chars": 1219,
    "preview": "<div align=\"center\">\n <img src=\"website/static/img/logo.png\" width=\"20%\" height=\"20%\" alt=\"watchman-logo\">\n <h1>Watchman"
  },
  {
    "path": "autogen.cmd",
    "chars": 366,
    "preview": "@ECHO OFF\n\npython3 build/fbcode_builder/getdeps.py build --src-dir=. watchman \"--project-install-prefix=watchman:%userpr"
  },
  {
    "path": "autogen.sh",
    "chars": 697,
    "preview": "#!/bin/bash -e\n# vim:ts=2:sw=2:et:\n# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed"
  },
  {
    "path": "build/deps/github_hashes/facebook/fb303-rev.txt",
    "chars": 59,
    "preview": "Subproject commit 9d35ae460081808d28949a581898c3fd1b468648\n"
  },
  {
    "path": "build/deps/github_hashes/facebook/fbthrift-rev.txt",
    "chars": 59,
    "preview": "Subproject commit 4e81edbcf9740e628a26159d1779b27b1c457e98\n"
  },
  {
    "path": "build/deps/github_hashes/facebook/folly-rev.txt",
    "chars": 59,
    "preview": "Subproject commit 4321dae73b18961089fc62532ee6dc011cbf1915\n"
  },
  {
    "path": "build/deps/github_hashes/facebook/mvfst-rev.txt",
    "chars": 59,
    "preview": "Subproject commit b229e95977aa5d4c271da60775f2b4bdbc40262a\n"
  },
  {
    "path": "build/deps/github_hashes/facebook/wangle-rev.txt",
    "chars": 59,
    "preview": "Subproject commit dbe97d189ad17a732477ecf4defdcf8cdac2c013\n"
  },
  {
    "path": "build/deps/github_hashes/facebookexperimental/edencommon-rev.txt",
    "chars": 59,
    "preview": "Subproject commit 9d4731a59818eca38557fbf1a9c2c4abdb17b650\n"
  },
  {
    "path": "build/deps/github_hashes/facebookincubator/fizz-rev.txt",
    "chars": 59,
    "preview": "Subproject commit 8d74917ae1e80269c6e8e9da44f9713269d9c2ec\n"
  },
  {
    "path": "build/fbcode_builder/.gitignore",
    "chars": 168,
    "preview": "# Facebook-internal CI builds don't have write permission outside of the\n# source tree, so we install all projects into "
  },
  {
    "path": "build/fbcode_builder/CMake/FBBuildOptions.cmake",
    "chars": 932,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\nfunction (fb_activate_static_library_option)\n  option(USE_STATIC_DEP"
  },
  {
    "path": "build/fbcode_builder/CMake/FBCMakeParseArgs.cmake",
    "chars": 5919,
    "preview": "#\n# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# Helper function for parsing arguments to a CMake function.\n#\n# "
  },
  {
    "path": "build/fbcode_builder/CMake/FBCompilerSettings.cmake",
    "chars": 432,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\n# This file applies common compiler settings that are shared across\n"
  },
  {
    "path": "build/fbcode_builder/CMake/FBCompilerSettingsMSVC.cmake",
    "chars": 499,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\n# This file applies common compiler settings that are shared across\n"
  },
  {
    "path": "build/fbcode_builder/CMake/FBCompilerSettingsUnix.cmake",
    "chars": 442,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\n# This file applies common compiler settings that are shared across\n"
  },
  {
    "path": "build/fbcode_builder/CMake/FBPythonBinary.cmake",
    "chars": 26829,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\ninclude(FBCMakeParseArgs)\n\n#\n# This file contains helper functions f"
  },
  {
    "path": "build/fbcode_builder/CMake/FBPythonTestAddTests.cmake",
    "chars": 1768,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\n# Add a command to be emitted to the CTest file\nset(ctest_script)\nfu"
  },
  {
    "path": "build/fbcode_builder/CMake/FBThriftCppLibrary.cmake",
    "chars": 6967,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\ninclude(FBCMakeParseArgs)\n\n# Generate a C++ library from a thrift fi"
  },
  {
    "path": "build/fbcode_builder/CMake/FBThriftLibrary.cmake",
    "chars": 2331,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\ninclude(FBCMakeParseArgs)\ninclude(FBThriftPyLibrary)\ninclude(FBThrif"
  },
  {
    "path": "build/fbcode_builder/CMake/FBThriftPyLibrary.cmake",
    "chars": 3699,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\ninclude(FBCMakeParseArgs)\ninclude(FBPythonBinary)\n\n# Generate a Pyth"
  },
  {
    "path": "build/fbcode_builder/CMake/FindCares.cmake",
    "chars": 833,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n# All rights reserved.\n#\n# This source code is licensed under the B"
  },
  {
    "path": "build/fbcode_builder/CMake/FindDoubleConversion.cmake",
    "chars": 557,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n\n# Finds libdouble-conversion.\n#\n# This module defines:\n# DOUBLE_CO"
  },
  {
    "path": "build/fbcode_builder/CMake/FindGMock.cmake",
    "chars": 2697,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n# Find libgmock\n#\n#  LIBGMOCK_DEFINES     - List of defines when usin"
  },
  {
    "path": "build/fbcode_builder/CMake/FindGflags.cmake",
    "chars": 4227,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n# Find libgflags.\n# There's a lot of compatibility cruft going on in "
  },
  {
    "path": "build/fbcode_builder/CMake/FindGlog.cmake",
    "chars": 1755,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n# - Try to find Glog\n# Once done, this will define\n#\n# GLOG_FOUND - s"
  },
  {
    "path": "build/fbcode_builder/CMake/FindLMDB.cmake",
    "chars": 536,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This software may be used and distributed according to the term"
  },
  {
    "path": "build/fbcode_builder/CMake/FindLibEvent.cmake",
    "chars": 2772,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n# - Find LibEvent (a cross event library)\n# This module defines\n# LIB"
  },
  {
    "path": "build/fbcode_builder/CMake/FindLibUnwind.cmake",
    "chars": 2559,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
  },
  {
    "path": "build/fbcode_builder/CMake/FindLibiberty.cmake",
    "chars": 1073,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "build/fbcode_builder/CMake/FindPCRE.cmake",
    "chars": 309,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\ninclude(FindPackageHandleStandardArgs)\nfind_path(PCRE_INCLUDE_DIR NAM"
  },
  {
    "path": "build/fbcode_builder/CMake/FindPCRE2.cmake",
    "chars": 379,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\ninclude(FindPackageHandleStandardArgs)\nfind_path(PCRE2_INCLUDE_DIR NA"
  },
  {
    "path": "build/fbcode_builder/CMake/FindRe2.cmake",
    "chars": 538,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# This software may be used and distributed according to the terms "
  },
  {
    "path": "build/fbcode_builder/CMake/FindSodium.cmake",
    "chars": 9918,
    "preview": "# Written in 2016 by Henrik Steffen Gaßmann <henrik@gassmann.onl>\n#\n# To the extent possible under law, the author(s) ha"
  },
  {
    "path": "build/fbcode_builder/CMake/FindXxhash.cmake",
    "chars": 1157,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
  },
  {
    "path": "build/fbcode_builder/CMake/FindZstd.cmake",
    "chars": 1195,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
  },
  {
    "path": "build/fbcode_builder/CMake/Findibverbs.cmake",
    "chars": 3573,
    "preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
  },
  {
    "path": "build/fbcode_builder/CMake/RustStaticLibrary.cmake",
    "chars": 17577,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n\ninclude(FBCMakeParseArgs)\n\nset(\n  USE_CARGO_VENDOR AUTO CACHE STRI"
  },
  {
    "path": "build/fbcode_builder/CMake/fb_py_test_main.py",
    "chars": 25659,
    "preview": "#!/usr/bin/env python\n#\n# Copyright (c) Facebook, Inc. and its affiliates.\n#\n\"\"\"\nThis file contains the main module code"
  },
  {
    "path": "build/fbcode_builder/CMake/fb_py_win_main.c",
    "chars": 3286,
    "preview": "// Copyright (c) Facebook, Inc. and its affiliates.\n\n#define WIN32_LEAN_AND_MEAN\n\n#include <Windows.h>\n#include <stdio.h"
  },
  {
    "path": "build/fbcode_builder/CMake/make_fbpy_archive.py",
    "chars": 11476,
    "preview": "#!/usr/bin/env python3\n#\n# Copyright (c) Facebook, Inc. and its affiliates.\n#\nimport argparse\nimport collections\nimport "
  },
  {
    "path": "build/fbcode_builder/LICENSE",
    "chars": 1086,
    "preview": "MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any pers"
  },
  {
    "path": "build/fbcode_builder/README.md",
    "chars": 1945,
    "preview": "# Easy builds for Facebook projects\n\nThis directory contains tools designed to simplify continuous-integration\n(and othe"
  },
  {
    "path": "build/fbcode_builder/getdeps/__init__.py",
    "chars": 14,
    "preview": "# pyre-strict\n"
  },
  {
    "path": "build/fbcode_builder/getdeps/builder.py",
    "chars": 64005,
    "preview": "#!/usr/bin/env python3\n# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the M"
  },
  {
    "path": "build/fbcode_builder/getdeps/buildopts.py",
    "chars": 29236,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/cache.py",
    "chars": 1588,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/cargo.py",
    "chars": 21723,
    "preview": "#!/usr/bin/env python3\n# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the M"
  },
  {
    "path": "build/fbcode_builder/getdeps/copytree.py",
    "chars": 4566,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/dyndeps.py",
    "chars": 18378,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/envfuncs.py",
    "chars": 7023,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/errors.py",
    "chars": 578,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/expr.py",
    "chars": 5777,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/fetcher.py",
    "chars": 43173,
    "preview": "#!/usr/bin/env python3\n# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the M"
  },
  {
    "path": "build/fbcode_builder/getdeps/include_rewriter.py",
    "chars": 7136,
    "preview": "#!/usr/bin/env python3\n# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the M"
  },
  {
    "path": "build/fbcode_builder/getdeps/load.py",
    "chars": 16241,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/manifest.py",
    "chars": 33167,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/platform.py",
    "chars": 9522,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/py_wheel_builder.py",
    "chars": 11252,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/runcmd.py",
    "chars": 8939,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/subcmd.py",
    "chars": 2265,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/test/expr_test.py",
    "chars": 1817,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/test/fixtures/duplicate/foo",
    "chars": 22,
    "preview": "[manifest]\nname = foo\n"
  },
  {
    "path": "build/fbcode_builder/getdeps/test/fixtures/duplicate/subdir/foo",
    "chars": 22,
    "preview": "[manifest]\nname = foo\n"
  },
  {
    "path": "build/fbcode_builder/getdeps/test/manifest_test.py",
    "chars": 5681,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/test/platform_test.py",
    "chars": 1229,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/test/retry_test.py",
    "chars": 5602,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/test/scratch_test.py",
    "chars": 2750,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps/test/strip_marker_test.py",
    "chars": 4995,
    "preview": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the"
  },
  {
    "path": "build/fbcode_builder/getdeps.py",
    "chars": 61784,
    "preview": "#!/usr/bin/env python3\n# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the M"
  },
  {
    "path": "build/fbcode_builder/manifests/CLI11",
    "chars": 286,
    "preview": "[manifest]\nname = CLI11\n\n[download]\nurl = https://github.com/CLIUtils/CLI11/archive/v2.0.0.tar.gz\nsha256 = 2c672f17bf56e"
  },
  {
    "path": "build/fbcode_builder/manifests/autoconf",
    "chars": 301,
    "preview": "[manifest]\nname = autoconf\n\n[debs]\nautoconf\n\n[homebrew]\nautoconf\n\n[rpms]\nautoconf\n\n[pps]\nautoconf\n\n[download]\nurl = http"
  },
  {
    "path": "build/fbcode_builder/manifests/automake",
    "chars": 330,
    "preview": "[manifest]\nname = automake\n\n[homebrew]\nautomake\n\n[debs]\nautomake\n\n[rpms]\nautomake\n\n[pps]\nautomake\n\n[download]\nurl = http"
  },
  {
    "path": "build/fbcode_builder/manifests/benchmark",
    "chars": 285,
    "preview": "[manifest]\nname = benchmark\n\n[download]\nurl = https://github.com/google/benchmark/archive/refs/tags/v1.8.0.tar.gz\nsha256"
  },
  {
    "path": "build/fbcode_builder/manifests/blake3",
    "chars": 235,
    "preview": "[manifest]\nname = blake3\n\n[download]\nurl = https://github.com/BLAKE3-team/BLAKE3/archive/refs/tags/1.5.1.tar.gz\nsha256 ="
  },
  {
    "path": "build/fbcode_builder/manifests/boost",
    "chars": 2362,
    "preview": "[manifest]\nname = boost\n\n[download.not(os=windows)]\nurl = https://archives.boost.io/release/1.83.0/source/boost_1_83_0.t"
  },
  {
    "path": "build/fbcode_builder/manifests/boost-python",
    "chars": 2476,
    "preview": "[manifest]\nname = boost-python\n\n[download.not(os=windows)]\nurl = https://archives.boost.io/release/1.83.0/source/boost_1"
  },
  {
    "path": "build/fbcode_builder/manifests/bz2",
    "chars": 461,
    "preview": "[manifest]\nname = bz2\n\n[debs]\nlibbz2-dev\nbzip2\n\n[homebrew]\nbzip2\n\n[rpms]\nbzip2-devel\nbzip2\n\n[download]\nurl = https://sou"
  },
  {
    "path": "build/fbcode_builder/manifests/c-ares",
    "chars": 332,
    "preview": "[manifest]\nname = c-ares\n\n[download]\nurl = https://github.com/c-ares/c-ares/releases/download/v1.34.6/c-ares-1.34.6.tar."
  },
  {
    "path": "build/fbcode_builder/manifests/cabal",
    "chars": 290,
    "preview": "[manifest]\nname = cabal\n\n[download.os=linux]\nurl = https://downloads.haskell.org/~cabal/cabal-install-3.6.2.0/cabal-inst"
  },
  {
    "path": "build/fbcode_builder/manifests/cachelib",
    "chars": 1073,
    "preview": "[manifest]\nname = cachelib\nfbsource_path = fbcode/cachelib\nshipit_project = cachelib\nshipit_fbcode_builder = true\n\n[git]"
  },
  {
    "path": "build/fbcode_builder/manifests/cinderx-3_14",
    "chars": 507,
    "preview": "[manifest]\nname = cinderx-3_14\nfbsource_path = fbcode/cinderx\nshipit_project = facebookincubator/cinderx\n\n[git]\nrepo_url"
  },
  {
    "path": "build/fbcode_builder/manifests/cinderx-main",
    "chars": 819,
    "preview": "# For building CinderX against CPython main.\n# Note that externally this can be broken  because in that environment we w"
  },
  {
    "path": "build/fbcode_builder/manifests/clang",
    "chars": 46,
    "preview": "[manifest]\nname = clang\n\n[rpms]\nclang15-devel\n"
  },
  {
    "path": "build/fbcode_builder/manifests/clang19",
    "chars": 75,
    "preview": "[manifest]\nname = clang19\n\n[debs.os=linux]\nclang-19\n\n[rpms.os=linux]\nclang\n"
  },
  {
    "path": "build/fbcode_builder/manifests/cmake",
    "chars": 1127,
    "preview": "[manifest]\nname = cmake\n\n[homebrew]\ncmake\n\n# 18.04 cmake is too old\n[debs.not(all(distro=ubuntu,distro_vers=\"18.04\"))]\nc"
  },
  {
    "path": "build/fbcode_builder/manifests/cpptoml",
    "chars": 301,
    "preview": "[manifest]\nname = cpptoml\n\n[homebrew]\ncpptoml\n\n[download]\nurl = https://github.com/chadaustin/cpptoml/archive/refs/tags/"
  },
  {
    "path": "build/fbcode_builder/manifests/double-conversion",
    "chars": 390,
    "preview": "[manifest]\nname = double-conversion\n\n[download]\nurl = https://github.com/google/double-conversion/archive/v3.1.4.tar.gz\n"
  },
  {
    "path": "build/fbcode_builder/manifests/double-conversion-python",
    "chars": 486,
    "preview": "[manifest]\nname = double-conversion-python\n\n[download]\nurl = https://github.com/google/double-conversion/archive/v3.1.4."
  },
  {
    "path": "build/fbcode_builder/manifests/eden",
    "chars": 2936,
    "preview": "[manifest]\nname = eden\nfbsource_path = fbcode/eden\nshipit_project = eden\nshipit_fbcode_builder = true\n\n[git]\nrepo_url = "
  },
  {
    "path": "build/fbcode_builder/manifests/edencommon",
    "chars": 466,
    "preview": "[manifest]\nname = edencommon\nfbsource_path = fbcode/eden/common\nshipit_project = edencommon\nshipit_fbcode_builder = true"
  },
  {
    "path": "build/fbcode_builder/manifests/exprtk",
    "chars": 304,
    "preview": "[manifest]\nname = exprtk\n\n[download]\nurl = https://github.com/ArashPartow/exprtk/archive/refs/tags/0.0.1.tar.gz\nsha256 ="
  },
  {
    "path": "build/fbcode_builder/manifests/fast_float",
    "chars": 481,
    "preview": "[manifest]\nname = fast_float\n\n[download]\nurl = https://github.com/fastfloat/fast_float/archive/refs/tags/v8.0.0.tar.gz\ns"
  },
  {
    "path": "build/fbcode_builder/manifests/fatal",
    "chars": 482,
    "preview": "[manifest]\nname = fatal\nfbsource_path = fbcode/fatal\nshipit_project = fatal\n\n[git]\nrepo_url = https://github.com/faceboo"
  },
  {
    "path": "build/fbcode_builder/manifests/fb303",
    "chars": 594,
    "preview": "[manifest]\nname = fb303\nfbsource_path = fbcode/fb303\nshipit_project = fb303\nshipit_fbcode_builder = true\n\n[git]\nrepo_url"
  },
  {
    "path": "build/fbcode_builder/manifests/fboss",
    "chars": 1366,
    "preview": "[manifest]\nname = fboss\nfbsource_path = fbcode/fboss\nshipit_project = fboss\nshipit_fbcode_builder = true\n\n[git]\nrepo_url"
  },
  {
    "path": "build/fbcode_builder/manifests/fbthrift",
    "chars": 915,
    "preview": "[manifest]\nname = fbthrift\nfbsource_path = xplat/thrift\nshipit_project = fbthrift\nshipit_fbcode_builder = true\n\n[git]\nre"
  },
  {
    "path": "build/fbcode_builder/manifests/fbthrift-python",
    "chars": 1115,
    "preview": "[manifest]\nname = fbthrift-python\nfbsource_path = xplat/thrift\nshipit_project = fbthrift\nshipit_fbcode_builder = true\n\n["
  },
  {
    "path": "build/fbcode_builder/manifests/fizz",
    "chars": 559,
    "preview": "[manifest]\nname = fizz\nfbsource_path = fbcode/fizz\nshipit_project = fizz\nshipit_fbcode_builder = true\n\n[git]\nrepo_url = "
  },
  {
    "path": "build/fbcode_builder/manifests/fizz-python",
    "chars": 710,
    "preview": "[manifest]\nname = fizz-python\nfbsource_path = fbcode/fizz\nshipit_project = fizz\nshipit_fbcode_builder = true\n\n[git]\nrepo"
  },
  {
    "path": "build/fbcode_builder/manifests/fmt",
    "chars": 315,
    "preview": "[manifest]\nname = fmt\n\n[download]\nurl = https://github.com/fmtlib/fmt/archive/refs/tags/12.1.0.tar.gz\nsha256 = ea7de4299"
  },
  {
    "path": "build/fbcode_builder/manifests/fmt-python",
    "chars": 539,
    "preview": "[manifest]\nname = fmt-python\n\n[download]\nurl = https://github.com/fmtlib/fmt/archive/refs/tags/12.1.0.tar.gz\nsha256 = ea"
  },
  {
    "path": "build/fbcode_builder/manifests/folly",
    "chars": 1399,
    "preview": "[manifest]\nname = folly\nfbsource_path = fbcode/folly\nshipit_project = folly\nshipit_fbcode_builder = true\n\n[git]\nrepo_url"
  },
  {
    "path": "build/fbcode_builder/manifests/folly-python",
    "chars": 1535,
    "preview": "[manifest]\nname = folly-python\nfbsource_path = fbcode/folly\nshipit_project = folly\nshipit_fbcode_builder = true\n\n[git]\nr"
  },
  {
    "path": "build/fbcode_builder/manifests/gcc12",
    "chars": 87,
    "preview": "[manifest]\nname = gcc12\n\n[rpms.all(distro=centos_stream,distro_vers=9)]\ngcc-toolset-12\n"
  },
  {
    "path": "build/fbcode_builder/manifests/gcc14",
    "chars": 87,
    "preview": "[manifest]\nname = gcc14\n\n[rpms.all(distro=centos_stream,distro_vers=9)]\ngcc-toolset-14\n"
  },
  {
    "path": "build/fbcode_builder/manifests/gflags",
    "chars": 414,
    "preview": "[manifest]\nname = gflags\n\n[download]\nurl = https://github.com/gflags/gflags/archive/v2.2.2.tar.gz\nsha256 = 34af2f15cf736"
  },
  {
    "path": "build/fbcode_builder/manifests/ghc",
    "chars": 323,
    "preview": "[manifest]\nname = ghc\n\n[download.os=linux]\nurl = https://downloads.haskell.org/~ghc/9.2.8/ghc-9.2.8-x86_64-fedora27-linu"
  },
  {
    "path": "build/fbcode_builder/manifests/git-lfs",
    "chars": 144,
    "preview": "[manifest]\nname = git-lfs\n\n[rpms]\ngit-lfs\n\n[debs]\ngit-lfs\n\n[homebrew]\ngit-lfs\n\n# only used from system packages currentl"
  },
  {
    "path": "build/fbcode_builder/manifests/glean",
    "chars": 977,
    "preview": "[manifest]\nname = glean\nfbsource_path = fbcode/glean\nshipit_project = facebookincubator/Glean\nuse_shipit = true\n\n[shipit"
  },
  {
    "path": "build/fbcode_builder/manifests/glog",
    "chars": 564,
    "preview": "[manifest]\nname = glog\n\n[download]\nurl = https://github.com/google/glog/archive/v0.5.0.tar.gz\nsha256 = eede71f28371bf39a"
  },
  {
    "path": "build/fbcode_builder/manifests/googletest",
    "chars": 682,
    "preview": "[manifest]\nname = googletest\n\n[download]\nurl = https://github.com/google/googletest/archive/refs/tags/v1.17.0.tar.gz\nsha"
  },
  {
    "path": "build/fbcode_builder/manifests/gperf",
    "chars": 266,
    "preview": "[manifest]\nname = gperf\n\n[download]\nurl = https://ftpmirror.gnu.org/gnu/gperf/gperf-3.1.tar.gz\nsha256 = 588546b945bba4b7"
  },
  {
    "path": "build/fbcode_builder/manifests/hexdump",
    "chars": 132,
    "preview": "[manifest]\nname = hexdump\n\n[rpms]\nutil-linux\n\n[debs]\nbsdmainutils\n\n# only used from system packages currently\n[build]\nbu"
  },
  {
    "path": "build/fbcode_builder/manifests/hsthrift",
    "chars": 482,
    "preview": "[manifest]\nname = hsthrift\nfbsource_path = fbcode/common/hs\nshipit_project = facebookincubator/hsthrift\nuse_shipit = tru"
  },
  {
    "path": "build/fbcode_builder/manifests/iproute2",
    "chars": 333,
    "preview": "[manifest]\nname = iproute2\n\n[download]\nurl = https://mirrors.edge.kernel.org/pub/linux/utils/net/iproute2/iproute2-4.12."
  },
  {
    "path": "build/fbcode_builder/manifests/jom",
    "chars": 454,
    "preview": "# jom is compatible with MSVC nmake, but adds the /j<number of jobs> argment which \n# speeds up openssl build a lot\n[man"
  },
  {
    "path": "build/fbcode_builder/manifests/jq",
    "chars": 555,
    "preview": "[manifest]\nname = jq\n\n[rpms.distro=fedora]\njq\n\n[homebrew]\njq\n\n[download.not(os=windows)]\n# we use jq-1.7+ to get fix for"
  },
  {
    "path": "build/fbcode_builder/manifests/katran",
    "chars": 553,
    "preview": "[manifest]\nname = katran\nfbsource_path = fbcode/katran\nshipit_project = katran\nshipit_fbcode_builder = true\n\n[git]\nrepo_"
  },
  {
    "path": "build/fbcode_builder/manifests/libaio",
    "chars": 443,
    "preview": "[manifest]\nname = libaio\n\n[debs]\nlibaio-dev\n\n[rpms.distro=centos_stream]\nlibaio-devel\n\n[download]\nurl = https://pagure.i"
  },
  {
    "path": "build/fbcode_builder/manifests/libaio-python",
    "chars": 419,
    "preview": "[manifest]\nname = libaio-python\n\n[debs]\nlibaio-dev\n\n[rpms.distro=centos_stream]\nlibaio-devel\n\n[download]\nurl = https://p"
  },
  {
    "path": "build/fbcode_builder/manifests/libbpf",
    "chars": 516,
    "preview": "[manifest]\nname = libbpf\n\n[download]\nurl = https://github.com/libbpf/libbpf/archive/refs/tags/v1.6.2.tar.gz\nsha256 = 16f"
  },
  {
    "path": "build/fbcode_builder/manifests/libcurl",
    "chars": 941,
    "preview": "[manifest]\nname = libcurl\n\n[rpms]\nlibcurl-devel\nlibcurl-minimal\n\n[debs]\nlibcurl4-openssl-dev\n\n[pps]\nlibcurl-gnutls\n\n[dow"
  },
  {
    "path": "build/fbcode_builder/manifests/libdwarf",
    "chars": 293,
    "preview": "[manifest]\nname = libdwarf\n\n[rpms]\nlibdwarf-devel\nlibdwarf\n\n[debs]\nlibdwarf-dev\n\n[homebrew]\ndwarfutils\n\n[download]\nurl ="
  },
  {
    "path": "build/fbcode_builder/manifests/libdwarf-python",
    "chars": 389,
    "preview": "[manifest]\nname = libdwarf-python\n\n[rpms]\nlibdwarf-devel\nlibdwarf\n\n[debs]\nlibdwarf-dev\n\n[homebrew]\ndwarfutils\n\n[download"
  },
  {
    "path": "build/fbcode_builder/manifests/libelf",
    "chars": 422,
    "preview": "[manifest]\nname = libelf\n\n[rpms]\nelfutils-libelf-devel-static\n\n[debs]\nlibelf-dev\n\n[pps]\nlibelf\n\n[download]\nurl = https:/"
  },
  {
    "path": "build/fbcode_builder/manifests/libevent",
    "chars": 943,
    "preview": "[manifest]\nname = libevent\n\n[debs]\nlibevent-dev\n\n[homebrew]\nlibevent\n\n[rpms]\nlibevent-devel\n\n[pps]\nlibevent\n\n# Note that"
  },
  {
    "path": "build/fbcode_builder/manifests/libevent-python",
    "chars": 1136,
    "preview": "[manifest]\nname = libevent-python\n\n# NOTE: System packages (debs, rpms) removed because they don't include\n# LibeventCon"
  },
  {
    "path": "build/fbcode_builder/manifests/libffi",
    "chars": 325,
    "preview": "[manifest]\nname = libffi\n\n[debs]\nlibffi-dev\n\n[homebrew]\nlibffi\n\n[rpms]\nlibffi-devel\nlibffi\n\n[pps]\nlibffi\n\n[download]\nurl"
  },
  {
    "path": "build/fbcode_builder/manifests/libgit2",
    "chars": 820,
    "preview": "[manifest]\nname = libgit2\n\n[homebrew]\nlibgit2\n\n[rpms]\nlibgit2-devel\n\n[pps]\nlibgit2\n\n# Ubuntu 18.04 libgit2 has clash wit"
  },
  {
    "path": "build/fbcode_builder/manifests/libgpiod",
    "chars": 239,
    "preview": "[manifest]\nname = libgpiod\n\n[download]\nurl = https://cdn.kernel.org/pub/software/libs/libgpiod/libgpiod-1.6.tar.xz\nsha25"
  },
  {
    "path": "build/fbcode_builder/manifests/libiberty",
    "chars": 623,
    "preview": "[manifest]\nname = libiberty\n\n[rpms]\nbinutils-devel\nbinutils\n\n[debs.not(all(distro=ubuntu,distro_vers=\"24.04\"))]\nbinutils"
  },
  {
    "path": "build/fbcode_builder/manifests/libiberty-python",
    "chars": 705,
    "preview": "[manifest]\nname = libiberty-python\n\n[rpms]\nbinutils-devel\nbinutils\n\n[debs.not(all(distro=ubuntu,distro_vers=\"24.04\"))]\nb"
  },
  {
    "path": "build/fbcode_builder/manifests/libibverbs",
    "chars": 539,
    "preview": "[manifest]\nname = libibverbs\n\n[debs]\nlibibverbs-dev\nrdma-core\n\n[rpms]\nlibibverbs\nrdma-core-devel\n\n[download]\nurl = https"
  },
  {
    "path": "build/fbcode_builder/manifests/libmnl",
    "chars": 469,
    "preview": "[manifest]\nname = libmnl\n\n[rpms]\nlibmnl-devel\n\n# all centos 8 distros are missing this,\n# but its in fedora so may be ba"
  },
  {
    "path": "build/fbcode_builder/manifests/libnl",
    "chars": 337,
    "preview": "[manifest]\nname = libnl\n\n[rpms]\nlibnl3-devel\nlibnl3\n\n[debs]\nlibnl-3-dev\nlibnl-route-3-dev\n\n[pps]\nlibnl\n\n[download]\nurl ="
  },
  {
    "path": "build/fbcode_builder/manifests/liboqs",
    "chars": 391,
    "preview": "[manifest]\nname = liboqs\n\n[download]\nurl = https://github.com/open-quantum-safe/liboqs/archive/refs/tags/0.12.0.tar.gz\ns"
  },
  {
    "path": "build/fbcode_builder/manifests/libsai",
    "chars": 284,
    "preview": "[manifest]\nname = libsai\n\n[download]\nurl = https://github.com/opencomputeproject/SAI/archive/v1.16.3.tar.gz\nsha256 = 5c8"
  },
  {
    "path": "build/fbcode_builder/manifests/libsodium",
    "chars": 997,
    "preview": "[manifest]\nname = libsodium\n\n[debs]\nlibsodium-dev\n\n[homebrew]\nlibsodium\n\n[rpms]\nlibsodium-devel\nlibsodium-static\n\n[pps]\n"
  },
  {
    "path": "build/fbcode_builder/manifests/libunwind",
    "chars": 710,
    "preview": "[manifest]\nname = libunwind\n\n[rpms]\nlibunwind-devel\nlibunwind\n\n# on ubuntu this brings in liblzma-dev, which in turn bre"
  },
  {
    "path": "build/fbcode_builder/manifests/libusb",
    "chars": 543,
    "preview": "[manifest]\nname = libusb\n\n[debs]\nlibusb-1.0-0-dev\n\n[homebrew]\nlibusb\n\n[rpms]\nlibusb-devel\nlibusb\n\n[pps]\nlibusb\n\n[downloa"
  },
  {
    "path": "build/fbcode_builder/manifests/libyaml",
    "chars": 266,
    "preview": "[manifest]\nname = libyaml\n\n[download]\nurl = https://pyyaml.org/download/libyaml/yaml-0.1.7.tar.gz\nsha256 = 8088e457264a9"
  },
  {
    "path": "build/fbcode_builder/manifests/llvm",
    "chars": 44,
    "preview": "[manifest]\nname = llvm\n\n[rpms]\nllvm15-devel\n"
  },
  {
    "path": "build/fbcode_builder/manifests/lmdb",
    "chars": 337,
    "preview": "[manifest]\nname = lmdb\n\n[build]\nbuilder = make\nsubdir = lmdb-LMDB_0.9.31/libraries/liblmdb\n\n[download]\nurl = https://git"
  },
  {
    "path": "build/fbcode_builder/manifests/lz4",
    "chars": 459,
    "preview": "[manifest]\nname = lz4\n\n[homebrew]\nlz4\n\n[rpms]\nlz4-devel\n# centos 8 and centos_stream 9 are missing this rpm\n[rpms.not(an"
  },
  {
    "path": "build/fbcode_builder/manifests/lz4-python",
    "chars": 555,
    "preview": "[manifest]\nname = lz4-python\n\n[homebrew]\nlz4\n\n[rpms]\nlz4-devel\n# centos 8 and centos_stream 9 are missing this rpm\n[rpms"
  },
  {
    "path": "build/fbcode_builder/manifests/magic_enum",
    "chars": 348,
    "preview": "[manifest]\nname = magic_enum\n\n[download]\nurl = https://github.com/Neargye/magic_enum/releases/download/v0.9.7/magic_enum"
  },
  {
    "path": "build/fbcode_builder/manifests/mcrouter",
    "chars": 557,
    "preview": "[manifest]\nname = mcrouter\nfbsource_path = fbcode/mcrouter\nshipit_project = mcrouter\nshipit_fbcode_builder = true\n\n[git]"
  },
  {
    "path": "build/fbcode_builder/manifests/mononoke",
    "chars": 1546,
    "preview": "[manifest]\nname = mononoke\nfbsource_path = fbcode/eden\nshipit_project = eden\nshipit_fbcode_builder = true\n\n[git]\nrepo_ur"
  },
  {
    "path": "build/fbcode_builder/manifests/mononoke_integration",
    "chars": 695,
    "preview": "[manifest]\nname = mononoke_integration\nfbsource_path = fbcode/eden\nshipit_project = eden\nshipit_fbcode_builder = true\n\n["
  },
  {
    "path": "build/fbcode_builder/manifests/moxygen",
    "chars": 574,
    "preview": "[manifest]\nname = moxygen\nfbsource_path = fbcode/moxygen\nshipit_project = moxygen\nshipit_fbcode_builder = true\n\n[git]\nre"
  },
  {
    "path": "build/fbcode_builder/manifests/mvfst",
    "chars": 491,
    "preview": "[manifest]\nname = mvfst\nfbsource_path = fbcode/quic\nshipit_project = mvfst\nshipit_fbcode_builder = true\n\n[git]\nrepo_url "
  },
  {
    "path": "build/fbcode_builder/manifests/mvfst-python",
    "chars": 635,
    "preview": "[manifest]\nname = mvfst-python\nfbsource_path = fbcode/quic\nshipit_project = mvfst\nshipit_fbcode_builder = true\n\n[git]\nre"
  },
  {
    "path": "build/fbcode_builder/manifests/ncurses",
    "chars": 448,
    "preview": "[manifest]\nname = ncurses\n\n[debs]\nlibncurses-dev\n\n[homebrew]\nncurses\n\n[rpms]\nncurses-devel\n\n[download]\nurl = https://ftp"
  },
  {
    "path": "build/fbcode_builder/manifests/nghttp2",
    "chars": 395,
    "preview": "[manifest]\nname = nghttp2\n\n[rpms]\nlibnghttp2-devel\nlibnghttp2\n\n[debs]\nlibnghttp2-dev\n\n[pps]\nlibnghttp2\n\n[download]\nurl ="
  },
  {
    "path": "build/fbcode_builder/manifests/ninja",
    "chars": 603,
    "preview": "[manifest]\nname = ninja\n\n[debs]\nninja-build\n\n[homebrew]\nninja\n\n[rpms]\nninja-build\n\n[pps]\nninja\n\n[download.os=windows]\nur"
  },
  {
    "path": "build/fbcode_builder/manifests/nlohmann-json",
    "chars": 252,
    "preview": "[manifest]\nname = nlohmann-json\n\n[download]\nurl = https://github.com/nlohmann/json/archive/refs/tags/v3.10.5.tar.gz\nsha2"
  },
  {
    "path": "build/fbcode_builder/manifests/nmap",
    "chars": 645,
    "preview": "[manifest]\nname = nmap\n\n[rpms]\nnmap\nnmap-ncat\n\n[debs]\nnmap\n\n# 18.04 combines ncat into the nmap package, newer need the "
  },
  {
    "path": "build/fbcode_builder/manifests/numa",
    "chars": 293,
    "preview": "[manifest]\nname = numa\n\n[download]\nurl = https://github.com/numactl/numactl/releases/download/v2.0.19/numactl-2.0.19.tar"
  },
  {
    "path": "build/fbcode_builder/manifests/openr",
    "chars": 598,
    "preview": "[manifest]\nname = openr\nfbsource_path = facebook/openr\nshipit_project = openr\nshipit_fbcode_builder = true\n\n[git]\nrepo_u"
  },
  {
    "path": "build/fbcode_builder/manifests/openssl",
    "chars": 742,
    "preview": "[manifest]\nname = openssl\n\n[debs]\nlibssl-dev\n\n[homebrew]\nopenssl\n# on homebrew need the matching curl and ca-\n\n[rpms]\nop"
  },
  {
    "path": "build/fbcode_builder/manifests/osxfuse",
    "chars": 261,
    "preview": "[manifest]\nname = osxfuse\n\n[download]\nurl = https://github.com/osxfuse/osxfuse/archive/osxfuse-3.8.3.tar.gz\nsha256 = 93b"
  },
  {
    "path": "build/fbcode_builder/manifests/patchelf",
    "chars": 275,
    "preview": "[manifest]\nname = patchelf\n\n[rpms]\npatchelf\n\n[debs]\npatchelf\n\n[pps]\npatchelf\n\n[download]\nurl = https://github.com/NixOS/"
  },
  {
    "path": "build/fbcode_builder/manifests/pcre2",
    "chars": 321,
    "preview": "[manifest]\nname = pcre2\n\n[homebrew]\npcre2\n\n[rpms]\npcre2-devel\npcre-static\n\n[debs]\nlibpcre2-dev\n\n[download]\nurl = https:/"
  },
  {
    "path": "build/fbcode_builder/manifests/perl",
    "chars": 263,
    "preview": "[manifest]\nname = perl\n\n[download.os=windows]\nurl = https://strawberryperl.com/download/5.28.1.1/strawberry-perl-5.28.1."
  },
  {
    "path": "build/fbcode_builder/manifests/pexpect",
    "chars": 326,
    "preview": "[manifest]\nname = pexpect\n\n[download]\nurl = https://files.pythonhosted.org/packages/0e/3e/377007e3f36ec42f1b84ec322ee121"
  },
  {
    "path": "build/fbcode_builder/manifests/proxygen",
    "chars": 520,
    "preview": "[manifest]\nname = proxygen\nfbsource_path = fbcode/proxygen\nshipit_project = proxygen\nshipit_fbcode_builder = true\n\n[git]"
  },
  {
    "path": "build/fbcode_builder/manifests/python",
    "chars": 1265,
    "preview": "[manifest]\nname = python\n\n[homebrew]\npython@3.10\n\n# sapling needs match statements with arrive in python 3.12 in centos "
  },
  {
    "path": "build/fbcode_builder/manifests/python-3_14",
    "chars": 319,
    "preview": "# This is primarily to support CinderX's CI, so it's not heavily configured.\n\n[manifest]\nname = python-3_14\n\n[download]\n"
  },
  {
    "path": "build/fbcode_builder/manifests/python-click",
    "chars": 339,
    "preview": "[manifest]\nname = python-click\n\n[download]\nurl = https://files.pythonhosted.org/packages/d2/3d/fa76db83bf75c4f8d338c2fd1"
  },
  {
    "path": "build/fbcode_builder/manifests/python-filelock",
    "chars": 297,
    "preview": "[manifest]\nname = python-filelock\n\n[download]\nurl = https://files.pythonhosted.org/packages/31/24/ee722b92f23b9ebd87783e"
  },
  {
    "path": "build/fbcode_builder/manifests/python-main",
    "chars": 471,
    "preview": "# This is primarily to support CinderX's CI, so it's not heavily configured.\n\n[manifest]\nname = python-main\nfbsource_pat"
  },
  {
    "path": "build/fbcode_builder/manifests/python-psutil",
    "chars": 377,
    "preview": "[manifest]\nname = python-psutil\n\n[download]\nurl = https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839"
  },
  {
    "path": "build/fbcode_builder/manifests/python-ptyprocess",
    "chars": 305,
    "preview": "[manifest]\nname = python-ptyprocess\n\n[download]\nurl = https://files.pythonhosted.org/packages/d1/29/605c2cc68a9992d18dad"
  },
  {
    "path": "build/fbcode_builder/manifests/python-pyyaml",
    "chars": 355,
    "preview": "[manifest]\nname = python-pyyaml\n\n[download]\nurl = https://files.pythonhosted.org/packages/25/a2/b725b61ac76a75583ae7104b"
  },
  {
    "path": "build/fbcode_builder/manifests/python-setuptools",
    "chars": 517,
    "preview": "[manifest]\nname = python-setuptools\n\n[download]\nurl = https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea5"
  },
  {
    "path": "build/fbcode_builder/manifests/python-setuptools-69",
    "chars": 389,
    "preview": "[manifest]\nname = python-setuptools-69\n\n[download]\nurl = https://files.pythonhosted.org/packages/c0/7a/3da654f49c95d0cc6"
  },
  {
    "path": "build/fbcode_builder/manifests/python-six",
    "chars": 292,
    "preview": "[manifest]\nname = python-six\n\n[download]\nurl = https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce"
  },
  {
    "path": "build/fbcode_builder/manifests/python-toml",
    "chars": 294,
    "preview": "[manifest]\nname = python-toml\n\n[download]\nurl = https://files.pythonhosted.org/packages/a2/12/ced7105d2de62fa7c8fb5fce92"
  },
  {
    "path": "build/fbcode_builder/manifests/ragel",
    "chars": 261,
    "preview": "[manifest]\nname = ragel\n\n[debs]\nragel\n\n[homebrew]\nragel\n\n[rpms]\nragel\n\n[download]\nurl = https://www.colm.net/files/ragel"
  },
  {
    "path": "build/fbcode_builder/manifests/range-v3",
    "chars": 282,
    "preview": "[manifest]\nname = range-v3\n\n[download]\nurl = https://github.com/ericniebler/range-v3/archive/refs/tags/0.11.0.tar.gz\nsha"
  },
  {
    "path": "build/fbcode_builder/manifests/rdma-core",
    "chars": 70,
    "preview": "[manifest]\nname = rdma-core\n\n[debs]\nrdma-core\n\n[rpms]\nrdma-core-devel\n"
  },
  {
    "path": "build/fbcode_builder/manifests/re2",
    "chars": 287,
    "preview": "[manifest]\nname = re2\n\n[homebrew]\nre2\n\n[debs]\nlibre2-dev\n\n[rpms]\nre2\nre2-devel\n\n[pps]\nre2\n\n[download]\nurl = https://gith"
  },
  {
    "path": "build/fbcode_builder/manifests/rebalancer",
    "chars": 971,
    "preview": "[manifest]\nname = rebalancer\nfbsource_path = fbcode/algopt/rebalancer/\nshipit_project = rebalancer\nshipit_fbcode_builder"
  },
  {
    "path": "build/fbcode_builder/manifests/ripgrep",
    "chars": 144,
    "preview": "[manifest]\nname = ripgrep\n\n[rpms]\nripgrep\n\n[debs]\nripgrep\n\n[homebrew]\nripgrep\n\n# only used from system packages currentl"
  },
  {
    "path": "build/fbcode_builder/manifests/rocksdb",
    "chars": 1028,
    "preview": "[manifest]\nname = rocksdb\n\n[download]\nurl = https://github.com/facebook/rocksdb/archive/refs/tags/v8.7.3.zip\nsha256 = 36"
  },
  {
    "path": "build/fbcode_builder/manifests/rust-shed",
    "chars": 652,
    "preview": "[manifest]\nname = rust-shed\nfbsource_path = fbcode/common/rust/shed\nshipit_project = rust-shed\nshipit_fbcode_builder = t"
  }
]

// ... and 696 more files (download for full content)

About this extraction

This page contains the full source code of the facebook/watchman GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 896 files (9.5 MB), approximately 2.5M tokens, and a symbol index with 3953 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!