diff -Nru lcurse-0.2+git20160802/console.py lcurse-0.2+git20160824/console.py --- lcurse-0.2+git20160802/console.py 1970-01-01 00:00:00.000000000 +0000 +++ lcurse-0.2+git20160824/console.py 2016-08-23 10:07:57.000000000 +0000 @@ -0,0 +1,88 @@ +import os +import sys +import json +from PyQt5 import Qt + +rootDir = os.path.dirname(os.path.realpath(__file__)) +modulesDir = "{}/modules".format(rootDir) +appTranslationFile = "{}/translations/{}.qm".format(rootDir, Qt.QLocale.system().name()) + +sys.path.insert(0, modulesDir) + +from modules import waitdlg, defines +from _thread import start_new_thread + +def loadAddons(addonsFile): + addons = None + if os.path.exists(addonsFile): + with open(addonsFile) as f: + addons = json.load(f) + return addons + +def saveAddons(addonsFile, addons): + with open(addonsFile, "w") as f: + json.dump(addons, f) + +class CheckConsole(Qt.QApplication): + def __init__(self, argv, addons): + super(Qt.QApplication, self).__init__(argv) + settings = Qt.QSettings() + self.maxThreads = int(settings.value(defines.LCURSE_MAXTHREADS_KEY, defines.LCURSE_MAXTHREADS_DEFAULT)) + self.sem = Qt.QSemaphore(self.maxThreads) + self.addons = addons + + @Qt.pyqtSlot(Qt.QVariant, bool) + def onUpdateFinished(self, addon, result): + self.sem.release() + self.threadsCount -= 1 + print("Addon '{}' updated: {}".format(addon[1], result and "successfully" or "failed")) + if result: + # addon[0] == idx, addon[5] == data from check, addon[5][0] new version + self.addons[addon[0]]["version"] = addon[5][0] # replace old version with new version in addon + if self.threadsCount <= 0: + saveAddons(os.path.expanduser(defines.LCURSE_ADDONS), self.addons) + self.quit() + + @Qt.pyqtSlot(Qt.QVariant, bool, Qt.QVariant) + def onCheckFinished(self, addon, needsUpdate, updateData): + self.sem.release() + if not needsUpdate: + print("Addon '{}' is up to date.".format(addon[1])) + self.threadsCount -= 1 + else: + self.sem.acquire() + print("Addon '{}' needs update. New Version: {}".format(addon[1], updateData[0])) + addon.append(updateData) + thread = waitdlg.UpdateWorker(addon) + thread.updateFinished.connect(self.onUpdateFinished) + thread.start() + self.threads.append(thread) + + if self.threadsCount <= 0: + saveAddons(os.path.expanduser(defines.LCURSE_ADDONS), self.addons) + self.quit() + + def startWorkerThreads(self): + self.threads = [] + self.threadsCount = len(self.addons) + i = 0 + for i in range(len(self.addons)): + addon = self.addons[i] + self.sem.acquire() + thread = waitdlg.CheckWorker([i, addon["name"], addon["uri"], addon["version"], addon["allowbeta"]]) + thread.checkFinished.connect(self.onCheckFinished) + thread.start() + self.threads.append(thread) + + def exec_(self): + print("checking all addons. please wait ...") + start_new_thread(self.startWorkerThreads, ()) + return super(Qt.QApplication, self).exec_() + +Qt.QCoreApplication.setApplicationName("lcurse") +Qt.QCoreApplication.setOrganizationName("None-Inc.") + +check = CheckConsole(sys.argv, loadAddons(os.path.expanduser(defines.LCURSE_ADDONS))) +ret = check.exec_() +print("Done. Bye Bye!") +sys.exit(ret) diff -Nru lcurse-0.2+git20160802/debian/changelog lcurse-0.2+git20160824/debian/changelog --- lcurse-0.2+git20160802/debian/changelog 2016-08-02 12:48:55.000000000 +0000 +++ lcurse-0.2+git20160824/debian/changelog 2016-08-24 09:55:02.000000000 +0000 @@ -1,3 +1,16 @@ +lcurse (0.2+git20160824-0~webupd8~0) xenial; urgency=medium + + * New Git pull + + -- Alin Andrei Wed, 24 Aug 2016 12:54:46 +0200 + +lcurse (0.2+git20160823-0~webupd8~3) xenial; urgency=medium + + * New Git pull + * Install console version files + + -- Alin Andrei Tue, 23 Aug 2016 13:17:44 +0200 + lcurse (0.2+git20160802-0~webupd8~1) xenial; urgency=medium * New Git pull diff -Nru lcurse-0.2+git20160802/debian/install lcurse-0.2+git20160824/debian/install --- lcurse-0.2+git20160802/debian/install 2015-03-23 13:09:53.000000000 +0000 +++ lcurse-0.2+git20160824/debian/install 2016-08-23 16:08:52.000000000 +0000 @@ -1,4 +1,7 @@ lcurse opt/lcurse/ +console.py opt/lcurse/ modules opt/lcurse/ translations opt/lcurse/ +README.md opt/lcurse/ debian/lcurse.desktop usr/share/applications/ +debian/lcurse-cli usr/bin/ diff -Nru lcurse-0.2+git20160802/debian/lcurse-cli lcurse-0.2+git20160824/debian/lcurse-cli --- lcurse-0.2+git20160802/debian/lcurse-cli 1970-01-01 00:00:00.000000000 +0000 +++ lcurse-0.2+git20160824/debian/lcurse-cli 2016-08-23 15:16:46.000000000 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +python3 /opt/lcurse/console.py "$@" diff -Nru lcurse-0.2+git20160802/debian/links lcurse-0.2+git20160824/debian/links --- lcurse-0.2+git20160802/debian/links 2015-03-23 13:15:52.000000000 +0000 +++ lcurse-0.2+git20160824/debian/links 2016-08-23 15:15:49.000000000 +0000 @@ -1 +1 @@ -opt/lcurse/lcurse usr/bin/lcurse +/opt/lcurse/lcurse usr/bin/lcurse diff -Nru lcurse-0.2+git20160802/debian/rules lcurse-0.2+git20160824/debian/rules --- lcurse-0.2+git20160802/debian/rules 2015-01-28 11:25:40.000000000 +0000 +++ lcurse-0.2+git20160824/debian/rules 2016-08-23 10:17:41.000000000 +0000 @@ -7,3 +7,5 @@ override_dh_auto_install: dh_auto_install install -Dm 644 $(CURDIR)/media/icon.png $(CURDIR)/debian/lcurse/usr/share/icons/hicolor/32x32/apps/lcurse.png + chmod 755 console.py + chmod 755 lcurse diff -Nru lcurse-0.2+git20160802/modules/application.py lcurse-0.2+git20160824/modules/application.py --- lcurse-0.2+git20160802/modules/application.py 2016-08-02 09:10:23.000000000 +0000 +++ lcurse-0.2+git20160824/modules/application.py 2016-08-24 09:54:30.000000000 +0000 @@ -5,6 +5,7 @@ import json import os import re +from shutil import rmtree from urllib.parse import urlparse import urllib from urllib.request import build_opener, HTTPCookieProcessor, HTTPError @@ -349,7 +350,62 @@ str(self.addonList.item(row, 0).text())), Qt.QMessageBox.Yes, Qt.QMessageBox.No) if answer == Qt.QMessageBox.Yes: + settings = Qt.QSettings() + parent = "{}/Interface/AddOns".format(str(settings.value(defines.WOW_FOLDER_KEY, defines.WOW_FOLDER_DEFAULT))) + contents = os.listdir(parent) + addonName = str(self.addonList.item(row, 0).text()) + deleted = False + deleted_addons = [] + potential_deletions = [] + for item in contents: + itemDir = "{}/{}".format(parent, item) + if os.path.isdir(itemDir) and not item.lower().startswith("blizzard_"): + toc = "{}/{}.toc".format(itemDir, item) + if os.path.exists(toc): + tmp = self.extractAddonMetadataFromTOC(toc) + if tmp[0] == addonName: + rmtree(itemDir) + deleted_addons.append(item) + deleted = True + self.addonList.removeRow(row) + + if not deleted: + Qt.QMessageBox.question(self, "No addons removed", + str(self.tr("No addons matching \"{}\" found.\nThe addon might already be removed, or could be going under a different name.\nManual deletion may be required.")).format(addonName), + Qt.QMessageBox.Ok) + else: + potential = False + for item in contents: + itemDir = "{}/{}".format(parent, item) + if os.path.isdir(itemDir) and not item.lower().startswith("blizzard_"): + toc = "{}/{}.toc".format(itemDir, item) + if os.path.exists(toc): + tmp = self.extractAddonMetadataFromTOC(toc) + for d in deleted_addons: + deletions = list(filter(None, re.split("[_, \-!?:]+", d))) + for word in deletions: + if re.search(word, tmp[0]) != None: + potential_deletions.append(item) + potential = True + break + if potential: + break + if potential: + to_delete = '\n'.join(potential_deletions) + removal = Qt.QMessageBox.question(self, "Potential deletion candidates found", + str(self.tr("Remove the following addons as well?\n{}")).format(to_delete), + Qt.QMessageBox.Yes, Qt.QMessageBox.No) + if removal == Qt.QMessageBox.Yes: + for p in potential_deletions: + all_rows = self.addonList.rowCount() + for n in range(0, all_rows): + name = str(self.addonList.item(n, 0).text()) + if p == name: + self.addonList.removeRow(n) + break + rmtree("{}/{}".format(parent, p)) + self.saveAddons() def setRowColor(self, row, color): Binary files /tmp/tmp04tEgD/IJQRvvXLwo/lcurse-0.2+git20160802/modules/__init__.pyc and /tmp/tmp04tEgD/ecEDE1xXfU/lcurse-0.2+git20160824/modules/__init__.pyc differ Binary files /tmp/tmp04tEgD/IJQRvvXLwo/lcurse-0.2+git20160802/modules/__pycache__/defines.cpython-35.pyc and /tmp/tmp04tEgD/ecEDE1xXfU/lcurse-0.2+git20160824/modules/__pycache__/defines.cpython-35.pyc differ Binary files /tmp/tmp04tEgD/IJQRvvXLwo/lcurse-0.2+git20160802/modules/__pycache__/__init__.cpython-35.pyc and /tmp/tmp04tEgD/ecEDE1xXfU/lcurse-0.2+git20160824/modules/__pycache__/__init__.cpython-35.pyc differ Binary files /tmp/tmp04tEgD/IJQRvvXLwo/lcurse-0.2+git20160802/modules/__pycache__/waitdlg.cpython-35.pyc and /tmp/tmp04tEgD/ecEDE1xXfU/lcurse-0.2+git20160824/modules/__pycache__/waitdlg.cpython-35.pyc differ diff -Nru lcurse-0.2+git20160802/modules/waitdlg.py lcurse-0.2+git20160824/modules/waitdlg.py --- lcurse-0.2+git20160802/modules/waitdlg.py 2016-08-02 09:10:23.000000000 +0000 +++ lcurse-0.2+git20160824/modules/waitdlg.py 2016-08-23 10:07:57.000000000 +0000 @@ -18,7 +18,6 @@ def OpenWithRetry(url): - print('Opening {}'.format(url)) count = 0 maxcount = 5 @@ -257,8 +256,6 @@ def doUpdateCurse(self): try: settings = Qt.QSettings() - print("updating addon {} to version {} ...".format(self.addon[1], self.addon[5][0])) - print("getting new version from: {}".format(self.addon[5][1])) response = OpenWithRetry(self.addon[5][1]) filename = "/tmp/{}".format(self.addon[5][1].split('/')[-1]) dest = "{}/Interface/AddOns/".format(settings.value(defines.WOW_FOLDER_KEY, defines.WOW_FOLDER_DEFAULT)) Binary files /tmp/tmp04tEgD/IJQRvvXLwo/lcurse-0.2+git20160802/modules/waitdlg.pyc and /tmp/tmp04tEgD/ecEDE1xXfU/lcurse-0.2+git20160824/modules/waitdlg.pyc differ diff -Nru lcurse-0.2+git20160802/README.md lcurse-0.2+git20160824/README.md --- lcurse-0.2+git20160802/README.md 2016-03-21 11:23:31.000000000 +0000 +++ lcurse-0.2+git20160824/README.md 2016-08-23 10:07:57.000000000 +0000 @@ -8,3 +8,9 @@ As git repos aren't structured the same, you will most probably need to create an link via "ln -s source destination" inside the wow/Interface/Addons folder. But at least the update is then done via the usuall lcurse way. +### Requirements +* bs4 +* lxml +* PyQt5 + +All requirements can be installed with `pip install -r requirements.txt` diff -Nru lcurse-0.2+git20160802/requirements.txt lcurse-0.2+git20160824/requirements.txt --- lcurse-0.2+git20160802/requirements.txt 1970-01-01 00:00:00.000000000 +0000 +++ lcurse-0.2+git20160824/requirements.txt 2016-08-23 10:07:57.000000000 +0000 @@ -0,0 +1,3 @@ +bs4==0.0.1 +lxml==3.6.0 +PyQt5==5.7 diff -Nru lcurse-0.2+git20160802/translations/de_DE.ts lcurse-0.2+git20160824/translations/de_DE.ts --- lcurse-0.2+git20160802/translations/de_DE.ts 2016-08-02 09:10:23.000000000 +0000 +++ lcurse-0.2+git20160824/translations/de_DE.ts 2016-08-23 10:13:38.000000000 +0000 @@ -21,17 +21,17 @@ CheckDlg - + Verifying which addon needs an update... Überprüfe welches Addon ein Update benötigt... - + Verifying if the addon needs an update... Überprüfe ob das Addon ein Update benötigt... - + Cancel Abbrechen @@ -39,112 +39,112 @@ MainWidget - + Load Addons Addons Laden - + Re/Load your addons configuration Lade deine Addon Konfiguration - + Save Addons Addons Speichern - + Save your addons configuration Speichere deine Addons Konfiguration - + Preferences Einstellungen - + Change preferences like wow install folder Ändere Einstellungen wie z.B. WoW Installations Verzeichnis - + Exit Beenden - + Exit application Beende die Anwendung - + Addons Addons - + Check all addons Alle Addons überprüfen - + Check all addons for new version Überprüfe alle Addons auf verfügbare neuere Version - + Check addon Aktuelles Addon überprüfen - + Check currently selected addon for new version Überprüfe das aktuell selektierte Addon ob eine neue Version verfügbar ist - + Update all addons Alle Addons updaten - + Update all addons which need an update Update alle Addons, für die ein Update zur Verfügung steht - + Update addon Aktuelles Addon updaten - + Update currently selected addons if needed Update das aktuell selektierte Addon wenn eine neuere Version verfügbar ist - + Add addon Addon hinzufügen - + Add a new addon Füge ein neues Addon hinzu - + Remove addon Addon entfernen - + Remove currently selected addon Entfernt das aktuell selektierte Addon - + Remove selected addon Entferne das selektierte Addon @@ -156,56 +156,62 @@ %s - + General Allgemein - + Import Addons Addons importieren - + Import Addons from WoW installation Importiere Addons aus der WoW Installation - + Ready Fertig - + Update Catalog Katalog updaten - + Retrieve a list of available addons Erhalte eine Liste der verfügbaren Addons - + Catalog Katalog - + lcurse-folder not a folder lcurse-Ordner ist kein Ordner - + There is an entry ".lcurse" in your home directory which is neither a folder nor a link to a folder. Exiting! Es gibt einen ".lcurse" Eintrag in deinem Home Verzeichnis, der weder ein Verzeichnis noch ein Link auf ein Verzeichnis ist. lCurse wird beendet! - + Do you really want to remove the following addon? {} + + + No addons matching {} found. +Manual deletion required. + + PreferencesDlg @@ -255,7 +261,7 @@ UpdateCatalogDlg - + Updating list of available Addons... Die Liste der verfügbaren Addons wird upgedatet... @@ -265,7 +271,7 @@ %%p%% - gefundene Addons: %d - + %%p%% - found Addons: {} @@ -273,12 +279,12 @@ UpdateDlg - + Updating the addons... Die Addons wird upgedatet... - + Updating the addon... Das Addon wird upgedatet...