glark 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/glark +2 -2
- data/lib/glark.rb +1 -1
- data/lib/glark/app/app.rb +48 -0
- data/lib/glark/app/help.rb +103 -0
- data/lib/glark/app/info/options.rb +84 -0
- data/lib/glark/app/options.rb +201 -0
- data/lib/glark/app/rcfile.rb +49 -0
- data/lib/glark/app/runner.rb +140 -0
- data/lib/glark/app/spec.rb +19 -0
- data/lib/glark/input/filter/criteria_opts.rb +41 -0
- data/lib/glark/input/filter/dir_criteria_opts.rb +37 -0
- data/lib/glark/input/filter/file_criteria_opts.rb +33 -0
- data/lib/glark/input/filter/filter.rb +59 -0
- data/lib/glark/input/filter/options.rb +171 -0
- data/lib/glark/input/options.rb +120 -0
- data/lib/glark/input/range.rb +104 -0
- data/lib/glark/input/spec.rb +39 -0
- data/lib/glark/io/file/archive_file.rb +64 -0
- data/lib/glark/io/file/binary_file.rb +19 -0
- data/lib/glark/io/file/file.rb +57 -0
- data/lib/glark/io/file/gz_file.rb +21 -0
- data/lib/glark/io/file/tar_file.rb +35 -0
- data/lib/glark/io/file/tar_gz_file.rb +52 -0
- data/lib/glark/io/file/zip_file.rb +39 -0
- data/lib/glark/match/and.rb +83 -0
- data/lib/glark/match/and_distance.rb +58 -0
- data/lib/glark/match/compound.rb +34 -0
- data/lib/glark/match/expression.rb +63 -0
- data/lib/glark/match/factory.rb +173 -0
- data/lib/glark/match/ior.rb +20 -0
- data/lib/glark/match/options.rb +74 -0
- data/lib/glark/match/or.rb +41 -0
- data/lib/glark/match/re.rb +81 -0
- data/lib/glark/match/re_factory.rb +44 -0
- data/lib/glark/match/spec.rb +59 -0
- data/lib/glark/match/xor.rb +20 -0
- data/lib/glark/output/binary_file_summary.rb +17 -0
- data/lib/glark/output/common.rb +43 -0
- data/lib/glark/output/context.rb +57 -0
- data/lib/glark/output/count.rb +26 -0
- data/lib/glark/output/file_header.rb +20 -0
- data/lib/glark/output/file_name_only.rb +35 -0
- data/lib/glark/output/formatted.rb +22 -0
- data/lib/glark/output/glark_count.rb +23 -0
- data/lib/glark/output/glark_format.rb +62 -0
- data/lib/glark/output/glark_lines.rb +36 -0
- data/lib/glark/output/grep_count.rb +18 -0
- data/lib/glark/output/grep_lines.rb +42 -0
- data/lib/glark/output/line_status.rb +46 -0
- data/lib/glark/output/lines.rb +100 -0
- data/lib/glark/output/match_list.rb +15 -0
- data/lib/glark/output/options.rb +103 -0
- data/lib/glark/output/results.rb +23 -0
- data/lib/glark/output/spec.rb +105 -0
- data/lib/glark/output/unfiltered_lines.rb +28 -0
- data/lib/glark/util/colors/options.rb +143 -0
- data/lib/glark/util/colors/spec.rb +21 -0
- data/lib/glark/util/highlight.rb +108 -0
- data/lib/glark/util/io/depth.rb +29 -0
- data/lib/glark/util/io/fileset.rb +162 -0
- data/lib/glark/util/io/filter/criteria.rb +49 -0
- data/lib/glark/util/io/filter/filter.rb +10 -0
- data/lib/glark/util/io/lines.rb +117 -0
- data/lib/glark/util/option.rb +34 -0
- data/lib/glark/util/options.rb +12 -0
- data/lib/glark/util/optutil.rb +69 -0
- data/lib/glark/util/timestamper.rb +18 -0
- data/man/glark.1 +1134 -0
- data/test/glark/app/and_test.rb +82 -0
- data/test/glark/app/compound_test.rb +33 -0
- data/test/glark/app/context_test.rb +43 -0
- data/test/glark/app/count_test.rb +89 -0
- data/test/glark/app/dump_test.rb +16 -0
- data/test/glark/app/expression_file_test.rb +22 -0
- data/test/glark/app/extended_regexp_test.rb +17 -0
- data/test/glark/app/extract_matches_test.rb +27 -0
- data/test/glark/app/files_with_match_test.rb +32 -0
- data/test/glark/app/files_without_match_test.rb +26 -0
- data/test/glark/app/filter_test.rb +118 -0
- data/test/glark/app/highlight_test.rb +78 -0
- data/test/glark/app/ignore_case_test.rb +22 -0
- data/test/glark/app/invert_test.rb +49 -0
- data/test/glark/app/ior_test.rb +21 -0
- data/test/glark/app/label_test.rb +28 -0
- data/test/glark/app/line_number_color_test.rb +42 -0
- data/test/glark/app/line_numbers_test.rb +42 -0
- data/test/glark/app/match_limit_test.rb +49 -0
- data/test/glark/app/options_test.rb +722 -0
- data/test/glark/app/range_test.rb +101 -0
- data/test/glark/app/rcfile_test.rb +113 -0
- data/test/glark/app/record_separator_test.rb +32 -0
- data/test/glark/app/regexp_test.rb +48 -0
- data/test/glark/app/tc.rb +92 -0
- data/test/glark/app/text_color_test.rb +31 -0
- data/test/glark/app/whole_lines_test.rb +17 -0
- data/test/glark/app/whole_words_test.rb +42 -0
- data/test/glark/app/xor_test.rb +19 -0
- data/test/glark/input/binary_file_test.rb +0 -0
- data/test/glark/input/directory_test.rb +202 -0
- data/test/glark/input/dirname_test.rb +69 -0
- data/test/glark/input/exclude_matching_test.rb +20 -0
- data/test/glark/input/ext_test.rb +65 -0
- data/test/glark/input/filter/criteria_test.rb +91 -0
- data/test/glark/input/filter/filter_spec_test.rb +27 -0
- data/test/glark/input/filter/filter_test.rb +21 -0
- data/test/glark/input/name_test.rb +75 -0
- data/test/glark/input/path_test.rb +72 -0
- data/test/glark/input/range_test.rb +82 -0
- data/test/glark/input/size_limit_test.rb +51 -0
- data/test/glark/input/split_as_path_test.rb +28 -0
- data/test/glark/match_test.rb +192 -0
- data/test/glark/resources.rb +21 -0
- data/test/glark/tc.rb +37 -0
- data/test/resources/add.rb +10 -0
- data/test/resources/echo.rb +2 -0
- data/test/resources/greet.rb +13 -0
- metadata +198 -28
- data/README +0 -0
- data/bin/jlark +0 -63
- data/lib/glark/expression.rb +0 -440
- data/lib/glark/exprfactory.rb +0 -248
- data/lib/glark/glark.rb +0 -297
- data/lib/glark/help.rb +0 -85
- data/lib/glark/input.rb +0 -183
- data/lib/glark/options.rb +0 -757
- data/lib/glark/output.rb +0 -266
- data/test/lib/glark/glark_test.rb +0 -317
- data/test/lib/glark/options_test.rb +0 -891
@@ -0,0 +1,120 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
#!ruby -w
|
3
|
+
# vim: set filetype=ruby : set sw=2
|
4
|
+
|
5
|
+
# Options for input.
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
require 'glark/input/spec'
|
9
|
+
require 'glark/util/io/fileset'
|
10
|
+
require 'glark/util/options'
|
11
|
+
|
12
|
+
module Glark
|
13
|
+
class InputOptions < InputSpec
|
14
|
+
include OptionUtil, Loggable
|
15
|
+
|
16
|
+
def initialize optdata
|
17
|
+
super()
|
18
|
+
add_as_options optdata
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_fileset files
|
22
|
+
fsargs = Hash.new
|
23
|
+
fsargs[:max_depth] = @max_depth
|
24
|
+
fsargs[:binary_files] = @binary_files
|
25
|
+
fsargs[:dir_criteria] = @dir_criteria
|
26
|
+
fsargs[:file_criteria] = @file_criteria
|
27
|
+
fsargs[:split_as_path] = @split_as_path
|
28
|
+
|
29
|
+
FileSet.new files, fsargs
|
30
|
+
end
|
31
|
+
|
32
|
+
def set_record_separator sep
|
33
|
+
$/ = if sep && sep.to_i > 0
|
34
|
+
begin
|
35
|
+
sep.oct.chr
|
36
|
+
rescue RangeError => e
|
37
|
+
# out of range (e.g., 777) means nil:
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
else
|
41
|
+
"\n\n"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def config_fields
|
46
|
+
fields = {
|
47
|
+
"binary-files" => binary_files,
|
48
|
+
"split-as-path" => @split_as_path,
|
49
|
+
}
|
50
|
+
fields.merge! @dir_criteria.config_fields
|
51
|
+
fields.merge! @file_criteria.config_fields
|
52
|
+
end
|
53
|
+
|
54
|
+
def dump_fields
|
55
|
+
fields = {
|
56
|
+
"binary_files" => binary_files,
|
57
|
+
"directory" => @directory,
|
58
|
+
"exclude_matching" => @exclude_matching,
|
59
|
+
"split-as-path" => @split_as_path,
|
60
|
+
}
|
61
|
+
fields.merge! @dir_criteria.dump_fields
|
62
|
+
fields.merge! @file_criteria.dump_fields
|
63
|
+
fields
|
64
|
+
end
|
65
|
+
|
66
|
+
def update_fields fields
|
67
|
+
@dir_criteria.update_fields fields
|
68
|
+
@file_criteria.update_fields fields
|
69
|
+
|
70
|
+
fields.each do |name, value|
|
71
|
+
case name
|
72
|
+
when 'split-as-path'
|
73
|
+
@split_as_path = to_boolean value
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def set_directory val
|
79
|
+
@max_depth = val == 'list' ? 0 : nil
|
80
|
+
@dir_criteria.skip_all = val == 'skip'
|
81
|
+
# otherwise, it's recurse
|
82
|
+
end
|
83
|
+
|
84
|
+
def add_as_options optdata
|
85
|
+
optdata << record_separator_option = {
|
86
|
+
:res => [ Regexp.new('^ -0 (\d{1,3})? $ ', Regexp::EXTENDED) ],
|
87
|
+
:set => Proc.new { |md| rs = md ? md[1] : 0; set_record_separator rs }
|
88
|
+
}
|
89
|
+
|
90
|
+
@range.add_as_option optdata
|
91
|
+
|
92
|
+
optdata << recurse_option = {
|
93
|
+
:tags => %w{ -r --recurse },
|
94
|
+
:set => Proc.new { set_directory("recurse") }
|
95
|
+
}
|
96
|
+
|
97
|
+
optdata << directories_option = {
|
98
|
+
:tags => %w{ --directories -d },
|
99
|
+
:arg => [ :string ],
|
100
|
+
:set => Proc.new { |val| set_directory val },
|
101
|
+
}
|
102
|
+
|
103
|
+
re = Regexp.new '^[\'\"]?(' + VALID_BINARY_FILE_TYPES.join('|') + ')[\'\"]?$'
|
104
|
+
optdata << binary_files_option = {
|
105
|
+
:tags => %w{ --binary-files },
|
106
|
+
:arg => [ :required, :regexp, re ],
|
107
|
+
:set => Proc.new { |md| @binary_files = md[1] },
|
108
|
+
:rc => %w{ binary-files },
|
109
|
+
}
|
110
|
+
|
111
|
+
@file_criteria.add_as_options optdata
|
112
|
+
@dir_criteria.add_as_options optdata
|
113
|
+
|
114
|
+
add_opt_true optdata, :exclude_matching, %w{ -M --exclude-matching }
|
115
|
+
|
116
|
+
add_opt_false optdata, :split_as_path, %w{ --no-split-as-path }
|
117
|
+
add_opt_true optdata, :split_as_path, %w{ --split-as-path }
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
module Glark
|
5
|
+
class RangeError < RuntimeError
|
6
|
+
end
|
7
|
+
|
8
|
+
class Range
|
9
|
+
include Loggable, Comparable
|
10
|
+
|
11
|
+
PCT_RE = Regexp.new '([\.\d]+)%'
|
12
|
+
|
13
|
+
attr_accessor :from
|
14
|
+
attr_accessor :to
|
15
|
+
|
16
|
+
def initialize from = nil, to = nil
|
17
|
+
@from = from
|
18
|
+
@to = to
|
19
|
+
end
|
20
|
+
|
21
|
+
def bound?
|
22
|
+
@from.nil? && @to.nil?
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_line var, linecount
|
26
|
+
return nil unless var
|
27
|
+
|
28
|
+
if pct = as_pct(var)
|
29
|
+
count = linecount
|
30
|
+
count * pct.to_f / 100
|
31
|
+
else
|
32
|
+
var.to_f
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def as_pct val
|
37
|
+
(md = PCT_RE.match(val)) && md[1]
|
38
|
+
end
|
39
|
+
|
40
|
+
def validate!
|
41
|
+
return true if @from.nil? || @to.nil?
|
42
|
+
|
43
|
+
frompct, topct = [ @from, @to ].collect { |val| as_pct val }
|
44
|
+
|
45
|
+
# both or neither are percentages:
|
46
|
+
return true if frompct.nil? != topct.nil?
|
47
|
+
|
48
|
+
if frompct
|
49
|
+
check_range! frompct, topct
|
50
|
+
else
|
51
|
+
check_range! @from, @to
|
52
|
+
end
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
def check_range! from, to
|
57
|
+
if from.to_f > to.to_f
|
58
|
+
raise RangeError.new "error: range start (#{@from}) follows range end (#{@to})"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# there is no nil <=> nil in Ruby
|
63
|
+
def compare x, y
|
64
|
+
x.nil? && y.nil? ? nil : (x <=> y).nonzero?
|
65
|
+
end
|
66
|
+
|
67
|
+
def <=> other
|
68
|
+
compare(from, other.from) || compare(to, other.to) || 0
|
69
|
+
end
|
70
|
+
|
71
|
+
def clear
|
72
|
+
@from = nil
|
73
|
+
@to = nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def add_as_option optdata
|
77
|
+
optdata << range_after_option = {
|
78
|
+
:tags => %w{ --after },
|
79
|
+
:arg => [ :required, :regexp, %r{ (\d+%?) $ }x ],
|
80
|
+
:set => Proc.new { |md| @from = md[1] }
|
81
|
+
}
|
82
|
+
|
83
|
+
optdata << range_before_option = {
|
84
|
+
:tags => %w{ --before },
|
85
|
+
:arg => [ :required, :regexp, %r{ (\d+%?) $ }x ],
|
86
|
+
:set => Proc.new { |md| @to = md[1] }
|
87
|
+
}
|
88
|
+
|
89
|
+
optdata << range_option = {
|
90
|
+
:tags => %w{ -R --range },
|
91
|
+
:arg => [ :required, :regexp, Regexp.new('(\d+%?),(\d+%?)') ],
|
92
|
+
:set => Proc.new do |md, opt, args|
|
93
|
+
if md && md[1] && md[2]
|
94
|
+
@from = md[1]
|
95
|
+
@to = md[2]
|
96
|
+
else
|
97
|
+
@from = args.shift
|
98
|
+
@to = args.shift
|
99
|
+
end
|
100
|
+
end
|
101
|
+
}
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
#!ruby -w
|
3
|
+
# vim: set filetype=ruby : set sw=2
|
4
|
+
|
5
|
+
require 'glark/input/range'
|
6
|
+
require 'glark/input/filter/dir_criteria_opts'
|
7
|
+
require 'glark/input/filter/file_criteria_opts'
|
8
|
+
|
9
|
+
module Glark
|
10
|
+
class InputSpec
|
11
|
+
VALID_BINARY_FILE_TYPES = [ 'text', 'without-match', 'skip', 'binary', 'list', 'decompress', 'read' ]
|
12
|
+
|
13
|
+
attr_accessor :binary_files # how to handle binary files
|
14
|
+
attr_accessor :directory # read, skip, or recurse, a la grep
|
15
|
+
attr_accessor :exclude_matching # exclude files whose names match the expression
|
16
|
+
attr_accessor :range # range to start and stop searching; nil => the entire file
|
17
|
+
attr_accessor :split_as_path # use file arguments as path elements
|
18
|
+
|
19
|
+
attr_accessor :dir_criteria
|
20
|
+
attr_accessor :file_criteria
|
21
|
+
attr_accessor :max_depth
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
@binary_files = 'skip'
|
25
|
+
@directory = 'list'
|
26
|
+
@exclude_matching = false
|
27
|
+
|
28
|
+
@range = Range.new
|
29
|
+
@split_as_path = true
|
30
|
+
|
31
|
+
@file_criteria = FileCriteriaOpts.new
|
32
|
+
@dir_criteria = DirCriteriaOpts.new nil
|
33
|
+
|
34
|
+
@max_depth = 0 # list directories
|
35
|
+
|
36
|
+
$/ = "\n"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'glark/io/file/file'
|
5
|
+
|
6
|
+
module Glark
|
7
|
+
class ArchiveFile
|
8
|
+
def initialize fname, range
|
9
|
+
@fname = fname
|
10
|
+
@range = range
|
11
|
+
end
|
12
|
+
|
13
|
+
def search_list expr, output_cls, output_opts
|
14
|
+
contents = StringIO.new list.collect { |x| x + "\n" }.join('')
|
15
|
+
contents.rewind
|
16
|
+
|
17
|
+
file = Glark::File.new @fname, contents, @range
|
18
|
+
output_type = output_cls.new file, output_opts
|
19
|
+
file.search expr, output_type
|
20
|
+
end
|
21
|
+
|
22
|
+
def list
|
23
|
+
contents = Array.new
|
24
|
+
each do |entry|
|
25
|
+
contents << entry_name(entry)
|
26
|
+
end
|
27
|
+
contents
|
28
|
+
end
|
29
|
+
|
30
|
+
def each &blk
|
31
|
+
reader = get_reader
|
32
|
+
reader.each do |entry|
|
33
|
+
blk.call entry
|
34
|
+
end
|
35
|
+
reader.close
|
36
|
+
end
|
37
|
+
|
38
|
+
def search_archive_file expr, entry, output_type_cls, output_opts
|
39
|
+
name = entry_name entry
|
40
|
+
data = read entry
|
41
|
+
contents = StringIO.new data
|
42
|
+
|
43
|
+
file = Glark::File.new name + " (in #{@fname})", contents, @range
|
44
|
+
output = output_type_cls.new file, output_opts
|
45
|
+
file.search expr, output
|
46
|
+
end
|
47
|
+
|
48
|
+
def read entry
|
49
|
+
entry.read
|
50
|
+
end
|
51
|
+
|
52
|
+
def search expr, output_type_cls, output_opts
|
53
|
+
matched = nil
|
54
|
+
each do |entry|
|
55
|
+
# a glitch with zlib doesn't seem to recognize some tarball entries
|
56
|
+
# (with entry.header.typeflag == "") as being a file, so we test for
|
57
|
+
# directory:
|
58
|
+
next if entry.directory?
|
59
|
+
matched = search_archive_file(expr, entry, output_type_cls, output_opts) || matched
|
60
|
+
end
|
61
|
+
matched
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'glark/io/file/file'
|
5
|
+
|
6
|
+
module Glark
|
7
|
+
class BinaryFile < Glark::File
|
8
|
+
def initialize fname
|
9
|
+
file = ::File.new fname
|
10
|
+
file.binmode # for MSDOS/WinWhatever
|
11
|
+
super fname, file, nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def search_as_binary expr, output_opts
|
15
|
+
output_type = BinaryFileSummary.new self, output_opts
|
16
|
+
search expr, output_type
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
#!ruby -w
|
3
|
+
# vim: set filetype=ruby : set sw=2
|
4
|
+
|
5
|
+
require 'glark/util/io/lines'
|
6
|
+
|
7
|
+
module Glark
|
8
|
+
# A thing that can be grepped (er, glarked).
|
9
|
+
class File
|
10
|
+
attr_reader :fname
|
11
|
+
|
12
|
+
def initialize fname, io, range
|
13
|
+
@fname = fname
|
14
|
+
@range = range
|
15
|
+
|
16
|
+
linescls = $/ == "\n" ? Glark::IO::LinesCR : Glark::IO::LinesNonCR
|
17
|
+
@lines = linescls.new fname, io
|
18
|
+
end
|
19
|
+
|
20
|
+
def linecount
|
21
|
+
@lines.count
|
22
|
+
end
|
23
|
+
|
24
|
+
def each_line &blk
|
25
|
+
@lines.each_line(&blk)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns the lines for this file, separated by end of line sequences.
|
29
|
+
def get_lines
|
30
|
+
@lines.get_lines
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns the given line for this file. For this method, a line ends with a
|
34
|
+
# CR, as opposed to the "lines" method, which ends with $/.
|
35
|
+
def get_line lnum
|
36
|
+
@lines.get_line lnum
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the region/range that is represented by the region number.
|
40
|
+
def get_region rnum
|
41
|
+
@lines.get_region rnum
|
42
|
+
end
|
43
|
+
|
44
|
+
def get_range_start
|
45
|
+
@range && @range.from && @range.to_line(@range.from, linecount)
|
46
|
+
end
|
47
|
+
|
48
|
+
def get_range_end
|
49
|
+
@range && @range.to && @range.to_line(@range.to, linecount)
|
50
|
+
end
|
51
|
+
|
52
|
+
def search expr, output
|
53
|
+
expr.process self, output
|
54
|
+
output.matched?
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'glark/io/file/file'
|
5
|
+
require 'zlib'
|
6
|
+
|
7
|
+
module Glark
|
8
|
+
class GzFile < Glark::File
|
9
|
+
def initialize fname, range, &blk
|
10
|
+
if blk
|
11
|
+
Zlib::GzipReader.open(fname) do |gz|
|
12
|
+
super fname, gz, range
|
13
|
+
blk.call [ self, gz ]
|
14
|
+
end
|
15
|
+
else
|
16
|
+
gz = Zlib::GzipReader.new fname
|
17
|
+
super fname, gz, range
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'glark/io/file/file'
|
5
|
+
require 'glark/io/file/archive_file'
|
6
|
+
|
7
|
+
module Glark
|
8
|
+
class TarFile < ArchiveFile
|
9
|
+
def initialize fname, range, io = nil, &blk
|
10
|
+
super fname, range
|
11
|
+
|
12
|
+
# Given that this is a gem, I'm not sure if it is installed with other
|
13
|
+
# package managers. So the require is down here, used only if needed.
|
14
|
+
|
15
|
+
# module Gem::Package is declared in 'rubygems/package', not in
|
16
|
+
# .../tar_reader.
|
17
|
+
require 'rubygems/package'
|
18
|
+
require 'rubygems/package/tar_reader'
|
19
|
+
@io = io
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_reader
|
23
|
+
io = @io || ::File.new(@fname)
|
24
|
+
Gem::Package::TarReader.new io
|
25
|
+
end
|
26
|
+
|
27
|
+
def entry_name entry
|
28
|
+
entry.full_name
|
29
|
+
end
|
30
|
+
|
31
|
+
def read entry
|
32
|
+
entry.read
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|