Index: umc/python/updater/de.po =================================================================== --- umc/python/updater/de.po (revision 5093) +++ umc/python/updater/de.po (working copy) @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: univention-management-console-module-updater\n" "Report-Msgid-Bugs-To: packages@univention.de\n" -"POT-Creation-Date: 2011-10-29 23:07+0200\n" +"POT-Creation-Date: 2011-11-18 11:53+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -12,25 +12,25 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: umc/python/updater/__init__.py:750 +#: umc/python/updater/__init__.py:751 #, python-format msgid "At least one out of %s must be selected." msgstr "Wenigstens eine der %s Kategorien muß ausgewählt sein." -#: umc/python/updater/__init__.py:1262 +#: umc/python/updater/__init__.py:1274 msgid "Component name is not allowed to be empty." msgstr "Der Komponentenname muß angegeben werden." -#: umc/python/updater/__init__.py:756 +#: umc/python/updater/__init__.py:757 #, python-format msgid "ERROR: %s" msgstr "FEHLER: %s" -#: umc/python/updater/__init__.py:744 +#: umc/python/updater/__init__.py:745 msgid "Empty server name not allowed" msgstr "Der Servername muß angegeben werden." -#: umc/python/updater/__init__.py:1267 +#: umc/python/updater/__init__.py:1279 #, python-format msgid "Illegal character(s) in component name: '%s'" msgstr "Unzulässige Zeichen (%s) im Komponentennamen." @@ -57,7 +57,7 @@ msgid "Perform release update up to version '%s'" msgstr "Release auf Version '%s' aktualisieren" -#: umc/python/updater/__init__.py:1276 +#: umc/python/updater/__init__.py:1288 msgid "There is already a component with this name" msgstr "Es gibt bereits eine Komponente mit diesem Namen" @@ -65,6 +65,6 @@ msgid "latest version" msgstr "neueste Version" -#: umc/python/updater/__init__.py:512 +#: umc/python/updater/__init__.py:513 msgid "unknown" msgstr "" Index: umc/python/updater/__init__.py =================================================================== --- umc/python/updater/__init__.py (revision 5093) +++ umc/python/updater/__init__.py (working copy) @@ -1,4 +1,4 @@ -#!/usr/bin/python2.6 +#!/ucr/bin/python2.6 # -*- coding: utf-8 -*- # # Univention Management Console @@ -406,6 +406,7 @@ MODULE.info(" << %s" % s) # ----------------------------------- + # umc.widgets.Form wraps the real data into an array: # # [ @@ -882,7 +883,7 @@ result = self._logstamp(fname) else: # don't read complete file if we have an 'ignore' count - if (count == 0) and (self._current_job['lines']): + if (count == 0) and ('lines' in self._current_job) and (self._current_job['lines']): count = -self._current_job['lines'] result = self._logview(fname, count) @@ -1036,6 +1037,14 @@ MODULE.warn(result['message']) self.finished(request.id,result) return + + # initial values of current job + self._current_job = { + 'job': subject, + 'detail': detail, + 'logfile': '', + 'lines': 0 + } # We want to limit the amount of logfile data being transferred # to the frontend. So we remember the line count of the associated @@ -1052,6 +1061,7 @@ if file != None: file.close() self._current_job['lines'] = count + self._current_job['logfile'] = fname try: # Assemble the command line, now somewhat complicated: @@ -1062,7 +1072,9 @@ # (4) if the subject is about 'component' we must get the 'defaultpackages' # entry from the UCR tuple named by 'detail' and use that. # (5) if not, we can format the 'detail' field into the command. + # # cmd = '%s' % INSTALLERS[subject]['command'] # I need a copy of this string! + # cmd = INSTALLERS[subject]['command'] if cmd.find('%') != -1: if subject == 'component': @@ -1369,9 +1381,13 @@ and how long it is running. """ started = int(time()) + logfile = self._current_job['logfile'] + lines = self._current_job['lines'] script = ''' #:started: %s #:detail: %s +#:logfile: %s +#:lines: %s #:command: %s dpkg-statoverride --add root root 0644 /usr/sbin/univention-management-console-web-server dpkg-statoverride --add root root 0644 /usr/sbin/univention-management-console-server @@ -1382,7 +1398,7 @@ dpkg-statoverride --remove /usr/sbin/univention-management-console-server dpkg-statoverride --remove /usr/sbin/apache2 chmod +x /usr/sbin/univention-management-console-server /usr/sbin/univention-management-console-web-server /usr/sbin/apache2 -''' % (started,detail,command,command) +''' % (started,detail,logfile,lines,command,command) p1 = subprocess.Popen( [ 'LC_ALL=C at now', ], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True ) (stdout,stderr) = p1.communicate( script ) @@ -1419,7 +1435,13 @@ for line in atout.split("\n"): match = re.search('^\#\:([a-z]+)\:\s(.*)$',line) if (match): - self._current_job[match.group(1)] = match.group(2) + var = match.group(1) + val = match.group(2) + # restore numeric strings into numbers! + if val.isdigit(): + self._current_job[var] = int(val) + else: + self._current_job[var] = val return inst return '' Index: umc/js/_updater/ProgressPage.js =================================================================== --- umc/js/_updater/ProgressPage.js (revision 5093) +++ umc/js/_updater/ProgressPage.js (working copy) @@ -58,22 +58,22 @@ _job_key: '', // the key of the currently running job - postMixInProperties: function() { - this.inherited(arguments); + postMixInProperties: function() { + + this.inherited(arguments); + + // If I don't do that -> the page will switch 'show module help description' off + dojo.mixin(this,{ + helpText: ' ' + }); + }, - dojo.mixin(this, { - title: this._("Update in progress"), - headerText: this._("Univention Updater is working"), - helpText: this._("As long as the Univention Updater is updating your system, you're not allowed to manage settings or components. You may watch the progress, or close the module.") - }); - }, - buildRendering: function() { this.inherited(arguments); this._pane = new umc.widgets.ExpandingTitlePane({ - title: this._("Progress information") + title: this._("Log file view") }); this.addChild(this._pane); @@ -110,7 +110,6 @@ // logic will revert to the first tab of our tab set. if (this._reboot_required) { - //alert("Resetting return tab to 'Updates'"); this.last_tab = null; } if (this.last_tab) @@ -188,7 +187,6 @@ } msg = msg + "
 
"; - msg += this._statusfile_data(data.result); // -------------- DEBUG ------------------ // for (var v in this._last_job) @@ -222,43 +220,6 @@ } }, - // takes a status structure as returned from the 'updater/installer/status' call, - // extracts the fields that came directly from the status file (if any) and - // formats them into a one-liner. Returns an empty string if nothing matches. - // - // FOR TEST: now includes the 'reboot' flag if it is present. - _statusfile_data: function(data) { - - var txt = ''; - - for (var f in data) - { - // These fields are wrapped into underscores - if ((f.substr(0,1) == '_') && (f.substr(-1,1) == '_')) - { - if (txt.length) { txt += ','; } - txt += ' ' + f.substr(1,f.length-2) + "=" + data[f]; - } - } - - if (data['reboot']) - { - txt += ' [REBOOT] '; - if (! this._reboot_required) // not set or not true - { - //alert("Setting REBOOT from _statusfile_data"); - this._reboot_required = true; - } - } - - if (txt != '') - { - txt = "(" + this._("Current status file content") + ":" + txt + ")
"; - } - - return txt; - }, - // queries job status. As long as we know a job key -> ask for full // details. The handler _process_job_status() handles this gracefully. _query_job_status: function() { @@ -316,7 +277,6 @@ msg = msg + this._("You may return to the overview by clicking the 'back' button now."); msg = msg + "
 
"; - msg += this._statusfile_data(this._last_job); // -------------- DEBUG ------------------ // for (var v in this._last_job) @@ -327,24 +287,16 @@ this._head.set('content',msg); - this._log.stopWatching(); // now log is freely scrollable manually - - //alert("Watching is finished, job is '" + this._job_key + "'"); - - if ((this._last_job) && (this._last_job['reboot'])) + // set headers according to the outcome + var status = 'success'; + if (typeof(this._last_job['_status_'] == 'undefined') || this._last_job['_status_'] != 'SUCCESS') { - var reb = this._last_job['reboot']; - if (typeof(reb) == 'string') - { - reb = (reb == 'true'); - } - if ((! this._reboot_required) || (reb != this._reboot_required)) - { - //alert("setting REBOOT from _allow_close()"); - this._reboot_required = reb; - } + status = 'failed'; } + this._switch_headings(status); + this._log.stopWatching(); // now log is freely scrollable manually + this._last_job = null; // can be deleted, but this._job_key should be retained! } } @@ -393,6 +345,50 @@ this.inherited(arguments); this._interval = 0; + }, + + // on switch to this page: set initial headings. + onShow: function() { + this._switch_headings('running'); + }, + + // internal function that switches any heading variables of + // our current page, according to the retrieved job status + _switch_headings: function(status) { + + // avoid doing that repeatedly + if (status == this._last_heading_status) + { + return; + } + + this._last_heading_status = status; + + var headings = { + 'running': { + title: this._("Update in progress"), + headerText: this._("Univention Updater is working"), + helpText: this._("As long as the Univention Updater is updating your system, you're not allowed to manage settings or components. You may watch the progress, or close the module.") + }, + 'success': { + title: this._("Update finished"), + headerText: this._("Univention Updater job completed"), + helpText: this._("Univention Updater has successfully finished the current job. You may read through the log file. If you're finished you may press the 'back to overview' button to close this view.") + }, + 'failed': { + title: this._("Update failed"), + headerText: this._("Univention Updater job failed"), + helpText: this._("Univention Updater could not successfully complete the current job. The log file should show the cause of the failure. If you're finished examining the log file you may press the 'back to overview' button to close this view.") + } + }; + + var info = headings[status]; + for (var v in info) + { + this.set(v,info[v]); + } + // this.layout(); + } }); Index: umc/js/_updater/ComponentsPage.js =================================================================== --- umc/js/_updater/ComponentsPage.js (revision 5093) +++ umc/js/_updater/ComponentsPage.js (working copy) @@ -313,6 +313,12 @@ // removes a component _delete_components: function(ids) { + // multiAction callback is fired even if nothing + // is selected? + if (! ids.length) + { + return; + } var msg = dojo.replace(this._("Are you sure you want to delete the following components: [{ids}]"),{ids: ids}); umc.dialog.confirm(msg, [ Index: umc/js/_updater/DetailsPage.js =================================================================== --- umc/js/_updater/DetailsPage.js (revision 5093) +++ umc/js/_updater/DetailsPage.js (working copy) @@ -69,8 +69,7 @@ 'default': true, label: this._("Apply changes"), onClick: dojo.hitch(this, function() { - this.standby(true); - this._form.save(this._save_options); + this._form.onSubmit(); }) } ] @@ -131,7 +130,7 @@ type: 'TextBox', name: 'version', label: this._("Version"), - regExp: '^((([0-9]+\.[0-9]+|current),)*([0-9]+\.[0-9]+|current))?$' + regExp: '^((([0-9]+\\.[0-9]+|current),)*([0-9]+\\.[0-9]+|current))?$' } ]; @@ -161,7 +160,14 @@ widgets: widgets, layout: layout, //buttons: buttons, - moduleStore: umc.store.getModuleStore('name','updater/components') + moduleStore: umc.store.getModuleStore('name','updater/components'), + // This is (a) the submit handler of the form, but + // also (b) the onClick handler of the 'Apply' button + onSubmit: function() { + alert('onSubmit called'); + this._form.standby(true); + this._form.save(this._save_options); + } }); this.addChild(this._form); @@ -233,7 +239,6 @@ // return to grid view closeDetail: function() { - } - + } }); Index: umc/js/de.po =================================================================== --- umc/js/de.po (revision 5093) +++ umc/js/de.po (working copy) @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: univention-management-console-module-updater\n" "Report-Msgid-Bugs-To: packages@univention.de\n" -"POT-Creation-Date: 2011-11-16 04:14+0100\n" +"POT-Creation-Date: 2011-11-18 15:57+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Frank Greif \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,7 @@ msgid "... loading data ..." msgstr "... Daten werden geladen ..." -#: umc/js/_updater/ProgressPage.js:374 +#: umc/js/_updater/ProgressPage.js:326 msgid "... loading job data ..." msgstr "... Daten werden geladen ..." @@ -33,7 +33,7 @@ msgid "Add" msgstr "Neu" -#: umc/js/_updater/DetailsPage.js:196 +#: umc/js/_updater/DetailsPage.js:202 msgid "Add a new component" msgstr "Neue Komponente hinzufügen" @@ -45,7 +45,7 @@ msgid "Additional components" msgstr "Zusätzliche Komponenten" -#: umc/js/_updater/DetailsPage.js:150 +#: umc/js/_updater/DetailsPage.js:149 msgid "Advanced settings" msgstr "Weitere Einstellungen" @@ -57,15 +57,15 @@ "Sie können die Management Console jetzt auch schließen, und später wieder " "öffnen." -#: umc/js/_updater/SettingsPage.js:62 umc/js/_updater/DetailsPage.js:70 +#: umc/js/_updater/DetailsPage.js:70 umc/js/_updater/SettingsPage.js:62 msgid "Apply changes" msgstr "Änderungen anwenden" -#: umc/js/_updater/ComponentsPage.js:316 +#: umc/js/_updater/ComponentsPage.js:322 msgid "Are you sure you want to delete the following components: [{ids}]" msgstr "Möchten Sie wirklich die folgenden Komponenten löschen: [{ids}]" -#: umc/js/_updater/ProgressPage.js:67 +#: umc/js/_updater/ProgressPage.js:371 msgid "" "As long as the Univention Updater is updating your system, you're not " "allowed to manage settings or components. You may watch the progress, or " @@ -87,12 +87,12 @@ msgid "Available system updates" msgstr "Verfügbare System-Updates" -#: umc/js/_updater/DetailsPage.js:141 +#: umc/js/_updater/DetailsPage.js:140 msgid "Basic settings" msgstr "Allgemeine Einstellungen" #: umc/js/updater.js:303 umc/js/updater.js:380 -#: umc/js/_updater/ComponentsPage.js:322 +#: umc/js/_updater/ComponentsPage.js:328 msgid "Cancel" msgstr "Abbrechen" @@ -100,11 +100,11 @@ msgid "Check for package updates" msgstr "Paket-Aktualisierungen prüfen" -#: umc/js/_updater/DetailsPage.js:93 umc/js/_updater/ComponentsPage.js:183 +#: umc/js/_updater/ComponentsPage.js:183 umc/js/_updater/DetailsPage.js:92 msgid "Component Name" msgstr "Name der Komponente" -#: umc/js/_updater/DetailsPage.js:49 umc/js/_updater/ComponentsPage.js:50 +#: umc/js/_updater/ComponentsPage.js:50 umc/js/_updater/DetailsPage.js:49 msgid "Components" msgstr "Komponenten" @@ -118,10 +118,6 @@ "Die Verbindung zum Server wurde unterbrochen. Ein erneuter Verbindungsaufbau " "wird gestartet." -#: umc/js/_updater/ProgressPage.js:256 -msgid "Current status file content" -msgstr "Inhalt der Statusdatei" - #: umc/js/_updater/ComponentsPage.js:167 msgid "Delete" msgstr "Löschen" @@ -130,11 +126,11 @@ msgid "Delete the selected component definition" msgstr "Diese Komponente löschen" -#: umc/js/_updater/ComponentsPage.js:325 +#: umc/js/_updater/ComponentsPage.js:331 msgid "Delete!" msgstr "Löschen!" -#: umc/js/_updater/DetailsPage.js:98 +#: umc/js/_updater/DetailsPage.js:97 msgid "Description" msgstr "Beschreibung" @@ -193,7 +189,7 @@ msgid "Edit" msgstr "Bearbeiten" -#: umc/js/_updater/DetailsPage.js:219 +#: umc/js/_updater/DetailsPage.js:225 msgid "Edit component details [{component}]" msgstr "Komponenten-Details [{component}] bearbeiten" @@ -205,7 +201,7 @@ msgid "Enable" msgstr "Aktivieren" -#: umc/js/_updater/DetailsPage.js:88 +#: umc/js/_updater/DetailsPage.js:87 msgid "Enable this component" msgstr "Diese Komponente aktivieren" @@ -273,10 +269,14 @@ "Tests in einer Testumgebung und die Erstellung einer Sicherung des Systems " "werden ebenfalls empfohlen." -#: umc/js/_updater/ProgressPage.js:314 +#: umc/js/_updater/ProgressPage.js:275 msgid "It took {elapsed} to complete.
" msgstr "Er hat {elapsed} benötigt.
" +#: umc/js/_updater/ProgressPage.js:76 +msgid "Log file view" +msgstr "Protokoll" + #: umc/js/updater.js:361 msgid "Logfiles can be found in the directory /var/log/univention/." msgstr "Logdateien können im Verzeichnis /var/log/univention/ gefunden werden." @@ -329,7 +329,7 @@ msgid "Package updates" msgstr "Paketaktualisierungen" -#: umc/js/_updater/DetailsPage.js:128 +#: umc/js/_updater/DetailsPage.js:127 msgid "Password" msgstr "Passwort" @@ -346,14 +346,10 @@ "jeweiligen Update in dem Univention " "Forum." -#: umc/js/_updater/DetailsPage.js:197 +#: umc/js/_updater/DetailsPage.js:203 msgid "Please enter the details for the new component." msgstr "Bitte geben Sie die Details für die neue Komponente ein." -#: umc/js/_updater/ProgressPage.js:76 -msgid "Progress information" -msgstr "Aktueller Vorgang" - #: umc/js/_updater/UpdatesPage.js:282 msgid "Reboot" msgstr "Neu starten" @@ -378,22 +374,14 @@ msgid "Release updates" msgstr "Release-Aktualisierungen" -#: umc/js/_updater/DetailsPage.js:108 +#: umc/js/_updater/DetailsPage.js:107 umc/js/_updater/SettingsPage.js:86 msgid "Repository prefix" -msgstr "Repository-Prefix" +msgstr "Repository prefix" -#: umc/js/_updater/DetailsPage.js:103 +#: umc/js/_updater/DetailsPage.js:102 umc/js/_updater/SettingsPage.js:81 msgid "Repository server" -msgstr "Repository-Server" +msgstr "Repository server" -#: umc/js/_updater/SettingsPage.js:86 -msgid "Repository prefix" -msgstr "Repository-Prefix" - -#: umc/js/_updater/SettingsPage.js:81 -msgid "Repository server" -msgstr "Repository-Server" - #: umc/js/_updater/SettingsPage.js:54 msgid "Reset" msgstr "Zurücksetzen" @@ -435,7 +423,7 @@ "Verbindung wieder aufzunehmen. Wahrscheinlich müssen Sie sich neu anmelden, " "wenn die Verbindung wieder hergestellt ist." -#: umc/js/_updater/ProgressPage.js:311 +#: umc/js/_updater/ProgressPage.js:272 msgid "The current job ({label}) is now finished.
" msgstr "Der aktuelle Vorgang ({label}) ist jetzt beendet.
" @@ -455,7 +443,7 @@ "Der Univention Updater konnte nicht gestartet werden [Fehler {status}]: " "{message}" -#: umc/js/_updater/ProgressPage.js:183 +#: umc/js/_updater/ProgressPage.js:182 msgid "The job {label} (started {elapsed} ago) is currently running." msgstr "" "Momentan läuft der Aktualisierungsauftrag {label} (gestartet vor " @@ -514,10 +502,36 @@ msgid "Thus, updates shouldn't be installed on a live system. " msgstr "Deshalb sollten Sie das Update nicht im laufenden Betrieb einspielen. " -#: umc/js/_updater/ProgressPage.js:66 +#: umc/js/_updater/ProgressPage.js:381 +msgid "" +"Univention Updater could not successfully complete the current job. The log " +"file should show the cause of the failure. If you're finished examining the " +"log file you may press the 'back to overview' button to close this view." +msgstr "" +"Univention Updater konnte den aktuellen Auftrag nicht erfolgreich " +"abschließen. Im Protokoll sollten Sie die Ursache des Fehlschlages sehen " +"können. Der Knopf 'zurück zur Übersicht' schließt die aktuelle Ansicht." + +#: umc/js/_updater/ProgressPage.js:376 +msgid "" +"Univention Updater has successfully finished the current job. You may read " +"through the log file. If you're finished you may press the 'back to " +"overview' button to close this view." +msgstr "" +"Univention Updater hat den aktuellen Auftrag erfolgreich abgeschlossen. " + +#: umc/js/_updater/ProgressPage.js:370 msgid "Univention Updater is working" msgstr "Univention Updater ist gerade aktiv" +#: umc/js/_updater/ProgressPage.js:375 +msgid "Univention Updater job completed" +msgstr "Univention Updater Auftrag abgeschlossen" + +#: umc/js/_updater/ProgressPage.js:380 +msgid "Univention Updater job failed" +msgstr "Univention Updater Auftrag ist fehlgeschlagen" + #: umc/js/_updater/ComponentsPage.js:218 msgid "Unknown" msgstr "Unbekannt" @@ -526,7 +540,15 @@ msgid "Update availability could not be checked." msgstr "Verfügbarkeit von Aktualisierungen konnte nicht geprüft werden." -#: umc/js/_updater/ProgressPage.js:65 +#: umc/js/_updater/ProgressPage.js:379 +msgid "Update failed" +msgstr "Aktualisierung fehlgeschlagen" + +#: umc/js/_updater/ProgressPage.js:374 +msgid "Update finished" +msgstr "Aktualisierung abgeschlossen" + +#: umc/js/_updater/ProgressPage.js:369 msgid "Update in progress" msgstr "Aktualisierung läuft" @@ -542,19 +564,19 @@ msgid "Updates" msgstr "Aktualisierungen" -#: umc/js/_updater/SettingsPage.js:91 umc/js/_updater/DetailsPage.js:113 +#: umc/js/_updater/DetailsPage.js:112 umc/js/_updater/SettingsPage.js:91 msgid "Use maintained repositories" msgstr "'Maintained' Repositories benutzen" -#: umc/js/_updater/SettingsPage.js:96 umc/js/_updater/DetailsPage.js:118 +#: umc/js/_updater/DetailsPage.js:117 umc/js/_updater/SettingsPage.js:96 msgid "Use unmaintained repositories" msgstr "'Unmaintained' Repositories benutzen" -#: umc/js/_updater/DetailsPage.js:123 +#: umc/js/_updater/DetailsPage.js:122 msgid "Username" msgstr "Benutzername" -#: umc/js/_updater/DetailsPage.js:133 +#: umc/js/_updater/DetailsPage.js:132 msgid "Version" msgstr "Version" @@ -566,17 +588,17 @@ "Wenn die Verbindung wieder hergestellt ist, werden Sie aufgefordert, sich " "noch einmal neu anzumelden." -#: umc/js/_updater/ProgressPage.js:316 +#: umc/js/_updater/ProgressPage.js:277 msgid "You may return to the overview by clicking the 'back' button now." msgstr "" "Sie können jetzt zur Übersicht zurückkehren, indem Sie den 'Zurück'-Knopf " "drücken." -#: umc/js/_updater/ProgressPage.js:187 +#: umc/js/_updater/ProgressPage.js:186 msgid "You're currently watching its log file {logfile}" msgstr "Sie sehen die Protokolldatei {logfile}" -#: umc/js/_updater/DetailsPage.js:220 +#: umc/js/_updater/DetailsPage.js:226 msgid "You're editing the details of the component definition." msgstr "Sie bearbeiten die Details der Komponenten-Definition." @@ -592,7 +614,7 @@ msgid "Your system is at errata level {erratalevel}." msgstr "Ihr System ist auf dem Errata-Level {erratalevel}." -#: umc/js/_updater/DetailsPage.js:55 umc/js/_updater/ProgressPage.js:102 +#: umc/js/_updater/ProgressPage.js:102 umc/js/_updater/DetailsPage.js:55 msgid "back to overview" msgstr "zurück zur Übersicht" @@ -611,6 +633,3 @@ #: umc/js/_updater/UpdatesPage.js:436 msgid "{enabled} of them are currently enabled." msgstr "Davon sind {enabled} Komponenten aktiviert." - -#~ msgid "Use hotfix repositories" -#~ msgstr "'Hotfix' Repositories benutzen"