OSDN Git Service

Check file digest.
authorTatsuki Sugiura <sugi@nemui.org>
Mon, 14 Mar 2016 09:06:24 +0000 (18:06 +0900)
committerTatsuki Sugiura <sugi@nemui.org>
Mon, 14 Mar 2016 09:06:24 +0000 (18:06 +0900)
lib/osdn/cli/command/frs_upload.rb

index 9767971..33b2108 100644 (file)
@@ -1,3 +1,5 @@
+require 'digest'
+
 module OSDN; module CLI; module Command
   class FrsUpload < Base
     def help
@@ -78,15 +80,25 @@ module OSDN; module CLI; module Command
               next
             end
 
-            if rinfo.files.find { |f| f.name == file.basename.to_s }
+            digests = {
+              sha256: hexdigest(Digest::SHA256, file),
+              sha1:   hexdigest(Digest::SHA1, file),
+              md5:    hexdigest(Digest::MD5, file),
+            }
+            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}'"
             else
               logger.info "Uploading file #{file} (#{file.size} bytes)"
-              # TODO: show progress bar!
               if @dry_run
                 finfo = Hashie::Mash.new id: '(dry-run)', url: '(dry-run)'
               else
-                finfo = api.create_release_file target_proj, target_package(rdir), target_release(rdir), file.open, visibility: @visibility
+                # TODO: show progress bar!
+                fio = file.open
+                finfo = api.create_release_file target_proj, target_package(rdir), target_release(rdir), fio, visibility: @visibility
+                fio.close
                 logger.info "Upload completed."
               end
               $stdout.puts "New file '#{file}' has been uploaded; #{finfo.url}"
@@ -131,5 +143,15 @@ module OSDN; module CLI; module Command
     def api
       OSDNClient::ProjectApi.new
     end
+
+    def hexdigest(klass, file)
+      fio = file.open
+      dig = klass.new
+      while buf = fio.read(1024*1024) and buf.length > 0
+        dig << buf
+      end
+      fio.close
+      dig.hexdigest
+    end
   end
 end; end; end