Eric, Ok, here is a try sent with git format-patch -M --stdout HEAD~1 | git imap-send I renamed the test tot9142-git-svn-gc.sh keep up with the two tests that have been added. --- Documentation/git-svn.txt | 4 +++ git-svn.perl | 35 ++++++++++++++++++++++++++++++++ t/t9142-git-svn-gc.sh | 48 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 0 deletions(-) create mode 100755 t/t9142-git-svn-gc.sh diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt index 10af599..2e35997 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..8fa8c09 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -31,6 +31,7 @@ require SVN::Delta; if ($SVN::Core::VERSION lt '1.1.0') { fatal "Need SVN::Core 1.1.0 or better (got $SVN::Core::VERSION)"; } +my $can_compress = eval { require Compress::Zlib; 1}; push @Git::SVN::Ra::ISA, 'SVN::Ra'; push @SVN::Git::Editor::ISA, 'SVN::Delta::Editor'; push @SVN::Git::Fetcher::ISA, 'SVN::Delta::Editor'; @@ -40,6 +41,8 @@ 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,16 @@ sub cmd_reset { print "r$r = $c ($gs->{ref_id})\n"; } +sub cmd_gc +{ + if (!$can_compress) { + warn "Compress::Zlib could not be found; unhandled.log files will not be compressed.\n"; + } + find({ wanted => \&gc_directory, + no_chdir => 1}, + "$ENV{GIT_DIR}/svn"); +} + ########################### utility functions ######################### sub rebase_cmd { @@ -1527,6 +1543,25 @@ sub md5sum { return $md5->hexdigest(); } +sub gc_directory { + if ($can_compress && -f $_ && basename($_) eq "unhandled.log") { + my $out_filename = $_ . ".gz"; + open my $in_fh, "<", $_ or die "Unable to open $_: $!\n"; + binmode $in_fh; + my $gz = Compress::Zlib::gzopen($out_filename, "ab") + 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: " . $gz->gzerror() . "!\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/t9142-git-svn-gc.sh b/t/t9142-git-svn-gc.sh new file mode 100755 index 0000000..a7042a4 --- /dev/null +++ b/t/t9142-git-svn-gc.sh @@ -0,0 +1,48 @@ +#!/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' ' + git svn init "$svnrepo"' + +test_expect_success \ + 'Fetch repo' ' + 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.10.g2a67.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