aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHisham <hisham@gobolinux.org>2016-10-28 20:45:38 -0200
committerHisham <hisham@gobolinux.org>2016-10-28 20:45:38 -0200
commit91b7c126a9dcbd9e8f2b37cf07f8e064db2bebb3 (patch)
treea04b6d5340658ccc6e82a46d07b2fae12e6660df /src
parent75902ff48a5bdc2cd00b492deb9f8aaa1d35bd3d (diff)
downloadluarocks-91b7c126a9dcbd9e8f2b37cf07f8e064db2bebb3.tar.gz
luarocks-91b7c126a9dcbd9e8f2b37cf07f8e064db2bebb3.tar.bz2
luarocks-91b7c126a9dcbd9e8f2b37cf07f8e064db2bebb3.zip
Move files that will live in base dir back.
Diffstat (limited to 'src')
-rw-r--r--src/luarocks/base/config_cmd.lua71
-rw-r--r--src/luarocks/base/doc.lua155
-rw-r--r--src/luarocks/base/help.lua117
-rw-r--r--src/luarocks/base/install.lua183
-rw-r--r--src/luarocks/base/lint.lua53
-rw-r--r--src/luarocks/base/list.lua95
-rw-r--r--src/luarocks/base/make.lua86
-rw-r--r--src/luarocks/base/new_version.lua199
-rw-r--r--src/luarocks/base/path_cmd.lua68
-rw-r--r--src/luarocks/base/purge.lua77
-rw-r--r--src/luarocks/base/show.lua158
-rw-r--r--src/luarocks/base/unpack.lua164
-rw-r--r--src/luarocks/base/upload.lua94
-rw-r--r--src/luarocks/base/write_rockspec.lua376
-rw-r--r--src/luarocks/build.lua (renamed from src/luarocks/base/build.lua)0
-rw-r--r--src/luarocks/download.lua (renamed from src/luarocks/base/download.lua)0
-rw-r--r--src/luarocks/pack.lua (renamed from src/luarocks/base/pack.lua)0
-rw-r--r--src/luarocks/remove.lua (renamed from src/luarocks/base/remove.lua)0
-rw-r--r--src/luarocks/search.lua (renamed from src/luarocks/base/search.lua)0
19 files changed, 0 insertions, 1896 deletions
diff --git a/src/luarocks/base/config_cmd.lua b/src/luarocks/base/config_cmd.lua
deleted file mode 100644
index b68f7898..00000000
--- a/src/luarocks/base/config_cmd.lua
+++ /dev/null
@@ -1,71 +0,0 @@
1--- Module implementing the LuaRocks "config" command.
2-- Queries information about the LuaRocks configuration.
3local config_cmd = {}
4
5local cfg = require("luarocks.core.cfg")
6local util = require("luarocks.util")
7local dir = require("luarocks.dir")
8
9config_cmd.help_summary = "Query information about the LuaRocks configuration."
10config_cmd.help_arguments = "<flag>"
11config_cmd.help = [[
12--lua-incdir Path to Lua header files.
13
14--lua-libdir Path to Lua library files.
15
16--lua-ver Lua version (in major.minor format). e.g. 5.1
17
18--system-config Location of the system config file.
19
20--user-config Location of the user config file.
21
22--rock-trees Rocks trees in use. First the user tree, then the system tree.
23]]
24
25local function config_file(conf)
26 print(dir.normalize(conf.file))
27 if conf.ok then
28 return true
29 else
30 return nil, "file not found"
31 end
32end
33
34--- Driver function for "config" command.
35-- @return boolean: True if succeeded, nil on errors.
36function config_cmd.command(flags)
37 if flags["lua-incdir"] then
38 print(cfg.variables.LUA_INCDIR)
39 return true
40 end
41 if flags["lua-libdir"] then
42 print(cfg.variables.LUA_LIBDIR)
43 return true
44 end
45 if flags["lua-ver"] then
46 print(cfg.lua_version)
47 return true
48 end
49 local conf = cfg.which_config()
50 if flags["system-config"] then
51 return config_file(conf.system)
52 end
53 if flags["user-config"] then
54 return config_file(conf.user)
55 end
56 if flags["rock-trees"] then
57 for _, tree in ipairs(cfg.rocks_trees) do
58 if type(tree) == "string" then
59 util.printout(dir.normalize(tree))
60 else
61 local name = tree.name and "\t"..tree.name or ""
62 util.printout(dir.normalize(tree.root)..name)
63 end
64 end
65 return true
66 end
67
68 return nil, "Please provide a flag for querying configuration values. "..util.see_help("config")
69end
70
71return config_cmd
diff --git a/src/luarocks/base/doc.lua b/src/luarocks/base/doc.lua
deleted file mode 100644
index 5d521276..00000000
--- a/src/luarocks/base/doc.lua
+++ /dev/null
@@ -1,155 +0,0 @@
1
2--- Module implementing the LuaRocks "doc" command.
3-- Shows documentation for an installed rock.
4local doc = {}
5
6local util = require("luarocks.util")
7local search = require("luarocks.search")
8local path = require("luarocks.path")
9local dir = require("luarocks.dir")
10local fetch = require("luarocks.fetch")
11local fs = require("luarocks.fs")
12local download = require("luarocks.download")
13
14doc.help_summary = "Show documentation for an installed rock."
15
16doc.help = [[
17<argument> is an existing package name.
18Without any flags, tries to load the documentation
19using a series of heuristics.
20With these flags, return only the desired information:
21
22--home Open the home page of project.
23--list List documentation files only.
24
25For more information about a rock, see the 'show' command.
26]]
27
28local function show_homepage(homepage, name, version)
29 if not homepage then
30 return nil, "No 'homepage' field in rockspec for "..name.." "..version
31 end
32 util.printout("Opening "..homepage.." ...")
33 fs.browser(homepage)
34 return true
35end
36
37local function try_to_open_homepage(name, version)
38 local temp_dir, err = fs.make_temp_dir("doc-"..name.."-"..(version or ""))
39 if not temp_dir then
40 return nil, "Failed creating temporary directory: "..err
41 end
42 util.schedule_function(fs.delete, temp_dir)
43 local ok, err = fs.change_dir(temp_dir)
44 if not ok then return nil, err end
45 local filename, err = download.download("rockspec", name, version)
46 if not filename then return nil, err end
47 local rockspec, err = fetch.load_local_rockspec(filename)
48 if not rockspec then return nil, err end
49 fs.pop_dir()
50 local descript = rockspec.description or {}
51 if not descript.homepage then return nil, "No homepage defined for "..name end
52 return show_homepage(descript.homepage, name, version)
53end
54
55--- Driver function for "doc" command.
56-- @param name or nil: an existing package name.
57-- @param version string or nil: a version may also be passed.
58-- @return boolean: True if succeeded, nil on errors.
59function doc.command(flags, name, version)
60 if not name then
61 return nil, "Argument missing. "..util.see_help("doc")
62 end
63
64 name = name:lower()
65
66 local iname, iversion, repo = search.pick_installed_rock(name, version, flags["tree"])
67 if not iname then
68 util.printout(name..(version and " "..version or "").." is not installed. Looking for it in the rocks servers...")
69 return try_to_open_homepage(name, version)
70 end
71 name, version = iname, iversion
72
73 local rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version, repo))
74 if not rockspec then return nil,err end
75 local descript = rockspec.description or {}
76
77 if flags["home"] then
78 return show_homepage(descript.homepage, name, version)
79 end
80
81 local directory = path.install_dir(name,version,repo)
82
83 local docdir
84 local directories = { "doc", "docs" }
85 for _, d in ipairs(directories) do
86 local dirname = dir.path(directory, d)
87 if fs.is_dir(dirname) then
88 docdir = dirname
89 break
90 end
91 end
92 if not docdir then
93 if descript.homepage and not flags["list"] then
94 util.printout("Local documentation directory not found -- opening "..descript.homepage.." ...")
95 fs.browser(descript.homepage)
96 return true
97 end
98 return nil, "Documentation directory not found for "..name.." "..version
99 end
100
101 docdir = dir.normalize(docdir):gsub("/+", "/")
102 local files = fs.find(docdir)
103 local htmlpatt = "%.html?$"
104 local extensions = { htmlpatt, "%.md$", "%.txt$", "%.textile$", "" }
105 local basenames = { "index", "readme", "manual" }
106
107 local porcelain = flags["porcelain"]
108 if #files > 0 then
109 util.title("Documentation files for "..name.." "..version, porcelain)
110 if porcelain then
111 for _, file in ipairs(files) do
112 util.printout(docdir.."/"..file)
113 end
114 else
115 util.printout(docdir.."/")
116 for _, file in ipairs(files) do
117 util.printout("\t"..file)
118 end
119 end
120 end
121
122 if flags["list"] then
123 return true
124 end
125
126 for _, extension in ipairs(extensions) do
127 for _, basename in ipairs(basenames) do
128 local filename = basename..extension
129 local found
130 for _, file in ipairs(files) do
131 if file:lower():match(filename) and ((not found) or #file < #found) then
132 found = file
133 end
134 end
135 if found then
136 local pathname = dir.path(docdir, found)
137 util.printout()
138 util.printout("Opening "..pathname.." ...")
139 util.printout()
140 local ok = fs.browser(pathname)
141 if not ok and not pathname:match(htmlpatt) then
142 local fd = io.open(pathname, "r")
143 util.printout(fd:read("*a"))
144 fd:close()
145 end
146 return true
147 end
148 end
149 end
150
151 return true
152end
153
154
155return doc
diff --git a/src/luarocks/base/help.lua b/src/luarocks/base/help.lua
deleted file mode 100644
index d27c3a50..00000000
--- a/src/luarocks/base/help.lua
+++ /dev/null
@@ -1,117 +0,0 @@
1
2--- Module implementing the LuaRocks "help" command.
3-- This is a generic help display module, which
4-- uses a global table called "commands" to find commands
5-- to show help for; each command should be represented by a
6-- table containing "help" and "help_summary" fields.
7local help = {}
8
9local util = require("luarocks.util")
10local cfg = require("luarocks.core.cfg")
11local dir = require("luarocks.dir")
12
13local program = util.this_program("luarocks")
14
15help.help_summary = "Help on commands. Type '"..program.." help <command>' for more."
16
17help.help_arguments = "[<command>]"
18help.help = [[
19<command> is the command to show help for.
20]]
21
22local function print_banner()
23 util.printout("\nLuaRocks "..cfg.program_version..", a module deployment system for Lua")
24end
25
26local function print_section(section)
27 util.printout("\n"..section)
28end
29
30local function get_status(status)
31 if status then
32 return "ok"
33 else
34 return "not found"
35 end
36end
37
38--- Driver function for the "help" command.
39-- @param command string or nil: command to show help for; if not
40-- given, help summaries for all commands are shown.
41-- @return boolean or (nil, string): true if there were no errors
42-- or nil and an error message if an invalid command was requested.
43function help.command(flags, command)
44 if not command then
45 local conf = cfg.which_config()
46 print_banner()
47 print_section("NAME")
48 util.printout("\t"..program..[[ - ]]..program_description)
49 print_section("SYNOPSIS")
50 util.printout("\t"..program..[[ [--from=<server> | --only-from=<server>] [--to=<tree>] [VAR=VALUE]... <command> [<argument>] ]])
51 print_section("GENERAL OPTIONS")
52 util.printout([[
53 These apply to all commands, as appropriate:
54
55 --server=<server> Fetch rocks/rockspecs from this server
56 (takes priority over config file)
57 --only-server=<server> Fetch rocks/rockspecs from this server only
58 (overrides any entries in the config file)
59 --only-sources=<url> Restrict downloads to paths matching the
60 given URL.
61 --tree=<tree> Which tree to operate on.
62 --local Use the tree in the user's home directory.
63 To enable it, see ']]..program..[[ help path'.
64 --verbose Display verbose output of commands executed.
65 --timeout=<seconds> Timeout on network operations, in seconds.
66 0 means no timeout (wait forever).
67 Default is ]]..tostring(cfg.connection_timeout)..[[.]])
68 print_section("VARIABLES")
69 util.printout([[
70 Variables from the "variables" table of the configuration file
71 can be overriden with VAR=VALUE assignments.]])
72 print_section("COMMANDS")
73 for name, command in util.sortedpairs(commands) do
74 local cmd = require(command)
75 util.printout("", name)
76 util.printout("\t", cmd.help_summary)
77 end
78 print_section("CONFIGURATION")
79 util.printout("\tLua version: " .. cfg.lua_version)
80 util.printout("\tConfiguration files:")
81 util.printout("\t\tSystem: ".. dir.normalize(conf.system.file) .. " (" .. get_status(conf.system.ok) ..")")
82 if conf.user.file then
83 util.printout("\t\tUser : ".. dir.normalize(conf.user.file) .. " (" .. get_status(conf.user.ok) ..")\n")
84 else
85 util.printout("\t\tUser : disabled in this LuaRocks installation.\n")
86 end
87 util.printout("\tRocks trees in use: ")
88 for _, tree in ipairs(cfg.rocks_trees) do
89 if type(tree) == "string" then
90 util.printout("\t\t"..dir.normalize(tree))
91 else
92 local name = tree.name and " (\""..tree.name.."\")" or ""
93 util.printout("\t\t"..dir.normalize(tree.root)..name)
94 end
95 end
96 else
97 command = command:gsub("-", "_")
98 local cmd = commands[command] and require(commands[command])
99 if cmd then
100 local arguments = cmd.help_arguments or "<argument>"
101 print_banner()
102 print_section("NAME")
103 util.printout("\t"..program.." "..command.." - "..cmd.help_summary)
104 print_section("SYNOPSIS")
105 util.printout("\t"..program.." "..command.." "..arguments)
106 print_section("DESCRIPTION")
107 util.printout("",(cmd.help:gsub("\n","\n\t"):gsub("\n\t$","")))
108 print_section("SEE ALSO")
109 util.printout("","'"..program.." help' for general options and configuration.\n")
110 else
111 return nil, "Unknown command: "..command
112 end
113 end
114 return true
115end
116
117return help
diff --git a/src/luarocks/base/install.lua b/src/luarocks/base/install.lua
deleted file mode 100644
index c9b085f5..00000000
--- a/src/luarocks/base/install.lua
+++ /dev/null
@@ -1,183 +0,0 @@
1--- Module implementing the LuaRocks "install" command.
2-- Installs binary rocks.
3local install = {}
4
5local path = require("luarocks.path")
6local repos = require("luarocks.repos")
7local fetch = require("luarocks.fetch")
8local util = require("luarocks.util")
9local fs = require("luarocks.fs")
10local deps = require("luarocks.deps")
11local writer = require("luarocks.manif.writer")
12local remove = require("luarocks.remove")
13local cfg = require("luarocks.core.cfg")
14
15install.help_summary = "Install a rock."
16
17install.help_arguments = "{<rock>|<name> [<version>]}"
18
19install.help = [[
20Argument may be the name of a rock to be fetched from a repository
21or a filename of a locally available rock.
22
23--keep Do not remove previously installed versions of the
24 rock after installing a new one. This behavior can
25 be made permanent by setting keep_other_versions=true
26 in the configuration file.
27
28--only-deps Installs only the dependencies of the rock.
29]]..util.deps_mode_help()
30
31
32--- Install a binary rock.
33-- @param rock_file string: local or remote filename of a rock.
34-- @param deps_mode: string: Which trees to check dependencies for:
35-- "one" for the current default tree, "all" for all trees,
36-- "order" for all trees with priority >= the current default, "none" for no trees.
37-- @return (string, string) or (nil, string, [string]): Name and version of
38-- installed rock if succeeded or nil and an error message followed by an error code.
39function install.install_binary_rock(rock_file, deps_mode)
40 assert(type(rock_file) == "string")
41
42 local name, version, arch = path.parse_name(rock_file)
43 if not name then
44 return nil, "Filename "..rock_file.." does not match format 'name-version-revision.arch.rock'."
45 end
46
47 if arch ~= "all" and arch ~= cfg.arch then
48 return nil, "Incompatible architecture "..arch, "arch"
49 end
50 if repos.is_installed(name, version) then
51 repos.delete_version(name, version, deps_mode)
52 end
53
54 local rollback = util.schedule_function(function()
55 fs.delete(path.install_dir(name, version))
56 fs.remove_dir_if_empty(path.versions_dir(name))
57 end)
58
59 local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, path.install_dir(name, version))
60 if not ok then return nil, err, errcode end
61
62 local rockspec, err, errcode = fetch.load_rockspec(path.rockspec_file(name, version))
63 if err then
64 return nil, "Failed loading rockspec for installed package: "..err, errcode
65 end
66
67 if deps_mode == "none" then
68 util.printerr("Warning: skipping dependency checks.")
69 else
70 ok, err, errcode = deps.check_external_deps(rockspec, "install")
71 if err then return nil, err, errcode end
72 end
73
74 -- For compatibility with .rock files built with LuaRocks 1
75 if not fs.exists(path.rock_manifest_file(name, version)) then
76 ok, err = writer.make_rock_manifest(name, version)
77 if err then return nil, err end
78 end
79
80 if deps_mode ~= "none" then
81 ok, err, errcode = deps.fulfill_dependencies(rockspec, deps_mode)
82 if err then return nil, err, errcode end
83 end
84
85 ok, err = repos.deploy_files(name, version, repos.should_wrap_bin_scripts(rockspec), deps_mode)
86 if err then return nil, err end
87
88 util.remove_scheduled_function(rollback)
89 rollback = util.schedule_function(function()
90 repos.delete_version(name, version, deps_mode)
91 end)
92
93 ok, err = repos.run_hook(rockspec, "post_install")
94 if err then return nil, err end
95
96 util.announce_install(rockspec)
97 util.remove_scheduled_function(rollback)
98 return name, version
99end
100
101--- Installs the dependencies of a binary rock.
102-- @param rock_file string: local or remote filename of a rock.
103-- @param deps_mode: string: Which trees to check dependencies for:
104-- "one" for the current default tree, "all" for all trees,
105-- "order" for all trees with priority >= the current default, "none" for no trees.
106-- @return (string, string) or (nil, string, [string]): Name and version of
107-- the rock whose dependencies were installed if succeeded or nil and an error message
108-- followed by an error code.
109function install.install_binary_rock_deps(rock_file, deps_mode)
110 assert(type(rock_file) == "string")
111
112 local name, version, arch = path.parse_name(rock_file)
113 if not name then
114 return nil, "Filename "..rock_file.." does not match format 'name-version-revision.arch.rock'."
115 end
116
117 if arch ~= "all" and arch ~= cfg.arch then
118 return nil, "Incompatible architecture "..arch, "arch"
119 end
120
121 local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, path.install_dir(name, version))
122 if not ok then return nil, err, errcode end
123
124 local rockspec, err, errcode = fetch.load_rockspec(path.rockspec_file(name, version))
125 if err then
126 return nil, "Failed loading rockspec for installed package: "..err, errcode
127 end
128
129 ok, err, errcode = deps.fulfill_dependencies(rockspec, deps_mode)
130 if err then return nil, err, errcode end
131
132 util.printout()
133 util.printout("Successfully installed dependencies for " ..name.." "..version)
134
135 return name, version
136end
137
138--- Driver function for the "install" command.
139-- @param name string: name of a binary rock. If an URL or pathname
140-- to a binary rock is given, fetches and installs it. If a rockspec or a
141-- source rock is given, forwards the request to the "build" command.
142-- If a package name is given, forwards the request to "search" and,
143-- if returned a result, installs the matching rock.
144-- @param version string: When passing a package name, a version number
145-- may also be given.
146-- @return boolean or (nil, string, exitcode): True if installation was
147-- successful, nil and an error message otherwise. exitcode is optionally returned.
148function install.command(flags, name, version)
149 if type(name) ~= "string" then
150 return nil, "Argument missing. "..util.see_help("install")
151 end
152
153 local ok, err = fs.check_command_permissions(flags)
154 if not ok then return nil, err, cfg.errorcodes.PERMISSIONDENIED end
155
156 if name:match("%.rockspec$") or name:match("%.src%.rock$") then
157 local build = require("luarocks.build")
158 return build.command(flags, name)
159 elseif name:match("%.rock$") then
160 if flags["only-deps"] then
161 ok, err = install.install_binary_rock_deps(name, deps.get_deps_mode(flags))
162 else
163 ok, err = install.install_binary_rock(name, deps.get_deps_mode(flags))
164 end
165 if not ok then return nil, err end
166 name, version = ok, err
167 if (not flags["only-deps"]) and (not flags["keep"]) and not cfg.keep_other_versions then
168 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"])
169 if not ok then util.printerr(err) end
170 end
171 return name, version
172 else
173 local search = require("luarocks.search")
174 local url, err = search.find_suitable_rock(search.make_query(name:lower(), version))
175 if not url then
176 return nil, err
177 end
178 util.printout("Installing "..url)
179 return install.command(flags, url)
180 end
181end
182
183return install
diff --git a/src/luarocks/base/lint.lua b/src/luarocks/base/lint.lua
deleted file mode 100644
index c9ea45ea..00000000
--- a/src/luarocks/base/lint.lua
+++ /dev/null
@@ -1,53 +0,0 @@
1
2--- Module implementing the LuaRocks "lint" command.
3-- Utility function that checks syntax of the rockspec.
4local lint = {}
5
6local util = require("luarocks.util")
7local download = require("luarocks.download")
8local fetch = require("luarocks.fetch")
9
10lint.help_summary = "Check syntax of a rockspec."
11lint.help_arguments = "<rockspec>"
12lint.help = [[
13This is a utility function that checks the syntax of a rockspec.
14
15It returns success or failure if the text of a rockspec is
16syntactically correct.
17]]
18
19function lint.command(flags, input)
20 if not input then
21 return nil, "Argument missing. "..util.see_help("lint")
22 end
23
24 local filename = input
25 if not input:match(".rockspec$") then
26 local err
27 filename, err = download.download("rockspec", input:lower())
28 if not filename then
29 return nil, err
30 end
31 end
32
33 local rs, err = fetch.load_local_rockspec(filename)
34 if not rs then
35 return nil, "Failed loading rockspec: "..err
36 end
37
38 local ok = true
39
40 -- This should have been done in the type checker,
41 -- but it would break compatibility of other commands.
42 -- Making 'lint' alone be stricter shouldn't be a problem,
43 -- because extra-strict checks is what lint-type commands
44 -- are all about.
45 if not rs.description.license then
46 util.printerr("Rockspec has no license field.")
47 ok = false
48 end
49
50 return ok, ok or filename.." failed consistency checks."
51end
52
53return lint
diff --git a/src/luarocks/base/list.lua b/src/luarocks/base/list.lua
deleted file mode 100644
index 45f1a26f..00000000
--- a/src/luarocks/base/list.lua
+++ /dev/null
@@ -1,95 +0,0 @@
1
2--- Module implementing the LuaRocks "list" command.
3-- Lists currently installed rocks.
4local list = {}
5
6local search = require("luarocks.search")
7local deps = require("luarocks.deps")
8local cfg = require("luarocks.core.cfg")
9local util = require("luarocks.util")
10local path = require("luarocks.path")
11
12list.help_summary = "List currently installed rocks."
13list.help_arguments = "[--porcelain] <filter>"
14list.help = [[
15<filter> is a substring of a rock name to filter by.
16
17--outdated List only rocks for which there is a
18 higher version available in the rocks server.
19
20--porcelain Produce machine-friendly output.
21]]
22
23local function check_outdated(trees, query)
24 local results_installed = {}
25 for _, tree in ipairs(trees) do
26 search.manifest_search(results_installed, path.rocks_dir(tree), query)
27 end
28 local outdated = {}
29 for name, versions in util.sortedpairs(results_installed) do
30 versions = util.keys(versions)
31 table.sort(versions, deps.compare_versions)
32 local latest_installed = versions[1]
33
34 local query_available = search.make_query(name:lower())
35 query.exact_name = true
36 local results_available, err = search.search_repos(query_available)
37
38 if results_available[name] then
39 local available_versions = util.keys(results_available[name])
40 table.sort(available_versions, deps.compare_versions)
41 local latest_available = available_versions[1]
42 local latest_available_repo = results_available[name][latest_available][1].repo
43
44 if deps.compare_versions(latest_available, latest_installed) then
45 table.insert(outdated, { name = name, installed = latest_installed, available = latest_available, repo = latest_available_repo })
46 end
47 end
48 end
49 return outdated
50end
51
52local function list_outdated(trees, query, porcelain)
53 util.title("Outdated rocks:", porcelain)
54 local outdated = check_outdated(trees, query)
55 for _, item in ipairs(outdated) do
56 if porcelain then
57 util.printout(item.name, item.installed, item.available, item.repo)
58 else
59 util.printout(item.name)
60 util.printout(" "..item.installed.." < "..item.available.." at "..item.repo)
61 util.printout()
62 end
63 end
64 return true
65end
66
67--- Driver function for "list" command.
68-- @param filter string or nil: A substring of a rock name to filter by.
69-- @param version string or nil: a version may also be passed.
70-- @return boolean: True if succeeded, nil on errors.
71function list.command(flags, filter, version)
72 local query = search.make_query(filter and filter:lower() or "", version)
73 query.exact_name = false
74 local trees = cfg.rocks_trees
75 if flags["tree"] then
76 trees = { flags["tree"] }
77 end
78
79 if flags["outdated"] then
80 return list_outdated(trees, query, flags["porcelain"])
81 end
82
83 local results = {}
84 for _, tree in ipairs(trees) do
85 local ok, err, errcode = search.manifest_search(results, path.rocks_dir(tree), query)
86 if not ok and errcode ~= "open" then
87 util.warning(err)
88 end
89 end
90 util.title("Installed rocks:", flags["porcelain"])
91 search.print_results(results, flags["porcelain"])
92 return true
93end
94
95return list
diff --git a/src/luarocks/base/make.lua b/src/luarocks/base/make.lua
deleted file mode 100644
index eb38bff0..00000000
--- a/src/luarocks/base/make.lua
+++ /dev/null
@@ -1,86 +0,0 @@
1
2--- Module implementing the LuaRocks "make" command.
3-- Builds sources in the current directory, but unlike "build",
4-- it does not fetch sources, etc., assuming everything is
5-- available in the current directory.
6local make = {}
7
8local build = require("luarocks.build")
9local fs = require("luarocks.fs")
10local util = require("luarocks.util")
11local cfg = require("luarocks.core.cfg")
12local fetch = require("luarocks.fetch")
13local pack = require("luarocks.pack")
14local remove = require("luarocks.remove")
15local deps = require("luarocks.deps")
16
17make.help_summary = "Compile package in current directory using a rockspec."
18make.help_arguments = "[--pack-binary-rock] [<rockspec>]"
19make.help = [[
20Builds sources in the current directory, but unlike "build",
21it does not fetch sources, etc., assuming everything is
22available in the current directory. If no argument is given,
23it looks for a rockspec in the current directory and in "rockspec/"
24and "rockspecs/" subdirectories, picking the rockspec with newest version
25or without version name. If rockspecs for different rocks are found
26or there are several rockspecs without version, you must specify which to use,
27through the command-line.
28
29This command is useful as a tool for debugging rockspecs.
30To install rocks, you'll normally want to use the "install" and
31"build" commands. See the help on those for details.
32
33--pack-binary-rock Do not install rock. Instead, produce a .rock file
34 with the contents of compilation in the current
35 directory.
36
37--keep Do not remove previously installed versions of the
38 rock after installing a new one. This behavior can
39 be made permanent by setting keep_other_versions=true
40 in the configuration file.
41
42--branch=<name> Override the `source.branch` field in the loaded
43 rockspec. Allows to specify a different branch to
44 fetch. Particularly for SCM rocks.
45
46]]
47
48--- Driver function for "make" command.
49-- @param name string: A local rockspec.
50-- @return boolean or (nil, string, exitcode): True if build was successful; nil and an
51-- error message otherwise. exitcode is optionally returned.
52function make.command(flags, rockspec)
53 assert(type(rockspec) == "string" or not rockspec)
54
55 if not rockspec then
56 local err
57 rockspec, err = util.get_default_rockspec()
58 if not rockspec then
59 return nil, err
60 end
61 end
62 if not rockspec:match("rockspec$") then
63 return nil, "Invalid argument: 'make' takes a rockspec as a parameter. "..util.see_help("make")
64 end
65
66 if flags["pack-binary-rock"] then
67 local rspec, err, errcode = fetch.load_rockspec(rockspec)
68 if not rspec then
69 return nil, err
70 end
71 return pack.pack_binary_rock(rspec.name, rspec.version, build.build_rockspec, rockspec, false, true, deps.get_deps_mode(flags))
72 else
73 local ok, err = fs.check_command_permissions(flags)
74 if not ok then return nil, err, cfg.errorcodes.PERMISSIONDENIED end
75 ok, err = build.build_rockspec(rockspec, false, true, deps.get_deps_mode(flags))
76 if not ok then return nil, err end
77 local name, version = ok, err
78 if (not flags["keep"]) and not cfg.keep_other_versions then
79 local ok, err = remove.remove_other_versions(name, version, flags["force"], flags["force-fast"])
80 if not ok then util.printerr(err) end
81 end
82 return name, version
83 end
84end
85
86return make
diff --git a/src/luarocks/base/new_version.lua b/src/luarocks/base/new_version.lua
deleted file mode 100644
index b13dbb97..00000000
--- a/src/luarocks/base/new_version.lua
+++ /dev/null
@@ -1,199 +0,0 @@
1
2--- Module implementing the LuaRocks "new_version" command.
3-- Utility function that writes a new rockspec, updating data from a previous one.
4local new_version = {}
5
6local util = require("luarocks.util")
7local download = require("luarocks.download")
8local fetch = require("luarocks.fetch")
9local persist = require("luarocks.persist")
10local fs = require("luarocks.fs")
11local type_check = require("luarocks.type_check")
12
13new_version.help_summary = "Auto-write a rockspec for a new version of a rock."
14new_version.help_arguments = "[--tag=<tag>] [<package>|<rockspec>] [<new_version>] [<new_url>]"
15new_version.help = [[
16This is a utility function that writes a new rockspec, updating data
17from a previous one.
18
19If a package name is given, it downloads the latest rockspec from the
20default server. If a rockspec is given, it uses it instead. If no argument
21is given, it looks for a rockspec same way 'luarocks make' does.
22
23If the version number is not given and tag is passed using --tag,
24it is used as the version, with 'v' removed from beginning.
25Otherwise, it only increments the revision number of the given
26(or downloaded) rockspec.
27
28If a URL is given, it replaces the one from the old rockspec with the
29given URL. If a URL is not given and a new version is given, it tries
30to guess the new URL by replacing occurrences of the version number
31in the URL or tag. It also tries to download the new URL to determine
32the new MD5 checksum.
33
34If a tag is given, it replaces the one from the old rockspec. If there is
35an old tag but no new one passed, it is guessed in the same way URL is.
36
37WARNING: it writes the new rockspec to the current directory,
38overwriting the file if it already exists.
39]]
40
41local function try_replace(tbl, field, old, new)
42 if not tbl[field] then
43 return false
44 end
45 local old_field = tbl[field]
46 local new_field = tbl[field]:gsub(old, new)
47 if new_field ~= old_field then
48 util.printout("Guessing new '"..field.."' field as "..new_field)
49 tbl[field] = new_field
50 return true
51 end
52 return false
53end
54
55-- Try to download source file using URL from a rockspec.
56-- If it specified MD5, update it.
57-- @return (true, false) if MD5 was not specified or it stayed same,
58-- (true, true) if MD5 changed, (nil, string) on error.
59local function check_url_and_update_md5(out_rs)
60 local file, temp_dir = fetch.fetch_url_at_temp_dir(out_rs.source.url, "luarocks-new-version-"..out_rs.package)
61 if not file then
62 util.printerr("Warning: invalid URL - "..temp_dir)
63 return true, false
64 end
65
66 local inferred_dir, found_dir = fetch.find_base_dir(file, temp_dir, out_rs.source.url, out_rs.source.dir)
67 if not inferred_dir then
68 return nil, found_dir
69 end
70
71 if found_dir and found_dir ~= inferred_dir then
72 out_rs.source.dir = found_dir
73 end
74
75 if file then
76 if out_rs.source.md5 then
77 util.printout("File successfully downloaded. Updating MD5 checksum...")
78 local new_md5, err = fs.get_md5(file)
79 if not new_md5 then
80 return nil, err
81 end
82 local old_md5 = out_rs.source.md5
83 out_rs.source.md5 = new_md5
84 return true, new_md5 ~= old_md5
85 else
86 util.printout("File successfully downloaded.")
87 return true, false
88 end
89 end
90end
91
92local function update_source_section(out_rs, url, tag, old_ver, new_ver)
93 if tag then
94 out_rs.source.tag = tag
95 end
96 if url then
97 out_rs.source.url = url
98 return check_url_and_update_md5(out_rs)
99 end
100 if new_ver == old_ver then
101 return true
102 end
103 if out_rs.source.dir then
104 try_replace(out_rs.source, "dir", old_ver, new_ver)
105 end
106 if out_rs.source.file then
107 try_replace(out_rs.source, "file", old_ver, new_ver)
108 end
109 if try_replace(out_rs.source, "url", old_ver, new_ver) then
110 return check_url_and_update_md5(out_rs)
111 end
112 if tag or try_replace(out_rs.source, "tag", old_ver, new_ver) then
113 return true
114 end
115 -- Couldn't replace anything significant, use the old URL.
116 local ok, md5_changed = check_url_and_update_md5(out_rs)
117 if not ok then
118 return nil, md5_changed
119 end
120 if md5_changed then
121 util.printerr("Warning: URL is the same, but MD5 has changed. Old rockspec is broken.")
122 end
123 return true
124end
125
126function new_version.command(flags, input, version, url)
127 if not input then
128 local err
129 input, err = util.get_default_rockspec()
130 if not input then
131 return nil, err
132 end
133 end
134 assert(type(input) == "string")
135
136 local filename, err
137 if input:match("rockspec$") then
138 filename, err = fetch.fetch_url(input)
139 if not filename then
140 return nil, err
141 end
142 else
143 filename, err = download.download("rockspec", input:lower())
144 if not filename then
145 return nil, err
146 end
147 end
148
149 local valid_rs, err = fetch.load_rockspec(filename)
150 if not valid_rs then
151 return nil, err
152 end
153
154 local old_ver, old_rev = valid_rs.version:match("(.*)%-(%d+)$")
155 local new_ver, new_rev
156
157 if flags.tag and not version then
158 version = flags.tag:gsub("^v", "")
159 end
160
161 if version then
162 new_ver, new_rev = version:match("(.*)%-(%d+)$")
163 new_rev = tonumber(new_rev)
164 if not new_rev then
165 new_ver = version
166 new_rev = 1
167 end
168 else
169 new_ver = old_ver
170 new_rev = tonumber(old_rev) + 1
171 end
172 local new_rockver = new_ver:gsub("-", "")
173
174 local out_rs, err = persist.load_into_table(filename)
175 local out_name = out_rs.package:lower()
176 out_rs.version = new_rockver.."-"..new_rev
177
178 local ok, err = update_source_section(out_rs, url, flags.tag, old_ver, new_ver)
179 if not ok then return nil, err end
180
181 if out_rs.build and out_rs.build.type == "module" then
182 out_rs.build.type = "builtin"
183 end
184
185 local out_filename = out_name.."-"..new_rockver.."-"..new_rev..".rockspec"
186
187 persist.save_from_table(out_filename, out_rs, type_check.rockspec_order)
188
189 util.printout("Wrote "..out_filename)
190
191 local valid_out_rs, err = fetch.load_local_rockspec(out_filename)
192 if not valid_out_rs then
193 return nil, "Failed loading generated rockspec: "..err
194 end
195
196 return true
197end
198
199return new_version
diff --git a/src/luarocks/base/path_cmd.lua b/src/luarocks/base/path_cmd.lua
deleted file mode 100644
index 516a0c47..00000000
--- a/src/luarocks/base/path_cmd.lua
+++ /dev/null
@@ -1,68 +0,0 @@
1
2--- @module luarocks.path_cmd
3-- Driver for the `luarocks path` command.
4local path_cmd = {}
5
6local util = require("luarocks.util")
7local cfg = require("luarocks.core.cfg")
8
9path_cmd.help_summary = "Return the currently configured package path."
10path_cmd.help_arguments = ""
11path_cmd.help = [[
12Returns the package path currently configured for this installation
13of LuaRocks, formatted as shell commands to update LUA_PATH and LUA_CPATH.
14
15--bin Adds the system path to the output
16
17--append Appends the paths to the existing paths. Default is to prefix
18 the LR paths to the existing paths.
19
20--lr-path Exports the Lua path (not formatted as shell command)
21
22--lr-cpath Exports the Lua cpath (not formatted as shell command)
23
24--lr-bin Exports the system path (not formatted as shell command)
25
26
27On Unix systems, you may run:
28 eval `luarocks path`
29And on Windows:
30 luarocks path > "%temp%\_lrp.bat" && call "%temp%\_lrp.bat" && del "%temp%\_lrp.bat"
31]]
32
33--- Driver function for "path" command.
34-- @return boolean This function always succeeds.
35function path_cmd.command(flags)
36 local lr_path, lr_cpath, lr_bin = cfg.package_paths(flags["tree"])
37 local path_sep = cfg.export_path_separator
38
39 if flags["lr-path"] then
40 util.printout(util.remove_path_dupes(lr_path, ';'))
41 return true
42 elseif flags["lr-cpath"] then
43 util.printout(util.remove_path_dupes(lr_cpath, ';'))
44 return true
45 elseif flags["lr-bin"] then
46 util.printout(util.remove_path_dupes(lr_bin, path_sep))
47 return true
48 end
49
50 if flags["append"] then
51 lr_path = package.path .. ";" .. lr_path
52 lr_cpath = package.cpath .. ";" .. lr_cpath
53 lr_bin = os.getenv("PATH") .. path_sep .. lr_bin
54 else
55 lr_path = lr_path.. ";" .. package.path
56 lr_cpath = lr_cpath .. ";" .. package.cpath
57 lr_bin = lr_bin .. path_sep .. os.getenv("PATH")
58 end
59
60 util.printout(cfg.export_lua_path:format(util.remove_path_dupes(lr_path, ';')))
61 util.printout(cfg.export_lua_cpath:format(util.remove_path_dupes(lr_cpath, ';')))
62 if flags["bin"] then
63 util.printout(cfg.export_path:format(util.remove_path_dupes(lr_bin, path_sep)))
64 end
65 return true
66end
67
68return path_cmd
diff --git a/src/luarocks/base/purge.lua b/src/luarocks/base/purge.lua
deleted file mode 100644
index 50f290c8..00000000
--- a/src/luarocks/base/purge.lua
+++ /dev/null
@@ -1,77 +0,0 @@
1
2--- Module implementing the LuaRocks "purge" command.
3-- Remove all rocks from a given tree.
4local purge = {}
5
6local util = require("luarocks.util")
7local fs = require("luarocks.fs")
8local path = require("luarocks.path")
9local search = require("luarocks.search")
10local deps = require("luarocks.deps")
11local repos = require("luarocks.repos")
12local writer = require("luarocks.manif.writer")
13local cfg = require("luarocks.core.cfg")
14local remove = require("luarocks.remove")
15
16purge.help_summary = "Remove all installed rocks from a tree."
17purge.help_arguments = "--tree=<tree> [--old-versions]"
18purge.help = [[
19This command removes rocks en masse from a given tree.
20By default, it removes all rocks from a tree.
21
22The --tree argument is mandatory: luarocks purge does not
23assume a default tree.
24
25--old-versions Keep the highest-numbered version of each
26 rock and remove the other ones. By default
27 it only removes old versions if they are
28 not needed as dependencies. This can be
29 overridden with the flag --force.
30]]
31
32function purge.command(flags)
33 local tree = flags["tree"]
34
35 if type(tree) ~= "string" then
36 return nil, "The --tree argument is mandatory. "..util.see_help("purge")
37 end
38
39 local results = {}
40 local query = search.make_query("")
41 query.exact_name = false
42 if not fs.is_dir(tree) then
43 return nil, "Directory not found: "..tree
44 end
45
46 local ok, err = fs.check_command_permissions(flags)
47 if not ok then return nil, err, cfg.errorcodes.PERMISSIONDENIED end
48
49 search.manifest_search(results, path.rocks_dir(tree), query)
50
51 local sort = function(a,b) return deps.compare_versions(b,a) end
52 if flags["old-versions"] then
53 sort = deps.compare_versions
54 end
55
56 for package, versions in util.sortedpairs(results) do
57 for version, _ in util.sortedpairs(versions, sort) do
58 if flags["old-versions"] then
59 util.printout("Keeping "..package.." "..version.."...")
60 local ok, err = remove.remove_other_versions(package, version, flags["force"], flags["force-fast"])
61 if not ok then
62 util.printerr(err)
63 end
64 break
65 else
66 util.printout("Removing "..package.." "..version.."...")
67 local ok, err = repos.delete_version(package, version, "none", true)
68 if not ok then
69 util.printerr(err)
70 end
71 end
72 end
73 end
74 return writer.make_manifest(cfg.rocks_dir, "one")
75end
76
77return purge
diff --git a/src/luarocks/base/show.lua b/src/luarocks/base/show.lua
deleted file mode 100644
index 1ff81e08..00000000
--- a/src/luarocks/base/show.lua
+++ /dev/null
@@ -1,158 +0,0 @@
1--- Module implementing the LuaRocks "show" command.
2-- Shows information about an installed rock.
3local show = {}
4
5local search = require("luarocks.search")
6local cfg = require("luarocks.core.cfg")
7local util = require("luarocks.util")
8local path = require("luarocks.path")
9local deps = require("luarocks.deps")
10local fetch = require("luarocks.fetch")
11local manif = require("luarocks.manif")
12
13show.help_summary = "Show information about an installed rock."
14
15show.help = [[
16<argument> is an existing package name.
17Without any flags, show all module information.
18With these flags, return only the desired information:
19
20--home home page of project
21--modules all modules provided by this package as used by require()
22--deps packages this package depends on
23--rockspec the full path of the rockspec file
24--mversion the package version
25--rock-tree local tree where rock is installed
26--rock-dir data directory of the installed rock
27]]
28
29local function keys_as_string(t, sep)
30 local keys = util.keys(t)
31 table.sort(keys)
32 return table.concat(keys, sep or " ")
33end
34
35local function word_wrap(line)
36 local width = tonumber(os.getenv("COLUMNS")) or 80
37 if width > 80 then width = 80 end
38 if #line > width then
39 local brk = width
40 while brk > 0 and line:sub(brk, brk) ~= " " do
41 brk = brk - 1
42 end
43 if brk > 0 then
44 return line:sub(1, brk-1) .. "\n" .. word_wrap(line:sub(brk+1))
45 end
46 end
47 return line
48end
49
50local function format_text(text)
51 text = text:gsub("^%s*",""):gsub("%s$", ""):gsub("\n[ \t]+","\n"):gsub("([^\n])\n([^\n])","%1 %2")
52 local paragraphs = util.split_string(text, "\n\n")
53 for n, line in ipairs(paragraphs) do
54 paragraphs[n] = word_wrap(line)
55 end
56 return (table.concat(paragraphs, "\n\n"):gsub("%s$", ""))
57end
58
59local function installed_rock_label(name, tree)
60 local installed, version
61 if cfg.rocks_provided[name] then
62 installed, version = true, cfg.rocks_provided[name]
63 else
64 installed, version = search.pick_installed_rock(name, nil, tree)
65 end
66 return installed and "(using "..version..")" or "(missing)"
67end
68
69--- Driver function for "show" command.
70-- @param name or nil: an existing package name.
71-- @param version string or nil: a version may also be passed.
72-- @return boolean: True if succeeded, nil on errors.
73function show.command(flags, name, version)
74 if not name then
75 return nil, "Argument missing. "..util.see_help("show")
76 end
77
78 local repo, repo_url
79 name, version, repo, repo_url = search.pick_installed_rock(name:lower(), version, flags["tree"])
80 if not name then
81 return nil, version
82 end
83
84 local directory = path.install_dir(name,version,repo)
85 local rockspec_file = path.rockspec_file(name, version, repo)
86 local rockspec, err = fetch.load_local_rockspec(rockspec_file)
87 if not rockspec then return nil,err end
88
89 local descript = rockspec.description or {}
90 local manifest, err = manif.load_manifest(repo_url)
91 if not manifest then return nil,err end
92 local minfo = manifest.repository[name][version][1]
93
94 if flags["rock-tree"] then util.printout(path.rocks_tree_to_string(repo))
95 elseif flags["rock-dir"] then util.printout(directory)
96 elseif flags["home"] then util.printout(descript.homepage)
97 elseif flags["issues"] then util.printout(descript.issues_url)
98 elseif flags["labels"] then util.printout(descript.labels and table.concat(descript.labels, "\n"))
99 elseif flags["modules"] then util.printout(keys_as_string(minfo.modules, "\n"))
100 elseif flags["deps"] then util.printout(keys_as_string(minfo.dependencies))
101 elseif flags["rockspec"] then util.printout(rockspec_file)
102 elseif flags["mversion"] then util.printout(version)
103 else
104 util.printout()
105 util.printout(rockspec.package.." "..rockspec.version.." - "..(descript.summary or ""))
106 util.printout()
107 if descript.detailed then
108 util.printout(format_text(descript.detailed))
109 util.printout()
110 end
111 if descript.license then
112 util.printout("License: ", descript.license)
113 end
114 if descript.homepage then
115 util.printout("Homepage: ", descript.homepage)
116 end
117 if descript.issues_url then
118 util.printout("Issues: ", descript.issues_url)
119 end
120 if descript.labels then
121 util.printout("Labels: ", table.concat(descript.labels, ", "))
122 end
123 util.printout("Installed in: ", path.rocks_tree_to_string(repo))
124 if next(minfo.modules) then
125 util.printout()
126 util.printout("Modules:")
127 for mod, filename in util.sortedpairs(minfo.modules) do
128 util.printout("\t"..mod.." ("..path.which(mod, filename, name, version, repo, manifest)..")")
129 end
130 end
131 local direct_deps = {}
132 if #rockspec.dependencies > 0 then
133 util.printout()
134 util.printout("Depends on:")
135 for _, dep in ipairs(rockspec.dependencies) do
136 direct_deps[dep.name] = true
137 util.printout("\t"..deps.show_dep(dep).." "..installed_rock_label(dep.name, flags["tree"]))
138 end
139 end
140 local has_indirect_deps
141 for dep_name in util.sortedpairs(minfo.dependencies) do
142 if not direct_deps[dep_name] then
143 if not has_indirect_deps then
144 util.printout()
145 util.printout("Indirectly pulling:")
146 has_indirect_deps = true
147 end
148
149 util.printout("\t"..dep_name.." "..installed_rock_label(dep_name, flags["tree"]))
150 end
151 end
152 util.printout()
153 end
154 return true
155end
156
157
158return show
diff --git a/src/luarocks/base/unpack.lua b/src/luarocks/base/unpack.lua
deleted file mode 100644
index c50701b0..00000000
--- a/src/luarocks/base/unpack.lua
+++ /dev/null
@@ -1,164 +0,0 @@
1
2--- Module implementing the LuaRocks "unpack" command.
3-- Unpack the contents of a rock.
4local unpack = {}
5
6local fetch = require("luarocks.fetch")
7local fs = require("luarocks.fs")
8local util = require("luarocks.util")
9local build = require("luarocks.build")
10local dir = require("luarocks.dir")
11local cfg = require("luarocks.core.cfg")
12
13unpack.help_summary = "Unpack the contents of a rock."
14unpack.help_arguments = "[--force] {<rock>|<name> [<version>]}"
15unpack.help = [[
16Unpacks the contents of a rock in a newly created directory.
17Argument may be a rock file, or the name of a rock in a rocks server.
18In the latter case, the app version may be given as a second argument.
19
20--force Unpack files even if the output directory already exists.
21]]
22
23--- Load a rockspec file to the given directory, fetches the source
24-- files specified in the rockspec, and unpack them inside the directory.
25-- @param rockspec_file string: The URL for a rockspec file.
26-- @param dir_name string: The directory where to store and unpack files.
27-- @return table or (nil, string): the loaded rockspec table or
28-- nil and an error message.
29local function unpack_rockspec(rockspec_file, dir_name)
30 assert(type(rockspec_file) == "string")
31 assert(type(dir_name) == "string")
32
33 local rockspec, err = fetch.load_rockspec(rockspec_file)
34 if not rockspec then
35 return nil, "Failed loading rockspec "..rockspec_file..": "..err
36 end
37 local ok, err = fs.change_dir(dir_name)
38 if not ok then return nil, err end
39 local ok, sources_dir = fetch.fetch_sources(rockspec, true, ".")
40 if not ok then
41 return nil, sources_dir
42 end
43 ok, err = fs.change_dir(sources_dir)
44 if not ok then return nil, err end
45 ok, err = build.apply_patches(rockspec)
46 fs.pop_dir()
47 if not ok then return nil, err end
48 return rockspec
49end
50
51--- Load a .rock file to the given directory and unpack it inside it.
52-- @param rock_file string: The URL for a .rock file.
53-- @param dir_name string: The directory where to unpack.
54-- @param kind string: the kind of rock file, as in the second-level
55-- extension in the rock filename (eg. "src", "all", "linux-x86")
56-- @return table or (nil, string): the loaded rockspec table or
57-- nil and an error message.
58local function unpack_rock(rock_file, dir_name, kind)
59 assert(type(rock_file) == "string")
60 assert(type(dir_name) == "string")
61
62 local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, dir_name)
63 if not ok then
64 return nil, "Failed unzipping rock "..rock_file, errcode
65 end
66 ok, err = fs.change_dir(dir_name)
67 if not ok then return nil, err end
68 local rockspec_file = dir_name..".rockspec"
69 local rockspec, err = fetch.load_rockspec(rockspec_file)
70 if not rockspec then
71 return nil, "Failed loading rockspec "..rockspec_file..": "..err
72 end
73 if kind == "src" then
74 if rockspec.source.file then
75 local ok, err = fs.unpack_archive(rockspec.source.file)
76 if not ok then
77 return nil, err
78 end
79 ok, err = fs.change_dir(rockspec.source.dir)
80 if not ok then return nil, err end
81 ok, err = build.apply_patches(rockspec)
82 fs.pop_dir()
83 if not ok then return nil, err end
84 end
85 end
86 return rockspec
87end
88
89--- Create a directory and perform the necessary actions so that
90-- the sources for the rock and its rockspec are unpacked inside it,
91-- laid out properly so that the 'make' command is able to build the module.
92-- @param file string: A rockspec or .rock URL.
93-- @return boolean or (nil, string): true if successful or nil followed
94-- by an error message.
95local function run_unpacker(file, force)
96 assert(type(file) == "string")
97
98 local base_name = dir.base_name(file)
99 local dir_name, kind, extension = base_name:match("(.*)%.([^.]+)%.(rock)$")
100 if not extension then
101 dir_name, extension = base_name:match("(.*)%.(rockspec)$")
102 kind = "rockspec"
103 end
104 if not extension then
105 return nil, file.." does not seem to be a valid filename."
106 end
107
108 local exists = fs.exists(dir_name)
109 if exists and not force then
110 return nil, "Directory "..dir_name.." already exists."
111 end
112 if not exists then
113 local ok, err = fs.make_dir(dir_name)
114 if not ok then return nil, err end
115 end
116 local rollback = util.schedule_function(fs.delete, fs.absolute_name(dir_name))
117
118 local rockspec, err
119 if extension == "rock" then
120 rockspec, err = unpack_rock(file, dir_name, kind)
121 elseif extension == "rockspec" then
122 rockspec, err = unpack_rockspec(file, dir_name)
123 end
124 if not rockspec then
125 return nil, err
126 end
127 if kind == "src" or kind == "rockspec" then
128 if rockspec.source.dir ~= "." then
129 local ok = fs.copy(rockspec.local_filename, rockspec.source.dir, cfg.perm_read)
130 if not ok then
131 return nil, "Failed copying unpacked rockspec into unpacked source directory."
132 end
133 end
134 util.printout()
135 util.printout("Done. You may now enter directory ")
136 util.printout(dir.path(dir_name, rockspec.source.dir))
137 util.printout("and type 'luarocks make' to build.")
138 end
139 util.remove_scheduled_function(rollback)
140 return true
141end
142
143--- Driver function for the "unpack" command.
144-- @param name string: may be a rock filename, for unpacking a
145-- rock file or the name of a rock to be fetched and unpacked.
146-- @param version string or nil: if the name of a package is given, a
147-- version may also be passed.
148-- @return boolean or (nil, string): true if successful or nil followed
149-- by an error message.
150function unpack.command(flags, name, version)
151 assert(type(version) == "string" or not version)
152 if type(name) ~= "string" then
153 return nil, "Argument missing. "..util.see_help("unpack")
154 end
155
156 if name:match(".*%.rock") or name:match(".*%.rockspec") then
157 return run_unpacker(name, flags["force"])
158 else
159 local search = require("luarocks.search")
160 return search.act_on_src_or_rockspec(run_unpacker, name:lower(), version)
161 end
162end
163
164return unpack
diff --git a/src/luarocks/base/upload.lua b/src/luarocks/base/upload.lua
deleted file mode 100644
index baee47ab..00000000
--- a/src/luarocks/base/upload.lua
+++ /dev/null
@@ -1,94 +0,0 @@
1
2local upload = {}
3
4local util = require("luarocks.util")
5local fetch = require("luarocks.fetch")
6local pack = require("luarocks.pack")
7local cfg = require("luarocks.core.cfg")
8local Api = require("luarocks.upload.api")
9
10upload.help_summary = "Upload a rockspec to the public rocks repository."
11upload.help_arguments = "[--skip-pack] [--api-key=<key>] [--force] <rockspec>"
12upload.help = [[
13<rockspec> Pack a source rock file (.src.rock extension),
14 upload rockspec and source rock to server.
15--skip-pack Do not pack and send source rock.
16--api-key=<key> Give it an API key. It will be stored for subsequent uses.
17--force Replace existing rockspec if the same revision of
18 a module already exists. This should be used only
19 in case of upload mistakes: when updating a rockspec,
20 increment the revision number instead.
21]]
22
23function upload.command(flags, fname)
24 if not fname then
25 return nil, "Missing rockspec. "..util.see_help("upload")
26 end
27
28 local api, err = Api.new(flags)
29 if not api then
30 return nil, err
31 end
32 if cfg.verbose then
33 api.debug = true
34 end
35
36 local rockspec, err, errcode = fetch.load_rockspec(fname)
37 if err then
38 return nil, err, errcode
39 end
40
41 util.printout("Sending " .. tostring(fname) .. " ...")
42 local res, err = api:method("check_rockspec", {
43 package = rockspec.package,
44 version = rockspec.version
45 })
46 if not res then return nil, err end
47
48 if not res.module then
49 util.printout("Will create new module (" .. tostring(rockspec.package) .. ")")
50 end
51 if res.version and not flags["force"] then
52 return nil, "Revision "..rockspec.version.." already exists on the server. "..util.see_help("upload")
53 end
54
55 local rock_fname
56 if not flags["skip-pack"] and not rockspec.version:match("^scm") then
57 util.printout("Packing " .. tostring(rockspec.package))
58 rock_fname, err = pack.pack_source_rock(fname)
59 if not rock_fname then
60 return nil, err
61 end
62 end
63
64 local multipart = require("luarocks.upload.multipart")
65
66 res, err = api:method("upload", nil, {
67 rockspec_file = multipart.new_file(fname)
68 })
69 if not res then return nil, err end
70
71 if res.is_new and #res.manifests == 0 then
72 util.printerr("Warning: module not added to root manifest due to name taken.")
73 end
74
75 local module_url = res.module_url
76
77 if rock_fname then
78 if (not res.version) or (not res.version.id) then
79 return nil, "Invalid response from server."
80 end
81 util.printout(("Sending " .. tostring(rock_fname) .. " ..."))
82 res, err = api:method("upload_rock/" .. ("%d"):format(res.version.id), nil, {
83 rock_file = multipart.new_file(rock_fname)
84 })
85 if not res then return nil, err end
86 end
87
88 util.printout()
89 util.printout("Done: " .. tostring(module_url))
90 util.printout()
91 return true
92end
93
94return upload
diff --git a/src/luarocks/base/write_rockspec.lua b/src/luarocks/base/write_rockspec.lua
deleted file mode 100644
index be563eaa..00000000
--- a/src/luarocks/base/write_rockspec.lua
+++ /dev/null
@@ -1,376 +0,0 @@
1
2local write_rockspec = {}
3
4local cfg = require("luarocks.core.cfg")
5local dir = require("luarocks.dir")
6local fetch = require("luarocks.fetch")
7local fs = require("luarocks.fs")
8local path = require("luarocks.path")
9local persist = require("luarocks.persist")
10local type_check = require("luarocks.type_check")
11local util = require("luarocks.util")
12local deps = require("luarocks.deps")
13
14write_rockspec.help_summary = "Write a template for a rockspec file."
15write_rockspec.help_arguments = "[--output=<file> ...] [<name>] [<version>] [<url>|<path>]"
16write_rockspec.help = [[
17This command writes an initial version of a rockspec file,
18based on a name, a version, and a location (an URL or a local path).
19If only two arguments are given, the first one is considered the name and the
20second one is the location.
21If only one argument is given, it must be the location.
22If no arguments are given, current directory is used as location.
23LuaRocks will attempt to infer name and version if not given,
24using 'scm' as default version.
25
26Note that the generated file is a _starting point_ for writing a
27rockspec, and is not guaranteed to be complete or correct.
28
29--output=<file> Write the rockspec with the given filename.
30 If not given, a file is written in the current
31 directory with a filename based on given name and version.
32--license="<string>" A license string, such as "MIT/X11" or "GNU GPL v3".
33--summary="<txt>" A short one-line description summary.
34--detailed="<txt>" A longer description string.
35--homepage=<url> Project homepage.
36--lua-version=<ver> Supported Lua versions. Accepted values are "5.1", "5.2",
37 "5.3", "5.1,5.2", "5.2,5.3", or "5.1,5.2,5.3".
38--rockspec-format=<ver> Rockspec format version, such as "1.0" or "1.1".
39--tag=<tag> Tag to use. Will attempt to extract version number from it.
40--lib=<lib>[,<lib>] A comma-separated list of libraries that C files need to
41 link to.
42]]
43
44local function open_file(name)
45 return io.open(dir.path(fs.current_dir(), name), "r")
46end
47
48local function get_url(rockspec)
49 local file, temp_dir, err_code, err_file, err_temp_dir = fetch.fetch_sources(rockspec, false)
50 if err_code == "source.dir" then
51 file, temp_dir = err_file, err_temp_dir
52 elseif not file then
53 util.warning("Could not fetch sources - "..temp_dir)
54 return false
55 end
56 util.printout("File successfully downloaded. Making checksum and checking base dir...")
57 if fetch.is_basic_protocol(rockspec.source.protocol) then
58 rockspec.source.md5 = fs.get_md5(file)
59 end
60 local inferred_dir, found_dir = fetch.find_base_dir(file, temp_dir, rockspec.source.url)
61 return true, found_dir or inferred_dir, temp_dir
62end
63
64local function configure_lua_version(rockspec, luaver)
65 if luaver == "5.1" then
66 table.insert(rockspec.dependencies, "lua ~> 5.1")
67 elseif luaver == "5.2" then
68 table.insert(rockspec.dependencies, "lua ~> 5.2")
69 elseif luaver == "5.3" then
70 table.insert(rockspec.dependencies, "lua ~> 5.3")
71 elseif luaver == "5.1,5.2" then
72 table.insert(rockspec.dependencies, "lua >= 5.1, < 5.3")
73 elseif luaver == "5.2,5.3" then
74 table.insert(rockspec.dependencies, "lua >= 5.2, < 5.4")
75 elseif luaver == "5.1,5.2,5.3" then
76 table.insert(rockspec.dependencies, "lua >= 5.1, < 5.4")
77 else
78 util.warning("Please specify supported Lua version with --lua-version=<ver>. "..util.see_help("write_rockspec"))
79 end
80end
81
82local function detect_description()
83 local fd = open_file("README.md") or open_file("README")
84 if not fd then return end
85 local data = fd:read("*a")
86 fd:close()
87 local paragraph = data:match("\n\n([^%[].-)\n\n")
88 if not paragraph then paragraph = data:match("\n\n(.*)") end
89 local summary, detailed
90 if paragraph then
91 detailed = paragraph
92
93 if #paragraph < 80 then
94 summary = paragraph:gsub("\n", "")
95 else
96 summary = paragraph:gsub("\n", " "):match("([^.]*%.) ")
97 end
98 end
99 return summary, detailed
100end
101
102local function detect_mit_license(data)
103 local strip_copyright = (data:gsub("Copyright [^\n]*\n", ""))
104 local sum = 0
105 for i = 1, #strip_copyright do
106 local num = string.byte(strip_copyright:sub(i,i))
107 if num > 32 and num <= 128 then
108 sum = sum + num
109 end
110 end
111 return sum == 78656
112end
113
114local simple_scm_protocols = {
115 git = true, ["git+http"] = true, ["git+https"] = true,
116 hg = true, ["hg+http"] = true, ["hg+https"] = true
117}
118
119local function detect_url_from_command(program, args, directory)
120 local command = fs.Q(cfg.variables[program:upper()]).. " "..args
121 local pipe = io.popen(fs.command_at(directory, fs.quiet_stderr(command)))
122 if not pipe then return nil end
123 local url = pipe:read("*a"):match("^([^\r\n]+)")
124 pipe:close()
125 if not url then return nil end
126 if not util.starts_with(url, program.."://") then
127 url = program.."+"..url
128 end
129
130 if simple_scm_protocols[dir.split_url(url)] then
131 return url
132 end
133end
134
135local function detect_scm_url(directory)
136 return detect_url_from_command("git", "config --get remote.origin.url", directory) or
137 detect_url_from_command("hg", "paths default", directory)
138end
139
140local function show_license(rockspec)
141 local fd = open_file("COPYING") or open_file("LICENSE") or open_file("MIT-LICENSE.txt")
142 if not fd then return nil end
143 local data = fd:read("*a")
144 fd:close()
145 local is_mit = detect_mit_license(data)
146 util.title("License for "..rockspec.package..":")
147 util.printout(data)
148 util.printout()
149 return is_mit
150end
151
152local function get_cmod_name(file)
153 local fd = open_file(file)
154 if not fd then return nil end
155 local data = fd:read("*a")
156 fd:close()
157 return (data:match("int%s+luaopen_([a-zA-Z0-9_]+)"))
158end
159
160local luamod_blacklist = {
161 test = true,
162 tests = true,
163}
164
165local function fill_as_builtin(rockspec, libs)
166 rockspec.build.type = "builtin"
167 rockspec.build.modules = {}
168 local prefix = ""
169
170 for _, parent in ipairs({"src", "lua"}) do
171 if fs.is_dir(parent) then
172 fs.change_dir(parent)
173 prefix = parent.."/"
174 break
175 end
176 end
177
178 local incdirs, libdirs
179 if libs then
180 incdirs, libdirs = {}, {}
181 for _, lib in ipairs(libs) do
182 local upper = lib:upper()
183 incdirs[#incdirs+1] = "$("..upper.."_INCDIR)"
184 libdirs[#libdirs+1] = "$("..upper.."_LIBDIR)"
185 end
186 end
187
188 for _, file in ipairs(fs.find()) do
189 local luamod = file:match("(.*)%.lua$")
190 if luamod and not luamod_blacklist[luamod] then
191 rockspec.build.modules[path.path_to_module(file)] = prefix..file
192 else
193 local cmod = file:match("(.*)%.c$")
194 if cmod then
195 local modname = get_cmod_name(file) or path.path_to_module(file:gsub("%.c$", ".lua"))
196 rockspec.build.modules[modname] = {
197 sources = prefix..file,
198 libraries = libs,
199 incdirs = incdirs,
200 libdirs = libdirs,
201 }
202 end
203 end
204 end
205
206 for _, directory in ipairs({ "doc", "docs", "samples", "tests" }) do
207 if fs.is_dir(directory) then
208 if not rockspec.build.copy_directories then
209 rockspec.build.copy_directories = {}
210 end
211 table.insert(rockspec.build.copy_directories, directory)
212 end
213 end
214
215 if prefix ~= "" then
216 fs.pop_dir()
217 end
218end
219
220local function rockspec_cleanup(rockspec)
221 rockspec.source.file = nil
222 rockspec.source.protocol = nil
223 rockspec.variables = nil
224 rockspec.name = nil
225 rockspec.format_is_at_least = nil
226end
227
228function write_rockspec.command(flags, name, version, url_or_dir)
229 if not name then
230 url_or_dir = "."
231 elseif not version then
232 url_or_dir = name
233 name = nil
234 elseif not url_or_dir then
235 url_or_dir = version
236 version = nil
237 end
238
239 if flags["tag"] then
240 if not version then
241 version = flags["tag"]:gsub("^v", "")
242 end
243 end
244
245 local protocol, pathname = dir.split_url(url_or_dir)
246 if protocol == "file" then
247 if pathname == "." then
248 name = name or dir.base_name(fs.current_dir())
249 end
250 elseif fetch.is_basic_protocol(protocol) then
251 local filename = dir.base_name(url_or_dir)
252 local newname, newversion = filename:match("(.*)-([^-]+)")
253 if newname then
254 name = name or newname
255 version = version or newversion:gsub("%.[a-z]+$", ""):gsub("%.tar$", "")
256 end
257 else
258 name = name or dir.base_name(url_or_dir):gsub("%.[^.]+$", "")
259 end
260
261 if not name then
262 return nil, "Could not infer rock name. "..util.see_help("write_rockspec")
263 end
264 version = version or "scm"
265
266 local filename = flags["output"] or dir.path(fs.current_dir(), name:lower().."-"..version.."-1.rockspec")
267
268 local rockspec = {
269 rockspec_format = flags["rockspec-format"],
270 package = name,
271 name = name:lower(),
272 version = version.."-1",
273 source = {
274 url = "*** please add URL for source tarball, zip or repository here ***",
275 tag = flags["tag"],
276 },
277 description = {
278 summary = flags["summary"] or "*** please specify description summary ***",
279 detailed = flags["detailed"] or "*** please enter a detailed description ***",
280 homepage = flags["homepage"] or "*** please enter a project homepage ***",
281 license = flags["license"] or "*** please specify a license ***",
282 },
283 dependencies = {},
284 build = {},
285 }
286 path.configure_paths(rockspec)
287 rockspec.source.protocol = protocol
288 rockspec.format_is_at_least = deps.format_is_at_least
289
290 configure_lua_version(rockspec, flags["lua-version"])
291
292 local local_dir = url_or_dir
293
294 if url_or_dir:match("://") then
295 rockspec.source.url = url_or_dir
296 rockspec.source.file = dir.base_name(url_or_dir)
297 rockspec.source.dir = "dummy"
298 if not fetch.is_basic_protocol(rockspec.source.protocol) then
299 if version ~= "scm" then
300 rockspec.source.tag = flags["tag"] or "v" .. version
301 end
302 end
303 rockspec.source.dir = nil
304 local ok, base_dir, temp_dir = get_url(rockspec)
305 if ok then
306 if base_dir ~= dir.base_name(url_or_dir) then
307 rockspec.source.dir = base_dir
308 end
309 end
310 if base_dir then
311 local_dir = dir.path(temp_dir, base_dir)
312 else
313 local_dir = nil
314 end
315 else
316 rockspec.source.url = detect_scm_url(local_dir) or rockspec.source.url
317 end
318
319 if not local_dir then
320 local_dir = "."
321 end
322
323 if not flags["homepage"] then
324 local url_protocol, url_path = dir.split_url(rockspec.source.url)
325
326 if simple_scm_protocols[url_protocol] then
327 for _, domain in ipairs({"github.com", "bitbucket.org", "gitlab.com"}) do
328 if util.starts_with(url_path, domain) then
329 rockspec.description.homepage = "https://"..url_path:gsub("%.git$", "")
330 break
331 end
332 end
333 end
334 end
335
336 local libs = nil
337 if flags["lib"] then
338 libs = {}
339 rockspec.external_dependencies = {}
340 for lib in flags["lib"]:gmatch("([^,]+)") do
341 table.insert(libs, lib)
342 rockspec.external_dependencies[lib:upper()] = {
343 library = lib
344 }
345 end
346 end
347
348 local ok, err = fs.change_dir(local_dir)
349 if not ok then return nil, "Failed reaching files from project - error entering directory "..local_dir end
350
351 if (not flags["summary"]) or (not flags["detailed"]) then
352 local summary, detailed = detect_description()
353 rockspec.description.summary = flags["summary"] or summary
354 rockspec.description.detailed = flags["detailed"] or detailed
355 end
356
357 local is_mit = show_license(rockspec)
358
359 if is_mit and not flags["license"] then
360 rockspec.description.license = "MIT"
361 end
362
363 fill_as_builtin(rockspec, libs)
364
365 rockspec_cleanup(rockspec)
366
367 persist.save_from_table(filename, rockspec, type_check.rockspec_order)
368
369 util.printout()
370 util.printout("Wrote template at "..filename.." -- you should now edit and finish it.")
371 util.printout()
372
373 return true
374end
375
376return write_rockspec
diff --git a/src/luarocks/base/build.lua b/src/luarocks/build.lua
index f3b054d2..f3b054d2 100644
--- a/src/luarocks/base/build.lua
+++ b/src/luarocks/build.lua
diff --git a/src/luarocks/base/download.lua b/src/luarocks/download.lua
index 557d1b65..557d1b65 100644
--- a/src/luarocks/base/download.lua
+++ b/src/luarocks/download.lua
diff --git a/src/luarocks/base/pack.lua b/src/luarocks/pack.lua
index 655cbf37..655cbf37 100644
--- a/src/luarocks/base/pack.lua
+++ b/src/luarocks/pack.lua
diff --git a/src/luarocks/base/remove.lua b/src/luarocks/remove.lua
index e7f37604..e7f37604 100644
--- a/src/luarocks/base/remove.lua
+++ b/src/luarocks/remove.lua
diff --git a/src/luarocks/base/search.lua b/src/luarocks/search.lua
index 44eff694..44eff694 100644
--- a/src/luarocks/base/search.lua
+++ b/src/luarocks/search.lua