ruby-xz 0.0.1

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.
Files changed (3) hide show
  1. data/README.rdoc +75 -0
  2. data/lib/xz.rb +457 -0
  3. metadata +83 -0
@@ -0,0 +1,75 @@
1
+ = ruby-xz
2
+
3
+ <b>ruby-xz</b> is a basic binding to the famous
4
+ {liblzma library}[http://tukaani.org/xz/], best known for the
5
+ extreme compression-ratio it's native +XZ+ format achieves. ruby-xz gives
6
+ you the possibility of creating and extracting XZ archives on any platform
7
+ where liblzma is installed. No compilation is needed, because ruby-xz is
8
+ written ontop of ffi[https://github.com/ffi/ffi].
9
+
10
+ == Installation
11
+
12
+ Install it the way you install all your gems.
13
+
14
+ # gem install ruby-xz
15
+
16
+ == Usage
17
+
18
+ The documentation of the XZ module is well and you should be able to find
19
+ everything you need to use ruby-xz. As said, it's not big, but powerful:
20
+ You can create and extract whole archive files, compress or decompress
21
+ streams of data or just plain strings.
22
+
23
+ === First step
24
+
25
+ You have to require ruby-xz. Note the file you have to require is named
26
+ "xz.rb", so do
27
+
28
+ require "xz"
29
+
30
+ to get it.
31
+
32
+ === Examples
33
+
34
+ #Compress a TAR archive
35
+ XZ.compress_file("myfile.tar", "myfile.tar.xz")
36
+ #Decompress it
37
+ XZ.decompress_file("myfile.tar.xz", "myfile.tar")
38
+
39
+ #Compress everything you get from a socket (note that there HAS to be a EOF
40
+ #sometime, otherwise this will run infinitely)
41
+ XZ.compress_stream(socket){|chunk| opened_file.write(chunk)}
42
+
43
+ #Compress a string
44
+ comp = XZ.compress("Mydata")
45
+ #Decompress it
46
+ data = XZ.decompress(comp)
47
+
48
+ Have a look at the XZ module's documentation for an in-depth description of
49
+ what is possible.
50
+
51
+ === License
52
+
53
+ (The MIT License)
54
+
55
+ Basic liblzma-bindings for Ruby.
56
+
57
+ Copyright © 2011 Marvin Gülker
58
+
59
+ Permission is hereby granted, free of charge, to any person obtaining a
60
+ copy of this software and associated documentation files (the ‘Software’),
61
+ to deal in the Software without restriction, including without limitation
62
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
63
+ and/or sell copies of the Software, and to permit persons to whom the Software
64
+ is furnished to do so, subject to the following conditions:
65
+
66
+ The above copyright notice and this permission notice shall be included in all
67
+ copies or substantial portions of the Software.
68
+
69
+ THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
70
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
71
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
72
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
73
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
74
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
75
+ THE SOFTWARE.
@@ -0,0 +1,457 @@
1
+ #Encoding: UTF-8
2
+ =begin (The MIT License)
3
+
4
+ Basic liblzma-bindings for Ruby.
5
+
6
+ Copyright © 2011 Marvin Gülker
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a
9
+ copy of this software and associated documentation files (the ‘Software’),
10
+ to deal in the Software without restriction, including without limitation
11
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
12
+ and/or sell copies of the Software, and to permit persons to whom the Software
13
+ is furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in all
16
+ copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ THE SOFTWARE.
25
+ =end
26
+
27
+ require "ffi"
28
+
29
+ #The namespace and main module of this library. Each method of this module
30
+ #may raise exceptions of class XZ::LZMAError, which is not named in the
31
+ #methods' documentations anymore.
32
+ module XZ
33
+
34
+ #This module wraps functions and enums used by liblzma.
35
+ module LibLZMA
36
+ extend FFI::Library
37
+
38
+ #The maximum value of an uint64_t, as defined by liblzma.
39
+ #Should be the same as
40
+ # (2 ** 64) - 1
41
+ UINT64_MAX = 18446744073709551615
42
+
43
+ #Activates extreme compression. Same as xz's "-e" commandline switch.
44
+ LZMA_PRESET_EXTREME = 1 << 31
45
+
46
+ LZMA_TELL_NO_CHECK = 0x02
47
+ LZMA_TELL_UNSUPPORTED_CHECK = 0x02
48
+ LZMA_TELL_ANY_CHECK = 0x04
49
+ LZMA_CONCATENATED = 0x08
50
+
51
+ #Placeholder enum used by liblzma for later additions.
52
+ LZMA_RESERVED_ENUM = enum :lzma_reserved_enum, 0
53
+
54
+ #Actions that can be passed to the lzma_code() function.
55
+ LZMA_ACTION = enum :lzma_run, 0,
56
+ :lzma_sync_flush,
57
+ :lzma_full_flush,
58
+ :lzma_finish
59
+
60
+ #Integrity check algorithms supported by liblzma.
61
+ LZMA_CHECK = enum :lzma_check_none, 0,
62
+ :lzma_check_crc32, 1,
63
+ :lzma_check_crc64, 4,
64
+ :lzma_check_sha256, 10
65
+
66
+ #Possible return values of liblzma functions.
67
+ LZMA_RET = enum :lzma_ok, 0,
68
+ :lzma_stream_end,
69
+ :lzma_no_check,
70
+ :lzma_unsupported_check,
71
+ :lzma_get_check,
72
+ :lzma_mem_error,
73
+ :lzma_memlimit_error,
74
+ :lzma_format_error,
75
+ :lzma_options_error,
76
+ :lzma_data_error,
77
+ :lzma_buf_error,
78
+ :lzma_prog_error
79
+
80
+ ffi_lib "liblzma"
81
+
82
+ attach_function :lzma_easy_encoder, [:pointer, :uint32, :int], :int
83
+ attach_function :lzma_code, [:pointer, :int], :int
84
+ attach_function :lzma_stream_decoder, [:pointer, :uint64, :uint32], :int
85
+ attach_function :lzma_end, [:pointer], :void
86
+
87
+ end
88
+
89
+ #The class of the error that this library raises.
90
+ class LZMAError < StandardError
91
+
92
+ #Raises an appropriate exception if +val+ isn't a liblzma success code.
93
+ def self.raise_if_necessary(val)
94
+ case val
95
+ when :lzma_mem_error then raise(self, "Couldn't allocate memory!")
96
+ when :lzma_memlimit_error then raise(self, "Decoder ran out of (allowed) memory!")
97
+ when :lzma_format_error then raise(self, "Unrecognized file format!")
98
+ when :lzma_options_error then raise(self, "Invalid options passed!")
99
+ when :lzma_data_error then raise raise(self, "Archive is currupt.")
100
+ when :lzma_buf_error then raise(self, "Buffer unusable!")
101
+ when :lzma_prog_error then raise(self, "Program error--if you're sure your code is correct, you may have found a bug in liblzma.")
102
+ end
103
+ end
104
+
105
+ end
106
+
107
+ #The main struct of the liblzma library.
108
+ class LZMAStream < FFI::Struct
109
+ layout :next_in, :pointer, #uint8
110
+ :avail_in, :size_t,
111
+ :total_in, :uint64,
112
+ :next_out, :pointer, #uint8
113
+ :avail_out, :size_t,
114
+ :total_out, :uint64,
115
+ :lzma_allocator, :pointer,
116
+ :lzma_internal, :pointer,
117
+ :reserved_ptr1, :pointer,
118
+ :reserved_ptr2, :pointer,
119
+ :reserved_ptr3, :pointer,
120
+ :reserved_ptr4, :pointer,
121
+ :reserved_int1, :uint64,
122
+ :reserved_int2, :uint64,
123
+ :reserved_int3, :size_t,
124
+ :reserved_int4, :size_t,
125
+ :reserved_enum1, :int,
126
+ :reserved_enum2, :int
127
+
128
+ #This method does basicly the same thing as the
129
+ #LZMA_STREAM_INIT macro of liblzma. Creates a new LZMAStream
130
+ #that has been initialized for usage. If any argument is passed,
131
+ #it is assumed to be a FFI::Pointer to a lzma_stream structure
132
+ #and that structure is wrapped.
133
+ def initialize(*args)
134
+ if args.empty? #Got a pointer, want to wrap it
135
+ super
136
+ else
137
+ s = super()
138
+ s[:next] = nil
139
+ s[:avail_in] = 0
140
+ s[:total_in] = 0
141
+ s[:next_out] = nil
142
+ s[:avail_out] = 0
143
+ s[:total_out] = 0
144
+ s[:lzma_allocator] = nil
145
+ s[:lzma_internal] = nil
146
+ s[:reserved_ptr1] = nil
147
+ s[:reserved_ptr2] = nil
148
+ s[:reserved_ptr3] = nil
149
+ s[:reserved_ptr4] = nil
150
+ s[:reserved_int1] = 0
151
+ s[:reserved_int2] = 0
152
+ s[:reserved_int3] = 0
153
+ s[:reserved_int4] = 0
154
+ s[:reserved_enum1] = LibLZMA::LZMA_RESERVED_ENUM[:lzma_reserved_enum]
155
+ s[:reserved_enum2] = LibLZMA::LZMA_RESERVED_ENUM[:lzma_reserved_enum]
156
+ s
157
+ end
158
+ end
159
+ end
160
+
161
+ #Number of bytes read in one chunk.
162
+ CHUNK_SIZE = 4096
163
+ #The version of this library.
164
+ VERSION = "0.0.1".freeze
165
+
166
+ class << self
167
+
168
+ #call-seq:
169
+ # decompress_stream(io [, memory_limit [, flags ] ] ) → a_string
170
+ # decompress_stream(io [, memory_limit [, flags ] ] ){|chunk| ... } → an_integer
171
+ # decode_stream(io [, memory_limit [, flags ] ] ) → a_string
172
+ # decode_stream(io [, memory_limit [, flags ] ] ){|chunk| ... } → an_integer
173
+ #
174
+ #Decompresses a stream containing XZ-compressed data.
175
+ #===Parameters
176
+ #[io] The IO to read from. It must be opened for reading.
177
+ #[memory_limit] (+UINT64_MAX+) If not XZ::LibLZMA::UINT64_MAX, makes liblzma
178
+ # use no more memory than +memory_limit+ bytes.
179
+ #[flags] (<tt>[:tell_unsupported_check]</tt>) Additional flags
180
+ # passed to liblzma (an array). Possible flags are:
181
+ # [:tell_no_check] Spit out a warning if the archive hasn't an
182
+ # itnegrity checksum.
183
+ # [:tell_unsupported_check] Spit out a warning if the archive
184
+ # has an unsupported checksum type.
185
+ # [:concatenated] Decompress concatenated archives.
186
+ #[chunk] (Block argument) One piece of decompressed data.
187
+ #===Return value
188
+ #If a block was given, returns the number of bytes written. Otherwise,
189
+ #returns the decompressed data as a BINARY-encoded string.
190
+ #===Example
191
+ # data = File.open("archive.xz", "rb"){|f| f.read}
192
+ # io = StringIO.new(data)
193
+ # XZ.decompress_stream(io) #=> "I AM THE DATA"
194
+ # io.rewind
195
+ # str = ""
196
+ # XZ.decompress_stream(io, XZ::LibLZMA::UINT64_MAX, [:tell_no_check]){|c| str << c} #=> 13
197
+ # str #=> "I AM THE DATA"
198
+ #===Remarks
199
+ #The block form is *much* better on memory usage, because it doesn't have
200
+ #to load everything into RAM at once. If you don't know how big your
201
+ #data gets or if you want to decompress much data, use the block form. Of
202
+ #course you shouldn't store the data your read in RAM then as in the
203
+ #example above.
204
+ def decompress_stream(io, memory_limit = LibLZMA::UINT64_MAX, flags = [:tell_unsupported_check], &block)
205
+ raise(ArgumentError, "Invalid memory limit set!") unless (0..LibLZMA::UINT64_MAX).include?(memory_limit)
206
+ flags.each do |flag|
207
+ raise(ArgumentError, "Unknown flag #{flag}!") unless [:tell_no_check, :tell_unsupported_check, :tell_any_check, :concatenated].include?(flag)
208
+ end
209
+
210
+ stream = LZMAStream.new
211
+ res = LibLZMA.lzma_stream_decoder(
212
+ stream.pointer,
213
+ memory_limit,
214
+ flags.inject(0){|val, flag| val | LibLZMA.const_get(:"LZMA_#{flag.upcase}")}
215
+ )
216
+
217
+ LZMAError.raise_if_necessary(res)
218
+
219
+ res = ""
220
+ if block_given?
221
+ res = lzma_code(io, stream, &block)
222
+ else
223
+ lzma_code(io, stream){|chunk| res << chunk}
224
+ end
225
+
226
+ LibLZMA.lzma_end(stream.pointer)
227
+
228
+ block_given? ? stream[:total_out] : res
229
+ end
230
+ alias decode_stream decompress_stream
231
+
232
+ #call-seq:
233
+ # compress_stream(io [, compression_level [, check [, extreme ] ] ] ) → a_string
234
+ # compress_stream(io [, compression_level [, check [, extreme ] ] ] ){|chunk| ... } → an_integer
235
+ # encode_stream(io [, compression_level [, check [, extreme ] ] ] ) → a_string
236
+ # encode_stream(io [, compression_level [, check [, extreme ] ] ] ){|chunk| ... } → an_integer
237
+ #
238
+ #Compresses a stream of data into XZ-compressed data.
239
+ #===Parameters
240
+ #[io] The IO to read the data from. Must be opened for
241
+ # reading.
242
+ #[compression_level] (6) Compression strength. Higher values indicate a
243
+ # smaller result, but longer compression time. Maximum
244
+ # is 9.
245
+ #[check] (:crc64) The checksum algorithm to use for verifying
246
+ # the data inside the archive. Possible values are:
247
+ # * :none
248
+ # * :crc32
249
+ # * :crc64
250
+ # * :sha256
251
+ #[extreme] (false) Tries to get the last bit out of the
252
+ # compression. This may succeed, but you can end
253
+ # up with *very* long computation times.
254
+ #[chunk] (Block argument) One piece of compressed data.
255
+ #===Return value
256
+ #If a block was given, returns the number of bytes written. Otherwise,
257
+ #returns the compressed data as a BINARY-encoded string.
258
+ #===Example
259
+ # data = File.read("file.txt")
260
+ # i = StringIO.new(data)
261
+ # XZ.compress_stream(i) #=> Some binary blob
262
+ # i.rewind
263
+ # str = ""
264
+ # XZ.compress_stream(i, 4, :sha256){|c| str << c} #=> 123
265
+ # str #=> Some binary blob
266
+ #===Remarks
267
+ #The block form is *much* better on memory usage, because it doesn't have
268
+ #to load everything into RAM at once. If you don't know how big your
269
+ #data gets or if you want to compress much data, use the block form. Of
270
+ #course you shouldn't store the data your read in RAM then as in the
271
+ #example above.
272
+ def compress_stream(io, compression_level = 6, check = :crc64, extreme = false, &block)
273
+ raise(ArgumentError, "Invalid compression level!") unless (0..9).include?(compression_level)
274
+ raise(ArgumentError, "Invalid checksum specified!") unless [:none, :crc32, :crc64, :sha256].include?(check)
275
+
276
+ stream = LZMAStream.new
277
+ res = LibLZMA.lzma_easy_encoder(
278
+ stream.pointer,
279
+ compression_level | (extreme ? LibLZMA::LZMA_PRESET_EXTREME : 0),
280
+ LibLZMA::LZMA_CHECK[:"lzma_check_#{check}"]
281
+ )
282
+
283
+ LZMAError.raise_if_necessary(res)
284
+
285
+ res = ""
286
+ if block_given?
287
+ res = lzma_code(io, stream, &block)
288
+ else
289
+ lzma_code(io, stream){|chunk| res << chunk}
290
+ end
291
+
292
+ LibLZMA.lzma_end(stream.pointer)
293
+
294
+ block_given? ? stream[:total_out] : res
295
+ end
296
+ alias encode_stream compress_stream
297
+
298
+ #Compresses +in_file+ and writes the result to +out_file+.
299
+ #===Parameters
300
+ #[in_file] The path to the file to read from.
301
+ #[out_file] The path of the file to write to. If it exists, it will be
302
+ # overwritten.
303
+ #For the other parameters, see the compress_stream method.
304
+ #===Return value
305
+ #The number of bytes written, i.e. the size of the archive.
306
+ #===Example
307
+ # XZ.compress("myfile.txt", "myfile.txt.xz")
308
+ # XZ.compress("myarchive.tar", "myarchive.tar.xz")
309
+ #===Remarks
310
+ #This method is safe to use with big files, because files are not loaded
311
+ #into memory completely at once.
312
+ def compress_file(in_file, out_file, compression_level = 6, check = :crc64, extreme = false)
313
+ File.open(in_file, "rb") do |i_file|
314
+ File.open(out_file, "wb") do |o_file|
315
+ compress_stream(i_file, compression_level, check, extreme) do |chunk|
316
+ o_file.write(chunk)
317
+ end
318
+ end
319
+ end
320
+ end
321
+
322
+ #Compresses arbitrary data using the XZ algorithm.
323
+ #===Parameters
324
+ #[str] The data to compress.
325
+ #For the other parameters, see the compress_stream method.
326
+ #===Return value
327
+ #The compressed data as a BINARY-encoded string.
328
+ #===Example
329
+ # data = "I love Ruby"
330
+ # comp = XZ.compress(data) #=> binary blob
331
+ #===Remarks
332
+ #Don't use this method for big amounts of data--you may run out of
333
+ #memory. Use compress_file or compress_stream instead.
334
+ def compress(str, compression_level = 6, check = :crc64, extreme = false)
335
+ raise(NotImplementedError, "StringIO isn't available!") unless defined? StringIO
336
+ s = StringIO.new(str)
337
+ compress_stream(s, compression_level, check, extreme)
338
+ end
339
+
340
+ #Decompresses data in XZ format.
341
+ #===Parameters
342
+ #[str] The data to decompress.
343
+ #For the other parameters, see the decompress_stream method.
344
+ #===Return value
345
+ #The decompressed data as a BINARY-encoded string.
346
+ #===Example
347
+ # comp = File.open("data.xz", "rb"){|f| f.read}
348
+ # data = XZ.decompress(comp) #=> "I love Ruby"
349
+ #===Remarks
350
+ #Don't use this method for big amounts of data--you may run out of
351
+ #memory. Use decompress_file or decompress_stream instead.
352
+ def decompress(str, memory_limit = LibLZMA::UINT64_MAX, flags = [:tell_unsupported_check])
353
+ raise(NotImplementedError, "StringIO isn't available!") unless defined? StringIO
354
+ s = StringIO.new(str)
355
+ decompress_stream(s, memory_limit, flags)
356
+ end
357
+
358
+ #Decompresses +in_file+ and writes the result to +out_file+.
359
+ #===Parameters
360
+ #[in_file] The path to the file to read from.
361
+ #[out_file] The path of the file to write to. If it exists, it will
362
+ # be overwritten.
363
+ #For the other parameters, see the decompress_stream method.
364
+ #===Return value
365
+ #The number of bytes written, i.e. the size of the uncompressed data.
366
+ #===Example
367
+ # XZ.decompres("myfile.txt.xz", "myfile.txt")
368
+ # XZ.decompress("myarchive.tar.xz", "myarchive.tar")
369
+ #===Remarks
370
+ #This method is safe to use with big files, because files are not loaded
371
+ #into memory completely at once.
372
+ def decompress_file(in_file, out_file, memory_limit = LibLZMA::UINT64_MAX, flags = [:tell_unsupported_check])
373
+ File.open(in_file, "rb") do |i_file|
374
+ File.open(out_file, "wb") do |o_file|
375
+ decompress_stream(i_file, memory_limit, flags) do |chunk|
376
+ o_file.write(chunk)
377
+ end
378
+ end
379
+ end
380
+ end
381
+
382
+ private
383
+
384
+ #This method returns the size of +str+ in bytes.
385
+ def binary_size(str)
386
+ #Believe it or not, but this is faster than str.bytes.to_a.size.
387
+ #I benchmarked it, and it is as twice as fast.
388
+ str.dup.force_encoding("BINARY").size
389
+ end
390
+
391
+ #This method does the heavy work of (de-)compressing a stream. It takes
392
+ #an IO object to read data from (that means the IO must be opened
393
+ #for reading) and a XZ::LZMAStream object that is used to (de-)compress
394
+ #the data. Furthermore this method takes a block which gets passed
395
+ #the (de-)compressed data in chunks one at a time--this is needed to allow
396
+ #(de-)compressing of very large files that can't be loaded fully into
397
+ #memory.
398
+ def lzma_code(io, stream)
399
+ input_buffer_p = FFI::MemoryPointer.new(CHUNK_SIZE)
400
+ output_buffer_p = FFI::MemoryPointer.new(CHUNK_SIZE)
401
+
402
+ while str = io.read(CHUNK_SIZE)
403
+ input_buffer_p.write_string(str)
404
+
405
+ #Set the data for compressing
406
+ stream[:next_in] = input_buffer_p
407
+ stream[:avail_in] = binary_size(str)
408
+
409
+ #Now loop until we gathered all the data in stream[:next_out]. Depending on the
410
+ #amount of data, this may not fit into the buffer, meaning that we have to
411
+ #provide a pointer to a "new" buffer that liblzma can write into. Since
412
+ #liblzma already set stream[:avail_in] to 0 in the first iteration, the extra call to the
413
+ #lzma_code() function doesn't hurt (indeed the pipe_comp example from
414
+ #liblzma handles it this way too). Sometimes it happens that the compressed data
415
+ #is bigger than the original (notably when the amount of data to compress
416
+ #is small)
417
+ loop do
418
+ #Prepare for getting the compressed_data
419
+ stream[:next_out] = output_buffer_p
420
+ stream[:avail_out] = CHUNK_SIZE
421
+
422
+ #Compress the data
423
+ res = if io.eof?
424
+ LibLZMA.lzma_code(stream.pointer, LibLZMA::LZMA_ACTION[:lzma_finish])
425
+ else
426
+ LibLZMA.lzma_code(stream.pointer, LibLZMA::LZMA_ACTION[:lzma_run])
427
+ end
428
+ check_lzma_code_retval(res)
429
+
430
+ #Write the compressed data
431
+ data = output_buffer_p.read_string(CHUNK_SIZE - stream[:avail_out])
432
+ yield(data)
433
+
434
+ #If the buffer is completely filled, it's likely that there is
435
+ #more data liblzma wants to hand to us. Start a new iteration,
436
+ #but don't provide new input data.
437
+ break unless stream[:avail_out] == 0
438
+ end #loop
439
+ end #while
440
+ end #lzma_code
441
+
442
+ #Checks for errors and warnings that can be derived from the return
443
+ #value of the lzma_code() function and shows them if necessary.
444
+ def check_lzma_code_retval(code)
445
+ e = LibLZMA::LZMA_RET
446
+ case code
447
+ when e[:lzma_no_check] then warn("Couldn't verify archive integrity--archive has not integrity checksum.")
448
+ when e[:lzma_unsupported_check] then warn("Couldn't verify archive integrity--archive has an unsupported integrity checksum.")
449
+ when e[:lzma_get_check] then nil #This isn't useful for us. It indicates that the checksum type is now known.
450
+ else
451
+ LZMAError.raise_if_necessary(code)
452
+ end
453
+ end
454
+
455
+ end #class << self
456
+
457
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-xz
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Marvin Gülker
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-03-16 00:00:00.000000000 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ffi
17
+ requirement: &15267800 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *15267800
26
+ - !ruby/object:Gem::Dependency
27
+ name: hanna-nouveau
28
+ requirement: &15267300 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *15267300
37
+ description: ! 'This is a basic binding for liblzma that allows you to
38
+
39
+ create and extract XZ-compressed archives. It can cope with big
40
+
41
+ files as well as small ones, but doesn''t offer much
42
+
43
+ of the possibilities liblzma itself has.
44
+
45
+ '
46
+ email: sutniuq@gmx.net
47
+ executables: []
48
+ extensions: []
49
+ extra_rdoc_files:
50
+ - README.rdoc
51
+ files:
52
+ - lib/xz.rb
53
+ - README.rdoc
54
+ has_rdoc: true
55
+ homepage:
56
+ licenses: []
57
+ post_install_message:
58
+ rdoc_options:
59
+ - -t
60
+ - ruby-xz RDocs
61
+ - -m
62
+ - README.rdoc
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '1.9'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubyforge_project:
79
+ rubygems_version: 1.6.2
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: XZ compression via liblzma for Ruby.
83
+ test_files: []