From 01542ad5a23b35cccf9ca6abc6fcb33c6512219e Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 26 May 2021 00:57:23 +0800 Subject: add get confirm stub from 3rd --- xmake/core/base/utils.lua | 30 ++++++++++++---------- .../action/require/impl/install_packages.lua | 19 ++++++++++++++ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/xmake/core/base/utils.lua b/xmake/core/base/utils.lua index 4071490f5..c1b78af4d 100644 --- a/xmake/core/base/utils.lua +++ b/xmake/core/base/utils.lua @@ -314,18 +314,18 @@ function utils.confirm(opt) local description = opt.description or "" -- get confirm result - local confirm = option.get("yes") or option.get("confirm") - if type(confirm) == "string" then - confirm = confirm:lower() - if confirm == "d" or confirm == "def" then - confirm = default + local result = option.get("yes") or option.get("confirm") + if type(result) == "string" then + result = result:lower() + if result == "d" or result == "def" then + result = default else - confirm = nil + result = nil end end -- get user confirm - if confirm == nil then + if result == nil then -- show tips if type(description) == "function" then @@ -333,16 +333,20 @@ function utils.confirm(opt) else utils.cprint("${bright color.warning}note: ${clear}%s (pass -y or --confirm=y/n/d to skip confirm)?", description) end - utils.cprint("please input: ${bright}%s${clear} (y/n)", default and "y" or "n") -- get answer - io.flush() - confirm = option.boolean((io.read() or "false"):trim()) - if type(confirm) ~= "boolean" then - confirm = default + if opt.answer then + result = opt.answer() + else + utils.cprint("please input: ${bright}%s${clear} (y/n)", default and "y" or "n") + io.flush() + result = option.boolean((io.read() or "false"):trim()) + if type(result) ~= "boolean" then + result = default + end end end - return confirm + return result end function utils.table(data, opt) diff --git a/xmake/modules/private/action/require/impl/install_packages.lua b/xmake/modules/private/action/require/impl/install_packages.lua index e2d97e2f3..ac3a16f6c 100644 --- a/xmake/modules/private/action/require/impl/install_packages.lua +++ b/xmake/modules/private/action/require/impl/install_packages.lua @@ -46,6 +46,10 @@ function _sort_packages_urls(packages) end end +-- get user confirm from 3rd package sources +function _get_confirm_from_3rd(packages) +end + -- get user confirm function _get_confirm(packages) @@ -100,7 +104,22 @@ function _get_confirm(packages) end end end + end, answer = function () + cprint("please input: ${bright}y${clear} (y/n/more)") + io.flush() + return (io.read() or "false"):trim() end}) + + -- more? get confirm from 3rd package sources + if confirm == "more" or confirm == "m" then + return _get_confirm_from_3rd(packages) + end + + -- get confirm result + confirm = option.boolean(confirm) + if type(confirm) ~= "boolean" then + confirm = true + end return confirm end -- cgit v1.3.1 From 9f2a8b51e56b7dccbcff73b9bd0a4bf3977b48d4 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 27 May 2021 00:43:36 +0800 Subject: improve confirm tips --- .../action/require/impl/install_packages.lua | 110 +++++++++++---------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/xmake/modules/private/action/require/impl/install_packages.lua b/xmake/modules/private/action/require/impl/install_packages.lua index ac3a16f6c..7504ff106 100644 --- a/xmake/modules/private/action/require/impl/install_packages.lua +++ b/xmake/modules/private/action/require/impl/install_packages.lua @@ -58,67 +58,71 @@ function _get_confirm(packages) return true end - -- get confirm - local confirm = utils.confirm({default = true, description = function () - - -- get packages for each repositories - local packages_repo = {} - local packages_group = {} - for _, instance in ipairs(packages) do - -- achive packages by repository - local reponame = instance:repo() and instance:repo():name() or (instance:is_system() and "system" or "") - if instance:is_thirdparty() then - reponame = instance:name():lower():split("::")[1] - end - packages_repo[reponame] = packages_repo[reponame] or {} - table.insert(packages_repo[reponame], instance) + local confirm + while confirm == nil do + -- get confirm + confirm = utils.confirm({default = true, description = function () + + -- get packages for each repositories + local packages_repo = {} + local packages_group = {} + for _, instance in ipairs(packages) do + -- achive packages by repository + local reponame = instance:repo() and instance:repo():name() or (instance:is_system() and "system" or "") + if instance:is_thirdparty() then + reponame = instance:name():lower():split("::")[1] + end + packages_repo[reponame] = packages_repo[reponame] or {} + table.insert(packages_repo[reponame], instance) - -- achive packages by group - local group = instance:group() - if group then - packages_group[group] = packages_group[group] or {} - table.insert(packages_group[group], instance) + -- achive packages by group + local group = instance:group() + if group then + packages_group[group] = packages_group[group] or {} + table.insert(packages_group[group], instance) + end end - end - -- show tips - cprint("${bright color.warning}note: ${clear}try installing these packages (pass -y to skip confirm)?") - for reponame, packages in pairs(packages_repo) do - if reponame ~= "" then - print("in %s:", reponame) - end - local packages_showed = {} - for _, instance in ipairs(packages) do - if not packages_showed[tostring(instance)] then - local group = instance:group() - if group and packages_group[group] and #packages_group[group] > 1 then - for idx, package_in_group in ipairs(packages_group[group]) do - cprint(" ${yellow}%s${clear} %s %s ${dim}%s", idx == 1 and "->" or " or", package_in_group:displayname(), package_in_group:version_str() or "", package.get_configs_str(package_in_group)) - packages_showed[tostring(package_in_group)] = true + -- show tips + cprint("${bright color.warning}note: ${clear}install or modify (m) these packages (pass -y to skip confirm)?") + for reponame, packages in pairs(packages_repo) do + if reponame ~= "" then + print("in %s:", reponame) + end + local packages_showed = {} + for _, instance in ipairs(packages) do + if not packages_showed[tostring(instance)] then + local group = instance:group() + if group and packages_group[group] and #packages_group[group] > 1 then + for idx, package_in_group in ipairs(packages_group[group]) do + cprint(" ${yellow}%s${clear} %s %s ${dim}%s", idx == 1 and "->" or " or", package_in_group:displayname(), package_in_group:version_str() or "", package.get_configs_str(package_in_group)) + packages_showed[tostring(package_in_group)] = true + end + packages_group[group] = nil + else + cprint(" ${yellow}->${clear} %s %s ${dim}%s", instance:displayname(), instance:version_str() or "", package.get_configs_str(instance)) + packages_showed[tostring(instance)] = true end - packages_group[group] = nil - else - cprint(" ${yellow}->${clear} %s %s ${dim}%s", instance:displayname(), instance:version_str() or "", package.get_configs_str(instance)) - packages_showed[tostring(instance)] = true end end end - end - end, answer = function () - cprint("please input: ${bright}y${clear} (y/n/more)") - io.flush() - return (io.read() or "false"):trim() - end}) - - -- more? get confirm from 3rd package sources - if confirm == "more" or confirm == "m" then - return _get_confirm_from_3rd(packages) - end + end, answer = function () + cprint("please input: ${bright}y${clear} (y/n/m)") + io.flush() + return (io.read() or "false"):trim() + end}) - -- get confirm result - confirm = option.boolean(confirm) - if type(confirm) ~= "boolean" then - confirm = true + -- modify to select 3rd packages? + if confirm == "m" then + _get_confirm_from_3rd(packages) + confirm = nil + else + -- get confirm result + confirm = option.boolean(confirm) + if type(confirm) ~= "boolean" then + confirm = true + end + end end return confirm end -- cgit v1.3.1 From 8872d2b48833e3f54415c2db121005193bc0569b Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 27 May 2021 00:51:19 +0800 Subject: show select packages --- .../action/require/impl/install_packages.lua | 63 ++++++++++++++++++---- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/xmake/modules/private/action/require/impl/install_packages.lua b/xmake/modules/private/action/require/impl/install_packages.lua index 7504ff106..842f3fc66 100644 --- a/xmake/modules/private/action/require/impl/install_packages.lua +++ b/xmake/modules/private/action/require/impl/install_packages.lua @@ -48,6 +48,49 @@ end -- get user confirm from 3rd package sources function _get_confirm_from_3rd(packages) + + -- get package extsources + local package_extsources = {} + for _, instance in ipairs(packages) do + for _, extsource in ipairs(instance:get("extsources")) do + table.insert(package_extsources, {extsource = extsource, instance = instance}) + end + end + + -- get confirm result + local result = utils.confirm({description = function () + cprint("${bright color.warning}note: ${clear}select the following 3rd packages") + for idx, package_extsource in ipairs(package_extsources) do + local instance = package_extsource.instance + local extsource = package_extsource.extsource + cprint(" ${yellow}%d.${clear} %s ${yellow}->${clear} %s %s ${dim}%s", + idx, extsource, + instance:displayname(), + instance:version_str() or "", + package.get_configs_str(instance)) + end + end, answer = function () + cprint("please input number list: ${bright}n${clear} (1,2,..)") + io.flush() + return (io.read() or "n"):trim() + end}) + + -- get confirmed extsources + local confirmed_extsources = {} + if result and result ~= "n" then + for _, idx in ipairs(result:split(',')) do + idx = tonumber(idx) + if package_extsources[idx] then + table.insert(confirmed_extsources, package_extsources[idx]) + end + end + end + + -- modify packages + for _, confirmed_extsource in ipairs(confirmed_extsources) do + local instance = confirmed_extsource.instance + local extsource = confirmed_extsource.extsource + end end -- get user confirm @@ -58,10 +101,10 @@ function _get_confirm(packages) return true end - local confirm - while confirm == nil do - -- get confirm - confirm = utils.confirm({default = true, description = function () + local result + while result == nil do + -- get confirm result + result = utils.confirm({default = true, description = function () -- get packages for each repositories local packages_repo = {} @@ -113,18 +156,18 @@ function _get_confirm(packages) end}) -- modify to select 3rd packages? - if confirm == "m" then + if result == "m" then _get_confirm_from_3rd(packages) - confirm = nil + result = nil else -- get confirm result - confirm = option.boolean(confirm) - if type(confirm) ~= "boolean" then - confirm = true + result = option.boolean(result) + if type(result) ~= "boolean" then + result = true end end end - return confirm + return result end -- install packages -- cgit v1.3.1 From 9bc010979ead04b321ff409872df98cc6276f2b0 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 27 May 2021 00:53:06 +0800 Subject: load extsource --- xmake/modules/private/action/require/impl/install_packages.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xmake/modules/private/action/require/impl/install_packages.lua b/xmake/modules/private/action/require/impl/install_packages.lua index 842f3fc66..d9f218415 100644 --- a/xmake/modules/private/action/require/impl/install_packages.lua +++ b/xmake/modules/private/action/require/impl/install_packages.lua @@ -23,6 +23,7 @@ import("core.base.option") import("core.base.hashset") import("core.base.scheduler") import("core.project.project") +import("core.package.package", {alias = "core_package"}) import("core.base.tty") import("private.async.runjobs") import("private.utils.progress") @@ -90,6 +91,8 @@ function _get_confirm_from_3rd(packages) for _, confirmed_extsource in ipairs(confirmed_extsources) do local instance = confirmed_extsource.instance local extsource = confirmed_extsource.extsource + local extinstance = core_package.load_from_system(extsource) + print("xx", extinstance:name()) end end -- cgit v1.3.1 From 9fad7ea8b4e495b011a5157e5666b76898b91882 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 27 May 2021 22:39:23 +0800 Subject: replace extpackages --- .../action/require/impl/install_packages.lua | 80 ++++++++++++++++------ 1 file changed, 58 insertions(+), 22 deletions(-) diff --git a/xmake/modules/private/action/require/impl/install_packages.lua b/xmake/modules/private/action/require/impl/install_packages.lua index d9f218415..773e5fd6e 100644 --- a/xmake/modules/private/action/require/impl/install_packages.lua +++ b/xmake/modules/private/action/require/impl/install_packages.lua @@ -23,7 +23,6 @@ import("core.base.option") import("core.base.hashset") import("core.base.scheduler") import("core.project.project") -import("core.package.package", {alias = "core_package"}) import("core.base.tty") import("private.async.runjobs") import("private.utils.progress") @@ -47,25 +46,53 @@ function _sort_packages_urls(packages) end end +-- replace modified package +function _replace_package(packages, instance, extinstance) + for idx, rawinstance in ipairs(packages) do + if rawinstance == instance then + packages[idx] = extinstance + end + end +end + +-- replace modified packages +function _replace_packages(packages, packages_modified) + for _, package_modified in ipairs(packages_modified) do + local instance = package_modified.instance + local extinstance = package_modified.extinstance + _replace_package(packages, instance, extinstance) + end +end + -- get user confirm from 3rd package sources +-- @see https://github.com/xmake-io/xmake/issues/1140 function _get_confirm_from_3rd(packages) - -- get package extsources - local package_extsources = {} - for _, instance in ipairs(packages) do - for _, extsource in ipairs(instance:get("extsources")) do - table.insert(package_extsources, {extsource = extsource, instance = instance}) + -- get extpackages list + local extpackages_list = _g.extpackages_list + if not extpackages_list then + extpackages_list = {} + for _, instance in ipairs(packages) do + local extsources = instance:get("extsources") + local extsources_extra = instance:extraconf("extsources") + if extsources then + local extpackages = package.load_packages(extsources, extsources_extra) + for _, extinstance in ipairs(extpackages) do + table.insert(extpackages_list, {instance = instance, extinstance = extinstance}) + end + end end + _g.extpackages_list = extpackages_list end -- get confirm result local result = utils.confirm({description = function () cprint("${bright color.warning}note: ${clear}select the following 3rd packages") - for idx, package_extsource in ipairs(package_extsources) do - local instance = package_extsource.instance - local extsource = package_extsource.extsource + for idx, extinstance in ipairs(extpackages_list) do + local instance = extinstance.instance + local extinstance = extinstance.extinstance cprint(" ${yellow}%d.${clear} %s ${yellow}->${clear} %s %s ${dim}%s", - idx, extsource, + idx, extinstance:name(), instance:displayname(), instance:version_str() or "", package.get_configs_str(instance)) @@ -76,23 +103,21 @@ function _get_confirm_from_3rd(packages) return (io.read() or "n"):trim() end}) - -- get confirmed extsources - local confirmed_extsources = {} + -- get confirmed extpackages + local confirmed_extpackages = {} if result and result ~= "n" then for _, idx in ipairs(result:split(',')) do idx = tonumber(idx) - if package_extsources[idx] then - table.insert(confirmed_extsources, package_extsources[idx]) + if extpackages_list[idx] then + table.insert(confirmed_extpackages, extpackages_list[idx]) end end end -- modify packages - for _, confirmed_extsource in ipairs(confirmed_extsources) do - local instance = confirmed_extsource.instance - local extsource = confirmed_extsource.extsource - local extinstance = core_package.load_from_system(extsource) - print("xx", extinstance:name()) + if #confirmed_extpackages > 0 then + _replace_packages(packages, confirmed_extpackages) + return confirmed_extpackages end end @@ -105,6 +130,7 @@ function _get_confirm(packages) end local result + local packages_modified while result == nil do -- get confirm result result = utils.confirm({default = true, description = function () @@ -160,7 +186,7 @@ function _get_confirm(packages) -- modify to select 3rd packages? if result == "m" then - _get_confirm_from_3rd(packages) + packages_modified = _get_confirm_from_3rd(packages) result = nil else -- get confirm result @@ -170,7 +196,7 @@ function _get_confirm(packages) end end end - return result + return result, packages_modified end -- install packages @@ -492,7 +518,8 @@ function main(requires, opt) end -- get user confirm - if not _get_confirm(packages_install) then + local confirm, packages_modified = _get_confirm(packages_install) + if not confirm then local packages_must = {} for _, instance in ipairs(packages_install) do if not instance:is_optional() then @@ -507,6 +534,15 @@ function main(requires, opt) end end + -- some packages are modified? we need fix packages list and all deps + if packages_modified then + order_packages = {} + _replace_packages(packages, packages_modified) + installdeps = _get_package_installdeps(packages) + _sort_packages_for_installdeps(packages, installdeps, order_packages) + packages = table.unique(order_packages) + end + -- sort package urls _sort_packages_urls(packages_download) -- cgit v1.3.1 From 57538bd32331d415730e0a82715d25f887bbc84a Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 27 May 2021 22:42:29 +0800 Subject: replace package deps and parents --- .../action/require/impl/install_packages.lua | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/xmake/modules/private/action/require/impl/install_packages.lua b/xmake/modules/private/action/require/impl/install_packages.lua index 773e5fd6e..97d0d18ba 100644 --- a/xmake/modules/private/action/require/impl/install_packages.lua +++ b/xmake/modules/private/action/require/impl/install_packages.lua @@ -52,6 +52,43 @@ function _replace_package(packages, instance, extinstance) if rawinstance == instance then packages[idx] = extinstance end + local deps = rawinstance._DEPS + for name, dep in pairs(deps) do + if dep == instance then + deps[name] = nil + deps[extinstance:name()] = extinstance + break + end + end + local parents = rawinstance._PARENTS + for name, parent in pairs(parents) do + if parent == instance then + parents[name] = nil + parents[extinstance:name()] = extinstance + break + end + end + local orderdeps = rawinstance._ORDERDEPS + for depidx, dep in ipairs(orderdeps) do + if dep == instance then + orderdeps[depidx] = extinstance + break + end + end + local linkdeps = rawinstance._LINKDEPS + for depidx, dep in ipairs(linkdeps) do + if dep == instance then + linkdeps[depidx] = extinstance + break + end + end + local plaindeps = rawinstance._PLAINDEPS + for depidx, dep in ipairs(rawinstance._PLAINDEPS) do + if dep == instance then + plaindeps[depidx] = extinstance + break + end + end end end -- cgit v1.3.1