From 26bc3838e14dc946e27b2bc653ae61263e7ff1c4 Mon Sep 17 00:00:00 2001 From: Go MAEDA Date: Mon, 28 Sep 2020 14:25:35 +0000 Subject: [PATCH] When creating more than two identical attachments in a single transaction, the first one always ends up unreadable (#33769). MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Patch by Jens Krämer. git-svn-id: http://svn.redmine.org/redmine/trunk@20094 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/attachment.rb | 3 ++- test/unit/attachment_test.rb | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/models/attachment.rb b/app/models/attachment.rb index b0cc94cb2..112232c64 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -470,7 +470,8 @@ class Attachment < ActiveRecord::Base .where(digest: self.digest, filesize: self.filesize) .where('id <> ? and disk_filename <> ?', self.id, self.disk_filename) - .first + .order(:id) + .last existing.with_lock do original_diskfile = self.diskfile existing_diskfile = existing.diskfile diff --git a/test/unit/attachment_test.rb b/test/unit/attachment_test.rb index 0b3ac06bf..90d0dc679 100644 --- a/test/unit/attachment_test.rb +++ b/test/unit/attachment_test.rb @@ -235,6 +235,23 @@ class AttachmentTest < ActiveSupport::TestCase assert_not_equal a1.diskfile, a2.diskfile end + def test_identical_attachments_created_in_same_transaction_should_not_end_up_unreadable + attachments = [] + Project.transaction do + 3.times do + a = Attachment.create!( + :container => Issue.find(1), :author => User.find(1), + :file => mock_file(:filename => 'foo', :content => 'abcde') + ) + attachments << a + end + end + attachments.each do |a| + assert a.readable? + end + assert_equal 1, attachments.map(&:diskfile).uniq.size + end + def test_filename_should_be_basenamed a = Attachment.new(:file => mock_file(:original_filename => "path/to/the/file")) assert_equal 'file', a.filename -- 2.39.5