33from tkinter import messagebox
44import os
55import requests
6- from . import changelogDiag , downloadDiag , legacy
6+ from . import changelogDiag , downloadDiag , warningDiag , legacy
77from vars import *
88from tokenString import *
99import json
1515def 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):
6285def 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
96138def 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 + "\n Do 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 ()
0 commit comments