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/somebranchStarting 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 358According to the server logs, git is requesting /trunk/.cvsignore rather
than /repo/trunk/.cvsignoreI'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-
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
-
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-
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
-
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.
AbortedWithout the patch, the error is the same as the 1st case in both
situations.--
Daniel Drake
Brontes Technologies, A 3M Company-
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
-
Thanks, it now works for both forms of command line arguments.
--
Daniel Drake
Brontes Technologies, A 3M Company-
Thanks for reporting. I still run git-svnimport against
http://tortoisesvn.tigris.org/svn/tortoisesvn, works fine up to now.Sasha
-
An applicable version of the patch with proposed commit log
message would be much appreciated.-
Sure.
Wanted at least to finish the test (it is running yet), then will
submit the patch in conventional way.Sasha
-
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-
Ah, that fixes it. However, in versions before 1.4.4, either invokation
style works.Thanks,
--
Daniel Drake
Brontes Technologies, A 3M Company-
Frankly I think that it was bug. And I will see how to restore this. :)
Sasha
-
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
-
Thanks for the link. but I cannot access - this requires
username/password authentication.Sasha
-
Sorry, I assume you have see http://tortoisesvn.tigris.org/:
username : guest
password : ""-
Thanks, I can grab svn log now. Which command line you are using?
Sasha
-
$ cat svn2git-tortoisesvn.sh
#!/bin/shexport LC_ALL=C
export WC_ROOT=/home/cauchy/wc/git
export REPO_NAME=tortoisesvnecho "[`date`] Start import & pack ..."
mr=0
while [ $mr -le 9000 ]; doif 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"
fimr=$(($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/tortoisesvnecho "[`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"-
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
-
