summaryrefslogtreecommitdiff
path: root/xmake/modules/private/action/require/impl/repository.lua
diff options
context:
space:
mode:
Diffstat (limited to 'xmake/modules/private/action/require/impl/repository.lua')
-rw-r--r--xmake/modules/private/action/require/impl/repository.lua113
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
+