def call(args, opts = {}, ioe = {})
argv = []
output = nil
dest = "."
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.size < 1
ioe[:output] << "Not enough arguments.\n\n"
CommandPattern["help"][["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]
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].intern
opts[:field] = :full_name if opts[:field] == :name
output = []
Archive::Tar::Minitar::Input.open(input) do |inp|
today = Time.now
oneyear = Time.mktime(today.year - 1, today.month, today.day)
inp.each do |entry|
value = format % fields.map do |ff|
case ff
when "permissions"
s = entry.directory? ? "d" : "-"
s << modestr(entry.mode / 0100)
s << modestr(entry.mode / 0010)
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
end
if opts[:sort]
output << [entry.send(opts[:field]), value]
else
ioe[:output] << value << "\n"
end
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