Advertisement
CometWolf

Turtle Architect V2 installer

Apr 14th, 2014
6,799
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.19 KB | None | 1 0
  1. if not term.isColor() then
  2.   error("Turtle Architect is incompatible with regular "..(turtle and "turtles" or "computers").."!",0)
  3. end
  4. local tArgs = {...}
  5. local minification = tArgs[2] ~= "-t" --trims all indentation from the files to reduce the file size by roughly 25%
  6. local folder = tArgs[1] or ""
  7. local tContents = {}
  8. local getContents
  9. local tSha = {}
  10. local tIgnore = { --files to ignore
  11.   ["README.md"] = true
  12. }
  13.  
  14. local prevLines
  15. local termX,termY = term.getSize()
  16. local midY = math.floor(termY/2)
  17. local print = function(text)
  18.   local tLines = {}
  19.   while #text > 0 do  --splits text into a table containing each line
  20.     local line = text:sub(1,termX)
  21.     local newLine = string.find(line.."","\n") --check for new line character
  22.     if newLine then
  23.       line = line:sub(1,newLine-1)
  24.       text = text:sub(#line+2,#text)
  25.     elseif #line == termX then
  26.       local endSpace = line:find"%s$" or line:find"%s%S-$" or termX
  27.       line = line:sub(1,endSpace)
  28.       text = text:sub(#line+1)
  29.     else
  30.       text = ""
  31.     end
  32.     line = string.rep(" ",math.max(math.floor((termX-#line)/2),0))..line
  33.     line = line..string.rep(" ",math.max(termX-#line,0))
  34.     tLines[#tLines+1] = line
  35.   end
  36.   if prevLines and #prevLines > #tLines then
  37.     for i = 1,#prevLines do
  38.       if not tLines[i] then
  39.         term.setCursorPos(1,midY-math.floor(#prevLines/2)+i)
  40.         term.clearLine()
  41.       end
  42.     end
  43.   end
  44.   for i,line in ipairs(tLines) do
  45.     term.setCursorPos(1,midY-math.floor((#tLines/2))+i)
  46.     term.write(line)
  47.   end
  48.   prevLines = tLines
  49. end
  50.  
  51. getContents = function(path)
  52.   path = path or ""
  53.   print("Scanning Github repo\n"..path.."\nfor files...")
  54.   local web = http.get("https://api.github.com/repos/CometWolf/TurtleArchitectV2/contents"..path)
  55.   assert(web,(path ~= "" and "Error: Failed to get contents of "..path) or "Error: Github download limit exceeded")
  56.   local sContents = web.readAll()
  57.   web.close()
  58.   local _s,remainder = sContents:find'"name":"'
  59.   local name = sContents:match'"name":"(.-)"'
  60.   while name do
  61.     if tIgnore[name] then
  62.       sContents = sContents:sub(remainder)..""
  63.     else
  64.       sContents = sContents:sub(remainder)..""
  65.       local url = sContents:match'html_url":"(.-)"'
  66.       assert(url,"Error: Failed to get the url of "..path.."/"..name)
  67.       url = url:gsub("https://","https://raw.")
  68.       url = url:gsub("blob/","")
  69.       local fileName = folder..path.."/"..name
  70.       if sContents:match'"type":"(.-)"' == "file" then
  71.         tContents[fileName] = url
  72.         tSha[fileName] = sContents:match'"sha":"(.-)"'
  73.       else
  74.         if not fs.exists(fileName) then
  75.           fs.makeDir(fileName)
  76.         end
  77.         getContents(path.."/"..name)
  78.       end
  79.     end
  80.     _s,remainder = sContents:find'"name":"'
  81.     name = sContents:match'"name":"(.-)"'
  82.   end
  83. end
  84. local createPath
  85. term.setTextColor(colors.white)
  86. term.setBackgroundColor(colors.black)
  87. term.clear()
  88. getContents()
  89. for file,url in pairs(tContents) do
  90.   if not file:match"README.md" then
  91.     local saveFile = fs.open(file:match"arc.Lua" and file:sub(1,#file-4) or file,"w")
  92.     print("Downloading\n"..url)
  93.     local webFile
  94.     while not webFile do
  95.       webFile = http.get(url)
  96.       if not webFile then
  97.         print("Download failed. Retry? (Y/N)")
  98.         while true do
  99.           local _e,key = os.pullEvent"key"
  100.           if key == 21 then --Y
  101.             print"Retrying..."
  102.             break
  103.           elseif key == 49 then --N
  104.             print"Installation canceled"
  105.             saveFile.close()
  106.             return
  107.           end
  108.         end
  109.       end
  110.     end
  111.     if file:match"TAFiles/Settings.Lua" then --settings file can't be minified
  112.       saveFile.write(webFile.readAll())
  113.     else
  114.       local line = webFile.readLine()
  115.       while line do
  116.         saveFile.write((minification and (line:match"(%S.*)$" or "") or line).."\n")
  117.         line = webFile.readLine()
  118.       end
  119.     end
  120.     saveFile.close()
  121.     webFile.close()
  122.   end
  123. end
  124. local file = fs.open(folder.."/".."TAFiles/gitSha","w")
  125. file.write(textutils.serialize(tSha))
  126. file.close()
  127. print("Sucessfully installed Turtle Architect V2\nType "..(folder ~= "" and folder ~= "/" and folder.."/" or "").."arc to run it.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement