diff options
Diffstat (limited to 'pym/portage/dep/__init__.py')
-rw-r--r-- | pym/portage/dep/__init__.py | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/pym/portage/dep/__init__.py b/pym/portage/dep/__init__.py index 146caa709..bc04e5be3 100644 --- a/pym/portage/dep/__init__.py +++ b/pym/portage/dep/__init__.py @@ -499,6 +499,26 @@ class _use_dep(object): tokens.extend(x for x in conditional.not_equal if x not in use) return _use_dep(tokens) + + def violated_conditionals(self, use, other_use): + """ + Create a new instance with satisfied conditionals removed. + """ + tokens = [] + + conditional = self.conditional + tokens.extend(x for x in self.enabled if x not in other_use) + tokens.extend("-" + x for x in self.disabled if x in other_use) + if conditional: + tokens.extend(x + "?" for x in conditional.enabled if x in use and not x in other_use) + tokens.extend("!" + x + "?" for x in conditional.disabled if x not in use and x in other_use) + tokens.extend(x + "=" for x in conditional.equal if x in use and x not in other_use) + tokens.extend(x + "=" for x in conditional.equal if x not in use and x in other_use) + tokens.extend("!" + x + "=" for x in conditional.not_equal if x in use and x in other_use) + tokens.extend("!" + x + "=" for x in conditional.not_equal if x not in use and x not in other_use) + + return _use_dep(tokens) + def _eval_qa_conditionals(self, use_mask, use_force): """ @@ -667,6 +687,25 @@ class Atom(_atom_base): atom += str(self.use.evaluate_conditionals(use)) return Atom(atom, self) + def violated_conditionals(self, use, other_use): + """ + Create an atom instance with any USE conditional removed, that is + satisfied by other_use. + @param use: The set of enabled USE flags + @type use: set + @param use: The set of enabled USE flags to check against + @type use: set + @rtype: Atom + @return: an atom instance with any satisfied USE conditionals removed + """ + if not self.use: + return self + atom = remove_slot(self) + if self.slot: + atom += ":%s" % self.slot + atom += str(self.use.violated_conditionals(use, other_use)) + return Atom(atom, self) + def __copy__(self): """Immutable, so returns self.""" return self |