diff options
Diffstat (limited to 'xmake/modules/private/action/require/impl/repository.lua')
| -rw-r--r-- | xmake/modules/private/action/require/impl/repository.lua | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/xmake/modules/private/action/require/impl/repository.lua b/xmake/modules/private/action/require/impl/repository.lua new file mode 100644 index 000000000..6fc72d49c --- /dev/null +++ b/xmake/modules/private/action/require/impl/repository.lua @@ -0,0 +1,113 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author ruki +-- @file repository.lua +-- + +-- imports +import("core.package.repository") + +-- get all repositories +function repositories() + + -- get it from cache it + if _g._REPOSITORIES then + return _g._REPOSITORIES + end + + -- get all repositories (local first) + local repos = table.join(repository.repositories(false), repository.repositories(true)) + + -- save repositories + _g._REPOSITORIES = repos + + -- ok + return repos +end + +-- the remote repositories have been pulled? +function pulled() + for _, repo in ipairs(repositories()) do + -- repository not found? or xmake has been re-installed + local updatefile = path.join(repo:directory(), "updated") + if not os.isdir(repo:directory()) or (os.isfile(updatefile) and os.mtime(os.programfile()) > os.mtime(updatefile)) then + return false + end + end + return true +end + +-- get package directory from repositories +function packagedir(packagename, reponame) + + -- strip trailng ~tag, e.g. zlib~debug + if packagename:find('~', 1, true) then + packagename = packagename:gsub("~.+$", "") + end + + -- get it from cache it + local packagedirs = _g._PACKAGEDIRS or {} + local foundir = packagedirs[packagename] + if foundir then + return foundir[1], foundir[2] + end + + -- find the package directory from repositories + for _, repo in ipairs(repositories()) do + local dir = path.join(repo:directory(), "packages", packagename:sub(1, 1):lower(), packagename) + if os.isdir(dir) and (not reponame or reponame == repo:name()) then + foundir = {dir, repo} + break + end + end + + -- found? + if foundir then + + -- save package directory + packagedirs[packagename] = foundir + + -- update cache + _g._PACKAGEDIRS = packagedirs + + -- ok + return foundir[1], foundir[2] + end +end + +-- search package directories from repositories +function searchdirs(name) + + -- find the package directories from all repositories + local unique = {} + local packageinfos = {} + for _, repo in ipairs(repositories()) do + for _, file in ipairs(os.files(path.join(repo:directory(), "packages", "*", string.ipattern("*" .. name .. "*"), "xmake.lua"))) do + local dir = path.directory(file) + local subdirname = path.basename(path.directory(dir)) + if #subdirname == 1 then -- ignore l/luajit/port/xmake.lua + local packagename = path.basename(dir) + if not unique[packagename] then + table.insert(packageinfos, {name = packagename, repo = repo, packagedir = path.directory(file)}) + unique[packagename] = true + end + end + end + end + return packageinfos +end + |
