From e7d164d35515c462b50eda3a9f22f5fafd126ceb Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Fri, 23 Aug 2019 16:44:58 +0200 Subject: [PATCH 01/10] Add files via upload --- CNIRevelator Documentation.docx | Bin 1439957 -> 1446731 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/CNIRevelator Documentation.docx b/CNIRevelator Documentation.docx index 5ee8079bb477196daa7eb487710e6ba7da2797bc..d361ab2d6a00b24c98d2da5f8ab7e95ead3bd525 100644 GIT binary patch delta 32667 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
  • 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 ZAnQi}KV%>jCg|rQfEjwG0r&;RYxI+(O%x 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 p=YVkK`@p|sC5(vv3kapc1JR Date: Fri, 23 Aug 2019 16:46:25 +0200 Subject: [PATCH 02/10] Add files via upload --- src/critical.py | 33 +++++++++++++++++++++++++-------- src/github.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/globs.py | 2 +- src/ihm.py | 2 -- src/lang.py | 26 ++++++++++++++++---------- src/main.py | 37 +++++++++++++++++++++++-------------- src/mrz.py | 30 ++++++++++++++++++++++++++---- src/updater.py | 4 +++- 8 files changed, 143 insertions(+), 40 deletions(-) create mode 100644 src/github.py diff --git a/src/critical.py b/src/critical.py index 3e6fb08..d04f643 100644 --- a/src/critical.py +++ b/src/critical.py @@ -31,9 +31,10 @@ import traceback import psutil import os -import lang # lang.py -import logger # logger.py -import globs # globs.py +import lang # lang.py +import logger # logger.py +import globs # globs.py +import github # github.py def crashCNIR(shutdown=True): """ @@ -45,13 +46,29 @@ def crashCNIR(shutdown=True): root.withdraw() logfile = logger.logCur logfile.printerr("FATAL ERROR : see traceback below.\n{}".format(traceback.format_exc())) + showerror(lang.all[globs.CNIRlang]["CNIRevelator Fatal Eror"], lang.all[globs.CNIRlang]["CNIRevelator crashed because a fatal error occured. View log for more infos and please open an issue on Github"]) - res = askquestion(lang.all[globs.CNIRlang]["CNIRevelator Fatal Eror"], lang.all[globs.CNIRlang]["Would you like to open the log file ?"]) + + res = askquestion(lang.all[globs.CNIRlang]["CNIRevelator Fatal Eror"], lang.all[globs.CNIRlang]["Would you like to report this bug ?"]) if res == "yes": - webbrowser.open_new(globs.CNIRErrLog) - res = askquestion(lang.all[globs.CNIRlang]["CNIRevelator Fatal Eror"], lang.all[globs.CNIRlang]["Would you like to open an issue on Github to report this bug ?"]) - if res == "yes": - webbrowser.open_new("https://github.com/neox95/CNIRevelator/issues") + # read the log + data = "No log." + try: + with open(globs.CNIRMainLog, 'r') as file: + data = file.read() + except: + pass + + # send it + success = github.reportBug(traceback.format_exc(), data) + + if not success: + res = askquestion(lang.all[globs.CNIRlang]["CNIRevelator Fatal Eror"], lang.all[globs.CNIRlang]["Would you like to open the log file ?"]) + if res == "yes": + webbrowser.open_new(globs.CNIRErrLog) + else: + showinfo(lang.all[globs.CNIRlang]["CNIRevelator Fatal Eror"], lang.all[globs.CNIRlang]["Bug reported successfully. Thanks."]) + root.destroy() # Quit ? diff --git a/src/github.py b/src/github.py new file mode 100644 index 0000000..47c4730 --- /dev/null +++ b/src/github.py @@ -0,0 +1,49 @@ +# -*- coding: utf8 -*- +""" +******************************************************************************** +* CNIRevelator * +* * +* Desc: Github Stuff for CNIRevelator * +* * +* Copyright © 2018-2019 Adrien Bourmault (neox95) * +* * +* This file is part of CNIRevelator. * +* * +* CNIRevelator is free software: you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation, either version 3 of the License, or * +* any later version. * +* * +* CNIRevelator is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY*without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with CNIRevelator. If not, see . * +******************************************************************************** +""" +from requests.auth import HTTPProxyAuth +from pypac import PACSession +from requests import Session +import json + +credentials = False + +def reportBug(reason="",log=""): + + if not credentials: + return False + + session = credentials.sessionHandler + + payload = {'title':"CNIRevelator Bug Report", 'body':"**An error has been reported by a CNIRevelator instance.**\n\n**Here is the full reason of this issue:**\n{}\n\n**The full log is here:** {}".format(reason, log), "assignees":["neox95"], "labels":["bug", "AUTO"]} + + handler = session.post('https://api.github.com/repos/neox95/cnirevelator/issues', headers={'Authorization': 'token %s' % "1a3c589eafc2b6557a1da852a3b2cc279bd5bf33"}, data=json.dumps(payload)) + + if handler.reason == "Created": + return True + else: + return False + + diff --git a/src/globs.py b/src/globs.py index a0e031f..742343e 100644 --- a/src/globs.py +++ b/src/globs.py @@ -27,7 +27,7 @@ import os # CNIRevelator version verType = "final release" -version = [3, 1, 2] +version = [3, 1, 3] verstring_full = "{}.{}.{} {}".format(version[0], version[1], version[2], verType) verstring = "{}.{}".format(version[0], version[1]) diff --git a/src/ihm.py b/src/ihm.py index 672233f..ca5e68a 100644 --- a/src/ihm.py +++ b/src/ihm.py @@ -296,8 +296,6 @@ class LauncherWindow(Tk): # if getattr(sys, 'frozen', False): # cv_img = cv2.imread(sys._MEIPASS + r"\background.png\background.png") # else: - cv_img = cv2.imread("background.png") - cv_img = cv2.imread("background.png") cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB) cv_img = cv2.blur(cv_img, (15, 15)) diff --git a/src/lang.py b/src/lang.py index 6706883..66505a7 100644 --- a/src/lang.py +++ b/src/lang.py @@ -51,11 +51,13 @@ french = \ "CNIRevelator crashed because a " "fatal error occured. View log for " "more infos and please open " -"an issue on Github" : "CNIRevelator s'est arrêté car une erreur fatale s'est produite. Consultez le journal pour plus d'informations et ouvrez s'il vous plaît un ticket sur Github.", +"an issue on Github" : "CNIRevelator s'est arrêté car une erreur fatale s'est produite. Consultez le journal pour plus d'informations et signalez le bogue.", "Would you like to open the " -"log file ?" : "Souhaitez-vous ouvrir le fichier de log ?", -"Would you like to open an issue " -"on Github to report this bug ?" : "Souhaitez-vous ouvrir un ticket sur Github pour signaler ce bogue?", +"log file ?" : "Le signalement a échoué. Souhaitez-vous ouvrir le fichier de log ?", +"Bug reported successfully. " +"Thanks." : "Bogue signalé avec succès, merci.", +"Would you like to report this " +"bug ?" : "Souhaitez-vous signaler ce bogue?", "Starting..." : "Lancement...", "Informations about the current " "document" : "Informations sur la pièce d'identité", @@ -139,7 +141,8 @@ french = \ "Coller :\t\t\t\tCtrl-V \n" "Forcer une nouvelle détection du document :\tEchap\n", -"CHANGELOG" : "Version 3.1.2 \nMise-à-jour mineure avec les progressions suivantes :\n- Montée de version de Tesseract OCR : 5.0\n- Correction de noms des documents\n- Résolution d'un problème avec le système de mise-à-jour\n- Amélioration des effets sur images\n\n" + \ +"CHANGELOG" : "Version 3.1.3 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug de la détection automatique de documents\n- Ajout d'une fonctionnalité de rapport d'erreur\n\n" + \ +"Version 3.1.2 \nMise-à-jour mineure avec les progressions suivantes :\n- Montée de version de Tesseract OCR : 5.0\n- Correction de noms des documents\n- Résolution d'un problème avec le système de mise-à-jour\n- Amélioration des effets sur images\n\n" + \ "Version 3.1.1 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug sévère du système de mise à jour\n\n" + \ "Version 3.1.0 \nMise-à-jour majeure avec les progressions suivantes :\n- Modifications cosmétiques de l'interface utilisateur\n- Stabilisation des changements effectués sur la version mineure 3.0 : interface utilisateur, OCR, VISA A et B, logging\n- Rationalisation du système de langues\n- Ajout des canaux de mise-à-jour\n\n" + \ "Version 3.0.8 finale\nCorrectif : bug du système de mise-à-jour'\n\n" + \ @@ -751,11 +754,13 @@ english = \ "CNIRevelator crashed because a " "fatal error occured. View log for " "more infos and please open " -"an issue on Github" : "CNIRevelator crashed because a fatal error occured. View log for more infos and please open an issue on Github", -"Would you like to open an issue " -"on Github to report this bug ?" : "Would you like to open an issue on Github to report this bug ?", +"an issue on Github" : "CNIRevelator crashed because a fatal error occured. View log for more infos and please report this bug.", +"Would you like to report this " +"bug ?" : "Would you like to report this bug ?", "Would you like to open the " -"log file ?" : "Would you like to open the log file ?", +"log file ?" : "Reporting the bug has failed. Would you like to open the log file ?", +"Bug reported successfully. " +"Thanks." : "Bug reported successfully. Thanks.", "Starting..." : "Starting...", "Informations about the current " "document" : "Informations about the current document", @@ -841,7 +846,8 @@ english = \ "Paste:\t\t\t\tCtrl-V\n" "Force a new document detection:\tEchap\n", -"CHANGELOG" : "Version 3.1.2 \nMinor update with the following progressions: \n- Tesseract OCR version upgrade : 5.0\n- Correction of document names\n- Fixed a problem with the update system\n- Some enhancements about effects on images\n\n" + \ +"CHANGELOG" : "Version 3.1.3 \nMinor update with the following progressions:\n- Correction of a bug affecting automated document detection\n- Added bug reporting functionnality\n\n" + \ +"Version 3.1.2 \nMinor update with the following progressions: \n- Tesseract OCR version upgrade : 5.0\n- Correction of document names\n- Fixed a problem with the update system\n- Some enhancements about effects on images\n\n" + \ "Version 3.1.1 \nMinor update with the following progressions: \n- Fixed a severe bug in the update system\n\n" + \ "Version 3.1.0 \nMajor update with the following progressions: \n- Cosmetic modifications of the user interface \n- Stabilization of the changes made on the minor version 3.0 : user interface, OCR, VISA A and B, logging\n- Rationalization of the language system\n- Added update channels\n\n" + \ "Version 3.0.8 final\nCorrection: bug in the update system'\n\n" + \ diff --git a/src/main.py b/src/main.py index cd4ea93..0274f76 100644 --- a/src/main.py +++ b/src/main.py @@ -311,9 +311,9 @@ class mainWindow(Tk): self.speed731.grid_columnconfigure(9, weight=1) self.speed731.grid_rowconfigure(0, weight=1) self.speed731text = Entry(self.speed731, font='Terminal 14') - self.speed731text.grid(column=0, row=0, sticky='NEW', padx=5, pady=5) + self.speed731text.grid(column=0, row=0, columnspan=7, sticky='NEW', padx=5, pady=5) self.speedResult = Text((self.speed731), state='disabled', width=1, height=1, wrap='none', font='Terminal 14') - self.speedResult.grid(column=2, row=0, sticky='NEW', padx=5, pady=5) + self.speedResult.grid(column=7, row=0, sticky='NEW', padx=5, pady=5) # The monitor that indicates some useful infos self.monitor = ttk.Labelframe(self, text=lang.all[globs.CNIRlang]["Monitor"]) @@ -384,7 +384,7 @@ class mainWindow(Tk): self.imageViewer.pagenumber = 0 # Some bindings - self.termtext.bind('', self.entryValidation) + self.bind('', self.entryValidation) self.termtext.bind('<>', self.pasteValidation) self.speed731text.bind('', self.speedValidation) self.imageViewer.ZONE.bind("", self.rectangleSelectScan) @@ -478,7 +478,7 @@ class mainWindow(Tk): self.termtext.insert("1.0", self.mrzChar) self.mrzChar = self.mrzChar + char - self.stringValidation("") + self.stringValidation(isFull=True) #print(self.mrzChar) # Reinstall tesseract @@ -497,7 +497,7 @@ class mainWindow(Tk): ## Regex and document detection + control related functions - def stringValidation(self, keysym): + def stringValidation(self, keysym="", isFull=False): """ Analysis of the already typed document """ @@ -505,7 +505,7 @@ class mainWindow(Tk): # If we must decide the type of the document if not self.mrzDecided: # Get the candidates - candidates = mrz.allDocMatch(self.mrzChar.split("\n")) + candidates = mrz.allDocMatch(self.mrzChar.split("\n"), final=isFull) if len(candidates) == 2 and len(self.mrzChar) >= 8: # Parameters for the choice invite @@ -545,10 +545,13 @@ class mainWindow(Tk): self.termtext.insert("1.0", self.mrzChar) # stop when limit reached elif (len(self.mrzChar) - 3 >= 2 * len(self.mrzDecided[0][0])): - self.mrzChar = self.termtext.get("1.0", "end")[:-1] - self.termtext.delete("1.0","end") - self.termtext.insert("1.0", self.mrzChar[:-1]) - self.termtext.mark_set(INSERT, curPos) + i = len(self.mrzChar) - 3 + while i >= 2 * len(self.mrzDecided[0][0]): + i-=1 + self.mrzChar = self.termtext.get("1.0", "end")[:-1] + self.termtext.delete("1.0","end") + self.termtext.insert("1.0", self.mrzChar[:-1]) + self.termtext.mark_set(INSERT, curPos) # compute the control sum if needed self.computeSigma() @@ -720,9 +723,14 @@ class mainWindow(Tk): if key in ["CODE", "CTRL", "CTRLF"]: continue if not docInfos[key] == False: - self.infoList[key]['text'] = docInfos[key] - self.infoList[key]['background'] = self['background'] - self.infoList[key]['foreground'] = "black" + if not docInfos[key] == "": + self.infoList[key]['text'] = docInfos[key] + self.infoList[key]['background'] = self['background'] + self.infoList[key]['foreground'] = "black" + else: + self.infoList[key]['text'] = lang.all[globs.CNIRlang]["Unknown"] + self.infoList[key]['background'] = self['background'] + self.infoList[key]['foreground'] = "black" else: self.infoList[key]['background'] = "red" self.infoList[key]['foreground'] = "white" @@ -789,6 +797,7 @@ class mainWindow(Tk): """ Open the scan, ask its path and displays it """ + self.initialize() path = '' path = filedialog.askopenfilename(parent=self, title=lang.all[globs.CNIRlang]["Open a scan of document..."], filetypes=(('TIF files', '*.tif'), ('TIF files', '*.tiff'), @@ -806,7 +815,7 @@ class mainWindow(Tk): and path[-4:] != 'jpeg' and path[-4:] != 'tiff' ) or not os.path.isfile(path): showerror(lang.all[globs.CNIRlang]["Open a scan of document..."], lang.all[globs.CNIRlang]["The file you provided is not valid : {}"].format(path)) - return + return # Load an image using OpenCV self.imageViewer.imagePath = path diff --git a/src/mrz.py b/src/mrz.py index 190b5b4..a2013d4 100644 --- a/src/mrz.py +++ b/src/mrz.py @@ -151,7 +151,7 @@ VA = [ { "1": ["2", "CODE", "V."], "2": ["3", "PAYS", "[A-Z]+"], - "3": ["39", "NOM", "[A-Z]+"], + "3": ["39", "NOM", "([A-Z]|<)+"], "4": ["9", "NO", ".+"], "5": ["1", "CTRL", "[0-9]","4"], "6": ["3", "NAT", "[A-Z]+"], @@ -342,7 +342,7 @@ def docMatch(doc, strs): # logfile.printdbg(" REGEX : {}, match : {}".format(regex, matching)) # exit the loop - #logfile.printdbg("{} level : {}/{} (+{})".format(doc[2], level, nchar, bonus)) + logfile.printdbg("{} level : {}/{} (+{})".format(doc[2], level, nchar, bonus)) return (level, nchar, bonus) def allDocMatch(strs, final=False): @@ -368,14 +368,25 @@ def allDocMatch(strs, final=False): candidate = SCORES.index(max(SCORES)) candidates = [] canditxt = [] + # Search the candidates for i in range(len(SCORES)): if SCORES[i] == SCORES[candidate]: candidates += [TYPES[i]] canditxt += [TYPES[i][2]] + # Continue searching + if len(candidates) < 2: + tempRemovedCandidate = SCORES.pop(candidate) + if (SCORES.index(max(SCORES)) != candidate) and (max(SCORES) >= tempRemovedCandidate - 20): + if SCORES.index(max(SCORES)) < candidate: + candidates += [ TYPES[SCORES.index(max(SCORES))] ] + else: + candidates += [ TYPES[SCORES.index(max(SCORES)) + 1] ] + SCORES.insert(candidate, tempRemovedCandidate) + # Return the candidates - #logfile.printdbg("Scores : {}".format(SCORES)) - #logfile.printdbg("Candidates : {}".format(canditxt)) + logfile.printdbg("Scores : {}".format(SCORES)) + logfile.printdbg("Candidates : {}".format(canditxt)) return candidates def computeControlSum(code): @@ -413,6 +424,11 @@ def computeAllControlSum(doc, code): # iteration on each char of the given MRZ for charPos in range(len(code)): + + # Sanity check + if len(getDocString(doc)) <= charPos: + break + field = getDocString(doc)[charPos] if doc[1][field][1] == "CTRL": @@ -421,6 +437,12 @@ def computeAllControlSum(doc, code): codeChain = "" # iteration on the fields to control for pos in range(len(code)): + + #print("Len : {}, pos : {}".format(len(getDocString(doc)), pos)) + # Sanity check + if len(getDocString(doc)) <= pos: + break + target = getDocString(doc)[pos] if target in doc[1][field][3]: #print("__field : {} {} {} {}".format(target, pos, field, doc[1][field][3])) diff --git a/src/updater.py b/src/updater.py index 54e08ae..4f69f94 100644 --- a/src/updater.py +++ b/src/updater.py @@ -38,6 +38,7 @@ import subprocess import psutil import critical # critical.py +import github # github.py import ihm # ihm.py import logger # logger.py import globs # globs.py @@ -316,7 +317,6 @@ def umain(): # Global Handlers logfile = logger.logCur - credentials = downloader.newcredentials() if not credentials.valid: @@ -325,6 +325,8 @@ def umain(): time.sleep(2) launcherWindow.exit() return 0 + + github.credentials = credentials # Cleaner for the old version if detected if len(sys.argv) > 2 and str(sys.argv[1]) == "DELETE": From 2dee9b79cfdb25199f86d466e2632aceb3d52c39 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Fri, 23 Aug 2019 16:57:18 +0200 Subject: [PATCH 03/10] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index 2f449bd..3d42c18 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ # ver|url|checksum, and | as separator, one version per || -3.1.2|https://github.com/neox95/CNIRevelator/releases/download/3.1.2d/CNIRevelator.zip|8ed839f59ac63994fab1a5ceefbe183f04e89162|| +3.1.3|https://github.com/neox95/CNIRevelator/releases/download/3.1.3c/CNIRevelator.zip|1f4a9988283462634f660784ce4a89ea209861d4|| From fe940585ac2f64cd1e0b8ce8031726c59bd7bbd2 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 09:43:41 +0200 Subject: [PATCH 04/10] Added version.res in the buildchain --- make.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/make.bat b/make.bat index 5d6414b..8a8167a 100644 --- a/make.bat +++ b/make.bat @@ -4,9 +4,9 @@ title Compilation de CNIRevelator -call pyinstaller -w -D --exclude-module PyQt5 --bootloader-ignore-signals --add-data "C:\Users\adrie\Anaconda3\Lib\site-packages\tld\res\effective_tld_names.dat.txt";"tld\res" --add-data "src\id-card.ico";"id-card.ico" -i "src\id-card.ico" -n CNIRevelator src\CNIRevelator.py - +call pyinstaller -w -D --exclude-module PyQt5 --bootloader-ignore-signals --add-data "C:\Users\pf04950\AppData\Local\Continuum\anaconda3\Lib\site-packages\tld\res\effective_tld_names.dat.txt";"tld\res" --add-data "src\id-card.ico";"id-card.ico" -i "src\id-card.ico" -n CNIRevelator src\CNIRevelator.py +call pyi-set_version "src\version.res" "dist\CNIRevelator\CNIRevelator.exe" copy LICENSE dist\CNIRevelator\LICENSE copy src\id-card.ico dist\CNIRevelator\id-card.ico From c7fb8d4c4b158d59c2b1611971b475db77136bfa Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 09:45:03 +0200 Subject: [PATCH 05/10] Patching 3.1.3 --- src/version.res | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/version.res diff --git a/src/version.res b/src/version.res new file mode 100644 index 0000000..43adb08 --- /dev/null +++ b/src/version.res @@ -0,0 +1,43 @@ +# UTF-8 +# +# For more details about fixed file info 'ffi' see: +# http://msdn.microsoft.com/en-us/library/ms646997.aspx +VSVersionInfo( + ffi=FixedFileInfo( +# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) +# Set not needed items to zero 0. +filevers=(3, 1, 3, 0), +prodvers=(3, 1, 3, 0), +# Contains a bitmask that specifies the valid bits 'flags'r +mask=0x3f, +# Contains a bitmask that specifies the Boolean attributes of the file. +flags=0x0, +# The operating system for which this file was designed. +# 0x4 - NT and there is no need to change it. +OS=0x4, +# The general type of file. +# 0x1 - the file is an application. +fileType=0x1, +# The function of the file. +# 0x0 - the function is not defined for this fileType +subtype=0x0, +# Creation date and time stamp. +date=(0, 0) +), + kids=[ +StringFileInfo( + [ + StringTable( + u'040904B0', + [StringStruct(u'CompanyName', u'Adrien Bourmault (neox95)'), + StringStruct(u'FileDescription', u'This file is part of CNIRevelator.'), + StringStruct(u'FileVersion', u'3.1.3'), + StringStruct(u'InternalName', u'CNIRevelator'), + StringStruct(u'LegalCopyright', u'Copyright (c) Adrien Bourmault (neox95)'), + StringStruct(u'OriginalFilename', u'CNIRevelator.exe'), + StringStruct(u'ProductName', u'CNIRevelator 3'), + StringStruct(u'ProductVersion', u'3.1.3')]) + ]), +VarFileInfo([VarStruct(u'Translation', [1033, 1200])]) + ] +) \ No newline at end of file From 46b7eb8c2618e1f1775bd027772b3e9e763d138c Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 09:47:52 +0200 Subject: [PATCH 06/10] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index 3d42c18..81ff3f9 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ # ver|url|checksum, and | as separator, one version per || -3.1.3|https://github.com/neox95/CNIRevelator/releases/download/3.1.3c/CNIRevelator.zip|1f4a9988283462634f660784ce4a89ea209861d4|| +3.1.3|https://github.com/neox95/CNIRevelator/releases/download/3.1.3d/CNIRevelator.zip|bf065e68b248244980a20e0d13e58fdf40815793|| From 3110872310bb783ef2bff548d7cbc3a20cea0cb1 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 10:00:46 +0200 Subject: [PATCH 07/10] Added version.res --- make.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/make.bat b/make.bat index 8a8167a..2f31cc6 100644 --- a/make.bat +++ b/make.bat @@ -4,9 +4,9 @@ title Compilation de CNIRevelator -call pyinstaller -w -D --exclude-module PyQt5 --bootloader-ignore-signals --add-data "C:\Users\pf04950\AppData\Local\Continuum\anaconda3\Lib\site-packages\tld\res\effective_tld_names.dat.txt";"tld\res" --add-data "src\id-card.ico";"id-card.ico" -i "src\id-card.ico" -n CNIRevelator src\CNIRevelator.py +call pyinstaller -w -D --exclude-module PyQt5 --bootloader-ignore-signals --add-data "C:\Users\pf04950\AppData\Local\Continuum\anaconda3\Lib\site-packages\tld\res\effective_tld_names.dat.txt";"tld\res" --add-data "src\id-card.ico";"id-card.ico" -i "src\id-card.ico" --version-file "src\version.res" -n CNIRevelator src\CNIRevelator.py -call pyi-set_version "src\version.res" "dist\CNIRevelator\CNIRevelator.exe" +rem call pyi-set_version "src\version.res" "dist\CNIRevelator\CNIRevelator.exe" copy LICENSE dist\CNIRevelator\LICENSE copy src\id-card.ico dist\CNIRevelator\id-card.ico From 43fca393148e24dac00459e3ae5c8cb9b9abc7d6 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 10:02:33 +0200 Subject: [PATCH 08/10] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index 81ff3f9..2d1f27d 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ # ver|url|checksum, and | as separator, one version per || -3.1.3|https://github.com/neox95/CNIRevelator/releases/download/3.1.3d/CNIRevelator.zip|bf065e68b248244980a20e0d13e58fdf40815793|| +3.1.3|https://github.com/neox95/CNIRevelator/releases/download/3.1.3d/CNIRevelator.zip|f42bb2cc8e72aa21caae4ea058ca1603e4153f48|| From 685f7aab5a608c96e152a8205e71cc02b49e1df1 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 10:03:19 +0200 Subject: [PATCH 09/10] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index 2d1f27d..e35302c 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ # ver|url|checksum, and | as separator, one version per || -3.1.3|https://github.com/neox95/CNIRevelator/releases/download/3.1.3d/CNIRevelator.zip|f42bb2cc8e72aa21caae4ea058ca1603e4153f48|| +3.1.3|https://github.com/neox95/CNIRevelator/releases/download/3.1.3e/CNIRevelator.zip|f42bb2cc8e72aa21caae4ea058ca1603e4153f48|| From 9e5712385086f2c9c0d389e126da928ddf35d529 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 10:03:56 +0200 Subject: [PATCH 10/10] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index e35302c..5a70410 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ -# ver|url|checksum, and | as separator, one version per || +# ver|url|checksum, and | as separator, one version per || 3.1.3|https://github.com/neox95/CNIRevelator/releases/download/3.1.3e/CNIRevelator.zip|f42bb2cc8e72aa21caae4ea058ca1603e4153f48||