OSDN Git Service

Package and release command gets target from vars file.
[osdn-codes/osdn-cli.git] / lib / osdn / cli / command / frs_mkdirs.rb
1 require 'pathname'
2 require 'fileutils'
3
4 module OSDN; module CLI; module Command
5   class FrsMkdirs < Base
6     def help
7       puts "#{$0} frs_mkdirs [opts] [target_dir]"
8       puts "Options:"
9       puts "  -p --project=<project>     Target project (numeric id or name)"
10       #puts "     --package=<package_id>  Target package (numeric id)"
11       #puts "     --release=<release_id>  Target release (numeric id)"
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       )
20       opts.each do |opt, arg|
21         case opt
22         when '--project'
23           arg.empty? or
24             @target_proj = arg
25         end
26       end
27
28       proj_info = api.get_project target_proj # check project existance
29
30       target_dir = Pathname.new(ARGV.shift || '.')
31       FileUtils.mkdir_p target_dir
32       update_variables target_dir, project: target_proj
33
34       logger.debug "Getting Package list..."
35       packages = api.list_packages target_proj
36       logger.debug "Making each package directory"
37
38       packages.each do |package|
39         pname = fsname(package.name)
40         if pname != package.name
41           logger.warn "Package name '#{package.name}' is not suitable for filesystem, using '#{pname}'."
42         end
43         logger.info "Making directory for package #{pname}"
44         pdir = target_dir + pname
45         FileUtils.mkdir_p(pdir)
46         update_variables pdir, package_id: package.id
47         package.releases.each do |release|
48           rname = fsname(release.name)
49           if rname != release.name
50             logger.warn "Release name '#{release.name}' is not suitable for filesystem, using '#{rname}'."
51           end
52           logger.info "Making directory for release #{rname}"
53           rdir = pdir + rname
54           if rdir.exist? && !rdir.directory?
55             logger.error "'#{rdir}' exists but it is not a directory. Please check and delete it."
56             next
57           end
58           FileUtils.mkdir_p(rdir)
59           update_variables rdir, release_id: release.id
60         end
61       end
62     end
63
64     def self.description
65       "Make directory tree for current project release"
66     end
67
68     private
69     def target_proj
70       @target_proj and return @target_proj
71       vars = load_variables
72       vars.project && !vars.project.empty? and
73         return vars.project
74       logger.fatal "No target project is specified."
75       exit
76     end
77
78     def api
79       OSDNClient::ProjectApi.new
80     end
81
82     def fsname(name)
83       name = name.to_s.tr('/', '-')
84       if name.empty?
85         name = '(no-name)'
86       end
87       name
88     end
89   end
90 end; end; end