[Rt-commit] rt branch, 4.0/time-fields-on-merge, created. rt-4.0.6-250-gce5520a

Ruslan Zakirov ruz at bestpractical.com
Wed Jul 25 16:16:20 EDT 2012


The branch, 4.0/time-fields-on-merge has been created
        at  ce5520aa140d236b0cfe7259cf1e326db9de8616 (commit)

- Log -----------------------------------------------------------------
commit ce5520aa140d236b0cfe7259cf1e326db9de8616
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Thu Jul 26 00:10:32 2012 +0400

    don't record transactions for Time* fields on merge
    
    1) merge shouldn't generate any transactions except merge
    2) recording Time* change transaction mess numbers in history.
       As target ticket gets all transactions from both sides then
       history is already correct. Yes, numbers in the history are
       strange, for example you can have two txns saying time worked
       was changed from 0 to X and from 0 to Y, but the difference
       is what's important and is correct.

diff --git a/lib/RT/Ticket.pm b/lib/RT/Ticket.pm
index 1a3514c..3f2bdf5 100644
--- a/lib/RT/Ticket.pm
+++ b/lib/RT/Ticket.pm
@@ -2771,12 +2771,13 @@ sub _MergeInto {
 
     # Update time fields
     foreach my $type (qw(TimeEstimated TimeWorked TimeLeft)) {
-
-        my $mutator = "Set$type";
-        $MergeInto->$mutator(
-            ( $MergeInto->$type() || 0 ) + ( $self->$type() || 0 ) );
-
+        $MergeInto->_Set(
+            Field => $type,
+            Value => ( $MergeInto->$type() || 0 ) + ( $self->$type() || 0 ),
+            RecordTransaction => 0,
+        );
     }
+
 #add all of this ticket's watchers to that ticket.
     foreach my $watcher_type (qw(Requestors Cc AdminCc)) {
 
diff --git a/t/ticket/merge.t b/t/ticket/merge.t
index d06d541..3b92429 100644
--- a/t/ticket/merge.t
+++ b/t/ticket/merge.t
@@ -5,7 +5,7 @@ use warnings;
 
 
 use RT;
-use RT::Test tests => '29';
+use RT::Test tests => '44';
 
 
 # validate that when merging two tickets, the comments from both tickets
@@ -135,3 +135,46 @@ ok $user && $user->id, 'loaded or created user';
     ($status,$msg) = $t->MergeInto($t2->id);
     ok($status, "Merged tickets: $msg");
 }
+
+# check Time* fields after merge
+{
+    my @tickets;
+    my @values = (
+        { Worked => 11, Estimated => 17, Left => 6 },
+        { Worked => 7, Estimated => 12, Left => 5 },
+    );
+
+    for my $i (0 .. 1) {
+        my $t = RT::Ticket->new(RT->SystemUser);
+        $t->Create( Queue => 'general');
+        ok ($t->id);
+        push @tickets, $t;
+
+        foreach my $field ( keys %{ $values[ $i ] } ) {
+            my $method = "SetTime$field";
+            my ($status, $msg) = $t->$method( $values[ $i ]{ $field } );
+            ok $status, "changed $field on the ticket"
+                or diag "error: $msg";
+        }
+    }
+
+    my ($status, $msg) = $tickets[1]->MergeInto($tickets[0]->id);
+    ok($status,$msg);
+
+    my $t = RT::Ticket->new(RT->SystemUser);
+    $t->Load( $tickets[0]->id );
+    foreach my $field ( keys %{ $values[0] } ) {
+        my $method = "Time$field";
+        my $expected = 0;
+        $expected += $_->{ $field } foreach @values;
+        is $t->$method, $expected, "correct value";
+
+        my $from_history = 0;
+        my $txns = $t->Transactions;
+        while ( my $txn = $txns->Next ) {
+            next unless $txn->Type eq 'Set' && $txn->Field eq $method;
+            $from_history += $txn->NewValue - $txn->OldValue;
+        }
+        is $from_history, $expected, "history is correct";
+    }
+}

-----------------------------------------------------------------------


More information about the Rt-commit mailing list