diff options
| -rw-r--r-- | UpdateManager/GtkProgress.py | 39 | ||||
| -rw-r--r-- | UpdateManager/MetaRelease.py | 3 | ||||
| -rw-r--r-- | UpdateManager/UpdateManager.py | 62 | ||||
| -rw-r--r-- | data/UpdateManager.glade | 219 |
4 files changed, 321 insertions, 2 deletions
diff --git a/UpdateManager/GtkProgress.py b/UpdateManager/GtkProgress.py index d1cdf230..f60a06d8 100644 --- a/UpdateManager/GtkProgress.py +++ b/UpdateManager/GtkProgress.py @@ -2,6 +2,7 @@ import pygtk pygtk.require('2.0') import gtk import apt +import apt_pkg from gettext import gettext as _ class GtkOpProgress(apt.progress.OpProgress): @@ -16,3 +17,41 @@ class GtkOpProgress(apt.progress.OpProgress): def done(self): self._progressbar.hide() + +class GtkFetchProgress(apt.progress.FetchProgress): + def __init__(self, parent, summary="", descr=""): + # if this is set to false the download will cancel + self._continue = True + # init vars here + # FIXME: find a more elegant way, this sucks + self.summary = parent.label_fetch_summary + self.status = parent.label_fetch_status + self.progress = parent.progressbar_fetch + self.window_fetch = parent.window_fetch + self.window_fetch.set_transient_for(parent.window_main) + # set summary + if self.summary != "": + self.summary.set_markup("<big><b>%s</b></big> \n\n%s" % + (summary, descr)) + self.window_fetch.set_title(summary) + def start(self): + self.progress.set_fraction(0) + self.window_fetch.show() + def stop(self): + self.window_fetch.hide() + def on_button_fetch_cancel_clicked(self, widget): + self._continue = False + def pulse(self): + apt.progress.FetchProgress.pulse(self) + if self.currentCPS > 0: + self.status.set_text(_("Download rate: %s/s - %s remaining" % (apt_pkg.SizeToStr(self.currentCPS), apt_pkg.TimeToStr(self.eta)))) + else: + self.status.set_text(_("Download rate: unkown")) + self.progress.set_fraction(self.percent/100.0) + currentItem = self.currentItems + 1 + if currentItem > self.totalItems: + currentItem = self.totalItems + self.progress.set_text(_("Downloading file %li of %li" % (currentItem, self.totalItems))) + while gtk.events_pending(): + gtk.main_iteration() + return self._continue diff --git a/UpdateManager/MetaRelease.py b/UpdateManager/MetaRelease.py index a19b2229..e6dd1373 100644 --- a/UpdateManager/MetaRelease.py +++ b/UpdateManager/MetaRelease.py @@ -16,6 +16,7 @@ class Dist(object): self.date = date self.supported = supported self.releaseNotesURI = None + self.upgradeTool = None class MetaRelease(gobject.GObject): @@ -82,6 +83,8 @@ class MetaRelease(gobject.GObject): dist = Dist(name,date,supported) if index_tag.Section.has_key("ReleaseNotes"): dist.releaseNotesURI = index_tag.Section["ReleaseNotes"] + if index_tag.Section.has_key("UpgradeTool"): + dist.upgradeTool = index_tag.Section["UpgradeTool"] dists.append(dist) if name == current_dist_name: current_dist = dist diff --git a/UpdateManager/UpdateManager.py b/UpdateManager/UpdateManager.py index b2ebd1c9..6527d4e9 100644 --- a/UpdateManager/UpdateManager.py +++ b/UpdateManager/UpdateManager.py @@ -20,7 +20,12 @@ import gconf import pango import subprocess import pwd +import thread import xml.sax.saxutils + +# dist-upgrade tool +import tarfile + from gettext import gettext as _ from Common.utils import * @@ -55,6 +60,7 @@ class MyCache(apt.Cache): self.clean() assert self._depcache.BrokenCount == 0 and self._depcache.DelCount == 0 self._depcache.Upgrade() + @@ -419,7 +425,17 @@ class UpdateManager(SimpleGladeApp): def on_button_reload_clicked(self, widget): #print "on_button_reload_clicked" - self.invoke_manager(UPDATE) + #self.invoke_manager(UPDATE) + progress = GtkProgress.GtkFetchProgress(self, + _("Downloading package " + "information"), + _("The repositories will be " + "checked for new, removed " + "or upgraded software " + "packages.")) + self.cache.update(progress) + self.initCache() + def on_button_help_clicked(self, widget): gnome.help_display_desktop(self.gnome_program, "update-manager", "update-manager", "") @@ -610,6 +626,7 @@ class UpdateManager(SimpleGladeApp): print "on_button_dist_upgrade_clicked" # see if we have release notes + # FIXME: care about i18n! (append -$lang or something) if self.new_dist.releaseNotesURI != None: uri = self.new_dist.releaseNotesURI @@ -637,7 +654,48 @@ class UpdateManager(SimpleGladeApp): self.window_main.set_sensitive(True) self.window_main.window.set_cursor(None) - + # now download the tarball with the upgrade script + tmpdir = tempfile.mkdtemp() + os.chdir(tmpdir) + if self.new_dist.upgradeTool != None: + progress = GtkProgress.GtkFetchProgress(self, + _("Downloading upgrade " + "informtion"), + _("The upgrade information " + "are downloaded")) + fetcher = apt_pkg.GetAcquire(progress) + uri = self.new_dist.upgradeTool + print "Downloading %s to %s" % (uri, tmpdir) + af = apt_pkg.GetPkgAcqFile(fetcher,uri, + descr=_("Upgrade tool"), + destDir=tmpdir) + fetcher.Run() + print "Done downloading" + + print "extracting" + tar = tarfile.open(tmpdir+"/"+os.path.basename(uri),"r") + for tarinfo in tar: + tar.extract(tarinfo) + tar.close() + # see if we have a script file that we can run + script = "%s/%s" % (tmpdir, self.new_dist.name) + if not os.path.exists(script): + print "no script file found in extracted tarbal" + else: + print "runing: %s" % script + + # cleanup + os.chdir("..") + # del tmpdir + for root, dirs, files in os.walk(tmpdir, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + #print "would remove file: %s" % os.path.join(root, name) + for name in dirs: + os.rmdir(os.path.join(root, name)) + #print "would remove dir: %s" % os.path.join(root, name) + os.rmdir(tmpdir) + def new_dist_available(self, meta_release, upgradable_to): print "new_dist_available: %s" % upgradable_to.name # check if the user already knowns about this dist diff --git a/data/UpdateManager.glade b/data/UpdateManager.glade index 43df7351..5aebe332 100644 --- a/data/UpdateManager.glade +++ b/data/UpdateManager.glade @@ -1022,4 +1022,223 @@ Need to get the changes from the central server</property> </child> </widget> +<widget class="GtkWindow" id="window_fetch"> + <property name="border_width">6</property> + <property name="title" translatable="yes"></property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property> + <property name="modal">True</property> + <property name="resizable">True</property> + <property name="destroy_with_parent">False</property> + <property name="icon">synaptic.xpm</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="focus_on_map">True</property> + <property name="urgency_hint">False</property> + + <child> + <widget class="GtkVBox" id="vbox6"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkVBox" id="vbox7"> + <property name="border_width">6</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkVBox" id="vbox8"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label_fetch_summary"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkProgressBar" id="progressbar_fetch"> + <property name="visible">True</property> + <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property> + <property name="fraction">0</property> + <property name="pulse_step">0.10000000149</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label_fetch_status"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkExpander" id="expander1"> + <property name="can_focus">True</property> + <property name="expanded">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkVBox" id="vbox9"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow6"> + <property name="height_request">200</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property> + <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTreeView" id="treeview1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers_visible">True</property> + <property name="rules_hint">False</property> + <property name="reorderable">False</property> + <property name="enable_search">False</property> + <property name="fixed_height_mode">False</property> + <property name="hover_selection">False</property> + <property name="hover_expand">False</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> + + <child> + <widget class="GtkLabel" id="label19"> + <property name="visible">True</property> + <property name="label" translatable="yes">Show progress of single files</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkHButtonBox" id="hbuttonbox7"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkButton" id="button_fetch_cancel"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_button_fetch_cancel_clicked" last_modification_time="Thu, 01 Dec 2005 14:36:22 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + </glade-interface> |
