module OSDN; module CLI; module Command
class FrsUpload < Base
+ attr_accessor :target_proj, :visibility, :force_digest, :dry_run, :show_progress
+
def help
puts "#{$0} frs_upload [opts] [target_dir]"
puts "Options:"
return false
end
- 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
+ filecmd = Relfile.new logger
+ [:target_proj, :visibility, :force_digest, :show_progress].each do |opt|
+ filecmd.send "#{opt}=", send(opt)
end
+ filecmd.target_package = target_package(rdir)
+ filecmd.target_release = target_release(rdir)
+ filecmd.calc_file_digest(file)
+
+ vars = load_variables(rdir)
+ digests = vars.local_file_info[file.basename.to_s].digests
- 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}") }
+ if remote_f.size != file.size || digests.find { |type, dig| rd = remote_f.send("digest_#{type}"); rd && rd != '' && dig != rd }
logger.error "#{file} was changed from remote file! Please delete remote file before uploading new one."
end
logger.info "Skip already uploaded file '#{file}'"
return
end
+ finfo = {}
logger.info "Uploading file #{file} (#{file.size} bytes)"
if @dry_run
finfo = Hashie::Mash.new id: '(dry-run)', url: '(dry-run)'
else
- logger.level <= Logger::INFO && @show_progress != false || @show_progress and
- OSDN::CLI._show_progress = true
- fio = file.open
- logger.info "Starting upload #{file}..."
- max_upload_tries = 5
- upload_tries = 0
- begin
- upload_tries += 1
- finfo = api.create_release_file target_proj, target_package(rdir), target_release(rdir), fio, visibility: @visibility
- rescue OSDNClient::ApiError => e
- if max_upload_tries - upload_tries <= 0
- logger.error "Max upload attempts (#{max_upload_tries}) has been exceeded, give up!"
- raise e
- elsif [0, 100, 502].member?(e.code.to_i)
- fio.rewind
- logger.error "Upload error (#{e.code} #{e.message}), retrying (#{upload_tries}/#{max_upload_tries})..."
- sleep 10
- retry
- else
- raise e
- end
- ensure
- OSDN::CLI._show_progress = false
- fio.close
- end
- 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 complete."
- end
+ finfo = filecmd.create_one file
end
$stdout.puts "New file '#{file}' has been uploaded; #{finfo.url}"
end