diff options
author | sunnavy <sunnavy@bestpractical.com> | 2018-04-12 16:44:11 +0300 |
---|---|---|
committer | Brian Conry <bconry@bestpractical.com> | 2022-03-29 23:30:03 +0300 |
commit | 73ef77858210a57d6d3a44b3880da3eee2829602 (patch) | |
tree | 7739f986eb0d25ea79f713298028aafd1e9a490d | |
parent | 956dc88ea4fd5aa8b0994f8f968fbc0698af3626 (diff) |
Avoid duplicated single member group resolvers4.4/shredder-single-member-group-resolver-avoid-duplicates
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
-rw-r--r-- | lib/RT/GroupMember.pm | 44 |
1 files changed, 24 insertions, 20 deletions
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 ); } |