class Minitar::CLI::Command::List
Tarball list command. This will be replaced in a future version by one of the better-executed CLI application frameworks like GLI, after Ruby 1.8 and 1.9 support have been dropped.
Constants
- HELP
Public Instance Methods
altname()
click to toggle source
# File lib/minitar/cli/command/list.rb, line 11 def altname 'ls' end
help()
click to toggle source
# File lib/minitar/cli/command/list.rb, line 160 def help HELP end
modestr(mode)
click to toggle source
# File lib/minitar/cli/command/list.rb, line 38 def modestr(mode) s = String.new('---') s[0] = 'r' if (mode & 4) == 4 s[1] = 'w' if (mode & 2) == 2 s[2] = 'x' if (mode & 1) == 1 s end
name()
click to toggle source
# File lib/minitar/cli/command/list.rb, line 7 def name 'list' end
run(args, opts = {})
click to toggle source
# File lib/minitar/cli/command/list.rb, line 48 def run(args, opts = {}) argv = [] output = nil files = [] opts[:field] = 'name' while (arg = args.shift) case arg when '--sort', '-S' opts[:sort] = true opts[:field] = args.shift when '--reverse', '-R' opts[:reverse] = true opts[:sort] = true when '--uncompress', '-z' opts[:uncompress] = true when '-l' opts[:verbose] = true else argv << arg end end if argv.empty? ioe[:output] << "Not enough arguments.\n\n" commander.command('help').call(%w(list)) return 255 end input = argv.shift if '-' == input opts[:name] = 'STDIN' input = ioe[:input] else opts[:name] = input input = File.open(input, 'rb') end if opts[:name] =~ /\.tar\.gz$|\.tgz$/ or opts[:uncompress] require 'zlib' input = Zlib::GzipReader.new(input) end files << argv.to_a files.flatten! if opts[:verbose] or opts[:progress] format = '%10s %4d %8s %8s %8d %12s %s' datefmt = '%b %d %Y' timefmt = '%b %d %H:%M' fields = %w(permissions inodes user group size date fullname) else format = '%s' fields = %w(fullname) end opts[:field] = opts[:field].to_sym opts[:field] = :full_name if opts[:field] == :name output = [] today = Time.now oneyear = Time.mktime(today.year - 1, today.month, today.day) Archive::Tar::Minitar::Input.each_entry(input) do |entry| next unless files.empty? || files.include?(entry.full_name) value = format % fields.map { |ff| case ff when 'permissions' s = String.new(entry.directory? ? 'd' : '-') s << modestr(entry.mode / 0o100) s << modestr(entry.mode / 0o010) s << modestr(entry.mode) when 'inodes' entry.size / 512 when 'user' entry.uname || entry.uid || 0 when 'group' entry.gname || entry.gid || 0 when 'size' entry.size when 'date' if Time.at(entry.mtime) > oneyear Time.at(entry.mtime).strftime(timefmt) else Time.at(entry.mtime).strftime(datefmt) end when 'fullname' entry.full_name end } if opts[:sort] output << [ entry.send(opts[:field]), value ] else ioe[:output] << value << "\n" end end if opts[:sort] output = output.sort { |a, b| a[0] <=> b[0] } if opts[:reverse] output.reverse_each { |oo| ioe[:output] << oo[1] << "\n" } else output.each { |oo| ioe[:output] << oo[1] << "\n" } end end 0 end