@@ -13,7 +13,7 @@ fi
stop_daemon_delete_repo () {
r=$1 &&
test_might_fail git -C $r fsmonitor--daemon stop &&
- rm -rf $1
+ rm -rf $r
}
start_daemon () {
@@ -72,6 +72,34 @@ start_daemon () {
)
}
+IMPLICIT_TIMEOUT=5
+
+wait_for_update () {
+ func=$1 &&
+ file=$2 &&
+ sz=$(wc -c < "$file") &&
+ last=0 &&
+ $func &&
+ k=0 &&
+ while test "$k" -lt $IMPLICIT_TIMEOUT
+ do
+ nsz=$(wc -c < "$file")
+ if test "$nsz" -gt "$sz"
+ then
+ if test "$last" -eq "$nsz"
+ then
+ cat "$file" &&
+ return 0
+ fi
+ last=$nsz
+ fi
+ sleep 1
+ k=$(( $k + 1 ))
+ done &&
+ cat "$file" &&
+ return 0
+}
+
# Is a Trace2 data event present with the given catetory and key?
# We do not care what the value is.
#
@@ -137,7 +165,6 @@ test_expect_success 'implicit daemon start' '
# machines (where it might take a moment to wake and reschedule the
# daemon process) to avoid false alarms during test runs.)
#
-IMPLICIT_TIMEOUT=5
verify_implicit_shutdown () {
r=$1 &&
@@ -373,6 +400,15 @@ create_files () {
echo 3 >dir2/new
}
+rename_directory () {
+ mv dirtorename dirrenamed
+}
+
+rename_directory_file () {
+ mv dirtorename dirrenamed &&
+ echo 1 > dirrenamed/new
+}
+
rename_files () {
mv rename renamed &&
mv dir1/rename dir1/renamed &&
@@ -427,10 +463,12 @@ test_expect_success 'edit some files' '
start_daemon --tf "$PWD/.git/trace" &&
- edit_files &&
+ wait_for_update edit_files "$PWD/.git/trace" &&
test-tool fsmonitor-client query --token 0 &&
+ test_might_fail git fsmonitor--daemon stop &&
+
grep "^event: dir1/modified$" .git/trace &&
grep "^event: dir2/modified$" .git/trace &&
grep "^event: modified$" .git/trace &&
@@ -442,10 +480,12 @@ test_expect_success 'create some files' '
start_daemon --tf "$PWD/.git/trace" &&
- create_files &&
+ wait_for_update create_files "$PWD/.git/trace" &&
test-tool fsmonitor-client query --token 0 &&
+ test_might_fail git fsmonitor--daemon stop &&
+
grep "^event: dir1/new$" .git/trace &&
grep "^event: dir2/new$" .git/trace &&
grep "^event: new$" .git/trace
@@ -456,10 +496,12 @@ test_expect_success 'delete some files' '
start_daemon --tf "$PWD/.git/trace" &&
- delete_files &&
+ wait_for_update delete_files "$PWD/.git/trace" &&
test-tool fsmonitor-client query --token 0 &&
+ test_might_fail git fsmonitor--daemon stop &&
+
grep "^event: dir1/delete$" .git/trace &&
grep "^event: dir2/delete$" .git/trace &&
grep "^event: delete$" .git/trace
@@ -470,10 +512,12 @@ test_expect_success 'rename some files' '
start_daemon --tf "$PWD/.git/trace" &&
- rename_files &&
+ wait_for_update rename_files "$PWD/.git/trace" &&
test-tool fsmonitor-client query --token 0 &&
+ test_might_fail git fsmonitor--daemon stop &&
+
grep "^event: dir1/rename$" .git/trace &&
grep "^event: dir2/rename$" .git/trace &&
grep "^event: rename$" .git/trace &&
@@ -487,23 +531,42 @@ test_expect_success 'rename directory' '
start_daemon --tf "$PWD/.git/trace" &&
- mv dirtorename dirrenamed &&
+ wait_for_update rename_directory "$PWD/.git/trace" &&
test-tool fsmonitor-client query --token 0 &&
+ test_might_fail git fsmonitor--daemon stop &&
+
grep "^event: dirtorename/*$" .git/trace &&
grep "^event: dirrenamed/*$" .git/trace
'
+test_expect_success 'rename directory file' '
+ test_when_finished clean_up_repo_and_stop_daemon &&
+
+ start_daemon --tf "$PWD/.git/trace" &&
+
+ wait_for_update rename_directory_file "$PWD/.git/trace" &&
+
+ test-tool fsmonitor-client query --token 0 &&
+
+ test_might_fail git fsmonitor--daemon stop &&
+
+ grep "^event: dirtorename/*$" .git/trace &&
+ grep "^event: dirrenamed/*$" .git/trace &&
+ grep "^event: dirrenamed/new$" .git/trace
+'
test_expect_success 'file changes to directory' '
test_when_finished clean_up_repo_and_stop_daemon &&
start_daemon --tf "$PWD/.git/trace" &&
- file_to_directory &&
+ wait_for_update file_to_directory "$PWD/.git/trace" &&
test-tool fsmonitor-client query --token 0 &&
+ test_might_fail git fsmonitor--daemon stop &&
+
grep "^event: delete$" .git/trace &&
grep "^event: delete/new$" .git/trace
'
@@ -513,10 +576,12 @@ test_expect_success 'directory changes to a file' '
start_daemon --tf "$PWD/.git/trace" &&
- directory_to_file &&
+ wait_for_update directory_to_file "$PWD/.git/trace" &&
test-tool fsmonitor-client query --token 0 &&
+ test_might_fail git fsmonitor--daemon stop &&
+
grep "^event: dir1$" .git/trace
'
@@ -561,7 +626,7 @@ test_expect_success 'flush cached data' '
test-tool -C test_flush fsmonitor-client query --token "builtin:test_00000002:0" >actual_2 &&
nul_to_q <actual_2 >actual_q2 &&
- grep "^builtin:test_00000002:0Q$" actual_q2 &&
+ grep "^builtin:test_00000002:[0-1]Q$" actual_q2 &&
>test_flush/file_3 &&
@@ -732,7 +797,8 @@ u_values="$u1 $u2"
for u in $u_values
do
test_expect_success "unicode in repo root path: $u" '
- test_when_finished "stop_daemon_delete_repo $u" &&
+ test_when_finished \
+ "stop_daemon_delete_repo `echo "$u" | sed 's:x:\\\\\\\\\\\\\\x:g'`" &&
git init "$u" &&
echo 1 >"$u"/file1 &&
@@ -823,8 +889,7 @@ test_expect_success 'submodule setup' '
'
test_expect_success 'submodule always visited' '
- test_when_finished "git -C super fsmonitor--daemon stop; \
- rm -rf super; \
+ test_when_finished "rm -rf super; \
rm -rf sub" &&
create_super super &&
@@ -871,10 +936,29 @@ test_expect_success 'submodule always visited' '
# the submodule, and someone does a `git submodule absorbgitdirs`
# in the super, Git will recursively invoke `git submodule--helper`
# to do the work and this may try to read the index. This will
-# try to start the daemon in the submodule.
+# try to start the daemon in the submodule *and* pass (either
+# directly or via inheritance) the `--super-prefix` arg to the
+# `git fsmonitor--daemon start` command inside the submodule.
+# This causes a warning because fsmonitor--daemon does take that
+# global arg (see the table in git.c)
+#
+# This causes a warning when trying to start the daemon that is
+# somewhat confusing. It does not seem to hurt anything because
+# the fsmonitor code maps the query failure into a trivial response
+# and does the work anyway.
+#
+# It would be nice to silence the warning, however.
-test_expect_success "submodule absorbgitdirs implicitly starts daemon" '
- test_when_finished "rm -rf super; \
+have_t2_error_event () {
+ log=$1
+ msg="fsmonitor--daemon doesnQt support --super-prefix" &&
+
+ tr '\047' Q <$1 | grep -e "$msg"
+}
+
+test_expect_success "stray submodule super-prefix warning" '
+ test_when_finished "git -C super/dir_1/dir_2/sub fsmonitor--daemon stop; \
+ rm -rf super; \
rm -rf sub; \
rm super-sub.trace" &&
@@ -891,31 +975,21 @@ test_expect_success "submodule absorbgitdirs implicitly starts daemon" '
test_path_is_dir super/dir_1/dir_2/sub/.git &&
- cwd="$(cd super && pwd)" &&
- cat >expect <<-EOF &&
- Migrating git directory of '\''dir_1/dir_2/sub'\'' from
- '\''$cwd/dir_1/dir_2/sub/.git'\'' to
- '\''$cwd/.git/modules/dir_1/dir_2/sub'\''
- EOF
GIT_TRACE2_EVENT="$PWD/super-sub.trace" \
- git -C super submodule absorbgitdirs >out 2>actual &&
- test_cmp expect actual &&
- test_must_be_empty out &&
+ git -C super submodule absorbgitdirs &&
- # Confirm that the trace2 log contains a record of the
- # daemon starting.
- test_subcommand git fsmonitor--daemon start <super-sub.trace
+ ! have_t2_error_event super-sub.trace
'
# On a case-insensitive file system, confirm that the daemon
# notices when the .git directory is moved/renamed/deleted
-# regardless of how it is spelled in the FS event.
+# regardless of how it is spelled in the the FS event.
# That is, does the FS event receive the spelling of the
# operation or does it receive the spelling preserved with
# the file/directory.
#
test_expect_success CASE_INSENSITIVE_FS 'case insensitive+preserving' '
- test_when_finished "stop_daemon_delete_repo test_insensitive" &&
+# test_when_finished "stop_daemon_delete_repo test_insensitive" &&
git init test_insensitive &&
@@ -927,8 +1001,8 @@ test_expect_success CASE_INSENSITIVE_FS 'case insensitive+preserving' '
test_path_is_dir test_insensitive/.git &&
test_path_is_dir test_insensitive/.GIT &&
- # Rename .git using an alternate spelling to verify that
- # the daemon detects it and automatically shuts down.
+ # Rename .git using an alternate spelling to verify that that
+ # daemon detects it and automatically shuts down.
mv test_insensitive/.GIT test_insensitive/.FOO &&
# See [1] above.