diff --git a/bin/crew b/bin/crew index 4be43c6b8..60c058d3d 100755 --- a/bin/crew +++ b/bin/crew @@ -6,6 +6,7 @@ require 'fileutils' require 'tmpdir' require_relative '../commands/const' require_relative '../commands/help' +require_relative '../commands/list' require_relative '../lib/docopt' require_relative '../lib/color' require_relative '../lib/const' @@ -222,62 +223,6 @@ def list_packages end end -def list_available - Dir["#{CREW_PACKAGES_PATH}/*.rb"].each do |filename| - pkg_name = File.basename(filename, '.rb') - filelist = File.join(CREW_META_PATH, "#{pkg_name}.filelist") - not_installed = !File.file?(filelist) - - next unless not_installed - - begin - set_package pkg_name, filename - rescue StandardError => e - puts "Error with #{pkg_name}.rb: #{e}".red unless e.to_s.include?('uninitialized constant') - end - puts pkg_name if @pkg.compatible? - end -end - -def list_installed - if @opt_verbose - installed_packages = [] - @device[:installed_packages].each do |package| - search package[:name], true - installed_packages.append("#{package[:name]} #{package[:version]}") - end - sorted_installed_packages = installed_packages.sort - sorted_installed_packages.unshift('======= =======') - sorted_installed_packages.unshift('Package Version') - first_col_width = sorted_installed_packages.map(&:split).map(&:first).max_by(&:size).size + 2 - sorted_installed_packages.map(&:strip).each do |line| - puts "%-#{first_col_width}s%s".lightgreen % line.split - end - print "\n" - else - Dir["#{CREW_META_PATH}/*.directorylist"].map do |f| - File.basename(f, '.directorylist').lightgreen - end - end -end - -def list_compatible(compat = true) - Dir["#{CREW_PACKAGES_PATH}/*.rb"].each do |filename| - pkg_name = File.basename filename, '.rb' - if @device[:compatible_packages].any? { |elem| elem[:name] == pkg_name } - if compat - if File.file? "#{CREW_META_PATH}/#{pkg_name}.filelist" - puts pkg_name.lightgreen - else - puts pkg_name - end - end - elsif !compat - puts pkg_name.lightred - end - end -end - def generate_compatible puts 'Generating compatible packages...'.orange if @opt_verbose @device[:compatible_packages] = [] @@ -1964,15 +1909,7 @@ def install_command(args) end def list_command(args) - if args['available'] - list_available - elsif args['installed'] - puts list_installed - elsif args['compatible'] - list_compatible true - elsif args['incompatible'] - list_compatible false - end + Command.list(args['available'], args['installed'], args['compatible'], args['incompatible'], @opt_verbose) end def postinstall_command(args) diff --git a/commands/list.rb b/commands/list.rb new file mode 100644 index 000000000..00476107c --- /dev/null +++ b/commands/list.rb @@ -0,0 +1,50 @@ +require 'fileutils' +require 'json' +require_relative '../lib/color' +require_relative '../lib/const' +require_relative '../lib/package' + +class Command + def self.list(available, installed, compatible, incompatible, verbose) + device_json = JSON.load_file('/usr/local/etc/crew/device.json', symbolize_names: true) + installed_packages = {} + device_json[:installed_packages].each do |package| + installed_packages[package[:name]] = package[:version] + end + + if available + Dir["#{CREW_PACKAGES_PATH}/*.rb"].each do |filename| + pkg_name = File.basename(filename, '.rb') + next if installed_packages.key?(pkg_name) + pkg = Package.load_package(filename) + puts pkg_name if pkg.compatible? + end + elsif installed + if verbose + installed_packages['======='] = '=======' + installed_packages['Package'] = 'Version' + first_col_width = installed_packages.keys.max {|a, b| a.size <=> b.size }.size + installed_packages.sort.to_h.each do |package, version| + puts "#{package.ljust(first_col_width)} #{version}".lightgreen + end + else + installed_packages.each_key do |package| + puts package.lightgreen + end + end + elsif compatible + Dir["#{CREW_PACKAGES_PATH}/*.rb"].each do |filename| + pkg_name = File.basename(filename, '.rb') + pkg = Package.load_package(filename) + puts pkg_name.lightgreen if pkg.compatible? && installed_packages.key?(pkg_name) + puts pkg_name if pkg.compatible? + end + elsif incompatible + Dir["#{CREW_PACKAGES_PATH}/*.rb"].each do |filename| + pkg_name = File.basename(filename, '.rb') + pkg = Package.load_package(filename) + puts pkg_name.lightred unless pkg.compatible? + end + end + end +end diff --git a/lib/const.rb b/lib/const.rb index 986639fe1..8ed41df12 100644 --- a/lib/const.rb +++ b/lib/const.rb @@ -1,7 +1,7 @@ # lib/const.rb # Defines common constants used in different parts of crew -CREW_VERSION = '1.44.9' +CREW_VERSION = '1.45.0' # kernel architecture KERN_ARCH = `uname -m`.chomp