OSDN Git Service

84e64fe8ad3ab6c5c89d335efd1870c3780f5e8c
[osdn-codes/osdn-cli.git] / lib / osdn / cli / command / release.rb
1 require 'osdn/cli/command/frs_base'
2
3 module OSDN; module CLI; module Command
4   class Release < FrsBase
5     def help
6       puts "#{$0} release [opts] [list]"
7       puts "#{$0} release [opts] create <new-release-name>"
8       puts "#{$0} release [opts] update <numeric-release-id> [name]"
9       puts "#{$0} release [opts] delete <numeric-release-id>"
10       puts "Options:"
11       puts "  -f --format=<pretty|json>  Set output format"
12       puts "  -p --project=<project>     Target project (numeric id or name)"
13       puts "     --package=<package-id>  Target package (numeric id)"
14       puts "  -v --visibility=<public|private|hidden>"
15     end
16
17     def self.description
18       "Manipulate frs releases of project"
19     end
20
21     def process_options
22       opts = GetoptLong.new(
23         [ '--format', '-f', GetoptLong::REQUIRED_ARGUMENT ],
24         [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
25         [ '--package', GetoptLong::REQUIRED_ARGUMENT ],
26         [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
27       )
28       opts.each do |opt, arg|
29         case opt
30         when '--format'
31           arg == 'json' and
32             self.format = arg
33         when '--project'
34           arg.empty? or
35             @target_proj = arg
36         when '--package'
37           arg.empty? or
38             @target_package = arg
39         when '--visibility'
40           unless %w(public private hidden).member?(arg)
41             logger.fatal "Invalid visibility status: #{arg}"
42             exit
43           end
44           @visibility = arg
45         end
46       end
47     end
48
49     def list
50       package = api.get_package target_proj, target_package
51       list = package.releases
52       if format == 'json'
53         puts list.map{|i| i.to_hash}.to_json
54       else
55         list.each do |r|
56           puts format_release(r)
57         end
58       end
59     end
60
61     def create
62       name = ARGV.shift
63       if !name
64         logger.fatal "Release name is missing."
65         help
66         return
67       end
68       r = api.create_release target_proj, target_package, name, visibility: @visibility
69       logger.info "New release has been created."
70       puts format_release(r)
71     end
72
73     def update
74       target_id = ARGV.shift
75       args = {name: ARGV.shift}
76       if @visibility
77         args[:visibility] = @visibility
78       end
79       r = api.update_release target_proj, target_package, target_id, args
80       logger.info "Release #{target_id} has been updated."
81       puts format_release(r)
82     end
83
84     def delete
85       target_id = ARGV.shift
86       r = api.delete_release target_proj, target_package, target_id
87       logger.info "Release #{target_id} has been deleted."
88     end
89
90   end
91 end; end; end