Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/bestpractical/rt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsunnavy <sunnavy@bestpractical.com>2018-04-12 16:44:11 +0300
committerBrian Conry <bconry@bestpractical.com>2022-03-29 23:30:03 +0300
commit73ef77858210a57d6d3a44b3880da3eee2829602 (patch)
tree7739f986eb0d25ea79f713298028aafd1e9a490d
parent956dc88ea4fd5aa8b0994f8f968fbc0698af3626 (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.pm44
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 );
}