123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- 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 [email protected]: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
|