+++ /dev/null
-#!/usr/bin/env lua
-
---
--- Yoink
--- This script is a predictable alternative to the system install program.
---
-
-function show_help()
- print([[
-
-Install files, optionally changing the mode of the installed files.
-Usage:
- install.lua [-m MODE] SOURCE... DEST
-
-If DEST is a directory, the source(s) will be copied into DEST with their
-same names.
-]])
-end
-
-
--- Get the next argument passed to the script.
-function shift()
- var = arg[1]
- table.remove(arg, 1)
- return var
-end
-
--- Execute a command and return its output or nil if the command failed to
--- run.
-function backtick_run(command)
- local fd = io.popen(command.." 2>/dev/null")
- if fd then local stdout = fd:read("*l") fd:close() return stdout end
- return nil
-end
-
--- Return true if a filespec is a directory, false otherwise.
-function is_directory(path)
- return os.execute(string.format("test -d %q", path)) == 0
-end
-
--- Get the basename of a path.
-function basename(path, ext)
- if not ext then ext = "" end
- return backtick_run(string.format("basename %q %s", path, ext))
-end
-
--- Get the directory part of a path.
-function dirname(path)
- if path:sub(-1) == "/" then path = path .. "." end
- return backtick_run(string.format("dirname %q", path))
-end
-
--- Like mkdir -p except portable.
-function mkdir(path)
- if path:sub(1,1) ~= "/" then path = os.getenv("PWD") .. "/" .. path end
- path = path:gsub("/$", "")
- path = path:gsub("/+", "/")
- path = path:gsub("/[^/]+/%.%.", "")
- path = path:gsub("%./", "")
- path = path:gsub("/%.", "")
-
- local compound = ""
- for component in path:gmatch("(/[^/]*)") do
- compound = compound .. component
- if not is_directory(compound) then
- local result = os.execute(string.format("mkdir %q", compound))
- if result ~= 0 then os.exit(1) end
- end
- end
-end
-
--- Change the mode of a file or directory.
-function chmod(mode, filespec)
- if not mode or mode == "" then return end
- local result = os.execute(string.format("chmod %s %q", mode, filespec))
- if result ~= 0 then os.exit(1) end
-end
-
--- Install a file. If destination is a directory, the source will be
--- installed into the directory with the same name.
-function install(mode, source, dest)
- if is_directory(dest) then dest = dest .. "/" .. basename(source) end
- local result = os.execute(string.format("cp %q %q", source, dest))
- if result == 0 then chmod(mode, dest) else os.exit(1) end
-end
-
-
-files = {}
-
--- Consume and parse each argument.
-while 0 < #arg do
- local v = shift()
- if v == "-h" or v == "--help" then show_help() os.exit(0) end
- if v == "-m" then mode = shift() else table.insert(files, v) end
-end
-
--- Check the arguments and determine the target.
-if #files < 2 then show_help() os.exit(1)
-else target = table.remove(files) end
-
--- Perform the installation.
-if 1 < #files then
- mkdir(target)
- for i,file in ipairs(files) do install(mode, file, target) end
-else
- mkdir(dirname(target))
- install(mode, files[1], target)
-end
-