summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGo MAEDA <maeda@farend.jp>2020-09-30 13:46:46 +0000
committerGo MAEDA <maeda@farend.jp>2020-09-30 13:46:46 +0000
commit0d03bd5a255d1107966e6770d6407c1d33c63623 (patch)
treeca6f5731d56a5a584b6507879f48c51d092311cf
parent67c5d5bd2c310b616f22e962a13ad19c1461e61e (diff)
downloadredmine-0d03bd5a255d1107966e6770d6407c1d33c63623.tar.gz
redmine-0d03bd5a255d1107966e6770d6407c1d33c63623.zip
Merged r20094 from trunk to 4.1-stable (#33769).
git-svn-id: http://svn.redmine.org/redmine/branches/4.1-stable@20095 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/models/attachment.rb3
-rw-r--r--test/unit/attachment_test.rb17
2 files changed, 19 insertions, 1 deletions
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index 627c1a181..cf0ef5765 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -442,7 +442,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 831278634..e2b6bb85e 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