bin/aurb in aurb-0.9.3 vs bin/aurb in aurb-1.0.0

- old
+ new

@@ -3,222 +3,89 @@ # #-- # Copyright protects this work. # See LICENSE file for details. #++ -%w[rubygems getoptlong pathname zlib open-uri yajl gettext - facets/ansicode facets/minitar facets/version].each do |lib| - begin - require lib - rescue LoadError - abort "F: You're missing '#{lib}'.\nPlease make sure you have the necessary rubygems installed." - end -end -def _ str - GetText::_(str) -end +require File.expand_path(File.dirname(__FILE__) + '/../lib/aurb') -module Aurb - DlPath = File.join ENV['HOME'], 'abs' - PrInfo = {:name => 'Aurb', :version => [0, 9, 3].join('.'), :release => '2009-12-02'} +class Session + include Aurb::Aur - module Util - def ansi text, effect - (@config[:color] ? ANSICode.send(effect.to_sym) : '') << text.to_s << ANSICode.clear - end - end + @@path ||= ENV[:HOME] + '/abs' - class Aur - include Aurb::Util + def self.parse_options + ARGV.unshift '-h' if ARGV.empty? - class << self - def start - trap :INT do - $stderr.puts _("\nInterrupt signal received\n\n") - exit 0 - end + gopts = GetoptLong.new( + ['--download', '-d', GetoptLong::REQUIRED_ARGUMENT], + ['--search', '-s', GetoptLong::REQUIRED_ARGUMENT], + ['--upgrade', '-u', GetoptLong::NO_ARGUMENT ], + ['--version', '-v', GetoptLong::NO_ARGUMENT ], + ['--help', '-h', GetoptLong::NO_ARGUMENT ] + ) - self.new :rpc => proc {|type, arg| "http://aur.archlinux.org/rpc.php?type=#{type}&arg=#{arg}"} - end - end + gopts.each do |opt, args| + case opt + when '--download' + packages = download(args.split) + packages.each_with_index do |package, index| + current = index + 1 + total = packages.size + local = package.split('/')[-1] - def initialize config - opts = Opts.new - @config = config.merge(opts.config) + Dir.chdir(@@path) do + open(package) do |remote| + File.open(local, 'wb') do |local| + local.write remote.read + end + end - opts.cmd.each do |cmd| - cmd.length == 1 ? __send__(cmd.first) : __send__(cmd.first, cmd.last) - $stdout.puts "\n\n-----" unless cmd == opts.cmd.last - end - end - - def download packages - packages.delete_if {|pkg| in_sync?(pkg)} - abort _('E: The package(s) you specified was/were found in the community repository') if packages.empty? - $stdout.puts _("Targets (#{ansi packages.length, :magenta}): #{packages.join(', ')}") - packages.each do |package| - begin - Dir.chdir @config[:path] do - fetch package - untar package + Archive::Tar::Minitar.unpack( + Zlib::GzipReader.new(File.open(local, 'rb')), Dir.pwd + ) + File.delete local end - rescue OpenURI::HTTPError - warn _("W: Something went wrong downloading '#{package}'. Are you sure it exists?") - package == packages.last ? exit : next - end - $stdout.puts _("(#{packages.index(package)+1}/#{packages.length}) downloaded #{package}") - end - end - def search packages - packages.each do |package| - list(package).each do |id| - result = json @config[:rpc]['info', id] - unless result['type'] =~ /error/ - result = result['results'] - next if in_sync? result['Name'] - if package.split.any? {|pac| (result['Name'] + result['Description']).include?(pac)} - $stdout.puts _("[#{result['OutOfDate'] == '1' ? ansi('✘', :red) : ansi('✔', :green)}] " + - "#{ansi result['Name'], :blue} (#{result['Version']})\n #{result['Description']}") - end - end + puts "(#{current}/#{total}) downloaded #{local}" end - end - end + when '--search' + packages = search(args.split) + packages.each do |package| + status = package.OutOfDate == '1' ? '✘'.colorize(:red) : '✔'.colorize(:green) + name = package.Name.colorize(:yellow) + version = package.Version + description = package.Description - def check_upgrade - upgradables = [] - IO.popen('pacman -Qm', IO::RDONLY) {|pm| pm.read.lines}.each do |line| - name, version = line.chomp.split - result = json @config[:rpc]['info', name] - unless result['type'] =~ /error/ - result = result['results'] - next if in_sync? result['Name'] - if VersionNumber.new(result['Version']) > VersionNumber.new(version) - upgradables << result['Name'] - $stdout.puts _("* #{name}: #{ansi version, :red} => #{ansi result['Version'], :green}") - end + puts "[#{status}] #{name} (#{version})\n #{description}" end - end - upgradables.any? ? (download upgradables) : ($stdout.puts _('Nothing to update')) - end - - private - def in_sync? package - !!Dir["/var/lib/pacman/sync/community/#{package}-*"].first - end - - def list package - list = [] - info = json @config[:rpc]['search', URI.escape(package)] - unless info['type'] =~ /error/ - info['results'].each do |result| - list << result['ID'] + when '--upgrade' + local_list = `pacman -Qm`.split(/\n/) + packages = upgrade(local_list) + puts 'Nothing to upgrade' and return if packages.blank? + packages.each do |package| + puts "#{package} has an upgrade available" end - end - list - end + when '--version' + puts Aurb::Version + when '--help' + puts %{ + Aurb - An AUR (Arch User Repository) script - def fetch package - open "http://aur.archlinux.org/packages/#{package}/#{package}.tar.gz" do |remote| - File.open "#{package}.tar.gz", 'wb' do |local| - local.write remote.read - end - end - end + Usage: + #{name = File.basename $0} [options] - def untar package - Archive::Tar::Minitar.unpack \ - Zlib::GzipReader.new(File.open("#{package}.tar.gz", 'rb')), - Dir.pwd - File.delete "#{package}.tar.gz" - end + Options (Required): + -d, --download "packages" Download package(s). + -s, --search "packages" Search package(s). + -u, --upgrade Search for package upgrades. - def json item - Yajl::Parser.new.parse(open(item).read) - end - end - - class Opts - attr_reader :config, :cmd - - def initialize - @cmd = [] - @config = {:path => DlPath, :color => true} - - parse! - self - end - - private - def parse! - ARGV.unshift '-h' if ARGV.empty? - - gopts = GetoptLong.new \ - ['--download', '-d', GetoptLong::REQUIRED_ARGUMENT], - ['--search', '-s', GetoptLong::REQUIRED_ARGUMENT], - ['--upgrade', '-u', GetoptLong::NO_ARGUMENT ], - ['--no-color', GetoptLong::NO_ARGUMENT ], - ['--path', GetoptLong::OPTIONAL_ARGUMENT], - ['--version', '-v', GetoptLong::NO_ARGUMENT ], - ['--help', '-h', GetoptLong::NO_ARGUMENT ] - - gopts.each do |opt, arg| - case opt - when '--download' then @cmd << ['download', arg.split] - when '--search' then @cmd << ['search', arg.split] - when '--upgrade' then @cmd << ['check_upgrade' ] - when '--no-color' then @config[:color] = false - when '--path' - if File.exists? arg = (arg[0...1] == '/' ? arg : File.join(Dir.pwd, arg)) - @config[:path] = Pathname.new(arg).realpath || File.expand_path(arg) - else - warn _("W: '#{arg}' does not exist. Fell back to [#{@config[:path]}]\n") - end - when '--version' - $stdout.puts _('%s %s (%s)' % [:name, :version, :release].map {|key| PrInfo[key]}) - exit -1 - when '--help' then print_help - end + Other: + --version Show version and exit. + --help You're looking at it. + } end - rescue GetoptLong::Error; exit 2 end - - def print_help out = $stdout - out.puts _(<<-HELP) -Aurb - An AUR (Arch User Repository) script - -Usage: - #{name = File.basename $0} [options] - -Options (Required): - -d, --download PACKAGE Download package(s). - -s, --search PACKAGE Search for package(s). - -u, --upgrade Search for package updates. - -Optional: - --no-color Disable colored output. - --path [PATH] Override the default save path. [#{@config[:path]}] - -Other: - --version Show version and exit. - --help You're looking at it. - -Examples: - #{name} -d 'package1 package2' --path ~/downloads - #{name} -s 'package1 package2' --no-color - #{name} --upgrade - -Aurb was inspired by arson. Have a look at http://evaryont.github.com/arson - HELP - exit -1 - end end end -at_exit do - if __FILE__ == $0 - raise $! if $! - Aurb::Aur.start - end -end +Session.parse_options