diff options
| author | Michael Vogt <egon@top> | 2005-12-07 12:50:49 +0100 |
|---|---|---|
| committer | Michael Vogt <egon@top> | 2005-12-07 12:50:49 +0100 |
| commit | a03af80fb420ac3889c46707fd9abaa3b6735f03 (patch) | |
| tree | cc9ce22dc22ebc3ed250c801f8a6dc92d0239db6 | |
| parent | 1746af9a6a0440c5fe85cb782ef8afce58a8338b (diff) | |
| download | python-apt-a03af80fb420ac3889c46707fd9abaa3b6735f03.tar.gz | |
* cleaned up the source in DistUpgrade, put the functions in multiple sources
| -rw-r--r-- | DistUpgrade/DistUpgradeControler.py (renamed from DistUpgrade/DistUpgrade.py) | 204 | ||||
| -rw-r--r-- | DistUpgrade/DistUpgradeView.py | 38 | ||||
| -rw-r--r-- | DistUpgrade/DistUpgradeViewGtk.py | 181 | ||||
| -rw-r--r-- | DistUpgrade/TODO | 1 | ||||
| -rwxr-xr-x | DistUpgrade/dist-upgrade.py | 9 |
5 files changed, 229 insertions, 204 deletions
diff --git a/DistUpgrade/DistUpgrade.py b/DistUpgrade/DistUpgradeControler.py index 22bf916c..e5c09249 100644 --- a/DistUpgrade/DistUpgrade.py +++ b/DistUpgrade/DistUpgradeControler.py @@ -1,12 +1,5 @@ #!/usr/bin/python2.4 -import pygtk -pygtk.require('2.0') -import gtk -import gtk.gdk -import gtk.glade -import vte -import gobject import apt import apt_pkg @@ -15,10 +8,8 @@ import os import subprocess from UpdateManager.Common.SimpleGladeApp import SimpleGladeApp -from UpdateManager.GtkProgress import GtkOpProgress from SoftwareProperties.aptsources import SourcesList, SourceEntry from gettext import gettext as _ -from apt.progress import InstallProgress class MyCache(apt.Cache): @@ -38,203 +29,8 @@ class MyCache(apt.Cache): return False return ver.Downloadable -class DistUpgradeView(object): - " abstraction for the upgrade view " - def __init__(self): - pass - def getOpCacheProgress(self): - " return a OpProgress() subclass for the given graphic" - return apt.progress.OpProgress() - def getFetchProgress(self): - " return a fetch progress object " - return apt.progress.FetchProgress() - def getInstallProgress(self): - " return a install progress object " - return apt.progress.InstallProgress() - def updateStatus(self, msg): - """ update the current status of the distUpgrade based - on the current view - """ - pass - def confirmChanges(self, changes, downloadSize): - """ display the list of changed packages (apt.Package) and - return if the user confirms them - """ - self.toInstall = [] - self.toUpgrade = [] - self.toRemove = [] - for pkg in changes: - if pkg.markedInstall: self.toInstall.append(pkg.name) - elif pkg.markedUpgrade: self.toUpgrade.append(pkg.name) - elif pkg.markedDelete: self.toRemove.append(pkg.name) - # no downgrades, re-installs - assert(len(self.toInstall)+len(self.toUpgrade)+len(self.toRemove) == len(changes)) - def askYesNoQuestion(self, summary, msg): - pass - def error(self, summary, msg): - pass -class GtkDistUpgradeView(DistUpgradeView,SimpleGladeApp): - " gtk frontend of the distUpgrade tool " - - class GtkFetchProgressAdapter(apt.progress.FetchProgress): - # FIXME: we really should have some sort of "we are at step" - # xy in the gui - # FIXME2: we need to thing about mediaCheck here too - def __init__(self, parent): - # if this is set to false the download will cancel - self.status = parent.label_extra_status - self.progress = parent.progressbar_cache - def start(self): - self.progress.show() - self.progress.set_fraction(0) - self.status.show() - def stop(self): - self.progress.hide() - self.status.hide() - self.status.hide() - def pulse(self): - # FIXME: move the status_str and progress_str into python-apt - # (python-apt need i18n first for this) - 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 True - - class GtkInstallProgressAdapter(InstallProgress): - def __init__(self,parent): - InstallProgress.__init__(self) - self.label_status = parent.label_extra_status - self.progress = parent.progressbar_cache - self.expander = parent.expander_terminal - self.term = parent._term - # setup the child waiting - reaper = vte.reaper_get() - reaper.connect("child-exited", self.child_exited) - self.finished = False - def startUpdate(self): - self.label_status.show() - self.label_status.set_text(_("Installing updates ...")) - self.progress.show() - self.progress.set_fraction(0.0) - self.progress.set_text("") - self.expander.show() - self.term.show() - # FIXME: set the environment up for DEBCONF and APT_LISTCHANGES - # to default to gtk frontends, also add support for the timeout - # of the terminal (to display something useful then) - # -> longer term, move this code into python-apt - self.env = ["VTE_PTY_KEEP_FD=%s"% self.writefd, - "DEBIAN_FRONTEND=gnome", - "APT_LISTCHANGES_FRONTEND=gtk"] - def fork(self): - return self.term.forkpty(envv=self.env) - def child_exited(self, term, pid, status): - self.apt_status = os.WEXITSTATUS(status) - self.finished = True - def waitChild(self): - while not self.finished: - self.updateInterface() - return self.apt_status - def finishUpdate(self): - self.progress.hide() - self.label_status.hide() - def updateInterface(self): - InstallProgress.updateInterface(self) - self.progress.set_fraction(self.percent/100.0) - self.label_status.set_text(self.status) - while gtk.events_pending(): - gtk.main_iteration() - - - def __init__(self): - # FIXME: i18n must be somewhere relative do this dir - SimpleGladeApp.__init__(self, "DistUpgrade.glade", - None, domain="update-manager") - self._opCacheProgress = GtkOpProgress(self.progressbar_cache) - self._fetchProgress = self.GtkFetchProgressAdapter(self) - self._installProgress = self.GtkInstallProgressAdapter(self) - # details dialog - self.details_list = gtk.ListStore(gobject.TYPE_STRING) - column = gtk.TreeViewColumn("") - render = gtk.CellRendererText() - column.pack_start(render, True) - column.add_attribute(render, "markup", 0) - self.treeview_details.append_column(column) - self.treeview_details.set_model(self.details_list) - - def create_terminal(self, arg1,arg2,arg3,arg4): - " helper to create a vte terminal " - print "create_vte (for the custom glade widget)" - self._term = vte.Terminal() - self._term.set_font_from_string("monospace 10") - return self._term - def getFetchProgress(self): - return self._fetchProgress - def getInstallProgress(self): - return self._installProgress - def getOpCacheProgress(self): - return self._opCacheProgress - def updateStatus(self, msg): - self.label_status.set_markup("%s" % msg) - def error(self, summary, msg): - dialog = gtk.MessageDialog(self.window_main, 0, gtk.MESSAGE_ERROR, - gtk.BUTTONS_OK,"") - msg="<big><b>%s</b></big>\n\n%s" % (summary,msg) - dialog.set_markup(msg) - dialog.vbox.set_spacing(6) - dialog.run() - dialog.destroy() - return False - def confirmChanges(self, changes, downloadSize): - # FIXME: add a whitelist here for packages that we expect to be - # removed (how to calc this automatically?) - DistUpgradeView.confirmChanges(self, changes,downloadSize) - msg = _("%s packages are going to be removed.\n" - "%s packages are going to be newly installed.\n" - "%s packages are going to be upgraded.\n\n" - "%s needs to be fetched" % (len(self.toRemove), - len(self.toInstall), - len(self.toUpgrade), - apt_pkg.SizeToStr(downloadSize))) - self.label_changes.set_text(msg) - # fill in the details - self.details_list.clear() - for rm in self.toRemove: - self.details_list.append([_("<b>To be removed: %s</b>" % rm)]) - for inst in self.toInstall: - self.details_list.append([_("To be installed: %s" % inst)]) - for up in self.toUpgrade: - self.details_list.append([_("To be upgraded: %s" % up)]) - res = self.dialog_changes.run() - self.dialog_changes.hide() - if res == gtk.RESPONSE_YES: - return True - return False - def askYesNoQuestion(self, summary, msg): - msg = "<big><b>%s</b></big>\n\n%s" % (summary,msg) - dialog = gtk.MessageDialog(parent=self.window_main, - flags=gtk.DIALOG_MODAL, - type=gtk.MESSAGE_QUESTION, - buttons=gtk.BUTTONS_YES_NO) - dialog.set_markup(msg) - res = dialog.run() - dialog.destroy() - if res == gtk.RESPONSE_YES: - return True - return False - - class DistUpgradeControler(object): def __init__(self, distUpgradeView): self._view = distUpgradeView diff --git a/DistUpgrade/DistUpgradeView.py b/DistUpgrade/DistUpgradeView.py new file mode 100644 index 00000000..98e80c08 --- /dev/null +++ b/DistUpgrade/DistUpgradeView.py @@ -0,0 +1,38 @@ + +class DistUpgradeView(object): + " abstraction for the upgrade view " + def __init__(self): + pass + def getOpCacheProgress(self): + " return a OpProgress() subclass for the given graphic" + return apt.progress.OpProgress() + def getFetchProgress(self): + " return a fetch progress object " + return apt.progress.FetchProgress() + def getInstallProgress(self): + " return a install progress object " + return apt.progress.InstallProgress() + def updateStatus(self, msg): + """ update the current status of the distUpgrade based + on the current view + """ + pass + def confirmChanges(self, changes, downloadSize): + """ display the list of changed packages (apt.Package) and + return if the user confirms them + """ + self.toInstall = [] + self.toUpgrade = [] + self.toRemove = [] + for pkg in changes: + if pkg.markedInstall: self.toInstall.append(pkg.name) + elif pkg.markedUpgrade: self.toUpgrade.append(pkg.name) + elif pkg.markedDelete: self.toRemove.append(pkg.name) + # no downgrades, re-installs + assert(len(self.toInstall)+len(self.toUpgrade)+len(self.toRemove) == len(changes)) + def askYesNoQuestion(self, summary, msg): + " ask a Yes/No question and return True on 'Yes' " + pass + def error(self, summary, msg): + " display a error " + pass diff --git a/DistUpgrade/DistUpgradeViewGtk.py b/DistUpgrade/DistUpgradeViewGtk.py new file mode 100644 index 00000000..fa4aa4ee --- /dev/null +++ b/DistUpgrade/DistUpgradeViewGtk.py @@ -0,0 +1,181 @@ +import pygtk +pygtk.require('2.0') +import gtk +import gtk.gdk +import gtk.glade +import vte +import gobject + +import apt +import apt_pkg +import os + +from apt.progress import InstallProgress +from DistUpgradeView import DistUpgradeView +from UpdateManager.Common.SimpleGladeApp import SimpleGladeApp + +from UpdateManager.GtkProgress import GtkOpProgress +from gettext import gettext as _ + +class GtkFetchProgressAdapter(apt.progress.FetchProgress): + # FIXME: we really should have some sort of "we are at step" + # xy in the gui + # FIXME2: we need to thing about mediaCheck here too + def __init__(self, parent): + # if this is set to false the download will cancel + self.status = parent.label_extra_status + self.progress = parent.progressbar_cache + def start(self): + self.progress.show() + self.progress.set_fraction(0) + self.status.show() + def stop(self): + self.progress.hide() + self.status.hide() + self.status.hide() + def pulse(self): + # FIXME: move the status_str and progress_str into python-apt + # (python-apt need i18n first for this) + 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 True + +class GtkInstallProgressAdapter(InstallProgress): + def __init__(self,parent): + InstallProgress.__init__(self) + self.label_status = parent.label_extra_status + self.progress = parent.progressbar_cache + self.expander = parent.expander_terminal + self.term = parent._term + # setup the child waiting + reaper = vte.reaper_get() + reaper.connect("child-exited", self.child_exited) + self.finished = False + def startUpdate(self): + # FIXME: add support for the timeout + # of the terminal (to display something useful then) + # -> longer term, move this code into python-apt + self.label_status.show() + self.label_status.set_text(_("Installing updates ...")) + self.progress.show() + self.progress.set_fraction(0.0) + self.progress.set_text("") + self.expander.show() + self.term.show() + self.env = ["VTE_PTY_KEEP_FD=%s"% self.writefd, + "DEBIAN_FRONTEND=gnome", + "APT_LISTCHANGES_FRONTEND=gtk"] + def error(self, error): + pass + def conffile(self, current, new): + pass + def fork(self): + return self.term.forkpty(envv=self.env) + def child_exited(self, term, pid, status): + self.apt_status = os.WEXITSTATUS(status) + self.finished = True + def waitChild(self): + while not self.finished: + self.updateInterface() + return self.apt_status + def finishUpdate(self): + self.progress.hide() + self.label_status.hide() + def updateInterface(self): + InstallProgress.updateInterface(self) + self.progress.set_fraction(self.percent/100.0) + self.label_status.set_text(self.status) + while gtk.events_pending(): + gtk.main_iteration() + + +class GtkDistUpgradeView(DistUpgradeView,SimpleGladeApp): + " gtk frontend of the distUpgrade tool " + + + + def __init__(self): + # FIXME: i18n must be somewhere relative do this dir + SimpleGladeApp.__init__(self, "DistUpgrade.glade", + None, domain="update-manager") + self._opCacheProgress = GtkOpProgress(self.progressbar_cache) + self._fetchProgress = GtkFetchProgressAdapter(self) + self._installProgress = GtkInstallProgressAdapter(self) + # details dialog + self.details_list = gtk.ListStore(gobject.TYPE_STRING) + column = gtk.TreeViewColumn("") + render = gtk.CellRendererText() + column.pack_start(render, True) + column.add_attribute(render, "markup", 0) + self.treeview_details.append_column(column) + self.treeview_details.set_model(self.details_list) + + def create_terminal(self, arg1,arg2,arg3,arg4): + " helper to create a vte terminal " + self._term = vte.Terminal() + self._term.set_font_from_string("monospace 10") + return self._term + def getFetchProgress(self): + return self._fetchProgress + def getInstallProgress(self): + return self._installProgress + def getOpCacheProgress(self): + return self._opCacheProgress + def updateStatus(self, msg): + self.label_status.set_markup("%s" % msg) + def error(self, summary, msg): + dialog = gtk.MessageDialog(self.window_main, 0, gtk.MESSAGE_ERROR, + gtk.BUTTONS_OK,"") + msg="<big><b>%s</b></big>\n\n%s" % (summary,msg) + dialog.set_markup(msg) + dialog.vbox.set_spacing(6) + dialog.run() + dialog.destroy() + return False + def confirmChanges(self, changes, downloadSize): + # FIXME: add a whitelist here for packages that we expect to be + # removed (how to calc this automatically?) + DistUpgradeView.confirmChanges(self, changes,downloadSize) + msg = _("%s packages are going to be removed.\n" + "%s packages are going to be newly installed.\n" + "%s packages are going to be upgraded.\n\n" + "%s needs to be fetched" % (len(self.toRemove), + len(self.toInstall), + len(self.toUpgrade), + apt_pkg.SizeToStr(downloadSize))) + self.label_changes.set_text(msg) + # fill in the details + self.details_list.clear() + for rm in self.toRemove: + self.details_list.append([_("<b>To be removed: %s</b>" % rm)]) + for inst in self.toInstall: + self.details_list.append([_("To be installed: %s" % inst)]) + for up in self.toUpgrade: + self.details_list.append([_("To be upgraded: %s" % up)]) + res = self.dialog_changes.run() + self.dialog_changes.hide() + if res == gtk.RESPONSE_YES: + return True + return False + def askYesNoQuestion(self, summary, msg): + msg = "<big><b>%s</b></big>\n\n%s" % (summary,msg) + dialog = gtk.MessageDialog(parent=self.window_main, + flags=gtk.DIALOG_MODAL, + type=gtk.MESSAGE_QUESTION, + buttons=gtk.BUTTONS_YES_NO) + dialog.set_markup(msg) + res = dialog.run() + dialog.destroy() + if res == gtk.RESPONSE_YES: + return True + return False diff --git a/DistUpgrade/TODO b/DistUpgrade/TODO index 0c6ee909..6398a3bd 100644 --- a/DistUpgrade/TODO +++ b/DistUpgrade/TODO @@ -1,3 +1,4 @@ +- CDROM upgrades !!! - display a message that all applications should be closed for the dist-upgrade (and that strange things like a crashing panel can happen) diff --git a/DistUpgrade/dist-upgrade.py b/DistUpgrade/dist-upgrade.py new file mode 100755 index 00000000..4ac8422b --- /dev/null +++ b/DistUpgrade/dist-upgrade.py @@ -0,0 +1,9 @@ +#!/usr/bin/python2.4 + +from DistUpgradeViewGtk import GtkDistUpgradeView +from DistUpgradeControler import DistUpgradeControler + +if __name__ == "__main__": + view = GtkDistUpgradeView() + app = DistUpgradeControler(view) + app.run() |
