Module: Archive_r

Defined in:
lib/archive_r.rb,
ext/archive_r/archive_r_ext.cc

Defined Under Namespace

Classes: Entry, Stream, Traverser

Constant Summary collapse

VERSION =
File.read(version_path).strip
STANDARD_FORMATS =

Common archive formats excluding libarchive’s mtree/raw pseudo formats

%w[
  7zip ar cab cpio empty iso9660 lha rar tar warc xar zip
].freeze

Class Method Summary collapse

Class Method Details

.normalize_options(opts = nil) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/archive_r.rb', line 55

def self.normalize_options(opts = nil)
  options =
    case opts
    when nil
      {}
    when Hash
      opts.dup
    else
      opts.to_hash.dup
    end

  options[:formats] = STANDARD_FORMATS unless options.key?(:formats)
  options
end

.on_fault(*args) ⇒ Object



699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
# File 'ext/archive_r/archive_r_ext.cc', line 699

static VALUE archive_r_on_fault(int argc, VALUE *argv, VALUE self) {
  VALUE callback = Qnil;
  rb_scan_args(argc, argv, "01", &callback);

  if (!NIL_P(callback) && rb_block_given_p()) {
    rb_raise(rb_eArgError, "provide callable argument or block, not both");
  }

  if (NIL_P(callback) && rb_block_given_p()) {
    callback = rb_block_proc();
  }

  FaultCallback cb = make_ruby_fault_callback(callback);
  register_fault_callback(std::move(cb));
  return self;
}

.register_stream_factory(*args) ⇒ Object



665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
# File 'ext/archive_r/archive_r_ext.cc', line 665

static VALUE archive_r_register_stream_factory(int argc, VALUE *argv, VALUE self) {
  VALUE callable = Qnil;
  rb_scan_args(argc, argv, "01", &callable);

  if (!NIL_P(callable) && rb_block_given_p()) {
    rb_raise(rb_eArgError, "provide callable argument or block, not both");
  }

  if (NIL_P(callable) && rb_block_given_p()) {
    callable = rb_block_proc();
  }

  if (NIL_P(callable)) {
    set_root_stream_factory(RootStreamFactory{});
    g_stream_factory_callback.reset();
    return Qnil;
  }

  if (!rb_respond_to(callable, rb_id_call_method)) {
    rb_raise(rb_eTypeError, "stream factory must respond to #call");
  }

  auto holder = std::make_shared<RubyCallbackHolder>(callable);

  RootStreamFactory factory = [holder](const PathHierarchy &hierarchy) -> std::shared_ptr<IDataStream> {
    VALUE result = invoke_ruby_stream_factory(holder, hierarchy);
    return stream_from_ruby_value(result, hierarchy);
  };

  set_root_stream_factory(factory);
  g_stream_factory_callback = holder;
  return Qnil;
}

.traverse(paths, **opts, &block) ⇒ Object



70
71
72
73
74
75
76
77
78
# File 'lib/archive_r.rb', line 70

def self.traverse(paths, **opts, &block)
  options = normalize_options(opts)

  if block
    Traverser.open(paths, options) { |traverser| traverser.each(&block) }
  else
    Traverser.new(paths, options).each
  end
end