[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