[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