Skip to content

Commit

Permalink
Merge branch 'js/gc-prune'
Browse files Browse the repository at this point in the history
* js/gc-prune:
  gc: make --prune useful again by accepting an optional parameter
  • Loading branch information
Junio C Hamano committed Feb 15, 2009
2 parents b43174e + 58e9d9d commit 43e35f6
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 8 deletions.
10 changes: 9 additions & 1 deletion Documentation/git-gc.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ git-gc - Cleanup unnecessary files and optimize the local repository

SYNOPSIS
--------
'git gc' [--aggressive] [--auto] [--quiet]
'git gc' [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune]

DESCRIPTION
-----------
Expand Down Expand Up @@ -59,6 +59,14 @@ are consolidated into a single pack by using the `-A` option of
'git-repack'. Setting `gc.autopacklimit` to 0 disables
automatic consolidation of packs.

--prune=<date>::
Prune loose objects older than date (default is 2 weeks ago,
overrideable by the config variable `gc.pruneExpire`). This
option is on by default.

--no-prune::
Do not prune any loose objects.

--quiet::
Suppress all progress reports.

Expand Down
19 changes: 12 additions & 7 deletions builtin-gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,8 @@ static int need_to_gc(void)
*/
if (too_many_packs())
append_option(argv_repack,
!strcmp(prune_expire, "now") ? "-a" : "-A",
prune_expire && !strcmp(prune_expire, "now") ?
"-a" : "-A",
MAX_ADD);
else if (!too_many_loose_objects())
return 0;
Expand All @@ -173,14 +174,15 @@ static int need_to_gc(void)

int cmd_gc(int argc, const char **argv, const char *prefix)
{
int prune = 0;
int aggressive = 0;
int auto_gc = 0;
int quiet = 0;
char buf[80];

struct option builtin_gc_options[] = {
OPT_BOOLEAN(0, "prune", &prune, "prune unreferenced objects (deprecated)"),
{ OPTION_STRING, 0, "prune", &prune_expire, "date",
"prune unreferenced objects",
PARSE_OPT_OPTARG, NULL, (intptr_t)prune_expire },
OPT_BOOLEAN(0, "aggressive", &aggressive, "be more thorough (increased runtime)"),
OPT_BOOLEAN(0, "auto", &auto_gc, "enable auto-gc mode"),
OPT_BOOLEAN('q', "quiet", &quiet, "suppress progress reports"),
Expand Down Expand Up @@ -218,7 +220,8 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
"\"git help gc\" for more information.\n");
} else
append_option(argv_repack,
!strcmp(prune_expire, "now") ? "-a" : "-A",
prune_expire && !strcmp(prune_expire, "now")
? "-a" : "-A",
MAX_ADD);

if (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))
Expand All @@ -230,9 +233,11 @@ 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]);

argv_prune[2] = prune_expire;
if (run_command_v_opt(argv_prune, RUN_GIT_CMD))
return error(FAILED_RUN, argv_prune[0]);
if (prune_expire) {
argv_prune[2] = prune_expire;
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))
return error(FAILED_RUN, argv_rerere[0]);
Expand Down
38 changes: 38 additions & 0 deletions t/t5304-prune.sh
Original file line number Diff line number Diff line change
Expand Up @@ -112,4 +112,42 @@ test_expect_success 'prune: do not prune heads listed as an argument' '
'

test_expect_success 'gc --no-prune' '
before=$(git count-objects | sed "s/ .*//") &&
BLOB=$(echo aleph_0 | 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 &&
test-chmtime =-$((86400*5001)) $BLOB_FILE &&
git config gc.pruneExpire 2.days.ago &&
git gc --no-prune &&
test 1 = $(git count-objects | sed "s/ .*//") &&
test -f $BLOB_FILE
'

test_expect_success 'gc respects gc.pruneExpire' '
git config gc.pruneExpire 5002.days.ago &&
git gc &&
test -f $BLOB_FILE &&
git config gc.pruneExpire 5000.days.ago &&
git gc &&
test ! -f $BLOB_FILE
'

test_expect_success 'gc --prune=<date>' '
BLOB=$(echo aleph_0 | git hash-object -w --stdin) &&
BLOB_FILE=.git/objects/$(echo $BLOB | sed "s/^../&\//") &&
test-chmtime =-$((86400*5001)) $BLOB_FILE &&
git gc --prune=5002.days.ago &&
test -f $BLOB_FILE &&
git gc --prune=5000.days.ago &&
test ! -f $BLOB_FILE
'

test_done

0 comments on commit 43e35f6

Please sign in to comment.