git-svnimport breakage as of git-1.4.4

Previous thread: Re: Commit f84871 breaks build on OS X by Pazu on Thursday, December 7, 2006 - 11:20 am. (1 message)

Next thread: Re: Commit f84871 breaks build on OS X by Brian Gernhardt on Thursday, December 7, 2006 - 12:04 pm. (1 message)
To: <git@...>
Cc: <sashak@...>
Date: Thursday, December 7, 2006 - 11:26 am

Hi,

git-svnimport broken between git-1.4.3.5 and git-1.4.4

I have found that commit 83936a29e275bc0c04f60d3333e4951a9e16b1fc is the
cause of this.

I am using git-svnimport to work with a repo with this layout:

https://server/repo/trunk
https://server/repo/tags/x.y.z
https://server/repo/branches/somebranch

Starting a fresh import:

# git-svnimport -v -i -C repo -r https://server repo

Fetching from 1 to 10707 ...
Tree ID 4b825dc642cb6eb9a060e54bf8d69288fbee4904
Committed change 1:/ 2004-12-22 22:53:27)
Committing initial tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
Commit ID 2614c05ac4c5f24eb89cea056a7d46c909084d8c
Writing to refs/heads/origin
DONE: 1 origin 2614c05ac4c5f24eb89cea056a7d46c909084d8c
RA layer request failed: PROPFIND request failed on '/trunk/.cvsignore':
PROPFIND of '/trunk/.cvsignore': 405 Method Not Allowed (https://server)
at /usr/bin/git-svnimport line 358

According to the server logs, git is requesting /trunk/.cvsignore rather
than /repo/trunk/.cvsignore

I'm happy to test patches and whatnot but don't have time to investigate
further right now.

Thanks!
--
Daniel Drake
Brontes Technologies, A 3M Company

-

To: Daniel Drake <ddrake@...>
Cc: <git@...>
Date: Friday, December 8, 2006 - 4:32 pm

Hi,

Is this 'server' public? Can I rerun this git-svnimport?

If not, please try the patch:

diff --git a/git-svnimport.perl b/git-svnimport.perl
index cbaa8ab..b9de446 100755
--- a/git-svnimport.perl
+++ b/git-svnimport.perl
@@ -210,6 +210,12 @@ $svn .= "/$svn_dir" if defined $svn_dir;
my $svn2 = SVNconn->new($svn);
$svn = SVNconn->new($svn);

+if($svn_dir) {
+ $svn_dir =~ s#/*$#/#;
+} else {
+ $svn_dir = "";
+}
+
my $lwp_ua;
if($opt_d or $opt_D) {
$svn_url = URI->new($svn_url)->canonical;
@@ -906,7 +912,7 @@ sub commit_all {
my ($changed_paths, $revision, $author, $date, $message, $pool) = @_;
my %p;
while(my($path,$action) = each %$changed_paths) {
- $p{$path} = [ $action->action,$action->copyfrom_path, $action->copyfrom_rev, $path ];
+ $p{$path} = [ $action->action,$svn_dir$action->copyfrom_path, $action->copyfrom_rev, $svn_dir$path ];
}
$changed_paths = \%p;

Thanks,
Sasha
-

To: Sasha Khapyorsky <sashak@...>
Cc: <git@...>
Date: Monday, December 11, 2006 - 10:27 am

This is not valid perl - I think you wanted $svn_dir . $path

After making that modification it's not fixed though:

Fetching from 1 to 10742 ...
Tree ID 4b825dc642cb6eb9a060e54bf8d69288fbee4904
Committed change 1:/ 2004-12-22 22:53:27)
Committing initial tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
Commit ID 2614c05ac4c5f24eb89cea056a7d46c909084d8c
Writing to refs/heads/origin
DONE: 1 origin 2614c05ac4c5f24eb89cea056a7d46c909084d8c
perl: subversion/libsvn_subr/path.c:377: svn_path_basename: Assertion
`is_canonical (path, len)' failed.
Aborted

--
Daniel Drake
Brontes Technologies, A 3M Company

-

To: Daniel Drake <ddrake@...>
Cc: <git@...>
Date: Monday, December 11, 2006 - 4:49 pm

Maybe I'm starting to understand. Your svn url (url which points to svn
repository) is https://server/repo and not just https://server, right?

If so, please remove the patch (you don't need it) and rerun:

git-svnimport -v -i -C repo -r https://server/repo

Sasha
-

To: Sasha Khapyorsky <sashak@...>
Cc: <git@...>
Date: Wednesday, December 13, 2006 - 12:28 pm

Sorry, apparently I was using the wrong git-svnimport in my last mail.
The above command, with or without your svn_dir patch, doesn't solve the
problem.

With your patch:

# git-svnimport -v -i -C repo -r https://server/repo

RA layer request failed: PROPFIND request failed on '/trunk/.cvsignore':
PROPFIND of '/trunk/.cvsignore': 405 Method Not Allowed (https://svn) at
git-svnimport line 364

# git-svnimport -v -i -C repo -r https://server repo
perl: subversion/libsvn_subr/path.c:377: svn_path_basename: Assertion
`is_canonical (path, len)' failed.
Aborted

Without the patch, the error is the same as the 1st case in both
situations.

--
Daniel Drake
Brontes Technologies, A 3M Company

-

To: Daniel Drake <ddrake@...>
Cc: <git@...>
Date: Wednesday, December 13, 2006 - 10:21 pm

Try this please:

diff --git a/git-svnimport.perl b/git-svnimport.perl
index cbaa8ab..071777b 100755
--- a/git-svnimport.perl
+++ b/git-svnimport.perl
@@ -146,6 +146,7 @@ sub file {
print "... $rev $path ...\n" if $opt_v;
my (undef, $properties);
my $pool = SVN::Pool->new();
+ $path =~ s#^/*##;
eval { (undef, $properties)
= $self->{'svn'}->get_file($path,$rev,$fh,$pool); };
$pool->clear;
@@ -181,6 +182,7 @@ sub ignore {
my($self,$path,$rev) = @_;

print "... $rev $path ...\n" if $opt_v;
+ $path =~ s#^/*##;
my (undef,undef,$properties)
= $self->{'svn'}->get_dir($path,$rev,undef);
if (exists $properties->{'svn:ignore'}) {
@@ -197,6 +199,7 @@ sub ignore {

sub dir_list {
my($self,$path,$rev) = @_;
+ $path =~ s#^/*##;
my ($dirents,undef,$properties)
= $self->{'svn'}->get_dir($path,$rev,undef);
return $dirents;
@@ -354,6 +357,7 @@ open BRANCHES,">>", "$git_dir/svn2git";
sub node_kind($$) {
my ($svnpath, $revision) = @_;
my $pool=SVN::Pool->new;
+ $svnpath =~ s#^/*##;
my $kind = $svn->{'svn'}->check_path($svnpath,$revision,$pool);
$pool->clear;
return $kind;

Thanks,
Sasha
-

To: Sasha Khapyorsky <sashak@...>
Cc: <git@...>
Date: Thursday, December 14, 2006 - 5:05 pm

Thanks, it now works for both forms of command line arguments.

--
Daniel Drake
Brontes Technologies, A 3M Company

-

To: Daniel Drake <ddrake@...>
Cc: Dongsheng Song <dongsheng.song@...>, <git@...>
Date: Thursday, December 14, 2006 - 5:20 pm

Thanks for reporting. I still run git-svnimport against
http://tortoisesvn.tigris.org/svn/tortoisesvn, works fine up to now.

Sasha
-

To: Sasha Khapyorsky <sashak@...>
Cc: <git@...>
Date: Thursday, December 14, 2006 - 5:32 pm

An applicable version of the patch with proposed commit log
message would be much appreciated.

-

To: Junio C Hamano <junkio@...>
Cc: <git@...>
Date: Thursday, December 14, 2006 - 5:43 pm

Sure.

Wanted at least to finish the test (it is running yet), then will
submit the patch in conventional way.

Sasha
-

To: Junio C Hamano <junkio@...>
Cc: <git@...>
Date: Saturday, January 6, 2007 - 8:22 pm

Clean svn path from leading '/' when accessing SVN repo.

Signed-off-by: Sasha Khapyorsky <sashak@voltaire.com>
---

This fixes git-svnimport problems reported in this thread ("git-svnimport
breakage as of git-1.4.4"). Finally I forgot to submit this then, sorry
about that.

git-svnimport.perl | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/git-svnimport.perl b/git-svnimport.perl
index cbaa8ab..071777b 100755
--- a/git-svnimport.perl
+++ b/git-svnimport.perl
@@ -146,6 +146,7 @@ sub file {
print "... $rev $path ...\n" if $opt_v;
my (undef, $properties);
my $pool = SVN::Pool->new();
+ $path =~ s#^/*##;
eval { (undef, $properties)
= $self->{'svn'}->get_file($path,$rev,$fh,$pool); };
$pool->clear;
@@ -181,6 +182,7 @@ sub ignore {
my($self,$path,$rev) = @_;

print "... $rev $path ...\n" if $opt_v;
+ $path =~ s#^/*##;
my (undef,undef,$properties)
= $self->{'svn'}->get_dir($path,$rev,undef);
if (exists $properties->{'svn:ignore'}) {
@@ -197,6 +199,7 @@ sub ignore {

sub dir_list {
my($self,$path,$rev) = @_;
+ $path =~ s#^/*##;
my ($dirents,undef,$properties)
= $self->{'svn'}->get_dir($path,$rev,undef);
return $dirents;
@@ -354,6 +357,7 @@ open BRANCHES,">>", "$git_dir/svn2git";
sub node_kind($$) {
my ($svnpath, $revision) = @_;
my $pool=SVN::Pool->new;
+ $svnpath =~ s#^/*##;
my $kind = $svn->{'svn'}->check_path($svnpath,$revision,$pool);
$pool->clear;
return $kind;
--
1.5.0.rc0.g2484-dirty

-

To: Sasha Khapyorsky <sashak@...>
Cc: <git@...>
Date: Monday, December 11, 2006 - 5:03 pm

Ah, that fixes it. However, in versions before 1.4.4, either invokation
style works.

Thanks,
--
Daniel Drake
Brontes Technologies, A 3M Company

-

To: Daniel Drake <ddrake@...>
Cc: <git@...>
Date: Monday, December 11, 2006 - 6:03 pm

Frankly I think that it was bug. And I will see how to restore this. :)

Sasha
-

To: Sasha Khapyorsky <sashak@...>
Cc: Daniel Drake <ddrake@...>, <git@...>
Date: Saturday, December 9, 2006 - 11:49 pm

I met the broken too, when I downgrade to 1.4.3.4, it's fine.

I have not test your patch, but you can try your self,

http://tortoisesvn.tigris.org/svn/tortoisesvn

and the master branch(today) fail between r6000~r7000 too

-

To: Dongsheng Song <dongsheng.song@...>
Cc: Daniel Drake <ddrake@...>, <git@...>
Date: Sunday, December 10, 2006 - 7:47 am

Thanks for the link. but I cannot access - this requires
username/password authentication.

Sasha
-

To: Sasha Khapyorsky <sashak@...>
Cc: Daniel Drake <ddrake@...>, <git@...>
Date: Monday, December 11, 2006 - 4:00 pm

Sorry, I assume you have see http://tortoisesvn.tigris.org/:

username : guest
password : ""

-

To: Dongsheng Song <dongsheng.song@...>
Cc: Daniel Drake <ddrake@...>, <git@...>
Date: Monday, December 11, 2006 - 4:50 pm

Thanks, I can grab svn log now. Which command line you are using?

Sasha
-

To: Sasha Khapyorsky <sashak@...>
Cc: Daniel Drake <ddrake@...>, <git@...>
Date: Monday, December 11, 2006 - 5:01 pm

$ cat svn2git-tortoisesvn.sh
#!/bin/sh

export LC_ALL=C
export WC_ROOT=/home/cauchy/wc/git
export REPO_NAME=tortoisesvn

echo "[`date`] Start import & pack ..."
mr=0
while [ $mr -le 9000 ]; do

if test -f $WC_ROOT/$REPO_NAME/.git/SVN2GIT_HEAD; then
echo "[`date`] clean up ..."
cd $WC_ROOT/$REPO_NAME
git-read-tree -m -u SVN2GIT_HEAD HEAD && rm -f .git/SVN2GIT_HEAD
echo "[`date`] clean up finished"
fi

mr=$(($mr + 1000))
echo "[`date`] Start import up to revison $mr ..."

git-svnimport -v -i -r -o master -l $mr -C $WC_ROOT/$REPO_NAME
http://tortoisesvn.tigris.org/svn/tortoisesvn

echo "[`date`] Finish import up to revison $mr"

cd $WC_ROOT/$REPO_NAME && git-repack -a -d --window=64 --depth=64

echo "[`date`] Finish repack revison $mr"
cd $WC_ROOT/$REPO_NAME && find .git -name pack | xargs ls -l
done
echo "[`date`] Finished import & pack"

-

To: Dongsheng Song <dongsheng.song@...>
Cc: Daniel Drake <ddrake@...>, <git@...>
Date: Wednesday, December 13, 2006 - 10:25 pm

Thanks.

I'm running now git-svnimport against
http://tortoisesvn.tigris.org/svn/tortoisesvn with follow patch:

diff --git a/git-svnimport.perl b/git-svnimport.perl
index cbaa8ab..071777b 100755
--- a/git-svnimport.perl
+++ b/git-svnimport.perl
@@ -146,6 +146,7 @@ sub file {
print "... $rev $path ...\n" if $opt_v;
my (undef, $properties);
my $pool = SVN::Pool->new();
+ $path =~ s#^/*##;
eval { (undef, $properties)
= $self->{'svn'}->get_file($path,$rev,$fh,$pool); };
$pool->clear;
@@ -181,6 +182,7 @@ sub ignore {
my($self,$path,$rev) = @_;

print "... $rev $path ...\n" if $opt_v;
+ $path =~ s#^/*##;
my (undef,undef,$properties)
= $self->{'svn'}->get_dir($path,$rev,undef);
if (exists $properties->{'svn:ignore'}) {
@@ -197,6 +199,7 @@ sub ignore {

sub dir_list {
my($self,$path,$rev) = @_;
+ $path =~ s#^/*##;
my ($dirents,undef,$properties)
= $self->{'svn'}->get_dir($path,$rev,undef);
return $dirents;
@@ -354,6 +357,7 @@ open BRANCHES,">>", "$git_dir/svn2git";
sub node_kind($$) {
my ($svnpath, $revision) = @_;
my $pool=SVN::Pool->new;
+ $svnpath =~ s#^/*##;
my $kind = $svn->{'svn'}->check_path($svnpath,$revision,$pool);
$pool->clear;
return $kind;

And it works up to now.

This is the same patch as recently posted to Daniel. Could you try?

Sasha
-

Previous thread: Re: Commit f84871 breaks build on OS X by Pazu on Thursday, December 7, 2006 - 11:20 am. (1 message)

Next thread: Re: Commit f84871 breaks build on OS X by Brian Gernhardt on Thursday, December 7, 2006 - 12:04 pm. (1 message)