-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdate.py
119 lines (86 loc) · 2.94 KB
/
update.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import glob
import http.client
import json
import os
import shutil
import tempfile
import urllib.parse
import zipfile
from dataclasses import dataclass
from typing import Optional
@dataclass
class Version:
version: int
repo: str
branch: str
@dataclass
class Response:
status: int
reason: str
content: bytes
def request_get(url: str) -> Response:
parsed_url = urllib.parse.urlparse(url)
host = parsed_url.netloc
path = parsed_url.path
conn = http.client.HTTPSConnection(host)
conn.request("GET", path)
response = conn.getresponse()
response_obj = Response(response.status, response.reason, response.read())
conn.close()
return response_obj
def get_local_version() -> Version:
with open("version.json", "r") as version_file:
data = version_file.read()
json_data: dict = json.loads(data)
return Version(json_data["version"], json_data["repo"], json_data["branch"])
def get_remote_version(ver: Version) -> Optional[Version]:
response = request_get(
f"https://raw.githubusercontent.com/{ver.repo}/refs/heads/{ver.branch}/version.json"
)
if response.status != 200:
print(f"Failed to fetch version: {response.reason}")
return None
json_data: dict = json.loads(response.content)
return Version(json_data["version"], json_data["repo"], json_data["branch"])
def get_update(ver: Version):
response = request_get(
f"https://codeload.github.com/{ver.repo}/zip/refs/heads/{ver.branch}"
)
if response.status != 200:
print(f"Failed to download update: {response.reason}")
return
with tempfile.NamedTemporaryFile() as temp_file:
temp_file.write(response.content)
with zipfile.ZipFile(temp_file, "r") as zip_ref:
extract_path = tempfile.mkdtemp()
zip_ref.extractall(extract_path)
for item in glob.glob("*", recursive=True):
if os.path.isfile(item):
os.remove(item)
else:
shutil.rmtree(item)
folder_name = f"{ver.repo.split("/")[1]}-{ver.branch}"
extracted_folder = os.path.join(extract_path, folder_name)
for root, _, files in os.walk(extracted_folder):
for file in files:
src_file = os.path.join(root, file)
relative_path = os.path.relpath(src_file, extracted_folder)
dest_file = os.path.abspath(relative_path)
os.makedirs(os.path.dirname(dest_file), exist_ok=True)
shutil.move(src_file, dest_file)
shutil.rmtree(extract_path)
print("Updated!")
def main():
local_version = get_local_version()
if local_version.version is None:
print("Updates disabled.")
return
remote_version = get_remote_version(local_version)
if remote_version is None:
return
if remote_version.version == local_version.version:
print("No updates!")
return
get_update(remote_version)
if __name__ == "__main__":
main()