From 233a9af0f19e00cc8aa488cc1557497c76d2a7b0 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Tue, 25 Sep 2012 15:44:03 -0300 Subject: unfinished work on multi-tree support --- src/luarocks/add.lua | 2 +- src/luarocks/admin_remove.lua | 2 +- src/luarocks/build.lua | 35 ++++++++++++++++-------------- src/luarocks/cfg.lua | 1 + src/luarocks/deps.lua | 48 +++++++++++++++++++++++++++++++++--------- src/luarocks/install.lua | 21 +++++++++++------- src/luarocks/make.lua | 5 +++-- src/luarocks/make_manifest.lua | 7 ++++-- src/luarocks/manif.lua | 22 +++++++++++-------- src/luarocks/manif_core.lua | 35 +++++++++++++++++++++++------- src/luarocks/purge.lua | 2 +- src/luarocks/remove.lua | 14 ++++++++---- src/luarocks/repos.lua | 6 +++--- src/luarocks/validate.lua | 8 +++---- 14 files changed, 139 insertions(+), 69 deletions(-) (limited to 'src') diff --git a/src/luarocks/add.lua b/src/luarocks/add.lua index bf3f8979..48b9964c 100644 --- a/src/luarocks/add.lua +++ b/src/luarocks/add.lua @@ -65,7 +65,7 @@ local function add_files_to_server(refresh, rockfiles, server, upload_server) fs.change_dir(local_cache) util.printout("Updating manifest...") - manif.make_manifest(local_cache) + manif.make_manifest(local_cache, "one") util.printout("Updating index.html...") index.make_index(local_cache) diff --git a/src/luarocks/admin_remove.lua b/src/luarocks/admin_remove.lua index f1268576..dc36e16e 100644 --- a/src/luarocks/admin_remove.lua +++ b/src/luarocks/admin_remove.lua @@ -61,7 +61,7 @@ local function remove_files_from_server(refresh, rockfiles, server, upload_serve fs.change_dir(local_cache) util.printout("Updating manifest...") - manif.make_manifest(local_cache) + manif.make_manifest(local_cache, "one") util.printout("Updating index.html...") index.make_index(local_cache) diff --git a/src/luarocks/build.lua b/src/luarocks/build.lua index 6ffa0e79..d68acabd 100644 --- a/src/luarocks/build.lua +++ b/src/luarocks/build.lua @@ -111,10 +111,11 @@ end -- @param minimal_mode boolean: true if there's no need to fetch, -- unpack or change dir (this is used by "luarocks make"). Implies -- need_to_fetch = false. --- @param no_deps boolean: true if dependency check needs to be skipped +-- @param deps_mode: string: Which trees to check dependencies for: +-- "none", "one", "order" or "all". -- @return boolean or (nil, string, [string]): True if succeeded or -- nil and an error message followed by an error code. -function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, no_deps) +function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_mode) assert(type(rockspec_file) == "string") assert(type(need_to_fetch) == "boolean") @@ -127,10 +128,10 @@ function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, no_deps) return nil, "Rockspec error: build type not specified" end - if no_deps then + if deps_mode == "none" then util.printerr("Warning: skipping dependency checks.") else - local ok, err, errcode = deps.fulfill_dependencies(rockspec) + local ok, err, errcode = deps.fulfill_dependencies(rockspec, deps_mode) if err then return nil, err, errcode end @@ -253,7 +254,7 @@ function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, no_deps) ok, err = repos.run_hook(rockspec, "post_install") if err then return nil, err end - ok, err = manif.update_manifest(name, version) + ok, err = manif.update_manifest(name, version, nil, deps_mode) if err then return nil, err end local license = "" @@ -273,9 +274,11 @@ end -- @param rock_file string: local or remote filename of a rock. -- @param need_to_fetch boolean: true if sources need to be fetched, -- false if the rockspec was obtained from inside a source rock. +-- @param deps_mode: string: Which trees to check dependencies for: +-- "none", "one", "order" or "all". -- @return boolean or (nil, string, [string]): True if build was successful, -- or false and an error message and an optional error code. -function build_rock(rock_file, need_to_fetch, no_deps) +function build_rock(rock_file, need_to_fetch, deps_mode) assert(type(rock_file) == "string") assert(type(need_to_fetch) == "boolean") @@ -285,24 +288,24 @@ function build_rock(rock_file, need_to_fetch, no_deps) end local rockspec_file = path.rockspec_name_from_rock(rock_file) fs.change_dir(unpack_dir) - local ok, err, errcode = build_rockspec(rockspec_file, need_to_fetch, false, no_deps) + local ok, err, errcode = build_rockspec(rockspec_file, need_to_fetch, false, deps_mode) fs.pop_dir() return ok, err, errcode end - -local function do_build(name, version, no_deps) + +local function do_build(name, version, deps_mode) if name:match("%.rockspec$") then - return build_rockspec(name, true, false, no_deps) + return build_rockspec(name, true, false, deps_mode) elseif name:match("%.src%.rock$") then - return build_rock(name, false, no_deps) + return build_rock(name, false, deps_mode) elseif name:match("%.all%.rock$") then local install = require("luarocks.install") - return install.install_binary_rock(name, no_deps) + return install.install_binary_rock(name, deps_mode) elseif name:match("%.rock$") then - return build_rock(name, true, no_deps) + return build_rock(name, true, deps_mode) elseif not name:match(dir.separator) then local search = require("luarocks.search") - return search.act_on_src_or_rockspec(run, name:lower(), version, no_deps and "--nodeps") + return search.act_on_src_or_rockspec(run, name:lower(), version, deps.deps_mode_to_flag(deps_mode)) end return nil, "Don't know what to do with "..name end @@ -323,10 +326,10 @@ function run(...) assert(type(version) == "string" or not version) if flags["pack-binary-rock"] then - return pack.pack_binary_rock(name, version, do_build, name, version, flags["nodeps"]) + return pack.pack_binary_rock(name, version, do_build, name, version, deps.flags_to_deps_mode(flags)) else local ok, err = fs.check_command_permissions(flags) if not ok then return nil, err end - return do_build(name, version, flags["nodeps"]) + return do_build(name, version, deps.flags_to_deps_mode(flags)) end end diff --git a/src/luarocks/cfg.lua b/src/luarocks/cfg.lua index 41adb4e5..b2ed2a96 100644 --- a/src/luarocks/cfg.lua +++ b/src/luarocks/cfg.lua @@ -164,6 +164,7 @@ local defaults = { use_extensions = false, accept_unknown_fields = false, fs_use_modules = true, + use_trees = "one", lua_modules_path = "/share/lua/"..lua_version, lib_modules_path = "/lib/lua/"..lua_version, diff --git a/src/luarocks/deps.lua b/src/luarocks/deps.lua index 00e796b0..a409920a 100644 --- a/src/luarocks/deps.lua +++ b/src/luarocks/deps.lua @@ -312,14 +312,14 @@ end -- @return table or nil: A table containing fields 'name' and 'version' -- representing an installed rock which matches the given dependency, -- or nil if it could not be matched. -local function match_dep(dep, blacklist) +local function match_dep(dep, blacklist, use_trees) assert(type(dep) == "table") local versions if dep.name == "lua" then versions = { cfg.lua_version } else - versions = manif_core.get_versions(dep.name) + versions = manif_core.get_versions(dep.name, use_trees) end if not versions then return nil @@ -361,13 +361,13 @@ end -- in table format and values are tables containing fields 'name' and -- version' representing matches, and a table of missing dependencies -- parsed as tables. -function match_deps(rockspec, blacklist) +function match_deps(rockspec, blacklist, use_trees) assert(type(rockspec) == "table") assert(type(blacklist) == "table" or not blacklist) local matched, missing, no_upgrade = {}, {}, {} for _, dep in ipairs(rockspec.dependencies) do - local found = match_dep(dep, blacklist and blacklist[dep.name] or nil) + local found = match_dep(dep, blacklist and blacklist[dep.name] or nil, use_trees) if found then if dep.name ~= "lua" then matched[dep] = found @@ -401,7 +401,7 @@ end -- @return boolean or (nil, string, [string]): True if no errors occurred, or -- nil and an error message if any test failed, followed by an optional -- error code. -function fulfill_dependencies(rockspec) +function fulfill_dependencies(rockspec, use_trees) local search = require("luarocks.search") local install = require("luarocks.install") @@ -433,7 +433,7 @@ function fulfill_dependencies(rockspec) end end - local matched, missing, no_upgrade = match_deps(rockspec) + local matched, missing, no_upgrade = match_deps(rockspec, nil, use_trees) if next(no_upgrade) then util.printerr("Missing dependencies for "..rockspec.name.." "..rockspec.version..":") @@ -467,7 +467,7 @@ function fulfill_dependencies(rockspec) for _, dep in pairs(missing) do -- Double-check in case dependency was filled during recursion. - if not match_dep(dep) then + if not match_dep(dep, nil, use_trees) then local rock = search.find_suitable_rock(dep) if not rock then return nil, "Could not satisfy dependency: "..show_dep(dep) @@ -640,7 +640,7 @@ end -- @param name string: Package name. -- @param version string: Package version. -- @return (table, table): The results and a table of missing dependencies. -function scan_deps(results, missing, manifest, name, version) +function scan_deps(results, missing, manifest, name, version, use_trees) assert(type(results) == "table") assert(type(missing) == "table") assert(type(manifest) == "table") @@ -669,9 +669,9 @@ function scan_deps(results, missing, manifest, name, version) else rockspec = { dependencies = deplist } end - local matched, failures = match_deps(rockspec) + local matched, failures = match_deps(rockspec, nil, use_trees) for _, match in pairs(matched) do - results, missing = scan_deps(results, missing, manifest, match.name, match.version) + results, missing = scan_deps(results, missing, manifest, match.name, match.version, use_trees) end if next(failures) then for _, failure in pairs(failures) do @@ -681,3 +681,31 @@ function scan_deps(results, missing, manifest, name, version) results[name] = version return results, missing end + +local valid_trees = { + one = true, + order = true, + all = true, +} + +function check_trees_flag(flag) + return valid_trees[flag] +end + +function flags_to_deps_mode(flags) + if flags["nodeps"] then + return "none" + elseif flags["trees"] then + return flags["trees"] + else + return cfg.use_trees + end +end + +function deps_mode_to_flag(deps_mode) + if deps_mode == "none" then + return "--nodeps" + else + return "--trees="..deps_mode + end +end diff --git a/src/luarocks/install.lua b/src/luarocks/install.lua index 6b5ea85f..a940d356 100644 --- a/src/luarocks/install.lua +++ b/src/luarocks/install.lua @@ -23,10 +23,11 @@ or a filename of a locally available rock. --- Install a binary rock. -- @param rock_file string: local or remote filename of a rock. --- @param no_deps boolean: true if dependency check needs to be skipped +-- @param deps_mode: string: Which trees to check dependencies for: +-- "none", "one", "order" or "all". -- @return boolean or (nil, string, [string]): True if succeeded or -- nil and an error message and an optional error code. -function install_binary_rock(rock_file, no_deps) +function install_binary_rock(rock_file, deps_mode) assert(type(rock_file) == "string") local name, version, arch = path.parse_name(rock_file) @@ -54,7 +55,7 @@ function install_binary_rock(rock_file, no_deps) return nil, "Failed loading rockspec for installed package: "..err, errcode end - if no_deps then + if deps_mode == "none" then util.printerr("Warning: skipping dependency checks.") else ok, err, errcode = deps.check_external_deps(rockspec, "install") @@ -67,8 +68,8 @@ function install_binary_rock(rock_file, no_deps) if err then return nil, err end end - if not no_deps then - ok, err, errcode = deps.fulfill_dependencies(rockspec) + if deps_mode ~= "none" then + ok, err, errcode = deps.fulfill_dependencies(rockspec, deps_mode) if err then return nil, err, errcode end end @@ -88,7 +89,7 @@ function install_binary_rock(rock_file, no_deps) ok, err = repos.run_hook(rockspec, "post_install") if err then return nil, err end - ok, err = manif.update_manifest(name, version) + ok, err = manif.update_manifest(name, version, nil, deps_mode) if err then return nil, err end local license = "" @@ -126,9 +127,13 @@ function run(...) if name:match("%.rockspec$") or name:match("%.src%.rock$") then util.printout("Using "..name.."... switching to 'build' mode") local build = require("luarocks.build") - return build.run(name, flags["local"] and "--local") + local build_flags = {} + if flags["local"] then table.insert(build_flags, "--local") end + if flags["nodeps"] then table.insert(build_flags, "--nodeps") end + if flags["trees"] then table.insert(build_flags, "--trees="..flags["trees"]) end + return build.run(name, unpack(build_flags)) elseif name:match("%.rock$") then - return install_binary_rock(name, flags["nodeps"]) + return install_binary_rock(name, deps.flags_to_deps_mode(flags)) else local search = require("luarocks.search") local results, err = search.find_suitable_rock(search.make_query(name:lower(), version)) diff --git a/src/luarocks/make.lua b/src/luarocks/make.lua index 769db2f7..498445d8 100644 --- a/src/luarocks/make.lua +++ b/src/luarocks/make.lua @@ -11,6 +11,7 @@ local util = require("luarocks.util") local cfg = require("luarocks.cfg") local fetch = require("luarocks.fetch") local pack = require("luarocks.pack") +local deps = require("luarocks.deps") help_summary = "Compile package in current directory using a rockspec." help_arguments = "[--pack-binary-rock] []" @@ -62,10 +63,10 @@ function run(...) if not rspec then return nil, err end - return pack.pack_binary_rock(rspec.name, rspec.version, build.build_rockspec, rockspec, false, true, flags["nodeps"]) + return pack.pack_binary_rock(rspec.name, rspec.version, build.build_rockspec, rockspec, false, true, deps.flags_to_deps_mode(flags)) else local ok, err = fs.check_command_permissions(flags) if not ok then return nil, err end - return build.build_rockspec(rockspec, false, true) + return build.build_rockspec(rockspec, false, true, deps.flags_to_deps_mode(flags)) end end diff --git a/src/luarocks/make_manifest.lua b/src/luarocks/make_manifest.lua index 07d2fd05..e629b9de 100644 --- a/src/luarocks/make_manifest.lua +++ b/src/luarocks/make_manifest.lua @@ -7,6 +7,7 @@ local manif = require("luarocks.manif") local index = require("luarocks.index") local cfg = require("luarocks.cfg") local util = require("luarocks.util") +local deps = require("luarocks.deps") help_summary = "Compile a manifest file for a repository." @@ -19,13 +20,15 @@ help = [[ -- the default local repository configured as cfg.rocks_dir is used. -- @return boolean or (nil, string): True if manifest was generated, -- or nil and an error message. -function run(repo) +function run(...) + local flags, repo = util.parse_flags(...) + assert(type(repo) == "string" or not repo) repo = repo or cfg.rocks_dir util.printout("Making manifest for "..repo) - local ok, err = manif.make_manifest(repo) + local ok, err = manif.make_manifest(repo, deps.flags_to_deps_mode(flags)) if ok then util.printout("Generating index.html for "..repo) index.make_index(repo) diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua index 2c745f0b..9e5ee823 100644 --- a/src/luarocks/manif.lua +++ b/src/luarocks/manif.lua @@ -185,14 +185,14 @@ end -- and any dependency inconsistencies or missing dependencies are reported to -- standard error. -- @param manifest table: a manifest table. -local function update_dependencies(manifest) +local function update_dependencies(manifest, use_trees) for pkg, versions in pairs(manifest.repository) do for version, repositories in pairs(versions) do local current = pkg.." "..version for _, repo in ipairs(repositories) do if repo.arch == "installed" then local missing - repo.dependencies, missing = deps.scan_deps({}, {}, manifest, pkg, version) + repo.dependencies, missing = deps.scan_deps({}, {}, manifest, pkg, version, use_trees) repo.dependencies[pkg] = nil if missing then for miss, err in pairs(missing) do @@ -214,7 +214,7 @@ end -- @param manifest table: A manifest table (must contain repository, modules, commands tables). -- It will be altered to include the search results. -- @return boolean or (nil, string): true in case of success, or nil followed by an error message. -local function store_results(results, manifest) +local function store_results(results, manifest, use_trees) assert(type(results) == "table") assert(type(manifest) == "table") @@ -239,7 +239,7 @@ local function store_results(results, manifest) end manifest.repository[name] = pkgtable end - update_dependencies(manifest) + update_dependencies(manifest, use_trees) sort_package_matching_table(manifest.modules) sort_package_matching_table(manifest.commands) return true @@ -251,9 +251,11 @@ end -- @param repo A local repository directory. -- @return boolean or (nil, string): True if manifest was generated, -- or nil and an error message. -function make_manifest(repo) +function make_manifest(repo, use_trees) assert(type(repo) == "string") + if use_trees == "none" then use_trees = cfg.use_trees end + if not fs.is_dir(repo) then return nil, "Cannot access repository at "..repo end @@ -265,7 +267,7 @@ function make_manifest(repo) local manifest = { repository = {}, modules = {}, commands = {} } manif_core.manifest_cache[repo] = manifest - local ok, err = store_results(results, manifest) + local ok, err = store_results(results, manifest, use_trees) if not ok then return nil, err end return save_table(repo, "manifest", manifest) @@ -281,17 +283,19 @@ end -- the default local repository configured as cfg.rocks_dir is used. -- @return boolean or (nil, string): True if manifest was generated, -- or nil and an error message. -function update_manifest(name, version, repo) +function update_manifest(name, version, repo, use_trees) assert(type(name) == "string") assert(type(version) == "string") repo = path.rocks_dir(repo or cfg.root_dir) + + if use_trees == "none" then use_trees = cfg.use_trees end util.printout("Updating manifest for "..repo) local manifest, err = load_manifest(repo) if not manifest then util.printerr("No existing manifest. Attempting to rebuild...") - local ok, err = make_manifest(repo) + local ok, err = make_manifest(repo, use_trees) if not ok then return nil, err end @@ -303,7 +307,7 @@ function update_manifest(name, version, repo) local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}} - local ok, err = store_results(results, manifest) + local ok, err = store_results(results, manifest, use_trees) if not ok then return nil, err end return save_table(repo, "manifest", manifest) diff --git a/src/luarocks/manif_core.lua b/src/luarocks/manif_core.lua index 40f16898..ed6cac07 100644 --- a/src/luarocks/manif_core.lua +++ b/src/luarocks/manif_core.lua @@ -8,6 +8,7 @@ local type_check = require("luarocks.type_check") local dir = require("luarocks.dir") local util = require("luarocks.util") local cfg = require("luarocks.cfg") +local path = require("luarocks.path") manifest_cache = {} @@ -52,22 +53,40 @@ end --- Get all versions of a package listed in a manifest file. -- @param name string: a package name. --- @param manifest table or nil: a manifest table; if not given, the --- default local manifest table is used. +-- @param use_trees string: "one", to use only the currently +-- configured tree; "order" to select trees based on order +-- (use the current tree and all trees below it on the list) +-- or "all", to use all trees. -- @return table: An array of strings listing installed -- versions of a package. -function get_versions(name, manifest) +function get_versions(name, use_trees) assert(type(name) == "string") - assert(type(manifest) == "table" or not manifest) + assert(type(use_trees) == "string") - if not manifest then + local manifest + + if use_trees == "one" then manifest = load_local_manifest(cfg.rocks_dir) - if not manifest then - return {} + elseif use_trees == "all" or use_trees == "order" then + manifest = {} + local use = false + if use_trees == "all" then + use = true + end + for _, tree in ipairs(cfg.rocks_trees) do + if tree == cfg.rocks_dir then + use = true + end + if use then + local loaded = load_local_manifest(path.rocks_dir(tree)) + if loaded then + util.deep_merge(manifest, loaded) + end + end end end - local item = manifest.repository[name] + local item = manifest and manifest.repository[name] if item then return util.keys(item) end diff --git a/src/luarocks/purge.lua b/src/luarocks/purge.lua index dc6b822d..ca682f7d 100644 --- a/src/luarocks/purge.lua +++ b/src/luarocks/purge.lua @@ -44,5 +44,5 @@ function run(...) end end end - return manif.make_manifest(cfg.rocks_dir) + return manif.make_manifest(cfg.rocks_dir, "one") end diff --git a/src/luarocks/remove.lua b/src/luarocks/remove.lua index a9d97540..261dc1c4 100644 --- a/src/luarocks/remove.lua +++ b/src/luarocks/remove.lua @@ -28,7 +28,7 @@ To override this check and force the removal, use --force. -- @param versions array of string: the versions to be deleted. -- @return array of string: an empty table if no packages depend on any -- of the given list, or an array of strings in "name/version" format. -local function check_dependents(name, versions) +local function check_dependents(name, versions, use_trees) local dependents = {} local blacklist = {} blacklist[name] = {} @@ -44,7 +44,7 @@ local function check_dependents(name, versions) for rock_version, _ in pairs(rock_versions) do local rockspec, err = fetch.load_rockspec(path.rockspec_file(rock_name, rock_version)) if rockspec then - local _, missing = deps.match_deps(rockspec, blacklist) + local _, missing = deps.match_deps(rockspec, blacklist, use_trees) if missing[name] then table.insert(dependents, { name = rock_name, version = rock_version }) end @@ -78,11 +78,17 @@ end -- successful, nil and an error message otherwise. function run(...) local flags, name, version = util.parse_flags(...) + + if flags["trees"] and type(flags["trees"]) ~= "string" then + return nil, "Invalid entry for --trees." + end if type(name) ~= "string" then return nil, "Argument missing, see help." end + local use_trees = flags["trees"] or cfg.use_trees + local ok, err = fs.check_command_permissions(flags) if not ok then return nil, err end @@ -100,7 +106,7 @@ function run(...) util.printout(name.." "..table.concat(util.keys(versions), ", ").."...") util.printout() - local dependents = check_dependents(name, versions) + local dependents = check_dependents(name, versions, use_trees) if #dependents == 0 or flags["force"] then if #dependents > 0 then @@ -112,7 +118,7 @@ function run(...) end local ok, err = delete_versions(name, versions) if not ok then return nil, err end - ok, err = manif.make_manifest(cfg.rocks_dir) + ok, err = manif.make_manifest(cfg.rocks_dir, use_trees) if not ok then return nil, err end else if not second then diff --git a/src/luarocks/repos.lua b/src/luarocks/repos.lua index 30c61f55..3a337e7c 100644 --- a/src/luarocks/repos.lua +++ b/src/luarocks/repos.lua @@ -14,7 +14,7 @@ local deps = require("luarocks.deps") -- @param name string: a package name. -- @return table or nil: An array of strings listing installed -- versions of a package, or nil if none is available. -function get_versions(name) +local function get_installed_versions(name) assert(type(name) == "string") local dirs = fs.list_dir(path.versions_dir(name)) @@ -229,7 +229,7 @@ function deploy_files(name, version, wrap_bin_scripts) else target = new_target end - end + end fs.make_dir(dir.dir_name(target)) ok, err = move_fn(source, target) fs.remove_dir_tree_if_empty(dir.dir_name(source)) @@ -312,7 +312,7 @@ function delete_version(name, version, quick) if err then return nil, err end fs.delete(path.install_dir(name, version)) - if not get_versions(name) then + if not get_installed_versions(name) then fs.delete(dir.path(cfg.rocks_dir, name)) end return true diff --git a/src/luarocks/validate.lua b/src/luarocks/validate.lua index 03e90ecf..fb6a78ad 100644 --- a/src/luarocks/validate.lua +++ b/src/luarocks/validate.lua @@ -50,7 +50,7 @@ local function prepare_sandbox(file) end local function validate_rockspec(file) - local ok, err, errcode = build.build_rockspec(file, true) + local ok, err, errcode = build.build_rockspec(file, true, "one") if not ok then util.printerr(err) end @@ -58,7 +58,7 @@ local function validate_rockspec(file) end local function validate_src_rock(file) - local ok, err, errcode = build.build_rock(file, false) + local ok, err, errcode = build.build_rock(file, false, "one") if not ok then util.printerr(err) end @@ -66,7 +66,7 @@ local function validate_src_rock(file) end local function validate_rock(file) - local ok, err, errcode = install.install_binary_rock(file) + local ok, err, errcode = install.install_binary_rock(file, "one") if not ok then util.printerr(err) end @@ -97,7 +97,7 @@ local function validate(repo, flags) util.printout() util.printout("Verifying "..pathname) if file:match("%.rockspec$") then - ok, err, errcode = validate_rockspec(pathname) + ok, err, errcode = validate_rockspec(pathname, "one") elseif file:match("%.src%.rock$") then ok, err, errcode = validate_src_rock(pathname) elseif file:match("%.rock$") then -- cgit v1.2.3-55-g6feb