mirror of
https://github.com/AR2000AR/openComputers_codes.git
synced 2025-09-07 22:21:14 +02:00
[pm-get] 1.5.0 fix upgrade
This commit is contained in:
@@ -22,7 +22,7 @@
|
|||||||
["pm_get"] = {
|
["pm_get"] = {
|
||||||
["manifestVersion"] = "1.0",
|
["manifestVersion"] = "1.0",
|
||||||
["package"] = "pm_get",
|
["package"] = "pm_get",
|
||||||
["version"] = "1.4.5",
|
["version"] = "1.5.0",
|
||||||
["name"] = "pm get",
|
["name"] = "pm get",
|
||||||
["repo"] = "tree/master/pm_get",
|
["repo"] = "tree/master/pm_get",
|
||||||
["description"] = "Download and install package for pm",
|
["description"] = "Download and install package for pm",
|
||||||
|
Binary file not shown.
@@ -37,6 +37,21 @@ local reposRuntimeCache
|
|||||||
|
|
||||||
local f = string.format
|
local f = string.format
|
||||||
|
|
||||||
|
local function tableMergeUniq(target, source)
|
||||||
|
local newElements = {}
|
||||||
|
for _, v in pairs(source) do
|
||||||
|
local new = true
|
||||||
|
for _, vv in pairs(target) do
|
||||||
|
if v == vv then
|
||||||
|
new = false
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (new) then table.insert(newElements, v) end
|
||||||
|
end
|
||||||
|
for _, v in pairs(newElements) do table.insert(target, v) end
|
||||||
|
end
|
||||||
|
|
||||||
local function printf(...)
|
local function printf(...)
|
||||||
print(f(...))
|
print(f(...))
|
||||||
end
|
end
|
||||||
@@ -62,6 +77,22 @@ local function compareVersion(a, b)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---Check if the pkg version is compatible with dep
|
||||||
|
---@param dep string
|
||||||
|
---@param pkg string
|
||||||
|
---@return boolean
|
||||||
|
local function checkDepVersion(dep, pkg)
|
||||||
|
checkArg(1, dep, 'string')
|
||||||
|
checkArg(2, pkg, 'string')
|
||||||
|
if (dep == "oppm" or dep == "") then return true end
|
||||||
|
if (dep:sub(1, 1) == ">") then
|
||||||
|
return compareVersion(pkg, dep:sub(2, -1)) <= 0
|
||||||
|
elseif (dep:sub(1, 1) == "=") then
|
||||||
|
return compareVersion(pkg, dep:sub(2, -1)) == 0
|
||||||
|
end
|
||||||
|
error(f("Something went wrong with dep=%q and pkg=%q", dep, pkg))
|
||||||
|
end
|
||||||
|
|
||||||
local function confirm(prompt, default)
|
local function confirm(prompt, default)
|
||||||
if (opts["y"]) then return true end
|
if (opts["y"]) then return true end
|
||||||
while true do
|
while true do
|
||||||
@@ -120,7 +151,7 @@ end
|
|||||||
local function getCachedPackageList()
|
local function getCachedPackageList()
|
||||||
if (not reposRuntimeCache) then
|
if (not reposRuntimeCache) then
|
||||||
if (not filesystem.exists(REPO_MANIFEST_CACHE)) then
|
if (not filesystem.exists(REPO_MANIFEST_CACHE)) then
|
||||||
printferr("No data. Run `pm-get upddate` or add repositorys")
|
printferr("No data. Run `pm-get update` or add repository")
|
||||||
return {}
|
return {}
|
||||||
end
|
end
|
||||||
local cache = assert(io.open(REPO_MANIFEST_CACHE))
|
local cache = assert(io.open(REPO_MANIFEST_CACHE))
|
||||||
@@ -145,39 +176,33 @@ local function getCachedPackageManifest(name, targetRepo)
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param package string
|
---@param package string|table
|
||||||
---@param dep? table<number,table> Current dependance list.
|
---@param resolved? table<number,table> Current dependency list.
|
||||||
---@param cleanup? boolean cleanup the dep list. Default `true`
|
---@return table<number,table>? dep ordered list of dependency
|
||||||
---@return table<number,table>? dep ordered list of dependances
|
|
||||||
---@return string? error
|
---@return string? error
|
||||||
local function buildDepList(package, dep, cleanup)
|
local function resolveDepTree(package, resolved)
|
||||||
if not dep then dep = {} end
|
if (type(package) == "string") then package = {package, "oppm"} end
|
||||||
assert(dep)
|
if not resolved then resolved = {} end
|
||||||
if cleanup == nil then cleanup = true end
|
local packageManifest = getCachedPackageManifest(package[1])
|
||||||
local packageManifest = getCachedPackageManifest(package)
|
|
||||||
if (not packageManifest) then return nil, string.format("Package %q cannot be found", package) end
|
if (not packageManifest) then return nil, string.format("Package %q cannot be found", package) end
|
||||||
if (packageManifest.dependencies) then
|
if (packageManifest.dependencies) then
|
||||||
for dependance, requiredVersion in pairs(packageManifest.dependencies) do
|
for dep, requiredVersion in pairs(packageManifest.dependencies) do
|
||||||
table.insert(dep, {dependance, requiredVersion})
|
local new = -1
|
||||||
buildDepList(dependance, dep, false)
|
for i, v in pairs(resolved) do
|
||||||
|
if (v[1] == dep) then
|
||||||
|
new = i
|
||||||
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if (new == -1) then
|
||||||
if (cleanup) then
|
resolveDepTree({dep, requiredVersion}, resolved)
|
||||||
local hash = {}
|
elseif (compareVersion(resolved[new][2], requiredVersion:sub(2, -1)) < 0) then
|
||||||
local rm = {}
|
resolved[new][2] = requiredVersion
|
||||||
for k, v in ipairs(dep) do
|
end
|
||||||
if not hash[v[1]] then
|
table.insert(resolved, package)
|
||||||
table.insert(hash, v[1])
|
|
||||||
else
|
|
||||||
table.insert(rm, 1, k)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for _, v in ipairs(rm) do
|
return resolved
|
||||||
table.remove(dep, v)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return dep
|
|
||||||
end
|
end
|
||||||
|
|
||||||
---Download from url and return it
|
---Download from url and return it
|
||||||
@@ -236,6 +261,59 @@ local function needUpgrade(pkg)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---List the packages than can be upgraded
|
||||||
|
---@return table
|
||||||
|
local function listNeedUpgrade()
|
||||||
|
local canBeUpgraded = {}
|
||||||
|
for pkgName in pairs(pm.getInstalled()) do
|
||||||
|
if (needUpgrade(pkgName)) then table.insert(canBeUpgraded, pkgName) end
|
||||||
|
end
|
||||||
|
return canBeUpgraded
|
||||||
|
end
|
||||||
|
|
||||||
|
---Find missing dependencies for the package
|
||||||
|
---@param pkg string
|
||||||
|
---@return table<number,string>?, table|string
|
||||||
|
local function findMissingDep(pkg)
|
||||||
|
local missingDep = {}
|
||||||
|
local outdatedDep = {}
|
||||||
|
---@type manifest?
|
||||||
|
local packageManifest
|
||||||
|
if pm.isInstalled(pkg) then
|
||||||
|
packageManifest = pm.getManifestFromInstalled(pkg)
|
||||||
|
else
|
||||||
|
packageManifest = getCachedPackageManifest(pkg)
|
||||||
|
end
|
||||||
|
if (not packageManifest) then return nil, f("Cannot find dependencies for %s. Package not found", pkg) end
|
||||||
|
|
||||||
|
local resolvedDepTree, msg = resolveDepTree(pkg)
|
||||||
|
if (not resolvedDepTree) then
|
||||||
|
---@cast msg -nil
|
||||||
|
return nil, msg
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, dep in pairs(resolvedDepTree) do
|
||||||
|
if (not pm.isInstalled(dep[1])) then
|
||||||
|
local manifest = getCachedPackageManifest(dep[1])
|
||||||
|
if (not manifest or not checkDepVersion(dep[2], manifest.version)) then
|
||||||
|
return nil, f("Cannot fulfil dependency : %s (%s) for %s for (%s)", dep[1], dep[2], pkg, packageManifest.version)
|
||||||
|
end
|
||||||
|
table.insert(missingDep, dep[1])
|
||||||
|
else
|
||||||
|
local manifest = pm.getManifestFromInstalled(dep[1])
|
||||||
|
if (checkDepVersion(dep[2], manifest.version) == false) then
|
||||||
|
---@diagnostic disable-next-line: cast-local-type
|
||||||
|
manifest = getCachedPackageManifest(dep[2])
|
||||||
|
if (not manifest or not checkDepVersion(dep[2], manifest.version)) then
|
||||||
|
return nil, f("Cannot fulfil dependency : %s (%s) for %s for (%s)", dep[1], dep[2], pkg, packageManifest.version)
|
||||||
|
end
|
||||||
|
table.insert(outdatedDep, dep[1])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return missingDep, outdatedDep
|
||||||
|
end
|
||||||
|
|
||||||
--=============================================================================
|
--=============================================================================
|
||||||
|
|
||||||
---Install a package
|
---Install a package
|
||||||
@@ -278,12 +356,12 @@ end
|
|||||||
|
|
||||||
---@param packages table|string
|
---@param packages table|string
|
||||||
---@param markAuto? boolean
|
---@param markAuto? boolean
|
||||||
---@param buildDepTree? boolean
|
---@return number 1=ok,0=nothing done, -1=error
|
||||||
local function install(packages, markAuto, buildDepTree)
|
---@return string? error
|
||||||
if (buildDepTree == nil) then buildDepTree = true end
|
local function install(packages, markAuto)
|
||||||
if (type(packages) == "string") then packages = {packages} end
|
if (type(packages) == "string") then packages = {packages} end
|
||||||
---get the dependance list
|
---get the dependency list
|
||||||
local depList = {}
|
local depList, toInstall, toUpgrade = {}, {}, {}
|
||||||
for _, package in pairs(packages) do
|
for _, package in pairs(packages) do
|
||||||
local targetManifest, repoName = getCachedPackageManifest(package)
|
local targetManifest, repoName = getCachedPackageManifest(package)
|
||||||
--check that the packet exists
|
--check that the packet exists
|
||||||
@@ -291,45 +369,42 @@ local function install(packages, markAuto, buildDepTree)
|
|||||||
printferr("Package %s not found", package)
|
printferr("Package %s not found", package)
|
||||||
os.exit(1)
|
os.exit(1)
|
||||||
end
|
end
|
||||||
if (buildDepTree) then
|
local newInstall, newUpgrade = findMissingDep(package)
|
||||||
buildDepList(package, depList)
|
if (not newInstall) then
|
||||||
|
---@cast newUpgrade -table
|
||||||
|
return -1, newUpgrade
|
||||||
end
|
end
|
||||||
|
assert(type(newInstall) == "table")
|
||||||
|
assert(type(newUpgrade) == "table")
|
||||||
|
tableMergeUniq(toInstall, newInstall)
|
||||||
|
tableMergeUniq(toUpgrade, newUpgrade)
|
||||||
end
|
end
|
||||||
|
|
||||||
local toInstall = {}
|
|
||||||
local toUpgrade = {}
|
|
||||||
for _, dep in pairs(depList) do
|
|
||||||
if (not pm.isInstalled(dep[1])) then
|
|
||||||
local exists = getCachedPackageManifest(dep[1])
|
|
||||||
if (not exists) then
|
|
||||||
printferr("Cannot fuffil dependency : %s (%s)", dep[1], dep[2])
|
|
||||||
return -1
|
|
||||||
end
|
|
||||||
table.insert(toInstall, dep[1])
|
|
||||||
else
|
|
||||||
--TODO : check version
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local display = {}
|
local display = {}
|
||||||
for _, v in pairs(toInstall) do table.insert(display, v) end
|
for _, v in pairs(toInstall) do table.insert(display, v) end
|
||||||
for _, v in pairs(packages) do table.insert(display, v) end
|
for _, v in pairs(packages) do table.insert(display, v) end
|
||||||
if (#display > 0) then printf("Will be installed :\n %s", table.concat(display, ', ')) end
|
if (#display > 0) then printf("Will be installed :\n %s", table.concat(display, ', ')) end
|
||||||
if (#toUpgrade > 0) then printf("Will be updated :\n %s", table.concat(toUpgrade, ', ')) end
|
if (#toUpgrade > 0) then printf("Will be updated :\n %s", table.concat(toUpgrade, ', ')) end
|
||||||
printf("%d upgraded, %d newly installed", #toUpgrade, #display)
|
printf("%d upgraded, %d newly installed", #toUpgrade, #display)
|
||||||
if (#display == 0 and #toUpgrade == 0) then return end
|
if (#display == 0 and #toUpgrade == 0) then return 0 end
|
||||||
if not confirm("Proceed") then return end
|
if not confirm("Proceed") then return 0 end
|
||||||
|
|
||||||
if (not opts['dry-run']) then
|
if (not opts['dry-run']) then
|
||||||
for _, dep in pairs(toUpgrade) do
|
for _, dep in pairs(toUpgrade) do
|
||||||
--TODO : upgrade
|
|
||||||
printf("Updating dependency : %s", dep)
|
printf("Updating dependency : %s", dep)
|
||||||
error("UNIMPLEMENTED")
|
printf("Installing dependency : %s", dep)
|
||||||
|
local code, errorReason = doInstall(dep, true)
|
||||||
|
if (errorReason) then
|
||||||
|
printferr("Failed to install %q. Giving up.", dep)
|
||||||
|
return -1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
for _, dep in pairs(toInstall) do
|
for _, dep in pairs(toInstall) do
|
||||||
printf("Installing dependency : %s", dep)
|
printf("Installing dependency : %s", dep)
|
||||||
local code, errorReason = doInstall(dep, true)
|
local code, errorReason = doInstall(dep, true)
|
||||||
if (errorReason) then
|
if (errorReason) then
|
||||||
printferr("Failed to install %q. Abording", dep)
|
printferr("Failed to install %q. Giving up.", dep)
|
||||||
return -1
|
return -1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -337,12 +412,12 @@ local function install(packages, markAuto, buildDepTree)
|
|||||||
printf("Installing : %s", package)
|
printf("Installing : %s", package)
|
||||||
local code, errorReason = doInstall(package, false)
|
local code, errorReason = doInstall(package, false)
|
||||||
if (errorReason) then
|
if (errorReason) then
|
||||||
printferr("Failed to install %q. Abording", package)
|
printferr("Failed to install %q. Giving up.", package)
|
||||||
return -1
|
return -1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return 0
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
local function uninstall(packages)
|
local function uninstall(packages)
|
||||||
@@ -388,16 +463,7 @@ local function update()
|
|||||||
end
|
end
|
||||||
io.open(REPO_MANIFEST_CACHE, "w"):write(serialization.serialize(manifests)):close()
|
io.open(REPO_MANIFEST_CACHE, "w"):write(serialization.serialize(manifests)):close()
|
||||||
|
|
||||||
--check if packages need updating
|
printf("%s package(s) can be upgraded", #listNeedUpgrade())
|
||||||
local canBeUpgraded = 0
|
|
||||||
local remotePackages = getCachedPackageList()
|
|
||||||
local installedPackages = pm.getInstalled()
|
|
||||||
for pkgName in pairs(installedPackages) do
|
|
||||||
if (needUpgrade(pkgName)) then
|
|
||||||
canBeUpgraded = canBeUpgraded + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
printf("%s package(s) can be upgraded", canBeUpgraded)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function printHelp()
|
local function printHelp()
|
||||||
@@ -499,11 +565,14 @@ elseif (mode == "info") then
|
|||||||
printf("Repo : %s", repoName)
|
printf("Repo : %s", repoName)
|
||||||
os.exit(0)
|
os.exit(0)
|
||||||
elseif (mode == "install") then
|
elseif (mode == "install") then
|
||||||
install(args)
|
if (install(args)) then
|
||||||
for _, p in pairs(args) do
|
for _, p in pairs(args) do
|
||||||
markManual(p)
|
markManual(p)
|
||||||
end
|
end
|
||||||
os.exit(0)
|
os.exit(0)
|
||||||
|
else
|
||||||
|
os.exit(1)
|
||||||
|
end
|
||||||
elseif (mode == "uninstall") then
|
elseif (mode == "uninstall") then
|
||||||
uninstall(args)
|
uninstall(args)
|
||||||
elseif (mode == "autoremove") then
|
elseif (mode == "autoremove") then
|
||||||
@@ -525,7 +594,6 @@ elseif (mode == "autoremove") then
|
|||||||
end
|
end
|
||||||
markManual(args[1])
|
markManual(args[1])
|
||||||
elseif (mode == "upgrade") then
|
elseif (mode == "upgrade") then
|
||||||
local installed = pm.getInstalled(false)
|
|
||||||
local toUpgrade = {}
|
local toUpgrade = {}
|
||||||
if (args[1]) then
|
if (args[1]) then
|
||||||
if (pm.isInstalled(args[1])) then
|
if (pm.isInstalled(args[1])) then
|
||||||
@@ -539,20 +607,11 @@ elseif (mode == "upgrade") then
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
--TODO : pkg not installed
|
printf("Package %s is not installed")
|
||||||
|
os.exit(1)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
for pkg, manifest in pairs(installed) do
|
toUpgrade = listNeedUpgrade()
|
||||||
if (manifest.version == "oppm") then
|
|
||||||
printf("Found oppm version for %q.", pkg)
|
|
||||||
table.insert(toUpgrade, pkg)
|
|
||||||
else
|
|
||||||
local remoteManifest = getCachedPackageManifest(pkg)
|
|
||||||
if (remoteManifest and (remoteManifest.version == "oppm" or compareVersion(remoteManifest.version, manifest.version))) then
|
|
||||||
table.insert(toUpgrade, pkg)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
install(toUpgrade, false)
|
install(toUpgrade, false)
|
||||||
elseif (mode == "sources") then
|
elseif (mode == "sources") then
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
["manifestVersion"] = "1.0",
|
["manifestVersion"] = "1.0",
|
||||||
["package"] = "pm_get",
|
["package"] = "pm_get",
|
||||||
["version"] = "1.4.5",
|
["version"] = "1.5.0",
|
||||||
["name"] = "pm get",
|
["name"] = "pm get",
|
||||||
["repo"] = "tree/master/pm_get",
|
["repo"] = "tree/master/pm_get",
|
||||||
["description"] = "Download and install package for pm",
|
["description"] = "Download and install package for pm",
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
["pm_get"] = {
|
["pm_get"] = {
|
||||||
version = "1.4.5",
|
version = "1.5.0",
|
||||||
name = "pm get",
|
name = "pm get",
|
||||||
repo = "tree/master/pm_get",
|
repo = "tree/master/pm_get",
|
||||||
description = "Download and install package for pm",
|
description = "Download and install package for pm",
|
||||||
|
Reference in New Issue
Block a user