diff options
author | Junio C Hamano <gitster@pobox.com> | 2020-11-18 13:32:52 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-11-18 13:32:52 -0800 |
commit | a643735c176798fbcfd1c885349c5471c3c57a08 (patch) | |
tree | afb04e3b1bc53887a1ca1cd086ca2af60faefd36 | |
parent | Merge branch 'en/merge-tests' (diff) | |
parent | t/perf/fsmonitor: add benchmark for dirty status (diff) | |
download | tgif-a643735c176798fbcfd1c885349c5471c3c57a08.tar.xz |
Merge branch 'nk/perf-fsmonitor'
Add t/perf support for fsmonitor.
* nk/perf-fsmonitor:
t/perf/fsmonitor: add benchmark for dirty status
t/perf/fsmonitor: perf comparison of multiple fsmonitor integrations
t/perf/fsmonitor: initialize test with git reset
t/perf/fsmonitor: factor setup for fsmonitor into function
t/perf/fsmonitor: silence initial git commit
t/perf/fsmonitor: shorten DESC to basename
t/perf/fsmonitor: factor description out for readability
t/perf/fsmonitor: improve error message if typoing hook name
t/perf/fsmonitor: move watchman setup to one-time-repo-setup
t/perf/fsmonitor: separate one time repo initialization
-rwxr-xr-x | t/perf/p7519-fsmonitor.sh | 94 |
1 files changed, 63 insertions, 31 deletions
diff --git a/t/perf/p7519-fsmonitor.sh b/t/perf/p7519-fsmonitor.sh index fb20fe0937..163a13bea3 100755 --- a/t/perf/p7519-fsmonitor.sh +++ b/t/perf/p7519-fsmonitor.sh @@ -22,7 +22,9 @@ test_description="Test core.fsmonitor" # # GIT_PERF_7519_UNTRACKED_CACHE: used to configure core.untrackedCache # GIT_PERF_7519_SPLIT_INDEX: used to configure core.splitIndex -# GIT_PERF_7519_FSMONITOR: used to configure core.fsMonitor +# GIT_PERF_7519_FSMONITOR: used to configure core.fsMonitor. May be an +# absolute path to an integration. May be a space delimited list of +# absolute paths to integrations. # # The big win for using fsmonitor is the elimination of the need to scan the # working directory looking for changed and untracked files. If the file @@ -68,7 +70,7 @@ then fi fi -test_expect_success "setup for fsmonitor" ' +test_expect_success "one time repo setup" ' # set untrackedCache depending on the environment if test -n "$GIT_PERF_7519_UNTRACKED_CACHE" then @@ -88,24 +90,36 @@ test_expect_success "setup for fsmonitor" ' git config core.splitIndex "$GIT_PERF_7519_SPLIT_INDEX" fi && + mkdir 1_file 10_files 100_files 1000_files 10000_files && + for i in $(test_seq 1 10); do touch 10_files/$i; done && + for i in $(test_seq 1 100); do touch 100_files/$i; done && + for i in $(test_seq 1 1000); do touch 1000_files/$i; done && + for i in $(test_seq 1 10000); do touch 10000_files/$i; done && + git add 1_file 10_files 100_files 1000_files 10000_files && + git commit -qm "Add files" && + + # If Watchman exists, watch the work tree and attempt a query. + if test_have_prereq WATCHMAN; then + watchman watch "$GIT_WORK_TREE" && + watchman watch-list | grep -q -F "$GIT_WORK_TREE" + fi +' + +setup_for_fsmonitor() { # set INTEGRATION_SCRIPT depending on the environment - if test -n "$GIT_PERF_7519_FSMONITOR" + if test -n "$INTEGRATION_PATH" then - INTEGRATION_SCRIPT="$GIT_PERF_7519_FSMONITOR" + INTEGRATION_SCRIPT="$INTEGRATION_PATH" else # # Choose integration script based on existence of Watchman. - # If Watchman exists, watch the work tree and attempt a query. - # If everything succeeds, use Watchman integration script, - # else fall back to an empty integration script. + # Fall back to an empty integration script. # mkdir .git/hooks && if test_have_prereq WATCHMAN then INTEGRATION_SCRIPT=".git/hooks/fsmonitor-watchman" && - cp "$TEST_DIRECTORY/../templates/hooks--fsmonitor-watchman.sample" "$INTEGRATION_SCRIPT" && - watchman watch "$GIT_WORK_TREE" && - watchman watch-list | grep -q -F "$GIT_WORK_TREE" + cp "$TEST_DIRECTORY/../templates/hooks--fsmonitor-watchman.sample" "$INTEGRATION_SCRIPT" else INTEGRATION_SCRIPT=".git/hooks/fsmonitor-empty" && write_script "$INTEGRATION_SCRIPT"<<-\EOF @@ -114,16 +128,10 @@ test_expect_success "setup for fsmonitor" ' fi && git config core.fsmonitor "$INTEGRATION_SCRIPT" && - git update-index --fsmonitor && - mkdir 1_file 10_files 100_files 1000_files 10000_files && - for i in $(test_seq 1 10); do touch 10_files/$i; done && - for i in $(test_seq 1 100); do touch 100_files/$i; done && - for i in $(test_seq 1 1000); do touch 1000_files/$i; done && - for i in $(test_seq 1 10000); do touch 10000_files/$i; done && - git add 1_file 10_files 100_files 1000_files 10000_files && - git commit -m "Add files" && - git status # Warm caches -' + git update-index --fsmonitor 2>error && + cat error && + [ ! -s error ] # ensure no silent error +} test_perf_w_drop_caches () { if test -n "$GIT_PERF_7519_DROP_CACHE"; then @@ -134,48 +142,72 @@ test_perf_w_drop_caches () { } test_fsmonitor_suite() { - test_perf_w_drop_caches "status (fsmonitor=$INTEGRATION_SCRIPT)" ' + if test -n "$INTEGRATION_SCRIPT"; then + DESC="fsmonitor=$(basename $INTEGRATION_SCRIPT)" + else + DESC="fsmonitor=disabled" + fi + + test_expect_success "test_initialization" ' + git reset --hard && + git status # Warm caches + ' + + test_perf_w_drop_caches "status ($DESC)" ' git status ' - test_perf_w_drop_caches "status -uno (fsmonitor=$INTEGRATION_SCRIPT)" ' + test_perf_w_drop_caches "status -uno ($DESC)" ' git status -uno ' - test_perf_w_drop_caches "status -uall (fsmonitor=$INTEGRATION_SCRIPT)" ' + test_perf_w_drop_caches "status -uall ($DESC)" ' git status -uall ' - test_perf_w_drop_caches "diff (fsmonitor=$INTEGRATION_SCRIPT)" ' + test_perf_w_drop_caches "status (dirty) ($DESC)" ' + git ls-files | head -100000 | xargs -d "\n" touch -h && + git status + ' + + test_perf_w_drop_caches "diff ($DESC)" ' git diff ' - test_perf_w_drop_caches "diff -- 0_files (fsmonitor=$INTEGRATION_SCRIPT)" ' + test_perf_w_drop_caches "diff -- 0_files ($DESC)" ' git diff -- 1_file ' - test_perf_w_drop_caches "diff -- 10_files (fsmonitor=$INTEGRATION_SCRIPT)" ' + test_perf_w_drop_caches "diff -- 10_files ($DESC)" ' git diff -- 10_files ' - test_perf_w_drop_caches "diff -- 100_files (fsmonitor=$INTEGRATION_SCRIPT)" ' + test_perf_w_drop_caches "diff -- 100_files ($DESC)" ' git diff -- 100_files ' - test_perf_w_drop_caches "diff -- 1000_files (fsmonitor=$INTEGRATION_SCRIPT)" ' + test_perf_w_drop_caches "diff -- 1000_files ($DESC)" ' git diff -- 1000_files ' - test_perf_w_drop_caches "diff -- 10000_files (fsmonitor=$INTEGRATION_SCRIPT)" ' + test_perf_w_drop_caches "diff -- 10000_files ($DESC)" ' git diff -- 10000_files ' - test_perf_w_drop_caches "add (fsmonitor=$INTEGRATION_SCRIPT)" ' + test_perf_w_drop_caches "add ($DESC)" ' git add --all ' } -test_fsmonitor_suite +if test -n "$GIT_PERF_7519_FSMONITOR"; then + for INTEGRATION_PATH in $GIT_PERF_7519_FSMONITOR; do + test_expect_success "setup for fsmonitor $INTEGRATION_PATH" 'setup_for_fsmonitor' + test_fsmonitor_suite + done +else + test_expect_success "setup for fsmonitor" 'setup_for_fsmonitor' + test_fsmonitor_suite +fi test_expect_success "setup without fsmonitor" ' unset INTEGRATION_SCRIPT && |