Merge lp:~dylanmccall/update-manager/dialogs-refactor into lp:update-manager

Proposed by Dylan McCall
Status: Merged
Merged at revision: 2631
Proposed branch: lp:~dylanmccall/update-manager/dialogs-refactor
Merge into: lp:update-manager
Diff against target: 3504 lines (+976/-1517)
14 files modified
UpdateManager/Dialogs.py (+94/-52)
UpdateManager/InstallProgress.py (+0/-100)
UpdateManager/SimpleGtkbuilderApp.py (+0/-63)
UpdateManager/UpdateManager.py (+78/-47)
UpdateManager/UpdateProgress.py (+0/-81)
UpdateManager/UpdatesAvailable.py (+94/-123)
UpdateManager/backend/InstallBackendAptdaemon.py (+63/-66)
UpdateManager/backend/InstallBackendSynaptic.py (+34/-28)
UpdateManager/backend/__init__.py (+66/-28)
data/gtkbuilder/Dialog.ui (+49/-50)
data/gtkbuilder/UpdateManager.ui (+276/-444)
debian/update-manager.install (+0/-3)
po/POTFILES.in (+0/-2)
po/update-manager.pot (+222/-430)
To merge this branch: bzr merge lp:~dylanmccall/update-manager/dialogs-refactor
Reviewer Review Type Date Requested Status
Dimitri John Ledkov Approve
Review via email: mp+164673@code.launchpad.net

Description of the change

With this branch, I am proposing some refactoring of update-manager's various screens so they all use the same base class, "Dialog", which is typically a Gtk widget that can be added as a child of the application's main window.

Previously, the design of the application meant we used Dialog sometimes, but not always, with the UpdatesAvailable screen being a particularly noteworthy omission. To deal with all these different screens, whenever UpdateManager wanted to show a new screen it would call that screen's start method, and then the screen itself would effectively take control of the main window. This meant adding new widgets, hiding the main window, making it resizable, and the like; which also meant code duplication, several calls to Gtk.main, and a strong smell of feature envy :) With my design, I'm trying to adopt a more conventional layout, using the Dialog class throughout, as a GTK widget wherever possible. (The settings dialog and InstallBackendSynaptic keep us from being all internal Gtk widgets all the time, but we're really close).

There is now a little less code (diffstat: 11 files changed, 747 insertions(+), 1074 deletions(-)), and it should be much easier to make a single change and have it apply logically across the application. In addition, because the main window has a better handle on its children, this paves the way for us to implement pretty transitions between screens, for example using the new-fangled GtkRevealer widget. Originally this would have meant changing every screen to deal with a new container in the main window. With this change, we can do it all in UpdateManager.py.

To post a comment you must log in.
2634. By Dylan McCall

Put back the "backend" module. It wasn't necessary to move it in this branch.

2635. By Dylan McCall

Removed unnecessary layout changes in InstallBackendAptdaemon. Progress dialog should not wiggle when it first appears, now.

2636. By Dylan McCall

Fix packaging and pot files.
Put back the 6px margin above header label in each dialog.

2637. By Dylan McCall

Progress dialog is resizable while downloading packages, too.

Revision history for this message
Dimitri John Ledkov (xnox) wrote :

Looks good to me. Installed and running this version of update-manager. Will report any bugs / regression. So far everything looks good.

review: Approve
Revision history for this message
Sebastien Bacher (seb128) wrote :

Those changes seem to have a created https://bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1200775 (apturl stopped working on "AttributeError: 'InstallBackendAptdaemon' object has no attribute 'connect'")

Revision history for this message
Sebastien Bacher (seb128) wrote :

That merge is also creating https://errors.ubuntu.com/problem/3ca9b88401b3789ff4d00462be7b20206f60e181

_action_done() is calling "self.window_main.start_error(False, error_string, error_desc)", or window_main is a GtkDialog not an UpdateManager object anymore, so it doesn't have that function

Dylan, do you think you could look at that?

Revision history for this message
Sebastien Bacher (seb128) wrote :

I've opened https://bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1258112 about the most recently described issue

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'UpdateManager/Dialogs.py'
2--- UpdateManager/Dialogs.py 2013-01-09 21:04:35 +0000
3+++ UpdateManager/Dialogs.py 2013-05-21 05:43:25 +0000
4@@ -24,6 +24,7 @@
5
6 from gi.repository import Gtk
7 from gi.repository import Gdk
8+from gi.repository import GLib
9 from gi.repository import GObject
10 GObject.threads_init()
11
12@@ -31,39 +32,79 @@
13 warnings.filterwarnings(
14 "ignore", "Accessed deprecated property", DeprecationWarning)
15
16+import logging
17 import dbus
18 import os
19 import subprocess
20 import sys
21-from .SimpleGtkbuilderApp import SimpleGtkbuilderApp
22
23 from gettext import gettext as _
24
25
26-class Dialog(SimpleGtkbuilderApp):
27+class Dialog(object):
28 def __init__(self, window_main):
29 self.window_main = window_main
30- self.focus_button = None
31- SimpleGtkbuilderApp.__init__(
32- self,
33- self.window_main.datadir + "/gtkbuilder/Dialog.ui",
34- "update-manager")
35-
36- def main(self):
37- self.window_main.push(self.pane_dialog, self)
38- if self.focus_button:
39- self.focus_button.grab_focus()
40-
41- def run(self, parent=None):
42- if self.focus_button:
43- self.focus_button.grab_focus()
44+
45+ def start(self):
46+ pass
47+
48+ def close(self):
49+ return self.stop()
50+
51+ def stop(self):
52+ pass
53+
54+ def run(self, parent=None):
55+ pass
56+
57+
58+class BuilderDialog(Dialog, Gtk.Alignment):
59+ def __init__(self, window_main, ui_path, root_widget):
60+ Dialog.__init__(self, window_main)
61+ Gtk.Alignment.__init__(self)
62+
63+ builder = self._load_ui(ui_path, root_widget)
64+ self.add(builder.get_object(root_widget))
65+ self.show()
66+
67+ def _load_ui(self, path, root_widget, domain="update-manager"):
68+ builder = Gtk.Builder()
69+ builder.set_translation_domain(domain)
70+ builder.add_objects_from_file(path, [root_widget])
71+ builder.connect_signals(self)
72+
73+ for o in builder.get_objects():
74+ if issubclass(type(o), Gtk.Buildable):
75+ name = Gtk.Buildable.get_name(o)
76+ setattr(self, name, o)
77+ else:
78+ logging.debug("WARNING: can not get name for '%s'" % o)
79+
80+ return builder
81+
82+ def run(self, parent=None):
83+ # FIXME: THIS WILL CRASH!
84 if parent:
85 self.window_dialog.set_transient_for(parent)
86 self.window_dialog.set_modal(True)
87 self.window_dialog.run()
88
89- def close(self):
90- sys.exit(0) # By default, exit the app
91+
92+class InternalDialog(BuilderDialog):
93+ def __init__(self, window_main, content_widget=None):
94+ ui_path = os.path.join(window_main.datadir, "gtkbuilder/Dialog.ui")
95+ BuilderDialog.__init__(self, window_main, ui_path, "pane_dialog")
96+
97+ self.focus_button = None
98+ self.set_content_widget(content_widget)
99+ self.connect("realize", self._on_realize)
100+
101+ def _on_realize(self, user_data):
102+ if self.focus_button:
103+ self.focus_button.set_can_default(True)
104+ self.focus_button.set_can_focus(True)
105+ self.focus_button.grab_default()
106+ self.focus_button.grab_focus()
107
108 def add_button(self, label, callback, secondary=False):
109 # from_stock tries stock first and falls back to mnemonic
110@@ -83,48 +124,50 @@
111 return None
112
113 def on_settings_button_clicked(self):
114- cmd = ["/usr/bin/software-properties-gtk",
115- "--open-tab", "2",
116- # FIXME: once get_xid() is available via introspections, add
117- # this back
118- #"--toplevel", "%s" % self.window_main.get_window().get_xid()
119- ]
120- subprocess.Popen(cmd)
121+ self.window_main.show_settings()
122
123 def set_header(self, label):
124- self.label_header.set_label(label)
125+ if label:
126+ self.label_header.set_markup(
127+ "<span size='larger' weight='bold'>%s</span>" % label)
128+ self.label_header.set_visible(bool(label))
129
130 def set_desc(self, label):
131- self.label_desc.set_label(label)
132+ if label:
133+ self.label_desc.set_markup(label)
134 self.label_desc.set_visible(bool(label))
135
136+ def set_content_widget(self, content_widget):
137+ if content_widget:
138+ self.main_container.add(content_widget)
139+ self.main_container.set_visible(bool(content_widget))
140
141-class StoppedUpdatesDialog(Dialog):
142+class StoppedUpdatesDialog(InternalDialog):
143 def __init__(self, window_main):
144- Dialog.__init__(self, window_main)
145+ InternalDialog.__init__(self, window_main)
146 self.set_header(_("You stopped the check for updates."))
147 self.add_settings_button()
148 self.add_button(_("_Check Again"), self.check)
149- self.focus_button = self.add_button(Gtk.STOCK_OK, self.close)
150+ self.focus_button = self.add_button(Gtk.STOCK_OK, self.window_main.close)
151
152 def check(self):
153 self.window_main.start_update()
154
155
156-class NoUpdatesDialog(Dialog):
157+class NoUpdatesDialog(InternalDialog):
158 def __init__(self, window_main, error_occurred=False):
159- Dialog.__init__(self, window_main)
160+ InternalDialog.__init__(self, window_main)
161 if error_occurred:
162 self.set_header(_("No software updates are available."))
163 else:
164 self.set_header(_("The software on this computer is up to date."))
165 self.add_settings_button()
166- self.focus_button = self.add_button(Gtk.STOCK_OK, self.close)
167-
168-
169-class DistUpgradeDialog(Dialog):
170+ self.focus_button = self.add_button(Gtk.STOCK_OK, self.window_main.close)
171+
172+
173+class DistUpgradeDialog(InternalDialog):
174 def __init__(self, window_main, meta_release):
175- Dialog.__init__(self, window_main)
176+ InternalDialog.__init__(self, window_main)
177 self.meta_release = meta_release
178 self.set_header(_("The software on this computer is up to date."))
179 # Translators: these are Ubuntu version names like "Ubuntu 12.04"
180@@ -134,7 +177,7 @@
181 meta_release.current_dist_version))
182 self.add_settings_button()
183 self.add_button(_("Upgrade…"), self.upgrade)
184- self.focus_button = self.add_button(Gtk.STOCK_OK, self.close)
185+ self.focus_button = self.add_button(Gtk.STOCK_OK, self.window_main.close)
186
187 def upgrade(self):
188 # Pass on several arguments
189@@ -169,9 +212,9 @@
190 DistUpgradeDialog.run(self, parent)
191
192
193-class PartialUpgradeDialog(Dialog):
194+class PartialUpgradeDialog(InternalDialog):
195 def __init__(self, window_main):
196- Dialog.__init__(self, window_main)
197+ InternalDialog.__init__(self, window_main)
198 self.set_header(_("Not all updates can be installed"))
199 self.set_desc(_(
200 """Run a partial upgrade, to install as many updates as possible.
201@@ -191,24 +234,24 @@
202 "/usr/lib/ubuntu-release-upgrader/do-partial-upgrade "
203 "--frontend=DistUpgradeViewGtk3")
204
205- def main(self):
206- Dialog.main(self)
207+ def start(self):
208+ Dialog.start(self)
209 # Block progress until user has answered this question
210 Gtk.main()
211
212
213-class ErrorDialog(Dialog):
214+class ErrorDialog(InternalDialog):
215 def __init__(self, window_main, header, desc=None):
216- Dialog.__init__(self, window_main)
217+ InternalDialog.__init__(self, window_main)
218 self.set_header(header)
219 if desc:
220 self.set_desc(desc)
221 self.label_desc.set_selectable(True)
222 self.add_settings_button()
223- self.focus_button = self.add_button(Gtk.STOCK_OK, self.close)
224+ self.focus_button = self.add_button(Gtk.STOCK_OK, self.window_main.close)
225
226- def main(self):
227- Dialog.main(self)
228+ def start(self):
229+ Dialog.start(self)
230 # The label likes to start selecting everything (b/c it got focus
231 # before we switched to our default button).
232 self.label_desc.select_region(0, 0)
233@@ -229,17 +272,16 @@
234 self.window_main.start_available(error_occurred=True)
235
236
237-class NeedRestartDialog(Dialog):
238+class NeedRestartDialog(InternalDialog):
239 def __init__(self, window_main):
240- Dialog.__init__(self, window_main)
241+ InternalDialog.__init__(self, window_main)
242 self.set_header(
243 _("The computer needs to restart to finish installing updates."))
244 self.focus_button = self.add_button(_("_Restart"), self.restart)
245
246- def main(self):
247- Dialog.main(self)
248+ def start(self):
249+ Dialog.start(self)
250 # Turn off close button
251- self.window_main.realize()
252 self.window_main.get_window().set_functions(Gdk.WMFunction.MOVE |
253 Gdk.WMFunction.MINIMIZE)
254
255
256=== removed file 'UpdateManager/InstallProgress.py'
257--- UpdateManager/InstallProgress.py 2012-12-13 20:39:37 +0000
258+++ UpdateManager/InstallProgress.py 1970-01-01 00:00:00 +0000
259@@ -1,100 +0,0 @@
260-# InstallProgress.py
261-# -*- Mode: Python; indent-tabs-mode: nil; tab-width: 4; coding: utf-8 -*-
262-#
263-# Copyright (c) 2004-2012 Canonical
264-# 2004 Michiel Sikkes
265-# 2005 Martin Willemoes Hansen
266-# 2010 Mohamed Amine IL Idrissi
267-#
268-# Author: Michiel Sikkes <michiel@eyesopened.nl>
269-# Michael Vogt <mvo@debian.org>
270-# Martin Willemoes Hansen <mwh@sysrq.dk>
271-# Mohamed Amine IL Idrissi <ilidrissiamine@gmail.com>
272-# Alex Launi <alex.launi@canonical.com>
273-# Michael Terry <michael.terry@canonical.com>
274-#
275-# This program is free software; you can redistribute it and/or
276-# modify it under the terms of the GNU General Public License as
277-# published by the Free Software Foundation; either version 2 of the
278-# License, or (at your option) any later version.
279-#
280-# This program is distributed in the hope that it will be useful,
281-# but WITHOUT ANY WARRANTY; without even the implied warranty of
282-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
283-# GNU General Public License for more details.
284-#
285-# You should have received a copy of the GNU General Public License
286-# along with this program; if not, write to the Free Software
287-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
288-# USA
289-
290-from __future__ import absolute_import, print_function
291-
292-import warnings
293-warnings.filterwarnings("ignore", "Accessed deprecated property",
294- DeprecationWarning)
295-
296-import os
297-import sys
298-
299-from .backend import get_backend
300-
301-from .Core.utils import (inhibit_sleep,
302- allow_sleep)
303-
304-
305-class InstallProgress(object):
306-
307- def __init__(self, app):
308- self.window_main = app
309- self.datadir = app.datadir
310- self.options = app.options
311-
312- # Used for inhibiting power management
313- self.sleep_cookie = None
314- self.sleep_dev = None
315-
316- # get the install backend
317- self.install_backend = get_backend(self.datadir, self.window_main)
318- self.install_backend.connect("action-done", self._on_backend_done)
319-
320- def invoke_manager(self):
321- # don't display apt-listchanges, we already showed the changelog
322- os.environ["APT_LISTCHANGES_FRONTEND"] = "none"
323-
324- # Do not suspend during the update process
325- (self.sleep_dev, self.sleep_cookie) = inhibit_sleep()
326-
327- # If the progress dialog should be closed automatically afterwards
328- #settings = Gio.Settings("com.ubuntu.update-manager")
329- #close_on_done = settings.get_boolean("autoclose-install-window")
330- # FIXME: confirm with mpt whether this should still be a setting
331- close_on_done = False
332-
333- # Get the packages which should be installed and update
334- pkgs_install = []
335- pkgs_upgrade = []
336- for pkg in self.window_main.cache:
337- if pkg.marked_install:
338- pkgs_install.append(pkg.name)
339- elif pkg.marked_upgrade:
340- pkgs_upgrade.append(pkg.name)
341- self.install_backend.commit(pkgs_install, pkgs_upgrade, close_on_done)
342-
343- def _on_backend_done(self, backend, action, authorized, success,
344- error_string, error_desc):
345- # Allow suspend after synaptic is finished
346- if self.sleep_cookie:
347- allow_sleep(self.sleep_dev, self.sleep_cookie)
348- self.sleep_cookie = self.sleep_dev = None
349-
350- # Either launch main dialog and continue or quit altogether
351- if success:
352- self.window_main.start_available()
353- elif error_string:
354- self.window_main.start_error(False, error_string, error_desc)
355- else:
356- sys.exit(0)
357-
358- def main(self):
359- self.invoke_manager()
360
361=== removed file 'UpdateManager/SimpleGtkbuilderApp.py'
362--- UpdateManager/SimpleGtkbuilderApp.py 2012-11-19 16:33:28 +0000
363+++ UpdateManager/SimpleGtkbuilderApp.py 1970-01-01 00:00:00 +0000
364@@ -1,63 +0,0 @@
365-# -*- Mode: Python; indent-tabs-mode: nil; tab-width: 4; coding: utf-8 -*-
366-
367-"""
368- SimpleGladeApp.py
369- Module that provides an object oriented abstraction to pygtk and libglade.
370- Copyright (C) 2004 Sandino Flores Moreno
371-"""
372-
373-# This library is free software; you can redistribute it and/or
374-# modify it under the terms of the GNU Lesser General Public
375-# License as published by the Free Software Foundation; either
376-# version 2.1 of the License, or (at your option) any later version.
377-#
378-# This library is distributed in the hope that it will be useful,
379-# but WITHOUT ANY WARRANTY; without even the implied warranty of
380-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
381-# Lesser General Public License for more details.
382-#
383-# You should have received a copy of the GNU Lesser General Public
384-# License along with this library; if not, write to the Free Software
385-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
386-# USA
387-
388-import logging
389-
390-from gi.repository import Gtk
391-
392-
393-# based on SimpleGladeApp
394-class SimpleGtkbuilderApp:
395-
396- def __init__(self, path, domain):
397- self.builder = Gtk.Builder()
398- self.builder.set_translation_domain(domain)
399- self.builder.add_from_file(path)
400- self.builder.connect_signals(self)
401- for o in self.builder.get_objects():
402- if issubclass(type(o), Gtk.Buildable):
403- name = Gtk.Buildable.get_name(o)
404- setattr(self, name, o)
405- else:
406- logging.debug("WARNING: can not get name for '%s'" % o)
407-
408- def run(self):
409- """
410- Starts the main loop of processing events checking for Control-C.
411-
412- The default implementation checks wheter a Control-C is pressed,
413- then calls on_keyboard_interrupt().
414-
415- Use this method for starting programs.
416- """
417- try:
418- Gtk.main()
419- except KeyboardInterrupt:
420- self.on_keyboard_interrupt()
421-
422- def on_keyboard_interrupt(self):
423- """
424- This method is called by the default implementation of run()
425- after a program is finished by pressing Control-C.
426- """
427- pass
428
429=== modified file 'UpdateManager/UpdateManager.py'
430--- UpdateManager/UpdateManager.py 2013-03-01 18:21:56 +0000
431+++ UpdateManager/UpdateManager.py 2013-05-21 05:43:25 +0000
432@@ -23,7 +23,7 @@
433 from __future__ import absolute_import, print_function
434
435 from gi.repository import Gtk
436-from gi.repository import Gdk
437+from gi.repository import Gdk, GdkX11
438 from gi.repository import Gio
439 from gi.repository import GLib
440
441@@ -33,7 +33,9 @@
442
443 import apt_pkg
444 import os
445+import subprocess
446 import sys
447+import time
448 from gettext import gettext as _
449
450 import dbus
451@@ -50,22 +52,22 @@
452 PartialUpgradeDialog,
453 UnsupportedDialog,
454 UpdateErrorDialog)
455-from .InstallProgress import InstallProgress
456 from .MetaReleaseGObject import MetaRelease
457-from .UpdateProgress import UpdateProgress
458 from .UpdatesAvailable import UpdatesAvailable
459 from .Core.AlertWatcher import AlertWatcher
460 from .Core.MyCache import MyCache
461 from .Core.roam import NetworkManagerHelper
462 from .Core.UpdateList import UpdateList
463+from .backend import (InstallBackend,
464+ get_backend)
465
466 # file that signals if we need to reboot
467 REBOOT_REQUIRED_FILE = "/var/run/reboot-required"
468
469
470 class UpdateManager(Gtk.Window):
471- """ This class is the main window and work flow controller. Panes will add
472- themselves to the main window and it will morph between them."""
473+ """ This class is the main window and work flow controller. The main
474+ window will show panes, and it will morph between them. """
475
476 def __init__(self, datadir, options):
477 Gtk.Window.__init__(self)
478@@ -82,16 +84,14 @@
479 # Basic GTK+ parameters
480 self.set_title(_("Software Updater"))
481 self.set_icon_name("system-software-update")
482- self.set_resizable(False)
483 self.set_position(Gtk.WindowPosition.CENTER)
484
485 # Keep window at a constant size
486 ctx = self.get_style_context()
487 ctx.connect("changed", lambda ctx: self.resize_to_standard_width())
488- self.resize_to_standard_width()
489
490 # Signals
491- self.connect("delete-event", self.close)
492+ self.connect("delete-event", self._on_close)
493
494 self._setup_dbus()
495
496@@ -110,6 +110,17 @@
497 self.options and self.options.devel_release,
498 self.options and self.options.use_proposed)
499
500+ def begin_user_resizable(self, stored_width=0, stored_height=0):
501+ self.set_resizable(True)
502+ if stored_width > 0 and stored_height > 0:
503+ # There is a race here. If we immediately resize, it often doesn't
504+ # take. Using idle_add helps, but we *still* occasionally don't
505+ # restore the size correctly. Help needed to track this down!
506+ GLib.idle_add(lambda: self.resize(stored_width, stored_height))
507+
508+ def end_user_resizable(self):
509+ self.set_resizable(False)
510+
511 def resize_to_standard_width(self):
512 if self.get_resizable():
513 return # only size to a specific em if we are a static size
514@@ -130,56 +141,77 @@
515 self.disconnect(self.initial_focus_id)
516 return False
517
518- def push(self, pane, controller):
519- child = self.get_child()
520- if child is not None:
521- if self.controller and hasattr(self.controller, "save_state"):
522- self.controller.save_state()
523- child.destroy()
524+ def _start_pane(self, pane):
525+ if self.controller is not None:
526+ self.controller.stop()
527+ if isinstance(self.controller, Gtk.Widget):
528+ self.controller.destroy()
529+
530+ self.controller = pane
531+ self._look_ready()
532+ self.end_user_resizable()
533
534 if pane is None:
535- self.controller = None
536 return
537
538- pane.reparent(self)
539- self.controller = controller
540-
541- # Reset state
542- self.set_resizable(False)
543- self.resize_to_standard_width()
544- self.set_sensitive(True)
545- if self.get_window() is not None:
546- self.get_window().set_cursor(None)
547- self.get_window().set_functions(Gdk.WMFunction.ALL)
548-
549- if self.controller and hasattr(self.controller, "restore_state"):
550- self.controller.restore_state()
551-
552- pane.show()
553- self.show()
554-
555- def close(self, widget, data=None):
556+ if isinstance(pane, Gtk.Widget):
557+ self.add(pane)
558+ pane.start()
559+ self.show_all()
560+ else:
561+ pane.start()
562+ self.hide()
563+
564+ def _on_close(self, widget, data=None):
565+ self.close()
566+
567+ def close(self):
568 if not self.get_sensitive():
569 return True
570
571- if self.controller and hasattr(self.controller, "close"):
572- # let controller handle it as they will
573- if self.controller.close():
574- return
575-
576+ controller_close = self.controller.close()
577+ if controller_close:
578+ return controller_close
579 self.exit()
580
581 def exit(self):
582 """ exit the application, save the state """
583- self.push(None, None)
584+ self._start_pane(None)
585 sys.exit(0)
586
587+ def show_settings(self):
588+ try:
589+ apt_pkg.pkgsystem_unlock()
590+ except SystemError:
591+ pass
592+ cmd = ["/usr/bin/software-properties-gtk",
593+ "--open-tab", "2",
594+ "--toplevel", "%s" % self.get_window().get_xid()
595+ ]
596+ self._look_busy()
597+ try:
598+ p = subprocess.Popen(cmd)
599+ except OSError:
600+ pass
601+ else:
602+ while p.poll() is None:
603+ while Gtk.events_pending():
604+ Gtk.main_iteration()
605+ time.sleep(0.05)
606+ finally:
607+ self.start_available()
608+
609 def start_update(self):
610 if self.options.no_update:
611 self.start_available()
612 return
613
614- self._start_pane(UpdateProgress(self))
615+ update_backend = get_backend(self, InstallBackend.ACTION_UPDATE)
616+ self._start_pane(update_backend)
617+
618+ def start_install(self):
619+ install_backend = get_backend(self, InstallBackend.ACTION_INSTALL)
620+ self._start_pane(install_backend)
621
622 def start_available(self, cancelled_update=False, error_occurred=False):
623 self._look_busy()
624@@ -214,24 +246,23 @@
625 "a previous check.")
626 return UpdatesAvailable(self, header, desc)
627
628- def start_install(self):
629- self._start_pane(InstallProgress(self))
630-
631 def start_error(self, is_update_error, header, desc):
632 if is_update_error:
633 self._start_pane(UpdateErrorDialog(self, header, desc))
634 else:
635 self._start_pane(ErrorDialog(self, header, desc))
636
637- def _start_pane(self, pane):
638- self._look_busy()
639- pane.main()
640-
641 def _look_busy(self):
642 self.set_sensitive(False)
643 if self.get_window() is not None:
644 self.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH))
645
646+ def _look_ready(self):
647+ self.set_sensitive(True)
648+ if self.get_window() is not None:
649+ self.get_window().set_cursor(None)
650+ self.get_window().set_functions(Gdk.WMFunction.ALL)
651+
652 def _check_meta_release(self):
653 if self.meta_release is None:
654 return None
655
656=== removed file 'UpdateManager/UpdateProgress.py'
657--- UpdateManager/UpdateProgress.py 2012-12-13 20:39:37 +0000
658+++ UpdateManager/UpdateProgress.py 1970-01-01 00:00:00 +0000
659@@ -1,81 +0,0 @@
660-# UpdateProgress.py
661-# -*- Mode: Python; indent-tabs-mode: nil; tab-width: 4; coding: utf-8 -*-
662-#
663-# Copyright (c) 2004-2012 Canonical
664-# 2004 Michiel Sikkes
665-# 2005 Martin Willemoes Hansen
666-# 2010 Mohamed Amine IL Idrissi
667-#
668-# Author: Michiel Sikkes <michiel@eyesopened.nl>
669-# Michael Vogt <mvo@debian.org>
670-# Martin Willemoes Hansen <mwh@sysrq.dk>
671-# Mohamed Amine IL Idrissi <ilidrissiamine@gmail.com>
672-# Alex Launi <alex.launi@canonical.com>
673-# Michael Terry <michael.terry@canonical.com>
674-#
675-# This program is free software; you can redistribute it and/or
676-# modify it under the terms of the GNU General Public License as
677-# published by the Free Software Foundation; either version 2 of the
678-# License, or (at your option) any later version.
679-#
680-# This program is distributed in the hope that it will be useful,
681-# but WITHOUT ANY WARRANTY; without even the implied warranty of
682-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
683-# GNU General Public License for more details.
684-#
685-# You should have received a copy of the GNU General Public License
686-# along with this program; if not, write to the Free Software
687-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
688-# USA
689-
690-from __future__ import absolute_import, print_function
691-
692-import warnings
693-warnings.filterwarnings("ignore", "Accessed deprecated property",
694- DeprecationWarning)
695-
696-import os
697-
698-from .backend import get_backend
699-
700-from .Core.utils import inhibit_sleep, allow_sleep
701-
702-
703-class UpdateProgress(object):
704-
705- def __init__(self, app):
706- self.window_main = app
707- self.datadir = app.datadir
708- self.options = app.options
709-
710- # Used for inhibiting power management
711- self.sleep_cookie = None
712- self.sleep_dev = None
713-
714- # get the install backend
715- self.install_backend = get_backend(self.datadir, self.window_main)
716- self.install_backend.connect("action-done", self._on_backend_done)
717-
718- def invoke_manager(self):
719- # don't display apt-listchanges
720- os.environ["APT_LISTCHANGES_FRONTEND"] = "none"
721-
722- # Do not suspend during the update process
723- (self.sleep_dev, self.sleep_cookie) = inhibit_sleep()
724-
725- self.install_backend.update()
726-
727- def _on_backend_done(self, backend, action, authorized, success,
728- error_string, error_desc):
729- # Allow suspend after synaptic is finished
730- if self.sleep_cookie:
731- allow_sleep(self.sleep_dev, self.sleep_cookie)
732- self.sleep_cookie = self.sleep_dev = None
733-
734- if error_string:
735- self.window_main.start_error(True, error_string, error_desc)
736- else:
737- self.window_main.start_available(not success)
738-
739- def main(self):
740- self.invoke_manager()
741
742=== modified file 'UpdateManager/UpdatesAvailable.py'
743--- UpdateManager/UpdatesAvailable.py 2013-03-05 18:02:34 +0000
744+++ UpdateManager/UpdatesAvailable.py 2013-05-21 05:43:25 +0000
745@@ -48,22 +48,20 @@
746 import os
747 import re
748 import logging
749-import subprocess
750 import time
751 import threading
752
753 from gettext import gettext as _
754 from gettext import ngettext
755
756-
757 from .Core.utils import humanize_size
758 from .Core.AlertWatcher import AlertWatcher
759 from .Core.UpdateList import UpdateSystemGroup
760+from .Dialogs import InternalDialog
761
762 from DistUpgrade.DistUpgradeCache import NotEnoughFreeSpaceError
763
764 from .ChangelogViewer import ChangelogViewer
765-from .SimpleGtkbuilderApp import SimpleGtkbuilderApp
766 from .UnitySupport import UnitySupport
767
768
769@@ -205,40 +203,52 @@
770 return cell_start
771
772
773-class UpdatesAvailable(SimpleGtkbuilderApp):
774+class UpdatesAvailable(InternalDialog):
775 APP_INSTALL_ICONS_PATH = "/usr/share/app-install/icons"
776
777- def __init__(self, app, header=None, desc=None):
778- self.window_main = app
779- self.datadir = app.datadir
780- self.options = app.options
781- self.cache = app.cache
782- self.list = app.update_list
783- SimpleGtkbuilderApp.__init__(
784- self,
785- self.datadir + "/gtkbuilder/UpdateManager.ui",
786- "update-manager")
787+ def __init__(self, window_main, header=None, desc=None):
788+ InternalDialog.__init__(self, window_main)
789+
790+ self.window_main = window_main
791+ self.datadir = window_main.datadir
792+ self.cache = window_main.cache
793+
794+ self.custom_header = header
795+ self.custom_desc = desc
796+
797+ content_ui_path = os.path.join(self.datadir, "gtkbuilder/UpdateManager.ui")
798+ self._load_ui(content_ui_path, "pane_updates_available")
799+ self.set_content_widget(self.pane_updates_available)
800+
801+ self.dl_size = 0
802+ self.connected = True
803
804 # Used for inhibiting power management
805 self.sleep_cookie = None
806 self.sleep_dev = None
807
808- # workaround for LP: #945536
809- self.clearing_store = False
810-
811- self.custom_header = header
812- self.custom_desc = desc
813-
814- self.button_close.grab_focus()
815- self.dl_size = 0
816- self.connected = True
817-
818 self.settings = Gio.Settings("com.ubuntu.update-manager")
819
820 # Special icon theme for looking up app-install-data icons
821 self.app_icons = Gtk.IconTheme()
822 self.app_icons.append_search_path(self.APP_INSTALL_ICONS_PATH)
823
824+ # Create Unity launcher quicklist
825+ # FIXME: instead of passing parent we really should just send signals
826+ self.unity = UnitySupport(parent=self)
827+
828+ # setup the help viewer and disable the help button if there
829+ # is no viewer available
830+ #self.help_viewer = HelpViewer("update-manager")
831+ #if self.help_viewer.check() == False:
832+ # self.button_help.set_sensitive(False)
833+
834+ self.add_settings_button()
835+ self.button_close = self.add_button(Gtk.STOCK_CANCEL, self.window_main.close)
836+ self.button_install = self.add_button(_("Install Now"),
837+ self.on_button_install_clicked)
838+ self.focus_button = self.button_install
839+
840 # create text view
841 self.textview_changes = ChangelogViewer()
842 self.textview_changes.show()
843@@ -246,27 +256,9 @@
844 changes_buffer = self.textview_changes.get_buffer()
845 changes_buffer.create_tag("versiontag", weight=Pango.Weight.BOLD)
846
847- # expander
848- self.expander_details.set_expanded(
849- self.settings.get_boolean("show-details"))
850- self.expander_details.connect("activate", self.pre_activate_details)
851- self.expander_details.connect("notify::expanded",
852- self.activate_details)
853- self.expander_desc.connect("notify::expanded", self.activate_desc)
854-
855- # useful exit stuff
856- self.button_close.connect("clicked", lambda w: self.window_main.exit())
857-
858- # If auto-updates are on, change cancel label
859- self.notifier_settings = Gio.Settings("com.ubuntu.update-notifier")
860- self.notifier_settings.connect(
861- "changed::auto-launch",
862- lambda s, p: self.update_close_button())
863- self.update_close_button()
864-
865 # the treeview (move into it's own code!)
866 self.store = Gtk.TreeStore(str, GObject.TYPE_PYOBJECT, str, bool)
867- self.treeview_update.set_model(self.store)
868+ self.treeview_update.set_model(None)
869
870 restart_icon_renderer = Gtk.CellRendererPixbuf()
871 restart_icon_renderer.set_property("xpad", 4)
872@@ -280,9 +272,9 @@
873 restart_column.set_cell_data_func(restart_icon_renderer,
874 self.restart_icon_renderer_data_func)
875
876- pkg_area = CellAreaPackage(bool(self.list.security_groups))
877- pkg_column = Gtk.TreeViewColumn.new_with_area(pkg_area)
878- pkg_area.column = pkg_column
879+ self.pkg_cell_area = CellAreaPackage(False)
880+ pkg_column = Gtk.TreeViewColumn.new_with_area(self.pkg_cell_area)
881+ self.pkg_cell_area.column = pkg_column
882 pkg_column.set_title(_("Install"))
883 pkg_column.set_property("spacing", 4)
884 pkg_column.set_expand(True)
885@@ -331,24 +323,26 @@
886 self.treeview_update.connect("button-press-event",
887 self.on_treeview_button_press)
888
889- # setup the help viewer and disable the help button if there
890- # is no viewer available
891- #self.help_viewer = HelpViewer("update-manager")
892- #if self.help_viewer.check() == False:
893- # self.button_help.set_sensitive(False)
894-
895- if not os.path.exists("/usr/bin/software-properties-gtk"):
896- self.button_settings.set_sensitive(False)
897-
898 # init show version
899 self.show_versions = self.settings.get_boolean("show-versions")
900 # init summary_before_name
901 self.summary_before_name = self.settings.get_boolean(
902 "summary-before-name")
903
904- # Create Unity launcher quicklist
905- # FIXME: instead of passing parent we really should just send signals
906- self.unity = UnitySupport(parent=self)
907+ # expander
908+ self.expander_details.set_expanded(
909+ self.settings.get_boolean("show-details"))
910+ self.expander_details.connect("activate", self.pre_activate_details)
911+ self.expander_details.connect("notify::expanded",
912+ self.activate_details)
913+ self.expander_desc.connect("notify::expanded", self.activate_desc)
914+
915+ # If auto-updates are on, change cancel label
916+ self.notifier_settings = Gio.Settings("com.ubuntu.update-notifier")
917+ self.notifier_settings.connect(
918+ "changed::auto-launch",
919+ lambda s, p: self.update_close_button())
920+ self.update_close_button()
921
922 # Alert watcher
923 self.alert_watcher = AlertWatcher()
924@@ -357,6 +351,16 @@
925 self.alert_watcher.connect("network-3g-alert",
926 self._on_network_3g_alert)
927
928+ def stop(self):
929+ InternalDialog.stop(self)
930+ self._save_state()
931+
932+ def start(self):
933+ InternalDialog.start(self)
934+ self.set_update_list(self.window_main.update_list)
935+ self.alert_watcher.check_alert_state()
936+ self._restore_state()
937+
938 def is_auto_update(self):
939 update_days = apt_pkg.config.find_i(
940 "APT::Periodic::Update-Package-Lists")
941@@ -378,22 +382,25 @@
942 self.on_button_install_clicked(None)
943
944 def restart_icon_renderer_data_func(self, cell_layout, renderer, model,
945- iter, data):
946+ iter, user_data):
947 def pkg_requires_restart(pkg):
948- restart_condition = pkg.candidate.record.get('XB-Restart-Required')
949+ if pkg is None or pkg.candidate is None:
950+ return False
951+ restart_condition = pkg.candidate.record.get(
952+ 'XB-Restart-Required')
953 return restart_condition == 'system'
954
955 data = model.get_value(iter, LIST_UPDATE_DATA)
956 path = model.get_path(iter)
957
958 requires_restart = False
959- if data.item:
960+ if data.item and data.item.pkg:
961 requires_restart = pkg_requires_restart(data.item.pkg)
962 elif data.group:
963 if not self.treeview_update.row_expanded(path):
964 # A package in the group requires restart
965 for group_item in data.group.items:
966- if pkg_requires_restart(group_item.pkg):
967+ if group_item.pkg and pkg_requires_restart(group_item.pkg):
968 requires_restart = True
969 break
970
971@@ -408,8 +415,8 @@
972 gicon = None
973 renderer.set_property("gicon", gicon)
974
975- def pkg_toggle_renderer_data_func(self, cell_layout, renderer, model, iter,
976- data):
977+ def pkg_toggle_renderer_data_func(self, cell_layout, renderer, model,
978+ iter, user_data):
979 data = model.get_value(iter, LIST_UPDATE_DATA)
980
981 activatable = False
982@@ -439,8 +446,8 @@
983 renderer.set_property("activatable", activatable)
984 renderer.set_property("inconsistent", inconsistent)
985
986- def pkg_icon_renderer_data_func(self, cell_layout, renderer, model, iter,
987- data):
988+ def pkg_icon_renderer_data_func(self, cell_layout, renderer, model,
989+ iter, user_data):
990 data = model.get_value(iter, LIST_UPDATE_DATA)
991
992 gicon = None
993@@ -466,8 +473,8 @@
994 else:
995 return icon # Assume it's in one of the user's themes
996
997- def pkg_label_renderer_data_func(self, cell_layout, renderer, model, iter,
998- data):
999+ def pkg_label_renderer_data_func(self, cell_layout, renderer, model,
1000+ iter, user_data):
1001 data = model.get_value(iter, LIST_UPDATE_DATA)
1002 name = GLib.markup_escape_text(model.get_value(iter, LIST_NAME))
1003
1004@@ -742,6 +749,9 @@
1005
1006 if self.custom_header is not None:
1007 text_header = self.custom_header
1008+ if self.custom_desc is not None:
1009+ text_desc = self.custom_desc
1010+
1011 # show different text on first run (UX team suggestion)
1012 elif self.settings.get_boolean("first-run"):
1013 flavor = self.window_main.meta_release.flavor_name
1014@@ -754,19 +764,10 @@
1015 text_header = _("Updated software is available for this "
1016 "computer. Do you want to install it now?")
1017
1018- if self.custom_desc is not None:
1019- text_desc = self.custom_desc
1020-
1021 self.notebook_details.set_sensitive(True)
1022 self.treeview_update.set_sensitive(True)
1023- self.button_install.grab_default()
1024- self.label_header.set_label(text_header)
1025-
1026- if text_desc is not None:
1027- self.label_desc.set_label(text_desc)
1028- self.label_desc.show()
1029- else:
1030- self.label_desc.hide()
1031+ self.set_header(text_header)
1032+ self.set_desc(text_desc)
1033
1034 return True
1035
1036@@ -774,47 +775,20 @@
1037 def pre_activate_details(self, expander):
1038 expanded = self.expander_details.get_expanded()
1039 if expanded:
1040- self.save_state()
1041+ self._save_state()
1042
1043 def activate_details(self, expander, data):
1044 expanded = self.expander_details.get_expanded()
1045 self.settings.set_boolean("show-details", expanded)
1046 if expanded:
1047 self.on_treeview_update_cursor_changed(self.treeview_update)
1048- self.restore_state()
1049+ self._restore_state()
1050
1051 def activate_desc(self, expander, data):
1052 expanded = self.expander_desc.get_expanded()
1053 self.expander_desc.set_vexpand(expanded)
1054
1055- #def on_button_help_clicked(self, widget):
1056- # self.help_viewer.run()
1057-
1058- def on_button_settings_clicked(self, widget):
1059- #print("on_button_settings_clicked")
1060- try:
1061- apt_pkg.pkgsystem_unlock()
1062- except SystemError:
1063- pass
1064- cmd = ["/usr/bin/software-properties-gtk",
1065- "--open-tab", "2",
1066- # FIXME: once get_xid() is available via introspections, add
1067- # this back
1068- #"--toplevel", "%s" % self.window_main.get_window().get_xid()
1069- ]
1070- self.window_main.set_sensitive(False)
1071- p = subprocess.Popen(cmd)
1072- while p.poll() is None:
1073- while Gtk.events_pending():
1074- Gtk.main_iteration()
1075- time.sleep(0.05)
1076- apt_pkg.init_config()
1077- self.window_main.refresh_cache()
1078- self.fillstore()
1079- self.update_close_button()
1080- self.window_main.set_sensitive(True)
1081-
1082- def on_button_install_clicked(self, widget):
1083+ def on_button_install_clicked(self):
1084 self.unity.set_install_menuitem_visible(False)
1085 #print("on_button_install_clicked")
1086 err_sum = _("Not enough free disk space")
1087@@ -930,24 +904,22 @@
1088 del actiongroup
1089 self.setBusy(False)
1090
1091- def save_state(self):
1092+ def _save_state(self):
1093 """ save the state (window-size for now) """
1094 if self.expander_details.get_expanded():
1095 (w, h) = self.window_main.get_size()
1096 self.settings.set_int("window-width", w)
1097 self.settings.set_int("window-height", h)
1098
1099- def restore_state(self):
1100+ def _restore_state(self):
1101 """ restore the state (window-size for now) """
1102 w = self.settings.get_int("window-width")
1103 h = self.settings.get_int("window-height")
1104 expanded = self.expander_details.get_expanded()
1105- self.window_main.set_resizable(expanded)
1106- if w > 0 and h > 0 and expanded:
1107- # There is a race here. If we immediately resize, it often doesn't
1108- # take. Using idle_add helps, but we *still* occasionally don't
1109- # restore the size correctly. Help needed to track this down!
1110- GLib.idle_add(lambda: self.window_main.resize(w, h))
1111+ if expanded:
1112+ self.window_main.begin_user_resizable(w, h)
1113+ else:
1114+ self.window_main.end_user_resizable()
1115 return False
1116
1117 def _add_header(self, name, groups):
1118@@ -996,7 +968,9 @@
1119 ]
1120 self.store.append(group_iter, item_row)
1121
1122- def fillstore(self):
1123+ def set_update_list(self, update_list):
1124+ self.list = update_list
1125+
1126 # use the watch cursor
1127 self.setBusy(True)
1128 # disconnect the view first
1129@@ -1017,14 +991,11 @@
1130 self._add_groups(self.list.update_groups)
1131
1132 self.treeview_update.set_model(self.store)
1133+ self.pkg_cell_area.indent_toplevel = bool(self.list.security_groups)
1134+ self.update_close_button()
1135 self.update_count()
1136 self.setBusy(False)
1137 while Gtk.events_pending():
1138 Gtk.main_iteration()
1139 self.updates_changed()
1140 return False
1141-
1142- def main(self):
1143- self.window_main.push(self.pane_updates_available, self)
1144- self.fillstore()
1145- self.alert_watcher.check_alert_state()
1146
1147=== modified file 'UpdateManager/backend/InstallBackendAptdaemon.py'
1148--- UpdateManager/backend/InstallBackendAptdaemon.py 2013-02-06 21:12:16 +0000
1149+++ UpdateManager/backend/InstallBackendAptdaemon.py 2013-05-21 05:43:25 +0000
1150@@ -24,20 +24,25 @@
1151
1152 from UpdateManager.backend import InstallBackend
1153 from UpdateManager.UnitySupport import UnitySupport
1154+from UpdateManager.Dialogs import BuilderDialog
1155
1156 from gettext import gettext as _
1157
1158 import apt
1159 import dbus
1160-import sys
1161-
1162-
1163-class InstallBackendAptdaemon(InstallBackend):
1164-
1165+import os
1166+
1167+
1168+class InstallBackendAptdaemon(InstallBackend, BuilderDialog):
1169 """Makes use of aptdaemon to refresh the cache and to install updates."""
1170
1171- def __init__(self, datadir, window_main):
1172- InstallBackend.__init__(self, datadir, window_main)
1173+ def __init__(self, window_main, action):
1174+ InstallBackend.__init__(self, window_main, action)
1175+ ui_path = os.path.join(window_main.datadir,
1176+ "gtkbuilder/UpdateProgress.ui")
1177+ BuilderDialog.__init__(self, window_main, ui_path,
1178+ "pane_update_progress")
1179+
1180 self.client = client.AptClient()
1181 self.unity = UnitySupport()
1182 self._expanded_size = None
1183@@ -59,17 +64,20 @@
1184 pass
1185 try:
1186 trans = yield self.client.update_cache(defer=True)
1187- yield self._run_in_dialog(trans, self.UPDATE,
1188- _("Checking for updates…"),
1189- False, False)
1190+ yield self._show_transaction(trans, self.ACTION_UPDATE,
1191+ _("Checking for updates…"), False)
1192 except errors.NotAuthorizedError:
1193- self.emit("action-done", self.UPDATE, False, False, None, None)
1194+ self._action_done(self.ACTION_UPDATE,
1195+ authorized=False, success=False,
1196+ error_string=None, error_desc=None)
1197 except:
1198- self.emit("action-done", self.UPDATE, True, False, None, None)
1199+ self._action_done(self.ACTION_UPDATE,
1200+ authorized=True, success=False,
1201+ error_string=None, error_desc=None)
1202 raise
1203
1204 @inline_callbacks
1205- def commit(self, pkgs_install, pkgs_upgrade, close_on_done):
1206+ def commit(self, pkgs_install, pkgs_upgrade):
1207 """Commit a list of package adds and removes"""
1208 try:
1209 apt.apt_pkg.pkgsystem_unlock()
1210@@ -81,18 +89,23 @@
1211 pkgs_install, reinstall, remove, purge, pkgs_upgrade,
1212 downgrade, defer=True)
1213 trans.connect("progress-changed", self._on_progress_changed)
1214- yield self._run_in_dialog(trans, self.INSTALL,
1215- _("Installing updates…"),
1216- True, close_on_done)
1217+ yield self._show_transaction(trans, self.ACTION_INSTALL,
1218+ _("Installing updates…"), True)
1219 except errors.NotAuthorizedError as e:
1220- self.emit("action-done", self.INSTALL, False, False, None, None)
1221+ self._action_done(self.ACTION_INSTALL,
1222+ authorized=False, success=False,
1223+ error_string=None, error_desc=None)
1224 except dbus.DBusException as e:
1225 #print(e, e.get_dbus_name())
1226 if e.get_dbus_name() != "org.freedesktop.DBus.Error.NoReply":
1227 raise
1228- self.emit("action-done", self.INSTALL, False, False, None, None)
1229+ self._action_done(self.ACTION_INSTALL,
1230+ authorized=False, success=False,
1231+ error_string=None, error_desc=None)
1232 except Exception as e:
1233- self.emit("action-done", self.INSTALL, True, False, None, None)
1234+ self._action_done(self.ACTION_INSTALL,
1235+ authorized=True, success=False,
1236+ error_string=None, error_desc=None)
1237 raise
1238
1239 def _on_progress_changed(self, trans, progress):
1240@@ -111,28 +124,18 @@
1241 self._resize_to_show_details(expander)
1242
1243 @inline_callbacks
1244- def _run_in_dialog(self, trans, action, header, show_details,
1245- close_on_done):
1246- builder = Gtk.Builder()
1247- builder.set_translation_domain("update-manager")
1248- builder.add_from_file(self.datadir + "/gtkbuilder/UpdateProgress.ui")
1249-
1250- label_header = builder.get_object("label_header")
1251- label_header.set_label(header)
1252+ def _show_transaction(self, trans, action, header, show_details):
1253+ self.label_header.set_label(header)
1254
1255 progressbar = AptProgressBar(trans)
1256 progressbar.show()
1257- progressbar_slot = builder.get_object("progressbar_slot")
1258- progressbar_slot.add(progressbar)
1259+ self.progressbar_slot.add(progressbar)
1260
1261 self.button_cancel = AptCancelButton(trans)
1262- if action == self.UPDATE:
1263+ if action == self.ACTION_UPDATE:
1264 self.button_cancel.set_label(Gtk.STOCK_STOP)
1265 self.button_cancel.show()
1266- button_cancel_slot = builder.get_object("button_cancel_slot")
1267- button_cancel_slot.add(self.button_cancel)
1268-
1269- label_details = builder.get_object("label_details")
1270+ self.button_cancel_slot.add(self.button_cancel)
1271
1272 if show_details:
1273 expander = AptDetailsExpander(trans)
1274@@ -140,39 +143,30 @@
1275 expander.set_hexpand(True)
1276 expander.show_all()
1277 expander.connect("notify::expanded", self._on_expanded)
1278- expander_slot = builder.get_object("expander_slot")
1279- expander_slot.add(expander)
1280- expander_slot.show()
1281+ self.expander_slot.add(expander)
1282+ self.expander_slot.show()
1283 else:
1284 expander = None
1285
1286 trans.connect("status-details-changed", self._on_details_changed,
1287- label_details)
1288- trans.connect("status-changed", self._on_status_changed, label_details,
1289+ self.label_details)
1290+ trans.connect("status-changed", self._on_status_changed, self.label_details,
1291 expander)
1292- trans.connect("finished", self._on_finished, action, close_on_done)
1293+ trans.connect("finished", self._on_finished, action)
1294 trans.connect("medium-required", self._on_medium_required)
1295 trans.connect("config-file-conflict", self._on_config_file_conflict)
1296
1297 yield trans.set_debconf_frontend("gnome")
1298 yield trans.run()
1299
1300- self.window_main.push(builder.get_object("pane_update_progress"),
1301- self)
1302-
1303- self.window_main.get_window().set_functions(Gdk.WMFunction.MOVE |
1304- Gdk.WMFunction.RESIZE |
1305- Gdk.WMFunction.MINIMIZE)
1306-
1307 def _on_expanded(self, expander, param):
1308 # Make the dialog resizable if the expander is expanded
1309 # try to restore a previous size
1310 if not expander.get_expanded():
1311 self._expanded_size = (expander.terminal.get_visible(),
1312 self.window_main.get_size())
1313- self.window_main.set_resizable(False)
1314+ self.window_main.end_user_resizable()
1315 elif self._expanded_size:
1316- self.window_main.set_resizable(True)
1317 term_visible, (stored_width, stored_height) = self._expanded_size
1318 # Check if the stored size was for the download details or
1319 # the terminal widget
1320@@ -181,9 +175,8 @@
1321 # get a new size for the terminal widget
1322 self._resize_to_show_details(expander)
1323 else:
1324- self.window_main.resize(stored_width, stored_height)
1325+ self.window_main.begin_user_resizable(stored_width, stored_height)
1326 else:
1327- self.window_main.set_resizable(True)
1328 self._resize_to_show_details(expander)
1329
1330 def _resize_to_show_details(self, expander):
1331@@ -195,16 +188,19 @@
1332 If the expander is expanded afterwards the window won't change its
1333 size anymore. So we have to do this manually. See LP#840942
1334 """
1335- win_width, win_height = self.window_main.get_size()
1336- exp_width = expander.get_allocation().width
1337- exp_height = expander.get_allocation().height
1338- if expander.terminal.get_visible():
1339- terminal_width = expander.terminal.get_char_width() * 80
1340- terminal_height = expander.terminal.get_char_height() * 24
1341- self.window_main.resize(terminal_width - exp_width + win_width,
1342- terminal_height - exp_height + win_height)
1343- else:
1344- self.window_main.resize(win_width + 100, win_height + 200)
1345+ if expander.get_expanded():
1346+ win_width, win_height = self.window_main.get_size()
1347+ exp_width = expander.get_allocation().width
1348+ exp_height = expander.get_allocation().height
1349+ if expander.terminal.get_visible():
1350+ terminal_width = expander.terminal.get_char_width() * 80
1351+ terminal_height = expander.terminal.get_char_height() * 24
1352+ new_width = terminal_width - exp_width + win_width
1353+ new_height = terminal_height - exp_height + win_height
1354+ else:
1355+ new_width = win_width + 100
1356+ new_height = win_height + 200
1357+ self.window_main.begin_user_resizable(new_width, new_height)
1358
1359 def _on_medium_required(self, transaction, medium, drive):
1360 dialog = AptMediumRequiredDialog(medium, drive, self.window_main)
1361@@ -224,18 +220,19 @@
1362 else:
1363 transaction.resolve_config_file_conflict(old, "keep")
1364
1365- def _on_finished(self, trans, status, action, close_on_done):
1366+ def _on_finished(self, trans, status, action):
1367 error_string = None
1368 error_desc = None
1369 if status == EXIT_FAILED:
1370 error_string = get_error_string_from_enum(trans.error.code)
1371 error_desc = get_error_description_from_enum(trans.error.code)
1372- elif status == EXIT_SUCCESS and close_on_done:
1373- sys.exit(0)
1374 # tell unity to hide the progress again
1375 self.unity.set_progress(-1)
1376- self.emit("action-done", action, True, status == EXIT_SUCCESS,
1377- error_string, error_desc)
1378+ is_success = (status == EXIT_SUCCESS)
1379+ self._action_done(action,
1380+ authorized=True, success=is_success,
1381+ error_string=error_string, error_desc=error_desc)
1382+
1383
1384 if __name__ == "__main__":
1385 b = InstallBackendAptdaemon(None)
1386
1387=== modified file 'UpdateManager/backend/InstallBackendSynaptic.py'
1388--- UpdateManager/backend/InstallBackendSynaptic.py 2012-12-13 20:39:37 +0000
1389+++ UpdateManager/backend/InstallBackendSynaptic.py 2013-05-21 05:43:25 +0000
1390@@ -8,13 +8,43 @@
1391 from gettext import gettext as _
1392
1393 from gi.repository import GObject
1394+# Extra GdkX11 import for pygobject bug #673396
1395+# https://bugzilla.gnome.org/show_bug.cgi?id=673396
1396+from gi.repository import GdkX11
1397
1398 from UpdateManager.backend import InstallBackend
1399+from UpdateManager.Dialogs import Dialog
1400
1401
1402 class InstallBackendSynaptic(InstallBackend):
1403 """ Install backend based on synaptic """
1404
1405+ def update(self):
1406+ opt = ["--update-at-startup"]
1407+ tempf = None
1408+ self._run_synaptic(self.ACTION_UPDATE, opt, tempf)
1409+
1410+ def commit(self, pkgs_install, pkgs_upgrade, close_on_done=False):
1411+ # close when update was successful (its ok to use a Synaptic::
1412+ # option here, it will not get auto-saved, because synaptic does
1413+ # not save options in non-interactive mode)
1414+ opt = []
1415+ if close_on_done:
1416+ opt.append("-o")
1417+ opt.append("Synaptic::closeZvt=true")
1418+ # custom progress strings
1419+ opt.append("--progress-str")
1420+ opt.append("%s" % _("Please wait, this can take some time."))
1421+ opt.append("--finish-str")
1422+ opt.append("%s" % _("Update is complete"))
1423+ tempf = tempfile.NamedTemporaryFile(mode="w+")
1424+ for pkg_name in pkgs_install + pkgs_upgrade:
1425+ tempf.write("%s\tinstall\n" % pkg_name)
1426+ opt.append("--set-selections-file")
1427+ opt.append("%s" % tempf.name)
1428+ tempf.flush()
1429+ self._run_synaptic(self.ACTION_INSTALL, opt, tempf)
1430+
1431 def _run_synaptic(self, action, opt, tempf):
1432 """Execute synaptic."""
1433 try:
1434@@ -42,31 +72,7 @@
1435 action, tempf = data
1436 if tempf:
1437 tempf.close()
1438- self.emit("action-done", action, True, os.WEXITSTATUS(condition) == 0,
1439- None, None)
1440-
1441- def update(self):
1442- opt = ["--update-at-startup"]
1443- tempf = None
1444- self._run_synaptic(self.UPDATE, opt, tempf)
1445-
1446- def commit(self, pkgs_install, pkgs_upgrade, close_on_done):
1447- # close when update was successful (its ok to use a Synaptic::
1448- # option here, it will not get auto-saved, because synaptic does
1449- # not save options in non-interactive mode)
1450- opt = []
1451- if close_on_done:
1452- opt.append("-o")
1453- opt.append("Synaptic::closeZvt=true")
1454- # custom progress strings
1455- opt.append("--progress-str")
1456- opt.append("%s" % _("Please wait, this can take some time."))
1457- opt.append("--finish-str")
1458- opt.append("%s" % _("Update is complete"))
1459- tempf = tempfile.NamedTemporaryFile(mode="w+")
1460- for pkg_name in pkgs_install + pkgs_upgrade:
1461- tempf.write("%s\tinstall\n" % pkg_name)
1462- opt.append("--set-selections-file")
1463- opt.append("%s" % tempf.name)
1464- tempf.flush()
1465- self._run_synaptic(self.INSTALL, opt, tempf)
1466+ self._action_done(action,
1467+ authorized=True,
1468+ success=os.WEXITSTATUS(condition) == 0,
1469+ error_string=None, error_desc=None)
1470
1471=== modified file 'UpdateManager/backend/__init__.py'
1472--- UpdateManager/backend/__init__.py 2012-12-13 20:39:37 +0000
1473+++ UpdateManager/backend/__init__.py 2013-05-21 05:43:25 +0000
1474@@ -7,41 +7,79 @@
1475 from __future__ import absolute_import
1476
1477 import os
1478+import sys
1479
1480 from gi.repository import GObject
1481-
1482-
1483-class InstallBackend(GObject.GObject):
1484- """The abstract backend that can install/remove packages"""
1485-
1486- __gsignals__ = {"action-done": (GObject.SignalFlags.RUN_FIRST,
1487- None,
1488- (GObject.TYPE_INT, # action id
1489- GObject.TYPE_BOOLEAN, # authorized
1490- GObject.TYPE_BOOLEAN, # success
1491- GObject.TYPE_STRING, # error string
1492- GObject.TYPE_STRING) # error desc
1493- ),
1494- }
1495-
1496- (INSTALL, UPDATE) = range(2)
1497-
1498- def __init__(self, datadir, window_main):
1499- """init backend
1500- takes a gtk main window as parameter
1501- """
1502- GObject.GObject.__init__(self)
1503- self.datadir = datadir
1504- self.window_main = window_main
1505-
1506- def commit(self, pkgs_install, pkgs_upgrade, close_on_done):
1507- """Commit the cache changes """
1508- raise NotImplemented
1509+from UpdateManager.Core.utils import (inhibit_sleep,
1510+ allow_sleep)
1511+from UpdateManager.Dialogs import Dialog
1512+
1513+
1514+class InstallBackend(Dialog):
1515+ ACTION_UPDATE = 0
1516+ ACTION_INSTALL = 1
1517+
1518+ def __init__(self, window_main, action):
1519+ Dialog.__init__(self, window_main)
1520+ self.action = action
1521+ self.sleep_cookie = None
1522+ self.sleep_dev = None
1523+
1524+ def start(self):
1525+ os.environ["APT_LISTCHANGES_FRONTEND"] = "none"
1526+
1527+ # Do not suspend during the update process
1528+ (self.sleep_dev, self.sleep_cookie) = inhibit_sleep()
1529+
1530+ if self.action == self.ACTION_INSTALL:
1531+ # Get the packages which should be installed and update
1532+ pkgs_install = []
1533+ pkgs_upgrade = []
1534+ for pkg in self.window_main.cache:
1535+ if pkg.marked_install:
1536+ pkgs_install.append(pkg.name)
1537+ elif pkg.marked_upgrade:
1538+ pkgs_upgrade.append(pkg.name)
1539+ self.commit(pkgs_install, pkgs_upgrade)
1540+ else:
1541+ self.update()
1542
1543 def update(self):
1544 """Run a update to refresh the package list"""
1545 raise NotImplemented
1546
1547+ def commit(self, pkgs_install, pkgs_upgrade):
1548+ """Commit the cache changes """
1549+ raise NotImplemented
1550+
1551+ def _action_done(self, action, authorized, success, error_string,
1552+ error_desc):
1553+ # Allow suspend after update is finished
1554+ if self.sleep_cookie:
1555+ allow_sleep(self.sleep_dev, self.sleep_cookie)
1556+ self.sleep_cookie = self.sleep_dev = None
1557+
1558+ # If the progress dialog should be closed automatically afterwards
1559+ #settings = Gio.Settings("com.ubuntu.update-manager")
1560+ #close_after_install = settings.get_boolean(
1561+ # "autoclose-install-window")
1562+ # FIXME: confirm with mpt whether this should still be a setting
1563+ close_after_install = False
1564+
1565+ if action == self.ACTION_INSTALL:
1566+ if success:
1567+ self.window_main.start_available()
1568+ elif error_string:
1569+ self.window_main.start_error(False, error_string, error_desc)
1570+ else:
1571+ self.window_main.exit()
1572+ else:
1573+ if error_string:
1574+ self.window_main.start_error(True, error_string, error_desc)
1575+ else:
1576+ is_cancelled_update = not success
1577+ self.window_main.start_available(is_cancelled_update)
1578+
1579
1580 def get_backend(*args, **kwargs):
1581 """Select and return a package manager backend."""
1582
1583=== modified file 'data/gtkbuilder/Dialog.ui'
1584--- data/gtkbuilder/Dialog.ui 2013-01-25 16:41:01 +0000
1585+++ data/gtkbuilder/Dialog.ui 2013-05-21 05:43:25 +0000
1586@@ -1,36 +1,23 @@
1587 <?xml version="1.0" encoding="UTF-8"?>
1588 <interface>
1589 <!-- interface-requires gtk+ 3.0 -->
1590- <object class="GtkDialog" id="window_dialog">
1591+ <object class="GtkWindow" id="window_dialog">
1592 <property name="can_focus">False</property>
1593- <property name="type_hint">dialog</property>
1594- <child internal-child="vbox">
1595- <object class="GtkBox" id="dialog-vbox1">
1596+ <child>
1597+ <object class="GtkBox" id="pane_dialog">
1598+ <property name="visible">True</property>
1599 <property name="can_focus">False</property>
1600+ <property name="hexpand">True</property>
1601+ <property name="vexpand">True</property>
1602+ <property name="border_width">12</property>
1603 <property name="orientation">vertical</property>
1604- <child internal-child="action_area">
1605- <object class="GtkButtonBox" id="dialog-action_area1">
1606- <property name="can_focus">False</property>
1607- <property name="layout_style">end</property>
1608- <child>
1609- <placeholder/>
1610- </child>
1611- </object>
1612- <packing>
1613- <property name="expand">False</property>
1614- <property name="fill">True</property>
1615- <property name="pack_type">end</property>
1616- <property name="position">0</property>
1617- </packing>
1618- </child>
1619 <child>
1620- <object class="GtkGrid" id="pane_dialog">
1621+ <object class="GtkGrid" id="header_grid">
1622 <property name="visible">True</property>
1623 <property name="can_focus">False</property>
1624+ <property name="margin_bottom">12</property>
1625 <property name="hexpand">True</property>
1626- <property name="vexpand">True</property>
1627- <property name="border_width">12</property>
1628- <property name="row_spacing">12</property>
1629+ <property name="row_spacing">2</property>
1630 <property name="column_spacing">12</property>
1631 <child>
1632 <object class="GtkImage" id="image_logo">
1633@@ -44,23 +31,21 @@
1634 <property name="left_attach">0</property>
1635 <property name="top_attach">0</property>
1636 <property name="width">1</property>
1637- <property name="height">1</property>
1638+ <property name="height">2</property>
1639 </packing>
1640 </child>
1641 <child>
1642 <object class="GtkLabel" id="label_header">
1643- <property name="visible">True</property>
1644 <property name="can_focus">False</property>
1645+ <property name="no_show_all">True</property>
1646 <property name="margin_top">6</property>
1647 <property name="hexpand">True</property>
1648 <property name="xalign">0</property>
1649 <property name="yalign">0</property>
1650 <property name="wrap">True</property>
1651- <property name="width_chars">20</property>
1652 <property name="max_width_chars">20</property>
1653 <attributes>
1654 <attribute name="weight" value="bold"/>
1655- <attribute name="scale" value="1.25"/>
1656 </attributes>
1657 </object>
1658 <packing>
1659@@ -75,7 +60,6 @@
1660 <property name="can_focus">False</property>
1661 <property name="no_show_all">True</property>
1662 <property name="hexpand">True</property>
1663- <property name="vexpand">True</property>
1664 <property name="xalign">0</property>
1665 <property name="yalign">0</property>
1666 <property name="wrap">True</property>
1667@@ -88,37 +72,52 @@
1668 <property name="height">1</property>
1669 </packing>
1670 </child>
1671- <child>
1672- <object class="GtkButtonBox" id="buttonbox">
1673- <property name="visible">True</property>
1674- <property name="can_focus">False</property>
1675- <property name="valign">end</property>
1676- <property name="hexpand">True</property>
1677- <property name="vexpand">True</property>
1678- <property name="spacing">6</property>
1679- <property name="homogeneous">True</property>
1680- <property name="layout_style">end</property>
1681- <child>
1682- <placeholder/>
1683- </child>
1684- </object>
1685- <packing>
1686- <property name="left_attach">0</property>
1687- <property name="top_attach">2</property>
1688- <property name="width">2</property>
1689- <property name="height">1</property>
1690- </packing>
1691- </child>
1692+ </object>
1693+ <packing>
1694+ <property name="expand">False</property>
1695+ <property name="fill">True</property>
1696+ <property name="position">0</property>
1697+ </packing>
1698+ </child>
1699+ <child>
1700+ <object class="GtkBox" id="main_container">
1701+ <property name="can_focus">False</property>
1702+ <property name="no_show_all">True</property>
1703+ <property name="margin_bottom">12</property>
1704+ <property name="hexpand">True</property>
1705+ <property name="vexpand">True</property>
1706+ <property name="orientation">vertical</property>
1707 <child>
1708 <placeholder/>
1709 </child>
1710 </object>
1711 <packing>
1712- <property name="expand">False</property>
1713+ <property name="expand">True</property>
1714 <property name="fill">True</property>
1715+ <property name="padding">4</property>
1716 <property name="position">1</property>
1717 </packing>
1718 </child>
1719+ <child>
1720+ <object class="GtkButtonBox" id="buttonbox">
1721+ <property name="visible">True</property>
1722+ <property name="can_focus">False</property>
1723+ <property name="valign">end</property>
1724+ <property name="hexpand">True</property>
1725+ <property name="spacing">6</property>
1726+ <property name="homogeneous">True</property>
1727+ <property name="layout_style">end</property>
1728+ <child>
1729+ <placeholder/>
1730+ </child>
1731+ </object>
1732+ <packing>
1733+ <property name="expand">False</property>
1734+ <property name="fill">True</property>
1735+ <property name="pack_type">end</property>
1736+ <property name="position">2</property>
1737+ </packing>
1738+ </child>
1739 </object>
1740 </child>
1741 </object>
1742
1743=== modified file 'data/gtkbuilder/UpdateManager.ui'
1744--- data/gtkbuilder/UpdateManager.ui 2012-12-18 02:30:27 +0000
1745+++ data/gtkbuilder/UpdateManager.ui 2013-05-21 05:43:25 +0000
1746@@ -1,533 +1,365 @@
1747 <?xml version="1.0" encoding="UTF-8"?>
1748 <interface>
1749 <!-- interface-requires gtk+ 3.0 -->
1750- <object class="GtkImage" id="image-apply">
1751+ <object class="GtkVBox" id="pane_updates_available">
1752 <property name="visible">True</property>
1753 <property name="can_focus">False</property>
1754- <property name="stock">gtk-apply</property>
1755- </object>
1756- <object class="GtkWindow" id="window_updates_available">
1757- <property name="can_focus">False</property>
1758+ <property name="spacing">12</property>
1759 <child>
1760- <object class="GtkVBox" id="pane_updates_available">
1761+ <object class="GtkExpander" id="expander_details">
1762 <property name="visible">True</property>
1763- <property name="can_focus">False</property>
1764- <property name="border_width">6</property>
1765+ <property name="can_focus">True</property>
1766 <property name="spacing">6</property>
1767+ <property name="resize_toplevel">True</property>
1768 <child>
1769- <object class="GtkVBox" id="vbox_updates">
1770+ <object class="GtkVBox" id="vbox4">
1771 <property name="visible">True</property>
1772 <property name="can_focus">False</property>
1773- <property name="border_width">6</property>
1774- <property name="spacing">12</property>
1775+ <property name="spacing">6</property>
1776 <child>
1777- <object class="GtkHBox" id="hbox3">
1778+ <object class="GtkScrolledWindow" id="scrolledwindow_update">
1779 <property name="visible">True</property>
1780- <property name="can_focus">False</property>
1781- <property name="spacing">12</property>
1782- <child>
1783- <object class="GtkImage" id="image_logo">
1784- <property name="visible">True</property>
1785- <property name="can_focus">False</property>
1786- <property name="yalign">0</property>
1787- <property name="pixel_size">48</property>
1788- <property name="icon_name">system-software-update</property>
1789- </object>
1790- <packing>
1791- <property name="expand">False</property>
1792- <property name="fill">False</property>
1793- <property name="position">0</property>
1794- </packing>
1795- </child>
1796- <child>
1797- <object class="GtkGrid" id="grid1">
1798- <property name="visible">True</property>
1799- <property name="can_focus">False</property>
1800- <property name="margin_bottom">6</property>
1801- <property name="row_spacing">6</property>
1802- <property name="column_spacing">12</property>
1803- <child>
1804- <object class="GtkLabel" id="label_header">
1805- <property name="visible">True</property>
1806- <property name="can_focus">False</property>
1807- <property name="hexpand">True</property>
1808- <property name="xalign">0</property>
1809- <property name="wrap">True</property>
1810- <property name="max_width_chars">20</property>
1811- <attributes>
1812- <attribute name="weight" value="bold"/>
1813- <attribute name="scale" value="1.25"/>
1814- </attributes>
1815- </object>
1816- <packing>
1817- <property name="left_attach">0</property>
1818- <property name="top_attach">0</property>
1819- <property name="width">1</property>
1820- <property name="height">1</property>
1821- </packing>
1822- </child>
1823- <child>
1824- <object class="GtkLabel" id="label_desc">
1825- <property name="can_focus">False</property>
1826- <property name="no_show_all">True</property>
1827- <property name="hexpand">True</property>
1828- <property name="xalign">0</property>
1829- <property name="wrap">True</property>
1830- <property name="max_width_chars">20</property>
1831- </object>
1832- <packing>
1833- <property name="left_attach">0</property>
1834- <property name="top_attach">1</property>
1835- <property name="width">1</property>
1836- <property name="height">1</property>
1837- </packing>
1838- </child>
1839- </object>
1840- <packing>
1841- <property name="expand">False</property>
1842- <property name="fill">True</property>
1843- <property name="position">1</property>
1844- </packing>
1845+ <property name="can_focus">True</property>
1846+ <property name="shadow_type">in</property>
1847+ <property name="min_content_height">100</property>
1848+ <child>
1849+ <object class="GtkTreeView" id="treeview_update">
1850+ <property name="visible">True</property>
1851+ <property name="can_focus">True</property>
1852+ <property name="headers_visible">False</property>
1853+ <property name="headers_clickable">False</property>
1854+ <property name="rules_hint">True</property>
1855+ <child internal-child="accessible">
1856+ <object class="AtkObject" id="treeview_update-atkobject">
1857+ <property name="AtkObject::accessible-name" translatable="yes">updates</property>
1858+ </object>
1859+ </child>
1860+ <signal name="cursor-changed" handler="on_treeview_update_cursor_changed" swapped="no"/>
1861+ <signal name="row-activated" handler="on_treeview_update_row_activated" swapped="no"/>
1862+ </object>
1863 </child>
1864 </object>
1865 <packing>
1866- <property name="expand">False</property>
1867+ <property name="expand">True</property>
1868 <property name="fill">True</property>
1869 <property name="position">0</property>
1870 </packing>
1871 </child>
1872 <child>
1873- <object class="GtkExpander" id="expander_details">
1874+ <object class="GtkExpander" id="expander_desc">
1875 <property name="visible">True</property>
1876 <property name="can_focus">True</property>
1877- <property name="spacing">6</property>
1878- <property name="resize_toplevel">True</property>
1879 <child>
1880- <object class="GtkVBox" id="vbox4">
1881+ <object class="GtkNotebook" id="notebook_details">
1882 <property name="visible">True</property>
1883- <property name="can_focus">False</property>
1884- <property name="spacing">6</property>
1885- <child>
1886- <object class="GtkScrolledWindow" id="scrolledwindow_update">
1887+ <property name="can_focus">True</property>
1888+ <property name="show_border">False</property>
1889+ <child>
1890+ <object class="GtkVBox" id="vbox5">
1891+ <property name="visible">True</property>
1892+ <property name="can_focus">False</property>
1893+ <property name="border_width">6</property>
1894+ <property name="spacing">6</property>
1895+ <child>
1896+ <object class="GtkScrolledWindow" id="scrolledwindow_changes">
1897+ <property name="visible">True</property>
1898+ <property name="can_focus">True</property>
1899+ <property name="shadow_type">in</property>
1900+ <child>
1901+ <placeholder/>
1902+ </child>
1903+ </object>
1904+ <packing>
1905+ <property name="expand">True</property>
1906+ <property name="fill">True</property>
1907+ <property name="position">0</property>
1908+ </packing>
1909+ </child>
1910+ </object>
1911+ </child>
1912+ <child type="tab">
1913+ <object class="GtkLabel" id="label8">
1914+ <property name="visible">True</property>
1915+ <property name="can_focus">False</property>
1916+ <property name="label" translatable="yes">Changes</property>
1917+ </object>
1918+ <packing>
1919+ <property name="tab_fill">False</property>
1920+ </packing>
1921+ </child>
1922+ <child>
1923+ <object class="GtkScrolledWindow" id="scrolledwindow3">
1924 <property name="visible">True</property>
1925 <property name="can_focus">True</property>
1926+ <property name="border_width">6</property>
1927 <property name="shadow_type">in</property>
1928- <property name="min_content_height">100</property>
1929 <child>
1930- <object class="GtkTreeView" id="treeview_update">
1931+ <object class="GtkTextView" id="textview_descr">
1932 <property name="visible">True</property>
1933 <property name="can_focus">True</property>
1934- <property name="headers_visible">False</property>
1935- <property name="headers_clickable">False</property>
1936- <property name="rules_hint">True</property>
1937+ <property name="pixels_above_lines">6</property>
1938+ <property name="editable">False</property>
1939+ <property name="wrap_mode">word</property>
1940+ <property name="left_margin">6</property>
1941+ <property name="right_margin">6</property>
1942+ <property name="cursor_visible">False</property>
1943+ <property name="accepts_tab">False</property>
1944 <child internal-child="accessible">
1945- <object class="AtkObject" id="treeview_update-atkobject">
1946- <property name="AtkObject::accessible-name" translatable="yes">updates</property>
1947+ <object class="AtkObject" id="textview_descr-atkobject">
1948+ <property name="AtkObject::accessible-name" translatable="yes">Description</property>
1949 </object>
1950 </child>
1951- <signal name="cursor-changed" handler="on_treeview_update_cursor_changed" swapped="no"/>
1952- <signal name="row-activated" handler="on_treeview_update_row_activated" swapped="no"/>
1953- <child internal-child="selection">
1954- <object class="GtkTreeSelection" id="treeview-selection"/>
1955- </child>
1956 </object>
1957 </child>
1958 </object>
1959 <packing>
1960- <property name="expand">True</property>
1961- <property name="fill">True</property>
1962- <property name="position">0</property>
1963+ <property name="position">1</property>
1964 </packing>
1965 </child>
1966- <child>
1967- <object class="GtkExpander" id="expander_desc">
1968+ <child type="tab">
1969+ <object class="GtkLabel" id="label9">
1970 <property name="visible">True</property>
1971- <property name="can_focus">True</property>
1972- <child>
1973- <object class="GtkNotebook" id="notebook_details">
1974- <property name="visible">True</property>
1975- <property name="can_focus">True</property>
1976- <property name="show_border">False</property>
1977- <child>
1978- <object class="GtkVBox" id="vbox5">
1979- <property name="visible">True</property>
1980- <property name="can_focus">False</property>
1981- <property name="border_width">6</property>
1982- <property name="spacing">6</property>
1983- <child>
1984- <object class="GtkScrolledWindow" id="scrolledwindow_changes">
1985- <property name="visible">True</property>
1986- <property name="can_focus">True</property>
1987- <property name="shadow_type">in</property>
1988- <child>
1989- <placeholder/>
1990- </child>
1991- </object>
1992- <packing>
1993- <property name="expand">True</property>
1994- <property name="fill">True</property>
1995- <property name="position">0</property>
1996- </packing>
1997- </child>
1998- </object>
1999- </child>
2000- <child type="tab">
2001- <object class="GtkLabel" id="label8">
2002- <property name="visible">True</property>
2003- <property name="can_focus">False</property>
2004- <property name="label" translatable="yes">Changes</property>
2005- </object>
2006- <packing>
2007- <property name="tab_fill">False</property>
2008- </packing>
2009- </child>
2010- <child>
2011- <object class="GtkScrolledWindow" id="scrolledwindow3">
2012- <property name="visible">True</property>
2013- <property name="can_focus">True</property>
2014- <property name="border_width">6</property>
2015- <property name="shadow_type">in</property>
2016- <child>
2017- <object class="GtkTextView" id="textview_descr">
2018- <property name="visible">True</property>
2019- <property name="can_focus">True</property>
2020- <property name="pixels_above_lines">6</property>
2021- <property name="editable">False</property>
2022- <property name="wrap_mode">word</property>
2023- <property name="left_margin">6</property>
2024- <property name="right_margin">6</property>
2025- <property name="cursor_visible">False</property>
2026- <property name="accepts_tab">False</property>
2027- <child internal-child="accessible">
2028- <object class="AtkObject" id="textview_descr-atkobject">
2029- <property name="AtkObject::accessible-name" translatable="yes">Description</property>
2030- </object>
2031- </child>
2032- </object>
2033- </child>
2034- </object>
2035- <packing>
2036- <property name="position">1</property>
2037- </packing>
2038- </child>
2039- <child type="tab">
2040- <object class="GtkLabel" id="label9">
2041- <property name="visible">True</property>
2042- <property name="can_focus">False</property>
2043- <property name="label" translatable="yes">Description</property>
2044- <child internal-child="accessible">
2045- <object class="AtkObject" id="label9-atkobject">
2046- <property name="AtkObject::accessible-name" translatable="yes">Description</property>
2047- </object>
2048- </child>
2049- </object>
2050- <packing>
2051- <property name="position">1</property>
2052- <property name="tab_fill">False</property>
2053- </packing>
2054- </child>
2055- </object>
2056- </child>
2057- <child type="label">
2058- <object class="GtkLabel" id="label13">
2059- <property name="visible">True</property>
2060- <property name="can_focus">False</property>
2061- <property name="label" translatable="yes">Technical description</property>
2062+ <property name="can_focus">False</property>
2063+ <property name="label" translatable="yes">Description</property>
2064+ <child internal-child="accessible">
2065+ <object class="AtkObject" id="label9-atkobject">
2066+ <property name="AtkObject::accessible-name" translatable="yes">Description</property>
2067 </object>
2068 </child>
2069 </object>
2070 <packing>
2071- <property name="expand">False</property>
2072- <property name="fill">True</property>
2073 <property name="position">1</property>
2074+ <property name="tab_fill">False</property>
2075 </packing>
2076 </child>
2077 </object>
2078 </child>
2079 <child type="label">
2080- <object class="GtkLabel" id="label12">
2081+ <object class="GtkLabel" id="label13">
2082 <property name="visible">True</property>
2083 <property name="can_focus">False</property>
2084- <property name="label" translatable="yes">Details of updates</property>
2085- <property name="use_markup">True</property>
2086+ <property name="label" translatable="yes">Technical description</property>
2087 </object>
2088 </child>
2089 </object>
2090 <packing>
2091- <property name="expand">True</property>
2092- <property name="fill">True</property>
2093- <property name="position">2</property>
2094- </packing>
2095- </child>
2096- <child>
2097- <object class="GtkVBox" id="vbox_alerts">
2098- <property name="can_focus">False</property>
2099- <property name="spacing">3</property>
2100- <child>
2101- <object class="GtkHBox" id="hbox_downsize">
2102- <property name="can_focus">False</property>
2103- <property name="spacing">12</property>
2104- <child>
2105- <object class="GtkImage" id="image_downsize">
2106- <property name="visible">True</property>
2107- <property name="can_focus">False</property>
2108- <property name="icon_name">aptdaemon-download</property>
2109- </object>
2110- <packing>
2111- <property name="expand">False</property>
2112- <property name="fill">True</property>
2113- <property name="position">0</property>
2114- </packing>
2115- </child>
2116- <child>
2117- <object class="GtkLabel" id="label_downsize">
2118- <property name="visible">True</property>
2119- <property name="can_focus">False</property>
2120- <property name="xalign">0</property>
2121- <property name="label">
2122+ <property name="expand">False</property>
2123+ <property name="fill">True</property>
2124+ <property name="position">1</property>
2125+ </packing>
2126+ </child>
2127+ </object>
2128+ </child>
2129+ <child type="label">
2130+ <object class="GtkLabel" id="label12">
2131+ <property name="visible">True</property>
2132+ <property name="can_focus">False</property>
2133+ <property name="label" translatable="yes">Details of updates</property>
2134+ <property name="use_markup">True</property>
2135+ </object>
2136+ </child>
2137+ </object>
2138+ <packing>
2139+ <property name="expand">True</property>
2140+ <property name="fill">True</property>
2141+ <property name="position">2</property>
2142+ </packing>
2143+ </child>
2144+ <child>
2145+ <object class="GtkVBox" id="vbox_alerts">
2146+ <property name="can_focus">False</property>
2147+ <property name="spacing">3</property>
2148+ <child>
2149+ <object class="GtkHBox" id="hbox_downsize">
2150+ <property name="can_focus">False</property>
2151+ <property name="spacing">12</property>
2152+ <child>
2153+ <object class="GtkImage" id="image_downsize">
2154+ <property name="visible">True</property>
2155+ <property name="can_focus">False</property>
2156+ <property name="icon_name">aptdaemon-download</property>
2157+ </object>
2158+ <packing>
2159+ <property name="expand">False</property>
2160+ <property name="fill">True</property>
2161+ <property name="position">0</property>
2162+ </packing>
2163+ </child>
2164+ <child>
2165+ <object class="GtkLabel" id="label_downsize">
2166+ <property name="visible">True</property>
2167+ <property name="can_focus">False</property>
2168+ <property name="xalign">0</property>
2169+ <property name="label">
2170 </property>
2171- <property name="wrap">True</property>
2172- </object>
2173- <packing>
2174- <property name="expand">True</property>
2175- <property name="fill">True</property>
2176- <property name="position">1</property>
2177- </packing>
2178- </child>
2179- </object>
2180- <packing>
2181- <property name="expand">False</property>
2182- <property name="fill">False</property>
2183- <property name="position">0</property>
2184- </packing>
2185- </child>
2186- <child>
2187- <object class="GtkHBox" id="hbox_roaming">
2188- <property name="can_focus">False</property>
2189- <property name="spacing">12</property>
2190- <child>
2191- <object class="GtkImage" id="image_roaming">
2192- <property name="visible">True</property>
2193- <property name="can_focus">False</property>
2194- <property name="icon_name">dialog-warning</property>
2195- </object>
2196- <packing>
2197- <property name="expand">False</property>
2198- <property name="fill">True</property>
2199- <property name="position">0</property>
2200- </packing>
2201- </child>
2202- <child>
2203- <object class="GtkLabel" id="label_roaming">
2204- <property name="visible">True</property>
2205- <property name="can_focus">False</property>
2206- <property name="xalign">0</property>
2207- <property name="label" translatable="yes">You are connected via roaming and may be charged for the data consumed by this update.</property>
2208- <property name="wrap">True</property>
2209- </object>
2210- <packing>
2211- <property name="expand">True</property>
2212- <property name="fill">True</property>
2213- <property name="position">1</property>
2214- </packing>
2215- </child>
2216- </object>
2217- <packing>
2218- <property name="expand">False</property>
2219- <property name="fill">False</property>
2220- <property name="position">1</property>
2221- </packing>
2222- </child>
2223- <child>
2224- <object class="GtkHBox" id="hbox_on_3g">
2225- <property name="can_focus">False</property>
2226- <property name="spacing">12</property>
2227- <child>
2228- <object class="GtkImage" id="image_on_3g">
2229- <property name="visible">True</property>
2230- <property name="can_focus">False</property>
2231- <property name="icon_name">modem</property>
2232- </object>
2233- <packing>
2234- <property name="expand">False</property>
2235- <property name="fill">True</property>
2236- <property name="position">0</property>
2237- </packing>
2238- </child>
2239- <child>
2240- <object class="GtkLabel" id="label_on_3g">
2241- <property name="visible">True</property>
2242- <property name="can_focus">False</property>
2243- <property name="xalign">0</property>
2244- <property name="label" translatable="yes">You may want to wait until you’re not using a mobile broadband connection.</property>
2245- <property name="wrap">True</property>
2246- </object>
2247- <packing>
2248- <property name="expand">True</property>
2249- <property name="fill">True</property>
2250- <property name="position">1</property>
2251- </packing>
2252- </child>
2253- </object>
2254- <packing>
2255- <property name="expand">False</property>
2256- <property name="fill">False</property>
2257- <property name="position">2</property>
2258- </packing>
2259- </child>
2260- <child>
2261- <object class="GtkHBox" id="hbox_battery">
2262- <property name="can_focus">False</property>
2263- <property name="spacing">12</property>
2264- <child>
2265- <object class="GtkImage" id="image_battery">
2266- <property name="visible">True</property>
2267- <property name="can_focus">False</property>
2268- <property name="icon_name">battery</property>
2269- </object>
2270- <packing>
2271- <property name="expand">False</property>
2272- <property name="fill">True</property>
2273- <property name="position">0</property>
2274- </packing>
2275- </child>
2276- <child>
2277- <object class="GtkLabel" id="label_battery">
2278- <property name="visible">True</property>
2279- <property name="can_focus">False</property>
2280- <property name="xalign">0</property>
2281- <property name="label" translatable="yes">It’s safer to connect the computer to AC power before updating.</property>
2282- <property name="wrap">True</property>
2283- </object>
2284- <packing>
2285- <property name="expand">True</property>
2286- <property name="fill">True</property>
2287- <property name="position">1</property>
2288- </packing>
2289- </child>
2290- </object>
2291- <packing>
2292- <property name="expand">False</property>
2293- <property name="fill">False</property>
2294- <property name="position">3</property>
2295- </packing>
2296- </child>
2297- <child>
2298- <object class="GtkHBox" id="hbox_offline">
2299- <property name="can_focus">False</property>
2300- <property name="spacing">12</property>
2301- <child>
2302- <object class="GtkImage" id="image_offline">
2303- <property name="visible">True</property>
2304- <property name="can_focus">False</property>
2305- <property name="icon_name">network-offline</property>
2306- </object>
2307- <packing>
2308- <property name="expand">False</property>
2309- <property name="fill">True</property>
2310- <property name="position">0</property>
2311- </packing>
2312- </child>
2313- <child>
2314- <object class="GtkLabel" id="label_offline">
2315- <property name="visible">True</property>
2316- <property name="can_focus">False</property>
2317- <property name="xalign">0</property>
2318- <property name="wrap">True</property>
2319- </object>
2320- <packing>
2321- <property name="expand">True</property>
2322- <property name="fill">True</property>
2323- <property name="position">1</property>
2324- </packing>
2325- </child>
2326- </object>
2327- <packing>
2328- <property name="expand">False</property>
2329- <property name="fill">False</property>
2330- <property name="position">4</property>
2331- </packing>
2332- </child>
2333+ <property name="wrap">True</property>
2334 </object>
2335 <packing>
2336- <property name="expand">False</property>
2337+ <property name="expand">True</property>
2338 <property name="fill">True</property>
2339- <property name="position">3</property>
2340+ <property name="position">1</property>
2341 </packing>
2342 </child>
2343 </object>
2344 <packing>
2345- <property name="expand">True</property>
2346- <property name="fill">True</property>
2347+ <property name="expand">False</property>
2348+ <property name="fill">False</property>
2349 <property name="position">0</property>
2350 </packing>
2351 </child>
2352 <child>
2353- <object class="GtkHButtonBox" id="hbuttonbox6">
2354- <property name="visible">True</property>
2355+ <object class="GtkHBox" id="hbox_roaming">
2356 <property name="can_focus">False</property>
2357- <property name="border_width">5</property>
2358- <property name="spacing">6</property>
2359- <property name="layout_style">end</property>
2360+ <property name="spacing">12</property>
2361 <child>
2362- <object class="GtkButton" id="button_settings">
2363- <property name="label" translatable="yes">_Settings...</property>
2364+ <object class="GtkImage" id="image_roaming">
2365 <property name="visible">True</property>
2366- <property name="can_focus">True</property>
2367- <property name="receives_default">True</property>
2368- <property name="use_underline">True</property>
2369- <signal name="clicked" handler="on_button_settings_clicked" swapped="no"/>
2370+ <property name="can_focus">False</property>
2371+ <property name="icon_name">dialog-warning</property>
2372 </object>
2373 <packing>
2374 <property name="expand">False</property>
2375- <property name="fill">False</property>
2376+ <property name="fill">True</property>
2377 <property name="position">0</property>
2378- <property name="secondary">True</property>
2379- </packing>
2380- </child>
2381- <child>
2382- <object class="GtkButton" id="button_close">
2383- <property name="label">gtk-cancel</property>
2384- <property name="visible">True</property>
2385- <property name="can_focus">True</property>
2386- <property name="can_default">True</property>
2387- <property name="receives_default">True</property>
2388- <property name="use_stock">True</property>
2389- <accelerator key="W" signal="clicked" modifiers="GDK_CONTROL_MASK"/>
2390- <accelerator key="Q" signal="clicked" modifiers="GDK_CONTROL_MASK"/>
2391- </object>
2392- <packing>
2393- <property name="expand">False</property>
2394- <property name="fill">False</property>
2395- <property name="position">2</property>
2396- </packing>
2397- </child>
2398- <child>
2399- <object class="GtkButton" id="button_install">
2400- <property name="label" translatable="yes">_Install Now</property>
2401- <property name="visible">True</property>
2402- <property name="can_focus">True</property>
2403- <property name="can_default">True</property>
2404- <property name="has_default">True</property>
2405- <property name="receives_default">True</property>
2406- <property name="image">image-apply</property>
2407- <property name="use_underline">True</property>
2408- <signal name="clicked" handler="on_button_install_clicked" swapped="no"/>
2409- </object>
2410- <packing>
2411- <property name="expand">False</property>
2412+ </packing>
2413+ </child>
2414+ <child>
2415+ <object class="GtkLabel" id="label_roaming">
2416+ <property name="visible">True</property>
2417+ <property name="can_focus">False</property>
2418+ <property name="xalign">0</property>
2419+ <property name="label" translatable="yes">You are connected via roaming and may be charged for the data consumed by this update.</property>
2420+ <property name="wrap">True</property>
2421+ </object>
2422+ <packing>
2423+ <property name="expand">True</property>
2424 <property name="fill">True</property>
2425- <property name="position">3</property>
2426+ <property name="position">1</property>
2427 </packing>
2428 </child>
2429 </object>
2430 <packing>
2431 <property name="expand">False</property>
2432- <property name="fill">True</property>
2433+ <property name="fill">False</property>
2434 <property name="position">1</property>
2435 </packing>
2436 </child>
2437+ <child>
2438+ <object class="GtkHBox" id="hbox_on_3g">
2439+ <property name="can_focus">False</property>
2440+ <property name="spacing">12</property>
2441+ <child>
2442+ <object class="GtkImage" id="image_on_3g">
2443+ <property name="visible">True</property>
2444+ <property name="can_focus">False</property>
2445+ <property name="icon_name">modem</property>
2446+ </object>
2447+ <packing>
2448+ <property name="expand">False</property>
2449+ <property name="fill">True</property>
2450+ <property name="position">0</property>
2451+ </packing>
2452+ </child>
2453+ <child>
2454+ <object class="GtkLabel" id="label_on_3g">
2455+ <property name="visible">True</property>
2456+ <property name="can_focus">False</property>
2457+ <property name="xalign">0</property>
2458+ <property name="label" translatable="yes">You may want to wait until you’re not using a mobile broadband connection.</property>
2459+ <property name="wrap">True</property>
2460+ </object>
2461+ <packing>
2462+ <property name="expand">True</property>
2463+ <property name="fill">True</property>
2464+ <property name="position">1</property>
2465+ </packing>
2466+ </child>
2467+ </object>
2468+ <packing>
2469+ <property name="expand">False</property>
2470+ <property name="fill">False</property>
2471+ <property name="position">2</property>
2472+ </packing>
2473+ </child>
2474+ <child>
2475+ <object class="GtkHBox" id="hbox_battery">
2476+ <property name="can_focus">False</property>
2477+ <property name="spacing">12</property>
2478+ <child>
2479+ <object class="GtkImage" id="image_battery">
2480+ <property name="visible">True</property>
2481+ <property name="can_focus">False</property>
2482+ <property name="icon_name">battery</property>
2483+ </object>
2484+ <packing>
2485+ <property name="expand">False</property>
2486+ <property name="fill">True</property>
2487+ <property name="position">0</property>
2488+ </packing>
2489+ </child>
2490+ <child>
2491+ <object class="GtkLabel" id="label_battery">
2492+ <property name="visible">True</property>
2493+ <property name="can_focus">False</property>
2494+ <property name="xalign">0</property>
2495+ <property name="label" translatable="yes">It’s safer to connect the computer to AC power before updating.</property>
2496+ <property name="wrap">True</property>
2497+ </object>
2498+ <packing>
2499+ <property name="expand">True</property>
2500+ <property name="fill">True</property>
2501+ <property name="position">1</property>
2502+ </packing>
2503+ </child>
2504+ </object>
2505+ <packing>
2506+ <property name="expand">False</property>
2507+ <property name="fill">False</property>
2508+ <property name="position">3</property>
2509+ </packing>
2510+ </child>
2511+ <child>
2512+ <object class="GtkHBox" id="hbox_offline">
2513+ <property name="can_focus">False</property>
2514+ <property name="spacing">12</property>
2515+ <child>
2516+ <object class="GtkImage" id="image_offline">
2517+ <property name="visible">True</property>
2518+ <property name="can_focus">False</property>
2519+ <property name="icon_name">network-offline</property>
2520+ </object>
2521+ <packing>
2522+ <property name="expand">False</property>
2523+ <property name="fill">True</property>
2524+ <property name="position">0</property>
2525+ </packing>
2526+ </child>
2527+ <child>
2528+ <object class="GtkLabel" id="label_offline">
2529+ <property name="visible">True</property>
2530+ <property name="can_focus">False</property>
2531+ <property name="xalign">0</property>
2532+ <property name="wrap">True</property>
2533+ </object>
2534+ <packing>
2535+ <property name="expand">True</property>
2536+ <property name="fill">True</property>
2537+ <property name="position">1</property>
2538+ </packing>
2539+ </child>
2540+ </object>
2541+ <packing>
2542+ <property name="expand">False</property>
2543+ <property name="fill">False</property>
2544+ <property name="position">4</property>
2545+ </packing>
2546+ </child>
2547 </object>
2548+ <packing>
2549+ <property name="expand">False</property>
2550+ <property name="fill">True</property>
2551+ <property name="position">3</property>
2552+ </packing>
2553 </child>
2554 </object>
2555 </interface>
2556
2557=== modified file 'debian/update-manager.install'
2558--- debian/update-manager.install 2012-11-19 16:33:28 +0000
2559+++ debian/update-manager.install 2013-05-21 05:43:25 +0000
2560@@ -8,10 +8,7 @@
2561 debian/tmp/usr/share/applications/update-manager.desktop
2562 debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/ChangelogViewer.py
2563 debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/Dialogs.py
2564-debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/InstallProgress.py
2565 debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/MetaReleaseGObject.py
2566 debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/UpdateManager.py
2567-debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/UpdateProgress.py
2568 debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/UpdatesAvailable.py
2569-debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/SimpleGtkbuilderApp.py
2570 debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/HelpViewer.py
2571
2572=== modified file 'po/POTFILES.in'
2573--- po/POTFILES.in 2012-09-25 07:36:24 +0000
2574+++ po/POTFILES.in 2013-05-21 05:43:25 +0000
2575@@ -4,9 +4,7 @@
2576 UpdateManager/ChangelogViewer.py
2577 UpdateManager/MetaReleaseGObject.py
2578 UpdateManager/Dialogs.py
2579-UpdateManager/InstallProgress.py
2580 UpdateManager/UpdateManager.py
2581-UpdateManager/UpdateProgress.py
2582 UpdateManager/UpdatesAvailable.py
2583 UpdateManager/UnitySupport.py
2584 UpdateManagerText/UpdateManagerText.py
2585
2586=== modified file 'po/update-manager.pot'
2587--- po/update-manager.pot 2012-06-25 16:25:51 +0000
2588+++ po/update-manager.pot 2013-05-21 05:43:25 +0000
2589@@ -8,7 +8,7 @@
2590 msgstr ""
2591 "Project-Id-Version: PACKAGE VERSION\n"
2592 "Report-Msgid-Bugs-To: \n"
2593-"POT-Creation-Date: 2012-06-25 12:22-0400\n"
2594+"POT-Creation-Date: 2013-05-20 10:14-0700\n"
2595 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
2596 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
2597 "Language-Team: LANGUAGE <LL@li.org>\n"
2598@@ -18,176 +18,235 @@
2599 "Content-Transfer-Encoding: 8bit\n"
2600 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
2601
2602-#: ../UpdateManager/backend/InstallBackendSynaptic.py:64
2603+#: ../UpdateManager/backend/InstallBackendAptdaemon.py:68
2604+msgid "Checking for updates…"
2605+msgstr ""
2606+
2607+#: ../UpdateManager/backend/InstallBackendAptdaemon.py:93
2608+msgid "Installing updates…"
2609+msgstr ""
2610+
2611+#: ../UpdateManager/backend/InstallBackendSynaptic.py:37
2612 msgid "Please wait, this can take some time."
2613 msgstr ""
2614
2615-#: ../UpdateManager/backend/InstallBackendSynaptic.py:66
2616+#: ../UpdateManager/backend/InstallBackendSynaptic.py:39
2617 msgid "Update is complete"
2618 msgstr ""
2619
2620-#: ../UpdateManager/DistUpgradeFetcher.py:114
2621-#: ../UpdateManager/DistUpgradeFetcherKDE.py:109
2622-msgid "Could not find the release notes"
2623-msgstr ""
2624-
2625-#: ../UpdateManager/DistUpgradeFetcher.py:115
2626-#: ../UpdateManager/DistUpgradeFetcherKDE.py:110
2627-msgid "The server may be overloaded. "
2628-msgstr ""
2629-
2630-#: ../UpdateManager/DistUpgradeFetcher.py:125
2631-#: ../UpdateManager/DistUpgradeFetcherKDE.py:114
2632-msgid "Could not download the release notes"
2633-msgstr ""
2634-
2635-#: ../UpdateManager/DistUpgradeFetcher.py:126
2636-#: ../UpdateManager/DistUpgradeFetcherKDE.py:115
2637-msgid "Please check your internet connection."
2638-msgstr ""
2639-
2640-#: ../UpdateManager/DistUpgradeFetcherKDE.py:68
2641-#: ../UpdateManager/DistUpgradeFetcherKDE.py:91
2642-msgid "Upgrade"
2643-msgstr ""
2644-
2645-#: ../UpdateManager/DistUpgradeFetcherKDE.py:95
2646-#: ../data/gtkbuilder/UpdateManager.ui.h:15
2647-msgid "Release Notes"
2648-msgstr ""
2649-
2650-#: ../UpdateManager/DistUpgradeFetcherKDE.py:134
2651-#: ../UpdateManager/DistUpgradeFetcherKDE.py:148
2652-#: ../UpdateManager/DistUpgradeFetcherKDE.py:150
2653-msgid "Downloading additional package files..."
2654-msgstr ""
2655-
2656-#: ../UpdateManager/DistUpgradeFetcherKDE.py:148
2657-#, python-format
2658-msgid "File %s of %s at %sB/s"
2659-msgstr ""
2660-
2661-#: ../UpdateManager/DistUpgradeFetcherKDE.py:150
2662-#, python-format
2663-msgid "File %s of %s"
2664-msgstr ""
2665-
2666-#: ../UpdateManager/DistUpgradeFetcherKDE.py:155
2667-#, python-format
2668-msgid "Please insert '%s' into the drive '%s'"
2669-msgstr ""
2670-
2671-#. change = QMessageBox.question(None, _("Media Change"), msg, QMessageBox.Ok, QMessageBox.Cancel)
2672-#: ../UpdateManager/DistUpgradeFetcherKDE.py:157
2673-msgid "Media Change"
2674-msgstr ""
2675-
2676-#: ../UpdateManager/ChangelogViewer.py:75
2677+#: ../UpdateManager/ChangelogViewer.py:79
2678 msgid "Open Link in Browser"
2679 msgstr ""
2680
2681-#: ../UpdateManager/ChangelogViewer.py:78
2682+#: ../UpdateManager/ChangelogViewer.py:83
2683 msgid "Copy Link to Clipboard"
2684 msgstr ""
2685
2686-#: ../UpdateManager/GtkProgress.py:162
2687-#, python-format
2688-msgid "Downloading file %(current)li of %(total)li with %(speed)s/s"
2689-msgstr ""
2690-
2691-#: ../UpdateManager/GtkProgress.py:167
2692-#, python-format
2693-msgid "Downloading file %(current)li of %(total)li"
2694-msgstr ""
2695-
2696-#: ../UpdateManager/UpdateManager.py:100
2697-msgid "Your Ubuntu release is not supported anymore."
2698-msgstr ""
2699-
2700-#: ../UpdateManager/UpdateManager.py:101
2701-msgid ""
2702-"You will not get any further security fixes or critical updates. Please "
2703-"upgrade to a later version of Ubuntu."
2704-msgstr ""
2705-
2706-#: ../UpdateManager/UpdateManager.py:109
2707-msgid "Upgrade information"
2708-msgstr ""
2709-
2710-#: ../UpdateManager/UpdateManager.py:204
2711-#: ../UpdateManagerText/UpdateManagerText.py:35
2712+#: ../UpdateManager/Dialogs.py:120
2713+msgid "Settings…"
2714+msgstr ""
2715+
2716+#: ../UpdateManager/Dialogs.py:148 ../UpdateManager/UpdateManager.py:244
2717+msgid "You stopped the check for updates."
2718+msgstr ""
2719+
2720+#: ../UpdateManager/Dialogs.py:150
2721+msgid "_Check Again"
2722+msgstr ""
2723+
2724+#: ../UpdateManager/Dialogs.py:161
2725+msgid "No software updates are available."
2726+msgstr ""
2727+
2728+#: ../UpdateManager/Dialogs.py:163 ../UpdateManager/Dialogs.py:172
2729+msgid "The software on this computer is up to date."
2730+msgstr ""
2731+
2732+#. Translators: these are Ubuntu version names like "Ubuntu 12.04"
2733+#: ../UpdateManager/Dialogs.py:174
2734+#, python-format
2735+msgid "However, %s %s is now available (you have %s)."
2736+msgstr ""
2737+
2738+#: ../UpdateManager/Dialogs.py:179
2739+msgid "Upgrade…"
2740+msgstr ""
2741+
2742+#. Translators: this is an Ubuntu version name like "Ubuntu 12.04"
2743+#: ../UpdateManager/Dialogs.py:201
2744+#, python-format
2745+msgid "Software updates are no longer provided for %s %s."
2746+msgstr ""
2747+
2748+#. Translators: this is an Ubuntu version name like "Ubuntu 12.04"
2749+#: ../UpdateManager/Dialogs.py:205
2750+#, python-format
2751+msgid "To stay secure, you should upgrade to %s %s."
2752+msgstr ""
2753+
2754+#: ../UpdateManager/Dialogs.py:218
2755+msgid "Not all updates can be installed"
2756+msgstr ""
2757+
2758+#: ../UpdateManager/Dialogs.py:220
2759+msgid ""
2760+"Run a partial upgrade, to install as many updates as possible.\n"
2761+"\n"
2762+" This can be caused by:\n"
2763+" * A previous upgrade which didn't complete\n"
2764+" * Problems with some of the installed software\n"
2765+" * Unofficial software packages not provided by Ubuntu\n"
2766+" * Normal changes of a pre-release version of Ubuntu"
2767+msgstr ""
2768+
2769+#: ../UpdateManager/Dialogs.py:228
2770+msgid "_Partial Upgrade"
2771+msgstr ""
2772+
2773+#: ../UpdateManager/Dialogs.py:229
2774+msgid "_Continue"
2775+msgstr ""
2776+
2777+#: ../UpdateManager/Dialogs.py:265
2778+msgid "_Try Again"
2779+msgstr ""
2780+
2781+#: ../UpdateManager/Dialogs.py:279
2782+msgid "The computer needs to restart to finish installing updates."
2783+msgstr ""
2784+
2785+#: ../UpdateManager/Dialogs.py:280
2786+msgid "_Restart"
2787+msgstr ""
2788+
2789+#. Basic GTK+ parameters
2790+#: ../UpdateManager/UpdateManager.py:85 ../data/update-manager.desktop.in.h:1
2791+msgid "Software Updater"
2792+msgstr ""
2793+
2794+#: ../UpdateManager/UpdateManager.py:242
2795+msgid "Some software couldn’t be checked for updates."
2796+msgstr ""
2797+
2798+#: ../UpdateManager/UpdateManager.py:245
2799+msgid "Updated software is available from a previous check."
2800+msgstr ""
2801+
2802+#. we assert a clean cache
2803+#: ../UpdateManager/UpdateManager.py:323
2804+msgid "Software index is broken"
2805+msgstr ""
2806+
2807+#: ../UpdateManager/UpdateManager.py:324
2808+msgid ""
2809+"It is impossible to install or remove any software. Please use the package "
2810+"manager \"Synaptic\" or run \"sudo apt-get install -f\" in a terminal to fix "
2811+"this issue at first."
2812+msgstr ""
2813+
2814+#: ../UpdateManager/UpdateManager.py:330
2815+msgid "Could not initialize the package information"
2816+msgstr ""
2817+
2818+#: ../UpdateManager/UpdateManager.py:331
2819+msgid ""
2820+"An unresolvable problem occurred while initializing the package "
2821+"information.\n"
2822+"\n"
2823+"Please report this bug against the 'update-manager' package and include the "
2824+"following error message:\n"
2825+msgstr ""
2826+
2827+#: ../UpdateManager/UpdateManager.py:348
2828+msgid "Could not calculate the upgrade"
2829+msgstr ""
2830+
2831+#: ../UpdateManager/UpdateManager.py:349
2832+msgid ""
2833+"An unresolvable problem occurred while calculating the upgrade.\n"
2834+"\n"
2835+"Please report this bug against the 'update-manager' package and include the "
2836+"following error message:\n"
2837+msgstr ""
2838+
2839+#: ../UpdateManager/UpdatesAvailable.py:248
2840+msgid "Install Now"
2841+msgstr ""
2842+
2843+#: ../UpdateManager/UpdatesAvailable.py:278
2844+#: ../UpdateManagerText/UpdateManagerText.py:36
2845 msgid "Install"
2846 msgstr ""
2847
2848-#: ../UpdateManager/UpdateManager.py:206
2849-msgid "Name"
2850+#: ../UpdateManager/UpdatesAvailable.py:312
2851+msgid "Download"
2852+msgstr ""
2853+
2854+#: ../UpdateManager/UpdatesAvailable.py:372
2855+msgid "_Remind Me Later"
2856 msgstr ""
2857
2858 #. upload_archive = version_match.group(2).strip()
2859-#: ../UpdateManager/UpdateManager.py:359
2860+#: ../UpdateManager/UpdatesAvailable.py:506
2861 #, python-format
2862 msgid "Version %s: \n"
2863 msgstr ""
2864
2865-#: ../UpdateManager/UpdateManager.py:417
2866+#: ../UpdateManager/UpdatesAvailable.py:569
2867 msgid ""
2868 "No network connection detected, you can not download changelog information."
2869 msgstr ""
2870
2871-#: ../UpdateManager/UpdateManager.py:427
2872+#: ../UpdateManager/UpdatesAvailable.py:579
2873 msgid "Downloading list of changes..."
2874 msgstr ""
2875
2876-#: ../UpdateManager/UpdateManager.py:471
2877+#: ../UpdateManager/UpdatesAvailable.py:623
2878 msgid "_Deselect All"
2879 msgstr ""
2880
2881-#: ../UpdateManager/UpdateManager.py:477
2882+#: ../UpdateManager/UpdatesAvailable.py:629
2883 msgid "Select _All"
2884 msgstr ""
2885
2886-#: ../UpdateManager/UpdateManager.py:536
2887+#: ../UpdateManager/UpdatesAvailable.py:704
2888 #, python-format
2889 msgid "%s will be downloaded."
2890 msgstr ""
2891
2892-#: ../UpdateManager/UpdateManager.py:548
2893+#: ../UpdateManager/UpdatesAvailable.py:718
2894 msgid "The update has already been downloaded."
2895 msgid_plural "The updates have already been downloaded."
2896 msgstr[0] ""
2897 msgstr[1] ""
2898
2899-#: ../UpdateManager/UpdateManager.py:553
2900+#: ../UpdateManager/UpdatesAvailable.py:724
2901 msgid "There are no updates to install."
2902 msgstr ""
2903
2904-#: ../UpdateManager/UpdateManager.py:562
2905+#: ../UpdateManager/UpdatesAvailable.py:733
2906 msgid "Unknown download size."
2907 msgstr ""
2908
2909-#: ../UpdateManager/UpdateManager.py:577
2910-msgid "The software on this computer is up to date."
2911-msgstr ""
2912-
2913-#: ../UpdateManager/UpdateManager.py:591
2914+#: ../UpdateManager/UpdatesAvailable.py:759
2915 #, python-format
2916 msgid ""
2917-"Updated software has been issued since %s was released. Do you want to "
2918+"Updated software has been issued since %s %s was released. Do you want to "
2919 "install it now?"
2920 msgstr ""
2921
2922-#: ../UpdateManager/UpdateManager.py:594
2923+#: ../UpdateManager/UpdatesAvailable.py:764
2924 msgid ""
2925 "Updated software is available for this computer. Do you want to install it "
2926 "now?"
2927 msgstr ""
2928
2929 #. print("on_button_install_clicked")
2930-#: ../UpdateManager/UpdateManager.py:645
2931+#: ../UpdateManager/UpdatesAvailable.py:794
2932 msgid "Not enough free disk space"
2933 msgstr ""
2934
2935-#: ../UpdateManager/UpdateManager.py:646
2936+#: ../UpdateManager/UpdatesAvailable.py:795
2937 #, python-format
2938 msgid ""
2939 "The upgrade needs a total of %s free space on disk '%s'. Please free at "
2940@@ -195,125 +254,46 @@
2941 "temporary packages of former installations using 'sudo apt-get clean'."
2942 msgstr ""
2943
2944-#: ../UpdateManager/UpdateManager.py:671
2945-msgid ""
2946-"The computer needs to restart to finish installing updates. Please save your "
2947-"work before continuing."
2948-msgstr ""
2949-
2950-#: ../UpdateManager/UpdateManager.py:728
2951-msgid "Reading package information"
2952-msgstr ""
2953-
2954-#: ../UpdateManager/UpdateManager.py:743
2955+#: ../UpdateManager/UpdatesAvailable.py:821
2956 msgid "Connecting..."
2957 msgstr ""
2958
2959-#: ../UpdateManager/UpdateManager.py:758
2960+#: ../UpdateManager/UpdatesAvailable.py:837
2961 msgid "You may not be able to check for updates or download new updates."
2962 msgstr ""
2963
2964-#: ../UpdateManager/UpdateManager.py:880
2965-msgid "Could not initialize the package information"
2966-msgstr ""
2967-
2968-#: ../UpdateManager/UpdateManager.py:881
2969-msgid ""
2970-"An unresolvable problem occurred while initializing the package "
2971-"information.\n"
2972-"\n"
2973-"Please report this bug against the 'update-manager' package and include the "
2974-"following error message:\n"
2975-msgstr ""
2976-
2977-#: ../UpdateManager/UpdateManager.py:905
2978-msgid "Could not calculate the upgrade"
2979-msgstr ""
2980-
2981-#: ../UpdateManager/UpdateManager.py:906
2982-msgid ""
2983-"An unresolvable problem occurred while calculating the upgrade.\n"
2984-"\n"
2985-"Please report this bug against the 'update-manager' package and include the "
2986-"following error message:"
2987-msgstr ""
2988-
2989-#: ../UpdateManager/UpdateManager.py:930
2990-msgid " (New install)"
2991-msgstr ""
2992-
2993-#. TRANSLATORS: the b stands for Bytes
2994-#: ../UpdateManager/UpdateManager.py:937
2995-#, python-format
2996-msgid "(Size: %s)"
2997-msgstr ""
2998-
2999-#: ../UpdateManager/UpdateManager.py:941
3000-#, python-format
3001-msgid "From version %(old_version)s to %(new_version)s"
3002-msgstr ""
3003-
3004-#: ../UpdateManager/UpdateManager.py:945
3005-#, python-format
3006-msgid "Version %s"
3007-msgstr ""
3008-
3009-#: ../UpdateManager/UpdateManager.py:978
3010-msgid "Release upgrade not possible right now"
3011-msgstr ""
3012-
3013-#: ../UpdateManager/UpdateManager.py:979
3014-#, python-format
3015-msgid ""
3016-"The release upgrade can not be performed currently, please try again later. "
3017-"The server reported: '%s'"
3018-msgstr ""
3019-
3020-#: ../UpdateManager/UpdateManager.py:981
3021-msgid "Downloading the release upgrade tool"
3022-msgstr ""
3023-
3024-#: ../UpdateManager/UpdateManager.py:988
3025-#, python-format
3026-msgid "<b>New Ubuntu release '%s' is available</b>"
3027-msgstr ""
3028-
3029-#. we assert a clean cache
3030-#: ../UpdateManager/UpdateManager.py:1027
3031-msgid "Software index is broken"
3032-msgstr ""
3033-
3034-#: ../UpdateManager/UpdateManager.py:1028
3035-msgid ""
3036-"It is impossible to install or remove any software. Please use the package "
3037-"manager \"Synaptic\" or run \"sudo apt-get install -f\" in a terminal to fix "
3038-"this issue at first."
3039-msgstr ""
3040-
3041-#: ../UpdateManager/UnitySupport.py:57
3042+#: ../UpdateManager/UpdatesAvailable.py:986
3043+msgid "Security updates"
3044+msgstr ""
3045+
3046+#: ../UpdateManager/UpdatesAvailable.py:989
3047+msgid "Other updates"
3048+msgstr ""
3049+
3050+#: ../UpdateManager/UnitySupport.py:67
3051 msgid "Install All Available Updates"
3052 msgstr ""
3053
3054-#: ../UpdateManagerText/UpdateManagerText.py:34
3055+#: ../UpdateManagerText/UpdateManagerText.py:35
3056 msgid "Cancel"
3057 msgstr ""
3058
3059-#: ../UpdateManagerText/UpdateManagerText.py:37
3060+#: ../UpdateManagerText/UpdateManagerText.py:38
3061 msgid "Changelog"
3062 msgstr ""
3063
3064-#: ../UpdateManagerText/UpdateManagerText.py:40
3065+#: ../UpdateManagerText/UpdateManagerText.py:41
3066 msgid "Updates"
3067 msgstr ""
3068
3069-#: ../UpdateManagerText/UpdateManagerText.py:53
3070+#: ../UpdateManagerText/UpdateManagerText.py:54
3071 msgid "Building Updates List"
3072 msgstr ""
3073
3074-#: ../UpdateManagerText/UpdateManagerText.py:56
3075+#: ../UpdateManagerText/UpdateManagerText.py:57
3076 msgid ""
3077 "\n"
3078-"A normal upgrade can not be calculated, please run: \n"
3079+"A normal upgrade can not be calculated, please run:\n"
3080 " sudo apt-get dist-upgrade\n"
3081 "\n"
3082 "\n"
3083@@ -324,35 +304,30 @@
3084 " * Normal changes of a pre-release version of Ubuntu"
3085 msgstr ""
3086
3087-#: ../UpdateManagerText/UpdateManagerText.py:125
3088+#: ../UpdateManagerText/UpdateManagerText.py:127
3089 msgid "Downloading changelog"
3090 msgstr ""
3091
3092-#: ../UpdateManager/Core/MyCache.py:147
3093-#, python-format
3094-msgid "Other updates (%s)"
3095-msgstr ""
3096-
3097-#: ../UpdateManager/Core/MyCache.py:325
3098+#: ../UpdateManager/Core/MyCache.py:333
3099 msgid "This update does not come from a source that supports changelogs."
3100 msgstr ""
3101
3102-#: ../UpdateManager/Core/MyCache.py:331 ../UpdateManager/Core/MyCache.py:359
3103+#: ../UpdateManager/Core/MyCache.py:339 ../UpdateManager/Core/MyCache.py:376
3104 msgid ""
3105 "Failed to download the list of changes. \n"
3106 "Please check your Internet connection."
3107 msgstr ""
3108
3109-#: ../UpdateManager/Core/MyCache.py:338
3110+#: ../UpdateManager/Core/MyCache.py:346
3111 #, python-format
3112 msgid ""
3113-"Changes for the versions:\n"
3114+"Changes for %s versions:\n"
3115 "Installed version: %s\n"
3116 "Available version: %s\n"
3117 "\n"
3118 msgstr ""
3119
3120-#: ../UpdateManager/Core/MyCache.py:348
3121+#: ../UpdateManager/Core/MyCache.py:362
3122 #, python-format
3123 msgid ""
3124 "The changelog does not contain any relevant changes.\n"
3125@@ -361,7 +336,7 @@
3126 "until the changes become available or try again later."
3127 msgstr ""
3128
3129-#: ../UpdateManager/Core/MyCache.py:353
3130+#: ../UpdateManager/Core/MyCache.py:369
3131 #, python-format
3132 msgid ""
3133 "The list of changes is not available yet.\n"
3134@@ -370,124 +345,15 @@
3135 "until the changes become available or try again later."
3136 msgstr ""
3137
3138-#: ../UpdateManager/Core/UpdateList.py:51
3139-msgid "Failed to detect distribution"
3140-msgstr ""
3141-
3142-#: ../UpdateManager/Core/UpdateList.py:52
3143-#, python-format
3144-msgid "A error '%s' occurred while checking what system you are using."
3145-msgstr ""
3146-
3147-#: ../UpdateManager/Core/UpdateList.py:63
3148-msgid "Important security updates"
3149-msgstr ""
3150-
3151-#: ../UpdateManager/Core/UpdateList.py:64
3152-msgid "Recommended updates"
3153-msgstr ""
3154-
3155-#: ../UpdateManager/Core/UpdateList.py:65
3156-msgid "Proposed updates"
3157-msgstr ""
3158-
3159-#: ../UpdateManager/Core/UpdateList.py:66
3160-msgid "Backports"
3161-msgstr ""
3162-
3163-#: ../UpdateManager/Core/UpdateList.py:67
3164-msgid "Distribution updates"
3165-msgstr ""
3166-
3167-#: ../UpdateManager/Core/UpdateList.py:72
3168-msgid "Other updates"
3169-msgstr ""
3170-
3171-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:72
3172-#, python-format
3173-msgid "authenticate '%(file)s' against '%(signature)s' "
3174-msgstr ""
3175-
3176-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:131
3177-#, python-format
3178-msgid "extracting '%s'"
3179-msgstr ""
3180-
3181-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:151
3182-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:152
3183-msgid "Could not run the upgrade tool"
3184-msgstr ""
3185-
3186-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:152
3187-msgid ""
3188-"This is most likely a bug in the upgrade tool. Please report it as a bug "
3189-"using the command 'ubuntu-bug update-manager'."
3190-msgstr ""
3191-
3192-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:227
3193-msgid "Upgrade tool signature"
3194-msgstr ""
3195-
3196-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:234
3197-msgid "Upgrade tool"
3198-msgstr ""
3199-
3200-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:268
3201-msgid "Failed to fetch"
3202-msgstr ""
3203-
3204-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:269
3205-msgid "Fetching the upgrade failed. There may be a network problem. "
3206-msgstr ""
3207-
3208-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:273
3209-msgid "Authentication failed"
3210-msgstr ""
3211-
3212-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:274
3213-msgid ""
3214-"Authenticating the upgrade failed. There may be a problem with the network "
3215-"or with the server. "
3216-msgstr ""
3217-
3218-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:279
3219-msgid "Failed to extract"
3220-msgstr ""
3221-
3222-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:280
3223-msgid ""
3224-"Extracting the upgrade failed. There may be a problem with the network or "
3225-"with the server. "
3226-msgstr ""
3227-
3228-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:285
3229-msgid "Verification failed"
3230-msgstr ""
3231-
3232-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:286
3233-msgid ""
3234-"Verifying the upgrade failed. There may be a problem with the network or "
3235-"with the server. "
3236-msgstr ""
3237-
3238-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:300
3239-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:306
3240-msgid "Can not run the upgrade"
3241-msgstr ""
3242-
3243-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:301
3244-msgid ""
3245-"This usually is caused by a system where /tmp is mounted noexec. Please "
3246-"remount without noexec and run the upgrade again."
3247-msgstr ""
3248-
3249-#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:307
3250-#, python-format
3251-msgid "The error message is '%s'."
3252+#. Translators: the %s is a distro name, like 'Ubuntu' and 'base' as in
3253+#. the core components and packages.
3254+#: ../UpdateManager/Core/UpdateList.py:167
3255+#, python-format
3256+msgid "%s base"
3257 msgstr ""
3258
3259 #. TRANSLATORS: download size of small updates, e.g. "250 kB"
3260-#: ../UpdateManager/Core/utils.py:433
3261+#: ../UpdateManager/Core/utils.py:485
3262 #, python-format
3263 msgid "%(size).0f kB"
3264 msgid_plural "%(size).0f kB"
3265@@ -495,112 +361,46 @@
3266 msgstr[1] ""
3267
3268 #. TRANSLATORS: download size of updates, e.g. "2.3 MB"
3269-#: ../UpdateManager/Core/utils.py:436
3270+#: ../UpdateManager/Core/utils.py:489
3271 #, python-format
3272 msgid "%.1f MB"
3273 msgstr ""
3274
3275 #: ../data/gtkbuilder/UpdateManager.ui.h:1
3276-msgid "<big><b>Starting Software Updater</b></big>"
3277+msgid "updates"
3278 msgstr ""
3279
3280 #: ../data/gtkbuilder/UpdateManager.ui.h:2
3281-msgid ""
3282-"Software updates correct errors, eliminate security vulnerabilities and "
3283-"provide new features."
3284+msgid "Changes"
3285 msgstr ""
3286
3287 #: ../data/gtkbuilder/UpdateManager.ui.h:3
3288-msgid "_Partial Upgrade"
3289+msgid "Description"
3290 msgstr ""
3291
3292 #: ../data/gtkbuilder/UpdateManager.ui.h:4
3293-msgid "<big><b>Not all updates can be installed</b></big>"
3294+msgid "Technical description"
3295 msgstr ""
3296
3297 #: ../data/gtkbuilder/UpdateManager.ui.h:5
3298-msgid ""
3299-"Run a partial upgrade, to install as many updates as possible. \n"
3300-"\n"
3301-"This can be caused by:\n"
3302-" * A previous upgrade which didn't complete\n"
3303-" * Problems with some of the installed software\n"
3304-" * Unofficial software packages not provided by Ubuntu\n"
3305-" * Normal changes of a pre-release version of Ubuntu"
3306-msgstr ""
3307-
3308-#: ../data/gtkbuilder/UpdateManager.ui.h:12
3309-msgid "Co_ntinue"
3310-msgstr ""
3311-
3312-#: ../data/gtkbuilder/UpdateManager.ui.h:13
3313-msgid "<big><b>Running on battery</b></big>"
3314-msgstr ""
3315-
3316-#: ../data/gtkbuilder/UpdateManager.ui.h:14
3317-msgid "Your system is running on battery. Are you sure you want to continue?"
3318-msgstr ""
3319-
3320-#: ../data/gtkbuilder/UpdateManager.ui.h:16
3321-msgid "_Upgrade"
3322-msgstr ""
3323-
3324-#: ../data/gtkbuilder/UpdateManager.ui.h:17
3325-msgid "Show progress of individual files"
3326-msgstr ""
3327-
3328-#: ../data/gtkbuilder/UpdateManager.ui.h:18
3329-#: ../data/update-manager.desktop.in.h:1
3330-msgid "Software Updater"
3331-msgstr ""
3332-
3333-#: ../data/gtkbuilder/UpdateManager.ui.h:19
3334-msgid "U_pgrade"
3335-msgstr ""
3336-
3337-#: ../data/gtkbuilder/UpdateManager.ui.h:20
3338-msgid "_Restart Now"
3339-msgstr ""
3340-
3341-#: ../data/gtkbuilder/UpdateManager.ui.h:21
3342-msgid "updates"
3343-msgstr ""
3344-
3345-#: ../data/gtkbuilder/UpdateManager.ui.h:22
3346-msgid "Changes"
3347-msgstr ""
3348-
3349-#: ../data/gtkbuilder/UpdateManager.ui.h:23
3350-msgid "Description"
3351-msgstr ""
3352-
3353-#: ../data/gtkbuilder/UpdateManager.ui.h:24
3354 msgid "Details of updates"
3355 msgstr ""
3356
3357-#: ../data/gtkbuilder/UpdateManager.ui.h:25
3358+#: ../data/gtkbuilder/UpdateManager.ui.h:6
3359 msgid ""
3360 "You are connected via roaming and may be charged for the data consumed by "
3361 "this update."
3362 msgstr ""
3363
3364-#: ../data/gtkbuilder/UpdateManager.ui.h:26
3365+#: ../data/gtkbuilder/UpdateManager.ui.h:7
3366 msgid ""
3367 "You may want to wait until you’re not using a mobile broadband connection."
3368 msgstr ""
3369
3370-#: ../data/gtkbuilder/UpdateManager.ui.h:27
3371+#: ../data/gtkbuilder/UpdateManager.ui.h:8
3372 msgid "It’s safer to connect the computer to AC power before updating."
3373 msgstr ""
3374
3375-#: ../data/gtkbuilder/UpdateManager.ui.h:28
3376-msgid "_Settings..."
3377-msgstr ""
3378-
3379-#: ../data/gtkbuilder/UpdateManager.ui.h:29
3380-msgid "_Install Now"
3381-msgstr ""
3382-
3383 #: ../data/update-manager.desktop.in.h:2
3384 msgid "Software Updates"
3385 msgstr ""
3386@@ -609,46 +409,38 @@
3387 msgid "Show and install available updates"
3388 msgstr ""
3389
3390-#: ../update-manager:71 ../update-manager-text:55
3391+#: ../update-manager:70 ../update-manager-text:55
3392 msgid "Show version and exit"
3393 msgstr ""
3394
3395-#: ../update-manager:74
3396+#: ../update-manager:73
3397 msgid "Directory that contains the data files"
3398 msgstr ""
3399
3400-#: ../update-manager:77
3401+#: ../update-manager:76
3402 msgid "Check if a new Ubuntu release is available"
3403 msgstr ""
3404
3405-#: ../update-manager:80
3406+#: ../update-manager:79
3407 msgid "Check if upgrading to the latest devel release is possible"
3408 msgstr ""
3409
3410-#: ../update-manager:84
3411+#: ../update-manager:83
3412 msgid "Upgrade using the latest proposed version of the release upgrader"
3413 msgstr ""
3414
3415-#: ../update-manager:91
3416+#: ../update-manager:90
3417 msgid "Do not focus on map when starting"
3418 msgstr ""
3419
3420-#: ../update-manager:94
3421-msgid "Try to run a dist-upgrade"
3422+#: ../update-manager:93
3423+msgid "Do not check for updates when starting"
3424 msgstr ""
3425
3426 #: ../update-manager:97
3427-msgid "Do not check for updates when starting"
3428-msgstr ""
3429-
3430-#: ../update-manager:101
3431 msgid "Test upgrade with a sandbox aufs overlay"
3432 msgstr ""
3433
3434-#: ../update-manager:121
3435-msgid "Running partial upgrade"
3436-msgstr ""
3437-
3438 #: ../update-manager-text:59
3439 msgid "Show description of the package instead of the changelog"
3440 msgstr ""
3441@@ -713,7 +505,7 @@
3442
3443 #. Why do we use %s here instead of $strings or {} format placeholders?
3444 #. It's because we don't want to break existing translations.
3445-#: ../janitor/plugincore/exceptions.py:42
3446+#: ../janitor/plugincore/exceptions.py:43
3447 #, python-format
3448 msgid "Unimplemented method: %s"
3449 msgstr ""
3450@@ -722,45 +514,45 @@
3451 msgid "A file on disk"
3452 msgstr ""
3453
3454-#: ../janitor/plugincore/core/missing_package_cruft.py:39
3455+#: ../janitor/plugincore/core/missing_package_cruft.py:40
3456 msgid "Install missing package."
3457 msgstr ""
3458
3459 #. 2012-06-08 BAW: i18n string; don't use {} or PEP 292.
3460-#: ../janitor/plugincore/core/missing_package_cruft.py:49
3461+#: ../janitor/plugincore/core/missing_package_cruft.py:50
3462 #, python-format
3463 msgid "Package %s should be installed."
3464 msgstr ""
3465
3466-#: ../janitor/plugincore/core/package_cruft.py:49
3467+#: ../janitor/plugincore/core/package_cruft.py:50
3468 msgid ".deb package"
3469 msgstr ""
3470
3471-#: ../janitor/plugincore/plugins/langpack_manual_plugin.py:46
3472+#: ../janitor/plugincore/plugins/langpack_manual_plugin.py:47
3473 #, python-format
3474 msgid "%s needs to be marked as manually installed."
3475 msgstr ""
3476
3477-#: ../janitor/plugincore/plugins/kdelibs4to5_plugin.py:49
3478+#: ../janitor/plugincore/plugins/kdelibs4to5_plugin.py:50
3479 msgid ""
3480 "When upgrading, if kdelibs4-dev is installed, kdelibs5-dev needs to be "
3481 "installed. See bugs.launchpad.net, bug #279621 for details."
3482 msgstr ""
3483
3484-#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:44
3485+#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:45
3486 #, python-format
3487 msgid "%i obsolete entries in the status file"
3488 msgstr ""
3489
3490-#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:47
3491+#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:48
3492 msgid "Obsolete entries in dpkg status"
3493 msgstr ""
3494
3495 #. pragma: no cover
3496-#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:50
3497+#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:51
3498 msgid "Obsolete dpkg status entries"
3499 msgstr ""
3500
3501-#: ../janitor/plugincore/plugins/remove_lilo_plugin.py:42
3502+#: ../janitor/plugincore/plugins/remove_lilo_plugin.py:43
3503 msgid "Remove lilo since grub is also installed.(See bug #314004 for details.)"
3504 msgstr ""

Subscribers

People subscribed via source and target branches

to status/vote changes: