public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "André Erdmann" <dywi@mailerd.de>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/depres/simpledeprule/
Date: Tue, 29 Jul 2014 18:29:20 +0000 (UTC)	[thread overview]
Message-ID: <1406653206.1cc91c92cd6103185598fa2e4ce9829a01a30b2d.dywi@gentoo> (raw)

commit:     1cc91c92cd6103185598fa2e4ce9829a01a30b2d
Author:     André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Tue Jul 29 17:00:06 2014 +0000
Commit:     André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Tue Jul 29 17:00:06 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=1cc91c92

roverlay/depres, slot rules: "wide match"

In continuation of commit #50bd6d5aac48317c46b777acf9c1836e792bff58,
make the slot match behavior configurable (depending on the slot rule,
not the dep env<-package).

---
 roverlay/depres/simpledeprule/rules.py | 142 +++++++++++++++++++++++----------
 1 file changed, 98 insertions(+), 44 deletions(-)

diff --git a/roverlay/depres/simpledeprule/rules.py b/roverlay/depres/simpledeprule/rules.py
index 7ba4967..df767ba 100644
--- a/roverlay/depres/simpledeprule/rules.py
+++ b/roverlay/depres/simpledeprule/rules.py
@@ -27,6 +27,8 @@ from roverlay.depres.simpledeprule.util import \
 from roverlay.depres.simpledeprule.abstractrules import \
    SimpleRule, FuzzySimpleRule
 
+import roverlay.depres.depenv
+
 
 
 
@@ -100,6 +102,12 @@ class RuleConstructor ( object ):
 #                  # unsafe, could be used to inject "$(rm -rf /)" etc.
 #                  kwargs ['slot_operator'] = value
 
+               elif opt == 'wide_match':
+                  if not has_value:
+                     kwargs ['allow_wide_match'] = True
+                  else:
+                     raise NotImplementedError("wide_match value")
+
                elif opt == '*':
                   kwargs ['slot_operator'] = '*'
 
@@ -232,8 +240,17 @@ class SimpleFuzzySlotDependencyRule ( FuzzySimpleRule ):
 #      'slot' : '{slot}',
 #   }
 
-   #RULE_PREFIX = '~'
-   RULE_PREFIX = SimpleFuzzyDependencyRule.RULE_PREFIX
+   #RULE_PREFIX        = '~'
+   RULE_PREFIX         = SimpleFuzzyDependencyRule.RULE_PREFIX
+
+   # version relation operators that should never be matched in slot dep rules
+   #  (bitmask)
+   VMOD_BASE_DENY_MASK = roverlay.depres.depenv.DepEnv.VMOD_NOT
+
+   # operators that should not be matched in nonwide mode (bitmask)
+   #  - in addition to the base mask -
+   VMOD_WIDE_DENY_MASK = roverlay.depres.depenv.DepEnv.VMOD_GT
+
 
    def __init__ ( self,
       priority          = 71,
@@ -243,6 +260,7 @@ class SimpleFuzzySlotDependencyRule ( FuzzySimpleRule ):
       slotparts         = None,
       subslotparts      = None,
       slot_operator     = None,
+      allow_wide_match  = None,
       **kw
    ):
       super ( SimpleFuzzySlotDependencyRule, self ) . __init__ (
@@ -252,11 +270,17 @@ class SimpleFuzzySlotDependencyRule ( FuzzySimpleRule ):
          **kw
       )
 
-      self.mode          = 0 if slot_mode is None else slot_mode
-      self.slot_restrict = slot_restrict
-      self.slot_operator = slot_operator
-      self.slotparts     = get_slot_parser ("0") if slotparts is None else slotparts
-      self.subslotparts  = subslotparts
+      self.mode             = 0 if slot_mode is None else slot_mode
+      self.slot_restrict    = slot_restrict
+      self.slot_operator    = slot_operator
+      self.slotparts        = (
+         get_slot_parser ("0") if slotparts is None else slotparts
+      )
+      self.subslotparts     = subslotparts
+      self.allow_wide_match = allow_wide_match
+      self.vmod_mask        = self.VMOD_BASE_DENY_MASK
+      if not allow_wide_match:
+         self.vmod_mask |= self.VMOD_WIDE_DENY_MASK
 
       if self.mode == 0:
          # "default"
@@ -294,13 +318,21 @@ class SimpleFuzzySlotDependencyRule ( FuzzySimpleRule ):
 
    def noexport ( self ):
       del self.slot_operator
-      del self.mode
+      del self.allow_wide_match
+
       if self.slot_restrict:
          self.slot_restrict.noexport()
    # --- end of noexport (...) ---
 
    def get_resolving_str ( self ):
       def gen_opts():
+         if self.allow_wide_match:
+            yield "wide_match"
+
+#         yield "vmod_mask={:#x}".format (
+#            self.vmod_mask & ~self.VMOD_BASE_DENY_MASK
+#         )
+
          if self.mode == 2:
             yield "open"
          else:
@@ -327,52 +359,74 @@ class SimpleFuzzySlotDependencyRule ( FuzzySimpleRule ):
          resolv = (
             self._orig_resolving_package
             if hasattr ( self, '_orig_resolving_package' )
-            else self.resolving_package,
+            else self.resolving_package
          ),
          opts   = ':'.join ( gen_opts() )
       )
    # --- end of get_resolving_str (...) ---
 
    def handle_version_relative_match ( self, dep_env, fuzzy ):
+      def get_slotted_result ( dep_env, fuzzy, vmod ):
+         slot_str  = None
+         vslot_str = None
+         slot      = self.slotparts.get_slot ( fuzzy )
+
+         if slot is not None:
+            if self.subslotparts:
+               subslot = self.subslotparts.get_slot ( fuzzy )
+               if subslot is not None:
+                  slot_str  = slot + '/' + subslot
+                  vslot_str = (
+                     self.slotparts.calculate_slot ( fuzzy, slot )
+                     + '/'
+                     + self.subslotparts.calculate_slot ( fuzzy, subslot )
+                  )
+            else:
+               vslot_str = self.slotparts.calculate_slot ( fuzzy, slot )
+               slot_str  = slot
+
+            if slot_str and (
+               not self.slot_restrict
+               or self.slot_restrict.accepts ( vslot_str )
+            ):
+               return self._resolving_fmt.format (
+                  slot    = slot_str,
+                  version = fuzzy ['version'],
+                  vmod    = fuzzy ['version_modifier']
+               )
+            # -- end if <accepted slot>
+         # -- end if <have slot>
+
+         # explicit return
+         return None
+      # --- end of get_slot_result (...) ---
+
       res  = False
       vmod = fuzzy ['vmod']
 
-      # FIXME: improve decision making
-      #
-      if not ( vmod & (dep_env.VMOD_NOT|dep_env.VMOD_GT) ):
-         # can be resolved as slot(ted) dep
 
-         if self.mode == 2:
-            res = self.resolving_package
-         elif vmod & dep_env.VMOD_EQ:
-            slot_str  = None
-            vslot_str = None
-            slot      = self.slotparts.get_slot ( fuzzy )
-
-            if slot is not None:
-               if self.subslotparts:
-                  subslot = self.subslotparts.get_slot ( fuzzy )
-                  if subslot is not None:
-                     slot_str  = slot + '/' + subslot
-                     vslot_str = (
-                        self.slotparts.calculate_slot ( fuzzy, slot )
-                        + '/'
-                        + self.subslotparts.calculate_slot ( fuzzy, subslot )
-                     )
-               else:
-                  vslot_str = self.slotparts.calculate_slot ( fuzzy, slot )
-                  slot_str  = slot
-
-               if slot_str and (
-                  not self.slot_restrict
-                  or self.slot_restrict.accepts ( vslot_str )
-               ):
-                  res = self._resolving_fmt.format (
-                     slot=slot_str,
-                     version=fuzzy['version'], vmod=fuzzy['version_modifier']
-                  )
+      if vmod & self.vmod_mask:
+         # can never be resolved as slot(ted) dep
+         return False
 
-      # -- end if vmod != NOT
+##    MAYBE TODO
+##    elif self.ident and dep_env.want_slotres_override(self.ident):
+###        ^^^^^^^^^^?            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^?
+##       want_slot_res, ... = dep_env.get_slotres_override(self.ident,...)
+###                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^?
+##       if not want_slot_res:
+##          return False
+##       elif ...:
+##          ...
+##
+
+      # else might be resolvable as slot(ted) dep
+      elif self.mode == 2:
+         return self.resolving_package
+      elif vmod & dep_env.VMOD_EQ:
+         return get_slotted_result ( dep_env, fuzzy, vmod )
+      else:
+         return False
+      # -- end if <vmod>
 
-      return res
    # --- end of handle_version_relative_match (...) ---


WARNING: multiple messages have this Message-ID (diff)
From: "André Erdmann" <dywi@mailerd.de>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/depres/simpledeprule/
Date: Sat, 23 Aug 2014 19:03:04 +0000 (UTC)	[thread overview]
Message-ID: <1406653206.1cc91c92cd6103185598fa2e4ce9829a01a30b2d.dywi@gentoo> (raw)
Message-ID: <20140823190304.2eGutl9JRO7_DyoE5YhXMc6FkSg-UUKHh5RfMrD_UGc@z> (raw)

commit:     1cc91c92cd6103185598fa2e4ce9829a01a30b2d
Author:     André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Tue Jul 29 17:00:06 2014 +0000
Commit:     André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Tue Jul 29 17:00:06 2014 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=1cc91c92

roverlay/depres, slot rules: "wide match"

In continuation of commit #50bd6d5aac48317c46b777acf9c1836e792bff58,
make the slot match behavior configurable (depending on the slot rule,
not the dep env<-package).

---
 roverlay/depres/simpledeprule/rules.py | 142 +++++++++++++++++++++++----------
 1 file changed, 98 insertions(+), 44 deletions(-)

diff --git a/roverlay/depres/simpledeprule/rules.py b/roverlay/depres/simpledeprule/rules.py
index 7ba4967..df767ba 100644
--- a/roverlay/depres/simpledeprule/rules.py
+++ b/roverlay/depres/simpledeprule/rules.py
@@ -27,6 +27,8 @@ from roverlay.depres.simpledeprule.util import \
 from roverlay.depres.simpledeprule.abstractrules import \
    SimpleRule, FuzzySimpleRule
 
+import roverlay.depres.depenv
+
 
 
 
@@ -100,6 +102,12 @@ class RuleConstructor ( object ):
 #                  # unsafe, could be used to inject "$(rm -rf /)" etc.
 #                  kwargs ['slot_operator'] = value
 
+               elif opt == 'wide_match':
+                  if not has_value:
+                     kwargs ['allow_wide_match'] = True
+                  else:
+                     raise NotImplementedError("wide_match value")
+
                elif opt == '*':
                   kwargs ['slot_operator'] = '*'
 
@@ -232,8 +240,17 @@ class SimpleFuzzySlotDependencyRule ( FuzzySimpleRule ):
 #      'slot' : '{slot}',
 #   }
 
-   #RULE_PREFIX = '~'
-   RULE_PREFIX = SimpleFuzzyDependencyRule.RULE_PREFIX
+   #RULE_PREFIX        = '~'
+   RULE_PREFIX         = SimpleFuzzyDependencyRule.RULE_PREFIX
+
+   # version relation operators that should never be matched in slot dep rules
+   #  (bitmask)
+   VMOD_BASE_DENY_MASK = roverlay.depres.depenv.DepEnv.VMOD_NOT
+
+   # operators that should not be matched in nonwide mode (bitmask)
+   #  - in addition to the base mask -
+   VMOD_WIDE_DENY_MASK = roverlay.depres.depenv.DepEnv.VMOD_GT
+
 
    def __init__ ( self,
       priority          = 71,
@@ -243,6 +260,7 @@ class SimpleFuzzySlotDependencyRule ( FuzzySimpleRule ):
       slotparts         = None,
       subslotparts      = None,
       slot_operator     = None,
+      allow_wide_match  = None,
       **kw
    ):
       super ( SimpleFuzzySlotDependencyRule, self ) . __init__ (
@@ -252,11 +270,17 @@ class SimpleFuzzySlotDependencyRule ( FuzzySimpleRule ):
          **kw
       )
 
-      self.mode          = 0 if slot_mode is None else slot_mode
-      self.slot_restrict = slot_restrict
-      self.slot_operator = slot_operator
-      self.slotparts     = get_slot_parser ("0") if slotparts is None else slotparts
-      self.subslotparts  = subslotparts
+      self.mode             = 0 if slot_mode is None else slot_mode
+      self.slot_restrict    = slot_restrict
+      self.slot_operator    = slot_operator
+      self.slotparts        = (
+         get_slot_parser ("0") if slotparts is None else slotparts
+      )
+      self.subslotparts     = subslotparts
+      self.allow_wide_match = allow_wide_match
+      self.vmod_mask        = self.VMOD_BASE_DENY_MASK
+      if not allow_wide_match:
+         self.vmod_mask |= self.VMOD_WIDE_DENY_MASK
 
       if self.mode == 0:
          # "default"
@@ -294,13 +318,21 @@ class SimpleFuzzySlotDependencyRule ( FuzzySimpleRule ):
 
    def noexport ( self ):
       del self.slot_operator
-      del self.mode
+      del self.allow_wide_match
+
       if self.slot_restrict:
          self.slot_restrict.noexport()
    # --- end of noexport (...) ---
 
    def get_resolving_str ( self ):
       def gen_opts():
+         if self.allow_wide_match:
+            yield "wide_match"
+
+#         yield "vmod_mask={:#x}".format (
+#            self.vmod_mask & ~self.VMOD_BASE_DENY_MASK
+#         )
+
          if self.mode == 2:
             yield "open"
          else:
@@ -327,52 +359,74 @@ class SimpleFuzzySlotDependencyRule ( FuzzySimpleRule ):
          resolv = (
             self._orig_resolving_package
             if hasattr ( self, '_orig_resolving_package' )
-            else self.resolving_package,
+            else self.resolving_package
          ),
          opts   = ':'.join ( gen_opts() )
       )
    # --- end of get_resolving_str (...) ---
 
    def handle_version_relative_match ( self, dep_env, fuzzy ):
+      def get_slotted_result ( dep_env, fuzzy, vmod ):
+         slot_str  = None
+         vslot_str = None
+         slot      = self.slotparts.get_slot ( fuzzy )
+
+         if slot is not None:
+            if self.subslotparts:
+               subslot = self.subslotparts.get_slot ( fuzzy )
+               if subslot is not None:
+                  slot_str  = slot + '/' + subslot
+                  vslot_str = (
+                     self.slotparts.calculate_slot ( fuzzy, slot )
+                     + '/'
+                     + self.subslotparts.calculate_slot ( fuzzy, subslot )
+                  )
+            else:
+               vslot_str = self.slotparts.calculate_slot ( fuzzy, slot )
+               slot_str  = slot
+
+            if slot_str and (
+               not self.slot_restrict
+               or self.slot_restrict.accepts ( vslot_str )
+            ):
+               return self._resolving_fmt.format (
+                  slot    = slot_str,
+                  version = fuzzy ['version'],
+                  vmod    = fuzzy ['version_modifier']
+               )
+            # -- end if <accepted slot>
+         # -- end if <have slot>
+
+         # explicit return
+         return None
+      # --- end of get_slot_result (...) ---
+
       res  = False
       vmod = fuzzy ['vmod']
 
-      # FIXME: improve decision making
-      #
-      if not ( vmod & (dep_env.VMOD_NOT|dep_env.VMOD_GT) ):
-         # can be resolved as slot(ted) dep
 
-         if self.mode == 2:
-            res = self.resolving_package
-         elif vmod & dep_env.VMOD_EQ:
-            slot_str  = None
-            vslot_str = None
-            slot      = self.slotparts.get_slot ( fuzzy )
-
-            if slot is not None:
-               if self.subslotparts:
-                  subslot = self.subslotparts.get_slot ( fuzzy )
-                  if subslot is not None:
-                     slot_str  = slot + '/' + subslot
-                     vslot_str = (
-                        self.slotparts.calculate_slot ( fuzzy, slot )
-                        + '/'
-                        + self.subslotparts.calculate_slot ( fuzzy, subslot )
-                     )
-               else:
-                  vslot_str = self.slotparts.calculate_slot ( fuzzy, slot )
-                  slot_str  = slot
-
-               if slot_str and (
-                  not self.slot_restrict
-                  or self.slot_restrict.accepts ( vslot_str )
-               ):
-                  res = self._resolving_fmt.format (
-                     slot=slot_str,
-                     version=fuzzy['version'], vmod=fuzzy['version_modifier']
-                  )
+      if vmod & self.vmod_mask:
+         # can never be resolved as slot(ted) dep
+         return False
 
-      # -- end if vmod != NOT
+##    MAYBE TODO
+##    elif self.ident and dep_env.want_slotres_override(self.ident):
+###        ^^^^^^^^^^?            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^?
+##       want_slot_res, ... = dep_env.get_slotres_override(self.ident,...)
+###                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^?
+##       if not want_slot_res:
+##          return False
+##       elif ...:
+##          ...
+##
+
+      # else might be resolvable as slot(ted) dep
+      elif self.mode == 2:
+         return self.resolving_package
+      elif vmod & dep_env.VMOD_EQ:
+         return get_slotted_result ( dep_env, fuzzy, vmod )
+      else:
+         return False
+      # -- end if <vmod>
 
-      return res
    # --- end of handle_version_relative_match (...) ---


             reply	other threads:[~2014-07-29 18:29 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-29 18:29 André Erdmann [this message]
2014-08-23 19:03 ` [gentoo-commits] proj/R_overlay:master commit in: roverlay/depres/simpledeprule/ André Erdmann
  -- strict thread matches above, loose matches on Subject: below --
2014-08-23 19:03 André Erdmann
2014-06-25 16:41 André Erdmann
2014-06-05 22:09 André Erdmann
2013-09-03  8:35 André Erdmann
2013-08-27 15:39 André Erdmann
2013-08-21 13:51 André Erdmann
2013-08-21 10:10 André Erdmann
2013-07-23  7:51 André Erdmann
2013-07-10 15:10 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
2013-07-10 16:16 ` [gentoo-commits] proj/R_overlay:master " André Erdmann
2013-07-03 10:05 André Erdmann
2013-07-03 10:04 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
2013-07-03 10:05 ` [gentoo-commits] proj/R_overlay:master " André Erdmann
2013-06-05 18:08 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
2013-06-13 16:34 ` [gentoo-commits] proj/R_overlay:master " André Erdmann
2013-06-04 21:06 André Erdmann
2012-08-13 16:34 André Erdmann
2012-08-02 15:14 André Erdmann
2012-08-01 21:10 André Erdmann
2012-07-11 18:43 André Erdmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1406653206.1cc91c92cd6103185598fa2e4ce9829a01a30b2d.dywi@gentoo \
    --to=dywi@mailerd.de \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox