2 # vim: set sw=4 sts=4 et tw=80 ft=ruby :
5 # Copyright (c) 2007 Mike Kelly <pioto@pioto.org>
7 # This file is part of the Paludis package manager. Paludis is free software;
8 # you can redistribute it and/or modify it under the terms of the GNU General
9 # Public License, version 2, as published by the Free Software Foundation.
11 # Paludis is distributed in the hope that it will be useful, but WITHOUT ANY
12 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 # You should have received a copy of the GNU General Public License along with
17 # this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18 # Place, Suite 330, Boston, MA 02111-1307 USA
20 %w(Paludis getoptlong rexml/document net/http uri fileutils).each {|x| require x}
24 Log.instance.log_level = Paludis::LogLevel::Warning
25 Log.instance.program_name = $0
28 herdsxml_url = URI.parse('http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo/xml/htdocs/proj/en/metastructure/herds/herds.xml?content-type=text%2Fplain')
30 opts = GetoptLong.new(
31 [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
32 [ '--version', '-V', GetoptLong::NO_ARGUMENT ],
33 [ '--log-level', GetoptLong::REQUIRED_ARGUMENT ],
34 [ '--environment', '-E', GetoptLong::REQUIRED_ARGUMENT ],
35 [ '--herd', GetoptLong::NO_ARGUMENT ],
36 [ '--package', GetoptLong::NO_ARGUMENT ],
37 [ '--dev', GetoptLong::NO_ARGUMENT ],
38 [ '--verbose', '-v', GetoptLong::NO_ARGUMENT ])
44 opts.each do | opt, arg |
47 puts "Usage: " + $0 + " [options] <name> [<name> ...]"
50 puts " -h|--help Display a help message"
51 puts " -V|--version Display program version"
52 puts " --log-level level Set log level (debug, qa, warning, slient)"
53 puts " -E|--environment env Environment specification (class:suffix, both parts optional)"
55 puts "The following options affect what sort of information is shown:"
56 puts " --herd Show more information about the herds given."
57 puts " --package Show the maintainer data for the given package names (default)."
58 puts " --dev Show the herds that the given developer is a member of."
60 puts " -v|--verbose Verbose output (e.g. lookup herd members)"
64 puts $0.to_s.split(/\//).last + " " + version + " (Paludis Version: " +Paludis::Version + ")"
70 Paludis::Log.instance.log_level = Paludis::LogLevel::Debug
72 Paludis::Log.instance.log_level = Paludis::LogLevel::Qa
74 Paludis::Log.instance.log_level = Paludis::LogLevel::Warning
76 Paludis::Log.instance.log_level = Paludis::LogLevel::Silent
78 puts "Bad --log-level value " + arg
98 env = EnvironmentFactory.instance.create(env_spec)
101 puts "No arguments supplied"
105 package_db = env.package_database()
107 # build a hash of repo.name->repo.location
110 package_db.repositories.each do | repo |
111 next if repo.e_interface == nil
112 repo.each_metadata do | key |
113 locations[repo.name] = key.value if key.raw_name == 'location'
117 cache_dir = File.expand_path '~/.grex'
118 herds_cache_file = "#{cache_dir}/herds.xml"
120 if File.readable?(herds_cache_file) && File.mtime(herds_cache_file) > Time.now - 24 * 60 * 60
121 herdsxml = REXML::Document.new File.read(herds_cache_file)
124 req = Net::HTTP::Get.new(herdsxml_url.path)
125 res = Net::HTTP.start(herdsxml_url.host, herdsxml_url.port) {|http|
130 puts "Couldn't fetch herds.xml."
133 FileUtils.mkdir(cache_dir) unless File.directory? cache_dir
134 File.open(herds_cache_file, 'w') {|x| x.print body}
135 herdsxml = REXML::Document.new body
138 ARGV.each do | name |
141 if package_name.include? ?/
142 fqpn = QualifiedPackageName.new(package_name)
144 fqpn = package_db.fetch_unique_qualified_package_name(package_name)
148 package_db.repositories.each do | repo |
149 next if repo.e_interface == nil
150 next unless repo.has_package_named? fqpn
152 location = locations[repo.name]
155 file = File.new(location + "/" + fqpn + "/metadata.xml")
157 puts " No metadata.xml for this repo (#{repo.name}). Skipping."
160 puts " #{repo.name}: #{location}"
163 metadata = REXML::Document.new file
165 puts " Error parsing metadata.xml for this repo (#{repo.name}). Skipping."
169 metadata.elements.each("pkgmetadata/herd") do | element |
170 herd = element.text.to_s
172 Paludis::Log.instance.message("grex.empty_herd", Paludis::LogLevel::Qa, "Empty <herd> tag in metadata.xml for #{fqpn} in #{repo.name}.")
176 print " herd: #{herd}"
179 herdsxml.elements.each("herds/herd") do | element |
180 next unless element.text("name").strip == herd
181 print " <#{element.text("email").strip}>" unless element.text("email") == nil
183 element.elements.each() do | maintainer |
184 name = maintainer.text("name").to_s.strip
185 email = maintainer.text("email").to_s.strip
186 next if name.empty? and email.empty?
188 print " maintainer: "
195 print "#{name} <#{email}>"
203 metadata.elements.each("pkgmetadata/maintainer") do | element |
204 name = element.text("name").to_s.strip
205 email = element.text("email").to_s.strip
206 next if name.empty? and email.empty?
208 print " maintainer: "
215 print "#{name} <#{email}>"
222 herdsxml.elements.each("herds/herd") do | element |
223 element.context={:compress_whitespace => :all}
224 next unless element.text("name").strip == name
225 print " <#{element.text("email").strip}>" unless element.text("email") == nil
228 desc = element.text("description").to_s.strip
229 puts " :: #{desc}" unless desc.empty?
231 proj_page = element.text("maintainingproject").to_s.strip
232 puts " :: http://www.gentoo.org#{proj_page}" unless proj_page.empty?
234 element.elements.each() do | maintainer |
235 name = maintainer.text("name").to_s.strip
236 email = maintainer.text("email").to_s.strip
237 role = maintainer.text("role").to_s.strip
238 next if name.empty? and email.empty?
240 print " maintainer: "
247 print "#{name} <#{email}>"
249 print " (#{role})" unless role.empty?