On 2008.03.31 01:14:08 +0200, Miklos Vajna wrote: > This patch modifies git gc --auto so that it will not always repack when > a user is on battery. > > It introduces the new gc.deferonbattery configuration variable, which > defaults to true. If it's true and the user is on battery, it will not > run git gc --auto. > > Signed-off-by: Miklos Vajna <vmiklos@xxxxxxxxxxxxxx> > --- > > Idea is from e2fsprogs, such a repack may take a lot of time and usually > you don't have infinite time when you are on battery.. :) > > If the patch looks OK, just it's too late for 1.5.5, then please let me > know and I'll resend after 1.5.5. > > Thanks. > > Documentation/git-gc.txt | 4 +++ > builtin-gc.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 53 insertions(+), 0 deletions(-) > > diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt > index d424a4e..7d54148 100644 > --- a/Documentation/git-gc.txt > +++ b/Documentation/git-gc.txt > @@ -104,6 +104,10 @@ The optional configuration variable 'gc.pruneExpire' controls how old > the unreferenced loose objects have to be before they are pruned. The > default is "2 weeks ago". > > +The optional configuration variable 'gc.deferonbattery' determines if > +`git gc --auto` should be disabled if the system is running on battery. > +This defaults to true. > + > See Also > -------- > linkgit:git-prune[1] > diff --git a/builtin-gc.c b/builtin-gc.c > index 8cef36f..7beb046 100644 > --- a/builtin-gc.c > +++ b/builtin-gc.c > @@ -23,6 +23,7 @@ static const char * const builtin_gc_usage[] = { > }; > > static int pack_refs = 1; > +static int defer_on_battery = 1; > static int aggressive_window = -1; > static int gc_auto_threshold = 6700; > static int gc_auto_pack_limit = 50; > @@ -67,6 +68,10 @@ static int gc_config(const char *var, const char *value) > prune_expire = xstrdup(value); > return 0; > } > + if (!strcmp(var, "gc.deferonbattery")) { > + defer_on_battery = git_config_bool(var, value); > + return 0; > + } > return git_default_config(var, value); > } > > @@ -157,6 +162,45 @@ static int too_many_packs(void) > return gc_auto_pack_limit <= cnt; > } > > +static int is_on_battery(void) > +{ > + FILE *fp; > + DIR *dir; > + char buf[256], state[256], path[256]; > + unsigned int ac = 0; > + struct dirent* entry; > + > + if (!defer_on_battery) > + return 0; Hm, maybe move that check into need_to_gc instead? Seems a bit weird to lie about the status instead of just skipping the status check. > + > + if ((fp = fopen("/proc/apm", "r"))) { > + if (fscanf(fp, "%s %s %s %x", buf, buf, buf, &ac) != 4) > + ac = 1; > + fclose(fp); > + return ac != 1; > + } > + if((dir = opendir("/proc/acpi/ac_adapter"))) { > + while ((entry = readdir(dir))) { > + if (!strcmp(".", entry->d_name) || !strcmp("..", > + entry->d_name)) > + continue; > + snprintf(path, 255, "/proc/acpi/ac_adapter/%s/state", > + entry->d_name); > + if ((fp = fopen(path, "r"))) { > + if (fscanf(fp, "%s %s", buf, state) != 2) > + state[0] = '\0'; > + fclose(fp); > + if (!strncmp(state, "off-line", 8)) { > + closedir(dir); > + return 1; > + } > + } > + } > + closedir(dir); > + } > + return 0; > +} The /proc stuff is already deprecated IIRC, the new file to check on Linux is /sys/class/power_supply/AC/online. Björn > + > static int need_to_gc(void) > { > /* > @@ -176,6 +220,11 @@ static int need_to_gc(void) > append_option(argv_repack, "-A", MAX_ADD); > else if (!too_many_loose_objects()) > return 0; > + > + if(is_on_battery()) { > + fprintf(stderr, "Auto packing deferred; on battery"); > + return 0; > + } > return 1; > } > -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html