diff options
author | Dan McGee <dan@archlinux.org> | 2011-06-01 11:16:48 -0500 |
---|---|---|
committer | Rémy Oudompheng <remy@archlinux.org> | 2011-06-02 10:30:04 +0200 |
commit | f38ec2329df7044e347510e036be6c1a9983537c (patch) | |
tree | 2ecb3e48468f665b2ce3ceeb5ab3ca5cdcbc8f7e | |
parent | 660aae0f4116bafe299e500a08d7eba6fec9b033 (diff) | |
download | namcap-working.tar.gz namcap-working.zip |
Convert sodepends to use pyalpmworking
Signed-off-by: Dan McGee <dan@archlinux.org>
Signed-off-by: Rémy Oudompheng <remy@archlinux.org>
-rw-r--r-- | Namcap/rules/sodepends.py | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/Namcap/rules/sodepends.py b/Namcap/rules/sodepends.py index d375492..00200f7 100644 --- a/Namcap/rules/sodepends.py +++ b/Namcap/rules/sodepends.py @@ -21,9 +21,11 @@ """Checks dependencies resulting from linking of shared libraries.""" +from collections import defaultdict import re import os import subprocess +import pyalpm import tempfile import Namcap.package from Namcap.ruleclass import * @@ -93,7 +95,7 @@ def finddepends(liblist): dependlist -- a dictionary { package => set(libraries) } orphans -- the list of libraries without owners """ - dependlist = {} + dependlist = defaultdict(set) somatches = {} actualpath = {} @@ -101,8 +103,7 @@ def finddepends(liblist): knownlibs = set(liblist) foundlibs = set() - for j in knownlibs: - actualpath[j] = os.path.realpath('/'+j)[1:] + actualpath = dict((j, os.path.realpath('/' + j)[1:]) for j in knownlibs) # Sometimes packages don't include all so .so, .so.1, .so.1.13, .so.1.13.19 files # They rely on ldconfig to create all the symlinks @@ -111,25 +112,18 @@ def finddepends(liblist): # Whether we should even look at a particular file is_so = re.compile('\.so') - pacmandb = '/var/lib/pacman/local' - for i in os.listdir(pacmandb): - if os.path.isfile(pacmandb+'/'+i+'/files'): - file = open(pacmandb+'/'+i+'/files', errors='ignore') - for j in file: - if not is_so.search(j): - continue - - for k in knownlibs: - # File must be an exact match or have the right .so ending numbers - # i.e. gpm includes libgpm.so and libgpm.so.1.19.0, but everything links to libgpm.so.1 - # We compare find libgpm.so.1.19.0 startswith libgpm.so.1 and .19.0 matches the regexp - if j == actualpath[k] or (j.startswith(actualpath[k]) and so_end.match(j[len(actualpath[k]):])): - n = re.match('(.*)-([^-]*)-([^-]*)', i) - if n.group(1) not in dependlist: - dependlist[n.group(1)] = set() - dependlist[n.group(1)].add(k) - foundlibs.add(k) - file.close() + for pkg in pyalpm.get_localdb().pkgcache: + for j in pkg.files: + if not is_so.search(j): + continue + + for k in knownlibs: + # File must be an exact match or have the right .so ending numbers + # i.e. gpm includes libgpm.so and libgpm.so.1.19.0, but everything links to libgpm.so.1 + # We compare find libgpm.so.1.19.0 startswith libgpm.so.1 and .19.0 matches the regexp + if j == actualpath[k] or (j.startswith(actualpath[k]) and so_end.match(j[len(actualpath[k]):])): + dependlist[pkg.name].add(k) + foundlibs.add(k) orphans = list(knownlibs - foundlibs) return dependlist, orphans @@ -147,6 +141,7 @@ def filllibcache(): if g.group(2).startswith('libc6,x86-64'): libcache['x86-64'][g.group(1)] = g.group(3) else: + # TODO: This is bogus; what do non x86-architectures print? libcache['i686'][g.group(1)] = g.group(3) |