OSDN Git Service

Show progress and check file digest after upload.
authorTatsuki Sugiura <sugi@nemui.org>
Tue, 15 Mar 2016 07:11:06 +0000 (16:11 +0900)
committerTatsuki Sugiura <sugi@nemui.org>
Tue, 15 Mar 2016 07:11:06 +0000 (16:11 +0900)
lib/osdn/cli/command/frs_upload.rb

index 33b2108..e9aaa54 100644 (file)
@@ -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