git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 6/6] fsmonitor: add a sample query-fsmonitor hook script for Watchman

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
May 26, 2017, 09:47 UTC
Message-ID
<CACBZZX4X9v5S6EQaX0tX71sK6c5kriaCTMoXqUx0Fg6WO9Wmiw@mail.gmail.com>
In-Reply-To
<CAP8UFD340yndvkT8=F9zdzX9QtbuPspn8rfiK8q7f8c=kGeWQg@mail.gmail.com>

On Wed, May 24, 2017 at 3:12 PM, Christian Couder <christian.couder@gmail.com> wrote:

Show 62 quoted lines
> On Thu, May 18, 2017 at 10:13 PM, Ben Peart <peartben@gmail.com> wrote:
>> This hook script integrates the new fsmonitor capabilities of git with
>> the cross platform Watchman file watching service. To use the script:
>>
>> Download and install Watchman from https://facebook.github.io/watchman/
>> and instruct Watchman to watch your working directory for changes
>> ('watchman watch-project /usr/src/git').
>>
>> Rename the sample integration hook from query-fsmonitor.sample to
>> query-fsmonitor.
>>
>> Configure git to use the extension ('git config core.fsmonitor true')
>> and optionally turn on the untracked cache for optimal performance
>> ('git config core.untrackedcache true').
>
> Ok, it looks like the untracked cache can be used, but it could work without it.
>
>> Signed-off-by: Ben Peart <benpeart@microsoft.com>
>> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
>> ---
>>  templates/hooks--query-fsmonitor.sample | 27 +++++++++++++++++++++++++++
>>  1 file changed, 27 insertions(+)
>>  create mode 100644 templates/hooks--query-fsmonitor.sample
>>
>> diff --git a/templates/hooks--query-fsmonitor.sample b/templates/hooks--query-fsmonitor.sample
>> new file mode 100644
>> index 0000000000..4bd22f21d8
>> --- /dev/null
>> +++ b/templates/hooks--query-fsmonitor.sample
>> @@ -0,0 +1,27 @@
>> +#!/bin/sh
>> +#
>> +# An example hook script to integrate Watchman
>> +# (https://facebook.github.io/watchman/) with git to provide fast
>> +# git status.
>> +#
>> +# The hook is passed a time_t formatted as a string and outputs to
>> +# stdout all files that have been modified since the given time.
>> +# Paths must be relative to the root of the working tree and
>> +# separated by a single NUL.
>> +#
>> +# To enable this hook, rename this file to "query-fsmonitor"
>> +
>> +# Convert unix style paths to escaped Windows style paths
>> +case "$(uname -s)" in
>> +MINGW*|MSYS_NT*)
>> +  GIT_WORK_TREE="$(cygpath -aw "$PWD" | sed 's,\\,\\\\,g')"
>> +  ;;
>> +*)
>> +  GIT_WORK_TREE="$PWD"
>> +  ;;
>> +esac
>> +
>> +# Query Watchman for all the changes since the requested time
>> +echo "[\"query\", \"$GIT_WORK_TREE\", {\"since\": $1, \"fields\":[\"name\"]}]" | \
>> +watchman -j | \
>> +perl -e 'use JSON::PP; my $o = JSON::PP->new->utf8->decode(join("", <>)); die "Watchman: $o->{'error'}.\nFalling back to scanning...\n" if defined($o->{"error"}); print(join("\0", @{$o->{"files"}}));'
>
> Maybe put the above small perl script on multiple lines for improved
> readability.
>
> Is JSON::PP always available in Perl >= 5.8?
No, it's shipped with perl as of 5.14.0, which came out in May 2011.

I think depending on that is fine. FWIW we bumped the required core dependency (but you might still need to install modules) in 2010 in my d48b284183 ("perl: bump the required Perl version to 5.8 from 5.6.[21]", 2010-09-24). Maybe we should be bumping that again...

> What happens if watchman is not installed or not in the PATH?
> It seems to me that the git process will not die, and will just work
> as if the hook does not exist, except that it will call the hook which
> will probably output error messages.

I think a good solution to this is to just add "set -euo pipefail" to that script.

Then we'll print out on stderr that we couldn't find the watchman command. Right now (with my patch) it'll make its way to the perl program and get empty input.

Previous: Christian CouderNext: Ben Peart
Message 12 of 30 in “Fast git status via a file system watcher”
  1. 0/6 Fast git status via a file system watcherBen Peart, May 18, 2017
  2. 1/6 bswap: add 64 bit endianness helper get_be64Ben Peart, May 18, 2017
  3. 2/6 dir: make lookup_untracked() available outside of dir.cBen Peart, May 18, 2017
  4. 3/6 fsmonitor: teach git to optionally utilize a file system monitor to speed up detecting new or changed files.Ben Peart, May 18, 2017
  5. Ben PeartMay 19, 2017
  6. Junio C HamanoMay 20, 2017
  7. Christian CouderMay 24, 2017
  8. 4/6 fsmonitor: add test cases for fsmonitor extensionBen Peart, May 18, 2017
  9. Torsten BögershausenMay 20, 2017
  10. 6/6 fsmonitor: add a sample query-fsmonitor hook script for WatchmanBen Peart, May 18, 2017
  11. Christian CouderMay 24, 2017
  12. Ævar Arnfjörð BjarmasonMay 26, 2017
  13. Ben PeartMay 26, 2017
  14. Ævar Arnfjörð BjarmasonMay 25, 2017
  15. 5/6 fsmonitor: add documentation for the fsmonitor extension.Ben Peart, May 18, 2017
  16. Junio C HamanoMay 20, 2017
  17. Ævar Arnfjörð BjarmasonMay 20, 2017
  18. Ben PeartMay 22, 2017
  19. Ævar Arnfjörð BjarmasonMay 22, 2017
  20. Ben PeartMay 25, 2017
  21. Christian CouderMay 24, 2017
  22. Ben PeartMay 25, 2017
  23. Christian CouderMay 27, 2017
  24. Ben PeartMay 30, 2017
  25. Christian CouderMay 30, 2017
  26. Ben PeartMay 30, 2017
  27. Christian CouderMay 31, 2017
  28. Christian CouderMay 31, 2017
  29. Ben PeartMay 31, 2017
  30. Ævar Arnfjörð BjarmasonMay 31, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.