aboutsummaryrefslogtreecommitdiff
path: root/src/util/git-gc-repo.pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/git-gc-repo.pl')
-rwxr-xr-xsrc/util/git-gc-repo.pl65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/util/git-gc-repo.pl b/src/util/git-gc-repo.pl
new file mode 100755
index 0000000..21bb03f
--- /dev/null
+++ b/src/util/git-gc-repo.pl
@@ -0,0 +1,65 @@
+#! /usr/bin/perl -w
+
+# Collect garbage in the repository if it grown in size by more than a
+# factor of 10.
+
+# 2010-01-29 Erik Schnetter <schnetter@cct.lsu.edu>
+
+use strict;
+
+
+
+$#ARGV == 1 or die;
+my ($git_cmd, $git_repo) = @ARGV;
+
+my $silent = $ENV{'SILENT'};
+$silent = 'yes' if ! defined $silent;
+$silent = $silent !~ /^no$/i;
+my $silencer = $silent ? '> /dev/null 2>&1' : '';
+
+
+
+# Ensure that the repository exists
+die unless -e "$git_repo/.git";
+$ENV{'GIT_DIR'} = "$git_repo/.git";
+
+
+
+my $git_dir = "$git_repo/.git";
+my $sizefile = "$git_repo/.oldreposize";
+
+# Determine current repository size
+my $reposize = `du -s $git_dir` or die;
+$reposize = (split ' ', $reposize)[0];
+
+# Read old repository size
+my $oldreposize;
+if (open FILE, '<', $sizefile) {
+ $oldreposize = <FILE>;
+ close FILE;
+}
+if (! defined $oldreposize) {
+ $oldreposize = 0;
+}
+
+my $maxreposize = 10 * $oldreposize;
+if ($reposize > $maxreposize) {
+
+ print "Formaline: Optimising git repository (slow only the first time)...\n";
+
+ # Collect garbage
+ print "Executing: $git_cmd gc\n" unless $silent;
+ system "$git_cmd gc $silencer";
+ if ($?) {
+ die "Could not compact repository";
+ }
+
+ # Determine new repository size
+ my $newreposize = `du -s $git_dir` or die;
+ $newreposize = (split ' ', $newreposize)[0];
+
+ # Write new repository size
+ open (FILE, "> $sizefile") or die;
+ print FILE "$newreposize\n" or die;
+ close FILE or die;
+}