summaryrefslogtreecommitdiff
path: root/pm.lua
blob: abeb0566ba89f97596f3d626ccddfb66bfe07484 (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
-- '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 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(pkgname)
	local deps = recursive_depsof(pkgname)
	local files = recursive_filesof(pkgname)
	print("all dependencies: "..fmt_set(deps))
	print("all files: "..fmt_set(files))
	for file in pairs(files) do
		dlfile(file)
	end
	print"done"
end
	

--return {manifest=manifest,rd=recursive_depsof,rf=recursive_filesof,dl=dl,cc=clear_cache}

for i=1,#arg do
	dl(arg[i])
end