From dceba36b676c99a76f39f5716e164cdc6234a6a5 Mon Sep 17 00:00:00 2001 From: Tangent Date: Sat, 13 Jan 2024 17:17:31 -0700 Subject: [PATCH] major update to utility functions --- README.md | 1 + test.lua | 18 +++++++++++++++ utility-functions.lua | 53 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 test.lua diff --git a/README.md b/README.md index 19b7720..6d73564 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ It's like dotfiles, but no, it's just Lua scripts I find useful. ## Scripts - `popen-command-test.lua`: A badly-named WIP script for working with LLMs through WSL using [ollama](https://github.com/jmorganca/ollama). - `print-arguments.lua`: For testing how a Lua script receives arguments. (It can be platform-specific.) +- `test.lua`: (Dev Test) Used repeatedly while working on these scripts to verify minor details I'm forgetful about. - `utility-functions.lua`: (Library) Required for many of these scripts to run. - `video-dl.lua`: A few premade command lines for using `yt-dlp` to download what I want quicker. diff --git a/test.lua b/test.lua new file mode 100644 index 0000000..0a3fe7b --- /dev/null +++ b/test.lua @@ -0,0 +1,18 @@ +#!/usr/bin/env luajit + +-- if utility-functions.lua has an error, this won't show it, so for testing purposes, I don't use it here +-- local error_occurred, utility = pcall(function() return require("utility-functions") end) if not error_occurred then error("This script is installed improperly. Follow instructions at https://github.com/TangentFoxy/.lua-files#installation") end +utility = require("utility-functions") + +print("---") + +-- local ls = utility.ls() +-- ls(function(file_name) +-- print(file_name) +-- end) + +utility.ls()(function(file_name) + print(file_name) +end) + +print("---") diff --git a/utility-functions.lua b/utility-functions.lua index 199fa09..4ba9f89 100644 --- a/utility-functions.lua +++ b/utility-functions.lua @@ -1,21 +1,40 @@ math.randomseed(os.time()) --- TODO look for popen command and fall back to outputting to file if its unavailable -function os.command(command) +local utility = {} + +if package.config:sub(1, 1) == "\\" then + utility.OS = "Windows" +else + utility.OS = "UNIX-like" +end + +-- TODO look for popen command and fall back to outputting to file if its unavailable (this should always output a warning!) +function os.capture(command) local file = assert(io.popen(command, 'r')) local output = assert(file:read('*all')) file:close() return output end +-- always uses outputting to a temporary file to guarantee safety +function os.capture_safe(command, tmp_file_name) + local file_name = tmp_file_name or utility.tmp_file_name() + os.execute(command .. " > " .. file_name) + + local file = io.open(file_name, "r") + local output = file:read("*all") + file:close() + os.execute("rm " .. file_name) -- NOTE may not work on all systems, I have a version somewhere that always does + return output +end + -- trim6 from Lua users wiki (best all-round pure Lua performance) function string.trim(s) return s:match'^()%s*$' and '' or s:match'^%s*(.*%S)' end -local utility = {} - --- NOTE: This will print errors sometimes. :D +-- TODO: This needs to use which on a non-Windows platform. +-- NOTE: This will sometimes print errors that do not matter. Windows, am I right? utility.required_program = function(name) if os.execute("where " .. tostring(name)) ~= 0 then error(tostring(name) .. " must be installed and in the path") @@ -37,9 +56,33 @@ utility.tmp_file_name = function() end utility.escape_quotes = function(input) + -- the order of these commands is important and must be preserved input = input:gsub("\\", "\\\\") input = input:gsub("\"", "\\\"") return input end +utility.ls = function(path) + local command + if utility.OS == "Windows" then + command = "dir /w /b" + else + command = "ls -1" + end + + local tmp_file_name = utility.tmp_file_name() + local output = os.capture_safe(command, tmp_file_name) + -- local output = os.capture_safe(command) + -- output = output:trim() -- verifying that even without trailing newlines, the gmatch below will work + -- print(output .. "\n---") -- DEBUG + + return function(fn) + for line in output:gmatch("[^\r\n]+") do + if line ~= tmp_file_name then -- exclude temporary file name + fn(line) + end + end + end +end + return utility