aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'portage_with_autodep/pym/_emerge/EventsAnalyser.py')
-rw-r--r--portage_with_autodep/pym/_emerge/EventsAnalyser.py153
1 files changed, 78 insertions, 75 deletions
diff --git a/portage_with_autodep/pym/_emerge/EventsAnalyser.py b/portage_with_autodep/pym/_emerge/EventsAnalyser.py
index 65ece7b..f740cf6 100644
--- a/portage_with_autodep/pym/_emerge/EventsAnalyser.py
+++ b/portage_with_autodep/pym/_emerge/EventsAnalyser.py
@@ -34,36 +34,36 @@ class PortageUtils:
def get_dep(self,pkg,dep_type=["RDEPEND","DEPEND"]):
"""
Gets current dependencies of a package. Looks in portage db
-
+
:param pkg: name of package
- :param dep_type: type of dependencies to recurse. Can be ["DEPEND"] or
+ :param dep_type: type of dependencies to recurse. Can be ["DEPEND"] or
["RDEPEND", "DEPEND"]
:returns: **set** of packages names
"""
ret=set()
-
- pkg = self.get_best_visible_pkg(pkg)
+
+ pkg = self.get_best_visible_pkg(pkg)
if not pkg:
return ret
-
+
# we found the best visible match in common tree
- metadata = dict(zip(self.metadata_keys,
+ metadata = dict(zip(self.metadata_keys,
self.portdbapi.aux_get(pkg, self.metadata_keys)))
dep_str = " ".join(metadata[k] for k in dep_type)
# the IUSE default are very important for us
iuse_defaults=[
u[1:] for u in metadata.get("IUSE",'').split() if u.startswith("+")]
-
+
use=self.use.split()
-
+
for u in iuse_defaults:
if u not in use:
use.append(u)
- success, atoms = portage.dep_check(dep_str, None, self.settings,
+ success, atoms = portage.dep_check(dep_str, None, self.settings,
myuse=use, myroot=self.settings["ROOT"],
trees={self.settings["ROOT"]:{"vartree":self.vartree, "porttree": self.vartree}})
if not success:
@@ -74,7 +74,7 @@ class PortageUtils:
if not atomname:
continue
-
+
for unvirt_pkg in expand_new_virt(self.vardbapi,'='+atomname):
for pkg in self.vartree.dep_match(unvirt_pkg):
ret.add(pkg)
@@ -83,12 +83,12 @@ class PortageUtils:
# recursive dependency getter
def get_deps(self,pkg,dep_type=["RDEPEND","DEPEND"]):
- """
- Gets current dependencies of a package on any depth
+ """
+ Gets current dependencies of a package on any depth
All dependencies **must** be installed
-
+
:param pkg: name of package
- :param dep_type: type of dependencies to recurse. Can be ["DEPEND"] or
+ :param dep_type: type of dependencies to recurse. Can be ["DEPEND"] or
["RDEPEND", "DEPEND"]
:returns: **set** of packages names
"""
@@ -97,14 +97,14 @@ class PortageUtils:
# get porttree dependencies on the first package
- pkg = self.portdbapi.xmatch("bestmatch-visible", pkg)
+ pkg = self.portdbapi.xmatch("bestmatch-visible", pkg)
if not pkg:
return ret
known_packages=set()
unknown_packages=self.get_dep(pkg,dep_type)
ret=ret.union(unknown_packages)
-
+
while unknown_packages:
p=unknown_packages.pop()
if p in known_packages:
@@ -114,18 +114,18 @@ class PortageUtils:
metadata = dict(zip(self.metadata_keys, self.vardbapi.aux_get(p, self.metadata_keys)))
dep_str = " ".join(metadata[k] for k in dep_type)
-
+
# the IUSE default are very important for us
iuse_defaults=[
u[1:] for u in metadata.get("IUSE",'').split() if u.startswith("+")]
-
+
use=self.use.split()
-
+
for u in iuse_defaults:
if u not in use:
use.append(u)
-
- success, atoms = portage.dep_check(dep_str, None, self.settings,
+
+ success, atoms = portage.dep_check(dep_str, None, self.settings,
myuse=use, myroot=self.settings["ROOT"],
trees={self.settings["ROOT"]:{"vartree":self.vartree,"porttree": self.vartree}})
@@ -136,7 +136,7 @@ class PortageUtils:
atomname = self.vartree.dep_bestmatch(atom)
if not atomname:
continue
-
+
for unvirt_pkg in expand_new_virt(self.vardbapi,'='+atomname):
for pkg in self.vartree.dep_match(unvirt_pkg):
ret.add(pkg)
@@ -144,8 +144,8 @@ class PortageUtils:
return ret
def get_deps_for_package_building(self, pkg):
- """
- returns buildtime dependencies of current package and
+ """
+ returns buildtime dependencies of current package and
all runtime dependencies of that buildtime dependencies
"""
buildtime_deps=self.get_dep(pkg, ["DEPEND"])
@@ -157,9 +157,9 @@ class PortageUtils:
return ret
def get_system_packages_list(self):
- """
+ """
returns all packages from system set. They are always implicit dependencies
-
+
:returns: **list** of package names
"""
ret=[]
@@ -172,11 +172,12 @@ class PortageUtils:
class GentoolkitUtils:
- """
- Interface with qfile and qlist utils. They are much faster than
+ """
+ Interface with qfile and qlist utils. They are much faster than
internals.
"""
+ @staticmethod
def getpackagesbyfiles(files):
"""
:param files: list of filenames
@@ -190,14 +191,14 @@ class GentoolkitUtils:
ret[f]="directory"
else:
listtocheck.append(f)
-
+
try:
proc=subprocess.Popen(['qfile']+['--nocolor','--exact','','--from','-'],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE,
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE,
bufsize=4096)
-
+
out,err=proc.communicate("\n".join(listtocheck).encode("utf8"))
-
+
lines=out.decode("utf8").split("\n")
#print lines
line_re=re.compile(r"^([^ ]+)\s+\(([^)]+)\)$")
@@ -212,24 +213,25 @@ class GentoolkitUtils:
except OSError as e:
portage.util.writemsg("Error while launching qfile: %s\n" % e)
-
-
+
+
return ret
-
+
+ @staticmethod
def getfilesbypackages(packagenames):
"""
-
+
:param packagename: name of package
:returns: **list** of files in package with name *packagename*
"""
ret=[]
try:
proc=subprocess.Popen(['qlist']+['--nocolor',"--obj"]+packagenames,
- stdout=subprocess.PIPE,stderr=subprocess.PIPE,
+ stdout=subprocess.PIPE,stderr=subprocess.PIPE,
bufsize=4096)
-
+
out,err=proc.communicate()
-
+
ret=out.decode("utf8").split("\n")
if ret==['']:
ret=[]
@@ -237,34 +239,35 @@ class GentoolkitUtils:
portage.util.writemsg("Error while launching qfile: %s\n" % e)
return ret
-
- def get_all_packages_files():
+
+ @staticmethod
+ def get_all_packages_files():
"""
Memory-hungry operation
-
+
:returns: **set** of all files that belongs to package
"""
ret=[]
try:
proc=subprocess.Popen(['qlist']+['--all',"--obj"],
- stdout=subprocess.PIPE,stderr=subprocess.PIPE,
+ stdout=subprocess.PIPE,stderr=subprocess.PIPE,
bufsize=4096)
-
+
out,err=proc.communicate()
-
+
ret=out.decode("utf8").split("\n")
except OSError as e:
portage.util.writemsg("Error while launching qfile: %s\n" % e)
return set(ret)
-
+
class FilterProcGenerator:
def __init__(self, pkgname, settings):
portageutils=PortageUtils(settings=settings)
deps_all=portageutils.get_deps_for_package_building(pkgname)
deps_portage=portageutils.get_dep('portage',["RDEPEND"])
-
+
system_packages=portageutils.get_system_packages_list()
allfiles=GentoolkitUtils.get_all_packages_files()
@@ -272,8 +275,8 @@ class FilterProcGenerator:
"a list of allowed files\n")
- allowedpkgs=system_packages+list(deps_portage)+list(deps_all)
-
+ allowedpkgs=system_packages+list(deps_portage)+list(deps_all)
+
allowedfiles=GentoolkitUtils.getfilesbypackages(allowedpkgs)
#for pkg in allowedpkgs:
# allowedfiles+=GentoolkitUtils.getfilesbypackage(pkg)
@@ -283,14 +286,14 @@ class FilterProcGenerator:
# manually add all python interpreters to this list
allowedfiles+=GentoolkitUtils.getfilesbypackages(['python'])
allowedfiles=set(allowedfiles)
-
+
deniedfiles=allfiles-allowedfiles
def filter_proc(eventname,filename,stage):
if filename in deniedfiles:
return False
return True
-
+
self.filter_proc=filter_proc
def get_filter_proc(self):
return self.filter_proc
@@ -305,10 +308,10 @@ class EventsAnalyser:
self.deps_all=self.portageutils.get_deps_for_package_building(pkgname)
self.deps_direct=self.portageutils.get_dep(pkgname,["DEPEND"])
self.deps_portage=self.portageutils.get_dep('portage',["RDEPEND"])
-
+
self.system_packages=self.portageutils.get_system_packages_list()
# All analyse work is here
-
+
# get unique filenames
filenames=set()
for stage in events:
@@ -319,7 +322,7 @@ class EventsAnalyser:
filenames=list(filenames)
file_to_package=GentoolkitUtils.getpackagesbyfiles(filenames)
- # This part is completly unreadable.
+ # This part is completly unreadable.
# It converting one complex struct(returned by getfsevents) to another complex
# struct which good for generating output.
#
@@ -330,24 +333,24 @@ class EventsAnalyser:
for stage in sorted(events):
succ_events=events[stage][0]
fail_events=events[stage][1]
-
+
for filename in succ_events:
if filename in file_to_package:
package=file_to_package[filename]
else:
package="unknown"
-
+
if not package in packagesinfo:
packagesinfo[package]={}
stageinfo=packagesinfo[package]
if not stage in stageinfo:
stageinfo[stage]={}
-
+
filesinfo=stageinfo[stage]
if not filename in filesinfo:
filesinfo[filename]={"found":[],"notfound":[]}
filesinfo[filename]["found"]=succ_events[filename]
-
+
for filename in fail_events:
if filename in file_to_package:
package=file_to_package[filename]
@@ -358,13 +361,13 @@ class EventsAnalyser:
stageinfo=packagesinfo[package]
if not stage in stageinfo:
stageinfo[stage]={}
-
+
filesinfo=stageinfo[stage]
if not filename in filesinfo:
filesinfo[filename]={"found":[],"notfound":[]}
filesinfo[filename]["notfound"]=fail_events[filename]
self.packagesinfo=packagesinfo
-
+
def display(self):
portage.util.writemsg(
portage.output.colorize(
@@ -373,12 +376,12 @@ class EventsAnalyser:
stagesorder={"clean":1,"setup":2,"unpack":3,"prepare":4,"configure":5,"compile":6,"test":7,
"install":8,"preinst":9,"postinst":10,"prerm":11,"postrm":12,"unknown":13}
packagesinfo=self.packagesinfo
- # print information grouped by package
+ # print information grouped by package
for package in sorted(packagesinfo):
# not showing special directory package
if package=="directory":
continue
-
+
if package=="unknown":
continue
@@ -395,7 +398,7 @@ class EventsAnalyser:
if len(stages)==0:
continue
-
+
filenames={}
for stage in stages:
for filename in packagesinfo[package][stage]:
@@ -406,7 +409,7 @@ class EventsAnalyser:
else:
status, old_was_readed, old_was_writed=filenames[filename]
filenames[filename]=[
- 'ok',old_was_readed | was_readed, old_was_writed | was_writed
+ 'ok',old_was_readed | was_readed, old_was_writed | was_writed
]
if len(packagesinfo[package][stage][filename]["notfound"])!=0:
was_notfound,was_blocked=packagesinfo[package][stage][filename]["notfound"]
@@ -415,9 +418,9 @@ class EventsAnalyser:
else:
status, old_was_notfound, old_was_blocked=filenames[filename]
filenames[filename]=[
- 'err',old_was_notfound | was_notfound, old_was_blocked | was_blocked
+ 'err',old_was_notfound | was_notfound, old_was_blocked | was_blocked
]
-
+
if is_pkg_in_dep:
portage.util.writemsg("[OK]")
@@ -446,9 +449,9 @@ class EventsAnalyser:
('err',False,True):"blocked",
('err',True,True):"not found and blocked"
}
-
+
filescounter=0
-
+
for filename in filenames:
event_info=tuple(filenames[filename])
portage.util.writemsg(" %-56s %-21s\n" % (filename,action[event_info]))
@@ -456,7 +459,7 @@ class EventsAnalyser:
if filescounter>10:
portage.util.writemsg(" ... and %d more ...\n" % (len(filenames)-10))
break
- # ... and one more check. Making sure that direct build time
+ # ... and one more check. Making sure that direct build time
# dependencies were accessed
#import pdb; pdb.set_trace()
not_accessed_deps=set(self.deps_direct)-set(self.packagesinfo.keys())
@@ -465,7 +468,7 @@ class EventsAnalyser:
portage.util.writemsg("Warning! Some build time dependencies " + \
"of packages were not accessed: " + \
" ".join(not_accessed_deps) + "\n")
-
+
def is_package_useful(self,pkg,stages,files):
""" some basic heuristics here to cut part of packages """
@@ -499,13 +502,13 @@ class EventsAnalyser:
for f in files:
if is_file_excluded(f):
continue
-
- # test 1: package is not useful if all files are *.desktop or *.xml or *.m4
+
+ # test 1: package is not useful if all files are *.desktop or *.xml or *.m4
if not (f.endswith(".desktop") or f.endswith(".xml") or f.endswith(".m4") or f.endswith(".pc")):
break
else:
return False # we get here if cycle ends not with break
-
+
return True
-
- \ No newline at end of file
+
+