mirror of https://github.com/mono/CppSharp.git
c-sharpdotnetmonobindingsbridgecclangcpluspluscppsharpglueinteropparserparsingpinvokeswigsyntax-treevisitorsxamarinxamarin-bindings
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
5.8 KiB
205 lines
5.8 KiB
function string.is_empty(s) |
|
return not s or s == '' |
|
end |
|
|
|
function cat(file) |
|
local file = assert(io.open(file, "r")) |
|
local output = file:read('*all') |
|
file:close() |
|
return output |
|
end |
|
|
|
function outputof(cmd, quiet) |
|
local file = assert(io.popen(cmd .. " 2>&1", "r")) |
|
local output = file:read('*all') |
|
file:close() |
|
return output |
|
end |
|
|
|
function execute(cmd, quiet) |
|
print(cmd) |
|
if not quiet then |
|
local status, exit, err = os.execute(cmd) |
|
return err |
|
else |
|
local file = assert(io.popen(cmd .. " 2>&1", "r")) |
|
local output = file:read('*all') |
|
local status, exit, err = file:close() |
|
return err |
|
end |
|
end |
|
|
|
function execute_or_die(cmd, quiet) |
|
local res = execute(cmd, quiet) |
|
if res > 0 then |
|
error("Error executing shell command, aborting...") |
|
end |
|
return res |
|
end |
|
|
|
function sudo(cmd) |
|
return os.execute("sudo " .. cmd) |
|
end |
|
|
|
function is_vagrant() |
|
return os.isdir("/vagrant") |
|
end |
|
|
|
git = {} |
|
|
|
-- Remove once https://github.com/premake/premake-core/pull/307 is merged. |
|
local sep = os.ishost("windows") and "\\" or "/" |
|
|
|
function git.clone(dir, url, target) |
|
local cmd = "git clone " .. url .. " " .. path.translate(dir, sep) |
|
if target ~= nil then |
|
cmd = cmd .. " " .. target |
|
end |
|
return execute_or_die(cmd) |
|
end |
|
|
|
function git.pull_rebase(dir) |
|
local cmd = "git -C " .. path.translate(dir, sep) .. " pull --rebase" |
|
return execute_or_die(cmd) |
|
end |
|
|
|
function git.reset_hard(dir, rev) |
|
local cmd = "git -C " .. path.translate(dir, sep) .. " reset --hard " .. rev |
|
return execute_or_die(cmd) |
|
end |
|
|
|
function git.checkout(dir, rev) |
|
local cmd = "git -C " .. path.translate(dir, sep) .. " checkout " .. rev |
|
return execute_or_die(cmd) |
|
end |
|
|
|
function git.rev_parse(dir, rev) |
|
if not os.isdir(dir .. "/.git") then |
|
return nil |
|
end |
|
local cmd = "git -C " .. path.translate(dir, sep) .. " rev-parse " .. rev |
|
return outputof(cmd) |
|
end |
|
|
|
function percentage(total, curr) |
|
return math.floor(math.min(math.max(curr / total, 0), 1) * 100) |
|
end |
|
|
|
function http.progress (total, prev, curr) |
|
local prevPercent = percentage(total, prev) |
|
local percent = percentage(total, curr) |
|
if percent % 5 == 0 and prevPercent ~= percent then |
|
io.write("Download progress (" .. percent .. "%/100%)\r") |
|
end |
|
end |
|
|
|
function download(url, file, try) |
|
print("Downloading: " .. url) |
|
local prev = 0 |
|
local res, code = http.download(url, file, function(total, curr) |
|
http.progress(total, prev, curr) |
|
prev = curr |
|
end) |
|
|
|
if res ~= "OK" then |
|
os.remove(file) |
|
|
|
if not try then |
|
error(res) |
|
end |
|
end |
|
|
|
return res, code |
|
end |
|
|
|
-- |
|
-- Allows copying directories. |
|
-- It uses the premake patterns (**=recursive match, *=file match) |
|
-- NOTE: It won't copy empty directories! |
|
-- Example: we have a file: src/test.h |
|
-- os.copydir("src", "include") simple copy, makes include/test.h |
|
-- os.copydir("src", "include", "*.h") makes include/test.h |
|
-- os.copydir(".", "include", "src/*.h") makes include/src/test.h |
|
-- os.copydir(".", "include", "**.h") makes include/src/test.h |
|
-- os.copydir(".", "include", "**.h", true) will force it to include dir, makes include/test.h |
|
-- |
|
-- @param src_dir |
|
-- Source directory, which will be copied to dst_dir. |
|
-- @param dst_dir |
|
-- Destination directory. |
|
-- @param filter |
|
-- Optional, defaults to "**". Only filter matches will be copied. It can contain **(recursive) and *(filename). |
|
-- @param single_dst_dir |
|
-- Optional, defaults to false. Allows putting all files to dst_dir without subdirectories. |
|
-- Only useful with recursive (**) filter. |
|
-- @returns |
|
-- True if successful, otherwise nil. |
|
-- |
|
function os.copydir(src_dir, dst_dir, filter, single_dst_dir) |
|
filter = filter or "**" |
|
src_dir = src_dir .. "/" |
|
print('copy "' .. path.getabsolute(src_dir) .. filter .. '" to "' .. dst_dir .. '".') |
|
if not os.isdir(src_dir) then error(src_dir .. " is not an existing directory!") end |
|
dst_dir = dst_dir .. "/" |
|
local dir = path.rebase(".",path.getabsolute("."), src_dir) -- root dir, relative from src_dir |
|
|
|
os.chdir( src_dir ) -- change current directory to src_dir |
|
local matches = os.matchfiles(filter) |
|
os.chdir( dir ) -- change current directory back to root |
|
|
|
local counter = 0 |
|
for k, v in ipairs(matches) do |
|
local target = iif(single_dst_dir, path.getname(v), v) |
|
--make sure, that directory exists or os.copyfile() fails |
|
os.mkdir( path.getdirectory(dst_dir .. target)) |
|
if os.copyfile( src_dir .. v, dst_dir .. target) then |
|
counter = counter + 1 |
|
end |
|
end |
|
|
|
if counter == #matches then |
|
print( counter .. " files copied.") |
|
return true |
|
else |
|
print( "Error: " .. counter .. "/" .. #matches .. " files copied.") |
|
return nil |
|
end |
|
end |
|
|
|
-- |
|
-- Allows removing files from directories. |
|
-- It uses the premake patterns (**=recursive match, *=file match) |
|
-- |
|
-- @param src_dir |
|
-- Source directory, which will be copied to dst_dir. |
|
-- @param filter |
|
-- Optional, defaults to "**". Only filter matches will be copied. It can contain **(recursive) and *(filename). |
|
-- @returns |
|
-- True if successful, otherwise nil. |
|
-- |
|
function os.rmfiles(src_dir, filter) |
|
filter = filter or "**" |
|
src_dir = src_dir .. "/" |
|
print('rm ' .. path.getabsolute(src_dir) .. " " .. filter) |
|
if not os.isdir(src_dir) then error(src_dir .. " is not an existing directory!") end |
|
local dir = path.rebase(".",path.getabsolute("."), src_dir) -- root dir, relative from src_dir |
|
|
|
os.chdir( src_dir ) -- change current directory to src_dir |
|
local matches = os.matchfiles(filter) |
|
os.chdir( dir ) -- change current directory back to root |
|
|
|
local counter = 0 |
|
for k, v in ipairs(matches) do |
|
if os.remove( src_dir .. v) then |
|
counter = counter + 1 |
|
end |
|
end |
|
|
|
if counter == #matches then |
|
print( counter .. " files removed.") |
|
return true |
|
else |
|
print( "Error: " .. counter .. "/" .. #matches .. " files removed.") |
|
return nil |
|
end |
|
end |