diff --git a/app/models/repository.rb b/app/models/repository.rb index 16a8aa3ad018ae0ab18d5abbd834dba15af66de7..c135ab61f6a00f66b106d580cbacfd02ca3851d4 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -656,7 +656,7 @@ class Repository def revert(user, commit, base_branch, revert_tree_id = nil) source_sha = find_branch(base_branch).target - revert_tree_id = check_revert_content(commit, base_branch) unless revert_tree_id + revert_tree_id ||= check_revert_content(commit, base_branch) return false unless revert_tree_id diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index 51ae2c04ed02de803d593bb0afa8f2985e907d28..1c7d66398cbe204cf5942b9fd2a61e7bf70ebe88 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -457,11 +457,38 @@ describe Repository, models: true do end end - describe '#revert_merge' do - it 'should revert the changes' do - repository.revert(user, merge_commit, 'master') + describe '#revert' do + let(:new_image_commit) { repository.commit('33f3729a45c02fc67d00adb1b8bca394b0e761d9') } + let(:update_image_commit) { repository.commit('2f63565e7aac07bcdadb654e253078b727143ec4') } - expect(repository.blob_at_branch('master', 'files/ruby/feature.rb')).not_to be_present + context 'when there is a conflict' do + it 'should abort the operation' do + expect(repository.revert(user, new_image_commit, 'master')).to eq(false) + end + end + + context 'when commit was already reverted' do + it 'should abort the operation' do + repository.revert(user, update_image_commit, 'master') + + expect(repository.revert(user, update_image_commit, 'master')).to eq(false) + end + end + + context 'when commit can be reverted' do + it 'should revert the changes' do + expect(repository.revert(user, update_image_commit, 'master')).to be_truthy + end + end + + context 'reverting a merge commit' do + it 'should revert the changes' do + merge_commit + expect(repository.blob_at_branch('master', 'files/ruby/feature.rb')).to be_present + + repository.revert(user, merge_commit, 'master') + expect(repository.blob_at_branch('master', 'files/ruby/feature.rb')).not_to be_present + end end end