OSDN Git Service

Add retry on file upload.
[osdn-codes/osdn-cli.git] / lib / osdn / cli / command / relfile.rb
index b7ad732..de060ac 100644 (file)
@@ -121,9 +121,29 @@ module OSDN; module CLI; module Command
       logger.level <= Logger::INFO && @show_progress != false || @show_progress and
         OSDN::CLI._show_progress = true
       logger.info "Starting upload #{file}..."
-      f = api.create_release_file target_proj, target_package, target_release, fio, visibility: @visibility
-      fio.close
-      OSDN::CLI._show_progress = false
+      max_upload_tries = 5
+      upload_tries = 0
+      f = nil
+      begin
+        upload_tries += 1
+        f = api.create_release_file target_proj, target_package, target_release, fio, visibility: @visibility
+      rescue OSDNClient::ApiError => e
+        if max_upload_tries - upload_tries <= 0 
+          logger.error "Max upload attempts (#{max_upload_tries}) has been exceeded, give up!"
+          raise e
+        elsif [0, 100, 502].member?(e.code.to_i)
+          fio.rewind
+          logger.error "Upload error (#{e.code} #{e.message}), retrying (#{upload_tries}/#{max_upload_tries})..."
+          sleep 10
+          retry
+        else
+          raise e
+        end
+      ensure
+        fio.close
+        OSDN::CLI._show_progress = false
+      end
+      
       if digests.find { |type, dig| dig != f.send("digest_#{type}") }
         logger.error "File digests are mismatch! Upload file #{file} may be broken! Please check."
       else