[svk-commit] r2543 - in branches/2.0-releng/lib/SVK: Editor

nobody at bestpractical.com nobody at bestpractical.com
Tue Oct 16 10:26:49 EDT 2007


Author: clkao
Date: Tue Oct 16 10:26:43 2007
New Revision: 2543

Modified:
   branches/2.0-releng/lib/SVK/Editor/Merge.pm
   branches/2.0-releng/lib/SVK/Merge.pm

Log:
First cut of ticket overwriting fixes.  The problem is caused
by repos_commit in svn checking directory update-ness with
node_created_rev.  However when we are setting the merge ticket,
we have already modified the content of the directory henec it
is always fresh.

* split get_new_ticket and print_new_ticket
* split set_ticket from cb_merged and call it upon opening
  of the target node.


Modified: branches/2.0-releng/lib/SVK/Editor/Merge.pm
==============================================================================
--- branches/2.0-releng/lib/SVK/Editor/Merge.pm	(original)
+++ branches/2.0-releng/lib/SVK/Editor/Merge.pm	Tue Oct 16 10:26:43 2007
@@ -58,7 +58,7 @@
 use autouse 'SVK::Util'
     => qw( slurp_fh md5_fh tmpfile devnull abs2rel );
 
-__PACKAGE__->mk_accessors(qw(inspector notify storage));
+__PACKAGE__->mk_accessors(qw(inspector notify storage ticket cb_merged));
 
 use Class::Autouse qw(SVK::Inspector::Root SVK::Notify
 		      Data::Hierarchy IO::Digest);
@@ -227,21 +227,27 @@
     $self->{storage}->set_target_revision ($revision);
 }
 
+sub set_ticket {
+    my ($self, $baton, $type, $pool) = @_;
+
+    my $func = "change_${type}_prop";
+
+    $self->{storage}->$func( $baton, 'svk:merge', $self->ticket->as_string, $pool );
+
+}
+
 sub open_root {
-    my ($self, $baserev) = @_;
+    my ($self, $baserev, $pool) = @_;
     $self->{baserev} = $baserev;
     $self->{notify} ||= SVK::Notify->new_with_report ($self->{report}, $self->{target});
     $self->{storage_baton}{''} =
 	$self->{storage}->open_root ($self->{cb_rev}->($self->{target}||''));
     $self->{notify}->node_status ('', '');
 
-    my $ticket = $self->{ticket};
     $self->{dh} = Data::Hierarchy->new;
-    $self->{cb_merged} =
-	sub { my ($editor, $baton, $type, $pool) = @_;
-	      my $func = "change_${type}_prop";
-	      $editor->$func ($baton, 'svk:merge', $ticket->(), $pool);
-	  } if $ticket;
+
+    $self->set_ticket($self->{storage_baton}{''}, 'dir', $pool)
+	if !length $self->{target} && $self->ticket;
 
     return '';
 }
@@ -326,7 +332,10 @@
 	$self->{storage}->open_file ($path, $self->{storage_baton}{$pdir},
 				     $self->{cb_rev}->($path), $pool);
     ++$self->{changes};
-    delete $self->{info}{$path}{open};
+    delete $self->{info}{$path}{open}; # 
+
+    $self->set_ticket( $self->{storage_baton}{$path}, 'file', $pool )
+	if $path eq $self->{target} && $self->ticket;
 }
 
 sub ensure_close {
@@ -337,9 +346,9 @@
     $self->{cb_closed}->($path, $checksum, $pool)
         if $self->{cb_closed};
 
-    if ($path eq $self->{target} && $self->{changes} && $self->{cb_merged}) {
+    if ($path eq $self->{target} && $self->{changes} && $self->cb_merged) {
 	$self->ensure_open ($path);
-	$self->{cb_merged}->($self->{storage}, $self->{storage_baton}{$path}, 'file', $pool);
+	$self->cb_merged->($self->{ticket});
     }
 
     if (my $baton = $self->{storage_baton}{$path}) {
@@ -666,9 +675,12 @@
 	}
     }
     $self->{notify}->node_status ($path, '');
-    $self->{storage_baton}{$path} =
+    my $baton = $self->{storage_baton}{$path} =
 	$self->{storage}->open_directory ($path, $self->{storage_baton}{$pdir},
 					  $self->{cb_rev}->($path), @arg);
+    $self->set_ticket->($baton, 'dir', $pool)
+	if $path eq $self->{target} && $self->ticket;
+
     return $path;
 }
 
@@ -681,8 +693,9 @@
     $self->{notify}->flush_dir ($path);
 
     my $baton = $self->{storage_baton}{$path};
-    $self->{cb_merged}->($self->{storage}, $baton, 'dir', $pool)
-	if $path eq $self->{target} && $self->{changes} && $self->{cb_merged};
+    $self->cb_merged->( $self->{ticket} )
+	if $path eq $self->{target} && $self->{changes} && $self->cb_merged;
+
 
     $self->{storage}->close_directory ($baton, $pool);
     delete $self->{storage_baton}{$path}

Modified: branches/2.0-releng/lib/SVK/Merge.pm
==============================================================================
--- branches/2.0-releng/lib/SVK/Merge.pm	(original)
+++ branches/2.0-releng/lib/SVK/Merge.pm	Tue Oct 16 10:26:43 2007
@@ -345,20 +345,29 @@
     return $minfo;
 }
 
-sub get_new_ticket {
+sub _get_new_ticket {
     my ($self, $srcinfo) = @_;
-    my $dstinfo = $self->merge_info ($self->{dst});
+    my $dstinfo = $self->merge_info($self->{dst});
     # We want the ticket representing src, but not dst.
-    my $newinfo = $dstinfo->union ($srcinfo)->del_target ($self->{dst});
-    unless ($self->{quiet}) {
-	for (sort keys %$newinfo) {
-	    $logger->info(loc("New merge ticket: %1:%2", $_, $newinfo->{$_}{rev}))
-		if !$dstinfo->{$_} || $newinfo->{$_}{rev} > $dstinfo->{$_}{rev};
-	}
-    }
+    return $dstinfo->union ($srcinfo)->del_target($self->{dst});
+}
+
+# deprecated
+sub get_new_ticket {
+    my ($self, $srcinfo) = @_;
+    my $newinfo = $self->_get_new_ticket($srcinfo);
+    $self->print_new_ticket($newinfo);
     return $newinfo->as_string;
 }
 
+sub print_new_ticket {
+    my ($self, $dstinfo, $newinfo) = @_;
+    for (sort keys %$newinfo) {
+	$logger->info(loc("New merge ticket: %1:%2", $_, $newinfo->{$_}{rev}))
+	    if !$dstinfo->{$_} || $newinfo->{$_}{rev} > $dstinfo->{$_}{rev};
+    }
+}
+
 sub log {
     my ($self, $no_separator) = @_;
     open my $buf, '>', \ (my $tmp = '');
@@ -528,6 +537,8 @@
     # $cb{inspector} = $self->{dst}->inspector
     # unless ref($cb{inspector}) eq 'SVK::Inspector::Compat' ;
 
+    my $dstinfo = $self->merge_info($self->{dst});
+
     my $meditor = SVK::Editor::Merge->new
 	( anchor => $src->path_anchor,
 	  repospath => $src->repospath, # for stupid copyfrom url
@@ -554,8 +565,12 @@
 					(SVK::Merge::Info->new ($prop->{local}))->as_string);
 			    }
 			},
-	    ticket => 
-	    sub { $self->get_new_ticket ($self->merge_info_with_copy ($src)->add_target ($src)) }
+	    ticket =>
+	    $self->_get_new_ticket($self->merge_info_with_copy($src)->add_target($src)),
+	    cb_merged => sub {
+		my ($ticket) = @_;
+		$self->print_new_ticket( $dstinfo, $ticket ) unless $self->{quiet};
+	    }
 	  ) :
 	  ( prop_resolver => { 'svk:merge' => sub { ('G', undef, 1)} # skip
 			     }),


More information about the svk-commit mailing list