diff options
| author | Hisham Muhammad <hisham@gobolinux.org> | 2019-06-03 15:59:29 -0300 |
|---|---|---|
| committer | Hisham Muhammad <hisham@gobolinux.org> | 2019-06-03 18:48:42 -0300 |
| commit | daf7e7e5f5ede8c3a5a00e2edaf8246209712781 (patch) | |
| tree | b6435881ad91881de672f0281e59e0913d51c576 | |
| parent | f7eb8df5363430a2b5ac288da5710ff382c632fe (diff) | |
| download | luarocks-daf7e7e5f5ede8c3a5a00e2edaf8246209712781.tar.gz luarocks-daf7e7e5f5ede8c3a5a00e2edaf8246209712781.tar.bz2 luarocks-daf7e7e5f5ede8c3a5a00e2edaf8246209712781.zip | |
Fix and reorganize Lua version detection
Make it more robust when detecting the Lua version when working inside a
project, and hopefully make the detection logic easier to track in the
code. Reorganized code so that the `detected` table becomes internal
to the `init_config` operation and only the regular `cfg` global table
is used after that.
Includes regression tests.
| -rw-r--r-- | spec/cmd_spec.lua | 70 | ||||
| -rw-r--r-- | src/luarocks/cmd.lua | 312 | ||||
| -rw-r--r-- | src/luarocks/core/cfg.lua | 10 |
3 files changed, 233 insertions, 159 deletions
diff --git a/spec/cmd_spec.lua b/spec/cmd_spec.lua index 70b9625d..21b25fe5 100644 --- a/spec/cmd_spec.lua +++ b/spec/cmd_spec.lua | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | local test_env = require("spec.util.test_env") | 1 | local test_env = require("spec.util.test_env") |
| 2 | local lfs = require("lfs") | ||
| 2 | local run = test_env.run | 3 | local run = test_env.run |
| 3 | 4 | ||
| 4 | test_env.unload_luarocks() | 5 | test_env.unload_luarocks() |
| @@ -31,4 +32,73 @@ describe("LuaRocks command line #integration", function() | |||
| 31 | end) | 32 | end) |
| 32 | end) | 33 | end) |
| 33 | 34 | ||
| 35 | describe("--lua-dir", function() | ||
| 36 | it("fails if given an invalid path", function() | ||
| 37 | local output = run.luarocks("--lua-dir=/bad/lua/path") | ||
| 38 | assert.match("Lua interpreter not found at /bad/lua/path", output, 1, true) | ||
| 39 | end) | ||
| 40 | |||
| 41 | it("fails if given a valid path without Lua", function() | ||
| 42 | local output = run.luarocks("--lua-dir=.") | ||
| 43 | assert.match("Lua interpreter not found at .", output, 1, true) | ||
| 44 | end) | ||
| 45 | |||
| 46 | it("passes if given a valid path with Lua", function() | ||
| 47 | assert.truthy(run.luarocks("--lua-dir=" .. test_env.testing_paths.luadir)) | ||
| 48 | end) | ||
| 49 | end) | ||
| 50 | |||
| 51 | describe("--lua-version", function() | ||
| 52 | it("warns but continues if given an invalid version", function() | ||
| 53 | local output = run.luarocks("--lua-version=1.0") | ||
| 54 | assert.match("Warning: Could not find a Lua 1.0 interpreter", output, 1, true) | ||
| 55 | assert.match("Lua version: 1.0", output, 1, true) | ||
| 56 | end) | ||
| 57 | |||
| 58 | it("sets the version independently of project tree", function() | ||
| 59 | test_env.run_in_tmp(function(tmpdir) | ||
| 60 | assert.truthy(run.luarocks_bool("init --lua-version=" .. test_env.lua_version .. " --lua-versions=" .. test_env.lua_version)) | ||
| 61 | |||
| 62 | local output = run.luarocks("--lua-version=1.0") | ||
| 63 | assert.match("Lua version: 1.0", output, 1, true) | ||
| 64 | |||
| 65 | output = run.luarocks("--lua-version=1.0 --project-tree=.") | ||
| 66 | assert.match("Lua version: 1.0", output, 1, true) | ||
| 67 | end, finally) | ||
| 68 | end) | ||
| 69 | end) | ||
| 70 | |||
| 71 | it("detects version based on project tree", function() | ||
| 72 | test_env.run_in_tmp(function(tmpdir) | ||
| 73 | assert.truthy(run.luarocks_bool("init --lua-version=" .. test_env.lua_version)) | ||
| 74 | assert.truthy(run.luarocks_bool("config lua_version 1.0 --project-tree=" .. tmpdir .. "/lua_modules")) | ||
| 75 | |||
| 76 | lfs.mkdir("aaa") | ||
| 77 | lfs.chdir("aaa") | ||
| 78 | lfs.mkdir("bbb") | ||
| 79 | lfs.chdir("bbb") | ||
| 80 | |||
| 81 | local output = run.luarocks("") | ||
| 82 | assert.match("Lua version: 1.0", output, 1, true) | ||
| 83 | end, finally) | ||
| 84 | end) | ||
| 85 | |||
| 86 | -- for backward compatibility | ||
| 87 | it("detects version of a project based on config", function() | ||
| 88 | test_env.run_in_tmp(function(tmpdir) | ||
| 89 | assert.truthy(run.luarocks_bool("init --lua-version=" .. test_env.lua_version)) | ||
| 90 | os.remove(".luarocks/config-" .. test_env.lua_version .. ".lua") | ||
| 91 | os.remove(".luarocks/default-lua-version.lua") | ||
| 92 | test_env.write_file(".luarocks/config-5.2.lua", [[ ]], finally) | ||
| 93 | |||
| 94 | lfs.mkdir("aaa") | ||
| 95 | lfs.chdir("aaa") | ||
| 96 | lfs.mkdir("bbb") | ||
| 97 | lfs.chdir("bbb") | ||
| 98 | |||
| 99 | local output = run.luarocks("") | ||
| 100 | assert.match("Lua version: 5.2", output, 1, true) | ||
| 101 | end, finally) | ||
| 102 | end) | ||
| 103 | |||
| 34 | end) | 104 | end) |
diff --git a/src/luarocks/cmd.lua b/src/luarocks/cmd.lua index bbbdcba1..08505129 100644 --- a/src/luarocks/cmd.lua +++ b/src/luarocks/cmd.lua | |||
| @@ -36,19 +36,6 @@ local function check_popen() | |||
| 36 | end | 36 | end |
| 37 | end | 37 | end |
| 38 | 38 | ||
| 39 | local function check_if_config_is_present(detected, try) | ||
| 40 | local versions = detected.lua_version | ||
| 41 | and { detected.lua_version } | ||
| 42 | or util.lua_versions("descending") | ||
| 43 | return fun.find(versions, function(v) | ||
| 44 | if util.exists(dir.path(try, ".luarocks", "config-"..v..".lua")) then | ||
| 45 | detected.project_dir = try | ||
| 46 | detected.lua_version = v | ||
| 47 | return detected | ||
| 48 | end | ||
| 49 | end) | ||
| 50 | end | ||
| 51 | |||
| 52 | local process_tree_flags | 39 | local process_tree_flags |
| 53 | do | 40 | do |
| 54 | local function replace_tree(flags, root, tree) | 41 | local function replace_tree(flags, root, tree) |
| @@ -152,32 +139,153 @@ local function process_server_flags(flags) | |||
| 152 | return true | 139 | return true |
| 153 | end | 140 | end |
| 154 | 141 | ||
| 155 | local function get_lua_version(flags) | 142 | local function error_handler(err) |
| 156 | if flags["lua-version"] then | 143 | local mode = "Arch.: " .. (cfg and cfg.arch or "unknown") |
| 157 | return flags["lua-version"] | 144 | if package.config:sub(1, 1) == "\\" then |
| 145 | if cfg and cfg.fs_use_modules then | ||
| 146 | mode = mode .. " (fs_use_modules = true)" | ||
| 147 | end | ||
| 158 | end | 148 | end |
| 159 | local dirs = {} | 149 | return debug.traceback("LuaRocks "..cfg.program_version.. |
| 160 | if flags["project-tree"] then | 150 | " bug (please report at https://github.com/luarocks/luarocks/issues).\n".. |
| 161 | table.insert(dirs, dir.path(flags["project-tree"], "..", ".luarocks")) | 151 | mode.."\n"..err, 2) |
| 152 | end | ||
| 153 | |||
| 154 | --- Display an error message and exit. | ||
| 155 | -- @param message string: The error message. | ||
| 156 | -- @param exitcode number: the exitcode to use | ||
| 157 | local function die(message, exitcode) | ||
| 158 | assert(type(message) == "string", "bad error, expected string, got: " .. type(message)) | ||
| 159 | util.printerr("\nError: "..message) | ||
| 160 | |||
| 161 | local ok, err = xpcall(util.run_scheduled_functions, error_handler) | ||
| 162 | if not ok then | ||
| 163 | util.printerr("\nError: "..err) | ||
| 164 | exitcode = cmd.errorcodes.CRASH | ||
| 162 | end | 165 | end |
| 163 | if cfg.home_tree then | 166 | |
| 164 | table.insert(dirs, dir.path(cfg.home_tree, ".luarocks")) | 167 | os.exit(exitcode or cmd.errorcodes.UNSPECIFIED) |
| 168 | end | ||
| 169 | |||
| 170 | local init_config | ||
| 171 | do | ||
| 172 | local detect_config_via_flags | ||
| 173 | do | ||
| 174 | local function find_project_dir(project_tree) | ||
| 175 | if project_tree then | ||
| 176 | return project_tree:gsub("[/\\][^/\\]+$", "") | ||
| 177 | else | ||
| 178 | local try = "." | ||
| 179 | for _ = 1, 10 do -- FIXME detect when root dir was hit instead | ||
| 180 | if util.exists(try .. "/.luarocks") and util.exists(try .. "/lua_modules") then | ||
| 181 | return try | ||
| 182 | elseif util.exists(try .. "/.luarocks-no-project") then | ||
| 183 | break | ||
| 184 | end | ||
| 185 | try = try .. "/.." | ||
| 186 | end | ||
| 187 | end | ||
| 188 | return nil | ||
| 189 | end | ||
| 190 | |||
| 191 | local function find_default_lua_version(flags, project_dir) | ||
| 192 | local dirs = {} | ||
| 193 | if project_dir then | ||
| 194 | table.insert(dirs, dir.path(project_dir, ".luarocks")) | ||
| 195 | end | ||
| 196 | if cfg.home_tree then | ||
| 197 | table.insert(dirs, dir.path(cfg.home_tree, ".luarocks")) | ||
| 198 | end | ||
| 199 | table.insert(dirs, cfg.sysconfdir) | ||
| 200 | for _, d in ipairs(dirs) do | ||
| 201 | local f = dir.path(d, "default-lua-version.lua") | ||
| 202 | local mod, err = loadfile(f, "t") | ||
| 203 | if mod then | ||
| 204 | local pok, ver = pcall(mod) | ||
| 205 | if pok and type(ver) == "string" and ver:match("%d+.%d+") then | ||
| 206 | if flags["verbose"] then | ||
| 207 | util.printout("Defaulting to Lua " .. ver .. " based on " .. f .. " ...") | ||
| 208 | end | ||
| 209 | return ver | ||
| 210 | end | ||
| 211 | end | ||
| 212 | end | ||
| 213 | return nil | ||
| 214 | end | ||
| 215 | |||
| 216 | local function find_version_from_config(dirname) | ||
| 217 | return fun.find(util.lua_versions("descending"), function(v) | ||
| 218 | if util.exists(dir.path(dirname, ".luarocks", "config-"..v..".lua")) then | ||
| 219 | return v | ||
| 220 | end | ||
| 221 | end) | ||
| 222 | end | ||
| 223 | |||
| 224 | local function detect_lua_via_flags(flags, project_dir) | ||
| 225 | local lua_version = flags["lua-version"] | ||
| 226 | or find_default_lua_version(flags, project_dir) | ||
| 227 | or (project_dir and find_version_from_config(project_dir)) | ||
| 228 | |||
| 229 | if flags["lua-dir"] then | ||
| 230 | local detected, err = util.find_lua(flags["lua-dir"], lua_version) | ||
| 231 | if not detected then | ||
| 232 | die(err) | ||
| 233 | end | ||
| 234 | return detected | ||
| 235 | end | ||
| 236 | |||
| 237 | if lua_version then | ||
| 238 | local path_sep = (package.config:sub(1, 1) == "\\" and ";" or ":") | ||
| 239 | for bindir in os.getenv("PATH"):gmatch("[^"..path_sep.."]+") do | ||
| 240 | local parentdir = bindir:gsub("[\\/][^\\/]+[\\/]?$", "") | ||
| 241 | local detected = util.find_lua(dir.path(parentdir), lua_version) | ||
| 242 | if detected then | ||
| 243 | return detected | ||
| 244 | end | ||
| 245 | detected = util.find_lua(bindir, lua_version) | ||
| 246 | if detected then | ||
| 247 | return detected | ||
| 248 | end | ||
| 249 | end | ||
| 250 | return { | ||
| 251 | lua_version = lua_version, | ||
| 252 | } | ||
| 253 | end | ||
| 254 | |||
| 255 | return {} | ||
| 256 | end | ||
| 257 | |||
| 258 | detect_config_via_flags = function(flags) | ||
| 259 | local project_dir = find_project_dir(flags["project-tree"]) | ||
| 260 | local detected = detect_lua_via_flags(flags, project_dir) | ||
| 261 | detected.project_dir = project_dir | ||
| 262 | return detected | ||
| 263 | end | ||
| 165 | end | 264 | end |
| 166 | table.insert(dirs, cfg.sysconfdir) | 265 | |
| 167 | for _, d in ipairs(dirs) do | 266 | init_config = function(flags) |
| 168 | local f = dir.path(d, "default-lua-version.lua") | 267 | local detected = detect_config_via_flags(flags) |
| 169 | local mod, err = loadfile(f, "t") | 268 | |
| 170 | if mod then | 269 | -- FIXME A quick hack for the experimental Windows build |
| 171 | local pok, ver = pcall(mod) | 270 | if os.getenv("LUAROCKS_CROSS_COMPILING") then |
| 172 | if pok and type(ver) == "string" and ver:match("%d+.%d+") then | 271 | cfg.each_platform = function() |
| 173 | if flags["verbose"] then | 272 | local i = 0 |
| 174 | util.printout("Defaulting to Lua " .. ver .. " based on " .. f .. " ...") | 273 | local plats = { "unix", "linux" } |
| 274 | return function() | ||
| 275 | i = i + 1 | ||
| 276 | return plats[i] | ||
| 175 | end | 277 | end |
| 176 | return ver | ||
| 177 | end | 278 | end |
| 279 | fs.init() | ||
| 280 | end | ||
| 281 | |||
| 282 | local ok, err = cfg.init(detected, util.warning) | ||
| 283 | if not ok then | ||
| 284 | return nil, err | ||
| 178 | end | 285 | end |
| 286 | |||
| 287 | return (detected.lua_dir ~= nil) | ||
| 179 | end | 288 | end |
| 180 | return nil | ||
| 181 | end | 289 | end |
| 182 | 290 | ||
| 183 | --- Main command-line processor. | 291 | --- Main command-line processor. |
| @@ -192,34 +300,6 @@ function cmd.run_command(description, commands, external_namespace, ...) | |||
| 192 | 300 | ||
| 193 | check_popen() | 301 | check_popen() |
| 194 | 302 | ||
| 195 | local function error_handler(err) | ||
| 196 | local mode = "Arch.: " .. (cfg and cfg.arch or "unknown") | ||
| 197 | if package.config:sub(1, 1) == "\\" then | ||
| 198 | if cfg and cfg.fs_use_modules then | ||
| 199 | mode = mode .. " (fs_use_modules = true)" | ||
| 200 | end | ||
| 201 | end | ||
| 202 | return debug.traceback("LuaRocks "..cfg.program_version.. | ||
| 203 | " bug (please report at https://github.com/luarocks/luarocks/issues).\n".. | ||
| 204 | mode.."\n"..err, 2) | ||
| 205 | end | ||
| 206 | |||
| 207 | --- Display an error message and exit. | ||
| 208 | -- @param message string: The error message. | ||
| 209 | -- @param exitcode number: the exitcode to use | ||
| 210 | local function die(message, exitcode) | ||
| 211 | assert(type(message) == "string", "bad error, expected string, got: " .. type(message)) | ||
| 212 | util.printerr("\nError: "..message) | ||
| 213 | |||
| 214 | local ok, err = xpcall(util.run_scheduled_functions, error_handler) | ||
| 215 | if not ok then | ||
| 216 | util.printerr("\nError: "..err) | ||
| 217 | exitcode = cmd.errorcodes.CRASH | ||
| 218 | end | ||
| 219 | |||
| 220 | os.exit(exitcode or cmd.errorcodes.UNSPECIFIED) | ||
| 221 | end | ||
| 222 | |||
| 223 | local function process_arguments(...) | 303 | local function process_arguments(...) |
| 224 | local args = {...} | 304 | local args = {...} |
| 225 | local cmdline_vars = {} | 305 | local cmdline_vars = {} |
| @@ -285,122 +365,44 @@ function cmd.run_command(description, commands, external_namespace, ...) | |||
| 285 | end | 365 | end |
| 286 | end | 366 | end |
| 287 | 367 | ||
| 288 | local lua_version = get_lua_version(flags) | ||
| 289 | |||
| 290 | if flags["deps-mode"] and not deps.check_deps_mode_flag(flags["deps-mode"]) then | 368 | if flags["deps-mode"] and not deps.check_deps_mode_flag(flags["deps-mode"]) then |
| 291 | die("Invalid entry for --deps-mode.") | 369 | die("Invalid entry for --deps-mode.") |
| 292 | end | 370 | end |
| 293 | 371 | ||
| 294 | local lua_found = false | ||
| 295 | |||
| 296 | local detected | ||
| 297 | if flags["lua-dir"] then | ||
| 298 | local err | ||
| 299 | detected, err = util.find_lua(flags["lua-dir"], lua_version) | ||
| 300 | if not detected then | ||
| 301 | die(err) | ||
| 302 | end | ||
| 303 | lua_found = true | ||
| 304 | assert(detected.lua_version) | ||
| 305 | assert(detected.lua_dir) | ||
| 306 | elseif lua_version then | ||
| 307 | local path_sep = (package.config:sub(1, 1) == "\\" and ";" or ":") | ||
| 308 | for bindir in os.getenv("PATH"):gmatch("[^"..path_sep.."]+") do | ||
| 309 | local parentdir = bindir:gsub("[\\/][^\\/]+[\\/]?$", "") | ||
| 310 | detected = util.find_lua(dir.path(parentdir), lua_version) | ||
| 311 | if detected then | ||
| 312 | break | ||
| 313 | end | ||
| 314 | detected = util.find_lua(bindir, lua_version) | ||
| 315 | if detected then | ||
| 316 | break | ||
| 317 | end | ||
| 318 | end | ||
| 319 | if detected then | ||
| 320 | lua_found = true | ||
| 321 | else | ||
| 322 | detected = { | ||
| 323 | lua_version = lua_version, | ||
| 324 | } | ||
| 325 | end | ||
| 326 | end | ||
| 327 | |||
| 328 | if flags["project-tree"] then | ||
| 329 | local project_tree = flags["project-tree"]:gsub("[/\\][^/\\]+$", "") | ||
| 330 | detected = detected or {} | ||
| 331 | detected.project_dir = project_tree | ||
| 332 | local d = check_if_config_is_present(detected, project_tree) | ||
| 333 | if d then | ||
| 334 | detected = d | ||
| 335 | end | ||
| 336 | else | ||
| 337 | detected = detected or {} | ||
| 338 | local try = "." | ||
| 339 | for _ = 1, 10 do -- FIXME detect when root dir was hit instead | ||
| 340 | if util.exists(try .. "/.luarocks") and util.exists(try .. "/lua_modules") then | ||
| 341 | local d = check_if_config_is_present(detected, try) | ||
| 342 | if d then | ||
| 343 | detected = d | ||
| 344 | break | ||
| 345 | end | ||
| 346 | elseif util.exists(try .. "/.luarocks-no-project") then | ||
| 347 | break | ||
| 348 | end | ||
| 349 | try = try .. "/.." | ||
| 350 | end | ||
| 351 | end | ||
| 352 | |||
| 353 | -- FIXME A quick hack for the experimental Windows build | ||
| 354 | if os.getenv("LUAROCKS_CROSS_COMPILING") then | ||
| 355 | cfg.each_platform = function() | ||
| 356 | local i = 0 | ||
| 357 | local plats = { "unix", "linux" } | ||
| 358 | return function() | ||
| 359 | i = i + 1 | ||
| 360 | return plats[i] | ||
| 361 | end | ||
| 362 | end | ||
| 363 | fs.init() | ||
| 364 | end | ||
| 365 | |||
| 366 | ----------------------------------------------------------------------------- | 372 | ----------------------------------------------------------------------------- |
| 367 | local ok, err = cfg.init(detected, util.warning) | 373 | local lua_found, err = init_config(flags) |
| 368 | if not ok then | 374 | if err then |
| 369 | die(err) | 375 | die(err) |
| 370 | end | 376 | end |
| 371 | ----------------------------------------------------------------------------- | 377 | ----------------------------------------------------------------------------- |
| 372 | 378 | ||
| 373 | fs.init() | 379 | if flags["version"] then |
| 380 | util.printout(program.." "..cfg.program_version) | ||
| 381 | util.printout(description) | ||
| 382 | util.printout() | ||
| 383 | os.exit(cmd.errorcodes.OK) | ||
| 384 | end | ||
| 374 | 385 | ||
| 375 | lua_version = cfg.lua_version | 386 | fs.init() |
| 376 | 387 | ||
| 388 | -- if the Lua interpreter wasn't explicitly found before cfg.init, | ||
| 389 | -- try again now. | ||
| 377 | if not lua_found then | 390 | if not lua_found then |
| 378 | if cfg.variables.LUA_DIR then | 391 | if cfg.variables.LUA_DIR then |
| 379 | local found = util.find_lua(cfg.variables.LUA_DIR, cfg.lua_version) | 392 | lua_found = util.find_lua(cfg.variables.LUA_DIR, cfg.lua_version) |
| 380 | if found then | ||
| 381 | lua_found = true | ||
| 382 | end | ||
| 383 | end | 393 | end |
| 384 | end | 394 | end |
| 385 | 395 | ||
| 386 | if not lua_found then | 396 | if not lua_found then |
| 387 | util.warning("Could not find a Lua interpreter for version " .. | 397 | util.warning("Could not find a Lua " .. cfg.lua_version .. " interpreter in your PATH. " .. |
| 388 | lua_version .. " in your PATH. " .. | ||
| 389 | "Modules may not install with the correct configurations. " .. | 398 | "Modules may not install with the correct configurations. " .. |
| 390 | "You may want to specify to the path prefix to your build " .. | 399 | "You may want to specify to the path prefix to your build " .. |
| 391 | "of Lua " .. lua_version .. " using --lua-dir") | 400 | "of Lua " .. cfg.lua_version .. " using --lua-dir") |
| 392 | end | 401 | end |
| 393 | cfg.lua_found = lua_found | 402 | cfg.lua_found = lua_found |
| 394 | 403 | ||
| 395 | if detected.project_dir then | 404 | if cfg.project_dir then |
| 396 | detected.project_dir = fs.absolute_name(detected.project_dir) | 405 | cfg.project_dir = fs.absolute_name(cfg.project_dir) |
| 397 | end | ||
| 398 | |||
| 399 | if flags["version"] then | ||
| 400 | util.printout(program.." "..cfg.program_version) | ||
| 401 | util.printout(description) | ||
| 402 | util.printout() | ||
| 403 | os.exit(cmd.errorcodes.OK) | ||
| 404 | end | 406 | end |
| 405 | 407 | ||
| 406 | for _, module_name in ipairs(fs.modules(external_namespace)) do | 408 | for _, module_name in ipairs(fs.modules(external_namespace)) do |
| @@ -418,7 +420,7 @@ function cmd.run_command(description, commands, external_namespace, ...) | |||
| 418 | die("Current directory does not exist. Please run LuaRocks from an existing directory.") | 420 | die("Current directory does not exist. Please run LuaRocks from an existing directory.") |
| 419 | end | 421 | end |
| 420 | 422 | ||
| 421 | ok, err = process_tree_flags(flags, detected.project_dir) | 423 | ok, err = process_tree_flags(flags, cfg.project_dir) |
| 422 | if not ok then | 424 | if not ok then |
| 423 | die(err) | 425 | die(err) |
| 424 | end | 426 | end |
diff --git a/src/luarocks/core/cfg.lua b/src/luarocks/core/cfg.lua index 02fb564b..d8442962 100644 --- a/src/luarocks/core/cfg.lua +++ b/src/luarocks/core/cfg.lua | |||
| @@ -561,6 +561,7 @@ function cfg.init(detected, warning) | |||
| 561 | local lua_incdir = detected.lua_incdir or hardcoded.LUA_INCDIR | 561 | local lua_incdir = detected.lua_incdir or hardcoded.LUA_INCDIR |
| 562 | local lua_libdir = detected.lua_libdir or hardcoded.LUA_LIBDIR | 562 | local lua_libdir = detected.lua_libdir or hardcoded.LUA_LIBDIR |
| 563 | local lua_dir = detected.lua_dir or hardcoded.LUA_DIR or (lua_bindir and lua_bindir:gsub("[\\/]bin$", "")) | 563 | local lua_dir = detected.lua_dir or hardcoded.LUA_DIR or (lua_bindir and lua_bindir:gsub("[\\/]bin$", "")) |
| 564 | local project_dir = detected.project_dir | ||
| 564 | 565 | ||
| 565 | local init = cfg.init | 566 | local init = cfg.init |
| 566 | 567 | ||
| @@ -636,8 +637,8 @@ function cfg.init(detected, warning) | |||
| 636 | local name = "config-"..cfg.lua_version..".lua" | 637 | local name = "config-"..cfg.lua_version..".lua" |
| 637 | sys_config_file = (cfg.sysconfdir .. "/" .. name):gsub("\\", "/") | 638 | sys_config_file = (cfg.sysconfdir .. "/" .. name):gsub("\\", "/") |
| 638 | home_config_file = (cfg.homeconfdir .. "/" .. name):gsub("\\", "/") | 639 | home_config_file = (cfg.homeconfdir .. "/" .. name):gsub("\\", "/") |
| 639 | if detected.project_dir then | 640 | if project_dir then |
| 640 | project_config_file = detected.project_dir .. "/.luarocks/" .. name | 641 | project_config_file = project_dir .. "/.luarocks/" .. name |
| 641 | end | 642 | end |
| 642 | end | 643 | end |
| 643 | 644 | ||
| @@ -680,7 +681,7 @@ function cfg.init(detected, warning) | |||
| 680 | end | 681 | end |
| 681 | 682 | ||
| 682 | -- finally, use the project-specific config file if any | 683 | -- finally, use the project-specific config file if any |
| 683 | if detected.project_dir then | 684 | if project_dir then |
| 684 | project_config_ok, err = load_config_file(cfg, platforms, project_config_file) | 685 | project_config_ok, err = load_config_file(cfg, platforms, project_config_file) |
| 685 | if err then | 686 | if err then |
| 686 | return nil, err, "config" | 687 | return nil, err, "config" |
| @@ -694,6 +695,7 @@ function cfg.init(detected, warning) | |||
| 694 | ---------------------------------------- | 695 | ---------------------------------------- |
| 695 | 696 | ||
| 696 | -- Settings detected or given via the CLI (i.e. --lua-dir) take precedence over config files: | 697 | -- Settings detected or given via the CLI (i.e. --lua-dir) take precedence over config files: |
| 698 | cfg.project_dir = detected.project_dir | ||
| 697 | cfg.lua_version = detected.lua_version or cfg.lua_version | 699 | cfg.lua_version = detected.lua_version or cfg.lua_version |
| 698 | cfg.luajit_version = detected.luajit_version or cfg.luajit_version | 700 | cfg.luajit_version = detected.luajit_version or cfg.luajit_version |
| 699 | cfg.lua_interpreter = detected.lua_interpreter or cfg.lua_interpreter | 701 | cfg.lua_interpreter = detected.lua_interpreter or cfg.lua_interpreter |
| @@ -731,7 +733,7 @@ function cfg.init(detected, warning) | |||
| 731 | cfg.user_agent = "LuaRocks/"..cfg.program_version.." "..cfg.arch | 733 | cfg.user_agent = "LuaRocks/"..cfg.program_version.." "..cfg.arch |
| 732 | 734 | ||
| 733 | cfg.config_files = { | 735 | cfg.config_files = { |
| 734 | project = detected.project_dir and { | 736 | project = project_dir and { |
| 735 | file = project_config_file, | 737 | file = project_config_file, |
| 736 | found = not not project_config_ok, | 738 | found = not not project_config_ok, |
| 737 | }, | 739 | }, |
