call (Archive::Tar::Minitar::Command::CommandExtract)

         # File lib/archive/tar/minitar/command.rb, line 482
    482:     def call(args, opts = {}, ioe = {})
    483:       argv    = []
    484:       output  = nil
    485:       dest    = "."
    486:       files   = []
    487:
    488:       while (arg = args.shift)
    489:         case arg
    490:         when '--uncompress', '-z'
    491:           opts[:uncompress] = true
    492:         when '--pipe'
    493:           opts[:output] = ioe[:error]
    494:           output = ioe[:output]
    495:         when '--output', '-o'
    496:           dest = args.shift
    497:         else
    498:           argv << arg
    499:         end
    500:       end
    501:
    502:       if argv.size < 1
    503:         ioe[:output] << "Not enough arguments.\n\n"
    504:         CommandPattern["help"][["extract"]]
    505:         return 255
    506:       end
    507:
    508:       input = argv.shift
    509:       if '-' == input
    510:         opts[:name] = "STDIN"
    511:         input = ioe[:input]
    512:       else
    513:         opts[:name] = input
    514:         input = File.open(input, "rb")
    515:       end
    516:
    517:       if opts[:name] =~ /\.tar\.gz$|\.tgz$/ or opts[:uncompress]
    518:         input = Zlib::GzipReader.new(input)
    519:       end
    520:
    521:       files << argv.to_a
    522:       files.flatten!
    523:
    524:       if opts[:verbose]
    525:         watcher = lambda do |action, name, stats|
    526:           opts[:output] << "#{name}\n" if action == :dir or action == :file_done
    527:         end
    528:         finisher = lambda { opts[:output] << "\n" }
    529:       elsif opts[:progress]
    530:         progress = ProgressBar.new(opts[:name], 1)
    531:         watcher = lambda do |action, name, stats|
    532:           case action
    533:           when :file_start, :dir
    534:             progress.title = File.basename(name)
    535:             if action == :dir
    536:               progress.total += 1
    537:               progress.inc
    538:             else
    539:               progress.total += stats[:entry].size
    540:             end
    541:           when :file_progress
    542:             progress.inc(stats[:currinc])
    543:           end
    544:         end
    545:         finisher = lambda do
    546:           progress.title = opts[:name]
    547:           progress.finish
    548:         end
    549:       else
    550:         watcher = nil
    551:         finisher = lambda { }
    552:       end
    553:
    554:       if output.nil?
    555:         Archive::Tar::Minitar.unpack(input, dest, files, &watcher)
    556:         finisher.call
    557:       else
    558:         Archive::Tar::Minitar::Input.open(input) do |inp|
    559:           inp.each do |entry|
    560:             stats = {
    561:               :mode     => entry.mode,
    562:               :mtime    => entry.mtime,
    563:               :size     => entry.size,
    564:               :gid      => entry.gid,
    565:               :uid      => entry.uid,
    566:               :current  => 0,
    567:               :currinc  => 0,
    568:               :entry    => entry
    569:             }
    570:
    571:             if files.empty? or files.include?(entry.full_name)
    572:               if entry.directory?
    573:                 puts "Directory: #{entry.full_name}"
    574:                 watcher[:dir, dest, stats] unless watcher.nil?
    575:               else
    576:                 puts "File: #{entry.full_name}"
    577:                 watcher[:file_start, destfile, stats] unless watcher.nil?
    578:                 loop do
    579:                   data = entry.read(4096)
    580:                   break unless data
    581:                   stats[:currinc] = output.write(data)
    582:                   stats[:current] += stats[:currinc]
    583:
    584:                   watcher[:file_progress, name, stats] unless watcher.nil?
    585:                 end
    586:                 watcher[:file_done, name, stats] unless watcher.nil?
    587:               end
    588:             end
    589:           end
    590:         end
    591:       end
    592:
    593:       0
    594:     end