OSDN Git Service

Save file digest to vars.
authorTatsuki Sugiura <sugi@nemui.org>
Wed, 23 Mar 2016 06:12:47 +0000 (15:12 +0900)
committerTatsuki Sugiura <sugi@nemui.org>
Wed, 23 Mar 2016 06:12:47 +0000 (15:12 +0900)
lib/osdn/cli/command/relfile.rb

index 6b3556a..aeb389f 100644 (file)
@@ -14,6 +14,7 @@ module OSDN; module CLI; module Command
       puts "     --package=<project>     Target package (numeric id)"
       puts "     --release=<project>     Target release (numeric id)"
       puts "  -v --visibility=<public|private|hidden>"
+      puts "      --force-digest         Calc local file digest forcely"
     end
 
     def self.description
@@ -27,6 +28,7 @@ module OSDN; module CLI; module Command
         [ '--package', GetoptLong::REQUIRED_ARGUMENT ],
         [ '--release', GetoptLong::REQUIRED_ARGUMENT ],
         [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
+        [ '--force-digest', GetoptLong::NO_ARGUMENT],
       )
       opts.each do |opt, arg|
         case opt
@@ -42,6 +44,8 @@ module OSDN; module CLI; module Command
         when '--release'
           arg.empty? or
             @target_release = arg
+        when '--force-digest'
+          @force_digest = true
         when '--visibility'
           unless %w(public private hidden).member?(arg)
             logger.fatal "Invalid visibility status: #{arg}"
@@ -73,11 +77,27 @@ module OSDN; module CLI; module Command
       end
       file = Pathname('.') + filename
       logger.debug "Calculating digest for #{file}..."
-      digests = {
-        sha256: hexdigest(Digest::SHA256, file),
-        sha1:   hexdigest(Digest::SHA1, file),
-        md5:    hexdigest(Digest::MD5, file),
-      }
+
+      vars = load_variables(file.dirname)
+      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
+      end
+
+      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 file.dirname, {local_file_info: {file.basename.to_s => {digests: digests, mtime: file.mtime, size: file.size}}}
+      end
+
       fio = file.open
       logger.level <= Logger::INFO and
         OSDN::CLI._show_progress = true