-
Notifications
You must be signed in to change notification settings - Fork 0
Automated Test: large-image-processing #314
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -52,14 +52,23 @@ def create_upload(type, file, url) | |||||
| begin | ||||||
| # API can provide a URL | ||||||
| if file.nil? && url.present? && is_api? | ||||||
| tempfile = FileHelper.download(url, SiteSetting.max_image_size_kb.kilobytes, "discourse-upload-#{type}") rescue nil | ||||||
| tempfile = FileHelper.download(url, 10.megabytes, "discourse-upload-#{type}") rescue nil | ||||||
| filename = File.basename(URI.parse(url).path) | ||||||
| else | ||||||
| tempfile = file.tempfile | ||||||
| filename = file.original_filename | ||||||
| content_type = file.content_type | ||||||
| end | ||||||
|
|
||||||
| # allow users to upload large images that will be automatically reduced to allowed size | ||||||
| if tempfile && tempfile.size > 0 && SiteSetting.max_image_size_kb > 0 && FileHelper.is_image?(filename) | ||||||
| attempt = 5 | ||||||
| while attempt > 0 && tempfile.size > SiteSetting.max_image_size_kb.kilobytes | ||||||
| OptimizedImage.downsize(tempfile.path, tempfile.path, "80%", allow_animation: SiteSetting.allow_animated_thumbnails) | ||||||
| attempt -= 1 | ||||||
| end | ||||||
| end | ||||||
|
|
||||||
| upload = Upload.create_for(current_user.id, tempfile, filename, tempfile.size, content_type: content_type, image_type: type) | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
After the downsizing loop, 🐛 Proposed fix- upload = Upload.create_for(current_user.id, tempfile, filename, tempfile.size, content_type: content_type, image_type: type)
+ upload = Upload.create_for(current_user.id, tempfile, filename, File.size(tempfile.path), content_type: content_type, image_type: type)📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||
|
|
||||||
| if upload.errors.empty? && current_user.admin? | ||||||
|
|
||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -139,25 +139,24 @@ def self.downsize_instructions_animated(from, to, dimensions, opts={}) | |
| end | ||
|
|
||
| def self.resize(from, to, width, height, opts={}) | ||
| optimize("resize", from, to, width, height, opts) | ||
| optimize("resize", from, to, "#{width}x#{height}", opts) | ||
| end | ||
|
|
||
| def self.downsize(from, to, max_width, max_height, opts={}) | ||
| optimize("downsize", from, to, max_width, max_height, opts) | ||
| optimize("downsize", from, to, "#{max_width}x#{max_height}", opts) | ||
| end | ||
|
|
||
| def self.optimize(operation, from, to, width, height, opts={}) | ||
| dim = dimensions(width, height) | ||
| def self.downsize(from, to, dimensions, opts={}) | ||
| optimize("downsize", from, to, dimensions, opts) | ||
| end | ||
|
Comment on lines
145
to
+151
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: cat -n app/models/optimized_image.rb | sed -n '140,160p'Repository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 955 🏁 Script executed: rg -n --type=ruby 'downsize\(' -A 1 -B 1Repository: admin-coderabbit/coderabbit-discourse-mirror Length of output: 1110 Duplicate Ruby does not support method overloading. The second At runtime, the 4-arg call will mis-bind to the 3-arg signature: the two integers (100, 100) will land in Remove the old 4-arg definition on lines 145–147. Update the resize_emoji caller to pass dimensions as a string: 🐛 Proposed fix — remove the dead overload and update the callerapp/models/optimized_image.rb: - def self.downsize(from, to, max_width, max_height, opts={})
- optimize("downsize", from, to, "#{max_width}x#{max_height}", opts)
- end
-
def self.downsize(from, to, dimensions, opts={})
optimize("downsize", from, to, dimensions, opts)
endapp/jobs/regular/resize_emoji.rb: - OptimizedImage.downsize(path, path, 100, 100, opts)
+ OptimizedImage.downsize(path, path, "100x100", opts)🧰 Tools🪛 RuboCop (1.84.0)[warning] 149-149: Method (Lint/DuplicateMethods) 🤖 Prompt for AI Agents |
||
|
|
||
| def self.optimize(operation, from, to, dimensions, opts={}) | ||
| method_name = "#{operation}_instructions" | ||
| method_name += "_animated" if !!opts[:allow_animation] && from =~ /\.GIF$/i | ||
| instructions = self.send(method_name.to_sym, from, to, dim, opts) | ||
| instructions = self.send(method_name.to_sym, from, to, dimensions, opts) | ||
| convert_with(instructions, to) | ||
| end | ||
|
|
||
| def self.dimensions(width, height) | ||
| "#{width}x#{height}" | ||
| end | ||
|
|
||
| def self.convert_with(instructions, to) | ||
| `#{instructions.join(" ")} &> /dev/null` | ||
| return false if $?.exitstatus != 0 | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Downsizing loop ignores
downsizereturn value; loop may spin on a failed conversion.OptimizedImage.downsizereturnsfalsewhen the conversion command fails, but the return value is never checked. On failure the file is unchanged (or possibly corrupted), so subsequent iterations repeat the same failing command. Break on failure to avoid wasted work and to surface the error.Additionally,
tempfile.sizeon Line 66 may return a stale value after an external process (convert) rewrites the file — Ruby'sIO#sizeusesfstaton the original file descriptor. UseFile.size(tempfile.path)to stat the path directly.🐛 Proposed fix
📝 Committable suggestion
🤖 Prompt for AI Agents