From e7f94a02c9824f6a1e68e1cc51a6708451894a28 Mon Sep 17 00:00:00 2001 From: Tatsuki Sugiura Date: Wed, 23 Mar 2016 14:59:23 +0900 Subject: [PATCH] Save local file digest to vars file. --- lib/osdn/cli.rb | 2 +- lib/osdn/cli/command/frs_upload.rb | 36 +++++++++++++++++++++++++++++------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/lib/osdn/cli.rb b/lib/osdn/cli.rb index b397d10..b97e2ad 100644 --- a/lib/osdn/cli.rb +++ b/lib/osdn/cli.rb @@ -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 diff --git a/lib/osdn/cli/command/frs_upload.rb b/lib/osdn/cli/command/frs_upload.rb index 3f90022..bbe1678 100644 --- a/lib/osdn/cli/command/frs_upload.rb +++ b/lib/osdn/cli/command/frs_upload.rb @@ -9,6 +9,7 @@ module OSDN; module CLI; module Command #puts " --release= Target release (numeric id)" puts " -v --visibility=" 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 -- 2.11.0