From: Marius Mauch Date: Sun, 28 Sep 2008 16:08:50 +0000 (-0000) Subject: implement set arguments to reconfigure and create package sets on the commandline X-Git-Tag: v2.2_rc12~71 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=918421b4cd656cae82476b17682f3300020687bf;p=portage.git implement set arguments to reconfigure and create package sets on the commandline svn path=/main/trunk/; revision=11581 --- diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index 09a92f23a..39ab9f661 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -13395,12 +13395,38 @@ def expand_set_arguments(myfiles, myaction, root_config): myfiles = newargs del newargs newargs = [] + + # separators for set arguments + ARG_START = "{" + ARG_END = "}" + for i in range(0, len(myfiles)): + if myfiles[i].startswith(SETPREFIX): + x = myfiles[i][len(SETPREFIX):] + start = x.find(ARG_START) + end = x.find(ARG_END) + if start > 0 and start < end: + namepart = x[:start] + argpart = x[start+1:end] + + # TODO: implement proper quoting + args = argpart.split(",") + options = {} + for a in args: + if "=" in a: + k, v = a.split("=", 1) + options[k] = v + else: + options[a] = "True" + setconfig.update(namepart, options) + myfiles[i] = SETPREFIX + namepart + sets = setconfig.getSets() + # WARNING: all operators must be of equal length IS_OPERATOR = "/@" DIFF_OPERATOR = "-@" UNION_OPERATOR = "+@" - + for a in myfiles: if a.startswith(SETPREFIX): # support simple set operations (intersection, difference and union) diff --git a/pym/portage/sets/__init__.py b/pym/portage/sets/__init__.py index f88e1b6ee..8e6a0ea86 100644 --- a/pym/portage/sets/__init__.py +++ b/pym/portage/sets/__init__.py @@ -33,6 +33,29 @@ class SetConfig(SafeConfigParser): self._parsed = False self.active = [] + def update(self, setname, options): + self.errors = [] + if not setname in self.psets: + options["name"] = setname + + # for the unlikely case that there is already a section with the requested setname + import random + while setname in self.sections(): + setname = "%08d" % random.randint(0, 10**10) + + self.add_section(setname) + for k, v in options.items(): + self.set(setname, k, v) + else: + section = self.psets[setname].creator + if self.has_option(section, "multiset") and self.getboolean(section, "multiset"): + self.errors.append("Invalid request to reconfigure set '%s' generated by multiset section '%s'" % (setname, section)) + return + for k, v in options.items(): + self.set(section, k, v) + self._parsed = False + self._parse() + def _parse(self): if self._parsed: return