Merge branch 'kw/fsmonitor-watchman-fix'

The watchman integration for fsmonitor was racy, which has been
corrected to be more conservative.

* kw/fsmonitor-watchman-fix:
  fsmonitor: fix watchman integration
This commit is contained in:
Junio C Hamano 2019-12-01 09:04:33 -08:00
Родитель bad5ed39cd dd0b61f577
Коммит fc7b26c907
2 изменённых файлов: 8 добавлений и 18 удалений

Просмотреть файл

@ -23,7 +23,8 @@ my ($version, $time) = @ARGV;
if ($version == 1) { if ($version == 1) {
# convert nanoseconds to seconds # convert nanoseconds to seconds
$time = int $time / 1000000000; # subtract one second to make sure watchman will return all changes
$time = int ($time / 1000000000) - 1;
} else { } else {
die "Unsupported query-fsmonitor hook version '$version'.\n" . die "Unsupported query-fsmonitor hook version '$version'.\n" .
"Falling back to scanning...\n"; "Falling back to scanning...\n";
@ -54,18 +55,12 @@ sub launch_watchman {
# #
# To accomplish this, we're using the "since" generator to use the # To accomplish this, we're using the "since" generator to use the
# recency index to select candidate nodes and "fields" to limit the # recency index to select candidate nodes and "fields" to limit the
# output to file names only. Then we're using the "expression" term to # output to file names only.
# further constrain the results.
#
# The category of transient files that we want to ignore will have a
# creation clock (cclock) newer than $time_t value and will also not
# currently exist.
my $query = <<" END"; my $query = <<" END";
["query", "$git_work_tree", { ["query", "$git_work_tree", {
"since": $time, "since": $time,
"fields": ["name"], "fields": ["name"]
"expression": ["not", ["allof", ["since", $time, "cclock"], ["not", "exists"]]]
}] }]
END END

Просмотреть файл

@ -22,7 +22,8 @@ my ($version, $time) = @ARGV;
if ($version == 1) { if ($version == 1) {
# convert nanoseconds to seconds # convert nanoseconds to seconds
$time = int $time / 1000000000; # subtract one second to make sure watchman will return all changes
$time = int ($time / 1000000000) - 1;
} else { } else {
die "Unsupported query-fsmonitor hook version '$version'.\n" . die "Unsupported query-fsmonitor hook version '$version'.\n" .
"Falling back to scanning...\n"; "Falling back to scanning...\n";
@ -53,18 +54,12 @@ sub launch_watchman {
# #
# To accomplish this, we're using the "since" generator to use the # To accomplish this, we're using the "since" generator to use the
# recency index to select candidate nodes and "fields" to limit the # recency index to select candidate nodes and "fields" to limit the
# output to file names only. Then we're using the "expression" term to # output to file names only.
# further constrain the results.
#
# The category of transient files that we want to ignore will have a
# creation clock (cclock) newer than $time_t value and will also not
# currently exist.
my $query = <<" END"; my $query = <<" END";
["query", "$git_work_tree", { ["query", "$git_work_tree", {
"since": $time, "since": $time,
"fields": ["name"], "fields": ["name"]
"expression": ["not", ["allof", ["since", $time, "cclock"], ["not", "exists"]]]
}] }]
END END