summaryrefslogtreecommitdiff
path: root/pm.lua
blob: 72dbdcfd42d6c2edb073ed96e4407eb2ba3e0237 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
-- 'package manager'

local rbase = "https://g.gh0.pw/ccprogs/plain/"

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 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)
		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 recursive_filesof(pkgname)
	local deps = recursive_depsof(pkgname)
	local files = {}
	for dep in pairs(deps) do
		for file in pairs(manifest(dep).files) do files[file] = true end 
	end
	return files
end

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)
	if err then error("http.get "..err) end
	file.write(res.readAll())
	file.flush()
	file.close()
end

return {manifest=manifest,rd=recursive_depsof,rf=recursive_filesof}
--dl(arg[1])