logger.warn "Failed to load variables from #{path}; #{e.message}"
end
end
+ # Fix key conflicts
+ if vars['local_file_info']
+ vars['local_file_info'].each do |fname, finfo|
+ finfo.has_key?('size') or next
+ finfo['filesize'] = finfo.delete('size')
+ end
+ end
logger.debug "Variables: #{vars.inspect}"
Hashie::Mash.new(vars)
end
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
module OSDN; module CLI; module Command
class Relfile < FrsBase
+ attr_accessor :target_proj, :target_package, :target_release, :visibility, :force_digest, :show_progress
+
def help
puts "#{$0} relfile [opts] [list]"
puts "#{$0} relfile [opts] create <target-file> [target-files...]"
end
end
- def create_one(filename)
+ def calc_file_digest(filename)
file = Pathname('.') + filename
- logger.debug "Calculating digest for #{file}..."
-
vars = load_variables(file.dirname)
digests = nil
if !@force_digest && vars.local_file_info &&
- vars.local_file_info[file.basename.to_s]
+ 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
+ if finfo.filesize == file.size && finfo.mtime == file.mtime
digests = vars.local_file_info[file.basename.to_s].digests
end
end
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}}}
+ update_variables file.dirname, {local_file_info: {file.basename.to_s => {digests: digests, mtime: file.mtime, filesize: file.size}}}
end
+ end
+ def create_one(filename)
+ file = Pathname('.') + filename
+ calc_file_digest file
+ vars = load_variables(file.dirname)
fio = file.open
logger.level <= Logger::INFO && @show_progress != false || @show_progress and
OSDN::CLI._show_progress = true
- logger.info "Starting upload #{file}..."
+ logger.info "Starting upload #{file} (#{file.size} bytes)..."
max_upload_tries = 5
upload_tries = 0
- f = nil
+ remote_file = nil
begin
upload_tries += 1
- f = api.create_release_file target_proj, target_package, target_release, fio, visibility: @visibility
+ remote_file = api.create_release_file target_proj, target_package, target_release, 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!"
OSDN::CLI._show_progress = false
end
- if digests.find { |type, dig| dig != f.send("digest_#{type}") }
- logger.error "File digests are mismatch! Upload file #{file} may be broken! Please check."
+ if vars.local_file_info[file.basename.to_s].digests.find { |type, dig| rd = remote_file.send("digest_#{type}"); rd && rd != '' && rd != dig }
+ logger.error "File digest mismatch! Uploaded file #{file} may be broken! Please check."
+ elsif file.size != remote_file.size
+ logger.error "File size mismatch! Uploaded file #{file} may be broken! Please check."
else
logger.info "Upload complete."
end
- puts format_file(f)
+ puts format_file(remote_file)
+ remote_file
end
def update