git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] git gc --auto: defer on battery

From
Miklos Vajna <vmiklos@frugalware.org>
Date
Mar 30, 2008, 23:14 UTC
Message-ID
<20080330231408.GR11666@genesis>

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@frugalware.org>
---

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;
+
+	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;
+}
+
 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;
 }
 
-- 
1.5.4.5
Next: Björn Steinbrink
Message 1 of 27 in “git gc --auto: defer on battery”
  1. git gc --auto: defer on batteryMiklos Vajna, Mar 30, 2008
  2. Björn SteinbrinkMar 30, 2008
  3. git gc --auto: defer on batteryMiklos Vajna, Mar 30, 2008
  4. Björn SteinbrinkMar 30, 2008
  5. Linus TorvaldsMar 30, 2008
  6. Björn SteinbrinkMar 31, 2008
  7. Junio C HamanoMar 31, 2008
  8. Linus TorvaldsMar 31, 2008
  9. Björn SteinbrinkMar 31, 2008
  10. fetchmail (Re: [PATCH] git gc --auto: defer on battery)Linus Torvalds, Mar 31, 2008
  11. commit: resurrect "gc --auto" at the endJohannes Schindelin, Apr 2, 2008
  12. Johannes SchindelinMay 14, 2008
  13. Junio C HamanoMay 14, 2008
  14. Johannes SchindelinMay 14, 2008
  15. Holger SchurigMay 15, 2008
  16. 0/4 add pre-auto-gc hook for git-gc --autoMiklos Vajna, Mar 31, 2008
  17. 1/4 git-gc --auto: add pre-auto-gc hookMiklos Vajna, Mar 31, 2008
  18. 2/4 git-gc: add a --no-verify option to bypass the pre-auto-gc hookMiklos Vajna, Mar 31, 2008
  19. 3/4 Documentation/hooks: add pre-auto-gc hookMiklos Vajna, Mar 31, 2008
  20. 4/4 templates: add an example pre-auto-gc hookMiklos Vajna, Mar 31, 2008
  21. Brian GernhardtMar 31, 2008
  22. Joey HessMar 31, 2008
  23. Johannes SchindelinMar 30, 2008
  24. Miklos VajnaMar 30, 2008
  25. Brandon CaseyMar 31, 2008
  26. Miklos VajnaMar 31, 2008
  27. Brandon CaseyMar 31, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.