From cfc654d9db45eeb6efc1745f855d7eb3341644b1 Mon Sep 17 00:00:00 2001 From: ubq323 Date: Thu, 4 Aug 2022 00:01:30 +0100 Subject: pm --- pm.lua | 74 ++++++++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/pm.lua b/pm.lua index 1c497b1..62cfed9 100644 --- a/pm.lua +++ b/pm.lua @@ -6,44 +6,74 @@ local function perr(err,what) if err then error(what..": "..err) end end +local _manifests = {} local function manifest(pkgname) + if _manifests[pkgname] then return _manifests[pkgname] end print("fetching manifest of '"..pkgname.."'...") - local res,err = http.get(rbase..pkgname..".dat") - perr(err,"http.get") + local files={} local files_present=false local deps={} - for line in res.readAll():gmatch"[^\n]+" do - local op,argstart = line:match "^(%w+)%s+()" - if op then - local argstr = line:sub(argstart) - local args = {} - for arg in argstr:gmatch"[^ ]+" do - table.insert(args,arg) - end - - if op == "dep" then - for _,arg in ipairs(args) do deps[arg]=true end - elseif op == "file" then - files_present = true - for _,arg in ipairs(args) do files[arg]=true end + + local res,err,err_res = http.get(rbase..pkgname..".dat") + if err then + if err_res and (err_res.getResponseCode() == 404) then + print("no manifest for "..pkgname.." found, using defaults") + else + error("http.get: "..err) + end + else + for line in res.readAll():gmatch"[^\n]+" do + local op,argstart = line:match "^(%w+)%s+()" + if op then + local argstr = line:sub(argstart) + local args = {} + for arg in argstr:gmatch"[^ ]+" do + table.insert(args,arg) + end + + if op == "dep" then + for _,arg in ipairs(args) do deps[arg]=true end + elseif op == "file" then + files_present = true + for _,arg in ipairs(args) do files[arg]=true end + end end end end - if not files_present then files[pkgname]=true end - return {files=files,deps=deps} + + if not files_present then files[pkgname..".lua"]=true end + local man = {files=files,deps=deps} + _manifests[pkgname] = man + return man end +local function recursive_depsof(pkgname) + local lookedat = {} + local deps = {} + local function F(pkgname) + print("F",pkgname) + if not lookedat[pkgname] then + lookedat[pkgname] = true + for k,_ in pairs(manifest(pkgname).deps) do + deps[k] = true + F(k) + end + end + end + F(pkgname) + return deps +end -local function dl(filename) - local file,err=fs.open("/"..filename..".lua","w") +local function dlfile(filename) + local file,err=fs.open("/"..filename,"w") if err then error("fs.open "..err) end - local res,err = http.get("https://g.gh0.pw/ccprogs/plain/"..filename..".lua") + local res,err = http.get("https://g.gh0.pw/ccprogs/plain/"..filename) if err then error("http.get "..err) end file.write(res.readAll()) file.flush() file.close() end -return manifest +return {manifest=manifest,rd=recursive_depsof} --dl(arg[1]) -- cgit v1.2.3