ffi-libarchive 1.0.17 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27c509a1d26618d51623cca95acc84cfeb8c804bdf818b999c8d10ac173a99ae
4
- data.tar.gz: 7d2a2184aa944ff1e91917be83e58be06d1df592154ce1a1bc33c8c1a6e1dd5e
3
+ metadata.gz: ad607029b63e0c23ad8bf7ab667c246ec99d122ae09a60430657b1fa6ddd8126
4
+ data.tar.gz: 57c455b2d4e159da7ccee28faa0f4c347d98e6b92a8ffe70b5c00e6b02a60414
5
5
  SHA512:
6
- metadata.gz: e6ba3e6ccb7c1ce9656a6bf399e4d6050bf9b8bc813d4eb6f9435c0be177dda9c861d9387913e8220eb7e27067ce93cbd891f221efcdc62c11e61f0b9284b055
7
- data.tar.gz: 84bec17cb6e83978bd5241c116668ade6e4b2cf25595bdd44f10267c8274f42eaec00ec9719ecec2020cc1d927c13d55c437de89f4b5a8c387ed1ee1083b3797
6
+ metadata.gz: 35b3c1c4737846dedf71efa6925f6c594ff997156cd793a2df39e001d7d874fc74f20a36f38aa0c593718c28ef9bbd64029ec28aadf6e8d2317469e002aaf330
7
+ data.tar.gz: 5d054df7e653dd6e14f1897cddd0859cdf90e3f26970f2d09701ee0a2ae8c2a89496fe1035850426f7634e01d7fad91cb5ab7b5c7392849d03c8eceace2fe15c
@@ -2,16 +2,16 @@ module Archive
2
2
  class Reader < BaseArchive
3
3
  private_class_method :new
4
4
 
5
- def self.open_filename(file_name, command = nil)
5
+ def self.open_filename(file_name, command = nil, strip_components: 0)
6
6
  if block_given?
7
- reader = open_filename file_name, command
7
+ reader = open_filename file_name, command, strip_components: strip_components
8
8
  begin
9
9
  yield reader
10
10
  ensure
11
11
  reader.close
12
12
  end
13
13
  else
14
- new file_name: file_name, command: command
14
+ new file_name: file_name, command: command, strip_components: strip_components
15
15
  end
16
16
  end
17
17
 
@@ -41,9 +41,19 @@ module Archive
41
41
  end
42
42
  end
43
43
 
44
+ attr_reader :strip_components
45
+
44
46
  def initialize(params = {})
45
47
  super C.method(:archive_read_new), C.method(:archive_read_finish)
46
48
 
49
+ if params[:strip_components]
50
+ raise ArgumentError, "Expected Integer as strip_components" unless params[:strip_components].is_a?(Integer)
51
+
52
+ @strip_components = params[:strip_components]
53
+ else
54
+ @strip_components = 0
55
+ end
56
+
47
57
  if params[:command]
48
58
  cmd = params[:command]
49
59
  raise Error, @archive if C.archive_read_support_compression_program(archive, cmd) != C::OK
@@ -131,12 +141,16 @@ module Archive
131
141
 
132
142
  def each_entry
133
143
  while (entry = next_header)
144
+ next if strip_entry_components!(entry).nil?
145
+
134
146
  yield entry
135
147
  end
136
148
  end
137
149
 
138
150
  def each_entry_with_data(_size = C::DATA_BUFFER_SIZE)
139
151
  while (entry = next_header)
152
+ next if strip_entry_components!(entry).nil?
153
+
140
154
  yield entry, read_data
141
155
  end
142
156
  end
@@ -171,5 +185,57 @@ module Archive
171
185
  raise Error, @archive if C.archive_read_data_into_fd(archive, fd) != C::OK
172
186
  end
173
187
  end
188
+
189
+ private
190
+
191
+ #
192
+ # See:
193
+ # 1. https://github.com/libarchive/libarchive/blob/6a9dcf9fc429e2dc9fb08e669bf7b0bed4d5edf9/tar/read.c#L346
194
+ # 2. https://github.com/libarchive/libarchive/blob/a11f15860ae39ecdc8173243a211cdafc8ac893c/tar/util.c#L523-L535
195
+ # 3. https://github.com/libarchive/libarchive/blob/a11f15860ae39ecdc8173243a211cdafc8ac893c/tar/util.c#L554-L560
196
+ #
197
+ # @param entry [Archive::Entry]
198
+ #
199
+ # @return [Archive::Entry, nil] entry stripped or nil if entry is no longer relevant due to stripping
200
+ #
201
+ def strip_entry_components!(entry)
202
+ if strip_components > 0
203
+ name = entry.pathname
204
+ original_name = name.dup
205
+ hardlink_name = entry.hardlink
206
+ original_hardlink_name = hardlink_name.dup
207
+
208
+ strip_path_components!(name)
209
+ return if name.empty?
210
+
211
+ unless hardlink_name.nil?
212
+ strip_path_components!(hardlink_name)
213
+ return if hardlink_name.empty?
214
+ end
215
+
216
+ if name != original_name
217
+ entry.copy_pathname(name)
218
+ end
219
+ entry.copy_hardlink(hardlink_name) if hardlink_name != original_hardlink_name
220
+ end
221
+
222
+ entry
223
+ end
224
+
225
+ #
226
+ # @param path [String]
227
+ #
228
+ # @return [String]
229
+ #
230
+ def strip_path_components!(path)
231
+ if strip_components > 0
232
+ is_dir = path.end_with?("/")
233
+ updated_path = path.split("/").drop(strip_components).join("/")
234
+ updated_path = is_dir && updated_path != "" ? updated_path + "/" : updated_path
235
+ path.gsub!(path, updated_path)
236
+ else
237
+ path
238
+ end
239
+ end
174
240
  end
175
241
  end
@@ -1,3 +1,3 @@
1
1
  module Archive
2
- VERSION = "1.0.17".freeze
2
+ VERSION = "1.1.3".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-libarchive
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.17
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Bellone
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-02-10 00:00:00.000000000 Z
13
+ date: 2021-09-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ffi
@@ -26,20 +26,6 @@ dependencies:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
28
  version: '1.0'
29
- - !ruby/object:Gem::Dependency
30
- name: bundler
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: '0'
36
- type: :development
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: '0'
43
29
  description: A Ruby FFI binding to libarchive.
44
30
  email:
45
31
  - jbellone@bloomberg.net
@@ -69,7 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
69
55
  requirements:
70
56
  - - ">="
71
57
  - !ruby/object:Gem::Version
72
- version: 2.4.0
58
+ version: '2.5'
73
59
  required_rubygems_version: !ruby/object:Gem::Requirement
74
60
  requirements:
75
61
  - - ">="