126 lines
3.6 KiB
Lua
126 lines
3.6 KiB
Lua
|
|
local assert, type, table, io, package, math, os, ipairs =
|
|
assert, type, table, io, package, math, os, ipairs
|
|
|
|
--- Unix implementation of filesystem and platform abstractions.
|
|
module("luarocks.fs.unix", package.seeall)
|
|
|
|
local fs = require("luarocks.fs")
|
|
|
|
local cfg = require("luarocks.cfg")
|
|
local dir = require("luarocks.dir")
|
|
local fs = require("luarocks.fs")
|
|
|
|
math.randomseed(os.time())
|
|
|
|
--- Return an absolute pathname from a potentially relative one.
|
|
-- @param pathname string: pathname to convert.
|
|
-- @param relative_to string or nil: path to prepend when making
|
|
-- pathname absolute, or the current dir in the dir stack if
|
|
-- not given.
|
|
-- @return string: The pathname converted to absolute.
|
|
function absolute_name(pathname, relative_to)
|
|
assert(type(pathname) == "string")
|
|
assert(type(relative_to) == "string" or not relative_to)
|
|
|
|
relative_to = relative_to or fs.current_dir()
|
|
if pathname:sub(1,1) == "/" then
|
|
return pathname
|
|
else
|
|
return relative_to .. "/" .. pathname
|
|
end
|
|
end
|
|
|
|
--- Create a wrapper to make a script executable from the command-line.
|
|
-- @param file string: Pathname of script to be made executable.
|
|
-- @param dest string: Directory where to put the wrapper.
|
|
-- @return boolean or (nil, string): True if succeeded, or nil and
|
|
-- an error message.
|
|
function wrap_script(file, dest)
|
|
assert(type(file) == "string")
|
|
assert(type(dest) == "string")
|
|
|
|
local base = dir.base_name(file)
|
|
local wrapname = fs.is_dir(dest) and dest.."/"..base or dest
|
|
local wrapper = io.open(wrapname, "w")
|
|
if not wrapper then
|
|
return nil, "Could not open "..wrapname.." for writing."
|
|
end
|
|
wrapper:write("#!/bin/sh\n\n")
|
|
wrapper:write('LUA_PATH="'..package.path..';$LUA_PATH"\n')
|
|
wrapper:write('LUA_CPATH="'..package.cpath..';$LUA_CPATH"\n')
|
|
wrapper:write('export LUA_PATH LUA_CPATH\n')
|
|
wrapper:write('exec "'..dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)..'" -lluarocks.loader "'..file..'" "$@"\n')
|
|
wrapper:close()
|
|
if fs.execute("chmod +x",wrapname) then
|
|
return true
|
|
else
|
|
return nil, "Could not make "..wrapname.." executable."
|
|
end
|
|
end
|
|
|
|
--- Check if a file (typically inside path.bin_dir) is an actual binary
|
|
-- or a Lua wrapper.
|
|
-- @param filename string: the file name with full path.
|
|
-- @return boolean: returns true if file is an actual binary
|
|
-- (or if it couldn't check) or false if it is a Lua wrapper.
|
|
function is_actual_binary(filename)
|
|
if filename:match("%.lua$") then
|
|
return false
|
|
end
|
|
local file = io.open(filename)
|
|
if file then
|
|
local found = false
|
|
local first = file:read()
|
|
if first:match("#!.*lua") then
|
|
found = true
|
|
elseif first:match("#!/bin/sh") then
|
|
local line = file:read()
|
|
line = file:read()
|
|
if not(line and line:match("LUA_PATH")) then
|
|
found = true
|
|
end
|
|
end
|
|
file:close()
|
|
if found then
|
|
return false
|
|
else
|
|
return true
|
|
end
|
|
else
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function is_actual_binary(filename)
|
|
if filename:match("%.lua$") then
|
|
return false
|
|
end
|
|
local file = io.open(filename)
|
|
if file then
|
|
local found = false
|
|
local first = file:read()
|
|
if first:match("#!.*lua") then
|
|
file:close()
|
|
return true
|
|
elseif first:match("#!/bin/sh") then
|
|
local line = file:read()
|
|
line = file:read()
|
|
if not(line and line:match("LUA_PATH")) then
|
|
file:close()
|
|
return true
|
|
end
|
|
end
|
|
file:close()
|
|
else
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function copy_binary(filename, dest)
|
|
return fs.copy(filename, dest)
|
|
end
|
|
|