aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormpeterv <mpeterval@gmail.com>2016-02-19 11:16:35 +0300
committermpeterv <mpeterval@gmail.com>2016-02-19 11:17:30 +0300
commitc2bad31e7fea154c3fdee453b2d774f48b422be8 (patch)
tree94e7f0de1571446fcafe728fe20a9682dc850699 /src
parent204d6cc98fb275865c28653b6eed57060e84255e (diff)
downloadluarocks-c2bad31e7fea154c3fdee453b2d774f48b422be8.tar.gz
luarocks-c2bad31e7fea154c3fdee453b2d774f48b422be8.tar.bz2
luarocks-c2bad31e7fea154c3fdee453b2d774f48b422be8.zip
Compatibility with lua-zlib
Diffstat (limited to 'src')
-rw-r--r--src/luarocks/tools/zip.lua56
1 files changed, 36 insertions, 20 deletions
diff --git a/src/luarocks/tools/zip.lua b/src/luarocks/tools/zip.lua
index 101cae82..e6d9e36a 100644
--- a/src/luarocks/tools/zip.lua
+++ b/src/luarocks/tools/zip.lua
@@ -1,13 +1,35 @@
1 1
2--- A Lua implementation of .zip file archiving (used for creating .rock files), 2--- A Lua implementation of .zip file archiving (used for creating .rock files),
3-- using only lzlib. 3-- using only lzlib or lua-lzib.
4--module("luarocks.tools.zip", package.seeall)
5local zip = {} 4local zip = {}
6 5
7local zlib = require("zlib") 6local zlib = require("zlib")
8local fs = require("luarocks.fs") 7local fs = require("luarocks.fs")
9local dir = require("luarocks.dir") 8local dir = require("luarocks.dir")
10 9
10-- zlib module can be provided by both lzlib and lua-lzib packages.
11-- Create a compatibility layer.
12local zlib_compress, zlib_crc32
13if zlib._VERSION:match "^lua%-zlib" then
14 function zlib_compress(data)
15 return (zlib.deflate()(data, "finish"))
16 end
17
18 function zlib_crc32(data)
19 return zlib.crc32()(data)
20 end
21elseif zlib._VERSION:match "^lzlib" then
22 function zlib_compress(data)
23 return zlib.compress(data)
24 end
25
26 function zlib_crc32(data)
27 return zlib.crc32(zlib.crc32(), data)
28 end
29else
30 error("unknown zlib library", 0)
31end
32
11local function number_to_bytestring(number, nbytes) 33local function number_to_bytestring(number, nbytes)
12 local out = {} 34 local out = {}
13 for _ = 1, nbytes do 35 for _ = 1, nbytes do
@@ -31,32 +53,28 @@ local function zipwriter_open_new_file_in_zip(self, filename)
31 self.local_file_header = lfh 53 self.local_file_header = lfh
32 lfh.last_mod_file_time = 0 -- TODO 54 lfh.last_mod_file_time = 0 -- TODO
33 lfh.last_mod_file_date = 0 -- TODO 55 lfh.last_mod_file_date = 0 -- TODO
34 lfh.crc32 = 0 -- initial value
35 lfh.compressed_size = 0 -- unknown yet
36 lfh.uncompressed_size = 0 -- unknown yet
37 lfh.file_name_length = #filename 56 lfh.file_name_length = #filename
38 lfh.extra_field_length = 0 57 lfh.extra_field_length = 0
39 lfh.file_name = filename:gsub("\\", "/") 58 lfh.file_name = filename:gsub("\\", "/")
40 lfh.external_attr = 0 -- TODO properly store permissions 59 lfh.external_attr = 0 -- TODO properly store permissions
41 self.in_open_file = true 60 self.in_open_file = true
42 self.data = {}
43 return true 61 return true
44end 62end
45 63
46--- Write data to the file currently being stored in the zipfile. 64--- Write data to the file currently being stored in the zipfile.
47-- @param self handle of the zipfile being written. 65-- @param self handle of the zipfile being written.
48-- @param buf string containing data to be written. 66-- @param data string containing full contents of the file.
49-- @return true if succeeded, nil in case of failure. 67-- @return true if succeeded, nil in case of failure.
50local function zipwriter_write_file_in_zip(self, buf) 68local function zipwriter_write_file_in_zip(self, data)
51 if not self.in_open_file then 69 if not self.in_open_file then
52 return nil 70 return nil
53 end 71 end
54 local lfh = self.local_file_header 72 local lfh = self.local_file_header
55 local cbuf = zlib.compress(buf):sub(3, -5) 73 local compressed = zlib_compress(data):sub(3, -5)
56 lfh.crc32 = zlib.crc32(lfh.crc32, buf) 74 lfh.crc32 = zlib_crc32(data)
57 lfh.compressed_size = lfh.compressed_size + #cbuf 75 lfh.compressed_size = #compressed
58 lfh.uncompressed_size = lfh.uncompressed_size + #buf 76 lfh.uncompressed_size = #data
59 table.insert(self.data, cbuf) 77 self.data = compressed
60 return true 78 return true
61end 79end
62 80
@@ -86,10 +104,8 @@ local function zipwriter_close_file_in_zip(self)
86 zh:write(number_to_bytestring(lfh.extra_field_length, 2)) 104 zh:write(number_to_bytestring(lfh.extra_field_length, 2))
87 zh:write(lfh.file_name) 105 zh:write(lfh.file_name)
88 106
89 -- File data 107 -- File data
90 for _, cbuf in ipairs(self.data) do 108 zh:write(self.data)
91 zh:write(cbuf)
92 end
93 109
94 -- Data descriptor 110 -- Data descriptor
95 zh:write(number_to_bytestring(lfh.crc32, 4)) 111 zh:write(number_to_bytestring(lfh.crc32, 4))
@@ -117,12 +133,12 @@ local function zipwriter_add(self, file)
117 end 133 end
118 end 134 end
119 if ok then 135 if ok then
120 local buf = fin:read("*a") 136 local data = fin:read("*a")
121 if not buf then 137 if not data then
122 err = "error reading "..file 138 err = "error reading "..file
123 ok = false 139 ok = false
124 else 140 else
125 ok = self:write_file_in_zip(buf) 141 ok = self:write_file_in_zip(data)
126 if not ok then 142 if not ok then
127 err = "error in writing "..file.." in the zipfile" 143 err = "error in writing "..file.." in the zipfile"
128 end 144 end