Re: [PATCH] Added git svn gc command

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

 



Hmmm.... I did edit it afterwards in the GMail draft folder. Oops. Sorry for all the trouble getting the patch properly formatted.

Pushing out the patch is just fine with me.

I did mean $_ in the "unlink %_:$!\n";

Robert

On Jul 23, 2009, at 2:56 AM, Eric Wong wrote:

Robert Zeh <robert.a.zeh@xxxxxxxxx> wrote:
Eric,

Ok, here is a try sent with
git format-patch -M --stdout HEAD~1  | git imap-send

Hi Robert,

Did you edit it afterwards?  At least the original commit message was
lost and some long lines were wrapped.  But there were only a few bad
lines so I went ahead and massaged the patch in and applied it.

Minor changes I made:

 * wrapped the test setup in test_expect_success to check for errors

 * use "(cd )" in subshells to make ourselves less error-prone

 * formatting changes, long lines really bother me, and some lines
   in the tests were wrapped unnecessarily.

 * Removed redundant "use File::Basename", it was use'd a few lines
   above and we don't depend on any new functions with this patch.

 * The "%_" in "unlink %_: $!\n" confused me, I assume you meant "$_"?
   I don't think %_ does anything special, it's not in the perlvar
   manpage at least...

 * moved the command documentation above the section for "reset",
   the reset docs continue for several paragraphs.

 * "svn" should always be "svn_cmd" in tests

I renamed the test tot9142-git-svn-gc.sh  keep up with the two tests
that have been added.

It's up to t9143, now :)

I'll push the following patch out if it's alright with you.
Thanks again!

From 845c3deea6905dec2e0b82da45e1f938d66efbbc Mon Sep 17 00:00:00 2001
From: Robert Allan Zeh <robert.a.zeh@xxxxxxxxx>
Date: Sun, 19 Jul 2009 18:00:52 -0500
Subject: [PATCH] git svn: add gc command

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>
Signed-off-by: Eric Wong <normalperson@xxxxxxxx>
---
Documentation/git-svn.txt |    4 ++++
git-svn.perl              |   33 +++++++++++++++++++++++++++++++++
t/t9143-git-svn-gc.sh | 44 ++++++++++++++++++++++++++++++++++++ ++++++++
3 files changed, 81 insertions(+), 0 deletions(-)
create mode 100755 t/t9143-git-svn-gc.sh

diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index 10af599..068aa58 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -338,6 +338,10 @@ Any other arguments are passed directly to 'git log'
	Shows the Subversion externals.  Use -r/--revision to specify a
	specific revision.

+'gc'::
+	Compress $GIT_DIR/svn/<refname>/unhandled.log files in .git/svn
+	and remove $GIT_DIR/svn/<refname>index files in .git/svn.
+
'reset'::
	Undoes the effects of 'fetch' back to the specified revision.
	This allows you to re-'fetch' an SVN revision.  Normally the
diff --git a/git-svn.perl b/git-svn.perl
index 9369acc..7015920 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,7 @@ use IO::File qw//;
use File::Basename qw/dirname basename/;
use File::Path qw/mkpath/;
use File::Spec;
+use File::Find;
use Getopt::Long qw/:config gnu_getopt no_ignore_case auto_abbrev/;
use IPC::Open3;
use Git;
@@ -217,6 +219,10 @@ 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,14 @@ 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 +1541,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/t9143-git-svn-gc.sh b/t/t9143-git-svn-gc.sh
new file mode 100755
index 0000000..aaa3af0
--- /dev/null
+++ b/t/t9143-git-svn-gc.sh
@@ -0,0 +1,44 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Robert Allan Zeh
+
+test_description='git svn gc basic tests'
+
+. ./lib-git-svn.sh
+
+test_expect_success 'setup directories and test repo' '
+	mkdir import &&
+	mkdir tmp &&
+	echo "Sample text for Subversion repository." > import/test.txt &&
+	svn_cmd import -m "import for git svn" import "$svnrepo" > /dev/null
+	'
+
+test_expect_success 'checkout working copy from svn' \
+	'svn_cmd 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"
+	)'
+
+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
--
Eric Wong

--
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]