aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2018-06-24 19:15:15 -0300
committerHisham Muhammad <hisham@gobolinux.org>2018-07-01 15:51:36 -0300
commit9add0ca679b6bf273fe7aad7fa8fbc03119649f6 (patch)
treebc28d310286150dd17cbdfc50f8fb5d67ed22fde /src
parent1c2fe8bad11a343c63e658cf43dcbf30c930eec5 (diff)
downloadluarocks-9add0ca679b6bf273fe7aad7fa8fbc03119649f6.tar.gz
luarocks-9add0ca679b6bf273fe7aad7fa8fbc03119649f6.tar.bz2
luarocks-9add0ca679b6bf273fe7aad7fa8fbc03119649f6.zip
show: add --porcelain and --rock-license options
Diffstat (limited to 'src')
-rw-r--r--src/luarocks/cmd/show.lua203
-rw-r--r--src/luarocks/util.lua1
2 files changed, 130 insertions, 74 deletions
diff --git a/src/luarocks/cmd/show.lua b/src/luarocks/cmd/show.lua
index ffac440b..b6242cbc 100644
--- a/src/luarocks/cmd/show.lua
+++ b/src/luarocks/cmd/show.lua
@@ -29,6 +29,59 @@ With these flags, return only the desired information:
29--rock-dir data directory of the installed rock 29--rock-dir data directory of the installed rock
30]] 30]]
31 31
32
33local friendly_template = [[
34 :
35?namespace:${namespace}/${package} ${version} - ${summary}
36!namespace:${package} ${version} - ${summary}
37 :
38*detailed :${detailed}
39?detailed :
40?license :License: \t${license}
41?homepage :Homepage: \t${homepage}
42?issues :Issues: \t${issues}
43?labels :Labels: \t${labels}
44?location :Installed in: \t${location}
45?commands :
46?commands :Commands:
47*commands :\t${name} (${repo})
48?modules :
49?modules :Modules:
50*modules :\t${name} (${repo})
51?bdeps :
52?bdeps :Has build dependency on:
53*bdeps :\t${name} (${label})
54?tdeps :
55?tdeps :Tests depend on:
56*tdeps :\t${name} (${label})
57?deps :
58?deps :Depends on:
59*deps :\t${name} (${label})
60?ideps :
61?ideps :Indirectly pulling:
62*ideps :\t${name} (${label})
63 :
64]]
65
66local porcelain_template = [[
67?namespace:namespace\t${namespace}
68?package :package\t${package}
69?version :version\t${version}
70?summary :summary\t${summary}
71*detailed :detailed\t${detailed}
72?license :license\t${license}
73?homepage :homepage\t${homepage}
74?issues :issues\t${issues}
75?labels :labels\t${labels}
76?location :location\t${location}
77*commands :command\t${name}\t${repo}
78*modules :module\t${name}\t${repo}
79*bdeps :build_dependency\t${name}\t${label}
80*tdeps :test_dependency\t${name}\t${label}
81*deps :dependency\t${name}\t${label}
82*ideps :indirect_dependency\t${name}\t${label}
83]]
84
32local function keys_as_string(t, sep) 85local function keys_as_string(t, sep)
33 local keys = util.keys(t) 86 local keys = util.keys(t)
34 table.sort(keys) 87 table.sort(keys)
@@ -66,13 +119,82 @@ local function installed_rock_label(dep, tree)
66 else 119 else
67 installed, version = search.pick_installed_rock(dep, tree) 120 installed, version = search.pick_installed_rock(dep, tree)
68 end 121 end
69 return installed and "(using "..version..")" or "(missing)" 122 return installed and "using "..version or "missing"
123end
124
125local function render(template, data)
126 local out = {}
127 for cmd, var, line in template:gmatch("(.)([a-z]*)%s*:([^\n]*)\n") do
128 line = line:gsub("\\t", "\t")
129 local d = data[var]
130 if cmd == " " then
131 table.insert(out, line)
132 elseif cmd == "?" or cmd == "*" or cmd == "!" then
133 if (cmd == "!" and d == nil)
134 or (cmd ~= "!" and (type(d) == "string"
135 or (type(d) == "table" and next(d)))) then
136 local n = cmd == "*" and #d or 1
137 for i = 1, n do
138 local tbl = cmd == "*" and d[i] or data
139 table.insert(out, (line:gsub("${([a-z]+)}", tbl)))
140 end
141 end
142 end
143 end
144 return table.concat(out, "\n")
70end 145end
71 146
72local function print_items(name, version, item_set, item_type, repo) 147local function files_to_list(name, version, item_set, item_type, repo)
148 local ret = {}
73 for item_name in util.sortedpairs(item_set) do 149 for item_name in util.sortedpairs(item_set) do
74 util.printout("\t"..item_name.." ("..repos.which(name, version, item_type, item_name, repo)..")") 150 table.insert(ret, { name = item_name, repo = repos.which(name, version, item_type, item_name, repo) })
75 end 151 end
152 return ret
153end
154
155local function deps_to_list(dependencies, tree)
156 local ret = {}
157 for _, dep in ipairs(dependencies or {}) do
158 table.insert(ret, { name = tostring(dep), label = installed_rock_label(dep, tree) })
159 end
160 return ret
161end
162
163local function indirect_deps(mdeps, rdeps, tree)
164 local ret = {}
165 local direct_deps = {}
166 for _, dep in ipairs(rdeps) do
167 direct_deps[dep] = true
168 end
169 for dep_name in util.sortedpairs(mdeps or {}) do
170 if not direct_deps[dep_name] then
171 table.insert(ret, { name = tostring(dep_name), label = installed_rock_label(queries.new(dep_name), tree) })
172 end
173 end
174 return ret
175end
176
177local function show_rock(template, namespace, name, version, rockspec, repo, minfo, tree)
178 local desc = rockspec.description
179 local data = {
180 namespace = namespace,
181 package = rockspec.package,
182 version = rockspec.version,
183 summary = desc.summary or "",
184 detailed = desc.detailed and util.split_string(format_text(desc.detailed), "\n"),
185 license = desc.license,
186 homepage = desc.homepage,
187 issues = desc.issues_url,
188 labels = desc.labels and table.concat(desc.labels, ", "),
189 location = path.rocks_tree_to_string(repo),
190 commands = files_to_list(name, version, minfo.commands, "command", repo),
191 modules = files_to_list(name, version, minfo.modules, "module", repo),
192 bdeps = deps_to_list(rockspec.build_dependencies, tree),
193 tdeps = deps_to_list(rockspec.test_dependencies, tree),
194 deps = deps_to_list(rockspec.dependencies, tree),
195 ideps = indirect_deps(minfo.dependencies, rockspec.dependencies, tree),
196 }
197 util.printout(render(template, data))
76end 198end
77 199
78--- Driver function for "show" command. 200--- Driver function for "show" command.
@@ -108,6 +230,7 @@ function show.command(flags, name, version)
108 elseif flags["rock-namespace"] then util.printout(namespace) 230 elseif flags["rock-namespace"] then util.printout(namespace)
109 elseif flags["rock-dir"] then util.printout(directory) 231 elseif flags["rock-dir"] then util.printout(directory)
110 elseif flags["home"] then util.printout(descript.homepage) 232 elseif flags["home"] then util.printout(descript.homepage)
233 elseif flags["rock-license"] then util.printout(descript.license)
111 elseif flags["issues"] then util.printout(descript.issues_url) 234 elseif flags["issues"] then util.printout(descript.issues_url)
112 elseif flags["labels"] then util.printout(descript.labels and table.concat(descript.labels, "\n")) 235 elseif flags["labels"] then util.printout(descript.labels and table.concat(descript.labels, "\n"))
113 elseif flags["modules"] then util.printout(keys_as_string(minfo.modules, "\n")) 236 elseif flags["modules"] then util.printout(keys_as_string(minfo.modules, "\n"))
@@ -125,78 +248,10 @@ function show.command(flags, name, version)
125 end 248 end
126 elseif flags["rockspec"] then util.printout(rockspec_file) 249 elseif flags["rockspec"] then util.printout(rockspec_file)
127 elseif flags["mversion"] then util.printout(version) 250 elseif flags["mversion"] then util.printout(version)
251 elseif flags["porcelain"] then
252 show_rock(porcelain_template, namespace, name, version, rockspec, repo, minfo, flags["tree"])
128 else 253 else
129 util.printout() 254 show_rock(friendly_template, namespace, name, version, rockspec, repo, minfo, flags["tree"])
130 util.printout((namespace and namespace .."/" or "") .. rockspec.package.." "..rockspec.version.." - "..(descript.summary or ""))
131 util.printout()
132 if descript.detailed then
133 util.printout(format_text(descript.detailed))
134 util.printout()
135 end
136 if descript.license then
137 util.printout("License: ", descript.license)
138 end
139 if descript.homepage then
140 util.printout("Homepage: ", descript.homepage)
141 end
142 if descript.issues_url then
143 util.printout("Issues: ", descript.issues_url)
144 end
145 if descript.labels then
146 util.printout("Labels: ", table.concat(descript.labels, ", "))
147 end
148 util.printout("Installed in: ", path.rocks_tree_to_string(repo))
149
150 if next(minfo.commands) then
151 util.printout()
152 util.printout("Commands: ")
153 print_items(name, version, minfo.commands, "command", repo)
154 end
155
156 if next(minfo.modules) then
157 util.printout()
158 util.printout("Modules: ")
159 print_items(name, version, minfo.modules, "module", repo)
160 end
161
162 if #rockspec.build_dependencies > 0 then
163 util.printout()
164 util.printout("Has build dependency on:")
165 for _, dep in ipairs(rockspec.build_dependencies) do
166 util.printout("\t"..tostring(dep).." "..installed_rock_label(dep, flags["tree"]))
167 end
168 end
169
170 if #rockspec.test_dependencies > 0 then
171 util.printout()
172 util.printout("Tests depend on:")
173 for _, dep in ipairs(rockspec.test_dependencies) do
174 util.printout("\t"..tostring(dep).." "..installed_rock_label(dep, flags["tree"]))
175 end
176 end
177
178 local direct_deps = {}
179 if #rockspec.dependencies > 0 then
180 util.printout()
181 util.printout("Depends on:")
182 for _, dep in ipairs(rockspec.dependencies) do
183 direct_deps[dep.name] = true
184 util.printout("\t"..tostring(dep).." "..installed_rock_label(dep, flags["tree"]))
185 end
186 end
187 local has_indirect_deps
188 for dep_name in util.sortedpairs(minfo.dependencies or {}) do
189 if not direct_deps[dep_name] then
190 if not has_indirect_deps then
191 util.printout()
192 util.printout("Indirectly pulling:")
193 has_indirect_deps = true
194 end
195
196 util.printout("\t"..tostring(dep_name).." "..installed_rock_label(queries.new(dep_name), flags["tree"]))
197 end
198 end
199 util.printout()
200 end 255 end
201 return true 256 return true
202end 257end
diff --git a/src/luarocks/util.lua b/src/luarocks/util.lua
index fd2b7b42..bb81d61b 100644
--- a/src/luarocks/util.lua
+++ b/src/luarocks/util.lua
@@ -138,6 +138,7 @@ local supported_flags = {
138 ["project-tree"] = "<tree>", 138 ["project-tree"] = "<tree>",
139 ["quick"] = true, 139 ["quick"] = true,
140 ["rock-dir"] = true, 140 ["rock-dir"] = true,
141 ["rock-license"] = true,
141 ["rock-namespace"] = true, 142 ["rock-namespace"] = true,
142 ["rock-tree"] = true, 143 ["rock-tree"] = true,
143 ["rock-trees"] = true, 144 ["rock-trees"] = true,