[PATCH] Add git svn gc command

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Add a git svn gc command that gzips all unhandled.log files, and removes all index files under .git/svn.

Signed-off-by: Robert Allan Zeh <robert.a.zeh@xxxxxxxxx>
---
 Documentation/git-svn.txt |    4 ++++
 git-svn.perl              |   37 +++++++++++++++++++++++++++++++++++++
t/t9140-git-svn-gc.sh | 45 ++++++++++++++++++++++++++++++++++++ +++++++++
 3 files changed, 86 insertions(+), 0 deletions(-)
 create mode 100755 t/t9140-git-svn-gc.sh

diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index 10af599..6d0753e 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -348,6 +348,10 @@ Any other arguments are passed directly to 'git log'
        "checksum mismatch" (missed a modification).  If the problem
        file cannot be ignored forever (with --ignore-paths) the only
        way to repair the repo is to use 'reset'.
+
+'gc':: Compress $GIT_DIR/svn/<refname>/unhandled.log files in .git/svn
+    and remove $GIT_DIR/svn/<refname>index files in .git/svn.
+
 +
 Only the rev_map and refs/remotes/git-svn are changed.  Follow 'reset'
 with a 'fetch' and then 'git reset' or 'git rebase' to move local
diff --git a/git-svn.perl b/git-svn.perl
index cfade63..022efc0 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -35,11 +35,14 @@ push @Git::SVN::Ra::ISA, 'SVN::Ra';
 push @SVN::Git::Editor::ISA, 'SVN::Delta::Editor';
 push @SVN::Git::Fetcher::ISA, 'SVN::Delta::Editor';
 use Carp qw/croak/;
+use Compress::Zlib;
 use Digest::MD5;
 use IO::File qw//;
 use File::Basename qw/dirname basename/;
 use File::Path qw/mkpath/;
 use File::Spec;
+use File::Find;
+use File::Basename;
 use Getopt::Long qw/:config gnu_getopt no_ignore_case auto_abbrev/;
 use IPC::Open3;
 use Git;
@@ -217,6 +220,9 @@ my %cmd = (
                     "Undo fetches back to the specified SVN revision",
                     { 'revision|r=s' => \$_revision,
                       'parent|p' => \$_fetch_parent } ],
+    'gc' => [ \&cmd_gc,
+ "Compress unhandled.log files in .git/svn and remove index files in .git/svn",
+              {} ],
 );

 my $cmd;
@@ -1107,6 +1113,18 @@ sub cmd_reset {
        print "r$r = $c ($gs->{ref_id})\n";
 }

+sub cmd_gc
+{
+    use Cwd;
+       my $git_dir = $ENV{GIT_DIR};
+    my $svn_dir = "$git_dir/svn";
+    print getcwd;
+    print "\n";
+    find({ wanted => \&gc_directory,
+           no_chdir => 1},
+         "$git_dir/svn");
+}
+
########################### utility functions #########################

 sub rebase_cmd {
@@ -1527,6 +1545,25 @@ sub md5sum {
        return $md5->hexdigest();
 }

+sub gc_directory {
+    if (-f $_ && basename($_) eq "unhandled.log") {
+        my $out_filename = $_ . ".gz";
+        print $out_filename, "\n";
+        open my $in_fh, "<", $_ or die "Unable to open $_: $!\n";
+        binmode $in_fh;
+ my $gz = gzopen($out_filename, "wb") or die "Unable to open $out_filename: $!\n";
+
+        my $res;
+        while ($res = sysread($in_fh, my $str, 1024)) {
+            $gz->gzwrite($str) or die "Unable to write: $gzerrno\n";
+        }
+        unlink $_ or die "unlink $File::Find::name: $!\n";
+    } elsif (-f $_ && basename($_) eq "index") {
+        unlink $_ or die "unlink %_: $!\n";
+    }
+}
+
+
 package Git::SVN;
 use strict;
 use warnings;
diff --git a/t/t9140-git-svn-gc.sh b/t/t9140-git-svn-gc.sh
new file mode 100755
index 0000000..545b6c7
--- /dev/null
+++ b/t/t9140-git-svn-gc.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Robert Allan Zeh
+
+test_description='git svn gc basic tests'
+
+. ./lib-git-svn.sh
+
+mkdir import
+mkdir tmp
+cd import
+    cat >> test.txt <<\EOF
+Sample text for Subversion repository.
+EOF
+    svn_cmd import -m 'import for git svn' . "$svnrepo" > /dev/null
+cd ..
+test_expect_success 'checkout working copy from svn' 'svn co "$svnrepo" test_wc' +test_expect_success 'set some properties to create an unhandled.log file' \
+    'cd test_wc &&
+         svn_cmd propset foo bar test.txt &&
+         svn_cmd commit -m "property set"
+     cd ..'
+
+test_expect_success \
+    'Setup repo and fetch' '
+     git svn init "$svnrepo" &&
+     git svn fetch'
+
+test_expect_success \
+    'make backup copy of unhandled.log' '
+     cp .git/svn/git-svn/unhandled.log tmp'
+
+test_expect_success \
+    'git svn gc runs' '
+     git svn gc'
+
+test_expect_success \
+    'git svn gc produces a valid gzip file' '
+     gunzip .git/svn/git-svn/unhandled.log.gz'
+
+test_expect_success \
+    'git svn gc does not change unhandled.log files' '
+     test_cmp .git/svn/git-svn/unhandled.log tmp/unhandled.log'
+
+test_done
--
1.6.4.rc1.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]