From: Sasha Khapyorsky <sashak@voltaire.com>
To: Junio C Hamano <junkio@cox.net>, Matthias Urlichs <smurf@smurf.noris.de>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] git-svnimport.perl: copying directory from original SVN place
Date: Fri, 20 Oct 2006 02:22:19 +0200 [thread overview]
Message-ID: <20061020002219.GF24676@sashak.voltaire.com> (raw)
In-Reply-To: <20061008213118.GA1367@sashak.voltaire.com>
Hi guys,
On 23:31 Sun 08 Oct , Sasha Khapyorsky wrote:
>
> When copying whole directory, if source directory is not in already
> imported tree, try to get it from original SVN location. This happens
> when source directory is not matched by provided 'trunk' and/or
> 'tags/branches' templates or when it is not part of specified SVN
> sub-project.
Any news with it?
Sasha
>
> Signed-off-by: Sasha Khapyorsky <sashak@voltaire.com>
> ---
> git-svnimport.perl | 93 ++++++++++++++++++++++++++++++----------------------
> 1 files changed, 54 insertions(+), 39 deletions(-)
>
> diff --git a/git-svnimport.perl b/git-svnimport.perl
> index 988514e..4ae0eec 100755
> --- a/git-svnimport.perl
> +++ b/git-svnimport.perl
> @@ -193,6 +193,13 @@ sub ignore {
> }
> }
>
> +sub dir_list {
> + my($self,$path,$rev) = @_;
> + my ($dirents,undef,$properties)
> + = $self->{'svn'}->get_dir($path,$rev,undef);
> + return $dirents;
> +}
> +
> package main;
> use URI;
>
> @@ -342,35 +349,16 @@ if ($opt_A) {
>
> open BRANCHES,">>", "$git_dir/svn2git";
>
> -sub node_kind($$$) {
> - my ($branch, $path, $revision) = @_;
> +sub node_kind($$) {
> + my ($svnpath, $revision) = @_;
> my $pool=SVN::Pool->new;
> - my $kind = $svn->{'svn'}->check_path(revert_split_path($branch,$path),$revision,$pool);
> + my $kind = $svn->{'svn'}->check_path($svnpath,$revision,$pool);
> $pool->clear;
> return $kind;
> }
>
> -sub revert_split_path($$) {
> - my($branch,$path) = @_;
> -
> - my $svnpath;
> - $path = "" if $path eq "/"; # this should not happen, but ...
> - if($branch eq "/") {
> - $svnpath = "$trunk_name/$path";
> - } elsif($branch =~ m#^/#) {
> - $svnpath = "$tag_name$branch/$path";
> - } else {
> - $svnpath = "$branch_name/$branch/$path";
> - }
> -
> - $svnpath =~ s#/+$##;
> - return $svnpath;
> -}
> -
> sub get_file($$$) {
> - my($rev,$branch,$path) = @_;
> -
> - my $svnpath = revert_split_path($branch,$path);
> + my($svnpath,$rev,$path) = @_;
>
> # now get it
> my ($name,$mode);
> @@ -413,10 +401,9 @@ sub get_file($$$) {
> }
>
> sub get_ignore($$$$$) {
> - my($new,$old,$rev,$branch,$path) = @_;
> + my($new,$old,$rev,$path,$svnpath) = @_;
>
> return unless $opt_I;
> - my $svnpath = revert_split_path($branch,$path);
> my $name = $svn->ignore("$svnpath",$rev);
> if ($path eq '/') {
> $path = $opt_I;
> @@ -435,7 +422,7 @@ sub get_ignore($$$$$) {
> close $F;
> unlink $name;
> push(@$new,['0644',$sha,$path]);
> - } else {
> + } elsif (defined $old) {
> push(@$old,$path);
> }
> }
> @@ -480,6 +467,27 @@ sub branch_rev($$) {
> return $therev;
> }
>
> +sub expand_svndir($$$);
> +
> +sub expand_svndir($$$)
> +{
> + my ($svnpath, $rev, $path) = @_;
> + my @list;
> + get_ignore(\@list, undef, $rev, $path, $svnpath);
> + my $dirents = $svn->dir_list($svnpath, $rev);
> + foreach my $p(keys %$dirents) {
> + my $kind = node_kind($svnpath.'/'.$p, $rev);
> + if ($kind eq $SVN::Node::file) {
> + my $f = get_file($svnpath.'/'.$p, $rev, $path.'/'.$p);
> + push(@list, $f) if $f;
> + } elsif ($kind eq $SVN::Node::dir) {
> + push(@list,
> + expand_svndir($svnpath.'/'.$p, $rev, $path.'/'.$p));
> + }
> + }
> + return @list;
> +}
> +
> sub copy_path($$$$$$$$) {
> # Somebody copied a whole subdirectory.
> # We need to find the index entries from the old version which the
> @@ -488,8 +496,11 @@ sub copy_path($$$$$$$$) {
> my($newrev,$newbranch,$path,$oldpath,$rev,$node_kind,$new,$parents) = @_;
>
> my($srcbranch,$srcpath) = split_path($rev,$oldpath);
> - unless(defined $srcbranch) {
> - print "Path not found when copying from $oldpath @ $rev\n";
> + unless(defined $srcbranch && defined $srcpath) {
> + print "Path not found when copying from $oldpath @ $rev.\n".
> + "Will try to copy from original SVN location...\n"
> + if $opt_v;
> + push (@$new, expand_svndir($oldpath, $rev, $path));
> return;
> }
> my $therev = branch_rev($srcbranch, $rev);
> @@ -503,7 +514,7 @@ sub copy_path($$$$$$$$) {
> }
> print "$newrev:$newbranch:$path: copying from $srcbranch:$srcpath @ $rev\n" if $opt_v;
> if ($node_kind eq $SVN::Node::dir) {
> - $srcpath =~ s#/*$#/#;
> + $srcpath =~ s#/*$#/#;
> }
>
> my $pid = open my $f,'-|';
> @@ -582,10 +593,12 @@ sub commit {
> if(defined $oldpath) {
> my $p;
> ($parent,$p) = split_path($revision,$oldpath);
> - if($parent eq "/") {
> - $parent = $opt_o;
> - } else {
> - $parent =~ s#^/##; # if it's a tag
> + if(defined $parent) {
> + if($parent eq "/") {
> + $parent = $opt_o;
> + } else {
> + $parent =~ s#^/##; # if it's a tag
> + }
> }
> } else {
> $parent = undef;
> @@ -651,9 +664,10 @@ # }
> push(@old,$path); # remove any old stuff
> }
> if(($action->[0] eq "A") || ($action->[0] eq "R")) {
> - my $node_kind = node_kind($branch,$path,$revision);
> + my $node_kind = node_kind($action->[3], $revision);
> if ($node_kind eq $SVN::Node::file) {
> - my $f = get_file($revision,$branch,$path);
> + my $f = get_file($action->[3],
> + $revision, $path);
> if ($f) {
> push(@new,$f) if $f;
> } else {
> @@ -668,19 +682,20 @@ # }
> \@new, \@parents);
> } else {
> get_ignore(\@new, \@old, $revision,
> - $branch, $path);
> + $path, $action->[3]);
> }
> }
> } elsif ($action->[0] eq "D") {
> push(@old,$path);
> } elsif ($action->[0] eq "M") {
> - my $node_kind = node_kind($branch,$path,$revision);
> + my $node_kind = node_kind($action->[3], $revision);
> if ($node_kind eq $SVN::Node::file) {
> - my $f = get_file($revision,$branch,$path);
> + my $f = get_file($action->[3],
> + $revision, $path);
> push(@new,$f) if $f;
> } elsif ($node_kind eq $SVN::Node::dir) {
> get_ignore(\@new, \@old, $revision,
> - $branch,$path);
> + $path, $action->[3]);
> }
> } else {
> die "$revision: unknown action '".$action->[0]."' for $path\n";
> --
> 1.4.2.3
>
next prev parent reply other threads:[~2006-10-20 0:16 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-08 21:31 [PATCH] git-svnimport.perl: copying directory from original SVN place Sasha Khapyorsky
2006-10-20 0:22 ` Sasha Khapyorsky [this message]
2006-10-20 0:23 ` Junio C Hamano
2006-10-20 0:31 ` Sasha Khapyorsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20061020002219.GF24676@sashak.voltaire.com \
--to=sashak@voltaire.com \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
--cc=smurf@smurf.noris.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).