summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt/debfile.py2
-rw-r--r--apt/package.py148
-rw-r--r--apt/progress/__init__.py5
-rw-r--r--debian/changelog52
-rw-r--r--debian/compat2
-rw-r--r--debian/control9
-rw-r--r--debian/python-apt-dbg.install1
-rw-r--r--debian/python-apt.docs2
-rw-r--r--debian/python-apt.install9
-rwxr-xr-xdebian/rules50
-rwxr-xr-xsetup.py6
11 files changed, 208 insertions, 78 deletions
diff --git a/apt/debfile.py b/apt/debfile.py
index 0406a250..0e455508 100644
--- a/apt/debfile.py
+++ b/apt/debfile.py
@@ -78,7 +78,7 @@ class DebPackage(object):
member)
break
except SystemError:
- return [_("List of files for '%s'could not be read" %
+ return [_("List of files for '%s' could not be read" %
self.filename)]
return files
diff --git a/apt/package.py b/apt/package.py
index f5bdc47d..7cbb4711 100644
--- a/apt/package.py
+++ b/apt/package.py
@@ -29,11 +29,16 @@ import subprocess
import urllib2
import warnings
+try:
+ from collections import Sequence
+except ImportError:
+ Sequence = object
+
import apt_pkg
import apt.progress
__all__ = ('BaseDependency', 'Dependency', 'Origin', 'Package', 'Record',
- 'Version')
+ 'Version', 'VersionList')
def _(string):
@@ -59,14 +64,16 @@ class BaseDependency(object):
name - The name of the dependency
relation - The relation (>>,>=,==,<<,<=,)
version - The version depended on
+ rawtype - The type of the dependendy (e.g. 'Recommends')
preDepend - Boolean value whether this is a pre-dependency.
"""
- def __init__(self, name, rel, ver, pre):
+ def __init__(self, name, rel, ver, pre, rawtype=None):
self.name = name
self.relation = rel
self.version = ver
self.preDepend = pre
+ self.rawtype = rawtype
def __repr__(self):
return ('<BaseDependency: name:%r relation:%r version:%r preDepend:%r>'
@@ -189,17 +196,47 @@ class Version(object):
self.package = package
self._cand = cand
+ def _cmp(self, other):
+ try:
+ return apt_pkg.VersionCompare(self._cand.VerStr, other.version)
+ except AttributeError:
+ return apt_pkg.VersionCompare(self._cand.VerStr, other)
+
def __eq__(self, other):
- return self._cand.ID == other._cand.ID
+ try:
+ return self._cmp(other) == 0
+ except TypeError:
+ return NotImplemented
+
+ def __ge__(self, other):
+ try:
+ return self._cmp(other) >= 0
+ except TypeError:
+ return NotImplemented
def __gt__(self, other):
- return apt_pkg.VersionCompare(self.version, other.version) > 0
+ try:
+ return self._cmp(other) > 0
+ except TypeError:
+ return NotImplemented
+
+ def __le__(self, other):
+ try:
+ return self._cmp(other) <= 0
+ except TypeError:
+ return NotImplemented
def __lt__(self, other):
- return apt_pkg.VersionCompare(self.version, other.version) < 0
+ try:
+ return self._cmp(other) < 0
+ except TypeError:
+ return NotImplemented
def __ne__(self, other):
- return not self.__eq__(other)
+ try:
+ return self._cmp(other) != 0
+ except TypeError:
+ return NotImplemented
def __hash__(self):
return self._cand.Hash
@@ -324,9 +361,8 @@ class Version(object):
"""Return a Record() object for this version."""
return Record(self._records.Record)
- @property
- def dependencies(self):
- """Return the dependencies of the package version."""
+ def get_dependencies(self, *types):
+ """Return a list of Dependency objects for the given types."""
depends_list = []
depends = self._cand.DependsList
for t in ["PreDepends", "Depends"]:
@@ -336,13 +372,23 @@ class Version(object):
for depOr in depVerList:
base_deps.append(BaseDependency(depOr.TargetPkg.Name,
depOr.CompType, depOr.TargetVer,
- (t == "PreDepends")))
+ (t == "PreDepends"), deptype=t))
depends_list.append(Dependency(base_deps))
except KeyError:
pass
return depends_list
@property
+ def dependencies(self):
+ """Return the dependencies of the package version."""
+ return self.get_dependencies("PreDepends", "Depends")
+
+ @property
+ def recommends(self):
+ """Return the recommends of the package version."""
+ return self.get_dependencies("Recommends")
+
+ @property
def origins(self):
"""Return a list of origins for the package version."""
origins = []
@@ -469,6 +515,81 @@ class Version(object):
return os.path.abspath(dsc)
+class VersionList(Sequence):
+ """Provide a mapping & sequence interface to all versions of a package.
+
+ This class can be used like a dictionary, where version strings are the
+ keys. It can also be used as a sequence, where integers are the keys.
+
+ You can also convert this to a dictionary or a list, using the usual way
+ of dict(version_list) or list(version_list). This is useful if you need
+ to access the version objects multiple times, because they do not have to
+ be recreated this way.
+
+ Examples ('package.versions' being a version list):
+ '0.7.92' in package.versions # Check whether 0.7.92 is a valid version.
+ package.versions[0] # Return first version or raise IndexError
+ package.versions[0:2] # Return a new VersionList for objects 0-2
+ package.versions['0.7.92'] # Return version 0.7.92 or raise KeyError
+ package.versions.keys() # All keys, as strings.
+ max(package.versions)
+ """
+
+ def __init__(self, package, slice=None):
+ self._package = package # apt.package.Package()
+ self._versions = package._pkg.VersionList # [apt_pkg.Version(), ...]
+ if slice:
+ self._versions = self._versions[slice]
+
+ def __getitem__(self, item):
+ if isinstance(item, slice):
+ return self.__class__(self._package, item)
+ try:
+ # Sequence interface, item is an integer
+ return Version(self._package, self._versions[item])
+ except TypeError:
+ # Dictionary interface item is a string.
+ for ver in self._versions:
+ if ver.ver_str == item:
+ return Version(self._package, ver)
+ raise KeyError("Version: %r not found." % (item))
+
+ def __repr__(self):
+ return '<VersionList: %r>' % self.keys()
+
+ def __iter__(self):
+ """Return an iterator over all value objects."""
+ return (Version(self._package, ver) for ver in self._versions)
+
+ def __contains__(self, item):
+ if isinstance(item, Version): # Sequence interface
+ item = item.version
+ # Dictionary interface.
+ for ver in self._versions:
+ if ver.ver_str == item:
+ return True
+ return False
+
+ def __eq__(self, other):
+ return list(self) == list(other)
+
+ def __len__(self):
+ return len(self._versions)
+
+ # Mapping interface
+
+ def keys(self):
+ """Return a list of all versions, as strings."""
+ return [ver.VerStr for ver in self._versions]
+
+ def get(self, key, default=None):
+ """Return the key or the default."""
+ try:
+ return self[key]
+ except LookupError:
+ return default
+
+
class Package(object):
"""Representation of a package in a cache.
@@ -488,7 +609,7 @@ class Package(object):
def candidate(self):
"""Return the candidate version of the package.
-
+
This property is writeable to allow you to set the candidate version
of the package. Just assign a Version() object, and it will be set as
the candidate version.
@@ -881,11 +1002,11 @@ class Package(object):
@property
def versions(self):
- """Return a list of versions.
+ """Return a VersionList() object for all available versions.
:since: 0.7.9
"""
- return [Version(self, ver) for ver in self._pkg.VersionList]
+ return VersionList(self)
# depcache actions
@@ -986,6 +1107,7 @@ def _test():
print "InstalledSize: %s " % pkg.candidate.installed_size
print "PackageSize: %s " % pkg.candidate.size
print "Dependencies: %s" % pkg.installed.dependencies
+ print "Recommends: %s" % pkg.installed.recommends
for dep in pkg.candidate.dependencies:
print ",".join("%s (%s) (%s) (%s)" % (o.name, o.version, o.relation,
o.preDepend) for o in dep.or_dependencies)
diff --git a/apt/progress/__init__.py b/apt/progress/__init__.py
index b9288c2c..337bd161 100644
--- a/apt/progress/__init__.py
+++ b/apt/progress/__init__.py
@@ -112,7 +112,7 @@ class FetchProgress(object):
This happens eg. when the downloads fails or is completed.
"""
- def update_status_full(self, uri, descr, short_descr, status, file_size,
+ def update_status_full(self, uri, descr, short_descr, status, file_size,
partial_size):
"""Called when the status of an item changes.
@@ -291,7 +291,6 @@ class InstallProgress(DumbInstallProgress):
except select.error, (errno_, errstr):
if errno_ != errno.EINTR:
raise
- break
self.updateInterface()
try:
(pid, res) = os.waitpid(self.child_pid, os.WNOHANG)
@@ -300,6 +299,8 @@ class InstallProgress(DumbInstallProgress):
except OSError, (errno_, errstr):
if errno_ != errno.EINTR:
raise
+ if errno_ == errno.ECHILD:
+ break
return res
def run(self, pm):
diff --git a/debian/changelog b/debian/changelog
index d63f01a0..6ef1fff6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,15 +1,37 @@
-python-apt (0.7.11.2ubuntu1) UNRELEASED; urgency=low
+python-apt (0.7.12.1ubuntu1) karmic; urgency=low
+
+ [ Michael Vogt ]
+ * apt/package.py:
+ - add "recommends" property
+ * debian/control:
+ - change build-dep for libapt-pkg-dev to >= 0.7.21
+ * merged with debian/unstable
[ Loïc Minier ]
* Revert addition of gcc and gcc_s to python-apt libs as the toolchain has
been fixed; LP: #375334.
-
- [ Michael Vogt ]
- * merged with debian/unstable
- -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 30 Jul 2009 15:51:27 +0200
+ [ Julian Andres Klode ]
+ * apt/package.py:
+ - Introduce Version.get_dependencies() which takes one or more types
+ of dependencies and returns a list of Dependency objects.
+
+ -- Michael Vogt <michael.vogt@ubuntu.com> Wed, 19 Aug 2009 11:33:59 +0200
-python-apt (0.7.11.2) unstable; urgency=low
+python-apt (0.7.12.1) unstable; urgency=low
+
+ * apt/debfile.py:
+ - Fix missing space in message (Closes: #539704)
+ * apt/package.py:
+ - Add missing argument to Version.__le__() and Version.__ge__()
+ * debian/control:
+ - Do not build-depend on python-gtk2 and python-vte on kfreebsd-*.
+ * setup.py:
+ - Always build documentation, even if python-gtk2 is not installed.
+
+ -- Julian Andres Klode <jak@debian.org> Mon, 03 Aug 2009 15:17:43 +0200
+
+python-apt (0.7.12.0) unstable; urgency=low
[ Julian Andres Klode ]
* python/cache.cc:
@@ -29,6 +51,14 @@ python-apt (0.7.11.2) unstable; urgency=low
- Allow to set the candidate of a package (Closes: #523997)
+ Support assignments to the 'candidate' property of Package objects.
+ Initial patch by Sebastian Heinlein
+ - Make comparisons of Version object more robust.
+ - Return VersionList objects in Package.versions, which are sequences
+ and also provide features of mappings. (partial API BREAK)
+ + Allows to get a specific version (Closes: #523998)
+ * apt/progress/__init__.py:
+ - Do not break out of InstallProgress.waitChild()'s loop just because it
+ is hitting EINTR, but only on child exit or on ECHILD.
+ * Use debhelper 7 instead of CDBS
[ Stefano Zacchiroli ]
* debian/python-apt.doc-base: register the documentation with the
@@ -36,7 +66,7 @@ python-apt (0.7.11.2) unstable; urgency=low
[ Sebastian Heinlein ]
* apt/progress.py: Extract the package name from the status message
- (Closes: #532660)
+ (Closes: #532660)
-- Julian Andres Klode <jak@debian.org> Thu, 30 Jul 2009 14:08:30 +0200
@@ -45,7 +75,7 @@ python-apt (0.7.11.1) unstable; urgency=low
[ Stephan Peijnik ]
* apt/progress/__init__.py:
- Exception handling fixes in InstallProgress class.
-
+
[ Michael Vogt ]
* python/tag.cc:
- merge patch from John Wright that adds FindRaw method
@@ -60,15 +90,15 @@ python-apt (0.7.11.0) unstable; urgency=low
[ Stephan Peijnik ]
* apt/progress/__init__.py:
- - add update_status_full() that takes file_size/partial_size as
+ - add update_status_full() that takes file_size/partial_size as
additional callback arguments
- - add pulse_items() that takes a addtional "items" tuple that
+ - add pulse_items() that takes a addtional "items" tuple that
gives the user full access to the individual items that are
fetched
* python/progress.cc:
- low level code for update_status_full and pulse_items()
- better threading support
-
+
[ Michael Vogt ]
* aptsources/distro.py:
- fix indent error that causes incorrect sources.list additons
diff --git a/debian/compat b/debian/compat
index 7ed6ff82..7f8f011e 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-5
+7
diff --git a/debian/control b/debian/control
index 99f77927..180cc995 100644
--- a/debian/control
+++ b/debian/control
@@ -7,9 +7,8 @@ Uploaders: Michael Vogt <mvo@debian.org>, Julian Andres Klode <jak@debian.org>
Standards-Version: 3.8.2
XS-Python-Version: all
Build-Depends: apt-utils,
- cdbs,
- debhelper (>= 5.0.37.1),
- libapt-pkg-dev (>= 0.7.22~),
+ debhelper (>= 7.3.5),
+ libapt-pkg-dev (>= 0.7.21),
python-all-dbg,
python-all-dev,
python2.4-dev,
@@ -17,9 +16,9 @@ Build-Depends: apt-utils,
python-central (>= 0.5),
python-debian,
python-distutils-extra (>= 1.9.0),
- python-gtk2,
+ python-gtk2 [!kfreebsd-amd64 !kfreebsd-i386],
python-sphinx (>= 0.5),
- python-vte
+ python-vte [!kfreebsd-amd64 !kfreebsd-i386]
Vcs-Bzr: http://bzr.debian.org/apt/python-apt/debian-sid
Vcs-Browser: http://bzr.debian.org/loggerhead/apt/python-apt/debian-sid/changes
diff --git a/debian/python-apt-dbg.install b/debian/python-apt-dbg.install
new file mode 100644
index 00000000..1bbba721
--- /dev/null
+++ b/debian/python-apt-dbg.install
@@ -0,0 +1 @@
+usr/lib/python*/*/*_d.so
diff --git a/debian/python-apt.docs b/debian/python-apt.docs
index 6ba083f5..177b5837 100644
--- a/debian/python-apt.docs
+++ b/debian/python-apt.docs
@@ -1,4 +1,6 @@
README
+AUTHORS
+TODO
apt/README.apt
data/templates/README.templates
build/doc/html/
diff --git a/debian/python-apt.install b/debian/python-apt.install
index 4910e8ed..ca86ed11 100644
--- a/debian/python-apt.install
+++ b/debian/python-apt.install
@@ -1,3 +1,6 @@
-debian/tmp/usr/lib/python*
-debian/tmp/usr/share/locale
-debian/tmp/usr/share/python-apt
+usr/lib/python*/*/apt_pkg.so
+usr/lib/python*/*/apt_inst.so
+usr/lib/python*/*/*/
+usr/lib/python*/*/*.egg-info
+usr/share/locale
+usr/share/python-apt
diff --git a/debian/rules b/debian/rules
index e9917843..4fcdc0c1 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,42 +1,20 @@
#!/usr/bin/make -f
+export DH_PYCENTRAL=nomove
+export DEBVER=$(shell dpkg-parsechangelog | sed -n -e 's/^Version: //p')
+export CFLAGS=-Wno-write-strings
-DEB_AUTO_CLEANUP_RCS := yes
-DEB_PYTHON_SYSTEM=pycentral
+%:
+ dh --with python-central $@
-export DH_PYCENTRAL=include-links
-
-DEB_PYTHON_PACKAGES_EXCLUDE=python-apt-dbg
-
-# Add here any variable or target overrides you need
-include /usr/share/cdbs/1/rules/debhelper.mk
-include /usr/share/cdbs/1/class/python-distutils.mk
-
-PKG=python-apt
-DEBVER=$(shell dpkg-parsechangelog |sed -n -e '/^Version:/s/^Version: //p')
-DEB_COMPRESS_EXCLUDE:=.html .js _static/* _sources/* _sources/*/* .inv
-DEB_BUILD_PROG:=debuild --preserve-envvar PATH --preserve-envvar CCACHE_DIR -us -uc $(DEB_BUILD_PROG_OPTS)
-export DEBVER
-
-build/python-apt-dbg::
- set -e; \
- for i in $(cdbs_python_build_versions); do \
- python$$i-dbg ./setup.py build; \
- done
-
-install/python-apt-dbg::
- for i in $(cdbs_python_build_versions); do \
- python$$i-dbg ./setup.py install --root $(CURDIR)/debian/python-apt-dbg --install-layout=deb; \
- done
- find debian/python-apt-dbg \
- ! -type d ! -name '*_d.so' | xargs rm -f
- find debian/python-apt-dbg -depth -empty -exec rmdir {} \;
-
-binary-predeb/python-apt::
- ln -sf ../../../../javascript/jquery/jquery.js debian/python-apt/usr/share/doc/python-apt/html/_static/jquery.js
-
-binary-predeb/python-apt-dbg::
+override_dh_installdocs:
+ dh_installdocs
+ ln -sf ../../../../javascript/jquery/jquery.js \
+ debian/python-apt/usr/share/doc/python-apt/html/_static/jquery.js
rm -rf debian/python-apt-dbg/usr/share/doc/python-apt-dbg
ln -s python-apt debian/python-apt-dbg/usr/share/doc/python-apt-dbg
-clean::
- rm -rf build/lib* build/temp*
+override_dh_strip:
+ dh_strip --dbg-package=python-apt-dbg
+
+override_dh_compress:
+ dh_compress -X.js -X_static/* -X _sources/* -X_sources/*/* -X.inv
diff --git a/setup.py b/setup.py
index 9ed21378..a9b45066 100755
--- a/setup.py
+++ b/setup.py
@@ -64,12 +64,6 @@ setup(name="python-apt",
if (len(sys.argv) > 1 and sys.argv[1] == "build" and
sys.version_info[0] >= 2 and sys.version_info[1] >= 5):
import sphinx
- try:
- import pygtk
- except ImportError:
- print >> sys.stderr, ('W: Not building documentation because python-'
- 'gtk2 is not available at the moment.')
- sys.exit(0)
sphinx.main(["sphinx", "-b", "html", "-d", "build/doc/doctrees",
os.path.abspath("doc/source"), "build/doc/html"])
sphinx.main(["sphinx", "-b", "text", "-d", "build/doc/doctrees",