<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.linux.gentoo.portage.devel">
    <title>gmane.linux.gentoo.portage.devel</title>
    <link>http://blog.gmane.org/gmane.linux.gentoo.portage.devel</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3481"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3480"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3479"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3478"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3477"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3476"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3475"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3474"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3473"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3472"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3471"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3470"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3469"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3468"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3467"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3466"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3465"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3464"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3463"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3462"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3481">
    <title>Re: [PATCH v3] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3481</link>
    <description>&lt;pre&gt;
It looks good to me, except for this one part, where we should let
SystemExit raise:


+except SystemExit:
+raise



&lt;/pre&gt;</description>
    <dc:creator>Zac Medico</dc:creator>
    <dc:date>2012-05-25T08:47:24</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3480">
    <title>[PATCH v3] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3480</link>
    <description>&lt;pre&gt;Sometimes people wrap long lines in their ebuilds to make it easier to
read, but this causes us issues when doing line-by-line checking.  So
automatically unroll those lines before passing the full content down
to our checkers.

Signed-off-by: Mike Frysinger &amp;lt;vapier&amp;lt; at &amp;gt;gentoo.org&amp;gt;
---
v3
- use import codecs for escaping strings

 pym/repoman/checks.py |   63 +++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 51 insertions(+), 12 deletions(-)

diff --git a/pym/repoman/checks.py b/pym/repoman/checks.py
index c17a0bd..402169e 100644
--- a/pym/repoman/checks.py
+++ b/pym/repoman/checks.py
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5,6 +5,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 """This module contains functions used in Repoman to ascertain the quality
 and correctness of an ebuild."""
 
+import codecs
 import re
 import time
 import repoman.errors as errors
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -757,8 +758,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _here_doc_re = re.compile(r'.*\s&amp;lt;&amp;lt;[-]?(\w+)$')
 _ignore_comment_re = re.compile(r'^\s*#')
 
 def run_checks(contents, pkg):
+unicode_escape_codec = codecs.lookup('unicode_escape')
+unicode_escape = lambda x: unicode_escape_codec.decode(x)[0]
 checks = _constant_checks
 here_doc_delim = None
+multiline = None
 
 for lc in checks:
 lc.new(pkg)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -772,19 +776,54 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; def run_checks(contents, pkg):
 here_doc = _here_doc_re.match(line)
 if here_doc is not None:
 here_doc_delim = re.compile(r'^\s*%s$' % here_doc.group(1))
+if here_doc_delim is not None:
+continue
+
+# Unroll multiline escaped strings so that we can check things:
+#inherit foo bar \
+#moo \
+#cow
+# This will merge these lines like so:
+#inherit foo bar moo cow
+try:
+# A normal line will end in the two bytes: &amp;lt;\&amp;gt; &amp;lt;\n&amp;gt;.  So decoding
+# that will result in python thinking the &amp;lt;\n&amp;gt; is being escaped
+# and eat the single &amp;lt;\&amp;gt; which makes it hard for us to detect.
+# Instead, strip the newline (which we know all lines have), and
+# append a &amp;lt;0&amp;gt;.  Then when python escapes it, if the line ended
+# in a &amp;lt;\&amp;gt;, we'll end up with a &amp;lt;\0&amp;gt; marker to key off of.  This
+# shouldn't be a problem with any valid ebuild ...
+line_escaped = unicode_escape(line.rstrip('\n') + '0')
+except:
+# Who knows what kind of crazy crap an ebuild will have
+# in it -- don't allow it to kill us.
+line_escaped = line
+if multiline:
+# Chop off the \ and \n bytes from the previous line.
+multiline = multiline[:-2] + line
+if not line_escaped.endswith('\0'):
+line = multiline
+num = multinum
+multiline = None
+else:
+continue
+else:
+if line_escaped.endswith('\0'):
+multinum = num
+multiline = line
+continue
 
-if here_doc_delim is None:
-# We're not in a here-document.
-is_comment = _ignore_comment_re.match(line) is not None
-for lc in checks:
-if is_comment and lc.ignore_comment:
-continue
-if lc.check_eapi(pkg.metadata['EAPI']):
-ignore = lc.ignore_line
-if not ignore or not ignore.match(line):
-e = lc.check(num, line)
-if e:
-yield lc.repoman_check_name, e % (num + 1)
+# Finally we have a full line to parse.
+is_comment = _ignore_comment_re.match(line) is not None
+for lc in checks:
+if is_comment and lc.ignore_comment:
+continue
+if lc.check_eapi(pkg.metadata['EAPI']):
+ignore = lc.ignore_line
+if not ignore or not ignore.match(line):
+e = lc.check(num, line)
+if e:
+yield lc.repoman_check_name, e % (num + 1)
 
 for lc in checks:
 i = lc.end()
&lt;/pre&gt;</description>
    <dc:creator>Mike Frysinger</dc:creator>
    <dc:date>2012-05-25T05:22:50</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3479">
    <title>Re: [RFC/PATCH] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3479</link>
    <description>&lt;pre&gt;
Hmm,  http://devmanual.gentoo.org/ebuild-writing/file-format/index.html#indenting-and-whitespace

does sort of imply a "keep it under 80 chars where possible", but vims
wrap settings don't really see it like that, vim is more "80
characters, if you can't get it under that, WRAP" .

http://devmanual.gentoo.org/ebuild-writing/variables/index.html#required-variables

Indicates "less than 80", but 79 characters + 14 for 'DESCRIPTION=""'
= 93 so if you're pushing the description limitation, vim will try
wrapping each and every time you type a new letter.

And repoman doesn't even warn till you hit a 100 character description
(  col 114 )

So is there something that specifies this somewhere, or does that
required-variables and indenting-and-whitespace section need to be
made updated and made more clear, that

Description can be up to 100 ( not 80 ) and that the text-width is
merely a suggestion, not any sort of
defacto-but-hard-to-find-documented standard?

&lt;/pre&gt;</description>
    <dc:creator>Kent Fredric</dc:creator>
    <dc:date>2012-05-24T21:43:48</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3478">
    <title>Re: [PATCH v2] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3478</link>
    <description>&lt;pre&gt;
-return unicode_escape_codec(s)[0]
+return unicode_escape_codec.decode(s)[0]



&lt;/pre&gt;</description>
    <dc:creator>Zac Medico</dc:creator>
    <dc:date>2012-05-24T20:08:24</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3477">
    <title>Re: [PATCH v2] repoman: add a mini framework for checking eclasses, and fill it out</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3477</link>
    <description>&lt;pre&gt;
Looks good to me.
&lt;/pre&gt;</description>
    <dc:creator>Zac Medico</dc:creator>
    <dc:date>2012-05-24T20:04:30</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3476">
    <title>Re: [PATCH v2] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3476</link>
    <description>&lt;pre&gt;
That decode('string_escape') method won't work in python3, because the
str object doesn't have a decode method. I think something like this
will work with both python3 and python2:

import codecs

unicode_escape_codec = codecs.lookup('unicode_escape')

def unicode_escape(s):
return unicode_escape_codec(s)[0]

line_escaped = unicode_escape(line.rstrip('\n') + '0')
&lt;/pre&gt;</description>
    <dc:creator>Zac Medico</dc:creator>
    <dc:date>2012-05-24T19:52:23</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3475">
    <title>[PATCH v2] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3475</link>
    <description>&lt;pre&gt;Sometimes people wrap long lines in their ebuilds to make it easier to
read, but this causes us issues when doing line-by-line checking.  So
automatically unroll those lines before passing the full content down
to our checkers.

Signed-off-by: Mike Frysinger &amp;lt;vapier&amp;lt; at &amp;gt;gentoo.org&amp;gt;
---
v2
- re-order heredoc/multiline checking

 pym/repoman/checks.py |   60 +++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 48 insertions(+), 12 deletions(-)

diff --git a/pym/repoman/checks.py b/pym/repoman/checks.py
index c17a0bd..cd8d3d2 100644
--- a/pym/repoman/checks.py
+++ b/pym/repoman/checks.py
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -759,6 +759,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _ignore_comment_re = re.compile(r'^\s*#')
 def run_checks(contents, pkg):
 checks = _constant_checks
 here_doc_delim = None
+multiline = None
 
 for lc in checks:
 lc.new(pkg)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -772,19 +773,54 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; def run_checks(contents, pkg):
 here_doc = _here_doc_re.match(line)
 if here_doc is not None:
 here_doc_delim = re.compile(r'^\s*%s$' % here_doc.group(1))
+if here_doc_delim is not None:
+continue
+
+# Unroll multiline escaped strings so that we can check things:
+#inherit foo bar \
+#moo \
+#cow
+# This will merge these lines like so:
+#inherit foo bar moo cow
+try:
+# A normal line will end in the two bytes: &amp;lt;\&amp;gt; &amp;lt;\n&amp;gt;.  So decoding
+# that will result in python thinking the &amp;lt;\n&amp;gt; is being escaped
+# and eat the single &amp;lt;\&amp;gt; which makes it hard for us to detect.
+# Instead, strip the newline (which we know all lines have), and
+# append a &amp;lt;0&amp;gt;.  Then when python escapes it, if the line ended
+# in a &amp;lt;\&amp;gt;, we'll end up with a &amp;lt;\0&amp;gt; marker to key off of.  This
+# shouldn't be a problem with any valid ebuild ...
+line_escaped = (line.rstrip('\n') + '0').decode('string_escape')
+except:
+# Who knows what kind of crazy crap an ebuild will have
+# in it -- don't allow it to kill us.
+line_escaped = line
+if multiline:
+# Chop off the \ and \n bytes from the previous line.
+multiline = multiline[:-2] + line
+if not line_escaped.endswith('\0'):
+line = multiline
+num = multinum
+multiline = None
+else:
+continue
+else:
+if line_escaped.endswith('\0'):
+multinum = num
+multiline = line
+continue
 
-if here_doc_delim is None:
-# We're not in a here-document.
-is_comment = _ignore_comment_re.match(line) is not None
-for lc in checks:
-if is_comment and lc.ignore_comment:
-continue
-if lc.check_eapi(pkg.metadata['EAPI']):
-ignore = lc.ignore_line
-if not ignore or not ignore.match(line):
-e = lc.check(num, line)
-if e:
-yield lc.repoman_check_name, e % (num + 1)
+# Finally we have a full line to parse.
+is_comment = _ignore_comment_re.match(line) is not None
+for lc in checks:
+if is_comment and lc.ignore_comment:
+continue
+if lc.check_eapi(pkg.metadata['EAPI']):
+ignore = lc.ignore_line
+if not ignore or not ignore.match(line):
+e = lc.check(num, line)
+if e:
+yield lc.repoman_check_name, e % (num + 1)
 
 for lc in checks:
 i = lc.end()
&lt;/pre&gt;</description>
    <dc:creator>Mike Frysinger</dc:creator>
    <dc:date>2012-05-24T19:20:24</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3474">
    <title>[PATCH v2] repoman: add a mini framework for checking eclasses, and fill it out</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3474</link>
    <description>&lt;pre&gt;Rather than copying &amp;amp; pasting the same behavior for the different eclass
checks, add a common class for them to extend.  This makes adding more
eclass checks trivial, and keeps down bitrot.

This does abuse the checking interface slightly -- the eclass will change
its category between unused and missing based on the checks.

URL: https://bugs.gentoo.org/417159
URL: https://bugs.gentoo.org/417231
Signed-off-by: Mike Frysinger &amp;lt;vapier&amp;lt; at &amp;gt;gentoo.org&amp;gt;
---
v2
- fix optimization aspects

 bin/repoman           |    6 +-
 pym/repoman/checks.py |  161 ++++++++++++++++++++++++++++++++++---------------
 pym/repoman/errors.py |    1 -
 3 files changed, 116 insertions(+), 52 deletions(-)

diff --git a/bin/repoman b/bin/repoman
index fd87847..779e651 100755
--- a/bin/repoman
+++ b/bin/repoman
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -315,8 +315,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; qahelp={
 "file.size.fatal":"Files in the files directory must be under 60 KiB",
 "file.name":"File/dir name must be composed of only the following chars: %s " % allowed_filename_chars,
 "file.UTF8":"File is not UTF8 compliant",
-"inherit.autotools":"Ebuild inherits autotools but does not call eautomake, eautoconf or eautoreconf",
 "inherit.deprecated":"Ebuild inherits a deprecated eclass",
+"inherit.missing":"Ebuild uses functions from an eclass but does not inherit it",
+"inherit.unused":"Ebuild inherits an eclass but does not use it",
 "java.eclassesnotused":"With virtual/jdk in DEPEND you must inherit a java eclass",
 "wxwidgets.eclassnotused":"Ebuild DEPENDs on x11-libs/wxGTK without inheriting wxwidgets.eclass",
 "KEYWORDS.dropped":"Ebuilds that appear to have dropped KEYWORDS for some arch",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -382,7 +383,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; qahelp={
 "ebuild.majorsyn":"This ebuild has a major syntax error that may cause the ebuild to fail partially or fully",
 "ebuild.minorsyn":"This ebuild has a minor syntax error that contravenes gentoo coding style",
 "ebuild.badheader":"This ebuild has a malformed header",
-"eprefixify.defined":"The ebuild uses eprefixify, but does not inherit the prefix eclass",
 "manifest.bad":"Manifest has missing or incorrect digests",
 "metadata.missing":"Missing metadata.xml files",
 "metadata.bad":"Bad metadata.xml files",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -425,7 +425,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; qawarnings = set((
 "ebuild.badheader",
 "ebuild.patches",
 "file.size",
-"inherit.autotools",
+"inherit.unused",
 "inherit.deprecated",
 "java.eclassesnotused",
 "wxwidgets.eclassnotused",
diff --git a/pym/repoman/checks.py b/pym/repoman/checks.py
index 77df603..c17a0bd 100644
--- a/pym/repoman/checks.py
+++ b/pym/repoman/checks.py
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -331,24 +331,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; class EbuildQuotedA(LineCheck):
 if match:
 return "Quoted \"${A}\" on line: %d"
 
-class EprefixifyDefined(LineCheck):
-""" Check that prefix.eclass is inherited if needed"""
-
-repoman_check_name = 'eprefixify.defined'
-
-_eprefixify_re = re.compile(r'\beprefixify\b')
-_inherit_prefix_re = re.compile(r'^\s*inherit\s(.*\s)?prefix\b')
-
-def new(self, pkg):
-self._prefix_inherited = False
-
-def check(self, num, line):
-if self._eprefixify_re.search(line) is not None:
-if not self._prefix_inherited:
-return errors.EPREFIXIFY_MISSING_INHERIT
-elif self._inherit_prefix_re.search(line) is not None:
-self._prefix_inherited = True
-
 class NoOffsetWithHelpers(LineCheck):
 """ Check that the image location, the alternate root offset, and the
 offset prefix (D, ROOT, ED, EROOT and EPREFIX) are not used with
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -464,43 +446,124 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; class InheritDeprecated(LineCheck):
 (eclass, replacement)
 del self._indirect_deprecated
 
-class InheritAutotools(LineCheck):
+class InheritEclass(LineCheck):
 """
-Make sure appropriate functions are called in
-ebuilds that inherit autotools.eclass.
+Base class for checking for missing inherits, as well as excess inherits.
+
+Args:
+_eclass: Set to the name of your eclass.
+_funcs: A tuple of functions that this eclass provides.
+_comprehensive: Is the list of functions complete?
+_exempt_eclasses: If these eclasses are inherited, disable the missing
+                  inherit check.
 """
 
-repoman_check_name = 'inherit.autotools'
-_inherit_autotools_re = re.compile(r'^\s*inherit\s(.*\s)?autotools(\s|$)')
-_autotools_funcs = (
-"eaclocal", "eautoconf", "eautoheader",
-"eautomake", "eautoreconf", "_elibtoolize")
-_autotools_func_re = re.compile(r'\b(' + \
-"|".join(_autotools_funcs) + r')\b')
-# Exempt eclasses:
-# git - An EGIT_BOOTSTRAP variable may be used to call one of
-#       the autotools functions.
-# subversion - An ESVN_BOOTSTRAP variable may be used to call one of
-#       the autotools functions.
-_exempt_eclasses = frozenset(["git", "subversion"])
+def __init__(self):
+self._inherit_re = re.compile(r'^\s*inherit\s(.*\s)?%s(\s|$)' % self._eclass)
+self._func_re = re.compile(r'\b(' + '|'.join(self._funcs) + r')\b')
 
 def new(self, pkg):
-self._inherit_autotools = None
-self._autotools_func_call = None
-self._disabled = self._exempt_eclasses.intersection(pkg.inherited)
+self.repoman_check_name = 'inherit.missing'
+# We can't use pkg.inherited because that tells us all the eclass that
+# have been inherited and not just the ones we inherit directly.
+self._inherit = False
+self._func_call = False
+if hasattr(self, '_exempt_eclasses'):
+self._disabled = self._exempt_eclasses.intersection(pkg.inherited)
+else:
+self._disabled = False
 
 def check(self, num, line):
-if self._disabled:
-return
-if self._inherit_autotools is None:
-self._inherit_autotools = self._inherit_autotools_re.match(line)
-if self._inherit_autotools is not None and \
-self._autotools_func_call is None:
-self._autotools_func_call = self._autotools_func_re.search(line)
+if not self._inherit:
+self._inherit = self._inherit_re.match(line)
+if not self._inherit:
+if self._disabled:
+return
+s = self._func_re.search(line)
+if s:
+self._func_call = True
+return '%s.eclass is not inherited, but "%s" found at line: %s' % \
+(self._eclass, s.group(0), '%d')
+elif not self._func_call:
+self._func_call = self._func_re.search(line)
 
 def end(self):
-if self._inherit_autotools and self._autotools_func_call is None:
-yield 'no eauto* function called'
+if self._comprehensive and self._inherit and not self._func_call:
+self.repoman_check_name = 'inherit.unused'
+yield 'no function called from %s.eclass; please drop' % self._eclass
+
+class InheritAutotools(InheritEclass):
+_eclass = 'autotools'
+_funcs = (
+'eaclocal', 'eautoconf', 'eautoheader',
+'eautomake', 'eautoreconf', '_elibtoolize',
+'eautopoint'
+)
+_comprehensive = True
+
+# Exempt eclasses:
+# git - An EGIT_BOOTSTRAP variable may be used to call one of
+#       the autotools functions.
+# subversion - An ESVN_BOOTSTRAP variable may be used to call one of
+#       the autotools functions.
+_exempt_eclasses = frozenset(['git', 'subversion', 'autotools-utils'])
+
+class InheritEutils(InheritEclass):
+_eclass = 'eutils'
+_funcs = (
+'estack_push', 'estack_pop', 'eshopts_push', 'eshopts_pop',
+'eumask_push', 'eumask_pop', 'epatch', 'epatch_user',
+'emktemp', 'edos2unix', 'in_iuse', 'use_if_iuse', 'usex',
+'makeopts_jobs'
+)
+_comprehensive = False
+
+# These are "eclasses are the whole ebuild" type thing.
+_exempt_eclasses = frozenset(['toolchain', 'toolchain-binutils'])
+
+class InheritFlagOMatic(InheritEclass):
+_eclass = 'flag-o-matic'
+_funcs = (
+'filter-(ld)?flags', 'strip-flags', 'strip-unsupported-flags',
+'append-((ld|c(pp|xx)?))?flags', 'append-libs',
+)
+_comprehensive = False
+
+class InheritLibtool(InheritEclass):
+_eclass = 'libtool'
+_funcs = (
+'elibtoolize',
+)
+_comprehensive = True
+
+class InheritMultilib(InheritEclass):
+_eclass = 'multilib'
+_funcs = (
+'get_libdir',
+)
+_comprehensive = False
+
+class InheritPrefix(InheritEclass):
+_eclass = 'prefix'
+_funcs = (
+'eprefixify',
+)
+_comprehensive = True
+
+class InheritToolchainFuncs(InheritEclass):
+_eclass = 'toolchain-funcs'
+_funcs = (
+'gen_usr_ldscript',
+)
+_comprehensive = False
+
+class InheritUser(InheritEclass):
+_eclass = 'user'
+_funcs = (
+'enewuser', 'enewgroup',
+'egetent', 'egethome', 'egetshell'
+)
+_comprehensive = True
 
 class IUseUndefined(LineCheck):
 """
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -679,8 +742,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _constant_checks = tuple((c() for c in (
 EbuildHeader, EbuildWhitespace, EbuildBlankLine, EbuildQuote,
 EbuildAssignment, Eapi3EbuildAssignment, EbuildUselessDodoc,
 EbuildUselessCdS, EbuildNestedDie,
-EbuildPatches, EbuildQuotedA, EapiDefinition, EprefixifyDefined,
-ImplicitRuntimeDeps, InheritAutotools, InheritDeprecated, IUseUndefined,
+EbuildPatches, EbuildQuotedA, EapiDefinition,
+ImplicitRuntimeDeps, InheritAutotools, InheritDeprecated, InheritEutils,
+InheritFlagOMatic, InheritMultilib, InheritLibtool, InheritPrefix,
+InheritToolchainFuncs, InheritUser, IUseUndefined,
 EMakeParallelDisabled, EMakeParallelDisabledViaMAKEOPTS, NoAsNeeded,
 DeprecatedBindnowFlags, SrcUnpackPatches, WantAutoDefaultValue,
 SrcCompileEconf, Eapi3DeprecatedFuncs, NoOffsetWithHelpers,
diff --git a/pym/repoman/errors.py b/pym/repoman/errors.py
index 3209243..c515502 100644
--- a/pym/repoman/errors.py
+++ b/pym/repoman/errors.py
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -19,7 +19,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; EAPI_DEFINED_AFTER_INHERIT = 'EAPI defined after inherit on line: %d'
 NO_AS_NEEDED = 'Upstream asneeded linking bug (no-as-needed on line: %d)'
 PRESERVE_OLD_LIB = 'Upstream ABI change workaround on line: %d'
 BUILT_WITH_USE = 'built_with_use on line: %d'
-EPREFIXIFY_MISSING_INHERIT = "prefix.eclass is not inherited, but eprefixify is used on line: %d"
 NO_OFFSET_WITH_HELPERS = "Helper function is used with D, ROOT, ED, EROOT or EPREFIX on line :%d"
 SANDBOX_ADDPREDICT = 'Ebuild calls addpredict on line: %d'
 USEQ_ERROR = 'Ebuild calls deprecated useq function on line: %d'
&lt;/pre&gt;</description>
    <dc:creator>Mike Frysinger</dc:creator>
    <dc:date>2012-05-24T19:20:13</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3473">
    <title>Re: [PATCH] repoman: add a mini framework for checking eclasses, and fill it out</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3473</link>
    <description>&lt;pre&gt;
yes, that's why i picked only ones that are simple/stable


if we're going to merge them, might as well do it once rather than still 
having this problem, but reduced.  if i extended the framework to parse the 
syntax used for documenting the eclass, the problem is reduced to "maintainers 
that fail to fully document their interfaces will hit problems".  but i think 
that's a good hammer to hit eclass maintainers with.
-mike
&lt;/pre&gt;</description>
    <dc:creator>Mike Frysinger</dc:creator>
    <dc:date>2012-05-24T19:11:27</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3472">
    <title>Re: [RFC/PATCH] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3472</link>
    <description>&lt;pre&gt;
i was thinking this would handle wrapped lines and heredocs together better, 
but i'll ignore that until i can come up with a concrete case.


the reason i didn't go the regex route is because this fails with:
echo foo \\\\\
cow
whereas letting python take care of all the escaping works much better
-mike
&lt;/pre&gt;</description>
    <dc:creator>Mike Frysinger</dc:creator>
    <dc:date>2012-05-24T16:33:09</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3471">
    <title>Re: [RFC/PATCH] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3471</link>
    <description>&lt;pre&gt;
there is no policy dictating line length.  but certainly lines that are 200+ 
chars should get wrapped ...

as for changing the vim settings, you'll have to file a request with the vim 
maintainer.
-mike
&lt;/pre&gt;</description>
    <dc:creator>Mike Frysinger</dc:creator>
    <dc:date>2012-05-24T16:18:15</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3470">
    <title>Re: [RFC/PATCH] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3470</link>
    <description>&lt;pre&gt;

This may be a result of the default vim settings that get enabled if
you're editing an ebuild.

If you don't manually wrap the lines, vim will do it for you, because
the ebuild profile for vim ( app-vim/gentoo-syntax ,
/usr/share/vim/vimfiles/ftplugin/ebuild.vim ) sets textwidth=80

This in my personal experience is unhelpful, and every time the text
wrap fires it risks producing broken code, and I've resorted to
manually wrapping things with the proper escapes just to avoid being
attacked by the wrap.

( I had assumed that the forced 80 char text width was something that
was enforced by policy and wasn't game to try bucking the curve )

If there is no such policy, and a forced text-wrap at 80 characters is
not needed, I would love for that setting to be removed.



&lt;/pre&gt;</description>
    <dc:creator>Kent Fredric</dc:creator>
    <dc:date>2012-05-24T10:27:36</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3469">
    <title>Re: [RFC/PATCH] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3469</link>
    <description>&lt;pre&gt;
This code should come right after the line that says "We're not in a
here-document", because we only need it to trigger when we're not in a
here-document.

I think it's going to be cleaner to detect an escaped newline with a
regular expression, like r'(^|[^\\])\\$'.
&lt;/pre&gt;</description>
    <dc:creator>Zac Medico</dc:creator>
    <dc:date>2012-05-24T04:19:45</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3468">
    <title>[RFC/PATCH] repoman: unroll escaped lines so we can check the entirety of it</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3468</link>
    <description>&lt;pre&gt;Sometimes people wrap long lines in their ebuilds to make it easier to
read, but this causes us issues when doing line-by-line checking.  So
automatically unroll those lines before passing the full content down
to our checkers.

This seems to work, but maybe someone can suggest something simpler.

Signed-off-by: Mike Frysinger &amp;lt;vapier&amp;lt; at &amp;gt;gentoo.org&amp;gt;
---
 pym/repoman/checks.py |   35 +++++++++++++++++++++++++++++++++++
 1 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/pym/repoman/checks.py b/pym/repoman/checks.py
index 65e7136..67f2b0a 100644
--- a/pym/repoman/checks.py
+++ b/pym/repoman/checks.py
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -750,11 +750,46 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _ignore_comment_re = re.compile(r'^\s*#')
 def run_checks(contents, pkg):
 checks = _constant_checks
 here_doc_delim = None
+multiline = None
 
 for lc in checks:
 lc.new(pkg)
 for num, line in enumerate(contents):
 
+# Unroll multiline escaped strings so that we can check things:
+#inherit foo bar \
+#moo \
+#cow
+# This will merge these lines like so:
+#inherit foo bar moo cow
+try:
+# A normal line will end in the two bytes: &amp;lt;\&amp;gt; &amp;lt;\n&amp;gt;.  So decoding
+# that will result in python thinking the &amp;lt;\n&amp;gt; is being escaped
+# and eat the single &amp;lt;\&amp;gt; which makes it hard for us to detect.
+# Instead, strip the newline (which we know all lines have), and
+# append a &amp;lt;0&amp;gt;.  Then when python escapes it, if the line ended
+# in a &amp;lt;\&amp;gt;, we'll end up with a &amp;lt;\0&amp;gt; marker to key off of.  This
+# shouldn't be a problem with any valid ebuild ...
+line_escaped = (line.rstrip('\n') + '0').decode('string_escape')
+except:
+# Who knows what kind of crazy crap an ebuild will have
+# in it -- don't allow it to kill us.
+line_escaped = line
+if multiline:
+# Chop off the \ and \n bytes from the previous line.
+multiline = multiline[:-2] + line
+if not line_escaped.endswith('\0'):
+line = multiline
+num = multinum
+multiline = None
+else:
+continue
+else:
+if line_escaped.endswith('\0'):
+multinum = num
+multiline = line
+continue
+
 # Check if we're inside a here-document.
 if here_doc_delim is not None:
 if here_doc_delim.match(line):
&lt;/pre&gt;</description>
    <dc:creator>Mike Frysinger</dc:creator>
    <dc:date>2012-05-24T04:06:39</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3467">
    <title>Re: [PATCH] repoman: add a mini framework for checking eclasses, and fill it out</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3467</link>
    <description>&lt;pre&gt;
Seems reasonable.


Yeah, we could do that for all escaped newlines (not just the ones
involving inherit).


Maybe use something like (^[[:space:]]*|[|&amp;amp;]+[[:space:]]*)\b(inherit)
like I did here:

http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=a8889947c45a9fa81ca006b333466372b64f0344

That way it's less likely to match the word "inherit" inside of a
comment or quoted string.
&lt;/pre&gt;</description>
    <dc:creator>Zac Medico</dc:creator>
    <dc:date>2012-05-24T04:01:06</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3466">
    <title>Re: [PATCH] repoman: add a mini framework for checking eclasses, and fill it out</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3466</link>
    <description>&lt;pre&gt;
in scanning the whole tree, this seems to cause some issues (not new) with 
extended constructs and not detecting this ebuilds inherits an eclass 
directly.  some examples:

(1)
foo="autotools"
...
inherit ${foo}
this seems pointless imo since we've already ruled that multiple `inherit` 
calls are OK

(2)
inherit ... \
autotools
this is annoying.  maybe we should adapt the core line code to unroll these 
before passing to the individual checks ?

(3)
[[ ${PV} == "9999" ]] &amp;amp;&amp;amp; inherit autotools
this one would require tweaking the regex like so:
(^[[:space:]]*|[[:space:]])inherit

any opinions ?
-mike
&lt;/pre&gt;</description>
    <dc:creator>Mike Frysinger</dc:creator>
    <dc:date>2012-05-24T03:15:05</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3465">
    <title>Re: [PATCH] repoman: add a mini framework for checking eclasses, and fill it out</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3465</link>
    <description>&lt;pre&gt;
It's fragile to keep all of these eclass interface definitions hardcoded
in python. For example, the _comprehensive checks are going to start
triggering repoman warnings every time that we add a new function to an
eclass. If we keep the eclass interface definitions in the tree with the
eclasses, then it will solve this problem, and it will also be possible
for overlays to fork eclasses and tweak interfaces.



The _inherit_re and _func_re regular expressions do not change from one
package to the next, so we can compile them inside the __init__
constructor instead, which is only called once in global scope.


It's more efficient to use hasattr(self, '_exempt_eclasses') than to use
'_exempt_eclasses' in dir(self).

&lt;/pre&gt;</description>
    <dc:creator>Zac Medico</dc:creator>
    <dc:date>2012-05-23T19:52:11</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3464">
    <title>[PATCH] repoman: add a mini framework for checking eclasses, and fill it out</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3464</link>
    <description>&lt;pre&gt;Rather than copying &amp;amp; pasting the same behavior for the different eclass
checks, add a common class for them to extend.  This makes adding more
eclass checks trivial, and keeps down bitrot.

This does abuse the checking interface slightly -- the eclass will change
its category between unused and missing based on the checks.

URL: https://bugs.gentoo.org/417159
URL: https://bugs.gentoo.org/417231
Signed-off-by: Mike Frysinger &amp;lt;vapier&amp;lt; at &amp;gt;gentoo.org&amp;gt;
---
 bin/repoman           |    6 +-
 pym/repoman/checks.py |  143 ++++++++++++++++++++++++++++++++-----------------
 pym/repoman/errors.py |    1 -
 3 files changed, 97 insertions(+), 53 deletions(-)

diff --git a/bin/repoman b/bin/repoman
index 3697403..d7ffcdd 100755
--- a/bin/repoman
+++ b/bin/repoman
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -315,8 +315,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; qahelp={
 "file.size.fatal":"Files in the files directory must be under 60 KiB",
 "file.name":"File/dir name must be composed of only the following chars: %s " % allowed_filename_chars,
 "file.UTF8":"File is not UTF8 compliant",
-"inherit.autotools":"Ebuild inherits autotools but does not call eautomake, eautoconf or eautoreconf",
 "inherit.deprecated":"Ebuild inherits a deprecated eclass",
+"inherit.missing":"Ebuild uses functions from an eclass but does not inherit it",
+"inherit.unused":"Ebuild inherits an eclass but does not use it",
 "java.eclassesnotused":"With virtual/jdk in DEPEND you must inherit a java eclass",
 "wxwidgets.eclassnotused":"Ebuild DEPENDs on x11-libs/wxGTK without inheriting wxwidgets.eclass",
 "KEYWORDS.dropped":"Ebuilds that appear to have dropped KEYWORDS for some arch",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -382,7 +383,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; qahelp={
 "ebuild.majorsyn":"This ebuild has a major syntax error that may cause the ebuild to fail partially or fully",
 "ebuild.minorsyn":"This ebuild has a minor syntax error that contravenes gentoo coding style",
 "ebuild.badheader":"This ebuild has a malformed header",
-"eprefixify.defined":"The ebuild uses eprefixify, but does not inherit the prefix eclass",
 "manifest.bad":"Manifest has missing or incorrect digests",
 "metadata.missing":"Missing metadata.xml files",
 "metadata.bad":"Bad metadata.xml files",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -425,7 +425,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; qawarnings = set((
 "ebuild.badheader",
 "ebuild.patches",
 "file.size",
-"inherit.autotools",
+"inherit.unused",
 "inherit.deprecated",
 "java.eclassesnotused",
 "wxwidgets.eclassnotused",
diff --git a/pym/repoman/checks.py b/pym/repoman/checks.py
index 77df603..088a916 100644
--- a/pym/repoman/checks.py
+++ b/pym/repoman/checks.py
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -331,24 +331,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; class EbuildQuotedA(LineCheck):
 if match:
 return "Quoted \"${A}\" on line: %d"
 
-class EprefixifyDefined(LineCheck):
-""" Check that prefix.eclass is inherited if needed"""
-
-repoman_check_name = 'eprefixify.defined'
-
-_eprefixify_re = re.compile(r'\beprefixify\b')
-_inherit_prefix_re = re.compile(r'^\s*inherit\s(.*\s)?prefix\b')
-
-def new(self, pkg):
-self._prefix_inherited = False
-
-def check(self, num, line):
-if self._eprefixify_re.search(line) is not None:
-if not self._prefix_inherited:
-return errors.EPREFIXIFY_MISSING_INHERIT
-elif self._inherit_prefix_re.search(line) is not None:
-self._prefix_inherited = True
-
 class NoOffsetWithHelpers(LineCheck):
 """ Check that the image location, the alternate root offset, and the
 offset prefix (D, ROOT, ED, EROOT and EPREFIX) are not used with
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -464,43 +446,104 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; class InheritDeprecated(LineCheck):
 (eclass, replacement)
 del self._indirect_deprecated
 
-class InheritAutotools(LineCheck):
-"""
-Make sure appropriate functions are called in
-ebuilds that inherit autotools.eclass.
+class InheritEclass(LineCheck):
 """
+Base class for checking for missing inherits, as well as excess inherits.
 
-repoman_check_name = 'inherit.autotools'
-_inherit_autotools_re = re.compile(r'^\s*inherit\s(.*\s)?autotools(\s|$)')
-_autotools_funcs = (
-"eaclocal", "eautoconf", "eautoheader",
-"eautomake", "eautoreconf", "_elibtoolize")
-_autotools_func_re = re.compile(r'\b(' + \
-"|".join(_autotools_funcs) + r')\b')
-# Exempt eclasses:
-# git - An EGIT_BOOTSTRAP variable may be used to call one of
-#       the autotools functions.
-# subversion - An ESVN_BOOTSTRAP variable may be used to call one of
-#       the autotools functions.
-_exempt_eclasses = frozenset(["git", "subversion"])
+Args:
+_eclass: Set to the name of your eclass.
+_funcs: A tuple of functions that this eclass provides.
+_comprehensive: Is the list of functions complete?
+_exempt_eclasses: If these eclasses are inherited, disable the missing
+                  inherit check.
+"""
 
 def new(self, pkg):
-self._inherit_autotools = None
-self._autotools_func_call = None
-self._disabled = self._exempt_eclasses.intersection(pkg.inherited)
+self.repoman_check_name = 'inherit.missing'
+self._inherit_re = re.compile(r'^\s*inherit\s(.*\s)?%s(\s|$)' % self._eclass)
+self._func_re = re.compile(r'\b(' + '|'.join(self._funcs) + r')\b')
+# We can't use pkg.inherited because that tells us all the eclass that
+# have been inherited and not just the ones we inherit directly.
+self._inherit = False
+self._func_call = False
+if '_exempt_eclasses' in dir(self):
+self._disabled = self._exempt_eclasses.intersection(pkg.inherited)
+else:
+self._disabled = False
 
 def check(self, num, line):
-if self._disabled:
-return
-if self._inherit_autotools is None:
-self._inherit_autotools = self._inherit_autotools_re.match(line)
-if self._inherit_autotools is not None and \
-self._autotools_func_call is None:
-self._autotools_func_call = self._autotools_func_re.search(line)
+if not self._inherit:
+self._inherit = self._inherit_re.match(line)
+if not self._inherit:
+if self._disabled:
+return
+s = self._func_re.search(line)
+if s:
+self._func_call = True
+return '%s.eclass is not inherited, but "%s" found at line: %s' % \
+(self._eclass, s.group(0), '%d')
+elif not self._func_call:
+self._func_call = self._func_re.search(line)
 
 def end(self):
-if self._inherit_autotools and self._autotools_func_call is None:
-yield 'no eauto* function called'
+if self._comprehensive and self._inherit and not self._func_call:
+self.repoman_check_name = 'inherit.unused'
+yield 'no function called from %s.eclass; please drop' % self._eclass
+
+class InheritAutotools(InheritEclass):
+_eclass = 'autotools'
+_funcs = (
+'eaclocal', 'eautoconf', 'eautoheader',
+'eautomake', 'eautoreconf', '_elibtoolize',
+'eautopoint'
+)
+_comprehensive = True
+
+# Exempt eclasses:
+# git - An EGIT_BOOTSTRAP variable may be used to call one of
+#       the autotools functions.
+# subversion - An ESVN_BOOTSTRAP variable may be used to call one of
+#       the autotools functions.
+_exempt_eclasses = frozenset(['git', 'subversion'])
+
+class InheritEutils(InheritEclass):
+_eclass = 'eutils'
+_funcs = (
+'estack_push', 'estack_pop', 'eshopts_push', 'eshopts_pop',
+'eumask_push', 'eumask_pop', 'epatch', 'epatch_user',
+'emktemp', 'edos2unix', 'in_iuse', 'use_if_iuse', 'usex',
+'makeopts_jobs'
+)
+_comprehensive = False
+
+class InheritLibtool(InheritEclass):
+_eclass = 'libtool'
+_funcs = (
+'elibtoolize',
+)
+_comprehensive = True
+
+class InheritPrefix(InheritEclass):
+_eclass = 'prefix'
+_funcs = (
+'eprefixify',
+)
+_comprehensive = True
+
+class InheritToolchainFuncs(InheritEclass):
+_eclass = 'toolchain-funcs'
+_funcs = (
+'gen_usr_ldscript',
+)
+_comprehensive = True
+
+class InheritUser(InheritEclass):
+_eclass = 'user'
+_funcs = (
+'enewuser', 'enewgroup',
+'egetent', 'egethome', 'egetshell'
+)
+_comprehensive = True
 
 class IUseUndefined(LineCheck):
 """
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -679,8 +722,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _constant_checks = tuple((c() for c in (
 EbuildHeader, EbuildWhitespace, EbuildBlankLine, EbuildQuote,
 EbuildAssignment, Eapi3EbuildAssignment, EbuildUselessDodoc,
 EbuildUselessCdS, EbuildNestedDie,
-EbuildPatches, EbuildQuotedA, EapiDefinition, EprefixifyDefined,
-ImplicitRuntimeDeps, InheritAutotools, InheritDeprecated, IUseUndefined,
+EbuildPatches, EbuildQuotedA, EapiDefinition,
+ImplicitRuntimeDeps, InheritAutotools, InheritDeprecated, InheritEutils,
+InheritLibtool, InheritPrefix, InheritToolchainFuncs, InheritUser,
+IUseUndefined,
 EMakeParallelDisabled, EMakeParallelDisabledViaMAKEOPTS, NoAsNeeded,
 DeprecatedBindnowFlags, SrcUnpackPatches, WantAutoDefaultValue,
 SrcCompileEconf, Eapi3DeprecatedFuncs, NoOffsetWithHelpers,
diff --git a/pym/repoman/errors.py b/pym/repoman/errors.py
index 3209243..c515502 100644
--- a/pym/repoman/errors.py
+++ b/pym/repoman/errors.py
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -19,7 +19,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; EAPI_DEFINED_AFTER_INHERIT = 'EAPI defined after inherit on line: %d'
 NO_AS_NEEDED = 'Upstream asneeded linking bug (no-as-needed on line: %d)'
 PRESERVE_OLD_LIB = 'Upstream ABI change workaround on line: %d'
 BUILT_WITH_USE = 'built_with_use on line: %d'
-EPREFIXIFY_MISSING_INHERIT = "prefix.eclass is not inherited, but eprefixify is used on line: %d"
 NO_OFFSET_WITH_HELPERS = "Helper function is used with D, ROOT, ED, EROOT or EPREFIX on line :%d"
 SANDBOX_ADDPREDICT = 'Ebuild calls addpredict on line: %d'
 USEQ_ERROR = 'Ebuild calls deprecated useq function on line: %d'
&lt;/pre&gt;</description>
    <dc:creator>Mike Frysinger</dc:creator>
    <dc:date>2012-05-23T19:21:51</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3463">
    <title>Re: About some settings to auto-replace with dispatch-conf</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3463</link>
    <description>&lt;pre&gt;El mar, 15-05-2012 a las 21:43 +0200, Pacho Ramos escribió:

Just noticed the problem of current behavior after updating my chroot to
generate emul packages and needing to review 40 files with
dispatch-conf, all of them never touched and all of them needing to be
updated to new version
&lt;/pre&gt;</description>
    <dc:creator>Pacho Ramos</dc:creator>
    <dc:date>2012-05-15T19:46:49</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3462">
    <title>Re: About some settings to auto-replace with dispatch-conf</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3462</link>
    <description>&lt;pre&gt;El mar, 15-05-2012 a las 08:31 -0700, Zac Medico escribió:

Didn't know about that option, thanks for pointing it :D

About trying to enable it by default, I think would make sense per
previous exposed reasons (and I am sure there are more examples that
could show that behavior is better than keeping obsolete config files by
default)

&lt;/pre&gt;</description>
    <dc:creator>Pacho Ramos</dc:creator>
    <dc:date>2012-05-15T19:43:58</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3461">
    <title>Re: About some settings to auto-replace with dispatch-conf</title>
    <link>http://permalink.gmane.org/gmane.linux.gentoo.portage.devel/3461</link>
    <description>&lt;pre&gt;
FEATURES=config-protect-if-modified is what you really want. We could
probably enable it by default, but we should ask for comment on the
gentoo-dev mailing list before doing that.
&lt;/pre&gt;</description>
    <dc:creator>Zac Medico</dc:creator>
    <dc:date>2012-05-15T15:31:38</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.linux.gentoo.portage.devel">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.linux.gentoo.portage.devel</link>
  </textinput>
</rdf:RDF>

