summaryrefslogtreecommitdiff
path: root/src/luarocks/dir.lua
blob: be89e37ba0b865317a8a6701af27323415ac4ffc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

--- Generic utilities for handling pathnames.
local dir = {}

local core = require("luarocks.core.dir")

dir.path = core.path
dir.split_url = core.split_url
dir.normalize = core.normalize

local dir_sep = package.config:sub(1, 1)

--- Strip the path off a path+filename.
-- @param pathname string: A path+name, such as "/a/b/c"
-- or "\a\b\c".
-- @return string: The filename without its path, such as "c".
function dir.base_name(pathname)
   assert(type(pathname) == "string")

   local b
   b = pathname:gsub("[/\\]", "/") -- canonicalize to forward slashes
   b = b:gsub("/*$", "")           -- drop trailing slashes
   b = b:match(".*[/\\]([^/\\]*)") -- match last component
   b = b or pathname               -- fallback to original if no slashes

   return b
end

--- Strip the name off a path+filename.
-- @param pathname string: A path+name, such as "/a/b/c".
-- @return string: The filename without its path, such as "/a/b".
-- For entries such as "/a/b/", "/a" is returned. If there are
-- no directory separators in input, "" is returned.
function dir.dir_name(pathname)
   assert(type(pathname) == "string")

   local d
   d = pathname:gsub("[/\\]", "/") -- canonicalize to forward slashes
   d = d:gsub("/*$", "")           -- drop trailing slashes
   d = d:match("(.*)[/]+[^/]*")    -- match all components but the last
   d = d or ""                     -- switch to "" if there's no match
   d = d:gsub("/", dir_sep)        -- decanonicalize to native slashes

   return d
end

--- Returns true if protocol does not require additional tools.
-- @param protocol The protocol name
function dir.is_basic_protocol(protocol)
   return protocol == "http" or protocol == "https" or protocol == "ftp" or protocol == "file"
end

function dir.deduce_base_dir(url)
   -- for extensions like foo.tar.gz, "gz" is stripped first
   local known_exts = {}
   for _, ext in ipairs{"zip", "git", "tgz", "tar", "gz", "bz2"} do
      known_exts[ext] = ""
   end
   local base = dir.base_name(url)
   return (base:gsub("%.([^.]*)$", known_exts):gsub("%.tar", ""))
end

return dir