From c01b9304b9210daf18b8bf8dac073aa5dc707b38 Mon Sep 17 00:00:00 2001 From: Kai Vogelgesang Date: Tue, 7 Jul 2020 04:10:10 +0200 Subject: [PATCH] git gud --- kai/gitgud.lua | 132 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 kai/gitgud.lua diff --git a/kai/gitgud.lua b/kai/gitgud.lua new file mode 100644 index 0000000..495cb1c --- /dev/null +++ b/kai/gitgud.lua @@ -0,0 +1,132 @@ +--[[ + +Usages: +> gitgud sync +download file from repo + +> gitgud delete +delete downloaded file + +> gitgud +re-download all synced files + +> gitgud run +fetch and exec file from repo + +]] + +if not http then error("http is not enabled") end + +local function get(url) + print("GET " .. url) + local response, err = http.get(url) + if not response then + printError(err) + return + end + + local status, err = response.getResponseCode() + if status ~= 200 then + printError(status .. " " .. err) + return + end + print(status .. " " .. err) + + local result = response.readAll() + response.close() + return result +end + +function ensure_dotlua(path) + if string.match(path, "%.lua$") then + return path + else + return path .. ".lua" + end +end + +local function gitea_url(path) + return "https://gitea.leafbla.de/dominic/turtles/raw/branch/master/".. path +end + +local function download_file(repo_path, local_path) + local result = get(gitea_url(repo_path)) + if not result then + error("download failed") + end + + local f = fs.open(local_path, "w") + f.write(result) + f.close() +end + +-- keep track of downloaded files +local storage_path = ".gitgud" + +local storage = {} +if fs.exists(storage_path) then + local f = fs.open(storage_path, "r") + storage = textutils.unserialize(f.readAll()) + f.close() +end + +local function update_storage() + local f = fs.open(storage_path, "w") + f.write(textutils.serialize(storage)) + f.close() +end + +local args = {...} + +if #args == 0 then + + for local_path, repo_path in pairs(storage) do + download_file(repo_path, local_path) + end + +elseif args[1] == "sync" then + local usage = "gitgud sync " + local repo_path = args[2] or error(usage) + local local_path = args[3] or error(usage) + + repo_path = ensure_dotlua(repo_path) + local_path = ensure_dotlua(local_path) + + storage[local_path] = repo_path + update_storage() + + download_file(repo_path, local_path) + +elseif args[1] == "delete" then + local usage = "gitgud delete " + local local_path = args[2] or error(usage) + + local_path = ensure_dotlua(local_path) + + storage[local_path] = nil + update_storage() + + fs.delete(local_path) + +elseif args[1] == "run" then + local usage = "gitgud run [args...]" + local repo_path = args[2] or error(usage) + + repo_path = ensure_dotlua(repo_path) + + local result = get(gitea_url(repo_path)) + if not result then + error("download failed") + end + + local func, err = load(result, repo_path, "t", _ENV) + if not func then + printError(err) + return + end + local success, err = pcall(func, select(3, ...)) + if not success then + printError(err) + end + +end \ No newline at end of file