1 require 'osdn/cli/command/frs_base'
4 module OSDN; module CLI; module Command
5 class Relfile < FrsBase
7 puts "#{$0} relfile [opts] [list]"
8 puts "#{$0} relfile [opts] create <target-file> [target-files...]"
9 puts "#{$0} relfile [opts] update <numeric-file-id>"
10 puts "#{$0} relfile [opts] delete <numeric-file-id>"
12 puts " -f --format=<pretty|json> Set output format"
13 puts " -p --project=<project> Target project (numeric id or name)"
14 puts " --package=<package-id> Target package (numeric id)"
15 puts " --release=<release-id> Target release (numeric id)"
16 puts " -v --visibility=<public|private|hidden>"
17 puts " --force-digest Calc local file digest forcely"
18 puts " --progress Force to show upload progress"
19 puts " --no-progress Force to hide upload progress"
23 "Manipulate frs files of project"
27 opts = GetoptLong.new(
28 [ '--format', '-f', GetoptLong::REQUIRED_ARGUMENT ],
29 [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
30 [ '--package', GetoptLong::REQUIRED_ARGUMENT ],
31 [ '--release', GetoptLong::REQUIRED_ARGUMENT ],
32 [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
33 [ '--force-digest', GetoptLong::NO_ARGUMENT],
34 [ '--progress', GetoptLong::NO_ARGUMENT],
35 [ '--no-progress', GetoptLong::NO_ARGUMENT],
37 opts.each do |opt, arg|
54 unless %w(public private hidden).member?(arg)
55 logger.fatal "Invalid visibility status: #{arg}"
62 @show_progress = false
68 release = api.get_release target_proj, target_package, target_release
71 puts list.map{|i| i.to_hash}.to_json
80 if ARGV.empty? || ARGV.first == ""
81 logger.fatal "Target filename is missing."
91 def create_one(filename)
92 file = Pathname('.') + filename
93 logger.debug "Calculating digest for #{file}..."
95 vars = load_variables(file.dirname)
97 if !@force_digest && vars.local_file_info &&
98 vars.local_file_info[file.basename.to_s]
99 finfo = vars.local_file_info[file.basename.to_s]
100 if finfo[:size] == file.size && finfo.mtime == file.mtime
101 digests = vars.local_file_info[file.basename.to_s].digests
106 logger.info "Calculating digest for #{file}..."
108 sha256: hexdigest(Digest::SHA256, file),
109 sha1: hexdigest(Digest::SHA1, file),
110 md5: hexdigest(Digest::MD5, file),
112 update_variables file.dirname, {local_file_info: {file.basename.to_s => {digests: digests, mtime: file.mtime, size: file.size}}}
116 logger.level <= Logger::INFO && @show_progress != false || @show_progress and
117 OSDN::CLI._show_progress = true
118 logger.info "Starting upload #{file}..."
119 f = api.create_release_file target_proj, target_package, target_release, fio, visibility: @visibility
121 OSDN::CLI._show_progress = false
122 if digests.find { |type, dig| dig != f.send("digest_#{type}") }
123 logger.error "File digests are mismatch! Upload file #{file} may be broken! Please check."
125 logger.info "Upload complete."
131 target_id = ARGV.shift
133 logger.fatal "Target file ID is missing."
138 logger.fatal "Visibility status is missing. Use '-v <public|private|hidden>'."
141 f = api.update_release_file target_proj, target_package, target_release, target_id, visibility: @visibility
142 logger.info "file #{target_id} has been updated."
147 target_id = ARGV.shift
149 logger.fatal "Target file ID is missing."
153 f = api.delete_release_file target_proj, target_package, target_release, target_id
154 logger.info "file #{target_id} has been deleted."