OSDN Git Service

Fix typo.
[osdn-codes/osdn-cli.git] / lib / osdn / cli / command / relfile.rb
1 require 'osdn/cli/command/frs_base'
2 require 'pathname'
3
4 module OSDN; module CLI; module Command
5   class Relfile < FrsBase
6     def help
7       puts "#{$0} relfile [opts] [list]"
8       puts "#{$0} relfile [opts] create <target-file>"
9       puts "#{$0} relfile [opts] update <numeric-file-id>"
10       puts "#{$0} relfile [opts] delete <numeric-file-id>"
11       puts "Options:"
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     end
19
20     def self.description
21       "Manipulate frs files of project"
22     end
23
24     def process_options
25       opts = GetoptLong.new(
26         [ '--format', '-f', GetoptLong::REQUIRED_ARGUMENT ],
27         [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
28         [ '--package', GetoptLong::REQUIRED_ARGUMENT ],
29         [ '--release', GetoptLong::REQUIRED_ARGUMENT ],
30         [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
31         [ '--force-digest', GetoptLong::NO_ARGUMENT],
32       )
33       opts.each do |opt, arg|
34         case opt
35         when '--format'
36           arg == 'json' and
37             self.format = arg
38         when '--project'
39           arg.empty? or
40             @target_proj = arg
41         when '--package'
42           arg.empty? or
43             @target_package = arg
44         when '--release'
45           arg.empty? or
46             @target_release = arg
47         when '--force-digest'
48           @force_digest = true
49         when '--visibility'
50           unless %w(public private hidden).member?(arg)
51             logger.fatal "Invalid visibility status: #{arg}"
52             exit
53           end
54           @visibility = arg
55         end
56       end
57     end
58     
59     def list
60       release = api.get_release target_proj, target_package, target_release
61       list = release.files
62       if format == 'json'
63         puts list.map{|i| i.to_hash}.to_json
64       else
65         list.each do |f|
66           puts format_file(f)
67         end
68       end
69     end
70
71     def create
72       filename = ARGV.shift
73       if !filename
74         logger.fatal "Target filename is missing."
75         help
76         return
77       end
78       file = Pathname('.') + filename
79       logger.debug "Calculating digest for #{file}..."
80
81       vars = load_variables(file.dirname)
82       digests = nil
83       if !@force_digest && vars.local_file_info &&
84          vars.local_file_info[file.basename.to_s]
85         finfo = vars.local_file_info[file.basename.to_s]
86         if finfo[:size] == file.size && finfo.mtime == file.mtime
87           digests = vars.local_file_info[file.basename.to_s].digests
88         end
89       end
90
91       unless digests
92         logger.info "Calculating digest for #{file}..."
93         digests = {
94           sha256: hexdigest(Digest::SHA256, file),
95           sha1:   hexdigest(Digest::SHA1, file),
96           md5:    hexdigest(Digest::MD5, file),
97         }
98         update_variables file.dirname, {local_file_info: {file.basename.to_s => {digests: digests, mtime: file.mtime, size: file.size}}}
99       end
100
101       fio = file.open
102       logger.level <= Logger::INFO and
103         OSDN::CLI._show_progress = true
104       logger.info "Starting upload #{file}..."
105       f = api.create_release_file target_proj, target_package, target_release, fio, visibility: @visibility
106       fio.close
107       OSDN::CLI._show_progress = false
108       if digests.find { |type, dig| dig != f.send("digest_#{type}") }
109         logger.error "File digests are mismatch! Upload file #{file} may be broken! Please check."
110       else
111         logger.info "Upload complete."
112       end
113       puts format_file(f)
114     end
115
116     def update
117       target_id = ARGV.shift
118       if !target_id
119         logger.fatal "Target file ID is missing."
120         help
121         return
122       end
123       if @visibility.nil?
124         logger.fatal "Visibility status is missing. Use '-v <public|private|hidden>'."
125         return
126       end
127       f = api.update_release_file target_proj, target_package, target_release, target_id, visibility: @visibility
128       logger.info "file #{target_id} has been updated."
129       puts format_file(f)
130     end
131
132     def delete
133       target_id = ARGV.shift
134       if !target_id
135         logger.fatal "Target file ID is missing."
136         help
137         return
138       end
139       f = api.delete_release_file target_proj, target_package, target_release, target_id
140       logger.info "file #{target_id} has been deleted."
141     end
142   end
143 end; end; end