Saving a mirrored project errors out if mirror user has been deleted
Summary
For a mirrored project created under a group, if the mirrored user for the project has been deleted, saving the project fails with ActiveRecord::RecordInvalid: Validation failed: Mirror user can't be blank
. This is due to the stale mirror_user_id
left behind.
Users are unable to save project settings in the UI because of this error.
Steps to reproduce
- Create a mirrored project under a group (using "user1")
- Delete "user1"
- Go to project settings and try to save
- Project cannot be saved and there's an error in the UI saying, "Mirror user can't be blank"
What is the current bug behavior?
Mirror user deletion is not being handled on the project side.
What is the expected correct behavior?
Mirror user deletion should update the project as well so that there are no validation error.
Relevant logs and/or screenshots
Saving project settings after deleting mirror user:
Rails console:
irb(main):019:0* p.mirror_user
=> nil
irb(main):020:0> p.mirror_user_id
=> 2
irb(main):021:0>
irb(main):022:0* p.save!
ActiveRecord::RecordInvalid: Validation failed: Mirror user can't be blank
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/validations.rb:79:in `raise_record_invalid'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/validations.rb:43:in `save!'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/attribute_methods/dirty.rb:29:in `save!'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/transactions.rb:291:in `block in save!'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/transactions.rb:351:in `block in with_transaction_returning_status'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `block in transaction'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/connection_adapters/abstract/transaction.rb:184:in `within_new_transaction'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/transactions.rb:220:in `transaction'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/transactions.rb:348:in `with_transaction_returning_status'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/activerecord-4.2.8/lib/active_record/transactions.rb:291:in `save!'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-activerecord-0.4.0/lib/state_machines/integrations/active_record.rb:505:in `block in save!'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-activerecord-0.4.0/lib/state_machines/integrations/active_record.rb:520:in `block in around_save'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-0.4.0/lib/state_machines/transition_collection.rb:150:in `block in run_actions'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-0.4.0/lib/state_machines/transition_collection.rb:170:in `catch_exceptions'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-0.4.0/lib/state_machines/transition_collection.rb:148:in `run_actions'
... 1 levels...
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-0.4.0/lib/state_machines/transition_collection.rb:212:in `run_callbacks'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-0.4.0/lib/state_machines/transition_collection.rb:63:in `block (2 levels) in perform'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-0.4.0/lib/state_machines/transition_collection.rb:63:in `catch'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-0.4.0/lib/state_machines/transition_collection.rb:63:in `block in perform'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-0.4.0/lib/state_machines/transition_collection.rb:186:in `within_transaction'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-0.4.0/lib/state_machines/transition_collection.rb:62:in `perform'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-activerecord-0.4.0/lib/state_machines/integrations/active_record.rb:520:in `around_save'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/state_machines-activerecord-0.4.0/lib/state_machines/integrations/active_record.rb:505:in `save!'
from (irb):22
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/railties-4.2.8/lib/rails/commands/console.rb:110:in `start'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/railties-4.2.8/lib/rails/commands/console.rb:9:in `start'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/railties-4.2.8/lib/rails/commands/commands_tasks.rb:68:in `console'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/railties-4.2.8/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
from /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/railties-4.2.8/lib/rails/commands.rb:17:in `<top (required)>'
from bin/rails:9:in `require'
from bin/rails:9:in `<main>'
Possible fixes
Set the group owner as the new mirror user for the project.
/cc @MrChrisW