aboutsummaryrefslogtreecommitdiff
path: root/src/luarocks/command_line.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/luarocks/command_line.lua')
-rw-r--r--src/luarocks/command_line.lua133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/luarocks/command_line.lua b/src/luarocks/command_line.lua
new file mode 100644
index 00000000..b3020284
--- /dev/null
+++ b/src/luarocks/command_line.lua
@@ -0,0 +1,133 @@
1
2program_version = "1.0"
3
4--- Functions for command-line scripts.
5module("luarocks.command_line", package.seeall)
6
7local util = require("luarocks.util")
8local cfg = require("luarocks.cfg")
9local fs = require("luarocks.fs")
10
11--- Display an error message and exit.
12-- @param message string: The error message.
13local function die(message)
14 assert(type(message) == "string")
15
16 local ok, err = pcall(util.run_scheduled_functions)
17 if not ok then
18 print("\nLuaRocks "..program_version.." internal bug (please report at luarocks-developers@lists.luaforge.net):\n"..err)
19 end
20 print("\nError: "..message)
21 os.exit(1)
22end
23
24--- Main command-line processor.
25-- Parses input arguments and calls the appropriate driver function
26-- to execute the action requested on the command-line, forwarding
27-- to it any additional arguments passed by the user.
28-- Uses the global table "commands", which contains
29-- the loaded modules representing commands.
30-- @param ... string: Arguments given on the command-line.
31function run_command(...)
32 local args = {...}
33 local cmdline_vars = {}
34 for i = #args, 1, -1 do
35 local arg = args[i]
36 if arg:match("^[^-][^=]*=") then
37 local var, val = arg:match("^([A-Z_][A-Z0-9_]*)=(.*)")
38 if val then
39 cmdline_vars[var] = val
40 table.remove(args, i)
41 else
42 die("Invalid assignment: "..arg)
43 end
44 end
45 end
46 local nonflags = { util.parse_flags(unpack(args)) }
47 local flags = table.remove(nonflags, 1)
48
49 if flags["to"] then
50 if flags["to"] == true then
51 die("Argument error: use --to=<path>")
52 end
53 local root_dir = fs.absolute_name(flags["to"])
54 cfg.root_dir = root_dir
55 cfg.rocks_dir = root_dir.."/rocks"
56 cfg.scripts_dir = root_dir.."/bin"
57 else
58 local trees = cfg.rocks_trees
59 for i = #trees, 1, -1 do
60 local tree = trees[i]
61 if fs.make_dir(tree) and fs.is_writable(tree) then
62 cfg.root_dir = tree
63 cfg.rocks_dir = tree.."/rocks"
64 cfg.scripts_dir = rawget(cfg, "scripts_dir") or tree.."/bin"
65 break
66 end
67 end
68 end
69
70 cfg.root_dir = cfg.root_dir:gsub("/+$", "")
71 cfg.rocks_dir = cfg.rocks_dir:gsub("/+$", "")
72 cfg.scripts_dir = cfg.scripts_dir:gsub("/+$", "")
73
74 cfg.variables.ROCKS_TREE = cfg.root_dir
75 cfg.variables.SCRIPTS_DIR = cfg.scripts_dir
76
77 if flags["from"] then
78 if flags["from"] == true then
79 die("Argument error: use --from=<url>")
80 end
81 local protocol, path = fs.split_url(flags["from"])
82 table.insert(cfg.rocks_servers, 1, protocol.."://"..path)
83 end
84
85 if flags["only-from"] then
86 if flags["only-from"] == true then
87 die("Argument error: use --only-from=<url>")
88 end
89 cfg.rocks_servers = { flags["only-from"] }
90 end
91
92 local command
93
94 if flags["version"] then
95 print(program_name.." "..program_version)
96 print(program_description)
97 print()
98 os.exit(0)
99 elseif flags["help"] or #nonflags == 0 then
100 command = "help"
101 args = nonflags
102 else
103 command = nonflags[1]
104 for i, arg in ipairs(args) do
105 if arg == command then
106 table.remove(args, i)
107 break
108 end
109 end
110 end
111
112 if command ~= "help" then
113 for k, v in pairs(cmdline_vars) do
114 cfg.variables[k] = v
115 end
116 end
117
118 command = command:gsub("-", "_")
119 if commands[command] then
120 local xp, ok, err = xpcall(function() return commands[command].run(unpack(args)) end, function(err)
121 die(debug.traceback("LuaRocks "..program_version
122 .." bug (please report at luarocks-developers@lists.luaforge.net).\n"
123 ..err, 2))
124 end)
125 if xp and (not ok) then
126 die(err)
127 end
128 else
129 die("Unknown command: "..command)
130 end
131
132 util.run_scheduled_functions()
133end