diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2019-03-14 23:18:53 -0300 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2019-04-03 10:44:51 -0300 |
commit | a21fcdc434f7135b3be215bbab5ad08f1873d300 (patch) | |
tree | fba8bd24af0e34804954455acb567467d8586b13 | |
parent | 9c03508958522b2beeaa2aa289ad82e444d902d8 (diff) | |
download | luarocks-a21fcdc434f7135b3be215bbab5ad08f1873d300.tar.gz luarocks-a21fcdc434f7135b3be215bbab5ad08f1873d300.tar.bz2 luarocks-a21fcdc434f7135b3be215bbab5ad08f1873d300.zip |
config: add modes for reading, writing and unsetting individual entries
Includes special config keys `lua_dir` and `lua_version`,
which are essentially persistent versions of --lua-dir
and --lua-version:
* `lua_dir` writes a number of LUA_* variables and
cfg.lua_interpreter in the current scope's config file.
* `lua_version` writes default-lua-version.lua to the
given scope.
Also deprecates the "flag" versions for various getters:
* `--lua-incdir`: use `luarocks config variables.LUA_INCDIR`
* `--lua-libdir`: use `luarocks config variables.LUA_LIBDIR`
* `--lua-ver`: use `luarocks config lua_version`
* `--system-config`: use `luarocks config config_files.system.file`
* `--user-config`: use `luarocks config config_files.user.file`
* `--rock-trees`: use `luarocks config rocks_trees`
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | spec/config_spec.lua | 241 | ||||
-rw-r--r-- | src/luarocks/cmd.lua | 58 | ||||
-rw-r--r-- | src/luarocks/cmd/config.lua | 330 | ||||
-rw-r--r-- | src/luarocks/cmd/help.lua | 6 | ||||
-rw-r--r-- | src/luarocks/cmd/init.lua | 9 | ||||
-rw-r--r-- | src/luarocks/core/cfg.lua | 42 | ||||
-rw-r--r-- | src/luarocks/fs/lua.lua | 2 | ||||
-rw-r--r-- | src/luarocks/persist.lua | 35 | ||||
-rw-r--r-- | src/luarocks/upload/api.lua | 5 | ||||
-rw-r--r-- | src/luarocks/util.lua | 3 |
11 files changed, 534 insertions, 198 deletions
@@ -14,3 +14,4 @@ | |||
14 | /wiki | 14 | /wiki |
15 | /lua | 15 | /lua |
16 | /lua_modules | 16 | /lua_modules |
17 | /luarocks | ||
diff --git a/spec/config_spec.lua b/spec/config_spec.lua index defc1d2f..2e76ae0c 100644 --- a/spec/config_spec.lua +++ b/spec/config_spec.lua | |||
@@ -10,28 +10,58 @@ test_env.unload_luarocks() | |||
10 | 10 | ||
11 | describe("LuaRocks config tests #integration", function() | 11 | describe("LuaRocks config tests #integration", function() |
12 | 12 | ||
13 | before_each(function() | 13 | setup(function() |
14 | test_env.setup_specs() | 14 | test_env.setup_specs() |
15 | test_env.unload_luarocks() -- need to be required here, because hardcoded is created after first loading of specs | 15 | test_env.unload_luarocks() -- need to be required here, because hardcoded is created after first loading of specs |
16 | hardcoded = require("luarocks.core.hardcoded") | 16 | hardcoded = require("luarocks.core.hardcoded") |
17 | end) | 17 | end) |
18 | 18 | ||
19 | describe("LuaRocks config - basic tests", function() | 19 | describe("full configuration query", function() |
20 | it("LuaRocks config with no flags/arguments", function() | 20 | it("no flags/arguments", function() |
21 | assert.match("rocks_servers", run.luarocks("config")) | 21 | assert.match("rocks_servers = {", run.luarocks("config")) |
22 | end) | 22 | end) |
23 | 23 | ||
24 | it("LuaRocks config include dir returns a subdir of LUA_DIR", function() | 24 | it("--json", function() |
25 | assert.is_true(run.luarocks_nocov("install dkjson")) | ||
26 | finally(function() | ||
27 | assert.is_true(run.luarocks_nocov("remove dkjson")) | ||
28 | end) | ||
29 | assert.match('"rocks_servers":[', run.luarocks("config --json"), 1, true) | ||
30 | end) | ||
31 | |||
32 | it("--json fails without a json library", function() | ||
33 | assert.falsy(run.luarocks_bool("config --json")) | ||
34 | end) | ||
35 | |||
36 | it("with --tree respects custom config", function() | ||
37 | write_file("my_config.lua", [[ | ||
38 | rocks_trees = { | ||
39 | { | ||
40 | name = "system", | ||
41 | root = "/example/tree", | ||
42 | lua_dir = "/example/luadir", | ||
43 | }, | ||
44 | } | ||
45 | ]], finally) | ||
46 | local output = run.luarocks("config", {LUAROCKS_CONFIG = "my_config.lua"}) | ||
47 | assert.match([[deploy_lua_dir = "/example/luadir"]], output) | ||
48 | output = run.luarocks("config --tree=system", {LUAROCKS_CONFIG = "my_config.lua"}) | ||
49 | assert.match([[deploy_lua_dir = "/example/luadir"]], output) | ||
50 | end) | ||
51 | end) | ||
52 | |||
53 | describe("query flags", function() | ||
54 | it("--lua-incdir returns a subdir of LUA_DIR", function() | ||
25 | local output = run.luarocks("config --lua-incdir") | 55 | local output = run.luarocks("config --lua-incdir") |
26 | assert.match(hardcoded.LUA_DIR, output, 1, true) | 56 | assert.match(hardcoded.LUA_DIR, output, 1, true) |
27 | end) | 57 | end) |
28 | 58 | ||
29 | it("LuaRocks config library dir returns a subdir of LUA_DIR", function() | 59 | it("--lua-libdir returns a subdir of LUA_DIR", function() |
30 | local output = run.luarocks("config --lua-libdir") | 60 | local output = run.luarocks("config --lua-libdir") |
31 | assert.match(hardcoded.LUA_DIR, output, 1, true) | 61 | assert.match(hardcoded.LUA_DIR, output, 1, true) |
32 | end) | 62 | end) |
33 | 63 | ||
34 | it("LuaRocks config lua version", function() | 64 | it("--lua-ver returns the Lua version", function() |
35 | local output = run.luarocks("config --lua-ver") | 65 | local output = run.luarocks("config --lua-ver") |
36 | local lua_version = _VERSION:gsub("Lua ", "") | 66 | local lua_version = _VERSION:gsub("Lua ", "") |
37 | if test_env.LUAJIT_V then | 67 | if test_env.LUAJIT_V then |
@@ -40,77 +70,158 @@ describe("LuaRocks config tests #integration", function() | |||
40 | assert.are.same(lua_version, output) | 70 | assert.are.same(lua_version, output) |
41 | end) | 71 | end) |
42 | 72 | ||
43 | it("LuaRocks config rock trees", function() | 73 | it("--rock-trees lists rock trees", function() |
44 | assert.is_true(run.luarocks_bool("config --rock-trees")) | 74 | assert.is_true(run.luarocks_bool("config --rock-trees")) |
45 | end) | 75 | end) |
46 | 76 | ||
47 | it("LuaRocks config user config", function() | 77 | describe("--user-config", function() |
48 | local user_config_path = run.luarocks("config --user-config") | 78 | it("returns user config dir", function() |
49 | assert.is.truthy(lfs.attributes(user_config_path)) | 79 | local user_config_path = run.luarocks("config --user-config") |
50 | end) | 80 | assert.is.truthy(lfs.attributes(user_config_path)) |
81 | end) | ||
51 | 82 | ||
52 | it("LuaRocks config missing user config", function() | 83 | it("handles a missing user config", function() |
53 | local output = run.luarocks("config --user-config", {LUAROCKS_CONFIG = "missing_file.lua"}) | 84 | local output = run.luarocks("config --user-config", {LUAROCKS_CONFIG = "missing_file.lua"}) |
54 | assert.truthy(output:match("Warning")) | 85 | assert.match("Warning", output) |
86 | end) | ||
55 | end) | 87 | end) |
56 | 88 | ||
57 | it("LuaRocks config with --tree respects custom config", function() | 89 | describe("--system-config", function() |
58 | write_file("my_config.lua", [[ | 90 | local scdir = testing_paths.testing_lrprefix .. "/etc/luarocks" |
59 | rocks_trees = { | 91 | local configfile = scdir .. "/config-" .. env_variables.LUA_VERSION .. ".lua" |
60 | { | 92 | |
61 | name = "system", | 93 | it("fails if system config doesn't exist", function() |
62 | root = "/example/tree", | 94 | os.rename(configfile, configfile .. ".bak") |
63 | lua_dir = "/example/luadir", | 95 | finally(function() |
64 | }, | 96 | os.rename(configfile .. ".bak", configfile) |
65 | } | 97 | end) |
66 | ]], finally) | 98 | assert.is_false(run.luarocks_bool("config --system-config")) |
67 | local output = run.luarocks("config", {LUAROCKS_CONFIG = "my_config.lua"}) | 99 | end) |
68 | assert.match([[deploy_lua_dir = "/example/luadir"]], output) | 100 | |
69 | output = run.luarocks("config --tree=system", {LUAROCKS_CONFIG = "my_config.lua"}) | 101 | it("outputs the path of the system config", function() |
70 | assert.match([[deploy_lua_dir = "/example/luadir"]], output) | 102 | lfs.mkdir(testing_paths.testing_lrprefix) |
103 | lfs.mkdir(testing_paths.testing_lrprefix .. "/etc/") | ||
104 | lfs.mkdir(scdir) | ||
105 | |||
106 | local sysconfig = io.open(configfile, "w+") | ||
107 | sysconfig:write(" ") | ||
108 | sysconfig:close() | ||
109 | finally(function() | ||
110 | os.remove(configfile) | ||
111 | end) | ||
112 | |||
113 | local output = run.luarocks("config --system-config") | ||
114 | assert.are.same(configfile, output) | ||
115 | end) | ||
116 | |||
117 | it("fails if system config is invalid", function() | ||
118 | lfs.mkdir(testing_paths.testing_lrprefix) | ||
119 | lfs.mkdir(testing_paths.testing_lrprefix .. "/etc/") | ||
120 | lfs.mkdir(scdir) | ||
121 | |||
122 | local sysconfig = io.open(configfile, "w+") | ||
123 | sysconfig:write("if if if") | ||
124 | sysconfig:close() | ||
125 | finally(function() | ||
126 | os.remove(configfile) | ||
127 | end) | ||
128 | assert.is_false(run.luarocks_bool("config --system-config")) | ||
129 | end) | ||
71 | end) | 130 | end) |
72 | end) | 131 | end) |
73 | 132 | ||
74 | describe("LuaRocks config - more complex tests", function() | 133 | describe("read config keys", function() |
75 | local scdir = testing_paths.testing_lrprefix .. "/etc/luarocks" | 134 | it("reads a simple config key", function() |
76 | local configfile = scdir .. "/config-" .. env_variables.LUA_VERSION .. ".lua" | 135 | local output = run.luarocks("config user_agent") |
136 | assert.match("LuaRocks/", output) | ||
137 | end) | ||
77 | 138 | ||
78 | it("LuaRocks fail system config", function() | 139 | it("reads an array config key", function() |
79 | os.rename(configfile, configfile .. ".bak") | 140 | local output = run.luarocks("config rocks_trees[2]") |
80 | finally(function() | 141 | assert.match("{%s*name", output) |
81 | os.rename(configfile .. ".bak", configfile) | ||
82 | end) | ||
83 | assert.is_false(run.luarocks_bool("config --system-config")) | ||
84 | end) | 142 | end) |
85 | 143 | ||
86 | it("LuaRocks system config", function() | 144 | it("can read as JSON", function() |
87 | lfs.mkdir(testing_paths.testing_lrprefix) | 145 | assert.is_true(run.luarocks_nocov("install dkjson")) |
88 | lfs.mkdir(testing_paths.testing_lrprefix .. "/etc/") | ||
89 | lfs.mkdir(scdir) | ||
90 | |||
91 | local sysconfig = io.open(configfile, "w+") | ||
92 | sysconfig:write(" ") | ||
93 | sysconfig:close() | ||
94 | finally(function() | 146 | finally(function() |
95 | os.remove(configfile) | 147 | assert.is_true(run.luarocks_nocov("remove dkjson")) |
96 | end) | 148 | end) |
97 | 149 | local output = run.luarocks("config rocks_trees --json") | |
98 | local output = run.luarocks("config --system-config") | 150 | assert.match('^%["', output) |
99 | assert.are.same(configfile, output) | ||
100 | end) | 151 | end) |
101 | 152 | ||
102 | it("LuaRocks fail system config invalid", function() | 153 | it("--json does not work without a json library", function() |
103 | lfs.mkdir(testing_paths.testing_lrprefix) | 154 | assert.is_false(run.luarocks_bool("config rocks_trees --json")) |
104 | lfs.mkdir(testing_paths.testing_lrprefix .. "/etc/") | 155 | end) |
105 | lfs.mkdir(scdir) | 156 | |
106 | 157 | it("reads an array -> hash config key", function() | |
107 | local sysconfig = io.open(configfile, "w+") | 158 | local output = run.luarocks("config rocks_trees[2].name") |
108 | sysconfig:write("if if if") | 159 | assert.match("[a-z]+", output) |
109 | sysconfig:close() | ||
110 | finally(function() | ||
111 | os.remove(configfile) | ||
112 | end) | ||
113 | assert.is_false(run.luarocks_bool("config --system-config")) | ||
114 | end) | 160 | end) |
161 | |||
162 | it("reads a hash config key", function() | ||
163 | local output = run.luarocks("config variables.ICACLS") | ||
164 | assert.same("icacls", output) | ||
165 | end) | ||
166 | |||
167 | it("fails on invalid config key", function() | ||
168 | local output = run.luarocks("config xyz") | ||
169 | assert.match("Error: Unknown entry xyz", output) | ||
170 | end) | ||
171 | end) | ||
172 | |||
173 | describe("write config keys", function() | ||
174 | it("rejects invalid --scope", function() | ||
175 | assert.is_false(run.luarocks_bool("config web_browser foo --scope=foo")) | ||
176 | end) | ||
177 | |||
178 | it("reads an array config key", function() | ||
179 | local output = run.luarocks("config rocks_trees[2]") | ||
180 | assert.match("{%s*name", output) | ||
181 | end) | ||
182 | |||
183 | it("writes a simple config key", function() | ||
184 | test_env.run_in_tmp(function(tmpdir) | ||
185 | local myproject = tmpdir .. "/myproject" | ||
186 | lfs.mkdir(myproject) | ||
187 | lfs.chdir(myproject) | ||
188 | |||
189 | assert(run.luarocks("init")) | ||
190 | assert.truthy(run.luarocks_bool("config web_browser foo --scope=project")) | ||
191 | |||
192 | local output = run.luarocks("config web_browser") | ||
193 | assert.match("foo", output) | ||
194 | end, finally) | ||
195 | end) | ||
196 | |||
197 | it("writes a hash config key", function() | ||
198 | test_env.run_in_tmp(function(tmpdir) | ||
199 | local myproject = tmpdir .. "/myproject" | ||
200 | lfs.mkdir(myproject) | ||
201 | lfs.chdir(myproject) | ||
202 | |||
203 | assert(run.luarocks("init")) | ||
204 | assert.truthy(run.luarocks_bool("config variables.FOO_DIR /foo/bar --scope=project")) | ||
205 | |||
206 | local output = run.luarocks("config variables.FOO_DIR") | ||
207 | assert.match("/foo/bar", output) | ||
208 | end, finally) | ||
209 | end) | ||
210 | |||
211 | it("writes an array config key", function() | ||
212 | test_env.run_in_tmp(function(tmpdir) | ||
213 | local myproject = tmpdir .. "/myproject" | ||
214 | lfs.mkdir(myproject) | ||
215 | lfs.chdir(myproject) | ||
216 | |||
217 | assert(run.luarocks("init")) | ||
218 | assert.truthy(run.luarocks_bool("config external_deps_patterns.lib[1] testtest --scope=project")) | ||
219 | |||
220 | local output = run.luarocks("config external_deps_patterns.lib[1]") | ||
221 | assert.match("testtest", output) | ||
222 | end, finally) | ||
223 | end) | ||
224 | |||
115 | end) | 225 | end) |
226 | |||
116 | end) | 227 | end) |
diff --git a/src/luarocks/cmd.lua b/src/luarocks/cmd.lua index eb120c0b..d038852b 100644 --- a/src/luarocks/cmd.lua +++ b/src/luarocks/cmd.lua | |||
@@ -152,6 +152,33 @@ local function process_server_flags(flags) | |||
152 | return true | 152 | return true |
153 | end | 153 | end |
154 | 154 | ||
155 | local function get_lua_version(flags) | ||
156 | if flags["lua-version"] then | ||
157 | return flags["lua-version"] | ||
158 | end | ||
159 | local dirs = { | ||
160 | cfg.home_tree, | ||
161 | cfg.sysconfdir, | ||
162 | } | ||
163 | if flags["project-tree"] then | ||
164 | table.insert(dirs, 1, dir.path(flags["project-tree"], "..")) | ||
165 | end | ||
166 | for _, d in ipairs(dirs) do | ||
167 | local f = dir.path(d, ".luarocks", "default-lua-version.lua") | ||
168 | local mod, err = loadfile(f, "t") | ||
169 | if mod then | ||
170 | local pok, ver = pcall(mod) | ||
171 | if pok and type(ver) == "string" and ver:match("%d+.%d+") then | ||
172 | if flags["verbose"] then | ||
173 | util.printout("Defaulting to Lua " .. ver .. " based on " .. f .. " ...") | ||
174 | end | ||
175 | return ver | ||
176 | end | ||
177 | end | ||
178 | end | ||
179 | return nil | ||
180 | end | ||
181 | |||
155 | --- Main command-line processor. | 182 | --- Main command-line processor. |
156 | -- Parses input arguments and calls the appropriate driver function | 183 | -- Parses input arguments and calls the appropriate driver function |
157 | -- to execute the action requested on the command-line, forwarding | 184 | -- to execute the action requested on the command-line, forwarding |
@@ -249,6 +276,16 @@ function cmd.run_command(description, commands, external_namespace, ...) | |||
249 | end | 276 | end |
250 | command = command:gsub("-", "_") | 277 | command = command:gsub("-", "_") |
251 | 278 | ||
279 | if command == "config" then | ||
280 | if nonflags[1] == "lua_version" and nonflags[2] then | ||
281 | flags["lua-version"] = nonflags[2] | ||
282 | elseif nonflags[1] == "lua_dir" and nonflags[2] then | ||
283 | flags["lua-dir"] = nonflags[2] | ||
284 | end | ||
285 | end | ||
286 | |||
287 | local lua_version = get_lua_version(flags) | ||
288 | |||
252 | if flags["deps-mode"] and not deps.check_deps_mode_flag(flags["deps-mode"]) then | 289 | if flags["deps-mode"] and not deps.check_deps_mode_flag(flags["deps-mode"]) then |
253 | die("Invalid entry for --deps-mode.") | 290 | die("Invalid entry for --deps-mode.") |
254 | end | 291 | end |
@@ -256,47 +293,44 @@ function cmd.run_command(description, commands, external_namespace, ...) | |||
256 | local detected | 293 | local detected |
257 | if flags["lua-dir"] then | 294 | if flags["lua-dir"] then |
258 | local err | 295 | local err |
259 | detected, err = util.find_lua(flags["lua-dir"], flags["lua-version"]) | 296 | detected, err = util.find_lua(flags["lua-dir"], lua_version) |
260 | if not detected then | 297 | if not detected then |
261 | die(err) | 298 | die(err) |
262 | end | 299 | end |
263 | assert(detected.lua_version) | 300 | assert(detected.lua_version) |
264 | assert(detected.lua_dir) | 301 | assert(detected.lua_dir) |
265 | elseif flags["lua-version"] then | 302 | elseif lua_version then |
266 | local path_sep = (package.config:sub(1, 1) == "\\" and ";" or ":") | 303 | local path_sep = (package.config:sub(1, 1) == "\\" and ";" or ":") |
267 | for bindir in os.getenv("PATH"):gmatch("[^"..path_sep.."]+") do | 304 | for bindir in os.getenv("PATH"):gmatch("[^"..path_sep.."]+") do |
268 | local parentdir = bindir:gsub("[\\/][^\\/]+[\\/]?$", "") | 305 | local parentdir = bindir:gsub("[\\/][^\\/]+[\\/]?$", "") |
269 | detected = util.find_lua(dir.path(parentdir), flags["lua-version"]) | 306 | detected = util.find_lua(dir.path(parentdir), lua_version) |
270 | if detected then | 307 | if detected then |
271 | break | 308 | break |
272 | end | 309 | end |
273 | detected = util.find_lua(bindir, flags["lua-version"]) | 310 | detected = util.find_lua(bindir, lua_version) |
274 | if detected then | 311 | if detected then |
275 | break | 312 | break |
276 | end | 313 | end |
277 | end | 314 | end |
278 | if not detected then | 315 | if not detected then |
279 | util.warning("Could not find a Lua interpreter for version " .. | 316 | util.warning("Could not find a Lua interpreter for version " .. |
280 | flags["lua-version"] .. " in your PATH. " .. | 317 | lua_version .. " in your PATH. " .. |
281 | "Modules may not install with the correct configurations. " .. | 318 | "Modules may not install with the correct configurations. " .. |
282 | "You may want to specify to the path prefix to your build " .. | 319 | "You may want to specify to the path prefix to your build " .. |
283 | "of Lua " .. flags["lua-version"] .. " using --lua-dir") | 320 | "of Lua " .. lua_version .. " using --lua-dir") |
284 | detected = { | 321 | detected = { |
285 | lua_version = flags["lua-version"], | 322 | lua_version = lua_version, |
286 | } | 323 | } |
287 | end | 324 | end |
288 | end | 325 | end |
289 | 326 | ||
290 | if flags["project-tree"] then | 327 | if flags["project-tree"] then |
291 | local project_tree = flags["project-tree"]:gsub("[/\\][^/\\]+$", "") | 328 | local project_tree = flags["project-tree"]:gsub("[/\\][^/\\]+$", "") |
292 | detected = detected or { | 329 | detected = detected or {} |
293 | project_dir = project_tree | 330 | detected.project_dir = project_tree |
294 | } | ||
295 | local d = check_if_config_is_present(detected, project_tree) | 331 | local d = check_if_config_is_present(detected, project_tree) |
296 | if d then | 332 | if d then |
297 | detected = d | 333 | detected = d |
298 | else | ||
299 | detected.project_dir = nil | ||
300 | end | 334 | end |
301 | else | 335 | else |
302 | detected = detected or {} | 336 | detected = detected or {} |
diff --git a/src/luarocks/cmd/config.lua b/src/luarocks/cmd/config.lua index 794cc989..5c7cc6c9 100644 --- a/src/luarocks/cmd/config.lua +++ b/src/luarocks/cmd/config.lua | |||
@@ -2,26 +2,61 @@ | |||
2 | -- Queries information about the LuaRocks configuration. | 2 | -- Queries information about the LuaRocks configuration. |
3 | local config_cmd = {} | 3 | local config_cmd = {} |
4 | 4 | ||
5 | local persist = require("luarocks.persist") | ||
5 | local cfg = require("luarocks.core.cfg") | 6 | local cfg = require("luarocks.core.cfg") |
6 | local util = require("luarocks.util") | 7 | local util = require("luarocks.util") |
7 | local deps = require("luarocks.deps") | 8 | local deps = require("luarocks.deps") |
8 | local dir = require("luarocks.dir") | 9 | local dir = require("luarocks.dir") |
9 | local fun = require("luarocks.fun") | 10 | local fs = require("luarocks.fs") |
10 | 11 | ||
11 | config_cmd.help_summary = "Query information about the LuaRocks configuration." | 12 | config_cmd.help_summary = "Query information about the LuaRocks configuration." |
12 | config_cmd.help_arguments = "<flag>" | 13 | config_cmd.help_arguments = "(<key> | <key> <value> --scope=<scope> | <key> --unset --scope=<scope> | )" |
13 | config_cmd.help = [[ | 14 | config_cmd.help = [[ |
14 | --lua-incdir Path to Lua header files. | 15 | * When given a configuration key, it prints the value of that key |
16 | according to the currently active configuration (taking into account | ||
17 | all config files and any command-line flags passed) | ||
15 | 18 | ||
16 | --lua-libdir Path to Lua library files. | 19 | Examples: |
20 | luarocks config lua_interpreter | ||
21 | luarocks config variables.LUA_INCDIR | ||
22 | luarocks config lua_version | ||
17 | 23 | ||
18 | --lua-ver Lua version (in major.minor format). e.g. 5.1 | 24 | * When given a configuration key and a value, |
25 | it overwrites the config file (see the --scope option below to determine which) | ||
26 | and replaces the value of the given key with the given value. | ||
19 | 27 | ||
20 | --system-config Location of the system config file. | 28 | * `lua_dir` is a special key as it checks for a valid Lua installation |
29 | (equivalent to --lua-dir) and sets several keys at once. | ||
30 | * `lua_version` is a special key as it changes the default Lua version | ||
31 | used by LuaRocks commands (eqivalent to passing --lua-version). | ||
21 | 32 | ||
22 | --user-config Location of the user config file. | 33 | Examples: |
34 | luarocks config variables.OPENSSL_DIR /usr/local/openssl | ||
35 | luarocks config lua_dir /usr/local | ||
36 | luarocks config lua_version 5.3 | ||
23 | 37 | ||
24 | --rock-trees Rocks trees in use. First the user tree, then the system tree. | 38 | * When given a configuration key and --unset, |
39 | it overwrites the config file (see the --scope option below to determine which) | ||
40 | and deletes that key from the file. | ||
41 | |||
42 | Example: luarocks config variables.OPENSSL_DIR --unset | ||
43 | |||
44 | * When given no arguments, it prints the entire currently active | ||
45 | configuration, resulting from reading the config files from | ||
46 | all scopes. | ||
47 | |||
48 | Example: luarocks config | ||
49 | |||
50 | OPTIONS | ||
51 | --scope=<scope> The scope indicates which config file should be rewritten. | ||
52 | Accepted values are "system", "user" or "project". | ||
53 | * Using a wrapper created with `luarocks init`, | ||
54 | the default is "project". | ||
55 | * Using --local (or when `local_by_default` is `true`), | ||
56 | the default is "user". | ||
57 | * Otherwise, the default is "system". | ||
58 | |||
59 | --json Output as JSON | ||
25 | ]] | 60 | ]] |
26 | config_cmd.help_see_also = [[ | 61 | config_cmd.help_see_also = [[ |
27 | https://github.com/luarocks/luarocks/wiki/Config-file-format | 62 | https://github.com/luarocks/luarocks/wiki/Config-file-format |
@@ -30,35 +65,13 @@ config_cmd.help_see_also = [[ | |||
30 | 65 | ||
31 | local function config_file(conf) | 66 | local function config_file(conf) |
32 | print(dir.normalize(conf.file)) | 67 | print(dir.normalize(conf.file)) |
33 | if conf.ok then | 68 | if conf.found then |
34 | return true | 69 | return true |
35 | else | 70 | else |
36 | return nil, "file not found" | 71 | return nil, "file not found" |
37 | end | 72 | end |
38 | end | 73 | end |
39 | 74 | ||
40 | local function printf(fmt, ...) | ||
41 | print((fmt):format(...)) | ||
42 | end | ||
43 | |||
44 | local cfg_maps = { | ||
45 | external_deps_patterns = true, | ||
46 | external_deps_subdirs = true, | ||
47 | rocks_provided = true, | ||
48 | rocks_provided_3_0 = true, | ||
49 | runtime_external_deps_patterns = true, | ||
50 | runtime_external_deps_subdirs = true, | ||
51 | upload = true, | ||
52 | variables = true, | ||
53 | } | ||
54 | |||
55 | local cfg_arrays = { | ||
56 | disabled_servers = true, | ||
57 | external_deps_dirs = true, | ||
58 | rocks_trees = true, | ||
59 | rocks_servers = true, | ||
60 | } | ||
61 | |||
62 | local cfg_skip = { | 75 | local cfg_skip = { |
63 | errorcodes = true, | 76 | errorcodes = true, |
64 | flags = true, | 77 | flags = true, |
@@ -67,60 +80,163 @@ local cfg_skip = { | |||
67 | upload_servers = true, | 80 | upload_servers = true, |
68 | } | 81 | } |
69 | 82 | ||
70 | local function print_config(cfg) | 83 | local function should_skip(k, v) |
71 | for k, v in util.sortedpairs(cfg) do | 84 | return type(v) == "function" or cfg_skip[k] |
72 | k = tostring(k) | 85 | end |
73 | if type(v) == "string" or type(v) == "number" then | 86 | |
74 | printf("%s = %q", k, v) | 87 | local function cleanup(tbl) |
75 | elseif type(v) == "boolean" then | 88 | local copy = {} |
76 | printf("%s = %s", k, tostring(v)) | 89 | for k, v in pairs(tbl) do |
77 | elseif type(v) == "function" or cfg_skip[k] then | 90 | if not should_skip(k, v) then |
78 | -- skip | 91 | copy[k] = v |
79 | elseif cfg_maps[k] then | 92 | end |
80 | printf("%s = {", k) | 93 | end |
81 | for kk, vv in util.sortedpairs(v) do | 94 | return copy |
82 | local keyfmt = kk:match("^[a-zA-Z_][a-zA-Z0-9_]*$") and "%s" or "[%q]" | 95 | end |
83 | if type(vv) == "table" then | 96 | |
84 | local qvs = fun.map(vv, function(e) return string.format("%q", e) end) | 97 | local function traverse_varstring(var, tbl, fn, missing_parent) |
85 | printf(" "..keyfmt.." = {%s},", kk, table.concat(qvs, ", ")) | 98 | local k, r = var:match("^%[([0-9]+)%]%.(.*)$") |
99 | if k then | ||
100 | k = tonumber(k) | ||
101 | else | ||
102 | k, r = var:match("^([^.[]+)%.(.*)$") | ||
103 | if not k then | ||
104 | k, r = var:match("^([^[]+)(%[.*)$") | ||
105 | end | ||
106 | end | ||
107 | |||
108 | if k then | ||
109 | if not tbl[k] and missing_parent then | ||
110 | missing_parent(tbl, k) | ||
111 | end | ||
112 | |||
113 | if tbl[k] then | ||
114 | return traverse_varstring(r, tbl[k], fn, missing_parent) | ||
115 | else | ||
116 | return nil, "Unknown entry " .. k | ||
117 | end | ||
118 | end | ||
119 | |||
120 | local i = var:match("^%[([0-9]+)%]$") | ||
121 | if i then | ||
122 | var = tonumber(i) | ||
123 | end | ||
124 | |||
125 | return fn(tbl, var) | ||
126 | end | ||
127 | |||
128 | local function print_json(value) | ||
129 | local json_ok, json = util.require_json() | ||
130 | if not json_ok then | ||
131 | return nil, "A JSON library is required for this command. "..json | ||
132 | end | ||
133 | |||
134 | print(json.encode(value)) | ||
135 | return true | ||
136 | end | ||
137 | |||
138 | local function print_entry(var, tbl, is_json) | ||
139 | return traverse_varstring(var, tbl, function(t, k) | ||
140 | if not t[k] then | ||
141 | return nil, "Unknown entry " .. k | ||
142 | end | ||
143 | local val = t[k] | ||
144 | |||
145 | if not should_skip(var, val) then | ||
146 | if is_json then | ||
147 | return print_json(val) | ||
148 | elseif type(val) == "string" then | ||
149 | print(val) | ||
150 | else | ||
151 | persist.write_value(io.stdout, val) | ||
152 | end | ||
153 | end | ||
154 | return true | ||
155 | end) | ||
156 | end | ||
157 | |||
158 | local function infer_type(var) | ||
159 | local typ | ||
160 | traverse_varstring(var, cfg, function(t, k) | ||
161 | if t[k] ~= nil then | ||
162 | typ = type(t[k]) | ||
163 | end | ||
164 | end) | ||
165 | return typ | ||
166 | end | ||
167 | |||
168 | local function write_entries(keys, scope, do_unset) | ||
169 | if scope == "project" and not cfg.config_files.project then | ||
170 | return nil, "Current directory is not part of a project. You may want to run `luarocks init`." | ||
171 | end | ||
172 | |||
173 | local tbl, err = persist.load_config_file_if_basic(cfg.config_files[scope].file, cfg) | ||
174 | if not tbl then | ||
175 | return nil, err | ||
176 | end | ||
177 | |||
178 | for var, val in util.sortedpairs(keys) do | ||
179 | traverse_varstring(var, tbl, function(t, k) | ||
180 | if do_unset then | ||
181 | t[k] = nil | ||
182 | else | ||
183 | local typ = infer_type(var) | ||
184 | local v | ||
185 | if typ == "number" and tonumber(val) then | ||
186 | v = tonumber(val) | ||
187 | elseif typ == "boolean" and val == "true" then | ||
188 | v = true | ||
189 | elseif typ == "boolean" and val == "false" then | ||
190 | v = false | ||
86 | else | 191 | else |
87 | printf(" "..keyfmt.." = %q,", kk, vv) | 192 | v = val |
88 | end | 193 | end |
194 | t[k] = v | ||
195 | keys[var] = v | ||
89 | end | 196 | end |
90 | printf("}") | 197 | return true |
91 | elseif cfg_arrays[k] then | 198 | end, function(p, k) |
92 | if #v == 0 then | 199 | p[k] = {} |
93 | printf("%s = {}", k) | 200 | end) |
201 | end | ||
202 | |||
203 | local ok, err = persist.save_from_table(cfg.config_files[scope].file, tbl) | ||
204 | if ok then | ||
205 | print(do_unset and "Removed" or "Wrote") | ||
206 | for var, val in util.sortedpairs(keys) do | ||
207 | if do_unset then | ||
208 | print(("\t%s"):format(var)) | ||
94 | else | 209 | else |
95 | printf("%s = {", k) | 210 | print(("\t%s = %q"):format(var, val)) |
96 | for _, vv in ipairs(v) do | ||
97 | if type(vv) == "string" then | ||
98 | printf(" %q,", vv) | ||
99 | elseif type(vv) == "table" then | ||
100 | printf(" {") | ||
101 | if next(vv) == 1 then | ||
102 | for _, v3 in ipairs(vv) do | ||
103 | printf(" %q,", v3) | ||
104 | end | ||
105 | else | ||
106 | for k3, v3 in util.sortedpairs(vv) do | ||
107 | local keyfmt = tostring(k3):match("^[a-zA-Z_][a-zA-Z0-9_]*$") and "%s" or "[%q]" | ||
108 | printf(" "..keyfmt.." = %q,", k3, v3) | ||
109 | end | ||
110 | end | ||
111 | printf(" },") | ||
112 | end | ||
113 | end | ||
114 | printf("}") | ||
115 | end | 211 | end |
116 | end | 212 | end |
213 | print(do_unset and "from" or "to") | ||
214 | print("\t" .. cfg.config_files[scope].file) | ||
215 | return true | ||
216 | else | ||
217 | return nil, err | ||
218 | end | ||
219 | end | ||
220 | |||
221 | local function check_scope(flags) | ||
222 | local scope = flags["scope"] | ||
223 | or (flags["local"] and "user") | ||
224 | or (flags["project-tree"] and "project") | ||
225 | or (cfg.local_by_default and "user") | ||
226 | or "system" | ||
227 | if scope ~= "system" and scope ~= "user" and scope ~= "project" then | ||
228 | return nil, "Valid values for scope are: system, user, project" | ||
117 | end | 229 | end |
230 | |||
231 | return scope | ||
118 | end | 232 | end |
119 | 233 | ||
120 | --- Driver function for "config" command. | 234 | --- Driver function for "config" command. |
121 | -- @return boolean: True if succeeded, nil on errors. | 235 | -- @return boolean: True if succeeded, nil on errors. |
122 | function config_cmd.command(flags) | 236 | function config_cmd.command(flags, var, val) |
123 | deps.check_lua(cfg.variables) | 237 | deps.check_lua(cfg.variables) |
238 | |||
239 | -- deprecated flags | ||
124 | if flags["lua-incdir"] then | 240 | if flags["lua-incdir"] then |
125 | print(cfg.variables.LUA_INCDIR) | 241 | print(cfg.variables.LUA_INCDIR) |
126 | return true | 242 | return true |
@@ -133,12 +249,11 @@ function config_cmd.command(flags) | |||
133 | print(cfg.lua_version) | 249 | print(cfg.lua_version) |
134 | return true | 250 | return true |
135 | end | 251 | end |
136 | local conf = cfg.which_config() | ||
137 | if flags["system-config"] then | 252 | if flags["system-config"] then |
138 | return config_file(conf.system) | 253 | return config_file(cfg.config_files.system) |
139 | end | 254 | end |
140 | if flags["user-config"] then | 255 | if flags["user-config"] then |
141 | return config_file(conf.user) | 256 | return config_file(cfg.config_files.user) |
142 | end | 257 | end |
143 | if flags["rock-trees"] then | 258 | if flags["rock-trees"] then |
144 | for _, tree in ipairs(cfg.rocks_trees) do | 259 | for _, tree in ipairs(cfg.rocks_trees) do |
@@ -151,9 +266,68 @@ function config_cmd.command(flags) | |||
151 | end | 266 | end |
152 | return true | 267 | return true |
153 | end | 268 | end |
269 | |||
270 | if var == "lua_version" and val then | ||
271 | local scope, err = check_scope(flags) | ||
272 | if not scope then | ||
273 | return nil, err | ||
274 | end | ||
275 | |||
276 | if scope == "project" and not cfg.config_files.project then | ||
277 | return nil, "Current directory is not part of a project. You may want to run `luarocks init`." | ||
278 | end | ||
279 | |||
280 | local prefix = dir.dir_name(cfg.config_files[scope].file) | ||
281 | local ok, err = fs.make_dir(prefix) | ||
282 | if not ok then | ||
283 | return nil, "could not set default Lua version: " .. err | ||
284 | end | ||
285 | local fd, err = io.open(dir.path(prefix, "default-lua-version.lua"), "w") | ||
286 | if not fd then | ||
287 | return nil, "could not set default Lua version: " .. err | ||
288 | end | ||
289 | |||
290 | fd:write('return "' .. val .. '"\n') | ||
291 | fd:close() | ||
292 | print("Lua version will default to " .. val .. " in " .. prefix) | ||
293 | end | ||
154 | 294 | ||
155 | print_config(cfg) | 295 | if var == "lua_dir" and val then |
156 | return true | 296 | local scope, err = check_scope(flags) |
297 | if not scope then | ||
298 | return nil, err | ||
299 | end | ||
300 | local keys = { | ||
301 | ["variables.LUA_DIR"] = cfg.variables.LUA_DIR, | ||
302 | ["variables.LUA_BINDIR"] = cfg.variables.LUA_BINDIR, | ||
303 | ["variables.LUA_INCDIR"] = cfg.variables.LUA_INCDIR, | ||
304 | ["variables.LUA_LIBDIR"] = cfg.variables.LUA_LIBDIR, | ||
305 | ["lua_interpreter"] = cfg.lua_interpreter, | ||
306 | } | ||
307 | return write_entries(keys, scope, flags["unset"]) | ||
308 | end | ||
309 | |||
310 | if var then | ||
311 | if val or flags["unset"] then | ||
312 | local scope, err = check_scope(flags) | ||
313 | if not scope then | ||
314 | return nil, err | ||
315 | end | ||
316 | |||
317 | return write_entries({ [var] = val }, scope, flags["unset"]) | ||
318 | else | ||
319 | return print_entry(var, cfg, flags["json"]) | ||
320 | end | ||
321 | end | ||
322 | |||
323 | local cleancfg = cleanup(cfg) | ||
324 | |||
325 | if flags["json"] then | ||
326 | return print_json(cleancfg) | ||
327 | else | ||
328 | print(persist.save_from_table_to_string(cleancfg)) | ||
329 | return true | ||
330 | end | ||
157 | end | 331 | end |
158 | 332 | ||
159 | return config_cmd | 333 | return config_cmd |
diff --git a/src/luarocks/cmd/help.lua b/src/luarocks/cmd/help.lua index e5f1b799..dcc9e358 100644 --- a/src/luarocks/cmd/help.lua +++ b/src/luarocks/cmd/help.lua | |||
@@ -90,14 +90,14 @@ function help.command(description, commands, command) | |||
90 | util.printout() | 90 | util.printout() |
91 | util.printout("\tConfiguration files:") | 91 | util.printout("\tConfiguration files:") |
92 | local conf = cfg.config_files | 92 | local conf = cfg.config_files |
93 | util.printout("\t\tSystem : ".. dir.normalize(conf.system.file) .. " (" .. get_status(conf.system.ok) ..")") | 93 | util.printout("\t\tSystem : ".. dir.normalize(conf.system.file) .. " (" .. get_status(conf.system.found) ..")") |
94 | if conf.user.file then | 94 | if conf.user.file then |
95 | util.printout("\t\tUser : ".. dir.normalize(conf.user.file) .. " (" .. get_status(conf.user.ok) ..")") | 95 | util.printout("\t\tUser : ".. dir.normalize(conf.user.file) .. " (" .. get_status(conf.user.found) ..")") |
96 | else | 96 | else |
97 | util.printout("\t\tUser : disabled in this LuaRocks installation.") | 97 | util.printout("\t\tUser : disabled in this LuaRocks installation.") |
98 | end | 98 | end |
99 | if conf.project then | 99 | if conf.project then |
100 | util.printout("\t\tProject : ".. dir.normalize(conf.project.file) .. " (" .. get_status(conf.project.ok) ..")") | 100 | util.printout("\t\tProject : ".. dir.normalize(conf.project.file) .. " (" .. get_status(conf.project.found) ..")") |
101 | end | 101 | end |
102 | util.printout() | 102 | util.printout() |
103 | util.printout("\tRocks trees in use: ") | 103 | util.printout("\tRocks trees in use: ") |
diff --git a/src/luarocks/cmd/init.lua b/src/luarocks/cmd/init.lua index b1bb3b51..3b8c9fea 100644 --- a/src/luarocks/cmd/init.lua +++ b/src/luarocks/cmd/init.lua | |||
@@ -92,14 +92,7 @@ function init.command(flags, name, version) | |||
92 | 92 | ||
93 | if flags["reset"] then | 93 | if flags["reset"] then |
94 | fs.delete(lua_wrapper) | 94 | fs.delete(lua_wrapper) |
95 | for v in util.lua_versions() do | 95 | fs.delete(dir.path(".luarocks", "default_lua_version.lua")) |
96 | local config_file = dir.path(".luarocks", "config-"..v..".lua") | ||
97 | if v ~= cfg.lua_version then | ||
98 | fs.move(config_file, config_file .. "~") | ||
99 | else | ||
100 | fs.delete(config_file) | ||
101 | end | ||
102 | end | ||
103 | end | 96 | end |
104 | 97 | ||
105 | util.printout("Adding entries to .gitignore ...") | 98 | util.printout("Adding entries to .gitignore ...") |
diff --git a/src/luarocks/core/cfg.lua b/src/luarocks/core/cfg.lua index 0c2e3f67..af4327c6 100644 --- a/src/luarocks/core/cfg.lua +++ b/src/luarocks/core/cfg.lua | |||
@@ -728,33 +728,31 @@ function cfg.init(detected, warning) | |||
728 | cfg.variables.LUA = cfg.variables.LUA or (cfg.variables.LUA_BINDIR and (cfg.variables.LUA_BINDIR .. "/" .. cfg.lua_interpreter):gsub("//", "/")) | 728 | cfg.variables.LUA = cfg.variables.LUA or (cfg.variables.LUA_BINDIR and (cfg.variables.LUA_BINDIR .. "/" .. cfg.lua_interpreter):gsub("//", "/")) |
729 | cfg.user_agent = "LuaRocks/"..cfg.program_version.." "..cfg.arch | 729 | cfg.user_agent = "LuaRocks/"..cfg.program_version.." "..cfg.arch |
730 | 730 | ||
731 | cfg.config_files = { | ||
732 | project = detected.project_dir and { | ||
733 | file = project_config_file, | ||
734 | found = not not project_config_ok, | ||
735 | }, | ||
736 | system = { | ||
737 | file = sys_config_file, | ||
738 | found = not not sys_config_ok, | ||
739 | }, | ||
740 | user = { | ||
741 | file = home_config_file, | ||
742 | found = not not home_config_ok, | ||
743 | }, | ||
744 | nearest = project_config_ok | ||
745 | and project_config_file | ||
746 | or (home_config_ok | ||
747 | and home_config_file | ||
748 | or sys_config_file), | ||
749 | } | ||
750 | |||
731 | ---------------------------------------- | 751 | ---------------------------------------- |
732 | -- Attributes of cfg are set. | 752 | -- Attributes of cfg are set. |
733 | -- Let's add some methods. | 753 | -- Let's add some methods. |
734 | ---------------------------------------- | 754 | ---------------------------------------- |
735 | 755 | ||
736 | function cfg.which_config() | ||
737 | return { | ||
738 | project = detected.project_dir and { | ||
739 | file = project_config_file, | ||
740 | ok = project_config_ok, | ||
741 | }, | ||
742 | system = { | ||
743 | file = sys_config_file, | ||
744 | ok = sys_config_ok, | ||
745 | }, | ||
746 | user = { | ||
747 | file = home_config_file, | ||
748 | ok = home_config_ok, | ||
749 | }, | ||
750 | nearest = project_config_ok | ||
751 | and project_config_file | ||
752 | or (home_config_ok | ||
753 | and home_config_file | ||
754 | or sys_config_file), | ||
755 | } | ||
756 | end | ||
757 | |||
758 | do | 756 | do |
759 | local function make_paths_from_tree(tree) | 757 | local function make_paths_from_tree(tree) |
760 | local lua_path, lib_path, bin_path | 758 | local lua_path, lib_path, bin_path |
diff --git a/src/luarocks/fs/lua.lua b/src/luarocks/fs/lua.lua index 0273cd53..71529cc0 100644 --- a/src/luarocks/fs/lua.lua +++ b/src/luarocks/fs/lua.lua | |||
@@ -114,7 +114,7 @@ function fs_lua.is_tool_available(tool_cmd, tool_name, arg) | |||
114 | if not fs.execute_quiet(tool_cmd, arg) then | 114 | if not fs.execute_quiet(tool_cmd, arg) then |
115 | local msg = "'%s' program not found. Make sure %s is installed and is available in your PATH " .. | 115 | local msg = "'%s' program not found. Make sure %s is installed and is available in your PATH " .. |
116 | "(or you may want to edit the 'variables.%s' value in file '%s')" | 116 | "(or you may want to edit the 'variables.%s' value in file '%s')" |
117 | return nil, msg:format(tool_cmd, tool_name, tool_name:upper(), cfg.which_config().nearest) | 117 | return nil, msg:format(tool_cmd, tool_name, tool_name:upper(), cfg.config_files.nearest) |
118 | else | 118 | else |
119 | return true | 119 | return true |
120 | end | 120 | end |
diff --git a/src/luarocks/persist.lua b/src/luarocks/persist.lua index 73f92bea..b8060ea0 100644 --- a/src/luarocks/persist.lua +++ b/src/luarocks/persist.lua | |||
@@ -20,8 +20,9 @@ local write_table | |||
20 | -- @param level number: the indentation level | 20 | -- @param level number: the indentation level |
21 | -- @param sub_order table: optional prioritization table | 21 | -- @param sub_order table: optional prioritization table |
22 | -- @see write_table | 22 | -- @see write_table |
23 | local function write_value(out, v, level, sub_order) | 23 | function persist.write_value(out, v, level, sub_order) |
24 | if type(v) == "table" then | 24 | if type(v) == "table" then |
25 | level = level or 0 | ||
25 | write_table(out, v, level + 1, sub_order) | 26 | write_table(out, v, level + 1, sub_order) |
26 | elseif type(v) == "string" then | 27 | elseif type(v) == "string" then |
27 | if v:match("[\r\n]") then | 28 | if v:match("[\r\n]") then |
@@ -80,7 +81,7 @@ local function write_table_key_assignment(out, k, level) | |||
80 | out:write(k) | 81 | out:write(k) |
81 | else | 82 | else |
82 | out:write("[") | 83 | out:write("[") |
83 | write_value(out, k, level) | 84 | persist.write_value(out, k, level) |
84 | out:write("]") | 85 | out:write("]") |
85 | end | 86 | end |
86 | 87 | ||
@@ -112,7 +113,7 @@ write_table = function(out, tbl, level, field_order) | |||
112 | write_table_key_assignment(out, k, level) | 113 | write_table_key_assignment(out, k, level) |
113 | end | 114 | end |
114 | 115 | ||
115 | write_value(out, v, level, sub_order) | 116 | persist.write_value(out, v, level, sub_order) |
116 | if type(v) == "number" then | 117 | if type(v) == "number" then |
117 | sep = ", " | 118 | sep = ", " |
118 | indent = false | 119 | indent = false |
@@ -139,13 +140,13 @@ local function write_table_as_assignments(out, tbl, field_order) | |||
139 | return nil, "cannot store '"..tostring(k).."' as a plain key." | 140 | return nil, "cannot store '"..tostring(k).."' as a plain key." |
140 | end | 141 | end |
141 | out:write(k.." = ") | 142 | out:write(k.." = ") |
142 | write_value(out, v, 0, sub_order) | 143 | persist.write_value(out, v, 0, sub_order) |
143 | out:write("\n") | 144 | out:write("\n") |
144 | end | 145 | end |
145 | return true | 146 | return true |
146 | end | 147 | end |
147 | 148 | ||
148 | --- Write a table as series of assignments to a writer object. | 149 | --- Write a table using Lua table syntax to a writer object. |
149 | -- @param out table or userdata: a writer object supporting :write() method. | 150 | -- @param out table or userdata: a writer object supporting :write() method. |
150 | -- @param tbl table: the table to be written. | 151 | -- @param tbl table: the table to be written. |
151 | local function write_table_as_table(out, tbl) | 152 | local function write_table_as_table(out, tbl) |
@@ -153,7 +154,7 @@ local function write_table_as_table(out, tbl) | |||
153 | for k, v, sub_order in util.sortedpairs(tbl) do | 154 | for k, v, sub_order in util.sortedpairs(tbl) do |
154 | out:write(" ") | 155 | out:write(" ") |
155 | write_table_key_assignment(out, k, 1) | 156 | write_table_key_assignment(out, k, 1) |
156 | write_value(out, v, 1, sub_order) | 157 | persist.write_value(out, v, 1, sub_order) |
157 | out:write(",\n") | 158 | out:write(",\n") |
158 | end | 159 | end |
159 | out:write("}\n") | 160 | out:write("}\n") |
@@ -216,4 +217,26 @@ function persist.save_as_module(filename, tbl) | |||
216 | return true | 217 | return true |
217 | end | 218 | end |
218 | 219 | ||
220 | function persist.load_config_file_if_basic(filename, cfg) | ||
221 | local env = { | ||
222 | home = cfg.home | ||
223 | } | ||
224 | local result, err, errcode = persist.load_into_table(filename, env) | ||
225 | if errcode == "load" or errcode == "run" then | ||
226 | -- bad config file or depends on env, so error out | ||
227 | return nil, "Could not read existing config file " .. filename | ||
228 | end | ||
229 | |||
230 | local tbl | ||
231 | if errcode == "open" then | ||
232 | -- could not open, maybe file does not exist | ||
233 | tbl = {} | ||
234 | else | ||
235 | tbl = result | ||
236 | tbl.home = nil | ||
237 | end | ||
238 | |||
239 | return tbl | ||
240 | end | ||
241 | |||
219 | return persist | 242 | return persist |
diff --git a/src/luarocks/upload/api.lua b/src/luarocks/upload/api.lua index bb2197ee..0e71432f 100644 --- a/src/luarocks/upload/api.lua +++ b/src/luarocks/upload/api.lua | |||
@@ -11,11 +11,10 @@ local multipart = require("luarocks.upload.multipart") | |||
11 | local Api = {} | 11 | local Api = {} |
12 | 12 | ||
13 | local function upload_config_file() | 13 | local function upload_config_file() |
14 | local conf = cfg.which_config() | 14 | if not cfg.config_files.user.file then |
15 | if not conf.user.file then | ||
16 | return nil | 15 | return nil |
17 | end | 16 | end |
18 | return (conf.user.file:gsub("/[^/]+$", "/upload_config.lua")) | 17 | return (cfg.config_files.user.file:gsub("/[^/]+$", "/upload_config.lua")) |
19 | end | 18 | end |
20 | 19 | ||
21 | function Api:load_config() | 20 | function Api:load_config() |
diff --git a/src/luarocks/util.lua b/src/luarocks/util.lua index aac52344..1714952e 100644 --- a/src/luarocks/util.lua +++ b/src/luarocks/util.lua | |||
@@ -106,6 +106,7 @@ local supported_flags = { | |||
106 | ["homepage"] = "\"<url>\"", | 106 | ["homepage"] = "\"<url>\"", |
107 | ["index"] = true, | 107 | ["index"] = true, |
108 | ["issues"] = true, | 108 | ["issues"] = true, |
109 | ["json"] = true, | ||
109 | ["keep"] = true, | 110 | ["keep"] = true, |
110 | ["labels"] = true, | 111 | ["labels"] = true, |
111 | ["lib"] = "<library>", | 112 | ["lib"] = "<library>", |
@@ -149,6 +150,7 @@ local supported_flags = { | |||
149 | ["rock-trees"] = true, | 150 | ["rock-trees"] = true, |
150 | ["rockspec"] = true, | 151 | ["rockspec"] = true, |
151 | ["rockspec-format"] = "<ver>", | 152 | ["rockspec-format"] = "<ver>", |
153 | ["scope"] = "<system|user|project>", | ||
152 | ["server"] = "<server>", | 154 | ["server"] = "<server>", |
153 | ["sign"] = true, | 155 | ["sign"] = true, |
154 | ["skip-pack"] = true, | 156 | ["skip-pack"] = true, |
@@ -161,6 +163,7 @@ local supported_flags = { | |||
161 | ["timeout"] = "<seconds>", | 163 | ["timeout"] = "<seconds>", |
162 | ["to"] = "<path>", | 164 | ["to"] = "<path>", |
163 | ["tree"] = "<path>", | 165 | ["tree"] = "<path>", |
166 | ["unset"] = true, | ||
164 | ["user-config"] = true, | 167 | ["user-config"] = true, |
165 | ["verbose"] = true, | 168 | ["verbose"] = true, |
166 | ["verify"] = true, | 169 | ["verify"] = true, |