]> cat aescling's git repositories - mastodon.git/commitdiff
Fix Cocaine::ExitStatusError when upload small non-animated GIF (#5489)
authorunarist <m.unarist@gmail.com>
Thu, 26 Oct 2017 13:48:35 +0000 (22:48 +0900)
committerGitHub <noreply@github.com>
Thu, 26 Oct 2017 13:48:35 +0000 (22:48 +0900)
Looks like copied tempfile need to be flushed before further processing. This issue won't happen if the uploaded file has enough file size.

lib/paperclip/gif_transcoder.rb
spec/fixtures/files/mini-static.gif [new file with mode: 0644]
spec/models/media_attachment_spec.rb

index cbe53b27b35f6529f1144b15f03974e4f7f5b329..629e37581eb57bdf83817f8bcc03d043eea809d0 100644 (file)
@@ -10,6 +10,7 @@ module Paperclip
       unless options[:style] == :original && num_frames > 1
         tmp_file = Paperclip::TempfileFactory.new.generate(attachment.instance.file_file_name)
         tmp_file << file.read
+        tmp_file.flush
         return tmp_file
       end
 
diff --git a/spec/fixtures/files/mini-static.gif b/spec/fixtures/files/mini-static.gif
new file mode 100644 (file)
index 0000000..fe597b2
Binary files /dev/null and b/spec/fixtures/files/mini-static.gif differ
index 9fce5bc4fb1c26ed8443fe54a7f35cc3fb90052f..435b4f326804ac49bbcb4dc45ce7087264179cd1 100644 (file)
@@ -20,20 +20,29 @@ RSpec.describe MediaAttachment, type: :model do
   end
 
   describe 'non-animated gif non-conversion' do
-    let(:media) { MediaAttachment.create(account: Fabricate(:account), file: attachment_fixture('attachment.gif')) }
+    fixtures = [
+      { filename: 'attachment.gif', width: 600, height: 400, aspect: 1.5 },
+      { filename: 'mini-static.gif', width: 32, height: 32, aspect: 1.0 },
+    ]
 
-    it 'sets type to image' do
-      expect(media.type).to eq 'image'
-    end
+    fixtures.each do |fixture|
+      context fixture[:filename] do
+        let(:media) { MediaAttachment.create(account: Fabricate(:account), file: attachment_fixture(fixture[:filename])) }
 
-    it 'leaves original file as-is' do
-      expect(media.file_content_type).to eq 'image/gif'
-    end
+        it 'sets type to image' do
+          expect(media.type).to eq 'image'
+        end
 
-    it 'sets meta' do
-      expect(media.file.meta["original"]["width"]).to eq 600
-      expect(media.file.meta["original"]["height"]).to eq 400
-      expect(media.file.meta["original"]["aspect"]).to eq 1.5
+        it 'leaves original file as-is' do
+          expect(media.file_content_type).to eq 'image/gif'
+        end
+
+        it 'sets meta' do
+          expect(media.file.meta["original"]["width"]).to eq fixture[:width]
+          expect(media.file.meta["original"]["height"]).to eq fixture[:height]
+          expect(media.file.meta["original"]["aspect"]).to eq fixture[:aspect]
+        end
+      end
     end
   end