diff options
author | Paul Bonaud <paul.bonaud@fretlink.com> | 2019-04-13 16:38:04 +0200 |
---|---|---|
committer | Paul Bonaud <paul.bonaud@fretlink.com> | 2019-04-13 16:38:04 +0200 |
commit | 9c1df04756bd900c1ab61e98526ad6eaac8a7216 (patch) | |
tree | cf4048303525aa090d00d7a4a2977377cb6a99d1 /spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample | |
parent | 83414e23d7f03a7a939655f51b81c0792fff616a (diff) | |
download | pronto-hlint-9c1df04756bd900c1ab61e98526ad6eaac8a7216.tar.gz pronto-hlint-9c1df04756bd900c1ab61e98526ad6eaac8a7216.tar.zst pronto-hlint-9c1df04756bd900c1ab61e98526ad6eaac8a7216.zip |
Welcom pronto-hlint! This is a whole rewrite of pronto-eslint_npm.
Forking the pronto-eslint_npm repository to build a runner for hlint
haskell linter.
Diffstat (limited to 'spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample')
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample b/spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..e673bb3 --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample | |||
@@ -0,0 +1,114 @@ | |||
1 | #!/usr/bin/perl | ||
2 | |||
3 | use strict; | ||
4 | use warnings; | ||
5 | use IPC::Open2; | ||
6 | |||
7 | # An example hook script to integrate Watchman | ||
8 | # (https://facebook.github.io/watchman/) with git to speed up detecting | ||
9 | # new and modified files. | ||
10 | # | ||
11 | # The hook is passed a version (currently 1) and a time in nanoseconds | ||
12 | # formatted as a string and outputs to stdout all files that have been | ||
13 | # modified since the given time. Paths must be relative to the root of | ||
14 | # the working tree and separated by a single NUL. | ||
15 | # | ||
16 | # To enable this hook, rename this file to "query-watchman" and set | ||
17 | # 'git config core.fsmonitor .git/hooks/query-watchman' | ||
18 | # | ||
19 | my ($version, $time) = @ARGV; | ||
20 | |||
21 | # Check the hook interface version | ||
22 | |||
23 | if ($version == 1) { | ||
24 | # convert nanoseconds to seconds | ||
25 | $time = int $time / 1000000000; | ||
26 | } else { | ||
27 | die "Unsupported query-fsmonitor hook version '$version'.\n" . | ||
28 | "Falling back to scanning...\n"; | ||
29 | } | ||
30 | |||
31 | my $git_work_tree; | ||
32 | if ($^O =~ 'msys' || $^O =~ 'cygwin') { | ||
33 | $git_work_tree = Win32::GetCwd(); | ||
34 | $git_work_tree =~ tr/\\/\//; | ||
35 | } else { | ||
36 | require Cwd; | ||
37 | $git_work_tree = Cwd::cwd(); | ||
38 | } | ||
39 | |||
40 | my $retry = 1; | ||
41 | |||
42 | launch_watchman(); | ||
43 | |||
44 | sub launch_watchman { | ||
45 | |||
46 | my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') | ||
47 | or die "open2() failed: $!\n" . | ||
48 | "Falling back to scanning...\n"; | ||
49 | |||
50 | # In the query expression below we're asking for names of files that | ||
51 | # changed since $time but were not transient (ie created after | ||
52 | # $time but no longer exist). | ||
53 | # | ||
54 | # To accomplish this, we're using the "since" generator to use the | ||
55 | # recency index to select candidate nodes and "fields" to limit the | ||
56 | # output to file names only. Then we're using the "expression" term to | ||
57 | # further constrain the results. | ||
58 | # | ||
59 | # The category of transient files that we want to ignore will have a | ||
60 | # creation clock (cclock) newer than $time_t value and will also not | ||
61 | # currently exist. | ||
62 | |||
63 | my $query = <<" END"; | ||
64 | ["query", "$git_work_tree", { | ||
65 | "since": $time, | ||
66 | "fields": ["name"], | ||
67 | "expression": ["not", ["allof", ["since", $time, "cclock"], ["not", "exists"]]] | ||
68 | }] | ||
69 | END | ||
70 | |||
71 | print CHLD_IN $query; | ||
72 | close CHLD_IN; | ||
73 | my $response = do {local $/; <CHLD_OUT>}; | ||
74 | |||
75 | die "Watchman: command returned no output.\n" . | ||
76 | "Falling back to scanning...\n" if $response eq ""; | ||
77 | die "Watchman: command returned invalid output: $response\n" . | ||
78 | "Falling back to scanning...\n" unless $response =~ /^\{/; | ||
79 | |||
80 | my $json_pkg; | ||
81 | eval { | ||
82 | require JSON::XS; | ||
83 | $json_pkg = "JSON::XS"; | ||
84 | 1; | ||
85 | } or do { | ||
86 | require JSON::PP; | ||
87 | $json_pkg = "JSON::PP"; | ||
88 | }; | ||
89 | |||
90 | my $o = $json_pkg->new->utf8->decode($response); | ||
91 | |||
92 | if ($retry > 0 and $o->{error} and $o->{error} =~ m/unable to resolve root .* directory (.*) is not watched/) { | ||
93 | print STDERR "Adding '$git_work_tree' to watchman's watch list.\n"; | ||
94 | $retry--; | ||
95 | qx/watchman watch "$git_work_tree"/; | ||
96 | die "Failed to make watchman watch '$git_work_tree'.\n" . | ||
97 | "Falling back to scanning...\n" if $? != 0; | ||
98 | |||
99 | # Watchman will always return all files on the first query so | ||
100 | # return the fast "everything is dirty" flag to git and do the | ||
101 | # Watchman query just to get it over with now so we won't pay | ||
102 | # the cost in git to look up each individual file. | ||
103 | print "/\0"; | ||
104 | eval { launch_watchman() }; | ||
105 | exit 0; | ||
106 | } | ||
107 | |||
108 | die "Watchman: $o->{error}.\n" . | ||
109 | "Falling back to scanning...\n" if $o->{error}; | ||
110 | |||
111 | binmode STDOUT, ":utf8"; | ||
112 | local $, = "\0"; | ||
113 | print @{$o->{files}}; | ||
114 | } | ||