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

[PATCH] Add git svn gc command

From
Robert Zeh <robert.a.zeh@gmail.com>
Date
Jul 19, 2009, 23:00 UTC
Message-ID
<8E0EFA3B-E8C0-4030-8BAE-E8EF65694031@gmail.com>

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@gmail.com>
---
  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
Next: Eric Wong
Message 1 of 8 in “Add git svn gc command”
  1. Add git svn gc commandRobert Zeh, Jul 19, 2009
  2. Eric WongJul 20, 2009
  3. demerphqJul 20, 2009
  4. Eric WongJul 20, 2009
  5. demerphqJul 20, 2009
  6. Thomas RastJul 20, 2009
  7. demerphqJul 20, 2009
  8. Eric WongJul 21, 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.