[Rt-commit] rt branch, 4.4/serialize-json-initialdata, updated. rt-4.4.1-437-ge3621bc
Shawn Moore
shawn at bestpractical.com
Thu Mar 23 18:25:32 EDT 2017
The branch, 4.4/serialize-json-initialdata has been updated
via e3621bc2c0a64b937ce94e844a87f031eeb9e4ea (commit)
from 0c8e730601744245269479a83e690eefca3037be (commit)
Summary of changes:
sbin/rt-merge-initialdata.in | 79 ++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 77 insertions(+), 2 deletions(-)
- Log -----------------------------------------------------------------
commit e3621bc2c0a64b937ce94e844a87f031eeb9e4ea
Author: Shawn M Moore <shawn at bestpractical.com>
Date: Thu Mar 23 22:05:46 2017 +0000
Prompt user for conflict resolution
diff --git a/sbin/rt-merge-initialdata.in b/sbin/rt-merge-initialdata.in
index bbdaea3..463b29a 100644
--- a/sbin/rt-merge-initialdata.in
+++ b/sbin/rt-merge-initialdata.in
@@ -139,10 +139,35 @@ for my $type (@record_types) {
if (!ref($base_value) && !ref($edited_value)) {
my $method = "Set$column";
if ($record->can($method) || $record->_Accessible($column, 'write')) {
+ my $current_value = $record->$column // "";
+
# skip if it was already updated outside initialdata
- next if ($record->$method//"") eq $edited_value;
+ next if $current_value eq $edited_value;
+
+ my $new_value = $edited_value;
+
+ if ($base_value ne $current_value) {
+ my $decision = decide_merge(
+ base_record => $base,
+ edited_record => $edited,
+ current_record => $record,
+ column => $column,
+ base_value => $base_value,
+ edited_value => $edited_value,
+ current_value => $current_value,
+ );
+ if ($decision eq 'base') {
+ $new_value = $base_value;
+ }
+ elsif ($decision eq 'edited') {
+ # continue
+ }
+ elsif ($decision eq 'current') {
+ next;
+ }
+ }
- my ($ok, $msg) = $record->$method($edited_value);
+ my ($ok, $msg) = $record->$method($new_value);
if ($ok) {
RT->Logger->debug("Updated $record_class #$id $column: $msg");
}
@@ -241,3 +266,53 @@ sub slurp_json {
or die "Cannot open initialdata file '$file' for read: $@";
return $JSON->decode(scalar <$f>);
}
+
+sub decide_merge {
+ my %args = (
+ base_record => undef,
+ edited_record => undef,
+ current_record => undef,
+ column => undef,
+ base_value => undef,
+ edited_value => undef,
+ current_value => undef,
+ @_,
+ );
+
+ my $record = $args{current_record};
+ my $id = $record->id;
+ my $type = ref($record);
+ $type =~ s/^RT:://;
+
+ local $| = 1;
+ while (1) {
+ print "\n";
+ print "Conflict resolution required for $type #$id $args{column}:\n";
+ print " Base value: $args{base_value}\n";
+ print " Edited value: $args{edited_value}\n";
+ print " Database value: $args{current_value}\n";
+ print "Would you like to (q)uit, (s)ee more context, or set value to (b)ase, (e)dited, or (d)atabase? ";
+
+ my $answer = (scalar <STDIN>) // "";
+ print "\n";
+
+ exit 1 if $answer =~ /^q/i;
+ return "base" if $answer =~ /^b/i;
+ return "edited" if $answer =~ /^e/i;
+ return "current" if $answer =~ /^d/i;
+
+ if ($answer =~ /^s/i) {
+ my %values = %{ $record->{values} };
+ delete $values{$_} for grep { ($values{$_}//"") eq ""} keys %values;
+ for ('base', 'edited', ['current', \%values]) {
+ my ($key, $record) = ref($_)
+ ? @$_
+ : ($_, $args{$_ . '_record'});
+ print "\u$key:\n";
+ print " $_\n"
+ for split /\n/, JSON->new->pretty->canonical->encode($record);
+ }
+ }
+ }
+}
+
-----------------------------------------------------------------------
More information about the rt-commit
mailing list