git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Added git svn gc command

From
Robert Zeh <robert.a.zeh@gmail.com>
Date
Jul 22, 2009, 22:26 UTC
Message-ID
<57d579150907221526m6d2ec48dj1fa731e071fe7a68@mail.gmail.com>
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
Next: Eric Wong
Message 1 of 3 in “Re: [PATCH] Added git svn gc command”
  1. Robert ZehJul 22, 2009
  2. Eric WongJul 23, 2009
  3. Robert ZehJul 23, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.