Web lists-archives.com

Re: [PATCH v1 5/5] Add a sample query-fsmonitor hook script that integrates with the cross platform Watchman file watching service.






On 5/15/2017 3:50 PM, David Turner wrote:

-----Original Message-----
From: Ben Peart [mailto:peartben@xxxxxxxxx]
Sent: Monday, May 15, 2017 3:14 PM
To: git@xxxxxxxxxxxxxxx
Cc: gitster@xxxxxxxxx; benpeart@xxxxxxxxxxxxx; pclouds@xxxxxxxxx;
johannes.schindelin@xxxxxx; David Turner <David.Turner@xxxxxxxxxxxx>;
peff@xxxxxxxx
Subject: [PATCH v1 5/5] Add a sample query-fsmonitor hook script that
integrates 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').

Signed-off-by: Ben Peart <benpeart@xxxxxxxxxxxxx>
Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx>
---
  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"}}));'
Last time I checked, the argument to 'since' was not a time_t -- it was a
watchman clock spec.  Have you tested this?  Does it work?


Watchman also accepts a Unix time value for "since" as documented here (https://facebook.github.io/watchman/docs/expr/since.html).

Yes, this has been tested and works correctly as long as you have a recent version that contains the patch (https://github.com/facebook/watchman/commit/67b26a8938336f08918fc7187129b6c1a571f35b) that made sure it was greedy when using the Unix time.