fsmonitor: query watchman with right valid json

In rare circumstances where the current git index does not carry the
last_update_token, the fsmonitor v2 hook will be invoked with an
empty string which would caused the final rendered json to be invalid.

  ["query", "/path/to/my/git/repository/", {
          "since": ,
          "fields": ["name"],
          "expression": ["not", ["dirname", ".git"]]
  }]

Which will left user with the following error message

  > git status
  failed to parse command from stdin: line 2, column 13, position 67: unexpected token near ','
  Watchman: command returned no output.
  Falling back to scanning...

Hide the "since" field in json query when "last_update_token" is empty.

Co-authored-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Son Luong Ngoc <sluongng@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Son Luong Ngoc 2022-06-07 13:14:19 +02:00 коммит произвёл Junio C Hamano
Родитель e54793a95a
Коммит 134047b500
1 изменённых файлов: 3 добавлений и 2 удалений

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

@ -86,12 +86,13 @@ sub watchman_query {
# 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. Then we're using the "expression" term to
# further constrain the results. # further constrain the results.
my $last_update_line = "";
if (substr($last_update_token, 0, 1) eq "c") { if (substr($last_update_token, 0, 1) eq "c") {
$last_update_token = "\"$last_update_token\""; $last_update_token = "\"$last_update_token\"";
$last_update_line = qq[\n"since": $last_update_token,];
} }
my $query = <<" END"; my $query = <<" END";
["query", "$git_work_tree", { ["query", "$git_work_tree", {$last_update_line
"since": $last_update_token,
"fields": ["name"], "fields": ["name"],
"expression": ["not", ["dirname", ".git"]] "expression": ["not", ["dirname", ".git"]]
}] }]