From 5189208299689f58adfa98ff2e7696f5662ab84b Mon Sep 17 00:00:00 2001 From: Tatsuki Sugiura Date: Tue, 15 Mar 2016 16:11:06 +0900 Subject: [PATCH] Show progress and check file digest after upload. --- lib/osdn/cli/command/frs_upload.rb | 54 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/lib/osdn/cli/command/frs_upload.rb b/lib/osdn/cli/command/frs_upload.rb index 33b2108..e9aaa54 100644 --- a/lib/osdn/cli/command/frs_upload.rb +++ b/lib/osdn/cli/command/frs_upload.rb @@ -1,4 +1,45 @@ require 'digest' +require 'ethon' + +module OSDN; module CLI; module Command + class FrsUpload < Base + @@_show_progress = false + def self._show_progress + @@_show_progress + end + def self._show_progress=(v) + need_reset = (!!@@_show_progress != !!v) + @@_show_progress = v + need_reset and _reset_all_typhoeus_pool + end + + def self._reset_all_typhoeus_pool + first_easyid = nil + while true + e = Typhoeus::Pool.get + Typhoeus::Pool.release(e) + e.__id__ == first_easyid and break + first_easyid ||= e.__id__ + end + end + end +end; end; end + +module Ethon + class Easy + module Callbacks + alias_method :set_callbacks_orig, :set_callbacks + def set_callbacks + set_callbacks_orig + if OSDN::CLI::Command::FrsUpload._show_progress + Curl.set_option(:noprogress, false, handle) + else + Curl.set_option(:noprogress, true, handle) + end + end + end + end +end module OSDN; module CLI; module Command class FrsUpload < Base @@ -80,6 +121,7 @@ module OSDN; module CLI; module Command next end + logger.debug "Calculating digest for #{file}..." digests = { sha256: hexdigest(Digest::SHA256, file), sha1: hexdigest(Digest::SHA1, file), @@ -95,11 +137,18 @@ module OSDN; module CLI; module Command if @dry_run finfo = Hashie::Mash.new id: '(dry-run)', url: '(dry-run)' else - # TODO: show progress bar! + logger.level <= Logger::INFO and + self.class._show_progress = true fio = file.open + logger.info "Starting upload #{file}..." finfo = api.create_release_file target_proj, target_package(rdir), target_release(rdir), fio, visibility: @visibility fio.close - logger.info "Upload completed." + self.class._show_progress = false + 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 completed." + end end $stdout.puts "New file '#{file}' has been uploaded; #{finfo.url}" end @@ -153,5 +202,6 @@ module OSDN; module CLI; module Command fio.close dig.hexdigest end + end end; end; end -- 2.11.0