[Rt-commit] rt branch, 4.4/serialize-json-initialdata, updated. rt-4.4.1-448-gc0d422d

Shawn Moore shawn at bestpractical.com
Fri Mar 24 17:58:57 EDT 2017


The branch, 4.4/serialize-json-initialdata has been updated
       via  c0d422d5972b3cf29f12731f1e4d585373e75d43 (commit)
       via  1090e1bcb7cb30e9449fb5507c78fcca8481ef5f (commit)
       via  597899d308b683e46668764fe416769b8681ae46 (commit)
       via  c5d5c035453a3213fef92b1f33a01f19fb4f6e6d (commit)
       via  b68a8dac14deaf9c4f76fea4d2d389b532606eba (commit)
      from  1cf47f3816e864fd049a13a75f453541c2c84c7f (commit)

Summary of changes:
 sbin/rt-merge-initialdata.in | 174 +++++++++++++++++++++++++++++++++++--------
 1 file changed, 143 insertions(+), 31 deletions(-)

- Log -----------------------------------------------------------------
commit b68a8dac14deaf9c4f76fea4d2d389b532606eba
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Fri Mar 24 20:43:07 2017 +0000

    Avoid spurious 0 0 0 changes log entries

diff --git a/sbin/rt-merge-initialdata.in b/sbin/rt-merge-initialdata.in
index 911b718..e0f21de 100644
--- a/sbin/rt-merge-initialdata.in
+++ b/sbin/rt-merge-initialdata.in
@@ -140,6 +140,11 @@ for my $type (@record_types) {
         $edited_records->{$type},
         $type,
     );
+
+    next if !@$new_records
+         && !@$updated_records
+         && !@$deleted_records;
+
     RT->Logger->info("Merging changes from $type: " . scalar(@$new_records) . " new records, " . scalar(@$updated_records) . " updated, " . scalar(@$deleted_records) . " deleted");
 
     my $collection_class = "RT::" . ($class_type{$type} || $type);

commit c5d5c035453a3213fef92b1f33a01f19fb4f6e6d
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Fri Mar 24 20:43:40 2017 +0000

    Factor out updating records (or not due to dryrun) and reporting results

diff --git a/sbin/rt-merge-initialdata.in b/sbin/rt-merge-initialdata.in
index e0f21de..648ca9a 100644
--- a/sbin/rt-merge-initialdata.in
+++ b/sbin/rt-merge-initialdata.in
@@ -132,6 +132,23 @@ my %class_type = (
     Members => 'GroupMembers',
 );
 
+sub update_record {
+    my ($record, $description, $cb) = @_;
+
+    if ($dryrun) {
+        RT->Logger->debug("Skipping $description because of dry run.");
+        return;
+    }
+
+    my ($ok, $msg) = $cb->();
+    if ($ok) {
+        RT->Logger->debug("\u$description: $msg");
+    }
+    else {
+        RT->Logger->error("Unable to $description: $msg");
+    }
+}
+
 my %new_for_insertdata;
 
 for my $type (@record_types) {
@@ -208,18 +225,9 @@ for my $type (@record_types) {
                         }
                     }
 
-                    if ($dryrun) {
-                        RT->Logger->debug("Skipping update $record_class #$id $column from '$current_value' to '$new_value' because of dry run.");
-                        next;
-                    }
-
-                    my ($ok, $msg) = $record->$method($new_value);
-                    if ($ok) {
-                        RT->Logger->debug("Updated $record_class #$id $column: $msg");
-                    }
-                    else {
-                        RT->Logger->error("Unable to update $record_class #$id $column: $msg");
-                    }
+                    update_record $record, "update $record_class #$id $column from '$current_value' to '$new_value'" => sub {
+                        $record->$method($new_value);
+                    };
                 }
                 else {
                     die "Unable to handle updating $record_class $column (no method)";
@@ -236,31 +244,19 @@ for my $type (@record_types) {
         my $record = $record_class->new(RT->SystemUser);
         $record->Load($id);
 
-        my ($ok, $msg);
         if ($record->can('SetDisabled') || $record->_Accessible('Disabled', 'write')) {
-            if ($dryrun) {
-                RT->Logger->debug("Skipping disabling of $record_class #$id because of dry run.");
-                next;
-            }
-            ($ok, $msg) = $record->SetDisabled(1);
+            update_record $record, "disable $record_class #$id" => sub {
+                $record->SetDisabled(1);
+            };
         }
         elsif ($record->can('Delete')) {
-            if ($dryrun) {
-                RT->Logger->debug("Skipping delete of $record_class #$id because of dry run.");
-                next;
-            }
-            ($ok, $msg) = $record->Delete;
+            update_record $record, "delete $record_class #$id" => sub {
+                $record->Delete;
+            };
         }
         else {
             die "No method to delete $record_class #$id";
         }
-
-        if ($ok) {
-            RT->Logger->debug("Deleted $record_class #$id: $msg");
-        }
-        else {
-            RT->Logger->error("Unable to delete $record_class #$id: $msg");
-        }
     }
 }
 

commit 597899d308b683e46668764fe416769b8681ae46
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Fri Mar 24 20:45:16 2017 +0000

    Merge changes to CustomField.ApplyTo

diff --git a/sbin/rt-merge-initialdata.in b/sbin/rt-merge-initialdata.in
index 648ca9a..a5a4de7 100644
--- a/sbin/rt-merge-initialdata.in
+++ b/sbin/rt-merge-initialdata.in
@@ -149,6 +149,90 @@ sub update_record {
     }
 }
 
+my %special_merger = (
+    CustomFields => {
+        ApplyTo => sub {
+            my %args = @_;
+            my $cf = $args{current_record};
+            my $name = $cf->Name;
+
+            my @base_queues = ref $args{base_value}
+                            ? @{ $args{base_value} }
+                            : $args{base_value};
+            my @edited_queues = ref $args{edited_value}
+                              ? @{ $args{edited_value} }
+                              : $args{edited_value};
+
+            # canonicalize to IDs
+            for (@base_queues, @edited_queues) {
+                next if $_ eq '0';
+
+                my $queue = RT::Queue->new(RT->SystemUser);
+                my ($ok, $msg) = $queue->Load($_);
+                die "Unable to load queue $_: $msg" if !$ok;
+                $_ = $queue->Id;
+            }
+
+            @base_queues = sort { $a <=> $b } @base_queues;
+            @edited_queues = sort { $a <=> $b } @edited_queues;
+
+            my (@add, @remove);
+
+            while (@base_queues || @edited_queues) {
+                my $base_queue = $base_queues[0];
+                my $edited_queue = $edited_queues[0];
+
+                # same queue, continue with no change
+                if (($base_queue//-1) == ($edited_queue//-1)) {
+                    shift @base_queues;
+                    shift @edited_queues;
+                }
+                # ran out of base queues, add edited queue
+                elsif (!defined($base_queue)) {
+                    shift @edited_queues;
+                    push @add, $edited_queue;
+                }
+                # ran out of edited queues, remove base queue
+                elsif (!defined($edited_queue)) {
+                    shift @base_queues;
+                    push @remove, $base_queue;
+                }
+                # there's a base queue not in edited, so remove
+                elsif ($base_queue < $edited_queue) {
+                    shift @base_queues;
+                    push @remove, $base_queue;
+                }
+                # there's a edited queue not in base, so add
+                elsif ($edited_queue < $base_queue) {
+                    shift @edited_queues;
+                    push @add, $edited_queue;
+                }
+                else {
+                    die "Should never happen";
+                }
+            }
+
+            for my $id (@add) {
+                my $queue = RT::Queue->new(RT->SystemUser);
+                $queue->Load($id) if $id;
+                my $queue_name = $id ? "to queue " . $queue->Name : "globally";
+                update_record $cf, "add custom field $name $queue_name" => sub {
+                    $cf->AddToObject($queue);
+                };
+            }
+
+            for my $id (@remove) {
+                my $queue = RT::Queue->new(RT->SystemUser);
+                $queue->Load($id) if $id;
+                my $queue_name = $id ? "from queue " . $queue->Name : "globally";
+                update_record $cf, "remove custom field $name $queue_name" => sub {
+                    $cf->RemoveFromObject($queue);
+                };
+            }
+        }
+    },
+);
+
 my %new_for_insertdata;
 
 for my $type (@record_types) {
@@ -194,7 +278,17 @@ for my $type (@record_types) {
 
             next if is_deeply_equal($base_value, $edited_value);
 
-            if (!ref($base_value) && !ref($edited_value)) {
+            if (my $merger = $special_merger{$type}{$column}) {
+                $merger->(
+                    base_record    => $base,
+                    edited_record  => $edited,
+                    current_record => $record,
+                    column         => $column,
+                    base_value     => $base_value,
+                    edited_value   => $edited_value,
+                );
+            }
+            elsif (!ref($base_value) && !ref($edited_value)) {
                 my $method = "Set$column";
                 if ($record->can($method) || $record->_Accessible($column, 'write')) {
                     my $current_value = $record->$column // "";

commit 1090e1bcb7cb30e9449fb5507c78fcca8481ef5f
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Fri Mar 24 20:56:10 2017 +0000

    Refactor CustomField ApplyTo merger to reuse for Class ApplyTo

diff --git a/sbin/rt-merge-initialdata.in b/sbin/rt-merge-initialdata.in
index a5a4de7..a6c9956 100644
--- a/sbin/rt-merge-initialdata.in
+++ b/sbin/rt-merge-initialdata.in
@@ -149,87 +149,104 @@ sub update_record {
     }
 }
 
+sub _object_merger {
+   my %args = @_;
+   my $primary = $args{current_record};
+   my $primary_class = ref($primary);
+   my $secondary_class = $args{secondary_class};
+   my $name = $primary->Name;
+
+   my @base_objects = ref $args{base_value}
+                    ? @{ $args{base_value} }
+                    : $args{base_value};
+   my @edited_objects = ref $args{edited_value}
+                      ? @{ $args{edited_value} }
+                      : $args{edited_value};
+
+   # canonicalize to IDs
+   for (@base_objects, @edited_objects) {
+       next if $_ eq '0';
+
+       my $secondary = $secondary_class->new(RT->SystemUser);
+       my ($ok, $msg) = $secondary->Load($_);
+       die "Unable to load $secondary_class $_: $msg" if !$ok;
+       $_ = $secondary->Id;
+   }
+
+   @base_objects = sort { $a <=> $b } @base_objects;
+   @edited_objects = sort { $a <=> $b } @edited_objects;
+
+   my (@add, @remove);
+
+   while (@base_objects || @edited_objects) {
+       my $base_object = $base_objects[0];
+       my $edited_object = $edited_objects[0];
+
+       # same queue, continue with no change
+       if (($base_object//-1) == ($edited_object//-1)) {
+           shift @base_objects;
+           shift @edited_objects;
+       }
+       # ran out of base queues, add edited queue
+       elsif (!defined($base_object)) {
+           shift @edited_objects;
+           push @add, $edited_object;
+       }
+       # ran out of edited queues, remove base queue
+       elsif (!defined($edited_object)) {
+           shift @base_objects;
+           push @remove, $base_object;
+       }
+       # there's a base queue not in edited, so remove
+       elsif ($base_object < $edited_object) {
+           shift @base_objects;
+           push @remove, $base_object;
+       }
+       # there's a edited queue not in base, so add
+       elsif ($edited_object < $base_object) {
+           shift @edited_objects;
+           push @add, $edited_object;
+       }
+       else {
+           die "Should never happen";
+       }
+   }
+
+   for my $id (@add) {
+       my $secondary = $secondary_class->new(RT->SystemUser);
+       $secondary->Load($id) if $id;
+       my $secondary_name = $id ? "to $secondary_class " . $secondary->Name : "globally";
+       update_record $primary, "add $primary_class $name $secondary_name" => sub {
+           $primary->AddToObject($secondary);
+       };
+   }
+
+   for my $id (@remove) {
+       my $secondary = $secondary_class->new(RT->SystemUser);
+       $secondary->Load($id) if $id;
+       my $secondary_name = $id ? "from $secondary_class " . $secondary->Name : "globally";
+       update_record $primary, "remove $primary_class $name $secondary_name" => sub {
+           $primary->RemoveFromObject($secondary);
+       };
+   }
+}
+
 my %special_merger = (
     CustomFields => {
         ApplyTo => sub {
-            my %args = @_;
-            my $cf = $args{current_record};
-            my $name = $cf->Name;
-
-            my @base_queues = ref $args{base_value}
-                            ? @{ $args{base_value} }
-                            : $args{base_value};
-            my @edited_queues = ref $args{edited_value}
-                              ? @{ $args{edited_value} }
-                              : $args{edited_value};
-
-            # canonicalize to IDs
-            for (@base_queues, @edited_queues) {
-                next if $_ eq '0';
-
-                my $queue = RT::Queue->new(RT->SystemUser);
-                my ($ok, $msg) = $queue->Load($_);
-                die "Unable to load queue $_: $msg" if !$ok;
-                $_ = $queue->Id;
-            }
-
-            @base_queues = sort { $a <=> $b } @base_queues;
-            @edited_queues = sort { $a <=> $b } @edited_queues;
-
-            my (@add, @remove);
-
-            while (@base_queues || @edited_queues) {
-                my $base_queue = $base_queues[0];
-                my $edited_queue = $edited_queues[0];
-
-                # same queue, continue with no change
-                if (($base_queue//-1) == ($edited_queue//-1)) {
-                    shift @base_queues;
-                    shift @edited_queues;
-                }
-                # ran out of base queues, add edited queue
-                elsif (!defined($base_queue)) {
-                    shift @edited_queues;
-                    push @add, $edited_queue;
-                }
-                # ran out of edited queues, remove base queue
-                elsif (!defined($edited_queue)) {
-                    shift @base_queues;
-                    push @remove, $base_queue;
-                }
-                # there's a base queue not in edited, so remove
-                elsif ($base_queue < $edited_queue) {
-                    shift @base_queues;
-                    push @remove, $base_queue;
-                }
-                # there's a edited queue not in base, so add
-                elsif ($edited_queue < $base_queue) {
-                    shift @edited_queues;
-                    push @add, $edited_queue;
-                }
-                else {
-                    die "Should never happen";
-                }
-            }
-
-            for my $id (@add) {
-                my $queue = RT::Queue->new(RT->SystemUser);
-                $queue->Load($id) if $id;
-                my $queue_name = $id ? "to queue " . $queue->Name : "globally";
-                update_record $cf, "add custom field $name $queue_name" => sub {
-                    $cf->AddToObject($queue);
-                };
-            }
-
-            for my $id (@remove) {
-                my $queue = RT::Queue->new(RT->SystemUser);
-                $queue->Load($id) if $id;
-                my $queue_name = $id ? "from queue " . $queue->Name : "globally";
-                update_record $cf, "remove custom field $name $queue_name" => sub {
-                    $cf->RemoveFromObject($queue);
-                };
-            }
-        }
+            _object_merger(
+                secondary_class => 'RT::Queue',
+                @_,
+            );
+        },
+    },
+    Classes => {
+        ApplyTo => sub {
+            _object_merger(
+                secondary_class => 'RT::Queue',
+                @_,
+            );
+        },
     },
 );
 

commit c0d422d5972b3cf29f12731f1e4d585373e75d43
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Fri Mar 24 20:58:37 2017 +0000

    uniq ApplyTo objects, just in case

diff --git a/sbin/rt-merge-initialdata.in b/sbin/rt-merge-initialdata.in
index a6c9956..783b24e 100644
--- a/sbin/rt-merge-initialdata.in
+++ b/sbin/rt-merge-initialdata.in
@@ -173,8 +173,8 @@ sub _object_merger {
        $_ = $secondary->Id;
    }
 
-   @base_objects = sort { $a <=> $b } @base_objects;
-   @edited_objects = sort { $a <=> $b } @edited_objects;
+   @base_objects = uniq sort { $a <=> $b } @base_objects;
+   @edited_objects = uniq sort { $a <=> $b } @edited_objects;
 
    my (@add, @remove);
 

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


More information about the rt-commit mailing list