package building infrastructure
This commit is contained in:
parent
d1f166425b
commit
9e4464e2fa
5
buildall.sh
Executable file
5
buildall.sh
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
for dir in $(find -maxdepth 1 -not -path '*/\.*' -not -path '\.' -type d); do
|
||||||
|
echo lua makepkg.lua "$dir" "$1" "$(git rev-parse --short HEAD)"
|
||||||
|
lua makepkg.lua "$dir" "$1" "$(git rev-parse --short HEAD)"
|
||||||
|
done
|
123
lzss.lua
Normal file
123
lzss.lua
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
--[[----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
LZSS - encoder / decoder
|
||||||
|
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
|
|
||||||
|
--]]----------------------------------------------------------------------------
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local M = {}
|
||||||
|
local string, table = string, table
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local POS_BITS = 12
|
||||||
|
local LEN_BITS = 16 - POS_BITS
|
||||||
|
local POS_SIZE = 1 << POS_BITS
|
||||||
|
local LEN_SIZE = 1 << LEN_BITS
|
||||||
|
local LEN_MIN = 3
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
function M.compress(input)
|
||||||
|
local offset, output = 1, {}
|
||||||
|
local window = ''
|
||||||
|
|
||||||
|
local function search()
|
||||||
|
for i = LEN_SIZE + LEN_MIN - 1, LEN_MIN, -1 do
|
||||||
|
local str = string.sub(input, offset, offset + i - 1)
|
||||||
|
local pos = string.find(window, str, 1, true)
|
||||||
|
if pos then
|
||||||
|
return pos, str
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
while offset <= #input do
|
||||||
|
local flags, buffer = 0, {}
|
||||||
|
|
||||||
|
for i = 0, 7 do
|
||||||
|
if offset <= #input then
|
||||||
|
local pos, str = search()
|
||||||
|
if pos and #str >= LEN_MIN then
|
||||||
|
local tmp = ((pos - 1) << LEN_BITS) | (#str - LEN_MIN)
|
||||||
|
buffer[#buffer + 1] = string.pack('>I2', tmp)
|
||||||
|
else
|
||||||
|
flags = flags | (1 << i)
|
||||||
|
str = string.sub(input, offset, offset)
|
||||||
|
buffer[#buffer + 1] = str
|
||||||
|
end
|
||||||
|
window = string.sub(window .. str, -POS_SIZE)
|
||||||
|
offset = offset + #str
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if #buffer > 0 then
|
||||||
|
output[#output + 1] = string.char(flags)
|
||||||
|
output[#output + 1] = table.concat(buffer)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(output)
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
function M.decompress(input)
|
||||||
|
local offset, output = 1, {}
|
||||||
|
local window = ''
|
||||||
|
|
||||||
|
while offset <= #input do
|
||||||
|
local flags = string.byte(input, offset)
|
||||||
|
offset = offset + 1
|
||||||
|
|
||||||
|
for i = 1, 8 do
|
||||||
|
local str = nil
|
||||||
|
if (flags & 1) ~= 0 then
|
||||||
|
if offset <= #input then
|
||||||
|
str = string.sub(input, offset, offset)
|
||||||
|
offset = offset + 1
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if offset + 1 <= #input then
|
||||||
|
local tmp = string.unpack('>I2', input, offset)
|
||||||
|
offset = offset + 2
|
||||||
|
local pos = (tmp >> LEN_BITS) + 1
|
||||||
|
local len = (tmp & (LEN_SIZE - 1)) + LEN_MIN
|
||||||
|
str = string.sub(window, pos, pos + len - 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
flags = flags >> 1
|
||||||
|
if str then
|
||||||
|
output[#output + 1] = str
|
||||||
|
window = string.sub(window .. str, -POS_SIZE)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(output)
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
97
makepkg.lua
Normal file
97
makepkg.lua
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
local serial = require "serialization"
|
||||||
|
local w, lzss = pcall(require,"lzss")
|
||||||
|
if not w then lzss = nil end
|
||||||
|
local tArgs = {...}
|
||||||
|
local fsnames = {"lfs","luafilesystem","filesystem"}
|
||||||
|
local w, fs
|
||||||
|
for k,v in pairs(fsnames) do
|
||||||
|
w,fs = pcall(require,v)
|
||||||
|
if w then break end
|
||||||
|
end
|
||||||
|
if not w then error("luafilesystem not detected") end
|
||||||
|
|
||||||
|
local function cint(n,l)
|
||||||
|
local t={}
|
||||||
|
for i = 0, 7 do
|
||||||
|
t[i+1] = (n >> (i * 8)) & 0xFF
|
||||||
|
end
|
||||||
|
return string.reverse(string.char(table.unpack(t)):sub(1,l))
|
||||||
|
end
|
||||||
|
|
||||||
|
local function genHeader(fname,len)
|
||||||
|
return string.format("%s%s%s",cint(fname:len(),2),fname,cint(len,2))
|
||||||
|
end
|
||||||
|
|
||||||
|
local function fnormalize(path)
|
||||||
|
local rt = {}
|
||||||
|
for segment in path:gmatch("[^/]+") do
|
||||||
|
if segment ~= "." and segment ~= ".." then
|
||||||
|
rt[#rt+1] = segment
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return table.concat(rt,"/")
|
||||||
|
end
|
||||||
|
|
||||||
|
local dirs, files = {tArgs[1]},{}
|
||||||
|
for _,dir in ipairs(dirs) do
|
||||||
|
for file in fs.dir(dir) do
|
||||||
|
if file == "." or file == ".." then
|
||||||
|
elseif fs.attributes(dir.."/"..file).mode == "directory" then
|
||||||
|
dirs[#dirs+1] = dir.."/"..file
|
||||||
|
elseif file ~= "package.cfg" then
|
||||||
|
files[#files+1] = dir.."/"..file
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local f = io.open(tArgs[1].."/package.cfg","rb")
|
||||||
|
if not f then error("no package.cfg in source") end
|
||||||
|
local pkginfo = serial.unserialize(f:read("*a"))
|
||||||
|
f:close()
|
||||||
|
|
||||||
|
local outpath = tArgs[2].."/"..tArgs[1]..".mtar"
|
||||||
|
|
||||||
|
local of = io.open(outpath,"wb")
|
||||||
|
for k,v in ipairs(files) do
|
||||||
|
local f = io.open(v,"rb")
|
||||||
|
if f then
|
||||||
|
local content = f:read("*a")
|
||||||
|
f:close()
|
||||||
|
of:write(genHeader(fnormalize(v:sub(tArgs[1]:len()+1)),content:len()))
|
||||||
|
of:write(content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
of:write(string.char(0):rep(2))
|
||||||
|
of:close()
|
||||||
|
|
||||||
|
if lzss then
|
||||||
|
print("Compressing "..outpath.." to "..outpath..".lss")
|
||||||
|
local f = io.open(outpath,"rb")
|
||||||
|
local of = io.open(outpath..".lss","wb")
|
||||||
|
while true do
|
||||||
|
local b = f:read(4096)
|
||||||
|
if not b or b:len() < 1 then break end
|
||||||
|
b = lzss.compress(b)
|
||||||
|
of:write(b)
|
||||||
|
end
|
||||||
|
f:close()
|
||||||
|
of:close()
|
||||||
|
outpath = outpath .. ".lss"
|
||||||
|
pkginfo.compressed = true
|
||||||
|
end
|
||||||
|
pkginfo.filename = fnormalize(outpath:sub(tArgs[2]:len()+1))
|
||||||
|
pkginfo.version = tArgs[3]
|
||||||
|
|
||||||
|
local repo = {}
|
||||||
|
local f = io.open(tArgs[2].."/packages.cfg","rb")
|
||||||
|
if f then
|
||||||
|
repo = serial.unserialize(f:read("*a")) or {}
|
||||||
|
f:close()
|
||||||
|
end
|
||||||
|
repo[tArgs[1]] = pkginfo
|
||||||
|
|
||||||
|
local f = io.open(tArgs[2].."/packages.cfg","wb")
|
||||||
|
if f then
|
||||||
|
f:write(serial.serialize(repo))
|
||||||
|
f:close()
|
||||||
|
end
|
50
serialization.lua
Normal file
50
serialization.lua
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
local serial = {}
|
||||||
|
local local_pairs=function(tbl)
|
||||||
|
local mt=getmetatable(tbl)
|
||||||
|
return (mt and mt.__pairs or pairs)(tbl)
|
||||||
|
end
|
||||||
|
function serial.serialize(value,af) -- boolean -- string -- serialize *value* into a string. If *af* is true, allow functions. This breaks unserialization.
|
||||||
|
local kw={["and"]=true,["break"]=true,["do"]=true,["else"]=true,["elseif"]=true,["end"]=true,["false"]=true,["for"]=true,["function"]=true,["goto"]=true,["if"]=true,["in"]=true,["local"]=true,["nil"]=true,["not"]=true,["or"]=true,["repeat"]=true,["return"]=true,["then"]=true,["true"]=true,["until"]=true,["while"]=true}
|
||||||
|
local id="^[%a_][%w_]*$"
|
||||||
|
local ts={}
|
||||||
|
local function s(v,l)
|
||||||
|
local t=type(v)
|
||||||
|
if t=="nil" then return "nil"
|
||||||
|
elseif t=="boolean" then return v and "true" or "false"
|
||||||
|
elseif t=="number" then
|
||||||
|
if v~=v then return "0/0"
|
||||||
|
elseif v==math.huge then return "math.huge"
|
||||||
|
elseif v==-math.huge then return "-math.huge"
|
||||||
|
else return tostring(v) end
|
||||||
|
elseif t=="string" then return string.format("%q",v):gsub("\\\n","\\n")
|
||||||
|
elseif t=="table" then
|
||||||
|
if ts[v] then error("tcyc") end
|
||||||
|
ts[v]=true
|
||||||
|
local i,r=1, nil
|
||||||
|
local f=table.pack(local_pairs(v))
|
||||||
|
for k,v in table.unpack(f) do
|
||||||
|
if r then r=r..","..(("\n"..string.rep(" ",l)) or "")
|
||||||
|
else r="{" end
|
||||||
|
local tk=type(k)
|
||||||
|
if tk=="number" and k==i then
|
||||||
|
i=i+1
|
||||||
|
r=r..s(v,l+1)
|
||||||
|
else
|
||||||
|
if tk == "string" and not kw[k] and string.match(k,id) then r=r..k
|
||||||
|
else r=r.."["..s(k,l+1).."]" end
|
||||||
|
r=r.."="..s(v,l+1) end end
|
||||||
|
ts[v]=nil
|
||||||
|
return (r or "{").."}"
|
||||||
|
elseif t=="function" and af then
|
||||||
|
return tostring(v)
|
||||||
|
else error("ut "..t) end end
|
||||||
|
return s(value, 1)
|
||||||
|
end
|
||||||
|
function serial.unserialize(data) -- string -- -- return *data*, but unserialized
|
||||||
|
local result, reason = load("return " .. data, "=data", _, {math={huge=math.huge}})
|
||||||
|
if not result then return nil, reason end
|
||||||
|
local ok, output = pcall(result)
|
||||||
|
if not ok then return nil, output end
|
||||||
|
return output
|
||||||
|
end
|
||||||
|
return serial
|
Loading…
Reference in New Issue
Block a user