Merge branch 'js/prune-expire'
* js/prune-expire: Add "--expire <time>" option to 'git prune'
This commit is contained in:
commit
afcc4f7767
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user