Anonymous avatar Anonymous committed 9b088c4

prune: --grace=time

This option gives grace period to objects that are unreachable
from the refs from getting pruned.

The default value is 24 hours and may be changed using
gc.prunegrace.

Signed-off-by: Matthias Lederhofer <matled@gmx.net>;
Signed-off-by: Junio C Hamano <junkio@cox.net>;

Comments (0)

Files changed (6)

Documentation/git-prune.txt

 
 SYNOPSIS
 --------
-'git-prune' [-n] [--] [<head>...]
+'git-prune' [-n] [--grace=<time>]
 
 DESCRIPTION
 -----------
 	Do not remove anything; just report what it would
 	remove.
 
+--grace=<time>::
+	Do not prune loose objects that are younger than the
+	specified time.  This gives a grace period to newly
+	created objects from getting pruned.
+
+////////////////////////////////////////////
 \--::
 	Do not interpret any more arguments as options.
 
 ------------
 $ git prune $(cd ../another && $(git-rev-parse --all))
 ------------
+////////////////////////////////////////////
 
 Author
 ------
 #include "builtin.h"
 #include "reachable.h"
 
-static const char prune_usage[] = "git-prune [-n]";
+static const char prune_usage[] = "git-prune [-n] [--grace=time]";
 static int show_only;
+static int prune_grace_period;
 
 static int prune_object(char *path, const char *filename, const unsigned char *sha1)
 {
 		char name[100];
 		unsigned char sha1[20];
 		int len = strlen(de->d_name);
+		struct stat st;
 
 		switch (len) {
 		case 2:
 			if (lookup_object(sha1))
 				continue;
 
+			if (prune_grace_period > 0 &&
+			    !stat(mkpath("%s/%s", path, de->d_name), &st) &&
+			    st.st_mtime > prune_grace_period)
+				continue;
+
 			prune_object(path, de->d_name, sha1);
 			continue;
 		}
 	}
 }
 
+static int git_prune_config(const char *var, const char *value)
+{
+	if (!strcmp(var, "gc.prunegrace")) {
+		if (!strcmp(value, "off"))
+			prune_grace_period = 0;
+		else
+			prune_grace_period = approxidate(value);
+		return 0;
+	}
+	return git_default_config(var, value);
+}
+
 int cmd_prune(int argc, const char **argv, const char *prefix)
 {
 	int i;
 	struct rev_info revs;
+	prune_grace_period = time(NULL)-24*60*60;
+
+	git_config(git_prune_config);
 
 	for (i = 1; i < argc; i++) {
 		const char *arg = argv[i];
 			show_only = 1;
 			continue;
 		}
+		if (!strncmp(arg, "--grace=", 8)) {
+			if (!strcmp(arg+8, "off"))
+				prune_grace_period = 0;
+			else
+				prune_grace_period = approxidate(arg+8);
+			continue;
+		}
 		usage(prune_usage);
 	}
 

t/t1410-reflog.sh

 
 	check_have A B C D E F G H I J K L &&
 
-	git prune &&
+	git prune --grace=off &&
 
 	check_have A B C D E F G H I J K L &&
 
 
 	check_have A B C D E F G H I J K L &&
 
-	git prune &&
+	git prune --grace=off &&
 
 	check_have A B C D E F G H I J K L &&
 
 
 test_expect_success 'prune and fsck' '
 
-	git prune &&
+	git prune --grace=off &&
 	check_fsck &&
 
 	check_have A B C D E H L &&

t/t5400-send-pack.sh

 
 test_expect_success 'pack the source repository' '
 	git repack -a -d &&
-	git prune
+	git prune --grace=off
 '
 
 test_expect_success 'pack the destination repository' '
 	cd victim &&
 	git repack -a -d &&
-	git prune &&
+	git prune --grace=off &&
 	cd ..
 '
 

t/t5700-clone-reference.sh

 git add file2 &&
 git commit -m addition &&
 git repack -a -d &&
-git prune'
+git prune --grace=off'
 
 cd "$base_dir"
 
 git add file3 &&
 git commit -m update &&
 git repack -a -d &&
-git prune'
+git prune --grace=off'
 
 cd "$base_dir"
 

t/t5710-info-alternate.sh

 git add file1 &&
 git commit -m "Initial commit" file1 &&
 git repack -a -d &&
-git prune'
+git prune --grace=off'
 
 cd "$base_dir"
 
 git add file2 &&
 git commit -m "next commit" file2 &&
 git repack -a -d -l &&
-git prune'
+git prune --grace=off'
 
 cd "$base_dir"
 
 git add file3 &&
 git commit -m "one more" file3 &&
 git repack -a -d -l &&
-git prune'
+git prune --grace=off'
 
 cd "$base_dir"
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.