diff options
| author | hisham <hisham@9ca3f7c1-7366-0410-b1a3-b5c78f85698c> | 2009-10-04 16:12:07 +0000 |
|---|---|---|
| committer | hisham <hisham@9ca3f7c1-7366-0410-b1a3-b5c78f85698c> | 2009-10-04 16:12:07 +0000 |
| commit | c9c83162748bea1f9c1b6574ce3cc6560e5490b4 (patch) | |
| tree | dddafb3f264cae08a077c34f38e96919355208a3 /src | |
| parent | 57bd8fe99a3374f7890b7dfe1e2ffd726ea5f8cf (diff) | |
| download | luarocks-c9c83162748bea1f9c1b6574ce3cc6560e5490b4.tar.gz luarocks-c9c83162748bea1f9c1b6574ce3cc6560e5490b4.tar.bz2 luarocks-c9c83162748bea1f9c1b6574ce3cc6560e5490b4.zip | |
Simplify the way things are handled for the new LuaRocks tree by creating rock_manifest files for each rock.
git-svn-id: http://luarocks.org/svn/luarocks/trunk@62 9ca3f7c1-7366-0410-b1a3-b5c78f85698c
Diffstat (limited to 'src')
| -rw-r--r-- | src/luarocks/build.lua | 16 | ||||
| -rw-r--r-- | src/luarocks/install.lua | 25 | ||||
| -rw-r--r-- | src/luarocks/make_manifest.lua | 3 | ||||
| -rw-r--r-- | src/luarocks/manif.lua | 371 | ||||
| -rw-r--r-- | src/luarocks/pack.lua | 9 | ||||
| -rw-r--r-- | src/luarocks/rep.lua | 148 |
6 files changed, 253 insertions, 319 deletions
diff --git a/src/luarocks/build.lua b/src/luarocks/build.lua index a6fe1c45..997929a8 100644 --- a/src/luarocks/build.lua +++ b/src/luarocks/build.lua | |||
| @@ -211,18 +211,18 @@ function build_rockspec(rockspec_file, need_to_fetch, minimal_mode) | |||
| 211 | fs.pop_dir() | 211 | fs.pop_dir() |
| 212 | end | 212 | end |
| 213 | 213 | ||
| 214 | ok, err = rep.install_bins(name, version) | 214 | ok, err = manif.make_rock_manifest(name, version) |
| 215 | if not ok then return nil, err end | 215 | if err then return nil, err end |
| 216 | |||
| 217 | ok, err = rep.deploy_files(name, version) | ||
| 218 | if err then return nil, err end | ||
| 216 | 219 | ||
| 217 | ok, err = rep.run_hook(rockspec, "post_install") | 220 | ok, err = rep.run_hook(rockspec, "post_install") |
| 218 | if err then | 221 | if err then return nil, err end |
| 219 | return nil, err | ||
| 220 | end | ||
| 221 | 222 | ||
| 222 | ok, err = manif.update_manifest(name, version) | 223 | ok, err = manif.update_manifest(name, version) |
| 223 | if err then | 224 | if err then return nil, err end |
| 224 | return nil, err | 225 | |
| 225 | end | ||
| 226 | util.remove_scheduled_function(rollback) | 226 | util.remove_scheduled_function(rollback) |
| 227 | return true | 227 | return true |
| 228 | end | 228 | end |
diff --git a/src/luarocks/install.lua b/src/luarocks/install.lua index 3ef32c99..15e905e1 100644 --- a/src/luarocks/install.lua +++ b/src/luarocks/install.lua | |||
| @@ -38,38 +38,35 @@ function install_binary_rock(rock_file) | |||
| 38 | if rep.is_installed(name, version) then | 38 | if rep.is_installed(name, version) then |
| 39 | rep.delete_version(name, version) | 39 | rep.delete_version(name, version) |
| 40 | end | 40 | end |
| 41 | |||
| 41 | local rollback = util.schedule_function(function() | 42 | local rollback = util.schedule_function(function() |
| 42 | fs.delete(path.install_dir(name, version)) | 43 | fs.delete(path.install_dir(name, version)) |
| 43 | fs.remove_dir_if_empty(path.versions_dir(name)) | 44 | fs.remove_dir_if_empty(path.versions_dir(name)) |
| 44 | end) | 45 | end) |
| 46 | |||
| 45 | local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, path.install_dir(name, version)) | 47 | local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, path.install_dir(name, version)) |
| 46 | if not ok then return nil, err, errcode end | 48 | if not ok then return nil, err, errcode end |
| 47 | ok, err = rep.install_bins(name, version) | 49 | |
| 48 | |||
| 49 | local rockspec, err, errcode = fetch.load_rockspec(path.rockspec_file(name, version)) | 50 | local rockspec, err, errcode = fetch.load_rockspec(path.rockspec_file(name, version)) |
| 50 | if err then | 51 | if err then |
| 51 | return nil, "Failed loading rockspec for installed package: "..err, errcode | 52 | return nil, "Failed loading rockspec for installed package: "..err, errcode |
| 52 | end | 53 | end |
| 53 | 54 | ||
| 54 | ok, err, errcode = deps.check_external_deps(rockspec, "install") | 55 | ok, err, errcode = deps.check_external_deps(rockspec, "install") |
| 55 | if err then | 56 | if err then return nil, err, errcode end |
| 56 | return nil, err, errcode | ||
| 57 | end | ||
| 58 | 57 | ||
| 59 | ok, err, errcode = deps.fulfill_dependencies(rockspec) | 58 | ok, err, errcode = deps.fulfill_dependencies(rockspec) |
| 60 | if err then | 59 | if err then return nil, err, errcode end |
| 61 | return nil, err, errcode | ||
| 62 | end | ||
| 63 | 60 | ||
| 64 | ok, err = rep.run_hook(rockspec, "post_install") | 61 | ok, err = rep.run_hook(rockspec, "post_install") |
| 65 | if err then | 62 | if err then return nil, err end |
| 66 | return nil, err | 63 | |
| 67 | end | 64 | ok, err = rep.deploy_files(name, version) |
| 65 | if err then return nil, err end | ||
| 68 | 66 | ||
| 69 | ok, err = manif.update_manifest(name, version) | 67 | ok, err = manif.update_manifest(name, version) |
| 70 | if err then | 68 | if err then return nil, err end |
| 71 | return nil, err | 69 | |
| 72 | end | ||
| 73 | util.remove_scheduled_function(rollback) | 70 | util.remove_scheduled_function(rollback) |
| 74 | return true | 71 | return true |
| 75 | end | 72 | end |
diff --git a/src/luarocks/make_manifest.lua b/src/luarocks/make_manifest.lua index 622c21a0..bec1b704 100644 --- a/src/luarocks/make_manifest.lua +++ b/src/luarocks/make_manifest.lua | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | module("luarocks.make_manifest", package.seeall) | 4 | module("luarocks.make_manifest", package.seeall) |
| 5 | 5 | ||
| 6 | local manif = require("luarocks.manif") | 6 | local manif = require("luarocks.manif") |
| 7 | local index = require("luarocks.index") | ||
| 7 | local cfg = require("luarocks.cfg") | 8 | local cfg = require("luarocks.cfg") |
| 8 | 9 | ||
| 9 | help_summary = "Compile a manifest file for a repository." | 10 | help_summary = "Compile a manifest file for a repository." |
| @@ -26,7 +27,7 @@ function run(repo) | |||
| 26 | ok, err = manif.make_manifest(repo) | 27 | ok, err = manif.make_manifest(repo) |
| 27 | if ok then | 28 | if ok then |
| 28 | print("Generating index.html for "..repo) | 29 | print("Generating index.html for "..repo) |
| 29 | manif.make_index(repo) | 30 | index.make_index(repo) |
| 30 | end | 31 | end |
| 31 | return ok, err | 32 | return ok, err |
| 32 | end | 33 | end |
diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua index 2343489b..de885ca5 100644 --- a/src/luarocks/manif.lua +++ b/src/luarocks/manif.lua | |||
| @@ -1,85 +1,77 @@ | |||
| 1 | 1 | ||
| 2 | --- Functions for querying and manipulating manifest files. | ||
| 3 | module("luarocks.manif", package.seeall) | 2 | module("luarocks.manif", package.seeall) |
| 4 | 3 | ||
| 5 | local util = require("luarocks.util") | 4 | local manif_core = require("luarocks.manif_core") |
| 5 | local persist = require("luarocks.persist") | ||
| 6 | local fetch = require("luarocks.fetch") | ||
| 7 | local dir = require("luarocks.dir") | ||
| 6 | local fs = require("luarocks.fs") | 8 | local fs = require("luarocks.fs") |
| 7 | local search = require("luarocks.search") | 9 | local search = require("luarocks.search") |
| 10 | local util = require("luarocks.util") | ||
| 11 | local cfg = require("luarocks.cfg") | ||
| 12 | local path = require("luarocks.path") | ||
| 8 | local rep = require("luarocks.rep") | 13 | local rep = require("luarocks.rep") |
| 9 | local deps = require("luarocks.deps") | 14 | local deps = require("luarocks.deps") |
| 10 | local cfg = require("luarocks.cfg") | ||
| 11 | local persist = require("luarocks.persist") | ||
| 12 | local fetch = require("luarocks.fetch") | ||
| 13 | local dir = require("luarocks.dir") | ||
| 14 | local manif_core = require("luarocks.manif_core") | ||
| 15 | 15 | ||
| 16 | local function find_module_at_file(file, modules) | 16 | rock_manifest_cache = {} |
| 17 | for module, location in pairs(modules) do | 17 | |
| 18 | if file == location then | 18 | --- Commit a table to disk in given local path. |
| 19 | return module | 19 | -- @param where string: The directory where the table should be saved. |
| 20 | end | 20 | -- @param name string: The filename. |
| 21 | end | 21 | -- @param tbl table: The table to be saved. |
| 22 | end | 22 | -- @return boolean or (nil, string): true if successful, or nil and a |
| 23 | -- message in case of errors. | ||
| 24 | local function save_table(where, name, tbl) | ||
| 25 | assert(type(where) == "string") | ||
| 26 | assert(type(name) == "string") | ||
| 27 | assert(type(tbl) == "table") | ||
| 23 | 28 | ||
| 24 | local function rename_module(file, pkgid) | 29 | local filename = dir.path(where, name) |
| 25 | local path = dir.dir_name(file) | 30 | return persist.save_from_table(filename, tbl) |
| 26 | local name = dir.base_name(file) | ||
| 27 | local pkgid = pkgid:gsub("[/.-]", "_") | ||
| 28 | return dir.path(path, pkgid.."-"..name) | ||
| 29 | end | 31 | end |
| 30 | 32 | ||
| 31 | local function update_global_lib(repo, manifest) | 33 | function load_rock_manifest(name, version) |
| 32 | fs.make_dir(cfg.lua_modules_dir) | 34 | assert(type(name) == "string") |
| 33 | fs.make_dir(cfg.bin_modules_dir) | 35 | assert(type(version) == "string") |
| 34 | for rock, modules in pairs(manifest.modules) do | ||
| 35 | for module, file in pairs(modules) do | ||
| 36 | local module_type, modules_dir | ||
| 37 | |||
| 38 | if file:match("%."..cfg.lua_extension.."$") then | ||
| 39 | module_type = "lua" | ||
| 40 | modules_dir = cfg.lua_modules_dir | ||
| 41 | else | ||
| 42 | module_type = "bin" | ||
| 43 | modules_dir = cfg.bin_modules_dir | ||
| 44 | end | ||
| 45 | 36 | ||
| 46 | if not file:match("^"..modules_dir) then | 37 | local name_version = name.."/"..version |
| 47 | local path_in_rock = dir.strip_base_dir(file:sub(#dir.path(repo, module)+2)) | 38 | if rock_manifest_cache[name_version] then |
| 48 | local module_dir = dir.dir_name(path_in_rock) | 39 | return rock_manifest_cache[name_version].rock_manifest |
| 49 | local dest = dir.path(modules_dir, path_in_rock) | 40 | end |
| 50 | if module_dir ~= "" then | 41 | local install_dir = path.install_dir(name, version) |
| 51 | fs.make_dir(dir.dir_name(dest)) | 42 | local pathname = dir.path(install_dir, "rock_manifest") |
| 52 | end | 43 | local rock_manifest = persist.load_into_table(pathname) |
| 53 | if not fs.exists(dest) then | 44 | if not rock_manifest then return nil end |
| 54 | fs.move(file, dest) | 45 | rock_manifest_cache[name_version] = rock_manifest |
| 55 | fs.remove_dir_tree_if_empty(dir.dir_name(file)) | 46 | return rock_manifest.rock_manifest |
| 56 | manifest.modules[rock][module] = dest | 47 | end |
| 57 | else | 48 | |
| 58 | local current = find_module_at_file(dest, modules) | 49 | function make_rock_manifest(name, version) |
| 59 | if not current then | 50 | local install_dir = path.install_dir(name, version) |
| 60 | util.warning("installed file not tracked by LuaRocks: "..dest) | 51 | local rock_manifest = dir.path(install_dir, "rock_manifest") |
| 61 | else | 52 | local tree = {} |
| 62 | local newname = rename_module(dest, current) | 53 | for _, file in ipairs(fs.find(install_dir)) do |
| 63 | if fs.exists(newname) then | 54 | local full_path = dir.path(install_dir, file) |
| 64 | util.warning("conflict when tracking modules: "..newname.." exists.") | 55 | local walk = tree |
| 65 | else | 56 | local last |
| 66 | local ok, err = fs.move(dest, newname) | 57 | local last_name |
| 67 | if ok then | 58 | for name in file:gmatch("[^/]+") do |
| 68 | manifest.modules[rock][current] = newname | 59 | local next = walk[name] |
| 69 | fs.move(file, dest) | 60 | if not next then |
| 70 | fs.remove_dir_tree_if_empty(dir.dir_name(file)) | 61 | next = {} |
| 71 | manifest.modules[rock][module] = dest | 62 | walk[name] = next |
| 72 | else | ||
| 73 | util.warning(err) | ||
| 74 | end | ||
| 75 | end | ||
| 76 | end | ||
| 77 | end | ||
| 78 | else | ||
| 79 | -- print("File already in place.") | ||
| 80 | end | 63 | end |
| 64 | last = walk | ||
| 65 | last_name = name | ||
| 66 | walk = next | ||
| 67 | end | ||
| 68 | if fs.is_file(full_path) then | ||
| 69 | last[last_name] = fs.get_md5(full_path) | ||
| 81 | end | 70 | end |
| 82 | end | 71 | end |
| 72 | local rock_manifest = { rock_manifest=tree } | ||
| 73 | rock_manifest_cache[name.."/"..version] = rock_manifest | ||
| 74 | save_table(install_dir, "rock_manifest", rock_manifest ) | ||
| 83 | end | 75 | end |
| 84 | 76 | ||
| 85 | --- Load a local or remote manifest describing a repository. | 77 | --- Load a local or remote manifest describing a repository. |
| @@ -110,23 +102,6 @@ function load_manifest(repo_url) | |||
| 110 | return manif_core.manifest_loader(pathname, repo_url) | 102 | return manif_core.manifest_loader(pathname, repo_url) |
| 111 | end | 103 | end |
| 112 | 104 | ||
| 113 | --- Sort function for ordering rock identifiers in a manifest's | ||
| 114 | -- modules table. Rocks are ordered alphabetically by name, and then | ||
| 115 | -- by version which greater first. | ||
| 116 | -- @param a string: Version to compare. | ||
| 117 | -- @param b string: Version to compare. | ||
| 118 | -- @return boolean: The comparison result, according to the | ||
| 119 | -- rule outlined above. | ||
| 120 | local function sort_pkgs(a, b) | ||
| 121 | assert(type(a) == "string") | ||
| 122 | assert(type(b) == "string") | ||
| 123 | |||
| 124 | local na, va = a:match("(.*)/(.*)$") | ||
| 125 | local nb, vb = b:match("(.*)/(.*)$") | ||
| 126 | |||
| 127 | return (na == nb) and deps.compare_versions(va, vb) or na < nb | ||
| 128 | end | ||
| 129 | |||
| 130 | --- Output a table listing items of a package. | 105 | --- Output a table listing items of a package. |
| 131 | -- @param itemsfn function: a function for obtaining items of a package. | 106 | -- @param itemsfn function: a function for obtaining items of a package. |
| 132 | -- pkg and version will be passed to it; it should return a table with | 107 | -- pkg and version will be passed to it; it should return a table with |
| @@ -143,16 +118,34 @@ local function store_package_items(itemsfn, pkg, version, tbl) | |||
| 143 | 118 | ||
| 144 | local pkg_version = pkg.."/"..version | 119 | local pkg_version = pkg.."/"..version |
| 145 | local result = {} | 120 | local result = {} |
| 121 | |||
| 146 | for item, path in pairs(itemsfn(pkg, version)) do | 122 | for item, path in pairs(itemsfn(pkg, version)) do |
| 147 | result[item] = path | 123 | result[item] = path |
| 148 | if not tbl[item] then | 124 | if not tbl[item] then |
| 149 | tbl[item] = {} | 125 | tbl[item] = {} |
| 150 | end | 126 | end |
| 151 | tbl[item][pkg_version] = path | 127 | table.insert(tbl[item], pkg_version) |
| 152 | end | 128 | end |
| 153 | return result | 129 | return result |
| 154 | end | 130 | end |
| 155 | 131 | ||
| 132 | --- Sort function for ordering rock identifiers in a manifest's | ||
| 133 | -- modules table. Rocks are ordered alphabetically by name, and then | ||
| 134 | -- by version which greater first. | ||
| 135 | -- @param a string: Version to compare. | ||
| 136 | -- @param b string: Version to compare. | ||
| 137 | -- @return boolean: The comparison result, according to the | ||
| 138 | -- rule outlined above. | ||
| 139 | local function sort_pkgs(a, b) | ||
| 140 | assert(type(a) == "string") | ||
| 141 | assert(type(b) == "string") | ||
| 142 | |||
| 143 | local na, va = a:match("(.*)/(.*)$") | ||
| 144 | local nb, vb = b:match("(.*)/(.*)$") | ||
| 145 | |||
| 146 | return (na == nb) and deps.compare_versions(va, vb) or na < nb | ||
| 147 | end | ||
| 148 | |||
| 156 | --- Sort items of a package matching table by version number (higher versions first). | 149 | --- Sort items of a package matching table by version number (higher versions first). |
| 157 | -- @param tbl table: the package matching table: keys should be strings | 150 | -- @param tbl table: the package matching table: keys should be strings |
| 158 | -- and values arrays of strings with packages names in "name/version" format. | 151 | -- and values arrays of strings with packages names in "name/version" format. |
| @@ -180,19 +173,6 @@ local function sort_package_matching_table(tbl) | |||
| 180 | end | 173 | end |
| 181 | end | 174 | end |
| 182 | 175 | ||
| 183 | --- Commit manifest to disk in given local repository. | ||
| 184 | -- @param repo string: The directory of the local repository. | ||
| 185 | -- @param manifest table: The manifest table | ||
| 186 | -- @return boolean or (nil, string): true if successful, or nil and a | ||
| 187 | -- message in case of errors. | ||
| 188 | local function save_manifest(repo, manifest) | ||
| 189 | assert(type(repo) == "string") | ||
| 190 | assert(type(manifest) == "table") | ||
| 191 | |||
| 192 | local filename = dir.path(repo, "manifest") | ||
| 193 | return persist.save_from_table(filename, manifest) | ||
| 194 | end | ||
| 195 | |||
| 196 | --- Process the dependencies of a package to determine its dependency | 176 | --- Process the dependencies of a package to determine its dependency |
| 197 | -- chain for loading modules. | 177 | -- chain for loading modules. |
| 198 | -- @param name string: Package name. | 178 | -- @param name string: Package name. |
| @@ -252,6 +232,34 @@ local function store_results(results, manifest) | |||
| 252 | sort_package_matching_table(manifest.commands) | 232 | sort_package_matching_table(manifest.commands) |
| 253 | end | 233 | end |
| 254 | 234 | ||
| 235 | --- Scan a LuaRocks repository and output a manifest file. | ||
| 236 | -- A file called 'manifest' will be written in the root of the given | ||
| 237 | -- repository directory. | ||
| 238 | -- @param repo A local repository directory. | ||
| 239 | -- @return boolean or (nil, string): True if manifest was generated, | ||
| 240 | -- or nil and an error message. | ||
| 241 | function make_manifest(repo) | ||
| 242 | assert(type(repo) == "string") | ||
| 243 | |||
| 244 | if not fs.is_dir(repo) then | ||
| 245 | return nil, "Cannot access repository at "..repo | ||
| 246 | end | ||
| 247 | |||
| 248 | local query = search.make_query("") | ||
| 249 | query.exact_name = false | ||
| 250 | query.arch = "any" | ||
| 251 | local results = search.disk_search(repo, query) | ||
| 252 | local manifest = { repository = {}, modules = {}, commands = {} } | ||
| 253 | manif_core.manifest_cache[repo] = manifest | ||
| 254 | |||
| 255 | print(util.show_table(results, "results")) | ||
| 256 | print(util.show_table(manifest, "manifest")) | ||
| 257 | |||
| 258 | store_results(results, manifest) | ||
| 259 | |||
| 260 | return save_table(repo, "manifest", manifest) | ||
| 261 | end | ||
| 262 | |||
| 255 | --- Load a manifest file from a local repository and add to the repository | 263 | --- Load a manifest file from a local repository and add to the repository |
| 256 | -- information with regard to the given name and version. | 264 | -- information with regard to the given name and version. |
| 257 | -- A file called 'manifest' will be written in the root of the given | 265 | -- A file called 'manifest' will be written in the root of the given |
| @@ -284,173 +292,10 @@ function update_manifest(name, version, repo) | |||
| 284 | end | 292 | end |
| 285 | 293 | ||
| 286 | local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}} | 294 | local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}} |
| 287 | |||
| 288 | store_results(results, manifest) | ||
| 289 | update_global_lib(repo, manifest) | ||
| 290 | return save_manifest(repo, manifest) | ||
| 291 | end | ||
| 292 | |||
| 293 | --- Scan a LuaRocks repository and output a manifest file. | ||
| 294 | -- A file called 'manifest' will be written in the root of the given | ||
| 295 | -- repository directory. | ||
| 296 | -- @param repo A local repository directory. | ||
| 297 | -- @return boolean or (nil, string): True if manifest was generated, | ||
| 298 | -- or nil and an error message. | ||
| 299 | function make_manifest(repo) | ||
| 300 | assert(type(repo) == "string") | ||
| 301 | |||
| 302 | if not fs.is_dir(repo) then | ||
| 303 | return nil, "Cannot access repository at "..repo | ||
| 304 | end | ||
| 305 | 295 | ||
| 306 | local query = search.make_query("") | 296 | print("TODO LR2 update manifest") |
| 307 | query.exact_name = false | ||
| 308 | query.arch = "any" | ||
| 309 | local results = search.disk_search(repo, query) | ||
| 310 | local manifest = { repository = {}, modules = {}, commands = {} } | ||
| 311 | manif_core.manifest_cache[repo] = manifest | ||
| 312 | |||
| 313 | --print(util.show_table(results, "results")) | ||
| 314 | --print(util.show_table(manifest, "manifest")) | ||
| 315 | 297 | ||
| 316 | store_results(results, manifest) | 298 | store_results(results, manifest) |
| 317 | |||
| 318 | --print(util.show_table(manifest, "manifest after store")) | ||
| 319 | |||
| 320 | update_global_lib(repo, manifest) | ||
| 321 | |||
| 322 | --print(util.show_table(manifest, "manifest after update")) | ||
| 323 | |||
| 324 | return save_manifest(repo, manifest) | ||
| 325 | end | ||
| 326 | |||
| 327 | local index_header = [[ | ||
| 328 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | ||
| 329 | <html> | ||
| 330 | <head> | ||
| 331 | <title>Available rocks</title> | ||
| 332 | <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> | ||
| 333 | <style> | ||
| 334 | body { | ||
| 335 | background-color: white; | ||
| 336 | font-family: "bitstream vera sans", "verdana", "sans"; | ||
| 337 | font-size: 14px; | ||
| 338 | } | ||
| 339 | a { | ||
| 340 | color: #0000c0; | ||
| 341 | text-decoration: none; | ||
| 342 | } | ||
| 343 | a:hover { | ||
| 344 | text-decoration: underline; | ||
| 345 | } | ||
| 346 | td.main { | ||
| 347 | border-style: none; | ||
| 348 | } | ||
| 349 | blockquote { | ||
| 350 | font-size: 12px; | ||
| 351 | } | ||
| 352 | td.package { | ||
| 353 | background-color: #f0f0f0; | ||
| 354 | vertical-align: top; | ||
| 355 | } | ||
| 356 | td.spacer { | ||
| 357 | height: 5px; | ||
| 358 | } | ||
| 359 | td.version { | ||
| 360 | background-color: #d0d0d0; | ||
| 361 | vertical-align: top; | ||
| 362 | text-align: left; | ||
| 363 | padding: 5px; | ||
| 364 | width: 100px; | ||
| 365 | } | ||
| 366 | p.manifest { | ||
| 367 | font-size: 8px; | ||
| 368 | } | ||
| 369 | </style> | ||
| 370 | </head> | ||
| 371 | <body> | ||
| 372 | <h1>Available rocks</h1> | ||
| 373 | <p> | ||
| 374 | Lua modules avaliable from this location for use with <a href="http://www.luarocks.org">LuaRocks</a>: | ||
| 375 | </p> | ||
| 376 | <table class="main"> | ||
| 377 | ]] | ||
| 378 | |||
| 379 | local index_package_start = [[ | ||
| 380 | <td class="package"> | ||
| 381 | <p><a name="$anchor"></a><b>$package</b> - $summary<br/> | ||
| 382 | </p><blockquote><p>$detailed<br/> | ||
| 383 | <font size="-1"><a href="$original">latest sources</a> $homepage | License: $license</font></p> | ||
| 384 | </blockquote></a></td> | ||
| 385 | <td class="version"> | ||
| 386 | ]] | ||
| 387 | |||
| 388 | local index_package_end = [[ | ||
| 389 | </td></tr> | ||
| 390 | <tr><td colspan="2" class="spacer"></td></tr> | ||
| 391 | ]] | ||
| 392 | |||
| 393 | local index_footer = [[ | ||
| 394 | </table> | ||
| 395 | <p class="manifest"> | ||
| 396 | <a href="manifest">manifest file</a> | ||
| 397 | </p> | ||
| 398 | </body> | ||
| 399 | </html> | ||
| 400 | ]] | ||
| 401 | |||
| 402 | function make_index(repo) | ||
| 403 | if not fs.is_dir(repo) then | ||
| 404 | return nil, "Cannot access repository at "..repo | ||
| 405 | end | ||
| 406 | local manifest = load_manifest(repo) | ||
| 407 | local out = io.open(dir.path(repo, "index.html"), "w") | ||
| 408 | 299 | ||
| 409 | out:write(index_header) | 300 | return save_table(repo, "manifest", manifest) |
| 410 | for package, version_list in util.sortedpairs(manifest.repository) do | ||
| 411 | local latest_rockspec = nil | ||
| 412 | local output = index_package_start | ||
| 413 | for version, data in util.sortedpairs(version_list, deps.compare_versions) do | ||
| 414 | local out_versions = {} | ||
| 415 | local arches = 0 | ||
| 416 | output = output..version | ||
| 417 | local sep = ': ' | ||
| 418 | for _, item in ipairs(data) do | ||
| 419 | output = output .. sep .. '<a href="$url">'..item.arch..'</a>' | ||
| 420 | sep = ', ' | ||
| 421 | if item.arch == 'rockspec' then | ||
| 422 | local rs = ("%s-%s.rockspec"):format(package, version) | ||
| 423 | if not latest_rockspec then latest_rockspec = rs end | ||
| 424 | output = output:gsub("$url", rs) | ||
| 425 | else | ||
| 426 | output = output:gsub("$url", ("%s-%s.%s.rock"):format(package, version, item.arch)) | ||
| 427 | end | ||
| 428 | end | ||
| 429 | output = output .. '<br/>' | ||
| 430 | output = output:gsub("$na", arches) | ||
| 431 | end | ||
| 432 | output = output .. index_package_end | ||
| 433 | if latest_rockspec then | ||
| 434 | local rockspec = persist.load_into_table(dir.path(repo, latest_rockspec)) | ||
| 435 | local vars = { | ||
| 436 | anchor = package, | ||
| 437 | package = rockspec.package, | ||
| 438 | original = rockspec.source.url, | ||
| 439 | summary = rockspec.description.summary or "", | ||
| 440 | detailed = rockspec.description.detailed or "", | ||
| 441 | license = rockspec.description.license or "N/A", | ||
| 442 | homepage = rockspec.description.homepage and ("| <a href="..rockspec.description.homepage..">project homepage</a>") or "" | ||
| 443 | } | ||
| 444 | vars.detailed = vars.detailed:gsub("\n\n", "</p><p>"):gsub("%s+", " ") | ||
| 445 | output = output:gsub("$(%w+)", vars) | ||
| 446 | else | ||
| 447 | output = output:gsub("$anchor", package) | ||
| 448 | output = output:gsub("$package", package) | ||
| 449 | output = output:gsub("$(%w+)", "") | ||
| 450 | end | ||
| 451 | out:write(output) | ||
| 452 | end | ||
| 453 | out:write(index_footer) | ||
| 454 | out:close() | ||
| 455 | end | 301 | end |
| 456 | |||
diff --git a/src/luarocks/pack.lua b/src/luarocks/pack.lua index 4bfdb320..e4dc1794 100644 --- a/src/luarocks/pack.lua +++ b/src/luarocks/pack.lua | |||
| @@ -95,11 +95,12 @@ local function pack_binary_rock(name, version) | |||
| 95 | for package, file in pairs(module_data) do | 95 | for package, file in pairs(module_data) do |
| 96 | if package == name.."/"..version then | 96 | if package == name.."/"..version then |
| 97 | local dest | 97 | local dest |
| 98 | if file:match("^"..cfg.lua_modules_dir) then | 98 | print("TODO LR2 do this based on rock_manifest") |
| 99 | local pathname = file:sub(#cfg.lua_modules_dir + 1) | 99 | if file:match("^"..cfg.deploy_lua_dir) then |
| 100 | local pathname = file:sub(#cfg.deploy_lua_dir + 1) | ||
| 100 | dest = dir.path(temp_dir, "lua", dir.dir_name(pathname)) | 101 | dest = dir.path(temp_dir, "lua", dir.dir_name(pathname)) |
| 101 | elseif file:match("^"..cfg.bin_modules_dir) then | 102 | elseif file:match("^"..cfg.deploy_lib_dir) then |
| 102 | local pathname = file:sub(#cfg.bin_modules_dir + 1) | 103 | local pathname = file:sub(#cfg.deploy_lib_dir + 1) |
| 103 | dest = dir.path(temp_dir, "lib", dir.dir_name(pathname)) | 104 | dest = dir.path(temp_dir, "lib", dir.dir_name(pathname)) |
| 104 | is_binary = true | 105 | is_binary = true |
| 105 | end | 106 | end |
diff --git a/src/luarocks/rep.lua b/src/luarocks/rep.lua index 2c7659c1..0a2e9cbb 100644 --- a/src/luarocks/rep.lua +++ b/src/luarocks/rep.lua | |||
| @@ -7,6 +7,7 @@ local path = require("luarocks.path") | |||
| 7 | local cfg = require("luarocks.cfg") | 7 | local cfg = require("luarocks.cfg") |
| 8 | local util = require("luarocks.util") | 8 | local util = require("luarocks.util") |
| 9 | local dir = require("luarocks.dir") | 9 | local dir = require("luarocks.dir") |
| 10 | local manif = require("luarocks.manif") | ||
| 10 | 11 | ||
| 11 | --- Get all installed versions of a package. | 12 | --- Get all installed versions of a package. |
| 12 | -- @param name string: a package name. | 13 | -- @param name string: a package name. |
| @@ -41,19 +42,13 @@ function delete_version(name, version) | |||
| 41 | assert(type(version) == "string") | 42 | assert(type(version) == "string") |
| 42 | 43 | ||
| 43 | fs.delete(path.install_dir(name, version)) | 44 | fs.delete(path.install_dir(name, version)) |
| 45 | print("TODO LR2 remove deployed files based on rock_manifest") | ||
| 44 | if not get_versions(name) then | 46 | if not get_versions(name) then |
| 45 | fs.delete(dir.path(cfg.rocks_dir, name)) | 47 | fs.delete(dir.path(cfg.rocks_dir, name)) |
| 46 | end | 48 | end |
| 47 | end | 49 | end |
| 48 | 50 | ||
| 49 | --- Delete a command-line item from the bin directory. | 51 | --[[ |
| 50 | -- @param command string: name of script | ||
| 51 | function delete_bin(command) | ||
| 52 | assert(type(command) == "string") | ||
| 53 | |||
| 54 | fs.delete(dir.path(cfg.scripts_dir, command)) | ||
| 55 | end | ||
| 56 | |||
| 57 | --- Install bin entries in the repository bin dir. | 52 | --- Install bin entries in the repository bin dir. |
| 58 | -- @param name string: name of package | 53 | -- @param name string: name of package |
| 59 | -- @param version string: package version in string format | 54 | -- @param version string: package version in string format |
| @@ -68,9 +63,9 @@ function install_bins(name, version, single_file) | |||
| 68 | 63 | ||
| 69 | local bindir = path.bin_dir(name, version) | 64 | local bindir = path.bin_dir(name, version) |
| 70 | if fs.exists(bindir) then | 65 | if fs.exists(bindir) then |
| 71 | local ok, err = fs.make_dir(cfg.scripts_dir) | 66 | local ok, err = fs.make_dir(cfg.deploy_bin_dir) |
| 72 | if not ok then | 67 | if not ok then |
| 73 | return nil, "Could not create "..cfg.scripts_dir | 68 | return nil, "Could not create "..cfg.deploy_bin_dir |
| 74 | end | 69 | end |
| 75 | local files = single_file and {single_file} or fs.list_dir(bindir) | 70 | local files = single_file and {single_file} or fs.list_dir(bindir) |
| 76 | for _, file in pairs(files) do | 71 | for _, file in pairs(files) do |
| @@ -81,9 +76,9 @@ function install_bins(name, version, single_file) | |||
| 81 | file = io.open(fullname) | 76 | file = io.open(fullname) |
| 82 | end | 77 | end |
| 83 | if match or (file and file:read():match("#!.*lua.*")) then | 78 | if match or (file and file:read():match("#!.*lua.*")) then |
| 84 | ok, err = fs.wrap_script(fullname, cfg.scripts_dir) | 79 | ok, err = fs.wrap_script(fullname, cfg.deploy_bin_dir) |
| 85 | else | 80 | else |
| 86 | ok, err = fs.copy_binary(fullname, cfg.scripts_dir) | 81 | ok, err = fs.copy_binary(fullname, cfg.deploy_bin_dir) |
| 87 | end | 82 | end |
| 88 | if file then file:close() end | 83 | if file then file:close() end |
| 89 | if not ok then | 84 | if not ok then |
| @@ -93,6 +88,23 @@ function install_bins(name, version, single_file) | |||
| 93 | end | 88 | end |
| 94 | return true | 89 | return true |
| 95 | end | 90 | end |
| 91 | ]] | ||
| 92 | |||
| 93 | local function store_package_data(result, name, sub, prefix) | ||
| 94 | assert(type(result) == "table") | ||
| 95 | assert(type(name) == "string") | ||
| 96 | assert(type(sub) == "table" or type(sub) == "string") | ||
| 97 | assert(type(prefix) == "string") | ||
| 98 | |||
| 99 | if type(sub) == "table" then | ||
| 100 | for sname, ssub in pairs(sub) do | ||
| 101 | store_package_data(result, sname, ssub, prefix..name.."/") | ||
| 102 | end | ||
| 103 | elseif type(sub) == "string" then | ||
| 104 | local pathname = prefix..name | ||
| 105 | result[path.path_to_module(pathname)] = pathname | ||
| 106 | end | ||
| 107 | end | ||
| 96 | 108 | ||
| 97 | --- Obtain a list of modules within an installed package. | 109 | --- Obtain a list of modules within an installed package. |
| 98 | -- @param package string: The package name; for example "luasocket" | 110 | -- @param package string: The package name; for example "luasocket" |
| @@ -107,14 +119,18 @@ function package_modules(package, version) | |||
| 107 | assert(type(version) == "string") | 119 | assert(type(version) == "string") |
| 108 | 120 | ||
| 109 | local result = {} | 121 | local result = {} |
| 110 | for _, pathdir in pairs{ path.lua_dir, path.lib_dir } do | 122 | local rock_manifest = manif.load_rock_manifest(package, version) |
| 111 | local basedir = pathdir(package, version) | 123 | |
| 112 | local files = fs.find(basedir) | 124 | print(pkg, version, util.show_table(rock_manifest)) |
| 113 | for _, file in ipairs(files) do | 125 | |
| 114 | local name = path.path_to_module(file) | 126 | if rock_manifest.lib then |
| 115 | if name then | 127 | for name,sub in pairs(rock_manifest.lib) do |
| 116 | result[name] = dir.path(basedir, file) | 128 | store_package_data(result, name, sub, "", "") |
| 117 | end | 129 | end |
| 130 | end | ||
| 131 | if rock_manifest.lua then | ||
| 132 | for name,sub in pairs(rock_manifest.lua) do | ||
| 133 | store_package_data(result, name, sub, "", "") | ||
| 118 | end | 134 | end |
| 119 | end | 135 | end |
| 120 | return result | 136 | return result |
| @@ -133,26 +149,30 @@ function package_commands(package, version) | |||
| 133 | assert(type(version) == "string") | 149 | assert(type(version) == "string") |
| 134 | 150 | ||
| 135 | local result = {} | 151 | local result = {} |
| 136 | local bindir = path.bin_dir(package, version) | 152 | local rock_manifest = manif.load_rock_manifest(package, version) |
| 137 | local bins = fs.find(bindir) | 153 | if rock_manifest.bin then |
| 138 | for _, file in ipairs(bins) do | 154 | for name,sub in pairs(rock_manifest.bin) do |
| 139 | if file then | 155 | store_package_data(result, name, sub, "", "") |
| 140 | result[file] = dir.path(bindir, file) | ||
| 141 | end | 156 | end |
| 142 | end | 157 | end |
| 143 | return result | 158 | return result |
| 144 | end | 159 | end |
| 145 | 160 | ||
| 161 | |||
| 146 | --- Check if a rock contains binary executables. | 162 | --- Check if a rock contains binary executables. |
| 147 | -- @param name string: name of an installed rock | 163 | -- @param name string: name of an installed rock |
| 148 | -- @param version string: version of an installed rock | 164 | -- @param version string: version of an installed rock |
| 149 | -- @return boolean: returns true if rock contains platform-specific | 165 | -- @return boolean: returns true if rock contains platform-specific |
| 150 | -- binary executables, or false if it is a pure-Lua rock. | 166 | -- binary executables, or false if it is a pure-Lua rock. |
| 151 | function has_binaries(name, version) | 167 | function has_binaries(name, version) |
| 152 | local bin_dir = path.bin_dir(name, version) | 168 | assert(type(name) == "string") |
| 153 | if fs.exists(bin_dir) then | 169 | assert(type(version) == "string") |
| 154 | for _, name in pairs(fs.find(bin_dir)) do | 170 | |
| 155 | if fs.is_actual_binary(dir.path(bin_dir, name)) then | 171 | local rock_manifest = manif.load_rock_manifest(name, version) |
| 172 | if rock_manifest.bin then | ||
| 173 | for name, md5 in pairs(rock_manifest.bin) do | ||
| 174 | -- TODO verify that it is the same file. If it isn't, find the actual command. | ||
| 175 | if fs.is_actual_binary(dir.path(cfg.deploy_bin_dir, name)) then | ||
| 156 | return true | 176 | return true |
| 157 | end | 177 | end |
| 158 | end | 178 | end |
| @@ -161,6 +181,9 @@ function has_binaries(name, version) | |||
| 161 | end | 181 | end |
| 162 | 182 | ||
| 163 | function run_hook(rockspec, hook_name) | 183 | function run_hook(rockspec, hook_name) |
| 184 | assert(type(rockspec) == "table") | ||
| 185 | assert(type(hook_name) == "string") | ||
| 186 | |||
| 164 | local hooks = rockspec.hooks | 187 | local hooks = rockspec.hooks |
| 165 | if not hooks then | 188 | if not hooks then |
| 166 | return true | 189 | return true |
| @@ -178,3 +201,70 @@ function run_hook(rockspec, hook_name) | |||
| 178 | end | 201 | end |
| 179 | return true | 202 | return true |
| 180 | end | 203 | end |
| 204 | |||
| 205 | local function deploy_file_tree(file_tree, source_dir, deploy_dir, move_fn) | ||
| 206 | assert(type(file_tree) == "table") | ||
| 207 | assert(type(source_dir) == "string") | ||
| 208 | assert(type(deploy_dir) == "string") | ||
| 209 | assert(type(move_fn) == "function" or not move_fn) | ||
| 210 | |||
| 211 | print("TODO LR2 actually fs.move") | ||
| 212 | if not move_fn then move_fn = fs.copy end | ||
| 213 | |||
| 214 | local ok, err = fs.make_dir(deploy_dir) | ||
| 215 | if not ok then | ||
| 216 | return nil, "Could not create "..deploy_dir | ||
| 217 | end | ||
| 218 | for file, sub in pairs(file_tree) do | ||
| 219 | if type(sub) == "table" then | ||
| 220 | ok, err = deploy_file_tree(sub, dir.path(source_dir, file), dir.path(deploy_dir, file)) | ||
| 221 | if not ok then return nil, err end | ||
| 222 | else | ||
| 223 | local target = dir.path(deploy_dir, file) | ||
| 224 | if fs.exists(target) then | ||
| 225 | print("TODO LR2 make_way_for_new_version(target)") | ||
| 226 | end | ||
| 227 | local source = dir.path(source_dir, file) | ||
| 228 | ok, err = move_fn(source, deploy_dir) | ||
| 229 | if not ok then return nil, err end | ||
| 230 | end | ||
| 231 | end | ||
| 232 | end | ||
| 233 | |||
| 234 | local function install_binary(source, target) | ||
| 235 | assert(type(source) == "string") | ||
| 236 | assert(type(target) == "string") | ||
| 237 | |||
| 238 | local match = source:match("%.lua$") | ||
| 239 | local file, ok, err | ||
| 240 | if not match then | ||
| 241 | file = io.open(source) | ||
| 242 | end | ||
| 243 | if match or (file and file:read():match("^#!.*lua.*")) then | ||
| 244 | ok, err = fs.wrap_script(source, target) | ||
| 245 | else | ||
| 246 | ok, err = fs.copy_binary(source, target) | ||
| 247 | end | ||
| 248 | if file then file:close() end | ||
| 249 | return ok, err | ||
| 250 | end | ||
| 251 | |||
| 252 | function deploy_files(name, version) | ||
| 253 | assert(type(name) == "string") | ||
| 254 | assert(type(version) == "string") | ||
| 255 | |||
| 256 | local rock_manifest = manif.load_rock_manifest(name, version) | ||
| 257 | |||
| 258 | if rock_manifest.bin then | ||
| 259 | local ok, err = deploy_file_tree(rock_manifest.bin, path_bin_dir(name, version), cfg.deploy_bin_dir, install_binary) | ||
| 260 | if err then return nil, err end | ||
| 261 | end | ||
| 262 | if rock_manifest.lua then | ||
| 263 | local ok, err = deploy_file_tree(rock_manifest.lua, path.lua_dir(name, version), cfg.deploy_lua_dir) | ||
| 264 | if err then return nil, err end | ||
| 265 | end | ||
| 266 | if rock_manifest.lib then | ||
| 267 | local ok, err = deploy_file_tree(rock_manifest.lib, path.lib_dir(name, version), cfg.deploy_lib_dir) | ||
| 268 | if err then return nil, err end | ||
| 269 | end | ||
| 270 | end | ||
