OSDN Git Service

Update to compat API change (no digest infomation when file uploaded).
authorTatsuki Sugiura <sugi@nemui.org>
Mon, 20 Aug 2018 09:52:46 +0000 (18:52 +0900)
committerTatsuki Sugiura <sugi@nemui.org>
Mon, 20 Aug 2018 09:52:46 +0000 (18:52 +0900)
lib/osdn/cli.rb
lib/osdn/cli/command/frs_upload.rb
lib/osdn/cli/command/relfile.rb

index 5980973..6a92c9b 100644 (file)
@@ -165,6 +165,13 @@ module OSDN
               logger.warn "Failed to load variables from #{path}; #{e.message}"
             end
           end
               logger.warn "Failed to load variables from #{path}; #{e.message}"
             end
           end
+          # Fix key conflicts
+          if vars['local_file_info']
+            vars['local_file_info'].each do |fname, finfo|
+              finfo.has_key?('size') or next
+              finfo['filesize'] = finfo.delete('size')
+            end
+          end
           logger.debug "Variables: #{vars.inspect}"
           Hashie::Mash.new(vars)
         end
           logger.debug "Variables: #{vars.inspect}"
           Hashie::Mash.new(vars)
         end
index ad2bac4..f85ea2e 100644 (file)
@@ -1,5 +1,7 @@
 module OSDN; module CLI; module Command
   class FrsUpload < Base
 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:"
     def help
       puts "#{$0} frs_upload [opts] [target_dir]"
       puts "Options:"
@@ -164,67 +166,31 @@ module OSDN; module CLI; module Command
         return false
       end
 
         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
       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 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
 
           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.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
       end
       $stdout.puts "New file '#{file}' has been uploaded; #{finfo.url}"
     end
index de060ac..7ba54da 100644 (file)
@@ -3,6 +3,8 @@ require 'pathname'
 
 module OSDN; module CLI; module Command
   class Relfile < FrsBase
 
 module OSDN; module CLI; module Command
   class Relfile < FrsBase
+    attr_accessor :target_proj, :target_package, :target_release, :visibility, :force_digest, :show_progress
+
     def help
       puts "#{$0} relfile [opts] [list]"
       puts "#{$0} relfile [opts] create <target-file> [target-files...]"
     def help
       puts "#{$0} relfile [opts] [list]"
       puts "#{$0} relfile [opts] create <target-file> [target-files...]"
@@ -93,16 +95,14 @@ module OSDN; module CLI; module Command
       end
     end
 
       end
     end
 
-    def create_one(filename)
+    def calc_file_digest(filename)
       file = Pathname('.') + filename
       file = Pathname('.') + filename
-      logger.debug "Calculating digest for #{file}..."
-
       vars = load_variables(file.dirname)
       digests = nil
       if !@force_digest && vars.local_file_info &&
       vars = load_variables(file.dirname)
       digests = nil
       if !@force_digest && vars.local_file_info &&
-         vars.local_file_info[file.basename.to_s]
+        vars.local_file_info[file.basename.to_s]
         finfo = 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
+        if finfo.filesize == file.size && finfo.mtime == file.mtime
           digests = vars.local_file_info[file.basename.to_s].digests
         end
       end
           digests = vars.local_file_info[file.basename.to_s].digests
         end
       end
@@ -114,19 +114,24 @@ module OSDN; module CLI; module Command
           sha1:   hexdigest(Digest::SHA1, file),
           md5:    hexdigest(Digest::MD5, file),
         }
           sha1:   hexdigest(Digest::SHA1, file),
           md5:    hexdigest(Digest::MD5, file),
         }
-        update_variables file.dirname, {local_file_info: {file.basename.to_s => {digests: digests, mtime: file.mtime, size: file.size}}}
+        update_variables file.dirname, {local_file_info: {file.basename.to_s => {digests: digests, mtime: file.mtime, filesize: file.size}}}
       end
       end
+    end
 
 
+    def create_one(filename)
+      file = Pathname('.') + filename
+      calc_file_digest file
+      vars = load_variables(file.dirname)
       fio = file.open
       logger.level <= Logger::INFO && @show_progress != false || @show_progress and
         OSDN::CLI._show_progress = true
       fio = file.open
       logger.level <= Logger::INFO && @show_progress != false || @show_progress and
         OSDN::CLI._show_progress = true
-      logger.info "Starting upload #{file}..."
+      logger.info "Starting upload #{file} (#{file.size} bytes)..."
       max_upload_tries = 5
       upload_tries = 0
       max_upload_tries = 5
       upload_tries = 0
-      f = nil
+      remote_file = nil
       begin
         upload_tries += 1
       begin
         upload_tries += 1
-        f = api.create_release_file target_proj, target_package, target_release, fio, visibility: @visibility
+        remote_file = 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!"
       rescue OSDNClient::ApiError => e
         if max_upload_tries - upload_tries <= 0 
           logger.error "Max upload attempts (#{max_upload_tries}) has been exceeded, give up!"
@@ -144,12 +149,15 @@ module OSDN; module CLI; module Command
         OSDN::CLI._show_progress = false
       end
       
         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."
+      if vars.local_file_info[file.basename.to_s].digests.find { |type, dig| rd = remote_file.send("digest_#{type}"); rd && rd != '' && rd != dig }
+        logger.error "File digest mismatch! Uploaded file #{file} may be broken! Please check."
+      elsif file.size != remote_file.size
+        logger.error "File size mismatch! Uploaded file #{file} may be broken! Please check."
       else
         logger.info "Upload complete."
       end
       else
         logger.info "Upload complete."
       end
-      puts format_file(f)
+      puts format_file(remote_file)
+      remote_file
     end
 
     def update
     end
 
     def update