* Re: [PATCH] Added git svn gc command
@ 2009-07-22 22:26 Robert Zeh
2009-07-23 7:56 ` Eric Wong
0 siblings, 1 reply; 3+ messages in thread
From: Robert Zeh @ 2009-07-22 22:26 UTC (permalink / raw)
To: normalperson; +Cc: git
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] Added git svn gc command
2009-07-22 22:26 [PATCH] Added git svn gc command Robert Zeh
@ 2009-07-23 7:56 ` Eric Wong
2009-07-23 12:30 ` Robert Zeh
0 siblings, 1 reply; 3+ messages in thread
From: Eric Wong @ 2009-07-23 7:56 UTC (permalink / raw)
To: Robert Zeh; +Cc: git
Robert Zeh <robert.a.zeh@gmail.com> 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@gmail.com>
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@gmail.com>
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] Added git svn gc command
2009-07-23 7:56 ` Eric Wong
@ 2009-07-23 12:30 ` Robert Zeh
0 siblings, 0 replies; 3+ messages in thread
From: Robert Zeh @ 2009-07-23 12:30 UTC (permalink / raw)
To: Eric Wong; +Cc: git
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@gmail.com> 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@gmail.com>
> 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@gmail.com>
> Signed-off-by: Eric Wong <normalperson@yhbt.net>
> ---
> 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
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-07-23 12:30 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-22 22:26 [PATCH] Added git svn gc command Robert Zeh
2009-07-23 7:56 ` Eric Wong
2009-07-23 12:30 ` Robert Zeh
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).