git gud
This commit is contained in:
parent
b54c2f2257
commit
c01b9304b9
132
kai/gitgud.lua
Normal file
132
kai/gitgud.lua
Normal file
@ -0,0 +1,132 @@
|
||||
--[[
|
||||
|
||||
Usages:
|
||||
> gitgud sync <repo path> <local path>
|
||||
download file from repo
|
||||
|
||||
> gitgud delete <local path>
|
||||
delete downloaded file
|
||||
|
||||
> gitgud
|
||||
re-download all synced files
|
||||
|
||||
> gitgud run <repo path>
|
||||
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 <repo path> <local path>"
|
||||
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 path>"
|
||||
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 <repo path> [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
|
Loading…
Reference in New Issue
Block a user