From ebe551db54ec3002cd1ee0949b6e73bed800fe7d Mon Sep 17 00:00:00 2001 From: lxnay Date: Tue, 9 Dec 2008 22:03:33 +0000 Subject: [PATCH] Entropy/EquoInterface: loadRepositoryDatabase(): check if repositoryName is a string generate_depends_tree(): fix issues with system packages dependencies resolution (like sys-kernel/linux-sabaupm= PackageSettings: - on repos_system_mask_installed key, pull all the available idpackages using multiMatch, which seems better - repos_system_mask_installed_keys: add helper dict to ease interaction git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@2750 cd1c1023-2f26-0410-ae45-c471fc1f0318 --- TODO | 1 + libraries/entropy.py | 92 +++++++++++++++++++++++++----------------- spritz/gfx/queued.png | Bin 0 -> 4889 bytes 3 files changed, 55 insertions(+), 38 deletions(-) create mode 100644 spritz/gfx/queued.png diff --git a/TODO b/TODO index f9a7652d5..7d44e1dac 100644 --- a/TODO +++ b/TODO @@ -31,3 +31,4 @@ TODO list - allow package remasking - package source download - fetch-only + - Rubber-band support in package views diff --git a/libraries/entropy.py b/libraries/entropy.py index 08782e57b..fcc36fad8 100644 --- a/libraries/entropy.py +++ b/libraries/entropy.py @@ -824,8 +824,9 @@ class EquoInterface(TextInterface): ''' def loadRepositoryDatabase(self, repositoryName, xcache = True, indexing = True): - if repositoryName.endswith(etpConst['packagesext']): - xcache = False + if isinstance(repositoryName,basestring): + if repositoryName.endswith(etpConst['packagesext']): + xcache = False if repositoryName not in etpRepositories: t = _("bad repository id specified") @@ -2373,53 +2374,55 @@ class EquoInterface(TextInterface): virgin = True while mydep: + dep_level, dep_atom = mydep + # already analyzed in this call - if mydep[1] in treecache: + if dep_atom in treecache: mydep = mybuffer.pop() continue - if mydep[1] == None: # corrupted entry + if dep_atom == None: # corrupted entry mydep = mybuffer.pop() continue # conflicts - if mydep[1][0] == "!": - xmatch = self.clientDbconn.atomMatch(mydep[1][1:]) - if xmatch[0] != -1: - myreplacement = self._lookup_conflict_replacement(mydep[1][1:], xmatch[0], deep_deps = deep_deps) + if dep_atom[0] == "!": + c_idpackage, xst = self.clientDbconn.atomMatch(dep_atom[1:]) + if c_idpackage != -1: + myreplacement = self._lookup_conflict_replacement(dep_atom[1:], c_idpackage, deep_deps = deep_deps) if myreplacement != None: - mybuffer.push((mydep[0]+1,myreplacement)) + mybuffer.push((dep_level+1,myreplacement)) else: - conflicts.add(xmatch[0]) + conflicts.add(c_idpackage) mydep = mybuffer.pop() continue # atom found? if virgin: virgin = False - match = atomInfo - dbconn = self.openRepositoryDatabase(match[1]) - myidpackage, idreason = dbconn.idpackageValidator(match[0]) + m_idpackage, m_repo = atomInfo + dbconn = self.openRepositoryDatabase(m_repo) + myidpackage, idreason = dbconn.idpackageValidator(m_idpackage) if myidpackage == -1: - match = (-1,match[1]) + match = (-1,m_repo) else: - match = self.atomMatch(mydep[1]) - if match[0] == -1: - dependenciesNotFound.add(mydep[1]) + m_idpackage, m_repo = self.atomMatch(dep_atom) + if m_idpackage == -1: + dependenciesNotFound.add(dep_atom) mydep = mybuffer.pop() continue # check if atom has been already pulled in - matchdb = self.openRepositoryDatabase(match[1]) - matchatom = matchdb.retrieveAtom(match[0]) - matchkey, matchslot = matchdb.retrieveKeySlot(match[0]) + matchdb = self.openRepositoryDatabase(m_repo) + matchatom = matchdb.retrieveAtom(m_idpackage) + matchkey, matchslot = matchdb.retrieveKeySlot(m_idpackage) if matchatom in treecache: mydep = mybuffer.pop() continue else: treecache.add(matchatom) - treecache.add(mydep[1]) + treecache.add(dep_atom) # check if key + slot has been already pulled in if (matchslot,matchkey) in keyslotcache: @@ -2428,6 +2431,7 @@ class EquoInterface(TextInterface): else: keyslotcache.add((matchslot,matchkey)) + match = (m_idpackage, m_repo,) # already analyzed by the calling function if usefilter: if matchfilter.inside(match): @@ -2440,11 +2444,11 @@ class EquoInterface(TextInterface): mydep = mybuffer.pop() continue - treedepth = mydep[0]+1 + treedepth = dep_level+1 # all checks passed, well done matchcache.add(match) - deptree.add((mydep[0],match)) # add match + deptree.add((dep_level,match)) # add match # extra hooks clientmatch = self.clientDbconn.atomMatch(matchkey, matchSlot = matchslot) @@ -2452,10 +2456,10 @@ class EquoInterface(TextInterface): broken_atoms = self._lookup_library_breakages(match, clientmatch, deep_deps = deep_deps) inverse_deps = self._lookup_inverse_dependencies(match, clientmatch) if inverse_deps: - deptree.remove((mydep[0],match)) + deptree.remove((dep_level,match)) for ikey,islot in inverse_deps: if (ikey,islot) not in keyslotcache: - mybuffer.push((mydep[0],ikey+":"+islot)) + mybuffer.push((dep_level,ikey+":"+islot)) keyslotcache.add((ikey,islot)) deptree.add((treedepth,match)) treedepth += 1 @@ -2464,7 +2468,7 @@ class EquoInterface(TextInterface): mybuffer.push((treedepth,x)) #treecache.add(x) DO NOT DO THIS - myundeps = matchdb.retrieveDependenciesList(match[0]) + myundeps = matchdb.retrieveDependenciesList(m_idpackage) if (not empty_deps): myundeps, xxx = self.filterSatisfiedDependencies(myundeps, deep_deps = deep_deps) del xxx @@ -2793,7 +2797,7 @@ class EquoInterface(TextInterface): header = '|/-\\'[count%4]+" " ) - systempkg = self.clientDbconn.isSystemPackage(idpackage) or self.is_installed_idpackage_in_system_mask(idpackage) + systempkg = not self.validatePackageRemoval(idpackage) if (idpackage in dependscache) or systempkg: if idpackage in treeview: treeview.remove(idpackage) @@ -2803,7 +2807,7 @@ class EquoInterface(TextInterface): depends = self.clientDbconn.retrieveDepends(idpackage) # filter already satisfied ones depends = set([x for x in depends if x not in monotree]) - depends = set([x for x in depends if not ( self.clientDbconn.isSystemPackage(x) or self.is_installed_idpackage_in_system_mask(x) ) ]) + depends = set([x for x in depends if self.validatePackageRemoval(x)]) if depends: depends = self._filter_depends_multimatched_atoms(idpackage, depends, monotree) if depends: # something depends on idpackage @@ -3342,15 +3346,21 @@ class EquoInterface(TextInterface): def validatePackageRemoval(self, idpackage): - if self.is_installed_idpackage_in_system_mask(idpackage): - return False # cannot remove + pkgatom = self.clientDbconn.retrieveAtom(idpackage) + pkgkey = self.entropyTools.dep_getkey(pkgatom) + if self.is_installed_idpackage_in_system_mask(idpackage): + idpackages = self.PackageSettings['repos_system_mask_installed_keys'].get(pkgkey) + if not idpackages: return False + if len(idpackages) > 1: + return True + return False # sorry! + + # did we store the bastard in the db? system_pkg = self.clientDbconn.isSystemPackage(idpackage) if not system_pkg: return True - - pkgatom = self.clientDbconn.retrieveAtom(idpackage) # check if the package is slotted and exist more than one installed first - sysresults = self.clientDbconn.atomMatch(self.entropyTools.dep_getkey(pkgatom), multiMatch = True) + sysresults = self.clientDbconn.atomMatch(pkgkey, multiMatch = True) if sysresults[1] == 0: if len(sysresults[0]) < 2: return False return True @@ -10385,14 +10395,20 @@ class PackageSettings: # match installed packages of system_mask self.__settings['repos_system_mask_installed'] = [] + self.__settings['repos_system_mask_installed_keys'] = {} if self.Entropy.clientDbconn != None: mc_cache = set() for atom in self.__settings['repos_system_mask']: - match = self.Entropy.clientDbconn.atomMatch(atom) - if match[0] == -1: continue - if match[0] in mc_cache: continue - mc_cache.add(match[0]) - self.__settings['repos_system_mask_installed'].append(match[0]) + match = self.Entropy.clientDbconn.atomMatch(atom, multiMatch = True) + if match[1] != 0: continue + mykey = self.entropyTools.dep_getkey(atom) + if mykey not in self.__settings['repos_system_mask_installed_keys']: + self.__settings['repos_system_mask_installed_keys'][mykey] = set() + for xm in match[0]: + if xm in mc_cache: continue + mc_cache.add(xm) + self.__settings['repos_system_mask_installed'].append(xm) + self.__settings['repos_system_mask_installed_keys'][mykey].add(xm) # Live package masking self.__settings.update(self.__persistent_settings) diff --git a/spritz/gfx/queued.png b/spritz/gfx/queued.png new file mode 100644 index 0000000000000000000000000000000000000000..79069e76226835852adddf2eacdef48d403d17f3 GIT binary patch literal 4889 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