-- 'package manager' local rbase = "https://g.gh0.pw/ccprogs/plain/" local function is_required() local n = 0 local res = false while true do local x = debug.getinfo(n) if x == nil then break end n = n + 1 if x.func == require then res = true break end end return res end local function perr(err,what) if err then error(what..": "..err) end end local _manifests = {} local function clear_cache() for k in pairs(_manifests) do _manifests[k] = nil end end local function manifest(pkgname) if _manifests[pkgname] then return _manifests[pkgname] end print("fetching manifest of '"..pkgname.."'...") local files={} local files_present=false local deps={} 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 local default_filename = pkgname .. ".lua" if pkgname:match("%.") then default_filename = pkgname end files[default_filename]=true end local man = {files=files,deps=deps} _manifests[pkgname] = man return man end local function recursive_depsof(pkgname, out) local lookedat = {} local deps = out or {} local function 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 deps[pkgname] = true F(pkgname) return deps end local function filesof(dep_set) local files = {} for dep in pairs(dep_set) do for file in pairs(manifest(dep).files) do files[file] = true end end return files end local function fmt_set(set) local keys = {} for k in pairs(set) do table.insert(keys,k) end table.sort(keys) return "("..#keys..") " .. table.concat(keys,", ") end local function dlfile(filename) local src=rbase..filename local dest="/"..filename print("downloading "..src.." to "..dest) local dir = fs.getDir(dest) if not fs.isDir(dir) then print("creating directory "..dir) fs.makeDir(dir) end local file,err=fs.open(dest,"wb") if err then error("fs.open "..err) end local res,err = http.get{url=src,binary=true} if err then error("http.get "..err) end file.write(res.readAll()) file.flush() file.close() end local function dl_many(pkgnames) local dep_set = {} for _,pkgname in ipairs(pkgnames) do recursive_depsof(pkgname, dep_set) end local files = filesof(dep_set) print("all dependencies: "..fmt_set(dep_set)) print("all files: "..fmt_set(files)) for file in pairs(files) do dlfile(file) end print"done" end local function dl(pkgname) dl_many({pkgname}) end if is_required() then return {manifest=manifest, rd=recursive_depsof, filesof=filesof, dl=dl, dl_many=dl_many, cc=clear_cache} else dl_many(arg) end