OSDN Git Service

First version.
[osdn-codes/osdn-cli.git] / lib / osdn / cli / command / frs_upload.rb
1 module OSDN; module CLI; module Command
2   class FrsUpload < Base
3     def help
4       puts "#{$0} frs_upload [opts] [target_dir]"
5       puts "Options:"
6       puts "  -n --dry-run               Do noting (use with global -v to inspect)"
7       puts "  -p --project=<project>     Target project (numeric id or name)"
8       #puts "     --package=<project>     Target package (numeric id)"
9       #puts "     --release=<project>     Target release (numeric id)"
10       puts "  -v --visibility=<public|private|hidden>"
11       puts "                             Default visibility for newly created items"
12     end
13
14     def run
15       update_token
16       opts = GetoptLong.new(
17         [ '--dry-run', '-n', GetoptLong::NO_ARGUMENT ],
18         [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
19         [ '--release', '-r', GetoptLong::REQUIRED_ARGUMENT ],
20         [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
21       )
22       opts.each do |opt, arg|
23         case opt
24         when '--project'
25           arg.empty? or
26             @target_proj = arg
27         #when '--release'
28         #  arg.empty? or
29         #    @target_release = arg
30         #when '--package'
31         #  arg.empty? or
32         #    @target_package = arg
33         when '--visibility'
34           unless %w(public private hidden).member?(arg)
35             logger.fatal "Invalid visibility status: #{arg}"
36             exit
37           end
38           @visibility = arg
39         when '--dry-run'
40           @dry_run = true
41         end
42       end
43
44       @target_dir = Pathname.new(ARGV.shift || '.')
45       proj_info = api.get_project target_proj # check project existance
46
47       Pathname.glob(@target_dir+'*').each do |pdir|
48         unless load_variables(pdir).package_id
49           logger.info "Createing new package '#{pdir.basename}'"
50           pinfo = api.create_package target_proj, pdir.basename, visibility: @visibility
51           update_variables pdir, package_id: pinfo.id
52           $stdout.puts "New package '#{pinfo.name}' has been created; #{pinfo.url}"
53         end
54
55         Pathname.glob(pdir + '*').each do |rdir|
56           vars = load_variables(rdir)
57           rinfo = nil
58           if vars.release_id
59             rinfo = api.get_release target_proj, target_package(rdir), target_release(rdir)
60           else vars.release_id
61             logger.info "Createing new release '#{rdir.basename}'"
62             rinfo = nil
63             if api.respond_to? :create_reelase # TODO: remove, just typo...
64               rinfo = api.create_reelase target_proj, target_package(rdir), rdir.basename, visibility: @visibility
65             else
66               rinfo = api.create_release target_proj, target_package(rdir), rdir.basename, visibility: @visibility
67             end
68             update_variables rdir, release_id: rinfo.id
69             $stdout.puts "New release '#{rinfo.name}' has been created; #{rinfo.url}"
70           end
71           
72           Pathname.glob(rdir + '*').each do |file|
73             if file.directory?
74               logger.error "Skip direcotry #{file}"
75               next
76             end
77
78             if rinfo.files.find { |f| f.name == file.basename.to_s }
79               logger.warn "Skip already uploaded file '#{file}'"
80             else
81               logger.info "Uploading file #{file} (#{file.size} bytes)"
82               # TODO: show progress bar!
83               finfo = api.create_release_file target_proj, target_package(rdir), target_release(rdir), file.open, visibility: @visibility
84               logger.info "Upload completed."
85               $stdout.puts "New file '#{file}' has been uploaded; #{finfo.url}"
86             end
87           end
88         end
89       end
90     end
91
92     def self.description
93       "Upload local file tree and create package/release implicitly."
94     end
95
96     private
97     def target_proj
98       @target_proj and return @target_proj
99       vars = load_variables(@target_dir)
100       vars.project && !vars.project.empty? and
101         return vars.project
102       logger.fatal "No target project is specified."
103       exit
104     end
105
106     def target_package(dir)
107       @target_package and return @target_package
108       vars = load_variables(dir)
109       vars.package_id && !vars.package_id.to_s.empty? and
110         return vars.package_id
111       logger.fatal "No target package is specified."
112       exit
113     end
114
115     def target_release(dir)
116       @target_release and return @target_release
117       vars = load_variables(dir)
118       vars.release_id && !vars.release_id.to_s.empty? and
119         return vars.release_id
120       logger.fatal "No target release is specified."
121       exit
122     end
123
124     def api
125       OSDNClient::ProjectApi.new
126     end
127   end
128 end; end; end