16 'prepend' => :pretend,
17 'verbose' => :verbose,
19 'generate' => :generate,
20 'madgen' => :mass_generate,
24 'BlueCloth' => 'bluecloth',
25 'KirbyBase' => 'kirbybase',
26 'libxml-ruby' => 'libxml',
27 'RedCloth' => 'redcloth',
28 'mega' => 'mega-modules',
29 'nano' => 'nano-methods',
30 'gettext' => 'ruby-gettext',
32 'ZenTest' => 'zentest',
33 'NGSLib-RFile' => 'ngslib-rfile',
39 attr_accessor :options
42 @options, packages = parse_opts(ARGV)
43 Portage.setup_overlay(options[:pretend] || options[:mass_generate])
45 if options[:mass_generate] == true
47 puts "Ebuilds are in #{Portage.rubydev_overlay}"
51 spec_groups = packages.map {|pkg| get_specs(pkg)}
52 all_specs = spec_groups.flatten
54 puts "No package found"
60 puts "Create ebuild for #{spec.full_name}" if options[:verbose]
61 gem_ebuild = Ebuild.new(spec)
65 # No prepend, digest the ebuilds
66 if options[:pretend] == false
67 ebuilds.each {|ebuild| ebuild.execute('digest')}
69 # don't specify --generate, continue digest and emerge
70 if options[:generate] == false
71 cmd = 'emerge '+gen_opts(options)+' '+spec_groups.map{|specs| GGem.ebuild_name(specs[0].name)}.join(' ')
72 puts cmd if options[:verbose]
76 # don't clean up if --generate because overlay may be /tmp/*
77 if options[:generate] == true
78 puts "Ebuilds are in #{Portage.rubydev_overlay}"
86 navigate(pkg.gem_name,pkg.gem_requirement) { |spec| specs << spec }
90 def navigate(gem_name,gem_version = nil,&block)
91 if Portage.ebuild_exists(gem_name,gem_version)
92 puts "Ebuild for #{gem_name} exists" if options[:verbose]
95 # cache source_index_hash, no need to recheck it everytime
96 @@gri = Gem::RemoteInstaller.new if @@gri.nil?
97 @@sources = @@gri.source_index_hash if @@sources.nil?
98 version_requirement = gem_version.is_a?(Gem::Version::Requirement) ? gem_version : Gem::Version::Requirement.new(gem_version || ">= 0")
100 for source_name,source in @@sources
101 specs = source.find_name(gem_name, version_requirement)
102 next if specs.nil? or specs.empty?
103 # ignore mswin32 platform
104 satisfied_specs = specs.find_all do |spec|
105 spec.platform == 'ruby' and
106 version_requirement.satisfied_by?(spec.version)
108 gem_spec = satisfied_specs[-1]
110 def local?() false; end
111 def set_source(source)
118 gem_spec.set_source(source_name)
122 puts "#{gem_name} not found"
126 for dep in gem_spec.dependencies
127 navigate(dep.name, dep.requirement_list, &block)
133 excludes = [:mass_generate, :generate]
134 opts.keys.map do |key|
135 opts[key] == true && !excludes.member?(key) ? "--#{key}" : ''
145 :mass_generate => false
151 for i in 1..arg.length-1
152 if SHORTMAP.key? arg[i..i]
153 opts[SHORTMAP[arg[i..i]]] = true
155 puts "Unknown option '-#{arg[i..i]}'"
159 if LONGMAP.key? arg[2..-1]
160 opts[LONGMAP[arg[2..-1]]] = true
162 puts "Unknown option '#{arg}'"
165 packages << DependencyAtom.new(arg)
168 return opts, packages
172 @@gri = Gem::RemoteInstaller.new if @@gri.nil?
173 @@sources = @@gri.source_index_hash if @@sources.nil?
174 for source_name,source in @@sources
175 source.each do |full_name,spec|
176 if spec.platform == 'ruby'
179 def local?() false; end
180 def set_source(source) @source = source end
181 def fetched_from() @source end
183 spec.set_source(source_name)
191 def ebuild_name(gem_name)
192 return SPECIAL_MAPS[gem_name] if SPECIAL_MAPS.key? gem_name
194 gem_name.gsub(/[_:.]+/,'-').
195 gsub(/([^-0-9A-Z])([A-Z])([a-z])/) { "#{$1}-#{$2}#{$3}" }. # split words
196 gsub(/([^-0-9A-Z])([A-Z])([a-z])/) { "#{$1}-#{$2}#{$3}" }. # split words again
197 gsub(/([A-Z]{2,})([A-Z][^A-Z-])/) { "#{$1}-#{$2}"}. # find acronyms
198 gsub(/([A-Z]{2,})-([A-Z])$/) {"#{$1}#{$2}"}. # recover wrong acronym breaking