From a3b0f72ddedf1c7d6586632e8af416ea20854cf8 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Mon, 3 Feb 2014 09:59:03 -0200 Subject: Make `luarocks doc` return something meaningful even for rocks that are not installed. --- src/luarocks/doc.lua | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/src/luarocks/doc.lua b/src/luarocks/doc.lua index 1a843f37..324bf028 100644 --- a/src/luarocks/doc.lua +++ b/src/luarocks/doc.lua @@ -9,6 +9,7 @@ local path = require("luarocks.path") local dir = require("luarocks.dir") local fetch = require("luarocks.fetch") local fs = require("luarocks.fs") +local download = require("luarocks.download") help_summary = "Shows documentation for an installed rock." @@ -24,6 +25,33 @@ With these flags, return only the desired information: For more information about a rock, see the 'show' command. ]] +local function show_homepage(homepage, name, version) + if not homepage then + return nil, "No 'homepage' field in rockspec for "..name.." "..version + end + util.printout("Opening "..homepage.." ...") + fs.browser(homepage) + return true +end + +local function try_to_open_homepage(name, version) + local temp_dir, err = fs.make_temp_dir("doc-"..name.."-"..(version or "")) + if not temp_dir then + return nil, "Failed creating temporary directory: "..err + end + util.schedule_function(fs.delete, temp_dir) + local ok, err = fs.change_dir(temp_dir) + if not ok then return nil, err end + local filename, err = download.download("rockspec", name, version) + if not filename then return nil, err end + local rockspec, err = fetch.load_local_rockspec(filename) + if not rockspec then return nil, err end + fs.pop_dir() + local descript = rockspec.description or {} + if not descript.homepage then return nil, "No homepage defined for "..name end + return show_homepage(descript.homepage, name, version) +end + --- Driver function for "doc" command. -- @param name or nil: an existing package name. -- @param version string or nil: a version may also be passed. @@ -34,23 +62,19 @@ function run(...) return nil, "Argument missing. "..util.see_help("doc") end - local repo - name, version, repo = show.pick_installed_rock(name, version, flags["tree"]) - if not name then - return nil, version + local iname, iversion, repo = show.pick_installed_rock(name, version, flags["tree"]) + if not iname then + util.printout(name..(version and " "..version or "").." is not installed. Looking for it in the rocks servers...") + return try_to_open_homepage(name, version) end + name, version = iname, iversion local rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version, repo)) if not rockspec then return nil,err end local descript = rockspec.description or {} if flags["homepage"] then - if not descript.homepage then - return nil, "No 'homepage' field in rockspec for "..name.." "..version - end - util.printout("Opening "..descript.homepage.." ...") - fs.browser(descript.homepage) - return true + return show_homepage(descript.homepage, name, version) end local directory = path.install_dir(name,version,repo) -- cgit v1.2.3-55-g6feb