Skip to content

Commit 72edf3d

Browse files
committed
Merge branch 'Uv1.3' into main
2 parents 4bbd49d + 9e6539f commit 72edf3d

File tree

4 files changed

+110
-17
lines changed

4 files changed

+110
-17
lines changed

src/VexTrack.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
windowSize = vars.WINDOW_GEOMETRY.split("x")
2222
newUpdaterVersion = uCore.checkNewVersion("Updater")
23-
versionString, _ = uCore.getVersionString(vars.APP_NAME)
23+
versionString, _, _ = uCore.getVersionString(vars.APP_NAME)
2424

2525
root = tk.Tk()
2626
root.title(vars.APP_NAME + " " + versionString)

src/updaterLib/core.py

Lines changed: 71 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from tkinter import messagebox
44
import os
55
import requests
6-
from . import changelogDiag, downloadDiag, legacy
6+
from . import changelogDiag, downloadDiag, warningDiag, legacy
77
from vars import *
88
from tokenString import *
99
import json
@@ -15,6 +15,12 @@
1515
def downloadNewVersion(versionString, softwareName, legacyMode):
1616
os.system("taskkill /f /im " + softwareName + ".exe")
1717

18+
with open(softwareName + ".exe", 'rb') as f:
19+
oldExec = f.read()
20+
21+
with open(softwareName + ".exe.bak", 'wb') as f:
22+
f.write(oldExec)
23+
1824
url = "https://github.com/" + GITHUB_USER + "/" + GITHUB_REPO + "/releases/download/" + versionString + "/" + softwareName + ".exe"
1925
r = requests.get(url, stream=True)
2026

@@ -34,8 +40,25 @@ def downloadNewVersion(versionString, softwareName, legacyMode):
3440

3541
downDiag.updateValues(downloaded, total, 0 if cTime == startTime else round(downloaded / (cTime - startTime), 2))
3642

37-
downDiag.destroy()
43+
failed = False
44+
with open(softwareName + ".exe", 'r') as f:
45+
if f.read() == "Not Found": failed = True
46+
47+
if failed:
48+
messagebox.showerror("Update Failed", "Update of " + softwareName + " failed. Reverting to previous version")
49+
50+
with open(softwareName + ".exe.bak", "rb") as f:
51+
oldExec = f.read()
52+
53+
with open(softwareName + ".exe", "wb") as f:
54+
f.write(oldExec)
55+
56+
ignoreVersion(versionString, softwareName, legacyMode)
3857

58+
downDiag.destroy()
59+
os.remove(softwareName + ".exe.bak")
60+
if failed: return
61+
3962
if not legacyMode:
4063
content = []
4164
with open(VERSION_PATH, 'r') as f:
@@ -62,6 +85,7 @@ def restartProgram(softwareName):
6285
def getVersionString(softwareName):
6386
legacyMode = False
6487
newVersion = {}
88+
ignoredVersions = []
6589

6690
if not os.path.exists(VERSION_PATH):
6791
if os.path.exists(OLD_VERSION_PATH):
@@ -76,7 +100,7 @@ def getVersionString(softwareName):
76100
newVersion = {GITHUB_REPO: version[0], "Updater": version[1]}
77101
os.remove(OLD_VERSION_PATH)
78102
else:
79-
newVersion = {GITHUB_REPO: "v1.0", "Updater": "v1.0"}
103+
newVersion = {APP_NAME: "v1.0", "Updater": "v1.0"}
80104

81105
print(legacyMode, newVersion)
82106

@@ -89,15 +113,33 @@ def getVersionString(softwareName):
89113
versionString = f.readlines()[LEGACY_VERSIONS.index(softwareName)]
90114
else:
91115
with open(VERSION_PATH, 'r') as f:
92-
versionString = json.loads(f.read())[softwareName]
116+
versionFile = json.loads(f.read())
117+
versionString = versionFile[softwareName]
118+
119+
if "ignored" in versionFile: ignoredVersions = versionFile["ignored"][softwareName]
120+
121+
return versionString, legacyMode, ignoredVersions
122+
123+
def ignoreVersion(versionString, softwareName, legacyMode):
124+
if legacyMode: return
125+
126+
versionFile = None
127+
with open(VERSION_PATH, 'r') as f:
128+
versionFile = json.loads(f.read())
93129

94-
return versionString, legacyMode
130+
if not "ignored" in versionFile:
131+
versionFile["ignored"] = {APP_NAME: [], "Updater": []}
132+
133+
versionFile["ignored"][softwareName].append(versionString)
134+
135+
with open(VERSION_PATH, 'w') as f:
136+
f.write(json.dumps(versionFile, indent = 4, separators=(',', ': ')))
95137

96138
def checkNewVersion(softwareName):
97139
isNewVersion = False
98140
legacyMode = False
99141

100-
versionString, legacyMode = getVersionString(softwareName)
142+
versionString, legacyMode, ignoredVersions = getVersionString(softwareName)
101143
versionNumber = versionString.split("v")[1]
102144

103145
response = requests.get("https://api.github.com/repos/" + GITHUB_USER + "/" + GITHUB_REPO + "/releases", headers={"Authorization": TOKEN})
@@ -114,24 +156,38 @@ def checkNewVersion(softwareName):
114156
latestVersionString = tokenized[1]
115157
latestVersionNumber = latestVersionString.split("v")[1]
116158

117-
if versionNumber > latestVersionNumber:
118-
break
159+
if latestVersionString in ignoredVersions: break
160+
if versionNumber > latestVersionNumber: break
119161

120162
if versionNumber < latestVersionNumber:
121163
res = messagebox.askquestion("Updater", "A new version of " + softwareName + " is available: " + latestVersionString + "\nDo you want to update?")
122-
if res == "yes":
123-
downloadNewVersion(latestVersionString, softwareName, legacyMode)
124164

125-
changelogRaw = r["body"].split("##")[1].split("\r\n")
165+
if res == "yes":
166+
warnings = []
126167
changelog = []
127-
for c in changelogRaw[1:]:
128-
if c != "": changelog.append(c)
129168

169+
descRaw = r["body"].split("##")
170+
for d in descRaw:
171+
splitDRaw = d.split("\r\n")
172+
splitD = [x for x in splitDRaw if x != ""]
173+
174+
if len(splitD) < 2: continue
175+
176+
if "Changelog" in splitD[0]: changelog = splitD[1:]
177+
if "Warning" in splitD[0]: warnings = splitD[1:]
178+
179+
if r["prerelease"]: warnings.append("- This release is a pre-release")
180+
181+
warningDiagInstance = warningDiag.WarningDiag(root, "Warnings", warnings)
182+
if warningDiagInstance.response == "no":
183+
ignoreVersion(latestVersionString, softwareName, legacyMode)
184+
break
185+
186+
downloadNewVersion(latestVersionString, softwareName, legacyMode)
130187
changelogDiag.ChangelogDiag(root, "Changelog", changelog)
131-
132188
isNewVersion = True
133-
134189
restartProgram(softwareName)
190+
else: ignoreVersion(latestVersionString, softwareName, legacyMode)
135191
break
136192

137193
root.destroy()

src/updaterLib/warningDiag.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from tkinter import *
2+
from tkinter import simpledialog, messagebox, ttk
3+
4+
class WarningDiag(simpledialog.Dialog):
5+
def __init__(self, parent, title, warnings):
6+
self.warnings = warnings
7+
self.response = "no"
8+
super().__init__(parent, title)
9+
10+
def body(self, frame):
11+
self.iconbitmap("Updater.exe")
12+
13+
ttk.Label(frame, text="This update has the following warnings:").grid(padx=8, pady=4, column=0, row=0, sticky="w")
14+
15+
self.warningsBox = Listbox(frame, width=64)
16+
self.warningsBox.grid(padx=8, pady=2, column=0, row=1, sticky="nswe")
17+
for i in range(0, len(self.warnings)):
18+
self.warningsBox.insert(i, self.warnings[i])
19+
20+
ttk.Label(frame, text="Are you sure you want to update?").grid(padx=8, pady=4, column=0, row=2, sticky="w")
21+
22+
scrollbar = ttk.Scrollbar(frame, orient="vertical", command=self.warningsBox.yview)
23+
scrollbar.grid(column=1, row=1, sticky="nswe")
24+
25+
return frame
26+
27+
def giveResponse(self, response):
28+
self.response = response
29+
self.destroy()
30+
31+
def buttonbox(self):
32+
self.noButton = ttk.Button(self, text='No', command=lambda: self.giveResponse("no"))
33+
self.noButton.pack(padx=8, pady=8, side=RIGHT)
34+
self.yesButton = ttk.Button(self, text='Yes', command=lambda: self.giveResponse("yes"))
35+
self.yesButton.pack(padx=8, pady=8, side=RIGHT)
36+
self.bind("<Return>", lambda event: self.giveResponse("yes"))
37+
self.bind("<Escape>", lambda event: self.giveResponse("no"))

version.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
22
"VexTrack": "v1.5",
3-
"Updater": "v1.21"
3+
"Updater": "v1.3"
44
}

0 commit comments

Comments
 (0)