entropy.qa: code review and cleanup
This commit is contained in:
+73
-62
@@ -19,11 +19,11 @@
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
'''
|
||||
|
||||
# pylint ~ok
|
||||
import os
|
||||
from entropy.const import etpConst
|
||||
from entropy.output import blue, darkgreen, red, darkred, bold, purple, brown
|
||||
from entropy.exceptions import *
|
||||
from entropy.exceptions import IncorrectParameter, PermissionDenied
|
||||
from entropy.i18n import _
|
||||
from entropy.core import SystemSettings
|
||||
|
||||
@@ -36,11 +36,11 @@ class QAInterface:
|
||||
self.Output = OutputInterface
|
||||
self.SystemSettings = SystemSettings()
|
||||
|
||||
if not hasattr(self.Output,'updateProgress'):
|
||||
mytxt = _("Output interface passed doesn't have the updateProgress method")
|
||||
if not hasattr(self.Output, 'updateProgress'):
|
||||
mytxt = _("Output interface has no updateProgress method")
|
||||
raise IncorrectParameter("IncorrectParameter: %s" % (mytxt,))
|
||||
elif not callable(self.Output.updateProgress):
|
||||
mytxt = _("Output interface passed doesn't have the updateProgress method")
|
||||
mytxt = _("Output interface has no updateProgress method")
|
||||
raise IncorrectParameter("IncorrectParameter: %s" % (mytxt,))
|
||||
|
||||
def test_depends_linking(self, idpackages, dbconn, repo = None):
|
||||
@@ -65,7 +65,10 @@ class QAInterface:
|
||||
for idpackage in idpackages:
|
||||
count += 1
|
||||
atom = dbconn.retrieveAtom(idpackage)
|
||||
scan_msg = "%s, %s:" % (blue(_("scanning for broken depends")),darkgreen(atom),)
|
||||
scan_msg = "%s, %s:" % (
|
||||
blue(_("scanning for broken depends")),
|
||||
darkgreen(atom),
|
||||
)
|
||||
self.Output.updateProgress(
|
||||
"[repo:%s] %s" % (
|
||||
darkgreen(repo),
|
||||
@@ -75,7 +78,7 @@ class QAInterface:
|
||||
type = "info",
|
||||
header = blue(" @@ "),
|
||||
back = True,
|
||||
count = (count,maxcount,)
|
||||
count = (count, maxcount,)
|
||||
)
|
||||
mydepends = dbconn.retrieveDepends(idpackage)
|
||||
if not mydepends:
|
||||
@@ -92,7 +95,7 @@ class QAInterface:
|
||||
type = "info",
|
||||
header = blue(" @@ "),
|
||||
back = True,
|
||||
count = (count,maxcount,)
|
||||
count = (count, maxcount,)
|
||||
)
|
||||
mycontent = dbconn.retrieveContent(mydepend)
|
||||
mybreakages = self.content_test(mycontent)
|
||||
@@ -109,7 +112,7 @@ class QAInterface:
|
||||
importance = 1,
|
||||
type = "warning",
|
||||
header = purple(" @@ "),
|
||||
count = (count,maxcount,)
|
||||
count = (count, maxcount,)
|
||||
)
|
||||
for mylib in mybreakages:
|
||||
self.Output.updateProgress(
|
||||
@@ -140,7 +143,7 @@ class QAInterface:
|
||||
if repo == None:
|
||||
repo = self.SystemSettings['repositories']['default_repository']
|
||||
|
||||
if not isinstance(black_list,set):
|
||||
if not isinstance(black_list, set):
|
||||
black_list = set()
|
||||
|
||||
taint = False
|
||||
@@ -160,7 +163,8 @@ class QAInterface:
|
||||
for idpackage in idpackages:
|
||||
count += 1
|
||||
atom = dbconn.retrieveAtom(idpackage)
|
||||
if not atom: continue
|
||||
if not atom:
|
||||
continue
|
||||
self.Output.updateProgress(
|
||||
"[repo:%s] %s: %s" % (
|
||||
darkgreen(repo),
|
||||
@@ -171,9 +175,10 @@ class QAInterface:
|
||||
type = "info",
|
||||
header = blue(" @@ "),
|
||||
back = True,
|
||||
count = (count,maxcount,)
|
||||
count = (count, maxcount,)
|
||||
)
|
||||
missing_extended, missing = self.get_missing_rdepends(dbconn, idpackage, self_check = self_check)
|
||||
missing_extended, missing = self.get_missing_rdepends(dbconn,
|
||||
idpackage, self_check = self_check)
|
||||
missing -= black_list
|
||||
for item in missing_extended.keys():
|
||||
missing_extended[item] -= black_list
|
||||
@@ -191,7 +196,7 @@ class QAInterface:
|
||||
importance = 1,
|
||||
type = "info",
|
||||
header = red(" @@ "),
|
||||
count = (count,maxcount,)
|
||||
count = (count, maxcount,)
|
||||
)
|
||||
for missing_data in missing_extended:
|
||||
self.Output.updateProgress(
|
||||
@@ -208,11 +213,11 @@ class QAInterface:
|
||||
header = blue(" # ")
|
||||
)
|
||||
if ask:
|
||||
rc = self.Output.askQuestion(_("Do you want to add them?"))
|
||||
if rc == "No":
|
||||
rc_ask = self.Output.askQuestion(_("Do you want to add them?"))
|
||||
if rc_ask == "No":
|
||||
continue
|
||||
rc = self.Output.askQuestion(_("Selectively?"))
|
||||
if rc == "Yes":
|
||||
rc_ask = self.Output.askQuestion(_("Selectively?"))
|
||||
if rc_ask == "Yes":
|
||||
newmissing = set()
|
||||
new_blacklist = set()
|
||||
for dependency in missing:
|
||||
@@ -226,30 +231,31 @@ class QAInterface:
|
||||
type = "info",
|
||||
header = blue(" @@ ")
|
||||
)
|
||||
rc = self.Output.askQuestion(_("Want to add?"))
|
||||
if rc == "Yes":
|
||||
rc_ask = self.Output.askQuestion(_("Want to add?"))
|
||||
if rc_ask == "Yes":
|
||||
newmissing.add(dependency)
|
||||
else:
|
||||
rc = self.Output.askQuestion(_("Want to blacklist?"))
|
||||
if rc == "Yes":
|
||||
rc_ask = self.Output.askQuestion(
|
||||
_("Want to blacklist?"))
|
||||
if rc_ask == "Yes":
|
||||
new_blacklist.add(dependency)
|
||||
if new_blacklist and (black_list_adder != None):
|
||||
black_list_adder(new_blacklist, repo = repo)
|
||||
missing = newmissing
|
||||
if missing:
|
||||
taint = True
|
||||
dbconn.insertDependencies(idpackage,missing)
|
||||
dbconn.insertDependencies(idpackage, missing)
|
||||
dbconn.commitChanges()
|
||||
self.Output.updateProgress(
|
||||
"[repo:%s] %s: %s" % (
|
||||
darkgreen(repo),
|
||||
darkgreen(atom),
|
||||
blue(_("missing dependencies added")),
|
||||
),
|
||||
darkgreen(repo),
|
||||
darkgreen(atom),
|
||||
blue(_("missing dependencies added")),
|
||||
),
|
||||
importance = 1,
|
||||
type = "info",
|
||||
header = red(" @@ "),
|
||||
count = (count,maxcount,)
|
||||
count = (count, maxcount,)
|
||||
)
|
||||
|
||||
return taint
|
||||
@@ -265,13 +271,14 @@ class QAInterface:
|
||||
mylibs = {}
|
||||
for myfile in mycontent:
|
||||
myfile = myfile.encode('raw_unicode_escape')
|
||||
if not os.access(myfile,os.R_OK):
|
||||
if not os.access(myfile, os.R_OK):
|
||||
continue
|
||||
if not os.path.isfile(myfile):
|
||||
continue
|
||||
if not self.entropyTools.is_elf_file(myfile):
|
||||
continue
|
||||
mylibs[myfile] = self.entropyTools.read_elf_dynamic_libraries(myfile)
|
||||
mylibs[myfile] = self.entropyTools.read_elf_dynamic_libraries(
|
||||
myfile)
|
||||
|
||||
broken_libs = {}
|
||||
for mylib in mylibs:
|
||||
@@ -293,8 +300,8 @@ class QAInterface:
|
||||
def do_resolve(mypaths):
|
||||
found_path = None
|
||||
for mypath in mypaths:
|
||||
mypath = os.path.join(etpConst['systemroot']+mypath,library)
|
||||
if not os.access(mypath,os.R_OK):
|
||||
mypath = os.path.join(etpConst['systemroot']+mypath, library)
|
||||
if not os.access(mypath, os.R_OK):
|
||||
continue
|
||||
if os.path.isdir(mypath):
|
||||
continue
|
||||
@@ -308,7 +315,8 @@ class QAInterface:
|
||||
found_path = do_resolve(mypaths)
|
||||
|
||||
if not found_path:
|
||||
mypaths = self.entropyTools.read_elf_linker_paths(requiring_executable)
|
||||
mypaths = self.entropyTools.read_elf_linker_paths(
|
||||
requiring_executable)
|
||||
found_path = do_resolve(mypaths)
|
||||
|
||||
return found_path
|
||||
@@ -320,14 +328,14 @@ class QAInterface:
|
||||
neededs = dbconn.retrieveNeeded(idpackage, extended = True)
|
||||
ldpaths = set(self.entropyTools.collect_linker_paths())
|
||||
deps_content = set()
|
||||
dependencies = self.get_deep_dependency_list(dbconn, idpackage, atoms = True)
|
||||
dependencies = self.get_deep_dependency_list(dbconn, idpackage,
|
||||
atoms = True)
|
||||
scope_cache = set()
|
||||
|
||||
def update_depscontent(mycontent, dbconn, ldpaths):
|
||||
return set( \
|
||||
[ x for x in mycontent if os.path.dirname(x) in ldpaths \
|
||||
and (dbconn.isNeededAvailable(os.path.basename(x)) > 0) ] \
|
||||
)
|
||||
[x for x in mycontent if os.path.dirname(x) in ldpaths \
|
||||
and (dbconn.isNeededAvailable(os.path.basename(x)) > 0) ])
|
||||
|
||||
def is_in_content(myneeded, content):
|
||||
for item in content:
|
||||
@@ -342,25 +350,26 @@ class QAInterface:
|
||||
mycontent = dbconn.retrieveContent(match[0])
|
||||
deps_content |= update_depscontent(mycontent, dbconn, ldpaths)
|
||||
key, slot = dbconn.retrieveKeySlot(match[0])
|
||||
scope_cache.add((key,slot))
|
||||
scope_cache.add((key, slot))
|
||||
|
||||
key, slot = dbconn.retrieveKeySlot(idpackage)
|
||||
mycontent = dbconn.retrieveContent(idpackage)
|
||||
deps_content |= update_depscontent(mycontent, dbconn, ldpaths)
|
||||
scope_cache.add((key,slot))
|
||||
scope_cache.add((key, slot))
|
||||
|
||||
idpackages_cache = set()
|
||||
idpackage_map = {}
|
||||
idpackage_map_reverse = {}
|
||||
for needed, elfclass in neededs:
|
||||
data_solved = dbconn.resolveNeeded(needed,elfclass)
|
||||
data_solved = dbconn.resolveNeeded(needed, elfclass)
|
||||
data_size = len(data_solved)
|
||||
data_solved = set([x for x in data_solved if x[0] not in idpackages_cache])
|
||||
data_solved = set([x for x in data_solved if x[0] \
|
||||
not in idpackages_cache])
|
||||
if not data_solved or (data_size != len(data_solved)):
|
||||
continue
|
||||
|
||||
if self_check:
|
||||
if is_in_content(needed,mycontent):
|
||||
if is_in_content(needed, mycontent):
|
||||
continue
|
||||
|
||||
found = False
|
||||
@@ -372,18 +381,18 @@ class QAInterface:
|
||||
for data in data_solved:
|
||||
r_idpackage = data[0]
|
||||
key, slot = dbconn.retrieveKeySlot(r_idpackage)
|
||||
if (key,slot) not in scope_cache:
|
||||
if (key, slot) not in scope_cache:
|
||||
if not dbconn.isSystemPackage(r_idpackage):
|
||||
if not rdepends.has_key((needed,elfclass)):
|
||||
rdepends[(needed,elfclass)] = set()
|
||||
if not idpackage_map.has_key((needed,elfclass)):
|
||||
idpackage_map[(needed,elfclass)] = set()
|
||||
keyslot = "%s:%s" % (key,slot,)
|
||||
if not idpackage_map_reverse.has_key(keyslot):
|
||||
idpackage_map_reverse[keyslot] = set()
|
||||
idpackage_map_reverse[keyslot].add((needed,elfclass))
|
||||
rdepends[(needed,elfclass)].add(keyslot)
|
||||
idpackage_map[(needed,elfclass)].add(r_idpackage)
|
||||
if not rdepends.has_key((needed, elfclass)):
|
||||
rdepends[(needed, elfclass)] = set()
|
||||
if not idpackage_map.has_key((needed, elfclass)):
|
||||
idpackage_map[(needed, elfclass)] = set()
|
||||
keyslot = "%s:%s" % (key, slot,)
|
||||
obj = idpackage_map_reverse.setdefault(
|
||||
keyslot, set())
|
||||
obj.add((needed, elfclass,))
|
||||
rdepends[(needed, elfclass)].add(keyslot)
|
||||
idpackage_map[(needed, elfclass)].add(r_idpackage)
|
||||
rdepends_plain.add(keyslot)
|
||||
idpackages_cache.add(r_idpackage)
|
||||
|
||||
@@ -398,14 +407,16 @@ class QAInterface:
|
||||
r_keyslots = set()
|
||||
for r_dep in r_deplist:
|
||||
m_idpackage, m_rc = dbconn.atomMatch(r_dep)
|
||||
if m_rc != 0: continue
|
||||
if m_rc != 0:
|
||||
continue
|
||||
keyslot = dbconn.retrieveKeySlotAggregated(m_idpackage)
|
||||
if keyslot in rdepends_plain:
|
||||
r_keyslots.add(keyslot)
|
||||
|
||||
rdepends_plain -= r_keyslots
|
||||
for r_keyslot in r_keyslots:
|
||||
keys = [x for x in idpackage_map_reverse.get(keyslot,set()) if x in rdepends]
|
||||
keys = [x for x in idpackage_map_reverse.get(keyslot, set()) if \
|
||||
x in rdepends]
|
||||
for key in keys:
|
||||
rdepends[key].discard(r_keyslot)
|
||||
if not rdepends[key]:
|
||||
@@ -452,7 +463,6 @@ class ErrorReportInterface:
|
||||
import entropy.tools as entropyTools
|
||||
def __init__(self, post_url = etpConst['handlers']['errorsend']):
|
||||
from entropy.misc import MultipartPostHandler
|
||||
from entropy.core import SystemSettings
|
||||
import urllib2
|
||||
self.url = post_url
|
||||
self.opener = urllib2.build_opener(MultipartPostHandler)
|
||||
@@ -469,7 +479,7 @@ class ErrorReportInterface:
|
||||
if mydict:
|
||||
mydict['username'] = proxy_settings['username']
|
||||
mydict['password'] = proxy_settings['password']
|
||||
self.entropyTools.add_proxy_opener(urllib2,mydict)
|
||||
self.entropyTools.add_proxy_opener(urllib2, mydict)
|
||||
else:
|
||||
# unset
|
||||
urllib2._opener = None
|
||||
@@ -488,16 +498,17 @@ class ErrorReportInterface:
|
||||
self.params['arguments'] = ' '.join(sys.argv)
|
||||
self.params['uid'] = etpConst['uid']
|
||||
self.params['system_version'] = "N/A"
|
||||
if os.access(etpConst['systemreleasefile'],os.R_OK):
|
||||
f = open(etpConst['systemreleasefile'],"r")
|
||||
self.params['system_version'] = f.readlines()
|
||||
f.close()
|
||||
if os.access(etpConst['systemreleasefile'], os.R_OK):
|
||||
f_rel = open(etpConst['systemreleasefile'], "r")
|
||||
self.params['system_version'] = f_rel.readlines()
|
||||
f_rel.close()
|
||||
|
||||
self.params['processes'] = getstatusoutput('ps auxf')[1]
|
||||
self.params['lspci'] = getstatusoutput('/usr/sbin/lspci')[1]
|
||||
self.params['dmesg'] = getstatusoutput('dmesg')[1]
|
||||
self.params['locale'] = getstatusoutput('locale -v')[1]
|
||||
self.params['stacktrace'] += "\n\n"+self.params['locale'] # just for a while, won't hurt
|
||||
# just for a while, won't hurt
|
||||
self.params['stacktrace'] += "\n\n"+self.params['locale']
|
||||
|
||||
self.generated = True
|
||||
|
||||
|
||||
Reference in New Issue
Block a user