formating better for spm packages
This commit is contained in:
203
Src/hysh/data/bin/ls
Normal file
203
Src/hysh/data/bin/ls
Normal file
@@ -0,0 +1,203 @@
|
||||
--:Minify:--
|
||||
local cloptions = {
|
||||
a = false,
|
||||
h = false,
|
||||
l = false,
|
||||
help = false,
|
||||
}
|
||||
local inpArgs = { ... }
|
||||
local args = {}
|
||||
local name = syscall.getTask(syscall.getpid()).name
|
||||
|
||||
for _, v in pairs(inpArgs) do
|
||||
if v:sub(1, 2) == "--" then
|
||||
local opt = v:sub(3)
|
||||
if cloptions[opt] == nil then
|
||||
print(name .. ": unrecognized option '" .. v .. "'.")
|
||||
print("try '" .. name .. " --help' for more information.")
|
||||
return
|
||||
end
|
||||
cloptions[opt] = true
|
||||
elseif v:sub(1, 1) == "-" then
|
||||
for i = 2, #v do
|
||||
local opt = v:sub(i, i)
|
||||
if cloptions[opt] == nil then
|
||||
print(name .. ": invalid option '-" .. opt .. "'.")
|
||||
print("try '" .. name .. " --help' for more information.")
|
||||
return
|
||||
end
|
||||
cloptions[opt] = true
|
||||
end
|
||||
else
|
||||
table.insert(args, v)
|
||||
end
|
||||
end
|
||||
|
||||
if cloptions.help then
|
||||
print("Usage: " .. name .. " [OPTION]... [DIR]")
|
||||
print("List all entries in the specified DIRectory, or cwd if not specified.")
|
||||
print("")
|
||||
print("Options:")
|
||||
print(" -a do not ignore entries starting with .")
|
||||
print(" -h with -l, print sizes in human readable format")
|
||||
print(" -l use a long listing format")
|
||||
print(" --help display this help and exit")
|
||||
return
|
||||
end
|
||||
|
||||
local fs = require("fs")
|
||||
local dir = args[1] or ""
|
||||
if dir:sub(1, 1) ~= "/" then
|
||||
dir = syscall.getcwd() .. "/" .. dir
|
||||
end
|
||||
if dir:sub(-1) ~= "/" then dir = dir .. "/" end
|
||||
|
||||
if not fs.isDir(dir) then
|
||||
print(name .. ": cannot access '" .. (args[1] or dir) .. "': no such directory")
|
||||
return
|
||||
end
|
||||
|
||||
local function permStr(perms, etype)
|
||||
local function b(n) return math.floor(perms / (2^n)) % 2 == 1 end
|
||||
local t
|
||||
if etype == 0x01 then t = "l"
|
||||
elseif etype == nil then t = "-"
|
||||
else t = "-" end
|
||||
|
||||
local ur = b(5) and "r" or "-"
|
||||
local uw = b(4) and "w" or "-"
|
||||
local ux = b(9) and (b(6) and "s" or "x") or (b(6) and "S" or "-")
|
||||
local gr = b(3) and "r" or "-"
|
||||
local gw = b(2) and "w" or "-"
|
||||
local gx = b(8) and "x" or "-"
|
||||
local wr = b(1) and "r" or "-"
|
||||
local ww = b(0) and "w" or "-"
|
||||
local wx = b(7) and "x" or "-"
|
||||
|
||||
return t .. ur .. uw .. ux .. gr .. gw .. gx .. wr .. ww .. wx
|
||||
end
|
||||
|
||||
local sizePrefixes = { "K", "M", "G", "T" }
|
||||
local function humanSize(size)
|
||||
local scale = 0
|
||||
while size >= 1024 and scale < #sizePrefixes do
|
||||
size = size / 1024
|
||||
scale = scale + 1
|
||||
end
|
||||
if scale == 0 then return tostring(size).."B" end
|
||||
if size < 10 then
|
||||
return string.format("%.1f%s", size, sizePrefixes[scale])
|
||||
end
|
||||
return math.floor(size) .. sizePrefixes[scale]
|
||||
end
|
||||
|
||||
local screenSizeStr = syscall.devctl(1, "size")
|
||||
local sizeX = tonumber(screenSizeStr:match("^(%d+)")) or 80
|
||||
|
||||
local list = fs.list(dir)
|
||||
list[#list+1] = "."
|
||||
list[#list+1] = ".."
|
||||
if not cloptions.a then
|
||||
for i = #list, 1, -1 do
|
||||
if list[i]:sub(1, 1) == "." then table.remove(list, i) end
|
||||
end
|
||||
end
|
||||
table.sort(list)
|
||||
|
||||
if #list == 0 then return end
|
||||
|
||||
if cloptions.l then
|
||||
for _, v in ipairs(list) do
|
||||
local fullPath = dir .. v
|
||||
local stat = syscall.lstat and syscall.lstat(fullPath) or syscall.stat(fullPath)
|
||||
local isDir = fs.isDir(fullPath)
|
||||
local isSym = stat and stat.etype == 0x01
|
||||
local isSock = stat and stat.etype == 0x02
|
||||
|
||||
local typeChar
|
||||
if isSym then typeChar = "l"
|
||||
elseif isDir then typeChar = "d"
|
||||
elseif isSock then typeChar = "s"
|
||||
else typeChar = "-" end
|
||||
|
||||
local pstr
|
||||
if stat and stat.perms then
|
||||
pstr = permStr(stat.perms, stat.etype)
|
||||
else
|
||||
pstr = typeChar .. "---------"
|
||||
end
|
||||
|
||||
local size = (stat and stat.size) or 0
|
||||
local sizeStr = cloptions.h and humanSize(size) or tostring(size)
|
||||
|
||||
local mtime = (stat and stat.modified) and math.floor(stat.modified / 1000) or 0
|
||||
|
||||
local owner = (stat and tostring(stat.owner)) or "0"
|
||||
local group = (stat and tostring(stat.group)) or "0"
|
||||
|
||||
printInline(pstr .. " " .. owner .. " " .. group .. " ")
|
||||
printInline(string.format("%6s", sizeStr) .. " ")
|
||||
printInline(tostring(mtime) .. " ")
|
||||
|
||||
if isSym then
|
||||
syscall.devctl(1, "sfgc", 0x00FFFF)
|
||||
printInline(v)
|
||||
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
||||
local ok, target = pcall(syscall.readlink, fullPath)
|
||||
if ok then
|
||||
printInline(" -> ")
|
||||
local targetExists = pcall(syscall.stat, fullPath)
|
||||
syscall.devctl(1, "sfgc", targetExists and 0x00FFFF or 0xFF0000)
|
||||
printInline(target)
|
||||
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
||||
end
|
||||
elseif isDir then
|
||||
syscall.devctl(1, "sfgc", 0x6D00FF)
|
||||
printInline(v)
|
||||
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
||||
elseif isSock then
|
||||
syscall.devctl(1, "sfgc", 0xFF00FF)
|
||||
printInline(v)
|
||||
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
||||
else
|
||||
local isExec = stat and stat.perms and (math.floor(stat.perms / (2^9)) % 2 == 1)
|
||||
syscall.devctl(1, "sfgc", isExec and 0x00FF00 or 0xFFFFFF)
|
||||
printInline(v)
|
||||
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
||||
end
|
||||
print("")
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
local colWidth = 0
|
||||
for _, v in ipairs(list) do
|
||||
if #v + 2 > colWidth then colWidth = #v + 2 end
|
||||
end
|
||||
local numCols = math.max(1, math.floor(sizeX / colWidth))
|
||||
|
||||
for i, v in ipairs(list) do
|
||||
local fullPath = dir .. v
|
||||
local isDir = fs.isDir(fullPath)
|
||||
local stat = syscall.lstat and syscall.lstat(fullPath) or syscall.stat(fullPath)
|
||||
local isSym = stat and stat.etype == 0x01
|
||||
|
||||
if isSym then
|
||||
syscall.devctl(1, "sfgc", 0x00FFFF)
|
||||
elseif isDir then
|
||||
syscall.devctl(1, "sfgc", 0x6D00FF)
|
||||
elseif isSock then
|
||||
syscall.devctl(1, "sfgc", 0xFF00FF)
|
||||
else
|
||||
local isExec = stat and stat.perms and (math.floor(stat.perms / (2^9)) % 2 == 1)
|
||||
syscall.devctl(1, "sfgc", isExec and 0x00FF00 or 0xFFFFFF)
|
||||
end
|
||||
|
||||
printInline(v)
|
||||
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
||||
printInline((" "):rep(colWidth - #v))
|
||||
|
||||
if i % numCols == 0 then print("") end
|
||||
end
|
||||
|
||||
if #list % numCols ~= 0 then print("") end
|
||||
Reference in New Issue
Block a user