Merge branch 'js/prune-expire'

* js/prune-expire:
  Add "--expire <time>" option to 'git prune'
This commit is contained in:
Junio C Hamano 2007-12-02 23:03:38 -08:00
commit afcc4f7767
3 changed files with 42 additions and 2 deletions

View File

@ -8,7 +8,7 @@ git-prune - Prune all unreachable objects from the object database
SYNOPSIS SYNOPSIS
-------- --------
'git-prune' [-n] [--] [<head>...] 'git-prune' [-n] [--expire <expire>] [--] [<head>...]
DESCRIPTION DESCRIPTION
----------- -----------
@ -31,6 +31,9 @@ OPTIONS
\--:: \--::
Do not interpret any more arguments as options. Do not interpret any more arguments as options.
\--expire <time>::
Only expire loose objects older than <time>.
<head>...:: <head>...::
In addition to objects In addition to objects
reachable from any of our references, keep objects reachable from any of our references, keep objects

View File

@ -7,15 +7,24 @@
static const char prune_usage[] = "git-prune [-n]"; static const char prune_usage[] = "git-prune [-n]";
static int show_only; static int show_only;
static unsigned long expire;
static int prune_object(char *path, const char *filename, const unsigned char *sha1) static int prune_object(char *path, const char *filename, const unsigned char *sha1)
{ {
const char *fullpath = mkpath("%s/%s", path, filename);
if (expire) {
struct stat st;
if (lstat(fullpath, &st))
return error("Could not stat '%s'", fullpath);
if (st.st_mtime > expire)
return 0;
}
if (show_only) { if (show_only) {
enum object_type type = sha1_object_info(sha1, NULL); enum object_type type = sha1_object_info(sha1, NULL);
printf("%s %s\n", sha1_to_hex(sha1), printf("%s %s\n", sha1_to_hex(sha1),
(type > 0) ? typename(type) : "unknown"); (type > 0) ? typename(type) : "unknown");
} else } else
unlink(mkpath("%s/%s", path, filename)); unlink(fullpath);
return 0; return 0;
} }
@ -85,6 +94,16 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
show_only = 1; show_only = 1;
continue; continue;
} }
if (!strcmp(arg, "--expire")) {
if (++i < argc) {
expire = approxidate(argv[i]);
continue;
}
}
else if (!prefixcmp(arg, "--expire=")) {
expire = approxidate(arg + 9);
continue;
}
usage(prune_usage); usage(prune_usage);
} }

View File

@ -175,4 +175,22 @@ test_expect_success 'recover and check' '
' '
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 test_done