From: Eric Wong <normalperson@yhbt.net>
Date: Fri, 26 Jan 2007 09:32:45 +0000 (-0800)
Subject: git-svn: fix committing to subdirectories, add tests
X-Git-Tag: v1.5.1-rc1~220
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d3a840dc74d2098c31aac1b89093d847e1d33dd8;p=git

git-svn: fix committing to subdirectories, add tests

I broke this part with the URL minimization; since
git-svn will now try to connect to the root of
the repository and will end up writing files
there if it can...

Signed-off-by: Eric Wong <normalperson@yhbt.net>
---

diff --git a/git-svn.perl b/git-svn.perl
index 4c9ef7fe15..1d448e75da 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -354,7 +354,7 @@ sub cmd_dcommit {
 			my $pool = SVN::Pool->new;
 			my %ed_opts = ( r => $last_rev,
 			                ra => $ra->dup,
-			                svn_path => $ra->{svn_path} );
+			                svn_path => $gs->{path} );
 			my $ed = SVN::Git::Editor->new(\%ed_opts,
 			                 $ra->get_commit_editor($log,
 			                 sub { print "Committed r$_[0]\n";
@@ -437,6 +437,7 @@ sub cmd_commit_diff {
 	my $usage = "Usage: $0 commit-diff -r<revision> ".
 	            "<tree-ish> <tree-ish> [<URL>]\n";
 	fatal($usage) if (!defined $ta || !defined $tb);
+	my $svn_path;
 	if (!defined $url) {
 		my $gs = eval { Git::SVN->new };
 		if (!$gs) {
@@ -444,6 +445,7 @@ sub cmd_commit_diff {
 			      "the command-line\n", $usage);
 		}
 		$url = $gs->{url};
+		$svn_path = $gs->{path};
 	}
 	unless (defined $_revision) {
 		fatal("-r|--revision is a required argument\n", $usage);
@@ -459,6 +461,7 @@ sub cmd_commit_diff {
 		$_message ||= get_commit_entry($tb)->{log};
 	}
 	my $ra ||= Git::SVN::Ra->new($url);
+	$svn_path ||= $ra->{svn_path};
 	my $r = $_revision;
 	if ($r eq 'HEAD') {
 		$r = $ra->get_latest_revnum;
@@ -468,7 +471,7 @@ sub cmd_commit_diff {
 	my $pool = SVN::Pool->new;
 	my %ed_opts = ( r => $r,
 	                ra => $ra->dup,
-	                svn_path => $ra->{svn_path} );
+	                svn_path => $svn_path );
 	my $ed = SVN::Git::Editor->new(\%ed_opts,
 	                               $ra->get_commit_editor($_message,
 	                                 sub { print "Committed r$_[0]\n" }),
@@ -1374,7 +1377,7 @@ sub set_tree {
 	my $pool = SVN::Pool->new;
 	my $ed = SVN::Git::Editor->new({ r => $self->{last_rev},
 	                                 ra => $self->ra->dup,
-	                                 svn_path => $self->ra->{svn_path}
+	                                 svn_path => $self->{path}
 	                               },
 	                               $self->ra->get_commit_editor(
 	                                 $log_entry->{log}, sub {
@@ -1902,6 +1905,8 @@ sub new {
 	$self->{pool} = SVN::Pool->new;
 	$self->{bat} = { '' => $self->open_root($self->{r}, $self->{pool}) };
 	$self->{rm} = { };
+	$self->{path_prefix} = length $self->{svn_path} ?
+	                       "$self->{svn_path}/" : '';
 	require Digest::MD5;
 	return $self;
 }
@@ -1911,7 +1916,8 @@ sub split_path {
 }
 
 sub repo_path {
-	(defined $_[1] && length $_[1]) ? $_[1] : ''
+	my ($self, $path) = @_;
+	$self->{path_prefix}.(defined $path ? $path : '');
 }
 
 sub url_path {
diff --git a/t/t9100-git-svn-basic.sh b/t/t9100-git-svn-basic.sh
index 5355243b92..3dc4de2fad 100755
--- a/t/t9100-git-svn-basic.sh
+++ b/t/t9100-git-svn-basic.sh
@@ -236,4 +236,33 @@ test_expect_success \
                               '^:refs/remotes/git-svn$'
         "
 
+test_expect_success 'able to dcommit to a subdirectory' "
+	git-svn fetch -i bar &&
+	git checkout -b my-bar refs/remotes/bar &&
+	echo abc > d &&
+	git update-index --add d &&
+	git commit -m '/bar/d should be in the log' &&
+	git-svn dcommit -i bar &&
+	test -z \"\`git diff refs/heads/my-bar refs/remotes/bar\`\" &&
+	mkdir newdir &&
+	echo new > newdir/dir &&
+	git update-index --add newdir/dir &&
+	git commit -m 'add a new directory' &&
+	git-svn dcommit -i bar &&
+	test -z \"\`git diff refs/heads/my-bar refs/remotes/bar\`\" &&
+	echo foo >> newdir/dir &&
+	git update-index newdir/dir &&
+	git commit -m 'modify a file in new directory' &&
+	git-svn dcommit -i bar &&
+	test -z \"\`git diff refs/heads/my-bar refs/remotes/bar\`\"
+	"
+
+test_expect_success 'able to set-tree to a subdirectory' "
+	echo cba > d &&
+	git update-index d &&
+	git commit -m 'update /bar/d' &&
+	git-svn set-tree -i bar HEAD &&
+	test -z \"\`git diff refs/heads/my-bar refs/remotes/bar\`\"
+	"
+
 test_done
diff --git a/t/t9105-git-svn-commit-diff.sh b/t/t9105-git-svn-commit-diff.sh
index 6323c7e3ac..c668dd1270 100755
--- a/t/t9105-git-svn-commit-diff.sh
+++ b/t/t9105-git-svn-commit-diff.sh
@@ -31,4 +31,13 @@ test_expect_success 'test the commit-diff command' "
 	cmp readme wc/readme
 	"
 
+test_expect_success 'commit-diff to a sub-directory (with git-svn config)' "
+	svn import -m 'sub-directory' import $svnrepo/subdir &&
+	git-svn init $svnrepo/subdir &&
+	git-svn fetch &&
+	git-svn commit-diff -r3 '$prev' '$head' &&
+	svn cat $svnrepo/subdir/readme > readme.2 &&
+	cmp readme readme.2
+	"
+
 test_done