mirror of
https://gitlab.alpinelinux.org/alpine/abuild.git
synced 2024-12-23 07:22:53 +00:00
f654134675
build-list will list which aports that has missing packages rebuild-list will list which aports that has outdated packages, i.e. when APKBUILD is newer than the apk
189 lines
3.6 KiB
Lua
Executable File
189 lines
3.6 KiB
Lua
Executable File
#!/usr/bin/lua
|
|
|
|
require("aports")
|
|
require("lfs")
|
|
|
|
local db
|
|
|
|
local function build_is_outdated(pkg)
|
|
local apk_attr = lfs.attributes(aports.get_apk_file_path(pkg))
|
|
local apkbuild_attr = lfs.attributes(pkg.dir.."/APKBUILD")
|
|
if apk_attr == nil then
|
|
return true
|
|
end
|
|
return os.difftime(apk_attr.modification, apkbuild_attr.modification) < 0
|
|
end
|
|
|
|
local function build_is_missing(pkg)
|
|
return lfs.attributes(aports.get_apk_file_path(pkg)) == nil
|
|
end
|
|
|
|
-- subcommands -----------------------
|
|
subcmd = {}
|
|
subcmd.revdep = {
|
|
desc = "Print reverse dependencies",
|
|
usage = "PKG...",
|
|
run = function(opts)
|
|
local i
|
|
for i = 1, #opts do
|
|
db:foreach_revdep(opts[i], function (k,p)
|
|
print(p.pkgname)
|
|
end)
|
|
end
|
|
end
|
|
}
|
|
|
|
subcmd.list = {
|
|
desc = "Print all packages built from aports tree",
|
|
usage = "",
|
|
run = function()
|
|
db:foreach(function (k)
|
|
print(k)
|
|
end)
|
|
end
|
|
}
|
|
|
|
subcmd.recursdeps = {
|
|
desc = "Recursively print all make dependencies for given packages",
|
|
usage = "PKG...",
|
|
run = function (opts)
|
|
for i = 1, #opts do
|
|
db:recurs_until(opts[i], function(pn)
|
|
print(pn)
|
|
end)
|
|
end
|
|
end
|
|
}
|
|
|
|
subcmd.builddirs = {
|
|
desc = "Print the build dirs for given packages in build order",
|
|
usage = "PKG...",
|
|
run = function(opts)
|
|
local i, p, _
|
|
local visited = {}
|
|
local to_print = {}
|
|
for i = 1, #opts do
|
|
db:foreach_pkg(opts[i], function(_, p)
|
|
to_print[p.dir] = true
|
|
end)
|
|
end
|
|
for i = 1, #opts do
|
|
db:recurs_until(opts[i], function(pn)
|
|
local j,p
|
|
db:foreach_pkg(pn, function(j, p)
|
|
if to_print[p.dir] then
|
|
print(p.dir)
|
|
to_print[p.dir] = nil
|
|
end
|
|
end)
|
|
end)
|
|
end
|
|
end
|
|
}
|
|
|
|
subcmd.sources = {
|
|
desc = "List sources",
|
|
usage = "PKG...",
|
|
run = function(opts)
|
|
local i, p, _
|
|
for i = 1, #opts do
|
|
db:foreach_pkg(opts[i], function(_, p)
|
|
aports.foreach_remote_source(p, function(url)
|
|
print(p.pkgname, p.pkgver, string.gsub(url, p.pkgver, "$VERSION"))
|
|
end)
|
|
end)
|
|
end
|
|
end
|
|
}
|
|
|
|
subcmd["rebuild-list"] = {
|
|
desc = "List packages that can/should be rebuilt",
|
|
usage = "",
|
|
run = function()
|
|
local outdated = {}
|
|
db:foreach(function(k)
|
|
db:foreach_pkg(k, function(_, p)
|
|
if build_is_outdated(p) then
|
|
table.insert(outdated, p.pkgname)
|
|
end
|
|
end)
|
|
end)
|
|
-- print build dirs in build sort order
|
|
subcmd.builddirs.run(outdated)
|
|
end
|
|
}
|
|
|
|
subcmd["build-list"] = {
|
|
desc = "List packages that is not built",
|
|
usage = "",
|
|
run = function()
|
|
local missing = {}
|
|
db:foreach(function(k)
|
|
db:foreach_pkg(k, function(_, p)
|
|
if build_is_missing(p) then
|
|
table.insert(missing, p.pkgname)
|
|
end
|
|
end)
|
|
end)
|
|
-- print build dirs in build sort order
|
|
subcmd.builddirs.run(missing)
|
|
end
|
|
}
|
|
|
|
function print_usage()
|
|
io.write("usage: ap -d <DIR> SUBCOMMAND [options]\n\nSubcommands are:\n")
|
|
local k,v
|
|
for k in pairs(subcmd) do
|
|
print(" "..k)
|
|
end
|
|
end
|
|
|
|
-- those should be read from some config file
|
|
repodirs = {}
|
|
|
|
|
|
-- parse args
|
|
i = 1
|
|
opts = {}
|
|
help = false
|
|
while i <= #arg do
|
|
if arg[i] == "-d" then
|
|
i = i + 1
|
|
repodirs[#repodirs + 1] = arg[i]
|
|
elseif arg[i] == "-h" then
|
|
help = true
|
|
else
|
|
opts[#opts + 1] = arg[i]
|
|
end
|
|
i = i + 1
|
|
end
|
|
|
|
|
|
cmd = table.remove(opts, 1)
|
|
|
|
if cmd == nil then
|
|
print_usage()
|
|
-- usage
|
|
return
|
|
end
|
|
|
|
if #repodirs == 0 then
|
|
if lfs.attributes("APKBUILD") then
|
|
repodirs[1] = string.gsub(lfs.currentdir(), "(.*)/.*", "%1")
|
|
else
|
|
repodirs[1] = lfs.currentdir()
|
|
end
|
|
end
|
|
|
|
if subcmd[cmd] and type(subcmd[cmd].run) == "function" then
|
|
db = aports.new(repodirs)
|
|
loadtime = os.clock()
|
|
subcmd[cmd].run(opts)
|
|
runtime = os.clock() - loadtime
|
|
-- io.stderr:write("db load time = "..tostring(loadtime).."\n")
|
|
-- io.stderr:write("cmd run time = "..tostring(runtime).."\n")
|
|
else
|
|
io.stderr:write(cmd..": invalid subcommand\n")
|
|
end
|
|
|