From 7da5d3fe78229b1f00949ea0f43d33b17587c41e Mon Sep 17 00:00:00 2001
From: riking <rikingcoding@gmail.com>
Date: Mon, 21 Apr 2014 14:08:17 -0700
Subject: [PATCH] Backoff-retry for hotlinked image pull + some style fixes

---
 app/jobs/regular/pull_hotlinked_images.rb | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/app/jobs/regular/pull_hotlinked_images.rb b/app/jobs/regular/pull_hotlinked_images.rb
index 694cbabea..fbeddbdf7 100644
--- a/app/jobs/regular/pull_hotlinked_images.rb
+++ b/app/jobs/regular/pull_hotlinked_images.rb
@@ -21,6 +21,7 @@ module Jobs
       return unless post.present?
 
       raw = post.raw.dup
+      start_raw = raw.dup
       downloaded_urls = {}
 
       extract_images_from(post.cooked).each do |image|
@@ -28,9 +29,10 @@ module Jobs
         src = "http:" + src if src.start_with?("//")
 
         if is_valid_image_url(src)
+          hotlinked = nil
           begin
             # have we already downloaded that file?
-            if !downloaded_urls.include?(src)
+            unless downloaded_urls.include?(src)
               begin
                 hotlinked = FileHelper.download(src, @max_size, "discourse-hotlinked")
               rescue Discourse::InvalidParameters
@@ -71,10 +73,15 @@ module Jobs
 
       end
 
-      # TODO: make sure the post hasnĀ“t changed while we were downloading remote images
-      if raw != post.raw
+      post.reload
+      if start_raw != post.raw
+        # post was edited - start over (after 10 minutes)
+        backoff = args.fetch(:backoff, 1) + 1
+        delay = SiteSetting.ninja_edit_window * args[:backoff]
+        Jobs.enqueue_in(delay.seconds.to_i, :pull_hotlinked_images, args.merge!(backoff: backoff))
+      elsif raw != post.raw
         options = { edit_reason: I18n.t("upload.edit_reason") }
-        options[:bypass_bump] = true if args[:bypass_bump] == true
+        options[:bypass_bump] = !!args[:bypass_bump]
         post.revise(Discourse.system_user, raw, options)
       end
     end