Вроде разгрёб завал на учёбе, потихоньку возвращаюсь к OC. Вот очередная реализация, правда уже не очень простая. За то по скорости не уступает варианту с предварительно заданным списком файлов.
Сам инсталятор:
local internet = require("internet")
local fs = require("filesystem")
local shell = require("shell")
local ser = require("serialization")
local host = "alexcatze.pythonanywhere.com"
local owner = "AlexCatze"
local repo = "RacoonNet"
local ref = "v0.2"
local path = "/"
local deploy_to = "/"
function request(url)
local data = ""
local result, response = pcall(internet.request, url)
if result then
local result = pcall(function()
for chunk in response do
data = data .. chunk
end
end)
end
return data
end
files = ser.unserialize(request("http://"..host.."/?owner="..owner.."&repo="..repo.."&path="..path.."&ref="..ref))
for _,v in pairs(files) do
local pth = deploy_to..v
if not fs.exists(pth:match(".*/")) then fs.makeDirectory(pth:match(".*/")) end
shell.execute("wget -f ".."https://raw.githubusercontent.com/"..owner.."/"..repo.."/"..ref.."/"..v.." "..pth)
end
Как видно, он стучится мне на pythonanywhere, откуда и берёт список файлов.
Вот код с pythonanywhere:
from flask import Flask
from flask import request
import requests
import json
def request_url(url, result):
r = requests.get(url)
j = json.loads(r.text)
for x in j:
if x["type"] == "file":
result = result + "\"" + x["path"] + "\","
else:
result = request_url(x["url"],result)
return result
app = Flask(__name__)
def main():
uname = "AlexCatze"
token = "тут мой токен, вам я его не скажу!!!"
if uname != request.args["owner"]:#Проверка, что бы другие не использовали мой лимит
return "{}"
result = request_url("https://"+uname+":"+token+"@api.github.com/repos/"+request.args["owner"]+"/"+request.args["repo"]+"/contents"+request.args["path"]+"?ref="+request.args["ref"],"{")
result = result + "}"
return result
app.add_url_rule("/", "main", main,methods=['GET'])
Тут мы получаем запрос, из него извлекаем нужные данные. Потом используя api ключ(тогда лимит запросов 5000 в час), рекурсивно получаем список файлов, и отправляем его на клиент.
Вечером подробно распишу, как это настроить.