summaryrefslogtreecommitdiff
path: root/xmake/modules/private/action/require/impl/package.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2021-08-19 22:21:53 +0800
committerGitHub <[email protected]>2021-08-19 22:21:53 +0800
commit9c096fc45a4fb8ac817eb48ab8e762e2b41ab259 (patch)
treebebf40a98ed31b8b7b94231976a26637614b80a1 /xmake/modules/private/action/require/impl/package.lua
parent69da74c43e934650eb797ec51f6b7c91fd419642 (diff)
parent0eac4a64692796d99a1a30f206a2d21463e0acf6 (diff)
Merge pull request #1587 from xmake-io/requireslock
Support xmake-requires.lock to lock all required packages
Diffstat (limited to 'xmake/modules/private/action/require/impl/package.lua')
-rw-r--r--xmake/modules/private/action/require/impl/package.lua101
1 files changed, 74 insertions, 27 deletions
diff --git a/xmake/modules/private/action/require/impl/package.lua b/xmake/modules/private/action/require/impl/package.lua
index 612911429..5084d2d29 100644
--- a/xmake/modules/private/action/require/impl/package.lua
+++ b/xmake/modules/private/action/require/impl/package.lua
@@ -26,10 +26,12 @@ import("core.base.hashset")
import("private.utils.progress")
import("core.cache.memcache")
import("core.project.project")
+import("core.project.config")
import("core.tool.toolchain")
import("core.package.package", {alias = "core_package"})
import("devel.git")
import("private.action.require.impl.repository")
+import("private.action.require.impl.utils.requirekey", {alias = "_get_requirekey"})
-- get memcache
function _memcache()
@@ -193,13 +195,34 @@ function _load_package_from_project(packagename)
end
-- load package package from repositories
-function _load_package_from_repository(packagename, reponame)
- local packagedir, repo = repository.packagedir(packagename, reponame)
+function _load_package_from_repository(packagename, opt)
+ local packagedir, repo = repository.packagedir(packagename, opt)
if packagedir then
return core_package.load_from_repository(packagename, repo, packagedir)
end
end
+-- has locked requires?
+function _has_locked_requires()
+ if not option.get("upgrade") then
+ return project.policy("package.requires_lock") and os.isfile(project.requireslock())
+ end
+end
+
+-- get locked requires
+function _get_locked_requires(requirekey)
+ local requireslock = _memcache():get("requireslock")
+ if requireslock == nil then
+ if _has_locked_requires() then
+ requireslock = io.load(project.requireslock())
+ end
+ _memcache():set("requireslock", requireslock or false)
+ end
+ if requireslock then
+ return requireslock[requirekey], requireslock.__meta__.version
+ end
+end
+
-- sort package deps
--
-- e.g.
@@ -246,7 +269,19 @@ function _add_package_configurations(package)
end
-- select package version
-function _select_package_version(package, requireinfo)
+function _select_package_version(package, requireinfo, locked_requireinfo)
+
+ -- get it from the locked requireinfo
+ if locked_requireinfo then
+ local version = locked_requireinfo.version
+ local source = "version"
+ if locked_requireinfo.branch then
+ source = "branch"
+ elseif locked_requireinfo.tag then
+ source = "tag"
+ end
+ return version, source
+ end
-- exists urls? otherwise be phony package (only as package group)
if #package:urls() > 0 then
@@ -270,12 +305,12 @@ function _select_package_version(package, requireinfo)
-- @see https://github.com/xmake-io/xmake/issues/930
-- https://github.com/xmake-io/xmake/issues/1009
version = require_version
- source = "versions"
+ source = "version"
elseif #package:versions() > 0 then -- select version?
version, source = try { function () return semver.select(require_version, package:versions()) end }
end
if not version and has_giturl and not require_version:find('.', 1, true) then -- select branch?
- version, source = require_version ~= "latest" and require_version or "master", "branches"
+ version, source = require_version ~= "latest" and require_version or "master", "branch"
end
if not version then
raise("package(%s): version(%s) not found!", package:name(), require_version)
@@ -477,26 +512,19 @@ end
-- get package key
function _get_packagekey(packagename, requireinfo, version)
- local key = packagename .. "/" .. (version or requireinfo.version)
- if requireinfo.plat then
- key = key .. "/" .. requireinfo.plat
- end
- if requireinfo.arch then
- key = key .. "/" .. requireinfo.arch
- end
- if requireinfo.label then
- key = key .. "/" .. requireinfo.label
- end
- local configs = requireinfo.configs
- if configs then
- local configs_order = {}
- for k, v in pairs(configs) do
- table.insert(configs_order, k .. "=" .. tostring(v))
- end
- table.sort(configs_order)
- key = key .. ":" .. string.serialize(configs_order, true)
- end
- return key
+ return _get_requirekey(requireinfo, {name = packagename,
+ plat = requireinfo.plat,
+ arch = requireinfo.arch,
+ version = version or requireinfo.version})
+end
+
+-- get locked package key
+function _get_packagelock_key(requireinfo)
+ local plat = config.plat() or os.subhost()
+ local arch = config.arch() or os.subarch()
+ local requirestr = requireinfo.originstr
+ local key = _get_requirekey(requireinfo, {hash = true, plat = plat, arch = arch})
+ return string.format("%s#%s", requirestr, key)
end
-- inherit some builtin configs of parent package if these config values are not default value
@@ -610,6 +638,19 @@ function _load_package(packagename, requireinfo, opt)
requireinfo.label = splitinfo[2]
end
+ -- sve requirekey
+ local requirekey = _get_packagelock_key(requireinfo)
+ requireinfo.requirekey = requirekey
+
+ -- get locked requireinfo
+ local locked_requireinfo, requireslock_version
+ if _has_locked_requires() then
+ locked_requireinfo, requireslock_version = _get_locked_requires(requirekey)
+ if requireslock_version and semver.compare(project.requireslock_version(), requireslock_version) < 0 then
+ locked_requireinfo = nil
+ end
+ end
+
-- load package from project first
local package
if os.isfile(os.projectfile()) then
@@ -619,7 +660,8 @@ function _load_package(packagename, requireinfo, opt)
-- load package from repositories
local from_repo = false
if not package then
- package = _load_package_from_repository(packagename, requireinfo.reponame)
+ package = _load_package_from_repository(packagename, {
+ name = requireinfo.reponame, locked_repo = locked_requireinfo and locked_requireinfo.repo})
if package then
from_repo = true
end
@@ -652,7 +694,7 @@ function _load_package(packagename, requireinfo, opt)
_finish_requireinfo(requireinfo, package)
-- select package version
- local version, source = _select_package_version(package, requireinfo)
+ local version, source = _select_package_version(package, requireinfo, locked_requireinfo)
if version then
package:version_set(version, source)
end
@@ -712,6 +754,11 @@ function _load_package(packagename, requireinfo, opt)
on_load(package)
end
+ -- check build hash
+ if locked_requireinfo and locked_requireinfo.buildhash ~= package:buildhash() then
+ wprint("package(%s): buildhash is not matched in xmake-requires.lock", package:displayname(), locked_requireinfo.buildhash, package:buildhash())
+ end
+
-- load environments from the manifest to enable the environments of on_install()
package:envs_load()