summaryrefslogtreecommitdiff
path: root/apt
diff options
context:
space:
mode:
Diffstat (limited to 'apt')
-rw-r--r--apt/cache.py27
-rw-r--r--apt/package.py42
2 files changed, 52 insertions, 17 deletions
diff --git a/apt/cache.py b/apt/cache.py
index 4b917236..bfa41edc 100644
--- a/apt/cache.py
+++ b/apt/cache.py
@@ -65,6 +65,7 @@ class Cache(object):
self._callbacks = {}
self._weakref = weakref.WeakValueDictionary()
self._set = set()
+ self._fullnameset = set()
self._sorted_set = None
if memonly:
# force apt to build its caches in memory
@@ -129,9 +130,13 @@ class Cache(object):
self._list = apt_pkg.SourceList()
self._list.read_main_list()
self._set.clear()
+ self._fullnameset.clear()
self._sorted_set = None
self._weakref.clear()
+ self._have_multi_arch = bool(apt_pkg.config.value_list("APT::" +
+ "Architectures"))
+
progress.op = _("Building data structures")
i = last = 0
size = len(self._cache.packages)
@@ -141,7 +146,9 @@ class Cache(object):
last = i
# drop stuff with no versions (cruft)
if pkg.has_versions:
- self._set.add(pkg.name)
+ self._set.add(pkg.get_fullname(pretty=True))
+ if self._have_multi_arch:
+ self._fullnameset.add(pkg.get_fullname(pretty=False))
i += 1
@@ -153,7 +160,7 @@ class Cache(object):
try:
return self._weakref[key]
except KeyError:
- if key in self._set:
+ if key in self._set or key in self._fullnameset:
key = str(key)
pkg = self._weakref[key] = Package(self, self._cache[key])
return pkg
@@ -174,10 +181,10 @@ class Cache(object):
raise StopIteration
def has_key(self, key):
- return (key in self._set)
+ return (key in self._set or key in self._fullnameset)
def __contains__(self, key):
- return (key in self._set)
+ return (key in self._set or key in self._fullnameset)
def __len__(self):
return len(self._set)
@@ -191,10 +198,11 @@ class Cache(object):
marked_keep = self._depcache.marked_keep
for pkg in self._cache.packages:
if not marked_keep(pkg):
+ name = pkg.get_fullname(pretty=True)
try:
- changes.append(self._weakref[pkg.name])
+ changes.append(self._weakref[name])
except KeyError:
- package = self._weakref[pkg.name] = Package(self, pkg)
+ package = self._weakref[name] = Package(self, pkg)
changes.append(package)
return changes
@@ -233,7 +241,7 @@ class Cache(object):
for pkg in self._cache.packages:
cand = get_candidate_ver(pkg)
if cand and not cand.downloadable and pkg.inst_state in states:
- reqreinst.add(pkg.name)
+ reqreinst.add(pkg.get_fullname(pretty=True))
return reqreinst
def _run_fetcher(self, fetcher):
@@ -318,10 +326,11 @@ class Cache(object):
for provides, providesver, version in vp.provides_list:
pkg = version.parent_pkg
if not candidate_only or (version == get_candidate_ver(pkg)):
+ name = pkg.get_fullname(pretty=True)
try:
- providers.add(self._weakref[pkg.name])
+ providers.add(self._weakref[name])
except KeyError:
- package = self._weakref[pkg.name] = Package(self, pkg)
+ package = self._weakref[name] = Package(self, pkg)
providers.add(package)
return list(providers)
diff --git a/apt/package.py b/apt/package.py
index f16ac2a4..d7d5d167 100644
--- a/apt/package.py
+++ b/apt/package.py
@@ -374,9 +374,9 @@ class Version(object):
def source_name(self):
"""Return the name of the source package."""
try:
- return self._records.source_pkg or self.package.name
+ return self._records.source_pkg or self.package.shortname
except IndexError:
- return self.package.name
+ return self.package.shortname
@property
def source_version(self):
@@ -549,7 +549,7 @@ class Version(object):
dsc = None
record = self._records
- source_name = record.source_pkg or self.package.name
+ source_name = record.source_pkg or self.package.shortname
source_version = record.source_ver or self._cand.ver_str
source_lookup = src.lookup(source_name)
@@ -674,7 +674,8 @@ class Package(object):
self._changelog = "" # Cached changelog
def __repr__(self):
- return '<Package: name:%r id:%r>' % (self._pkg.name, self._pkg.id)
+ return '<Package: name:%r architecture=%r id:%r>' % (self._pkg.name,
+ self._pkg.architecture, self._pkg.id)
def candidate(self):
"""Return the candidate version of the package.
@@ -706,7 +707,30 @@ class Package(object):
@property
def name(self):
- """Return the name of the package."""
+ """Return the name of the package, possibly including architecture.
+
+ If the package is not part of the system's preferred architecture,
+ return the same as :attr:`fullname`, otherwise return the same
+ as :attr:`shortname`
+
+ .. versionchanged:: 0.7.100.3
+ As part of multi-arch, this field now may include architecture
+ information.
+ """
+ return self._pkg.get_fullname(True)
+
+ @property
+ def fullname(self):
+ """Return the name of the package, including architecture.
+
+ .. versionadded:: 0.7.100.3"""
+ return self._pkg.get_fullname(False)
+
+ @property
+ def shortname(self):
+ """Return the name of the package, without architecture.
+
+ .. versionadded:: 0.7.100.3"""
return self._pkg.name
@property
@@ -757,13 +781,15 @@ class Package(object):
"""
return getattr(self.installed, 'dependencies', [])
- @DeprecatedProperty
def architecture(self):
"""Return the Architecture of the package.
- .. deprecated:: 0.7.9
+ .. versionchanged:: 0.7.100.3
+ This is now the package's architecture in the multi-arch sense,
+ previously it was the architecture of the candidate version
+ and deprecated.
"""
- return getattr(self.candidate, "architecture", None)
+ return self._pkg.architecture
@DeprecatedProperty
def candidateDownloadable(self): #pylint: disable-msg=C0103