feat: 添加官方的一些包工具脚本
This commit is contained in:
169
scripts/build_artifacts.lua
Normal file
169
scripts/build_artifacts.lua
Normal file
@@ -0,0 +1,169 @@
|
||||
import("core.package.package")
|
||||
import("core.base.semver")
|
||||
import("core.base.hashset")
|
||||
import("packages", {alias = "packages_util"})
|
||||
|
||||
-- load package
|
||||
function _load_package(packagename, packagedir, packagefile)
|
||||
local funcinfo = debug.getinfo(package.load_from_repository)
|
||||
if funcinfo and funcinfo.nparams == 3 then -- >= 2.7.8
|
||||
return package.load_from_repository(packagename, packagedir, {packagefile = packagefile})
|
||||
else
|
||||
-- deprecated
|
||||
return package.load_from_repository(packagename, nil, packagedir, packagefile)
|
||||
end
|
||||
end
|
||||
|
||||
function _need_artifact(instance)
|
||||
return (not instance:is_headeronly()) and (packages_util.is_supported(instance, "windows", "x64") or packages_util.is_supported(instance, "windows", "x86"))
|
||||
end
|
||||
|
||||
function _build_artifacts(name, versions)
|
||||
local buildinfo = {name = name, versions = versions}
|
||||
print(buildinfo)
|
||||
os.tryrm("build-artifacts")
|
||||
os.exec("git clone git@github.com:xmake-mirror/build-artifacts.git -b build")
|
||||
local oldir = os.cd("build-artifacts")
|
||||
local trycount = 0
|
||||
while trycount < 2 do
|
||||
local ok = try
|
||||
{
|
||||
function ()
|
||||
io.save("build.txt", buildinfo)
|
||||
os.exec("git add -A")
|
||||
os.exec("git commit -a -m \"autobuild %s by xmake-repo/ci\"", name)
|
||||
os.exec("git push origin build")
|
||||
return true
|
||||
end,
|
||||
catch
|
||||
{
|
||||
function ()
|
||||
os.exec("git reset --hard HEAD^")
|
||||
os.exec("git pull origin build")
|
||||
end
|
||||
}
|
||||
}
|
||||
if ok then
|
||||
break
|
||||
end
|
||||
trycount = trycount + 1
|
||||
end
|
||||
assert(trycount < 2)
|
||||
os.cd(oldir)
|
||||
end
|
||||
|
||||
function _get_latest_modified_packages()
|
||||
print("find latest modified packages ..")
|
||||
local instances = {}
|
||||
local files = os.iorun("git diff --name-only HEAD^")
|
||||
for _, file in ipairs(files:split('\n')) do
|
||||
file = file:trim()
|
||||
if file:find("packages", 1, true) and path.filename(file) == "xmake.lua" then
|
||||
assert(file == file:lower(), "%s must be lower case!", file)
|
||||
local packagedir = path.directory(file)
|
||||
local packagename = path.filename(packagedir)
|
||||
if #path.filename(path.directory(packagedir)) == 1 then
|
||||
local instance = _load_package(packagename, packagedir, file)
|
||||
if instance and _need_artifact(instance) then
|
||||
table.insert(instances, instance)
|
||||
print(" > %s", instance:name())
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
print("%d found", #instances)
|
||||
return instances
|
||||
end
|
||||
|
||||
function _get_all_packages()
|
||||
local packages = _g.packages
|
||||
if not packages then
|
||||
packages = {}
|
||||
for _, packagedir in ipairs(os.dirs(path.join("packages", "*", "*"))) do
|
||||
local packagename = path.filename(packagedir)
|
||||
local packagefile = path.join(packagedir, "xmake.lua")
|
||||
local instance = _load_package(packagename, packagedir, packagefile)
|
||||
local basename = instance:get("base")
|
||||
if instance and basename then
|
||||
local basedir = path.join("packages", basename:sub(1, 1):lower(), basename:lower())
|
||||
local basefile = path.join(basedir, "xmake.lua")
|
||||
instance._BASE = _load_package(basename, basedir, basefile)
|
||||
end
|
||||
if instance and _need_artifact(instance) then
|
||||
table.insert(packages, instance)
|
||||
end
|
||||
end
|
||||
_g.packages = packages
|
||||
end
|
||||
return packages
|
||||
end
|
||||
|
||||
function _get_packagerefs_of(instance)
|
||||
local packagerefs = {}
|
||||
if instance:is_library() then
|
||||
local packages = _get_all_packages()
|
||||
for _, packageref in ipairs(packages) do
|
||||
local deps = packageref:get("deps")
|
||||
if deps and table.contains(table.wrap(deps), instance:name()) then
|
||||
table.insert(packagerefs, packageref)
|
||||
end
|
||||
end
|
||||
end
|
||||
return packagerefs
|
||||
end
|
||||
|
||||
function _get_packagerefs_in_latest_24h()
|
||||
print("find packagerefs in latest 24h ..")
|
||||
local instances = {}
|
||||
local list = os.iorun("git log --since=\"24 hours ago\" --oneline")
|
||||
local lines = list:split('\n')
|
||||
if #lines > 0 then
|
||||
local line = lines[#lines]
|
||||
local commit = line:split(" ")[1]
|
||||
if commit and #commit == 8 then
|
||||
local files = os.iorun("git diff --name-only " .. commit .. "^")
|
||||
for _, file in ipairs(files:split('\n')) do
|
||||
file = file:trim()
|
||||
if file:find("packages", 1, true) and path.filename(file) == "xmake.lua" then
|
||||
assert(file == file:lower(), "%s must be lower case!", file)
|
||||
local packagedir = path.directory(file)
|
||||
local packagename = path.filename(packagedir)
|
||||
if #path.filename(path.directory(packagedir)) == 1 then
|
||||
local instance = _load_package(packagename, packagedir, file)
|
||||
if instance and _need_artifact(instance) then
|
||||
table.insert(instances, instance)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
local packagerefs = hashset.new()
|
||||
for _, instance in ipairs(instances) do
|
||||
print("%s: ", instance:name())
|
||||
for _, packageref in ipairs(_get_packagerefs_of(instance)) do
|
||||
packagerefs:insert(packageref)
|
||||
print(" -> %s", packageref:name())
|
||||
end
|
||||
end
|
||||
local result = {}
|
||||
for _, packageref in packagerefs:keys() do
|
||||
if #result < 24 then
|
||||
table.insert(result, packageref)
|
||||
end
|
||||
end
|
||||
print("%d found", #result)
|
||||
return result
|
||||
end
|
||||
|
||||
function main(updaterefs)
|
||||
local instances = updaterefs and _get_packagerefs_in_latest_24h() or _get_latest_modified_packages()
|
||||
for _, instance in ipairs(instances) do
|
||||
local versions = instance:versions()
|
||||
if versions and #versions > 0 then
|
||||
table.sort(versions, function (a, b) return semver.compare(a, b) > 0 end)
|
||||
local version_latest = versions[1]
|
||||
_build_artifacts(instance:name(), table.wrap(version_latest))
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user