aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2014-01-12 14:56:39 -0200
committerHisham Muhammad <hisham@gobolinux.org>2014-01-12 14:56:39 -0200
commitb78aa96d3858554c49d3a6521f1d458fb80c3105 (patch)
treec8e4e70243ebfe655fb915eb104b6dbffbfa83ae
parent77f68c79217cea4e5244d3403fc089e3d8dabd82 (diff)
downloadluarocks-b78aa96d3858554c49d3a6521f1d458fb80c3105.tar.gz
luarocks-b78aa96d3858554c49d3a6521f1d458fb80c3105.tar.bz2
luarocks-b78aa96d3858554c49d3a6521f1d458fb80c3105.zip
Catch undeclared globals in rockspecs
-rw-r--r--src/luarocks/fetch.lua3
-rw-r--r--src/luarocks/manif_core.lua3
-rw-r--r--src/luarocks/persist.lua12
-rw-r--r--src/luarocks/type_check.lua29
4 files changed, 39 insertions, 8 deletions
diff --git a/src/luarocks/fetch.lua b/src/luarocks/fetch.lua
index 83ab6fa9..7960acb4 100644
--- a/src/luarocks/fetch.lua
+++ b/src/luarocks/fetch.lua
@@ -148,10 +148,11 @@ function load_local_rockspec(filename, quick)
148 if not rockspec then 148 if not rockspec then
149 return nil, "Could not load rockspec file "..filename.." ("..err..")" 149 return nil, "Could not load rockspec file "..filename.." ("..err..")"
150 end 150 end
151 local globals = err
151 152
152 local ok, err = true, nil 153 local ok, err = true, nil
153 if not quick then 154 if not quick then
154 ok, err = type_check.type_check_rockspec(rockspec) 155 ok, err = type_check.type_check_rockspec(rockspec, globals)
155 if not ok then 156 if not ok then
156 return nil, filename..": "..err 157 return nil, filename..": "..err
157 end 158 end
diff --git a/src/luarocks/manif_core.lua b/src/luarocks/manif_core.lua
index 6424a1e8..b9fe8ab9 100644
--- a/src/luarocks/manif_core.lua
+++ b/src/luarocks/manif_core.lua
@@ -22,8 +22,9 @@ function manifest_loader(file, repo_url, quick)
22 if not manifest then 22 if not manifest then
23 return nil, "Failed loading manifest for "..repo_url..": "..err 23 return nil, "Failed loading manifest for "..repo_url..": "..err
24 end 24 end
25 local globals = err
25 if not quick then 26 if not quick then
26 local ok, err = type_check.type_check_manifest(manifest) 27 local ok, err = type_check.type_check_manifest(manifest, globals)
27 if not ok then 28 if not ok then
28 return nil, "Error checking manifest: "..err 29 return nil, "Error checking manifest: "..err
29 end 30 end
diff --git a/src/luarocks/persist.lua b/src/luarocks/persist.lua
index 5b92f9cb..8f07da75 100644
--- a/src/luarocks/persist.lua
+++ b/src/luarocks/persist.lua
@@ -20,6 +20,15 @@ function load_into_table(filename, tbl)
20 20
21 local result, chunk, ran, err 21 local result, chunk, ran, err
22 local result = tbl or {} 22 local result = tbl or {}
23 local globals = {}
24 local globals_mt = {
25 __index = function(t, n)
26 globals[n] = true
27 return rawget(t, n)
28 end
29 }
30 local save_mt = getmetatable(result)
31 setmetatable(result, globals_mt)
23 if _VERSION == "Lua 5.1" then -- Lua 5.1 32 if _VERSION == "Lua 5.1" then -- Lua 5.1
24 chunk, err = loadfile(filename) 33 chunk, err = loadfile(filename)
25 if chunk then 34 if chunk then
@@ -32,6 +41,7 @@ function load_into_table(filename, tbl)
32 ran, err = pcall(chunk) 41 ran, err = pcall(chunk)
33 end 42 end
34 end 43 end
44 setmetatable(result, save_mt)
35 45
36 if not chunk then 46 if not chunk then
37 if err:sub(1,5) ~= filename:sub(1,5) then 47 if err:sub(1,5) ~= filename:sub(1,5) then
@@ -42,7 +52,7 @@ function load_into_table(filename, tbl)
42 if not ran then 52 if not ran then
43 return nil, "Error running file: "..err 53 return nil, "Error running file: "..err
44 end 54 end
45 return result 55 return result, globals
46end 56end
47 57
48local write_table 58local write_table
diff --git a/src/luarocks/type_check.lua b/src/luarocks/type_check.lua
index a3d41efc..bf063bf9 100644
--- a/src/luarocks/type_check.lua
+++ b/src/luarocks/type_check.lua
@@ -5,9 +5,9 @@ module("luarocks.type_check", package.seeall)
5 5
6local cfg = require("luarocks.cfg") 6local cfg = require("luarocks.cfg")
7 7
8rockspec_format = "1.0" 8local rockspec_format = "1.0"
9 9
10rockspec_types = { 10local rockspec_types = {
11 rockspec_format = "string", 11 rockspec_format = "string",
12 MUST_package = "string", 12 MUST_package = "string",
13 MUST_version = "[%w.]+-[%d]+", 13 MUST_version = "[%w.]+-[%d]+",
@@ -97,7 +97,7 @@ rockspec_types.external_dependencies.platforms.ANY = rockspec_types.external_dep
97rockspec_types.MUST_source.platforms.ANY = rockspec_types.MUST_source 97rockspec_types.MUST_source.platforms.ANY = rockspec_types.MUST_source
98rockspec_types.hooks.platforms.ANY = rockspec_types.hooks 98rockspec_types.hooks.platforms.ANY = rockspec_types.hooks
99 99
100manifest_types = { 100local manifest_types = {
101 MUST_repository = { 101 MUST_repository = {
102 -- packages 102 -- packages
103 ANY = { 103 ANY = {
@@ -248,18 +248,35 @@ type_check_table = function(tbl, types, context)
248 return true 248 return true
249end 249end
250 250
251local function check_undeclared_globals(globals, types)
252 local undeclared = {}
253 for glob, _ in pairs(globals) do
254 if not (types[glob] or types["MUST_"..glob]) then
255 table.insert(undeclared, glob)
256 end
257 end
258 if #undeclared == 1 then
259 return nil, "Unknown variable: "..undeclared[1]
260 elseif #undeclared > 1 then
261 return nil, "Unknown variables: "..table.concat(undeclared, ", ")
262 end
263 return true
264end
265
251--- Type check a rockspec table. 266--- Type check a rockspec table.
252-- Verify the correctness of elements from a 267-- Verify the correctness of elements from a
253-- rockspec table, reporting on unknown fields and type 268-- rockspec table, reporting on unknown fields and type
254-- mismatches. 269-- mismatches.
255-- @return boolean or (nil, string): true if type checking 270-- @return boolean or (nil, string): true if type checking
256-- succeeded, or nil and an error message if it failed. 271-- succeeded, or nil and an error message if it failed.
257function type_check_rockspec(rockspec) 272function type_check_rockspec(rockspec, globals)
258 assert(type(rockspec) == "table") 273 assert(type(rockspec) == "table")
259 if rockspec.rockspec_format then 274 if rockspec.rockspec_format then
260 -- relies on global state 275 -- relies on global state
261 load_extensions() 276 load_extensions()
262 end 277 end
278 local ok, err = check_undeclared_globals(globals, rockspec_types)
279 if not ok then return nil, err end
263 return type_check_table(rockspec, rockspec_types, "") 280 return type_check_table(rockspec, rockspec_types, "")
264end 281end
265 282
@@ -269,7 +286,9 @@ end
269-- mismatches. 286-- mismatches.
270-- @return boolean or (nil, string): true if type checking 287-- @return boolean or (nil, string): true if type checking
271-- succeeded, or nil and an error message if it failed. 288-- succeeded, or nil and an error message if it failed.
272function type_check_manifest(manifest) 289function type_check_manifest(manifest, globals)
273 assert(type(manifest) == "table") 290 assert(type(manifest) == "table")
291 local ok, err = check_undeclared_globals(globals, manifest_types)
292 if not ok then return nil, err end
274 return type_check_table(manifest, manifest_types, "") 293 return type_check_table(manifest, manifest_types, "")
275end 294end