]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'ds/maintenance-part-4'
authorJunio C Hamano <gitster@pobox.com>
Sat, 16 Jan 2021 05:48:45 +0000 (21:48 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sat, 16 Jan 2021 05:48:45 +0000 (21:48 -0800)
Follow-up on the "maintenance part-3" which introduced scheduled
maintenance tasks to support platforms whose native scheduling
methods are not 'cron'.

* ds/maintenance-part-4:
  maintenance: use Windows scheduled tasks
  maintenance: use launchctl on macOS
  maintenance: include 'cron' details in docs
  maintenance: extract platform-specific scheduling

1  2 
Documentation/git-maintenance.txt
builtin/gc.c
t/t7900-maintenance.sh
t/test-lib.sh

Simple merge
diff --cc builtin/gc.c
Simple merge
index 99bf0c7582b3a07ab20cd5cde864058605e48ac4,135505f6195743735de20aaf81c92909fd8efc0c..1074009cc05b29df866a0aee701470b59e35270c
@@@ -406,23 -380,11 +419,23 @@@ test_expect_success 'register and unreg
        test_cmp before actual
  '
  
 +test_expect_success !MINGW 'register and unregister with regex metacharacters' '
 +      META="a+b*c" &&
 +      git init "$META" &&
 +      git -C "$META" maintenance register &&
 +      git config --get-all --show-origin maintenance.repo &&
 +      git config --get-all --global --fixed-value \
 +              maintenance.repo "$(pwd)/$META" &&
 +      git -C "$META" maintenance unregister &&
 +      test_must_fail git config --get-all --global --fixed-value \
 +              maintenance.repo "$(pwd)/$META"
 +'
 +
  test_expect_success 'start from empty cron table' '
-       GIT_TEST_CRONTAB="test-tool crontab cron.txt" git maintenance start &&
+       GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt" git maintenance start &&
  
        # start registers the repo
 -      git config --get --global maintenance.repo "$(pwd)" &&
 +      git config --get --global --fixed-value maintenance.repo "$(pwd)" &&
  
        grep "for-each-repo --config=maintenance.repo maintenance run --schedule=daily" cron.txt &&
        grep "for-each-repo --config=maintenance.repo maintenance run --schedule=hourly" cron.txt &&
  '
  
  test_expect_success 'stop from existing schedule' '
-       GIT_TEST_CRONTAB="test-tool crontab cron.txt" git maintenance stop &&
+       GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt" git maintenance stop &&
  
        # stop does not unregister the repo
 -      git config --get --global maintenance.repo "$(pwd)" &&
 +      git config --get --global --fixed-value maintenance.repo "$(pwd)" &&
  
        # Operation is idempotent
-       GIT_TEST_CRONTAB="test-tool crontab cron.txt" git maintenance stop &&
+       GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt" git maintenance stop &&
        test_must_be_empty cron.txt
  '
  
@@@ -446,22 -408,89 +459,105 @@@ test_expect_success 'start preserves ex
        grep "Important information!" cron.txt
  '
  
-       GIT_TEST_CRONTAB="test-tool crontab cron.txt" git maintenance stop &&
 +test_expect_success 'magic markers are correct' '
 +      grep "GIT MAINTENANCE SCHEDULE" cron.txt >actual &&
 +      cat >expect <<-\EOF &&
 +      # BEGIN GIT MAINTENANCE SCHEDULE
 +      # END GIT MAINTENANCE SCHEDULE
 +      EOF
 +      test_cmp actual expect
 +'
 +
 +test_expect_success 'stop preserves surrounding schedule' '
 +      echo "Crucial information!" >>cron.txt &&
 -      git config --get --global maintenance.repo "$(pwd)" &&
++      GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt" git maintenance stop &&
 +      grep "Important information!" cron.txt &&
 +      grep "Crucial information!" cron.txt
 +'
 +
+ test_expect_success 'start and stop macOS maintenance' '
+       # ensure $HOME can be compared against hook arguments on all platforms
+       pfx=$(cd "$HOME" && pwd) &&
+       write_script print-args <<-\EOF &&
+       echo $* | sed "s:gui/[0-9][0-9]*:gui/[UID]:" >>args
+       EOF
+       rm -f args &&
+       GIT_TEST_MAINT_SCHEDULER=launchctl:./print-args git maintenance start &&
+       # start registers the repo
 -      git config --get --global maintenance.repo "$(pwd)" &&
++      git config --get --global --fixed-value maintenance.repo "$(pwd)" &&
+       ls "$HOME/Library/LaunchAgents" >actual &&
+       cat >expect <<-\EOF &&
+       org.git-scm.git.daily.plist
+       org.git-scm.git.hourly.plist
+       org.git-scm.git.weekly.plist
+       EOF
+       test_cmp expect actual &&
+       rm -f expect &&
+       for frequency in hourly daily weekly
+       do
+               PLIST="$pfx/Library/LaunchAgents/org.git-scm.git.$frequency.plist" &&
+               test_xmllint "$PLIST" &&
+               grep schedule=$frequency "$PLIST" &&
+               echo "bootout gui/[UID] $PLIST" >>expect &&
+               echo "bootstrap gui/[UID] $PLIST" >>expect || return 1
+       done &&
+       test_cmp expect args &&
+       rm -f args &&
+       GIT_TEST_MAINT_SCHEDULER=launchctl:./print-args git maintenance stop &&
+       # stop does not unregister the repo
 -      git config --get --global maintenance.repo "$(pwd)" &&
++      git config --get --global --fixed-value maintenance.repo "$(pwd)" &&
+       printf "bootout gui/[UID] $pfx/Library/LaunchAgents/org.git-scm.git.%s.plist\n" \
+               hourly daily weekly >expect &&
+       test_cmp expect args &&
+       ls "$HOME/Library/LaunchAgents" >actual &&
+       test_line_count = 0 actual
+ '
+ test_expect_success 'start and stop Windows maintenance' '
+       write_script print-args <<-\EOF &&
+       echo $* >>args
+       while test $# -gt 0
+       do
+               case "$1" in
+               /xml) shift; xmlfile=$1; break ;;
+               *) shift ;;
+               esac
+       done
+       test -z "$xmlfile" || cp "$xmlfile" "$xmlfile.xml"
+       EOF
+       rm -f args &&
+       GIT_TEST_MAINT_SCHEDULER="schtasks:./print-args" git maintenance start &&
+       # start registers the repo
 -      git config --get --global maintenance.repo "$(pwd)" &&
++      git config --get --global --fixed-value maintenance.repo "$(pwd)" &&
+       for frequency in hourly daily weekly
+       do
+               grep "/create /tn Git Maintenance ($frequency) /f /xml" args &&
+               file=$(ls .git/schedule_${frequency}*.xml) &&
+               test_xmllint "$file" || return 1
+       done &&
+       rm -f args &&
+       GIT_TEST_MAINT_SCHEDULER="schtasks:./print-args" git maintenance stop &&
+       # stop does not unregister the repo
++      git config --get --global --fixed-value maintenance.repo "$(pwd)" &&
+       printf "/delete /tn Git Maintenance (%s) /f\n" \
+               hourly daily weekly >expect &&
+       test_cmp expect args
+ '
  test_expect_success 'register preserves existing strategy' '
        git config maintenance.strategy none &&
        git maintenance register &&
diff --cc t/test-lib.sh
Simple merge