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