OSDN Git Service

Update to compat API change (no digest infomation when file uploaded).
[osdn-codes/osdn-cli.git] / lib / osdn / cli / command / frs_upload.rb
index ad2bac4..f85ea2e 100644 (file)
@@ -1,5 +1,7 @@
 module OSDN; module CLI; module Command
   class FrsUpload < Base
+    attr_accessor :target_proj, :visibility, :force_digest, :dry_run, :show_progress
+
     def help
       puts "#{$0} frs_upload [opts] [target_dir]"
       puts "Options:"
@@ -164,67 +166,31 @@ module OSDN; module CLI; module Command
         return false
       end
 
-      vars = load_variables(rdir)
-      digests = nil
-      if !@force_digest && vars.local_file_info &&
-         vars.local_file_info[file.basename.to_s]
-        finfo = vars.local_file_info[file.basename.to_s]
-        if finfo[:size] == file.size && finfo.mtime == file.mtime
-          digests = vars.local_file_info[file.basename.to_s].digests
-        end
+      filecmd = Relfile.new logger
+      [:target_proj, :visibility, :force_digest, :show_progress].each do |opt|
+        filecmd.send "#{opt}=", send(opt)
       end
+      filecmd.target_package = target_package(rdir)
+      filecmd.target_release = target_release(rdir)
+      filecmd.calc_file_digest(file)
+
+      vars = load_variables(rdir)
+      digests = vars.local_file_info[file.basename.to_s].digests
 
-      unless digests
-        logger.info "Calculating digest for #{file}..."
-        digests = {
-          sha256: hexdigest(Digest::SHA256, file),
-          sha1:   hexdigest(Digest::SHA1, file),
-          md5:    hexdigest(Digest::MD5, file),
-        }
-        update_variables rdir, {local_file_info: {file.basename.to_s => {digests: digests, mtime: file.mtime, size: file.size}}}
-      end
       if remote_f = rinfo.files.find { |f| f.name == file.basename.to_s }
-        if digests.find { |type, dig| dig != remote_f.send("digest_#{type}") }
+        if remote_f.size != file.size || digests.find { |type, dig| rd = remote_f.send("digest_#{type}"); rd && rd != '' && dig != rd }
           logger.error "#{file} was changed from remote file! Please delete remote file before uploading new one."
         end
         logger.info "Skip already uploaded file '#{file}'"
         return
       end
 
+      finfo = {}
       logger.info "Uploading file #{file} (#{file.size} bytes)"
       if @dry_run
         finfo = Hashie::Mash.new id: '(dry-run)', url: '(dry-run)'
       else
-        logger.level <= Logger::INFO && @show_progress != false || @show_progress and
-          OSDN::CLI._show_progress = true
-        fio = file.open
-        logger.info "Starting upload #{file}..."
-        max_upload_tries = 5
-        upload_tries = 0
-        begin
-          upload_tries += 1
-          finfo = api.create_release_file target_proj, target_package(rdir), target_release(rdir), 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
-          OSDN::CLI._show_progress = false
-          fio.close
-        end
-        if digests.find { |type, dig| dig != finfo.send("digest_#{type}") }
-          logger.error "File digests are mismatch! Upload file #{file} may be broken! Please check."
-        else
-          logger.info "Upload complete."
-        end
+        finfo = filecmd.create_one file
       end
       $stdout.puts "New file '#{file}' has been uploaded; #{finfo.url}"
     end