Browse Source

When creating more than two identical attachments in a single transaction, the first one always ends up unreadable (#33769).

Patch by Jens Krämer.


git-svn-id: http://svn.redmine.org/redmine/trunk@20094 e93f8b46-1217-0410-a6f0-8f06a7374b81
tags/4.2.0
Go MAEDA 3 years ago
parent
commit
26bc3838e1
2 changed files with 19 additions and 1 deletions
  1. 2
    1
      app/models/attachment.rb
  2. 17
    0
      test/unit/attachment_test.rb

+ 2
- 1
app/models/attachment.rb View File

@@ -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

+ 17
- 0
test/unit/attachment_test.rb View File

@@ -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

Loading…
Cancel
Save