diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2021-03-20 23:44:27 -0300 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2021-03-22 10:33:10 -0300 |
commit | dcaca50d670b3f5654c109339b6f37c766558eb1 (patch) | |
tree | 638faf5df7570aa874bafdb4179d00f18f410bac /src | |
parent | fbd857e1a0b2aae5beb3875427612e41bf67b35e (diff) | |
download | luarocks-dcaca50d670b3f5654c109339b6f37c766558eb1.tar.gz luarocks-dcaca50d670b3f5654c109339b6f37c766558eb1.tar.bz2 luarocks-dcaca50d670b3f5654c109339b6f37c766558eb1.zip |
fix: pack: rockspec with a bare file in the url
Diffstat (limited to 'src')
-rw-r--r-- | src/luarocks/core/dir.lua | 22 | ||||
-rw-r--r-- | src/luarocks/fetch.lua | 21 |
2 files changed, 42 insertions, 1 deletions
diff --git a/src/luarocks/core/dir.lua b/src/luarocks/core/dir.lua index 765a0e58..0da88997 100644 --- a/src/luarocks/core/dir.lua +++ b/src/luarocks/core/dir.lua | |||
@@ -58,6 +58,28 @@ end | |||
58 | function dir.normalize(name) | 58 | function dir.normalize(name) |
59 | local protocol, pathname = dir.split_url(name) | 59 | local protocol, pathname = dir.split_url(name) |
60 | pathname = pathname:gsub("\\", "/"):gsub("(.)/*$", "%1"):gsub("//", "/") | 60 | pathname = pathname:gsub("\\", "/"):gsub("(.)/*$", "%1"):gsub("//", "/") |
61 | local pieces = {} | ||
62 | local drive = "" | ||
63 | if pathname:match("^.:") then | ||
64 | drive, pathname = pathname:match("^(.:)(.*)$") | ||
65 | end | ||
66 | for piece in pathname:gmatch("(.-)/") do | ||
67 | if piece == ".." then | ||
68 | local prev = pieces[#pieces] | ||
69 | if not prev or prev == ".." then | ||
70 | table.insert(pieces, "..") | ||
71 | elseif prev ~= "" then | ||
72 | table.remove(pieces) | ||
73 | end | ||
74 | elseif piece ~= "." then | ||
75 | table.insert(pieces, piece) | ||
76 | end | ||
77 | end | ||
78 | local basename = pathname:match("[^/]+$") | ||
79 | if basename then | ||
80 | table.insert(pieces, basename) | ||
81 | end | ||
82 | pathname = drive .. table.concat(pieces, "/") | ||
61 | if protocol ~= "file" then pathname = protocol .."://"..pathname end | 83 | if protocol ~= "file" then pathname = protocol .."://"..pathname end |
62 | return pathname | 84 | return pathname |
63 | end | 85 | end |
diff --git a/src/luarocks/fetch.lua b/src/luarocks/fetch.lua index c8b15d61..1882c348 100644 --- a/src/luarocks/fetch.lua +++ b/src/luarocks/fetch.lua | |||
@@ -63,7 +63,26 @@ function fetch.fetch_url(url, filename, cache) | |||
63 | 63 | ||
64 | local protocol, pathname = dir.split_url(url) | 64 | local protocol, pathname = dir.split_url(url) |
65 | if protocol == "file" then | 65 | if protocol == "file" then |
66 | return fs.absolute_name(pathname) | 66 | local fullname = dir.normalize(fs.absolute_name(pathname)) |
67 | if not fs.exists(fullname) then | ||
68 | local hint = (not pathname:match("^/")) | ||
69 | and (" - note that given path in rockspec is not absolute: " .. url) | ||
70 | or "" | ||
71 | return nil, "Local file not found: " .. fullname .. hint | ||
72 | end | ||
73 | filename = filename or dir.base_name(pathname) | ||
74 | local dstname = dir.normalize(fs.absolute_name(dir.path(".", filename))) | ||
75 | local ok, err | ||
76 | if fullname == dstname then | ||
77 | ok = true | ||
78 | else | ||
79 | ok, err = fs.copy(fullname, dstname) | ||
80 | end | ||
81 | if ok then | ||
82 | return dstname | ||
83 | else | ||
84 | return nil, "Failed copying local file " .. fullname .. " to " .. dstname .. ": " .. err | ||
85 | end | ||
67 | elseif dir.is_basic_protocol(protocol) then | 86 | elseif dir.is_basic_protocol(protocol) then |
68 | local ok, name, from_cache = fs.download(url, filename, cache) | 87 | local ok, name, from_cache = fs.download(url, filename, cache) |
69 | if not ok then | 88 | if not ok then |