Code

prune: honor --expire=never
authorAdam Simpkins <simpkins@facebook.com>
Sat, 27 Feb 2010 03:50:02 +0000 (19:50 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 28 Feb 2010 18:28:05 +0000 (10:28 -0800)
Previously, prune treated an expiration time of 0 to mean that no
expire argument was supplied, and everything should be pruned.  As a
result, "prune --expire=never" would prune all unreachable objects,
regardless of their timestamp.

prune can be called with --expire=never automatically by gc, when the
gc.pruneExpire configuration is set to "never".

Signed-off-by: Adam Simpkins <simpkins@facebook.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-prune.c
t/t5304-prune.sh

index 4675f6054fd646622443fc86908c15412d8afd80..81f915ec315eb75e529fed8f2f6bab436755f598 100644 (file)
@@ -18,13 +18,11 @@ static unsigned long expire;
 static int prune_tmp_object(const char *path, const char *filename)
 {
        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;
-       }
+       struct stat st;
+       if (lstat(fullpath, &st))
+               return error("Could not stat '%s'", fullpath);
+       if (st.st_mtime > expire)
+               return 0;
        printf("Removing stale temporary file %s\n", fullpath);
        if (!show_only)
                unlink_or_warn(fullpath);
@@ -34,13 +32,11 @@ static int prune_tmp_object(const char *path, const char *filename)
 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;
-       }
+       struct stat st;
+       if (lstat(fullpath, &st))
+               return error("Could not stat '%s'", fullpath);
+       if (st.st_mtime > expire)
+               return 0;
        if (show_only || verbose) {
                enum object_type type = sha1_object_info(sha1, NULL);
                printf("%s %s\n", sha1_to_hex(sha1),
@@ -139,6 +135,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
        };
        char *s;
 
+       expire = ULONG_MAX;
        save_commit_buffer = 0;
        read_replace_refs = 0;
        init_revisions(&revs, prefix);
index 3c6687abecf6b74839315c5e3dc09f361154a68c..e2ed13dba2705b15d6a1f623589acce134749fab 100755 (executable)
@@ -148,6 +148,38 @@ test_expect_success 'gc --prune=<date>' '
 
 '
 
+test_expect_success 'gc --prune=never' '
+
+       add_blob &&
+       git gc --prune=never &&
+       test -f $BLOB_FILE &&
+       git gc --prune=now &&
+       test ! -f $BLOB_FILE
+
+'
+
+test_expect_success 'gc respects gc.pruneExpire=never' '
+
+       git config gc.pruneExpire never &&
+       add_blob &&
+       git gc &&
+       test -f $BLOB_FILE &&
+       git config gc.pruneExpire now &&
+       git gc &&
+       test ! -f $BLOB_FILE
+
+'
+
+test_expect_success 'prune --expire=never' '
+
+       add_blob &&
+       git prune --expire=never &&
+       test -f $BLOB_FILE &&
+       git prune &&
+       test ! -f $BLOB_FILE
+
+'
+
 test_expect_success 'gc: prune old objects after local clone' '
        add_blob &&
        test-chmtime =-$((2*$week+1)) $BLOB_FILE &&