summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--UpdateManager/GtkProgress.py39
-rw-r--r--UpdateManager/MetaRelease.py3
-rw-r--r--UpdateManager/UpdateManager.py62
-rw-r--r--data/UpdateManager.glade219
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>