X-Git-Url: http://git.osdn.net/view?p=osdn-codes%2Fosdn-cli.git;a=blobdiff_plain;f=lib%2Fosdn%2Fcli%2Fcommand%2Ffrs_upload.rb;h=f85ea2e32714c2425ecd7d8dfc978aab8a789ed3;hp=ad2bac413b7c32c7567aa9f2766c82c0c20d5cc0;hb=f28d000e44207c4dca490e954eda1e08cfc381e3;hpb=eaed465615eb6de537b4bb24c35c9459c779f67a 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