Compare commits

..
18 Commits
Author SHA1 Message Date
eejebring fd5cec8a4b fix 2026-08-22 00:03:59 +02:00
eejebring ae5e7ce8f4 cleanup & download location 2026-08-22 00:00:48 +02:00
eejebring 9286509d31 download file url fix 2026-08-21 23:52:06 +02:00
eejebring 7403d1a1f4 response error msg 2026-08-21 23:43:40 +02:00
eejebring 3ca3dad456 main branch 2026-08-21 23:40:59 +02:00
eejebring cc48938255 fix 2026-08-21 23:33:14 +02:00
eejebring ff0fefd0b9 fix 2026-08-21 23:32:17 +02:00
eejebring ecffbdd55c fix 2026-08-21 23:30:22 +02:00
eejebring 02704ae595 fix 2026-08-21 23:29:31 +02:00
eejebring 43b24446f3 debug 2026-08-21 23:28:13 +02:00
eejebring cda3c4f433 fix 2026-08-21 23:20:04 +02:00
eejebring 971e9a614c fix 2026-08-21 23:19:33 +02:00
eejebring 029bf80c51 fix 2026-08-21 23:15:12 +02:00
eejebring c4555da4cf new url parser 2026-08-21 23:12:06 +02:00
eejebring 035fb45cf6 self update 2026-08-21 21:59:33 +02:00
eejebring 7beb7ef4fe Create README.md 2026-08-21 21:26:11 +02:00
eejebring 4d8b615ccb formatting & more nil checks 2026-08-21 21:18:51 +02:00
eejebring 712cfab946 Create .luarc.json 2026-08-21 21:18:03 +02:00
3 changed files with 168 additions and 96 deletions
+13
View File
@@ -0,0 +1,13 @@
{
"runtime.version": "Lua 5.1",
"workspace.library": [
"/home/eejebring/code/external/cc-tweaked-documentation"
],
"diagnostics.globals": [
"os", "fs", "computer", "peripheral", "turtle", "term",
"redstone", "colors", "colours", "keys", "http", "gps",
"disk", "commands", "vector", "paintutils", "parallel",
"rs", "settings", "shell", "window", "io", "textutils",
"native", "periphemu", "read"
]
}
+7
View File
@@ -0,0 +1,7 @@
# Usage:
`git clone [https link from gitea]`
# Download:
`wget https://git.ejebring.com/eejebring/CC-tweaked-Gitea-Client/raw/branch/main/git.lua git.lua`
+113 -61
View File
@@ -1,107 +1,159 @@
-- Save as /home/git.lua
local http = require("http")
local fs = require("fs")
local json = textutils.unserializeJSON
-- Leave empty for public repos, or add "your-token-here"
local GIT_TOKEN = ""
-- Configuration
local GIT_TOKEN = "" -- Leave empty for public repos, or add "your-token-here"
-- Update config
local UPDATE_URL = "https://git.ejebring.com/eejebring/CC-tweaked-Gitea-Client/raw/branch/main/git.lua"
local GIT_FILE = "git.lua"
-- Parse a Gitea URL like: https://gitea.example.com/owner/repo or /owner/repo/branch/filename
local function parseGiteaURL(url)
local protocol, domain, path = url:match("^(https?://([^/]+))(/[^?]*)")
if not protocol then
protocol, domain, path = "https://gitea.local", "gitea.local", url
end
-- Remove trailing slashes and clean path
path = path:gsub("/+$", "")
-- Extract components from path (format: /owner/repo or /owner/repo/branch)
local parts = {}
for segment in path:gmatch("[^/]+") do
if segment ~= "" then table.insert(parts, segment) end
end
if #parts < 2 then
return nil, "Invalid URL format. Expected: https://domain.com/owner/repo"
end
local owner = parts[1]
local repo = parts[2]
local branch = parts[3] or "master"
return {
base = protocol .. "/" .. domain,
owner = owner,
repo = repo,
branch = branch
}
---@param str string
---@param comp string
function string.beginsWith(str, comp)
local compLen = string.len(comp)
local begining = string.sub(str, 0, compLen)
return begining == comp
end
local function downloadFile(base, owner, repo, branch, path, target)
local url = ("%s/api/v1/repos/%s/%s/raw/%s/%s"):format(base, owner, repo, branch, path)
---@param str string
---@param comp string
function string.endsWith(str, comp)
local reverseStr = string.reverse(str)
local reverseComp = string.reverse(comp)
return string.beginsWith(reverseStr, reverseComp)
end
local req = {url = url}
---@param str string
---@param delimiter string
function string.split(str, delimiter)
local returnTable = {}
for k in string.gmatch(str, "([^" .. delimiter .. "]+)")
do
returnTable[#returnTable + 1] = k
end
return returnTable
end
local protocols = { "http://", "https://" }
local ending = ".git"
---@param url string
local function parseGiteaURL(url)
---@class urlinfo
local urlInfo = {
protocol = "",
origin = "",
owner = "",
repo = "",
branch = "main",
treeUrl = "",
}
local lowerUrl = string.lower(url)
if not string.endsWith(lowerUrl, ending) then error("A gitea link needs to end with " .. ending) end
for _, proto in pairs(protocols) do
if string.beginsWith(lowerUrl, proto) then
urlInfo.protocol = proto
break
end
end
local urlLen = string.len(url)
local protoLen = string.len(urlInfo.protocol)
local endLen = string.len(ending)
local cleaned = string.sub(url, protoLen + 1, urlLen - endLen)
local urlParts = string.split(cleaned, "/")
if not (#urlParts) == 3 then error("Unexpected link length.") end
urlInfo.origin, urlInfo.owner, urlInfo.repo = urlParts[1], urlParts[2], urlParts[3]
urlInfo.treeUrl =
("%s%s/api/v1/repos/%s/%s/git/trees/%s?recursive=1")
:format(urlInfo.protocol, urlInfo.origin, urlInfo.owner, urlInfo.repo, urlInfo.branch)
for k, v in pairs(urlInfo) do
if v == "" or v == nil then
error("Could not parse " .. k .. " from link.")
end
end
print("treeUrl: ", urlInfo.treeUrl)
return urlInfo
end
---@param urlInfo urlinfo
---@param path string
---@param target string
local function downloadFile(urlInfo, path, target)
local url = ("%s%s/api/v1/repos/%s/%s/raw/%s/%s"):format(urlInfo.protocol, urlInfo.origin, urlInfo.owner,
urlInfo.repo, urlInfo.branch, path)
local req = { url = url }
if GIT_TOKEN ~= "" then
req.headers = {Authorization = "token " .. GIT_TOKEN}
req.headers = { Authorization = "token " .. GIT_TOKEN }
end
local response = http.get(req)
if not response then error("Failed to download: "..path) end
local response, err = http.get(req)
if not response then error("Failed to download: " .. path .. " due to: " .. err) end
local data = response.readAll()
response.close()
local file = fs.open(target, "w")
local file, fileError = fs.open(target, "w")
if file then
file.write(data)
file.close()
else
error("Could not download file '" .. target "' due to: " .. fileError)
end
end
local function cloneRepo(url)
local info, err = parseGiteaURL(url)
if not info then error(err) end
local urlInfo = parseGiteaURL(url)
print("Cloning: " .. urlInfo.owner .. "/" .. urlInfo.repo .. "@" .. urlInfo.branch)
print("Cloning: " .. info.owner .. "/" .. info.repo .. "@" .. info.branch)
local treeUrl = ("%s/api/v1/repos/%s/%s/git/trees/%s?recursive=1"):format(info.base, info.owner, info.repo, info.branch)
local req = {url = treeUrl}
local req = { url = urlInfo.treeUrl }
if GIT_TOKEN ~= "" then
req.headers = {Authorization = "token " .. GIT_TOKEN}
req.headers = { Authorization = "token " .. GIT_TOKEN }
end
local resp = http.get(req)
if not resp then error("Cannot access repository. Check URL or token.") end
local tree = json(resp.readAll())
local responseJSON = resp.readAll()
resp.close()
if not responseJSON then error("Response returned empty.") end
local tree = textutils.unserializeJSON(responseJSON)
if not tree then error("Response could not be unserialized") end
local count = 0
for _, node in ipairs(tree.tree) do
if node.type == "blob" then
local localPath = ("git/%s/%s/%s"):format(info.owner, info.repo, node.path)
local localPath = ("%s/%s"):format(urlInfo.repo, node.path)
local dir = fs.getDir(localPath)
if not fs.isDir(dir) then fs.makeDir(dir) end
downloadFile(info.base, info.owner, info.repo, info.branch, node.path, localPath)
downloadFile(urlInfo, node.path, localPath)
count = count + 1
end
end
print(("Cloned %d files to /home/git/%s/%s"):format(count, info.owner, info.repo))
print(("Cloned %d files to /home/%s"):format(count, urlInfo.repo))
end
local args = {...}
if args[1] == "pull" and args[2] then
local args = { ... }
if args[1] == "clone" and args[2] then
cloneRepo(args[2])
elseif args[1] == "update" then
local resp = http.get(UPDATE_URL)
if not resp then error("Failed to download update.") end
local code = resp.readAll()
if not code then error("Recived empty response from server.") end
local file = fs.open(GIT_FILE, "w+")
if not file then error("Could not overwite " .. GIT_FILE) end
file.write(code)
else
print("Usage:")
print(" git pull <full-gitea-url>")
print(" git update")
print(" git clone <full-gitea-url>")
print("")
print("Examples:")
print(' git pull "https://gitea.example.com/user/myrepo"')
print(' git pull "https://gitea.example.com/user/myrepo/tree/main/path/to/file.lua"')
print(' git clone "https://gitea.example.com/user/myrepo"')
--print(' git clone "https://gitea.example.com/user/myrepo/tree/main/path/to/file.lua"')
print("")
print("Set GIT_TOKEN variable above for private repos.")
end