parent
f43a855c94
commit
0699c8995c
1 changed files with 88 additions and 0 deletions
@ -0,0 +1,88 @@ |
||||
import("core.base.option") |
||||
import("core.base.semver") |
||||
import("core.base.json") |
||||
import("lib.detect.find_tool") |
||||
import("net.http") |
||||
|
||||
local options = { |
||||
{nil, "repo", "v", nil, "Set repository name.", |
||||
"e.g. ", |
||||
" - github:xmake-io/xmake", |
||||
" - brew:zlib"} |
||||
} |
||||
|
||||
function _generate_package_from_github(reponame) |
||||
-- get repository info |
||||
local gh = assert(find_tool("gh"), "gh not found!") |
||||
local repoinfo = os.iorunv(gh.program, {"repo", "view", reponame, "--json", |
||||
"description,homepageUrl,licenseInfo,url,sshUrl,name,latestRelease"}) |
||||
if repoinfo then |
||||
repoinfo = json.decode(repoinfo) |
||||
end |
||||
print(repoinfo) |
||||
|
||||
-- generate package header |
||||
local packagename = assert(repoinfo.name, "package name not found!"):lower() |
||||
local packagefile = path.join("packages", packagename:sub(1, 1), packagename, "xmake.lua") |
||||
local file = io.open(packagefile, "w") |
||||
file:print('package("%s")', packagename) |
||||
local homepage = repoinfo.homepageUrl or repoinfo.url |
||||
if homepage then |
||||
file:print(' set_homepage("%s")', homepage) |
||||
end |
||||
local description = repoinfo.description or ("The " .. packagename .. " package") |
||||
file:print(' set_description("%s")', description) |
||||
local licensekey = repoinfo.licenseInfo and repoinfo.licenseInfo.key |
||||
if licensekey then |
||||
local licenses = { |
||||
["apache-2.0"] = "Apache-2.0" |
||||
} |
||||
local license = licenses[licensekey] |
||||
if license then |
||||
file:print(' set_license("%s")', license) |
||||
end |
||||
end |
||||
file:print("") |
||||
|
||||
-- generate package urls and versions |
||||
local latest_release = repoinfo.latestRelease |
||||
if latest_release then |
||||
local url = ("https://github.com/%s/archive/refs/tags/%s.tar.gz"):format(reponame, latest_release.tagName) |
||||
local giturl = ("https://github.com/%s.git"):format(reponame) |
||||
file:print(' add_urls("%s",', url) |
||||
file:print(' "%s")', giturl) |
||||
local tmpfile = os.tmpfile() |
||||
print("downloading %s", url) |
||||
http.download(url, tmpfile) |
||||
file:print(' add_versions("%s", "%s")', latest_release.tagName, hash.sha256(tmpfile)) |
||||
os.rm(tmpfile) |
||||
end |
||||
|
||||
-- generate install scripts |
||||
file:print("") |
||||
file:print(" on_install(function (package)") |
||||
file:print(" local configs = {}") |
||||
file:print(' import("package.tools.xmake").install(package, configs)') |
||||
file:print(" end)") |
||||
|
||||
-- generate test scripts |
||||
file:print("") |
||||
file:print(" on_test(function (package)") |
||||
file:print(' assert(package:has_cfuncs("foo", {includes = "foo.h"}))') |
||||
file:print(" end)") |
||||
|
||||
file:close() |
||||
io.cat(packagefile) |
||||
cprint("${bright}%s generated!", packagefile) |
||||
end |
||||
|
||||
function main(...) |
||||
local opt = option.parse(table.pack(...), options, "New a package.", "", |
||||
"Usage: xmake l scripts/new.lua [options]") |
||||
local repo = opt.repo |
||||
if repo and repo:startswith("github:") then |
||||
_generate_package_from_github(repo:sub(8)) |
||||
else |
||||
raise("we need set repository name first!") |
||||
end |
||||
end |
Loading…
Reference in new issue