git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/5] git-svn: convert SVK merge tickets to extra parents

From
Sam Vilain <sam.vilain@catalyst.net.nz>
Date
Oct 20, 2009, 02:42 UTC
Message-ID
<1256006523-5493-4-git-send-email-sam.vilain@catalyst.net.nz>
In-Reply-To
<1256006523-5493-3-git-send-email-sam.vilain@catalyst.net.nz>

SVK is a simple case to start with, as its idea of merge parents matches git's one. When a svk:merge ticket is encountered, check each of the listed merged revisions to see if they are in the history of this commit; if not, then we have encountered a merge - record it.

Signed-off-by: Sam Vilain <sam.vilain@catalyst.net.nz>
---
   I'm not sure if 'other_gs' is the right method to call here;
   ideally we should lookup a revmap by UUID and path, that would
   in principle allow people to import from a bunch of SVK depots all
   being tracked.  Perhaps however this is sufficient.
 git-svn.perl                |   50 ++++++++++++++++++++++++++++++++++++++++++-
 t/t9150-svk-mergetickets.sh |   23 +++++++++++++++++++
 2 files changed, 72 insertions(+), 1 deletions(-)
 create mode 100644 t/t9150-svk-mergetickets.sh
diff --git a/git-svn.perl b/git-svn.perl
index eb4b75a..3c2534c 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -2878,14 +2878,62 @@ sub check_author {
 	$author;
 }
 
+sub find_extra_svk_parents {
+	my ($self, $ed, $tickets, $parents) = @_;
+	# aha!  svk:merge property changed...
+	my @tickets = split "\n", $tickets;
+	my @known_parents;
+	for my $ticket ( @tickets ) {
+		my ($uuid, $path, $rev) = split /:/, $ticket;
+		if ( $uuid eq $self->ra_uuid ) {
+			my $url = $self->rewrite_root || $self->{url};
+			my $repos_root = $url;
+			my $branch_from = $path;
+			$branch_from =~ s{^/}{};
+			my $gs = $self->other_gs($repos_root."/".$branch_from, $url,
+						 $branch_from, $rev, $self->{ref_id});
+			#my $gs = other_gs ( $url, $repos_root, $branch_from,
+				#$self->{ref_id} );
+			if ( my $commit = $gs->rev_map_get($rev, $uuid) ) {
+				# wahey!  we found it, but it might be
+				# an old one (!)
+				push @known_parents, $commit;
+			}
+		}
+	}
+	for my $parent ( @known_parents ) {
+		my @cmd = ('rev-list', $parent, map { "^$_" } @$parents );
+		my ($msg_fh, $ctx) = command_output_pipe(@cmd);
+		my $new;
+		while ( <$msg_fh> ) {
+			$new=1;last;
+		}
+		command_close_pipe($msg_fh, $ctx);
+		if ( $new ) {
+			print STDERR "Found merge parent (svk:merge ticket): $parent\n";
+			push @$parents, $parent;
+		}
+	}
+}
+
 sub make_log_entry {
 	my ($self, $rev, $parents, $ed) = @_;
 	my $untracked = $self->get_untracked($ed);
 
+	my @parents = @$parents;
+	my $ps = $ed->{path_strip} || "";
+	for my $path ( grep { m/$ps/ } %{$ed->{dir_prop}} ) {
+		my $props = $ed->{dir_prop}{$path};
+		if ( $props->{"svk:merge"} ) {
+			$self->find_extra_svk_parents
+				($ed, $props->{"svk:merge"}, \@parents);
+		}
+	}
+
 	open my $un, '>>', "$self->{dir}/unhandled.log" or croak $!;
 	print $un "r$rev\n" or croak $!;
 	print $un $_, "\n" foreach @$untracked;
-	my %log_entry = ( parents => $parents || [], revision => $rev,
+	my %log_entry = ( parents => \@parents, revision => $rev,
 	                  log => '');
 
 	my $headrev;
diff --git a/t/t9150-svk-mergetickets.sh b/t/t9150-svk-mergetickets.sh
new file mode 100644
index 0000000..8000c34
--- /dev/null
+++ b/t/t9150-svk-mergetickets.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+#
+# Copyright (c) 2007 Sam Vilain
+#
+
+test_description='git-svn svk merge tickets'
+
+. ./lib-git-svn.sh
+
+test_expect_success 'load svk depot' "
+	svnadmin load -q '$rawsvnrepo' < '../t9150/svk-merge.dump' &&
+	git svn init --minimize-url -R svkmerge \
+	  -T trunk -b branches '$svnrepo' &&
+	git svn fetch --all
+	"
+
+uuid=b48289b2-9c08-4d72-af37-0358a40b9c15
+
+test_expect_success 'svk merges were represented coming in' "
+	[ `git-cat-file commit HEAD | grep parent | wc -l` -eq 2 ]
+	"
+
+test_done
-- 
1.6.3.3
Previous: Sam VilainNext: Sam Vilain
Message 4 of 12 in “git-svn: add support for merges during 'git svn fetch'”
  1. Sam VilainOct 20, 2009
  2. 1/5 git-svn: add test data for SVK merge, with script.Sam Vilain, Oct 20, 2009
  3. 2/5 git-svn: allow test setup script to support PERL env. varSam Vilain, Oct 20, 2009
  4. 3/5 git-svn: convert SVK merge tickets to extra parentsSam Vilain, Oct 20, 2009
  5. 4/5 git-svn: add test data for SVN 1.5+ merge, with script.Sam Vilain, Oct 20, 2009
  6. 5/5 git-svn: convert SVN 1.5+ / svnmerge.py svn:mergeinfo props to parentsSam Vilain, Oct 20, 2009
  7. Sam VilainOct 20, 2009
  8. Junio C HamanoOct 20, 2009
  9. Eric WongOct 20, 2009
  10. Nanako ShiraishiOct 27, 2009
  11. Eric WongOct 27, 2009
  12. Junio C HamanoOct 28, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.