-- gist.lua - Gist client for ComputerCraft -- Made by JackMacWindows for CraftOS-PC and CC: Tweaked if not http then printError("Gist requires http API") if _G.config ~= nil then printError("Set http_enable to true in the CraftOS-PC configuration") else printError("Set http_enable to true in ComputerCraft's configuration") end return 2 end local gist = require "cc.http.gist" local args = { ... } local function readFile(filename, files, isEditing) if fs.isDir(shell.resolve(filename)) then for _, v in ipairs(fs.list(shell.resolve(filename))) do if readFile(fs.combine(filename, v), files, isEditing) then return true end end else if files[fs.getName(filename)] then print("Cannot upload files with duplicate names.") return true end local file = fs.open(shell.resolve(filename), "rb") if file == nil then if not isEditing then print("Could not read " .. filename .. ".") return true else files[fs.getName(filename)] = textutils.json_null end else files[fs.getName(filename)] = file.readAll() file.close() end end end local function getFiles(isEditing) local files = {} local i = isEditing and 3 or 2 while args[i] ~= nil and args[i] ~= "--" do if readFile(args[i], files, isEditing) then return nil end i = i + 1 end if args[i] == "--" then return files, table.concat({ table.unpack(args, i + 1) }, " ") end return files end local function setTextColor(c) if term.isColor() then term.setTextColor(c) elseif c == colors.white or c == colors.yellow then term.setTextColor(colors.white) else term.setTextColor(colors.lightGray) end end local helpstr = "Usages:\ngist put [-- description...]\ngist edit [-- description]\ngist delete \ngist get \ngist run [arguments...]\ngist info " if #args < 2 then print(helpstr) return 1 end if args[1] == "get" then if #args < 3 then print(helpstr) return 1 end if args[3]:sub(#args[3]) == "/" or fs.isDir(shell.resolve(args[3])) then fs.makeDir(shell.resolve(args[3])) local files, err = gist.getAll(args[2], write) if files == nil then printError(err) return 3 end for k, v in pairs(files) do local file = fs.open(shell.resolve(fs.combine(args[3], k)), "wb") file.write(v) file.close() end print("Downloaded all files to " .. shell.resolve(args[3])) else local data, err = gist.get(args[2], write) if data == nil then printError(err) return 3 end local file = fs.open(shell.resolve(args[3]), "wb") file.write(data) file.close() print("Downloaded as " .. shell.resolve(args[3])) end elseif args[1] == "run" then return gist.run(args[2], write, table.unpack(args, 3)) elseif args[1] == "put" then local files, description = getFiles(false) if files == nil then return end local id, html_url = gist.put(files, description, nil, true) if id ~= nil then print("Uploaded as " .. html_url .. "\nRun 'gist get " .. id .. "' to download anywhere") else printError(html_url) return 3 end elseif args[1] == "info" then local tab, err = gist.info(args[2], write) if tab == nil then printError(err) return 3 end setTextColor(colors.yellow) write("Description: ") setTextColor(colors.white) print(tab.description) setTextColor(colors.yellow) write("Author: ") setTextColor(colors.white) print(tab.author) setTextColor(colors.yellow) write("Revisions: ") setTextColor(colors.white) print(tab.revisionCount) setTextColor(colors.yellow) print("Files in this Gist:") setTextColor(colors.white) textutils.tabulate(tab.files) elseif args[1] == "edit" then if #args < 3 then print(helpstr) return 1 end local files, description = getFiles(true) if files == nil then return 2 end if not description then description = gist.info(args[2], write).description end local id, html_url = gist.put(files, description, args[2], true) if id then print("Uploaded as " .. html_url .. "\nRun 'gist get " .. args[2] .. "' to download anywhere") else printError(html_url) return 3 end elseif args[1] == "delete" then local ok, err = gist.delete(args[2], true) if ok then print("The requested Gist has been deleted.") else printError(err) return 3 end else print(helpstr) return 1 end