From f28d000e44207c4dca490e954eda1e08cfc381e3 Mon Sep 17 00:00:00 2001 From: Tatsuki Sugiura Date: Mon, 20 Aug 2018 18:52:46 +0900 Subject: [PATCH] Update to compat API change (no digest infomation when file uploaded). --- lib/osdn/cli.rb | 7 +++++ lib/osdn/cli/command/frs_upload.rb | 62 +++++++++----------------------------- lib/osdn/cli/command/relfile.rb | 32 ++++++++++++-------- 3 files changed, 41 insertions(+), 60 deletions(-) diff --git a/lib/osdn/cli.rb b/lib/osdn/cli.rb index 5980973..6a92c9b 100644 --- a/lib/osdn/cli.rb +++ b/lib/osdn/cli.rb @@ -165,6 +165,13 @@ module OSDN 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 diff --git a/lib/osdn/cli/command/frs_upload.rb b/lib/osdn/cli/command/frs_upload.rb index ad2bac4..f85ea2e 100644 --- a/lib/osdn/cli/command/frs_upload.rb +++ b/lib/osdn/cli/command/frs_upload.rb @@ -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 diff --git a/lib/osdn/cli/command/relfile.rb b/lib/osdn/cli/command/relfile.rb index de060ac..7ba54da 100644 --- a/lib/osdn/cli/command/relfile.rb +++ b/lib/osdn/cli/command/relfile.rb @@ -3,6 +3,8 @@ require 'pathname' 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-files...]" @@ -93,16 +95,14 @@ module OSDN; module CLI; module Command end end - def create_one(filename) + def calc_file_digest(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.local_file_info[file.basename.to_s] + 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 @@ -114,19 +114,24 @@ module OSDN; module CLI; module Command 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 + 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 - logger.info "Starting upload #{file}..." + logger.info "Starting upload #{file} (#{file.size} bytes)..." max_upload_tries = 5 upload_tries = 0 - f = nil + remote_file = nil 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!" @@ -144,12 +149,15 @@ module OSDN; module CLI; module Command 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 - puts format_file(f) + puts format_file(remote_file) + remote_file end def update -- 2.11.0