[Rt-commit] rt branch, 4.4/shredder-single-member-group-resolver-avoid-duplicates, created. rt-4.4.2-133-g07cdc1760

? sunnavy sunnavy at bestpractical.com
Thu Apr 19 08:13:25 EDT 2018


The branch, 4.4/shredder-single-member-group-resolver-avoid-duplicates has been created
        at  07cdc17602f1f212493a4891e64e811a9a1482dc (commit)

- Log -----------------------------------------------------------------
commit 07cdc17602f1f212493a4891e64e811a9a1482dc
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Thu Apr 12 21:44:11 2018 +0800

    Avoid duplicated single member group resolvers
    
    There is no need to add the same resolver multiple times. Duplicated
    resolvers could result in errors like:
    
        Couldn't wipeout object: Group already has member: Nobody

diff --git a/lib/RT/GroupMember.pm b/lib/RT/GroupMember.pm
index 581666b8f..295d3a49e 100644
--- a/lib/RT/GroupMember.pm
+++ b/lib/RT/GroupMember.pm
@@ -536,32 +536,36 @@ sub __DependsOn {
         TargetObjects => $group,
         Shredder => $args{'Shredder'}
     );
-    $args{'Shredder'}->PutResolver(
-        BaseClass => ref $self,
-        TargetClass => ref $group,
-        Code => sub {
-            my %args = (@_);
-            my $group = $args{'TargetObject'};
-            return if $args{'Shredder'}->GetState( Object => $group )
-                & (RT::Shredder::Constants::WIPED|RT::Shredder::Constants::IN_WIPING);
-            return unless ($group->Name || '') eq 'Owner';
-            return unless ($group->Domain || '') eq 'RT::Ticket-Role';
 
-            return if $group->MembersObj->Count > 1;
+    if ( !$args{Shredder}->{_resolver_mark}{SingleMemberGroupResolver} ) {
+        $args{'Shredder'}->PutResolver(
+            BaseClass   => ref $self,
+            TargetClass => ref $group,
+            Code        => sub {
+                my %args  = ( @_ );
+                my $group = $args{'TargetObject'};
+                return if $args{'Shredder'}->GetState( Object => $group )
+                  & ( RT::Shredder::Constants::WIPED | RT::Shredder::Constants::IN_WIPING );
+                return unless ( $group->Name   || '' ) eq 'Owner';
+                return unless ( $group->Domain || '' ) eq 'RT::Ticket-Role';
 
-            my $group_member = $args{'BaseObject'};
+                return if $group->MembersObj->Count > 1;
 
-            if( $group_member->MemberObj->id == RT->Nobody->id ) {
-                RT::Shredder::Exception->throw( "Couldn't delete Nobody from owners role group" );
-            }
+                my $group_member = $args{'BaseObject'};
 
-            my( $status, $msg ) = $group->AddMember( RT->Nobody->id );
+                if ( $group_member->MemberObj->id == RT->Nobody->id ) {
+                    RT::Shredder::Exception->throw( "Couldn't delete Nobody from owners role group" );
+                }
 
-            RT::Shredder::Exception->throw( $msg ) unless $status;
+                my ( $status, $msg ) = $group->AddMember( RT->Nobody->id );
 
-            return;
-        },
-    );
+                RT::Shredder::Exception->throw( $msg ) unless $status;
+
+                return;
+            },
+        );
+        $args{Shredder}->{_resolver_mark}{SingleMemberGroupResolver} = 1;
+    }
 
     return $self->SUPER::__DependsOn( %args );
 }

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


More information about the rt-commit mailing list