Patch #25215 » 0001-reuse-existing-identical-disk-files-for-new-attachme.patch
app/models/attachment.rb | ||
---|---|---|
56 | 56 |
before_create :files_to_final_location |
57 | 57 |
after_rollback :delete_from_disk, :on => :create |
58 | 58 |
after_commit :delete_from_disk, :on => :destroy |
59 |
after_commit :reuse_existing_file_if_possible, :on => :create |
|
59 | 60 | |
60 | 61 |
safe_attributes 'filename', 'content_type', 'description' |
61 | 62 | |
... | ... | |
387 | 388 | |
388 | 389 |
private |
389 | 390 | |
391 |
def reuse_existing_file_if_possible |
|
392 |
with_lock do |
|
393 |
if existing = Attachment |
|
394 |
.lock |
|
395 |
.where(digest: self.digest, filesize: self.filesize) |
|
396 |
.where('id <> ? and disk_filename <> ?', |
|
397 |
self.id, self.disk_filename) |
|
398 |
.first |
|
399 | ||
400 |
original_diskfile = self.diskfile |
|
401 |
self.update_columns disk_directory: existing.disk_directory, |
|
402 |
disk_filename: existing.disk_filename |
|
403 |
File.delete(original_diskfile) if File.exist?(original_diskfile) |
|
404 |
end |
|
405 |
end |
|
406 |
end |
|
407 | ||
408 | ||
390 | 409 |
# Physically deletes the file from the file system |
391 | 410 |
def delete_from_disk! |
392 | 411 |
if disk_filename.present? && File.exist?(diskfile) |
test/unit/attachment_test.rb | ||
---|---|---|
94 | 94 |
end |
95 | 95 | |
96 | 96 |
def test_copy_should_preserve_attributes |
97 | ||
98 |
# prevent re-use of data from other attachments with equal contents |
|
99 |
Attachment.where('id <> 1').destroy_all |
|
100 | ||
97 | 101 |
a = Attachment.find(1) |
98 | 102 |
copy = a.copy |
99 | 103 | |
... | ... | |
220 | 224 |
assert_equal 'text/plain', a.content_type |
221 | 225 |
end |
222 | 226 | |
223 |
def test_identical_attachments_at_the_same_time_should_not_overwrite
|
|
227 |
def test_identical_attachments_should_reuse_same_file
|
|
224 | 228 |
a1 = Attachment.create!(:container => Issue.find(1), |
225 | 229 |
:file => uploaded_test_file("testfile.txt", ""), |
226 | 230 |
:author => User.find(1)) |
227 | 231 |
a2 = Attachment.create!(:container => Issue.find(1), |
228 | 232 |
:file => uploaded_test_file("testfile.txt", ""), |
229 | 233 |
:author => User.find(1)) |
230 |
assert a1.disk_filename != a2.disk_filename
|
|
234 |
assert_equal a1.diskfile, a2.diskfile
|
|
231 | 235 |
end |
232 | 236 | |
233 | 237 |
def test_filename_should_be_basenamed |