git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] gc: call "prune --expire 2.weeks.ago"
@ 2008-03-11 20:58 Johannes Schindelin
  2008-03-12  2:13 ` Junio C Hamano
  0 siblings, 1 reply; 41+ messages in thread
From: Johannes Schindelin @ 2008-03-11 20:58 UTC (permalink / raw)
  To: git, gitster


If "--prune" is passed to gc, it still just calls "git prune".
Otherwise, "prune --expire 2.weeks.ago" is called, where the grace
period is overrideable by the config variable gc.pruneExpire.

While adding a test to t5304-prune.sh (since it really tests the
implicit call to "prune"), the original test for "prune --expire"
is moved there from t1410-reflog.sh, where it did not belong.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---

	I am really tempted to reduce the grace period further, but
	I'd like to hear opinions first.  Is 3.days.ago too short?

 Documentation/config.txt |    5 +++++
 Documentation/git-gc.txt |   16 +++++++++++-----
 builtin-gc.c             |   19 +++++++++++++++++--
 t/t1410-reflog.sh        |   18 ------------------
 t/t5304-prune.sh         |   36 ++++++++++++++++++++++++++++++++++++
 5 files changed, 69 insertions(+), 25 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 14df635..adde89a 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -590,6 +590,11 @@ gc.packrefs::
 	at some stage, and setting this to `false` will continue to
 	prevent `git pack-refs` from being run from `git gc`.
 
+gc.pruneexpire::
+	When `git gc` is run without `--prune`, it will still call
+	`prune`, but with `--expire 2.weeks.ago`.  Override the value
+	with this config variable.
+
 gc.reflogexpire::
 	`git reflog expire` removes reflog entries older than
 	this time; defaults to 90 days.
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
index 2e7be91..2042d9f 100644
--- a/Documentation/git-gc.txt
+++ b/Documentation/git-gc.txt
@@ -28,13 +28,19 @@ OPTIONS
 --prune::
 	Usually `git-gc` packs refs, expires old reflog entries,
 	packs loose objects,
-	and removes old 'rerere' records.  Removal
+	and removes old 'rerere' records.  Unilateral removal
 	of unreferenced loose objects is an unsafe operation
 	while other git operations are in progress, so it is not
-	done by default.  Pass this option if you want it, and only
-	when you know nobody else is creating new objects in the
-	repository at the same time (e.g. never use this option
-	in a cron script).
+	done by default.
++
+Instead, `git-prune` is called with an option telling it to expire
+only unreferenced loose objects that are at least 2 weeks old.  Set
+the config variable `gc.pruneexpire` to override this grace period.
++
+Pass `--prune` to expire all unreferenced loose objects, but only
+when you know nobody else is creating new objects in the
+repository at the same time (e.g. never use this option
+in a cron script).
 
 --aggressive::
 	Usually 'git-gc' runs very quickly while providing good disk
diff --git a/builtin-gc.c b/builtin-gc.c
index 7cad366..8d07350 100644
--- a/builtin-gc.c
+++ b/builtin-gc.c
@@ -26,12 +26,13 @@ static int pack_refs = 1;
 static int aggressive_window = 250;
 static int gc_auto_threshold = 6700;
 static int gc_auto_pack_limit = 20;
+static char *prune_expire = "2.weeks.ago";
 
 #define MAX_ADD 10
 static const char *argv_pack_refs[] = {"pack-refs", "--all", "--prune", NULL};
 static const char *argv_reflog[] = {"reflog", "expire", "--all", NULL};
 static const char *argv_repack[MAX_ADD] = {"repack", "-d", "-l", NULL};
-static const char *argv_prune[] = {"prune", NULL};
+static const char *argv_prune[] = {"prune", NULL, NULL, NULL};
 static const char *argv_rerere[] = {"rerere", "gc", NULL};
 
 static int gc_config(const char *var, const char *value)
@@ -55,6 +56,14 @@ static int gc_config(const char *var, const char *value)
 		gc_auto_pack_limit = git_config_int(var, value);
 		return 0;
 	}
+	if (!strcmp(var, "gc.pruneexpire")) {
+		if (!value)
+			return config_error_nonbool(var);
+		if (!approxidate(value))
+			return error("Invalid gc.pruneExpire: '%s'", value);
+		prune_expire = xstrdup(value);
+		return 0;
+	}
 	return git_default_config(var, value);
 }
 
@@ -235,7 +244,13 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
 	if (run_command_v_opt(argv_repack, RUN_GIT_CMD))
 		return error(FAILED_RUN, argv_repack[0]);
 
-	if (prune && run_command_v_opt(argv_prune, RUN_GIT_CMD))
+	if (!prune) {
+		argv_prune[1] = "--expire";
+		argv_prune[2] = prune_expire;
+		argv_prune[3] = NULL;
+	}
+
+	if (run_command_v_opt(argv_prune, RUN_GIT_CMD))
 		return error(FAILED_RUN, argv_prune[0]);
 
 	if (run_command_v_opt(argv_rerere, RUN_GIT_CMD))
diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh
index 24476be..73f830d 100755
--- a/t/t1410-reflog.sh
+++ b/t/t1410-reflog.sh
@@ -202,22 +202,4 @@ test_expect_success 'delete' '
 
 '
 
-test_expect_success 'prune --expire' '
-
-	before=$(git count-objects | sed "s/ .*//") &&
-	BLOB=$(echo aleph | git hash-object -w --stdin) &&
-	BLOB_FILE=.git/objects/$(echo $BLOB | sed "s/^../&\//") &&
-	test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
-	test -f $BLOB_FILE &&
-	git reset --hard &&
-	git prune --expire=1.hour.ago &&
-	test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
-	test -f $BLOB_FILE &&
-	test-chmtime -86500 $BLOB_FILE &&
-	git prune --expire 1.day &&
-	test $before = $(git count-objects | sed "s/ .*//") &&
-	! test -f $BLOB_FILE
-
-'
-
 test_done
diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh
index 6560af7..2a88b3f 100644
--- a/t/t5304-prune.sh
+++ b/t/t5304-prune.sh
@@ -29,4 +29,40 @@ test_expect_success 'prune stale packs' '
 
 '
 
+test_expect_success 'prune --expire' '
+
+	before=$(git count-objects | sed "s/ .*//") &&
+	BLOB=$(echo aleph | git hash-object -w --stdin) &&
+	BLOB_FILE=.git/objects/$(echo $BLOB | sed "s/^../&\//") &&
+	test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
+	test -f $BLOB_FILE &&
+	git prune --expire=1.hour.ago &&
+	test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
+	test -f $BLOB_FILE &&
+	test-chmtime -86500 $BLOB_FILE &&
+	git prune --expire 1.day &&
+	test $before = $(git count-objects | sed "s/ .*//") &&
+	! test -f $BLOB_FILE
+
+'
+
+test_expect_success 'gc: implicit prune --expire' '
+
+	before=$(git count-objects | sed "s/ .*//") &&
+	BLOB=$(echo aleph_0 | git hash-object -w --stdin) &&
+echo blob: $BLOB &&
+	BLOB_FILE=.git/objects/$(echo $BLOB | sed "s/^../&\//") &&
+	test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
+	test -f $BLOB_FILE &&
+	test-chmtime -$((86400*14-30)) $BLOB_FILE &&
+	git gc &&
+	test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
+	test -f $BLOB_FILE &&
+	test-chmtime -$((86400*14+1)) $BLOB_FILE &&
+	git gc &&
+	test $before = $(git count-objects | sed "s/ .*//") &&
+	! test -f $BLOB_FILE
+
+'
+
 test_done
-- 
1.5.4.4.646.ge37ad

^ permalink raw reply related	[flat|nested] 41+ messages in thread

end of thread, other threads:[~2008-03-13 11:11 UTC | newest]

Thread overview: 41+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-03-11 20:58 [PATCH] gc: call "prune --expire 2.weeks.ago" Johannes Schindelin
2008-03-12  2:13 ` Junio C Hamano
2008-03-12  2:37   ` Nicolas Pitre
2008-03-12  6:49     ` Junio C Hamano
2008-03-12 10:57       ` Johannes Schindelin
2008-03-12 15:45         ` Nicolas Pitre
2008-03-12 15:53           ` Pieter de Bie
2008-03-12 16:05             ` Johannes Schindelin
2008-03-12 17:01               ` Jeff King
2008-03-12 22:50                 ` Pieter de Bie
2008-03-12 23:20                   ` Junio C Hamano
2008-03-12 23:30                     ` Johannes Schindelin
2008-03-12 23:41                       ` Junio C Hamano
2008-03-12 16:20         ` Geert Bosch
2008-03-12 15:07       ` Nicolas Pitre
2008-03-12 15:32         ` Marko Kreen
2008-03-12 17:35     ` [PATCH v2] gc: call "prune --expire 2.weeks.ago" by default Johannes Schindelin
2008-03-12 17:56       ` Brandon Casey
2008-03-12 18:35         ` Jakub Narebski
2008-03-12 19:07           ` Johannes Schindelin
2008-03-12 19:12             ` Junio C Hamano
2008-03-12 19:38               ` Johannes Schindelin
2008-03-12 19:53               ` [PATCH v3] " Johannes Schindelin
2008-03-12 19:55                 ` Johannes Schindelin
2008-03-12 19:55           ` [PATCH v2] " Brandon Casey
2008-03-12 19:59             ` Johannes Schindelin
2008-03-12 20:25               ` Brandon Casey
2008-03-12 20:35                 ` Junio C Hamano
2008-03-12 20:55                   ` [PATCH v4] " Johannes Schindelin
2008-03-12 20:56                     ` Johannes Schindelin
2008-03-12 21:20                     ` Junio C Hamano
2008-03-12 22:40                       ` Nicolas Pitre
2008-03-12 22:50                       ` Johannes Schindelin
2008-03-12 23:13                         ` Junio C Hamano
2008-03-12 23:28                           ` Johannes Schindelin
2008-03-12 23:39                             ` Junio C Hamano
2008-03-12 23:43                               ` Johannes Schindelin
2008-03-13  9:48                               ` Wincent Colaiuta
2008-03-13 10:17                                 ` Johannes Sixt
2008-03-13  9:21                     ` Wincent Colaiuta
2008-03-13 11:11                       ` Johannes Schindelin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).