[Rt-commit] rt branch 4.4/shredder-single-member-group-resolver-avoid-duplicates created. rt-4.4.5-32-g73ef778582

BPS Git Server git at git.bestpractical.com
Tue Mar 29 20:30:51 UTC 2022


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "rt".

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

- Log -----------------------------------------------------------------
commit 73ef77858210a57d6d3a44b3880da3eee2829602
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 6cff9d3f2e..81f6ac38a3 100644
--- a/lib/RT/GroupMember.pm
+++ b/lib/RT/GroupMember.pm
@@ -550,32 +550,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);
-            my $class = $group->RoleClass or return;
-            return unless $class->Role($group->Name)->{Single};
 
-            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 );
+                my $class = $group->RoleClass or return;
+                return unless $class->Role($group->Name)->{Single};
 
-            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 @{[$group->Name]} 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 @{[$group->Name]} 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 );
 }

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


hooks/post-receive
-- 
rt


More information about the rt-commit mailing list