Merge branch 'mv/defer-gc'

* mv/defer-gc:
  contrib/hooks: add an example pre-auto-gc hook
  Documentation/hooks: add pre-auto-gc hook
  git-gc --auto: add pre-auto-gc hook
maint
Junio C Hamano 2008-04-19 21:12:24 -07:00
commit a2fa254bd2
3 changed files with 74 additions and 0 deletions

View File

@ -276,3 +276,10 @@ probably enable this hook.
Both standard output and standard error output are forwarded to
`git-send-pack` on the other end, so you can simply `echo` messages
for the user.

pre-auto-gc
-----------

This hook is invoked by `git-gc --auto`. It takes no parameter, and
exiting with non-zero status from this script causes the `git-gc --auto`
to abort.

View File

@ -157,6 +157,34 @@ static int too_many_packs(void)
return gc_auto_pack_limit <= cnt;
}

static int run_hook(void)
{
const char *argv[2];
struct child_process hook;
int ret;

argv[0] = git_path("hooks/pre-auto-gc");
argv[1] = NULL;

if (access(argv[0], X_OK) < 0)
return 0;

memset(&hook, 0, sizeof(hook));
hook.argv = argv;
hook.no_stdin = 1;
hook.stdout_to_stderr = 1;

ret = start_command(&hook);
if (ret) {
warning("Could not spawn %s", argv[0]);
return ret;
}
ret = finish_command(&hook);
if (ret == -ERR_RUN_COMMAND_WAITPID_SIGNAL)
warning("%s exited due to uncaught signal", argv[0]);
return ret;
}

static int need_to_gc(void)
{
/*
@ -176,6 +204,9 @@ static int need_to_gc(void)
append_option(argv_repack, "-A", MAX_ADD);
else if (!too_many_loose_objects())
return 0;

if (run_hook())
return 0;
return 1;
}


View File

@ -0,0 +1,36 @@
#!/bin/sh
#
# An example hook script to verify if you are on battery, in case you
# are running Linux. Called by git-gc --auto with no arguments. The hook
# should exit with non-zero status after issuing an appropriate message
# if it wants to stop the auto repacking.
#
# This hook is stored in the contrib/hooks directory. Your distribution
# may have put this somewhere else. If you want to use this hook, you
# should make this script executable then link to it in the repository
# you would like to use it in.
#
# For example, if the hook is stored in
# /usr/share/git-core/contrib/hooks/pre-auto-gc-battery:
#
# chmod a+x pre-auto-gc-battery
# cd /path/to/your/repository.git
# ln -sf /usr/share/git-core/contrib/hooks/pre-auto-gc-battery \
# hooks/pre-auto-gc

if test -x /sbin/on_ac_power && /sbin/on_ac_power
then
exit 0
elif test "$(cat /sys/class/power_supply/AC/online 2>/dev/null)" = 1
then
exit 0
elif grep -q 'on-line' /proc/acpi/ac_adapter/AC/state 2>/dev/null
then
exit 0
elif grep -q '0x01$' /proc/apm 2>/dev/null
then
exit 0
fi

echo "Auto packing deferred; not on AC"
exit 1