OSDN Git Service

Add release and file command.
[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=<project>     Target package (numeric id)"
15       puts "     --release=<project>     Target release (numeric id)"
16       puts "  -v --visibility=<public|private|hidden>"
17     end
18
19     def self.description
20       "Manipulate release (includes by package) of project"
21     end
22
23     def process_options
24       opts = GetoptLong.new(
25         [ '--format', '-f', GetoptLong::REQUIRED_ARGUMENT ],
26         [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
27         [ '--package', GetoptLong::REQUIRED_ARGUMENT ],
28         [ '--release', GetoptLong::REQUIRED_ARGUMENT ],
29         [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
30       )
31       opts.each do |opt, arg|
32         case opt
33         when '--format'
34           arg == 'json' and
35             self.format = arg
36         when '--project'
37           arg.empty? or
38             @target_proj = arg
39         when '--package'
40           arg.empty? or
41             @target_package = arg
42         when '--release'
43           arg.empty? or
44             @target_release = arg
45         when '--visibility'
46           unless %w(public private hidden).member?(arg)
47             logger.fatal "Invalid visibility status: #{arg}"
48             exit
49           end
50           @visibility = arg
51         end
52       end
53     end
54     
55     def list
56       release = api.get_release target_proj, target_package, target_release
57       list = release.files
58       if format == 'json'
59         puts list.map{|i| i.to_hash}.to_json
60       else
61         list.each do |f|
62           puts format_file(f)
63         end
64       end
65     end
66
67     def create
68       filename = ARGV.shift
69       if !filename
70         logger.fatal "Target filename is missing."
71         help
72         return
73       end
74       file = Pathname('.') + filename
75       logger.debug "Calculating digest for #{file}..."
76       digests = {
77         sha256: hexdigest(Digest::SHA256, file),
78         sha1:   hexdigest(Digest::SHA1, file),
79         md5:    hexdigest(Digest::MD5, file),
80       }
81       fio = file.open
82       logger.level <= Logger::INFO and
83         OSDN::CLI._show_progress = true
84       logger.info "Starting upload #{file}..."
85       f = api.create_release_file target_proj, target_package, target_release, fio, visibility: @visibility
86       fio.close
87       OSDN::CLI._show_progress = false
88       if digests.find { |type, dig| dig != f.send("digest_#{type}") }
89         logger.error "File digests are mismatch! Upload file #{file} may be broken! Please check."
90       else
91         logger.info "Upload completed."
92       end
93       puts format_file(f)
94     end
95
96     def update
97       target_id = ARGV.shift
98       if !target_id
99         logger.fatal "Target file ID is missing."
100         help
101         return
102       end
103       if @visibility.nil?
104         logger.fatal "Visibility status is missing. Use '-v <public|private|hidden>'."
105         return
106       end
107       f = api.update_release_file target_proj, target_package, target_release, target_id, visibility: @visibility
108       logger.info "file #{target_id} has been updated."
109       puts format_file(f)
110     end
111
112     def delete
113       target_id = ARGV.shift
114       if !target_id
115         logger.fatal "Target file ID is missing."
116         help
117         return
118       end
119       f = api.delete_release_file target_proj, target_package, target_release, target_id
120       logger.info "file #{target_id} has been deleted."
121     end
122   end
123 end; end; end