summaryrefslogtreecommitdiffstats
path: root/pym/portage_contents.py
diff options
context:
space:
mode:
authorJason Stubbs <jstubbs@gentoo.org>2005-08-28 08:37:44 +0000
committerJason Stubbs <jstubbs@gentoo.org>2005-08-28 08:37:44 +0000
commitd9fc4acc572c6647a4f27b838d35d27d805d190e (patch)
tree262a8de35d8c7567312757da5f1f66efdc8cece5 /pym/portage_contents.py
downloadportage-d9fc4acc572c6647a4f27b838d35d27d805d190e.tar.gz
portage-d9fc4acc572c6647a4f27b838d35d27d805d190e.tar.bz2
portage-d9fc4acc572c6647a4f27b838d35d27d805d190e.zip
Migration (without history) of the current stable line to subversion.
svn path=/main/branches/2.0/; revision=1941
Diffstat (limited to 'pym/portage_contents.py')
-rw-r--r--pym/portage_contents.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/pym/portage_contents.py b/pym/portage_contents.py
new file mode 100644
index 000000000..0f0b24204
--- /dev/null
+++ b/pym/portage_contents.py
@@ -0,0 +1,161 @@
+# portage_contents.py -- (Persistent) Contents File Management
+# Copyright 1998-2004 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-src/portage/pym/portage_contents.py,v 1.3.2.1 2005/01/16 02:35:33 carpaski Exp $
+cvs_id_string="$Id: portage_contents.py,v 1.3.2.1 2005/01/16 02:35:33 carpaski Exp $"[5:-2]
+
+import os,string,types,sys,copy
+import portage_exception
+import portage_const
+
+#import gettext
+#gettext_t = gettext.translation('portage.contents', portage_const.LOCALE_DATA_PATH)
+#_ = gettext_t.ugettext
+def _(mystr):
+ return mystr
+
+
+FILES_KEY = "\0FILES\0"
+OWNER_KEY = "\0OWNER\0"
+
+
+def ContentsHandler(filename):
+ infile = open(filename)
+ myfiles = []
+ mydirs = []
+
+ mylines = infile.readlines()
+ infile.close()
+ for line in mylines:
+ if line[-1] == '\n':
+ line = line[:-1]
+ parts = string.split(line)
+
+ mytype = parts[0]
+ mytarget = None
+
+ if mytype in ["dir","dev","fif"]:
+ mypath = string.join(parts[1:])
+ elif mytype == "obj":
+ mypath = string.join(parts[1:-2])
+ elif mytype == "sym":
+ sl = string.join(parts[1:-1])
+ sl = string.split(sl, " -> ")
+
+ mypath = sl[0]
+ mytarget = sl[1]
+ else:
+ print _("Unknown type:"),mytype
+
+ if mytype in ["dir"]:
+ mydirs.append(mypath)
+ else:
+ myfiles.append(mypath)
+
+ mydirs.sort()
+ myfiles.sort()
+ return myfiles,mydirs
+
+class PathLookupTable:
+ """Creates a temporary lookup table for paths from files."""
+ def __init__(self,dbname):
+ #if not self.validLocation(dbname):
+ # raise portage_exception.InvalidLocation, dbname
+ #self.base = copy.deepcopy(dbname)
+
+ self.files = []
+ self.pathtree = {}
+
+ def addFromFile(self, filename, handler):
+ if type(handler) != types.FunctionType:
+ raise portage_exception.IncorrectParameter, _("Handler of type '%(type)s' not 'function'") % {"type": type(handler)}
+
+ filelist,dirlist = handler(filename)
+ filestat = os.stat(filename)
+
+ if type(filelist) != types.ListType:
+ raise portage_exception.InvalidDataType, _("%(handler)s returned an invalid file list") % {"handler": handler.__name__}
+ if type(dirlist) != types.ListType:
+ raise portage_exception.InvalidDataType, _("%(handler)s returned an invalid directory list") % {"handler": handler.__name__}
+
+ for x in filelist:
+ if not x:
+ continue
+ x = os.path.normpath(x)
+ if len(x) > 1:
+ if x[:2] == "//":
+ x = x[1:]
+ if type(x) != types.StringType:
+ raise portage_exception.InvalidDataType, _("%(handler)s returned an invalid subelement in dataset") % {"handler": handler.__name__}
+ xs = string.split(x, "/")
+ self.addFilePath(xs,filename)
+
+ for x in dirlist:
+ if not x:
+ continue
+ x = os.path.normpath(x)
+ if len(x) > 1:
+ if x[:2] == "//":
+ x = x[1:]
+ if type(x) != types.StringType:
+ raise portage_exception.InvalidDataType, _("%(handler)s returned an invalid subelement in dataset") % {"handler": handler.__name__}
+ xs = string.split(x, "/")
+ self.addDirectoryPath(xs,filename)
+
+ def addDirectoryPath(self,split_path, owner):
+ pt = self.pathtree
+ for x in split_path:
+ if x not in pt.keys():
+ pt[x] = {FILES_KEY:{},OWNER_KEY:[]}
+ if owner not in pt[x][OWNER_KEY]:
+ pt[x][OWNER_KEY].append(owner[:])
+ pt = pt[x]
+ return pt
+
+ def addFilePath(self,split_path, owner):
+ pt = self.addDirectoryPath(split_path[:-1], owner)
+ if split_path[-1] not in pt[FILES_KEY]:
+ pt[FILES_KEY][split_path[-1][:]] = []
+ if owner not in pt[FILES_KEY][split_path[-1][:]]:
+ pt[FILES_KEY][split_path[-1][:]].append(owner[:])
+
+ def whoProvides(self,path):
+ if type(path) != types.StringType:
+ raise portage_exception.InvalidData, _("Path passed is not a string: %(path)s") % {"path": path}
+ x = os.path.normpath(path)
+ if x[0:2] == '//':
+ x = x[1:]
+
+ xs = x.split("/")
+ pt = self.pathtree
+ final_dir = xs.pop(-1)
+ for subpath in xs:
+ if subpath in pt.keys():
+ pt = pt[subpath]
+
+ owners = []
+ if final_dir in pt[FILES_KEY]:
+ for x in pt[FILES_KEY][final_dir]:
+ if x not in owners:
+ owners.append(x[:])
+ if final_dir in pt:
+ for x in pt[final_dir][OWNER_KEY]:
+ if x not in owners:
+ owners.append(x[:])
+
+ return owners
+
+
+
+def test():
+ import os
+ plt = PathLookupTable("spork")
+ for x in os.listdir("/var/db/pkg"):
+ for y in os.listdir("/var/db/pkg/"+x):
+ c_path = "/var/db/pkg/"+x+"/"+y+"/CONTENTS"
+ if os.path.exists(c_path):
+ plt.addFromFile(c_path, ContentsHandler)
+ print "/bin/bash:", plt.whoProvides("/bin/bash")
+ print "/var/spool:", plt.whoProvides("/var/spool")
+ print "/etc/init.d", plt.whoProvides("/etc/init.d")
+ return plt