[arch-projects] [namcap 2/6] Convert sodepends to use pyalpm

Dan McGee dan at archlinux.org
Wed Jun 1 12:16:48 EDT 2011


Signed-off-by: Dan McGee <dan at archlinux.org>
---
 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)
 
 
-- 
1.7.5.2



More information about the arch-projects mailing list