OSDN Git Service

Save local file digest to vars file.
authorTatsuki Sugiura <sugi@nemui.org>
Wed, 23 Mar 2016 05:59:23 +0000 (14:59 +0900)
committerTatsuki Sugiura <sugi@nemui.org>
Wed, 23 Mar 2016 05:59:23 +0000 (14:59 +0900)
lib/osdn/cli.rb
lib/osdn/cli/command/frs_upload.rb

index b397d10..b97e2ad 100644 (file)
@@ -169,7 +169,7 @@ module OSDN
         end
 
         def update_variables(dir, vars)
-          write_variables(load_variables(dir, false).merge(vars), dir)
+          write_variables(load_variables(dir, false).deep_merge(vars), dir)
         end
 
         private
index 3f90022..bbe1678 100644 (file)
@@ -9,6 +9,7 @@ module OSDN; module CLI; module Command
       #puts "     --release=<project>     Target release (numeric id)"
       puts "  -v --visibility=<public|private|hidden>"
       puts "                             Default visibility for newly created items"
+      puts "      --force-digest         Calc local file digest forcely"
     end
 
     def run
@@ -18,6 +19,7 @@ module OSDN; module CLI; module Command
         [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
         [ '--release', '-r', GetoptLong::REQUIRED_ARGUMENT ],
         [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
+        [ '--force-digest', GetoptLong::NO_ARGUMENT],
       )
       opts.each do |opt, arg|
         case opt
@@ -36,6 +38,8 @@ module OSDN; module CLI; module Command
             exit
           end
           @visibility = arg
+        when '--force-digest'
+          @force_digest = true
         when '--dry-run'
           @dry_run = true
         end
@@ -57,6 +61,11 @@ module OSDN; module CLI; module Command
         end
 
         Pathname.glob(pdir + '*').sort.each do |rdir|
+          if !rdir.directory?
+            logger.warn "Skip normal file '#{rdir}' in release level"
+            next
+          end
+
           vars = load_variables(rdir)
           rinfo = nil
           if vars.release_id
@@ -78,17 +87,30 @@ 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),
-              md5:    hexdigest(Digest::MD5, file),
-            }
+            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
+            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 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}") }
                 logger.error "#{file} was changed from remote file! Please delete remote file before uploading new one."
               end
-              logger.warn "Skip already uploaded file '#{file}'"
+              logger.info "Skip already uploaded file '#{file}'"
             else
               logger.info "Uploading file #{file} (#{file.size} bytes)"
               if @dry_run