summaryrefslogtreecommitdiff
path: root/apt/progress/old.py
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2009-07-31 20:51:57 +0200
committerJulian Andres Klode <jak@debian.org>2009-07-31 20:51:57 +0200
commite556b2cbbe5878c33d9e7302e637cc7f35dd14bf (patch)
treeae42303d29a2d9c0332f5560953ad4f9eb2145ee /apt/progress/old.py
parentd3832ab4faf69d8e8e0a0e14b159514505031231 (diff)
downloadpython-apt-e556b2cbbe5878c33d9e7302e637cc7f35dd14bf.tar.gz
apt/progress: Large update, introducing apt.progress.base.InstallProgress.
This contains many updates including the introduction of a new InstallProgress class which replaces the old InstallProgress and DpkgInstallProgress classes.
Diffstat (limited to 'apt/progress/old.py')
-rw-r--r--apt/progress/old.py294
1 files changed, 55 insertions, 239 deletions
diff --git a/apt/progress/old.py b/apt/progress/old.py
index 6b6e21de..c2d95b85 100644
--- a/apt/progress/old.py
+++ b/apt/progress/old.py
@@ -20,72 +20,51 @@
# USA
"""Deprecated progress reporting classes.
-This module provides classes for progress reporting. They can be used with
-e.g., for reporting progress on the cache opening process, the cache update
-progress, or the package install progress.
+This module provides classes for compatibility with python-apt 0.7. They are
+completely deprecated and should not be used anymore.
"""
-import errno
-import fcntl
+
import os
-import re
-import select
import sys
import apt_pkg
from apt.deprecation import AttributeDeprecatedBy, function_deprecated_by
+import warnings
from apt.progress import base, text
-
__all__ = []
class OpProgress(base.OpProgress):
- """Abstract class to implement reporting on cache opening.
-
- Subclass this class to implement simple Operation progress reporting.
- """
+ """Abstract class to implement reporting on cache opening."""
- if apt_pkg._COMPAT_0_7:
- subOp = AttributeDeprecatedBy('subop')
- Op = AttributeDeprecatedBy('op')
+ subOp = AttributeDeprecatedBy('subop')
+ Op = AttributeDeprecatedBy('op')
-class OpTextProgress(text.OpProgress):
+class OpTextProgress(OpProgress, text.OpProgress):
"""A simple text based cache open reporting class."""
- if apt_pkg._COMPAT_0_7:
- subOp = AttributeDeprecatedBy('subop')
- Op = AttributeDeprecatedBy('op')
-
class FetchProgress(object):
- """Report the download/fetching progress.
-
- Subclass this class to implement fetch progress reporting
- """
+ """Report the download/fetching progress."""
# download status constants
- dl_done = 0
- dl_queued = 1
- dl_failed = 2
- dl_hit = 3
- dl_ignored = 4
- dl_status_str = {dl_done: "Done",
- dl_queued: "Queued",
- dl_failed: "Failed",
- dl_hit: "Hit",
- dl_ignored: "Ignored"}
+ (dlDone, dlQueued, dlFailed, dlHit, dlIgnored) = range(5)
+ dlStatusStr = {dlDone: "Done", dlQueued: "Queued", dlFailed: "Failed",
+ dlHit: "Hit", dlIgnored: "Ignored"}
def __init__(self):
self.eta = 0.0
self.percent = 0.0
# Make checking easier
- self.current_bytes = 0
- self.current_items = 0
- self.total_bytes = 0
- self.total_items = 0
- self.current_cps = 0
+ self.currentBytes = 0
+ self.currentItems = 0
+ self.totalBytes = 0
+ self.totalItems = 0
+ self.currentCPS = 0
+ warnings.warn("FetchProgress() is deprecated.", DeprecationWarning)
def start(self):
"""Called when the fetching starts."""
@@ -93,7 +72,7 @@ class FetchProgress(object):
def stop(self):
"""Called when all files have been fetched."""
- def update_status(self, uri, descr, short_descr, status):
+ def updateStatus(self, uri, descr, short_descr, status):
"""Called when the status of an item changes.
This happens eg. when the downloads fails or is completed.
@@ -112,11 +91,11 @@ class FetchProgress(object):
Return True to continue or False to cancel.
"""
- self.percent = (((self.current_bytes + self.current_items) * 100.0) /
- float(self.total_bytes + self.total_items))
- if self.current_cps > 0:
- self.eta = ((self.total_bytes - self.current_bytes) /
- float(self.current_cps))
+ self.percent = (((self.currentBytes + self.currentItems) * 100.0) /
+ float(self.totalBytes + self.totalItems))
+ if self.currentCPS > 0:
+ self.eta = ((self.totalBytes - self.currentBytes) /
+ float(self.currentCPS))
return True
def pulse_items(self, items):
@@ -125,31 +104,16 @@ class FetchProgress(object):
Return True to continue or False to cancel.
"""
- self.percent = (((self.current_bytes + self.current_items) * 100.0) /
- float(self.total_bytes + self.total_items))
- if self.current_cps > 0:
- self.eta = ((self.total_bytes - self.current_bytes) /
- float(self.current_cps))
+ self.percent = (((self.currentBytes + self.currentItems) * 100.0) /
+ float(self.totalBytes + self.totalItems))
+ if self.currentCPS > 0:
+ self.eta = ((self.totalBytes - self.currentBytes) /
+ float(self.currentCPS))
return True
- def media_change(self, medium, drive):
+ def mediaChange(self, medium, drive):
"""react to media change events."""
- if apt_pkg._COMPAT_0_7:
- dlDone = AttributeDeprecatedBy('dl_done')
- dlQueued = AttributeDeprecatedBy('dl_queued')
- dlFailed = AttributeDeprecatedBy('dl_failed')
- dlHit = AttributeDeprecatedBy('dl_hit')
- dlIgnored = AttributeDeprecatedBy('dl_ignored')
- dlStatusStr = AttributeDeprecatedBy('dl_status_str')
- currentBytes = AttributeDeprecatedBy('current_bytes')
- currentItems = AttributeDeprecatedBy('current_items')
- totalBytes = AttributeDeprecatedBy('total_bytes')
- totalItems = AttributeDeprecatedBy('total_items')
- currentCPS = AttributeDeprecatedBy('current_cps')
- updateStatus = function_deprecated_by(update_status)
- mediaChange = function_deprecated_by(media_change)
-
class TextFetchProgress(FetchProgress):
""" Ready to use progress object for terminal windows """
@@ -158,13 +122,13 @@ class TextFetchProgress(FetchProgress):
FetchProgress.__init__(self)
self.items = {}
- def update_status(self, uri, descr, short_descr, status):
+ def updateStatus(self, uri, descr, short_descr, status):
"""Called when the status of an item changes.
This happens eg. when the downloads fails or is completed.
"""
- if status != self.dl_queued:
- print "\r%s %s" % (self.dl_status_str[status], descr)
+ if status != self.dlQueued:
+ print "\r%s %s" % (self.dlStatusStr[status], descr)
self.items[uri] = status
def pulse(self):
@@ -173,9 +137,9 @@ class TextFetchProgress(FetchProgress):
Return True to continue or False to cancel.
"""
FetchProgress.pulse(self)
- if self.current_cps > 0:
+ if self.currentCPS > 0:
s = "[%2.f%%] %sB/s %s" % (self.percent,
- apt_pkg.size_to_str(int(self.current_cps)),
+ apt_pkg.size_to_str(int(self.currentCPS)),
apt_pkg.time_to_str(int(self.eta)))
else:
s = "%2.f%% [Working]" % (self.percent)
@@ -187,16 +151,23 @@ class TextFetchProgress(FetchProgress):
"""Called when all files have been fetched."""
print "\rDone downloading "
- def media_change(self, medium, drive):
+ def mediaChange(self, medium, drive):
"""react to media change events."""
print ("Media change: please insert the disc labeled "
"'%s' in the drive '%s' and press enter") % (medium, drive)
return raw_input() not in ('c', 'C')
- if apt_pkg._COMPAT_0_7:
- updateStatus = function_deprecated_by(update_status)
- mediaChange = function_deprecated_by(media_change)
+
+class CdromProgress(base.CdromProgress):
+ """Report the cdrom add progress.
+
+ This class has been replaced by apt_pkg.CdromProgress.
+ """
+ _basetype = base.CdromProgress
+ askCdromName = function_deprecated_by(_basetype.ask_cdrom_name)
+ changeCdrom = function_deprecated_by(_basetype.change_cdrom)
+ del _basetype
class DumbInstallProgress(base.InstallProgress):
@@ -208,127 +179,19 @@ class DumbInstallProgress(base.InstallProgress):
startUpdate = function_deprecated_by(base.InstallProgress.start_update)
finishUpdate = function_deprecated_by(base.InstallProgress.finish_update)
updateInterface = function_deprecated_by(
- base.InstallProgress.update_interface)
+ base.InstallProgress.update_interface)
-class InstallProgress(DumbInstallProgress):
+class InstallProgress(DumbInstallProgress, base.InstallProgress):
"""An InstallProgress that is pretty useful.
It supports the attributes 'percent' 'status' and callbacks for the dpkg
errors and conffiles and status changes.
"""
- def __init__(self):
- DumbInstallProgress.__init__(self)
- self.select_timeout = 0.1
- (read, write) = os.pipe()
- self.writefd = write
- self.statusfd = os.fdopen(read, "r")
- fcntl.fcntl(self.statusfd.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
- self.read = ""
- self.percent = 0.0
- self.status = ""
-
- def error(self, pkg, errormsg):
- """Called when a error is detected during the install."""
-
- def conffile(self, current, new):
- """Called when a conffile question from dpkg is detected."""
-
- def status_change(self, pkg, percent, status):
- """Called when the status changed."""
-
- def update_interface(self):
- """Called periodically to update the interface."""
- if self.statusfd is None:
- return
- try:
- while not self.read.endswith("\n"):
- self.read += os.read(self.statusfd.fileno(), 1)
- except OSError, (errno_, errstr):
- # resource temporarly unavailable is ignored
- if errno_ != errno.EAGAIN and errno_ != errno.EWOULDBLOCK:
- print errstr
- if not self.read.endswith("\n"):
- return
-
- s = self.read
- #print s
- try:
- (status, pkg, percent, status_str) = s.split(":", 3)
- except ValueError:
- # silently ignore lines that can't be parsed
- self.read = ""
- return
- #print "percent: %s %s" % (pkg, float(percent)/100.0)
- if status == "pmerror":
- self.error(pkg, status_str)
- elif status == "pmconffile":
- # we get a string like this:
- # 'current-conffile' 'new-conffile' useredited distedited
- match = re.match("\s*\'(.*)\'\s*\'(.*)\'.*", status_str)
- if match:
- self.conffile(match.group(1), match.group(2))
- elif status == "pmstatus":
- if float(percent) != self.percent or status_str != self.status:
- self.status_change(pkg, float(percent),
- status_str.strip())
- self.percent = float(percent)
- self.status = status_str.strip()
- self.read = ""
-
- def fork(self):
- """Fork."""
- return os.fork()
-
- def wait_child(self):
- """Wait for child progress to exit."""
- while True:
- try:
- select.select([self.statusfd], [], [], self.select_timeout)
- except select.error, (errno_, errstr):
- if errno_ != errno.EINTR:
- raise
-
- self.update_interface()
- try:
- (pid, res) = os.waitpid(self.child_pid, os.WNOHANG)
- if pid == self.child_pid:
- break
- except OSError, (errno_, errstr):
- if errno_ != errno.EINTR:
- raise
- if errno_ == errno.ECHILD:
- break
- return res
-
- def run(self, pm):
- """Start installing."""
- pid = self.fork()
- if pid == 0:
- # child
- res = pm.do_install(self.writefd)
- os._exit(res)
- self.child_pid = pid
- res = self.wait_child()
- return os.WEXITSTATUS(res)
-
- if apt_pkg._COMPAT_0_7:
- selectTimeout = AttributeDeprecatedBy('select_timeout')
- statusChange = function_deprecated_by(status_change)
- waitChild = function_deprecated_by(wait_child)
- updateInterface = function_deprecated_by(update_interface)
-
-
-class CdromProgress(base.CdromProgress):
- """Report the cdrom add progress.
-
- This class has been replaced by apt_pkg.CdromProgress.
- """
- _basetype = base.CdromProgress
- askCdromName = function_deprecated_by(_basetype.ask_cdrom_name)
- changeCdrom = function_deprecated_by(_basetype.change_cdrom)
- del _basetype
+ selectTimeout = AttributeDeprecatedBy('select_timeout')
+ statusChange = function_deprecated_by(base.InstallProgress.status_change)
+ waitChild = function_deprecated_by(base.InstallProgress.wait_child)
class DpkgInstallProgress(InstallProgress):
@@ -336,54 +199,7 @@ class DpkgInstallProgress(InstallProgress):
def run(self, debfile):
"""Start installing the given Debian package."""
- if apt_pkg._COMPAT_0_7: # Deprecated stuff
- self.debfile = debfile
- self.debname = os.path.basename(debfile).split("_")[0]
-
- pid = self.fork()
- if pid == 0:
- # child
- res = os.system("/usr/bin/dpkg --status-fd %s -i %s" % \
- (self.writefd, debfile))
- os._exit(os.WEXITSTATUS(res))
- self.child_pid = pid
- res = self.wait_child()
- return res
-
- def update_interface(self):
- """Process status messages from dpkg."""
- if self.statusfd is None:
- return
- while True:
- try:
- self.read += os.read(self.statusfd.fileno(), 1)
- except OSError, (errno_, errstr):
- # resource temporarly unavailable is ignored
- if errno_ != 11:
- print errstr
- break
- if not self.read.endswith("\n"):
- continue
-
- statusl = self.read.split(":")
- if len(statusl) < 3:
- print "got garbage from dpkg: '%s'" % self.read
- self.read = ""
- break
- pkg_name = statusl[1].strip()
- status = statusl[2].strip()
- #print status
- if status == "error":
- self.error(pkg_name, status)
- elif status == "conffile-prompt":
- # we get a string like this:
- # 'current-conffile' 'new-conffile' useredited distedited
- match = re.match("\s*\'(.*)\'\s*\'(.*)\'.*", statusl[3])
- if match:
- self.conffile(match.group(1), match.group(2))
- else:
- self.status = status
- self.read = ""
-
- if apt_pkg._COMPAT_0_7:
- updateInterface = function_deprecated_by(update_interface)
+ # Deprecated stuff
+ self.debfile = debfile
+ self.debname = os.path.basename(debfile).split("_")[0]
+ return base.InstallProgress(self, debfile)