On 06/12/2016 02:31 AM, Michał Górny wrote: > Dnia 12 czerwca 2016 11:20:36 CEST, Zac Medico <zmed...@gentoo.org> > napisał(a): >> On 05/21/2016 11:56 PM, Michał Górny wrote: >>> Allow INSTALL_MASK patterns to start with '-' to indicate that >>> a specific match is to be excluded from being masked. In this case, >>> the last matching pattern determines whether the file is actually >>> filtered out or kept. >>> --- >>> pym/portage/dbapi/vartree.py | 10 ++++++---- >>> 1 file changed, 6 insertions(+), 4 deletions(-) >>> >>> diff --git a/pym/portage/dbapi/vartree.py >> b/pym/portage/dbapi/vartree.py >>> index 8e5ac43..d02d850 100644 >>> --- a/pym/portage/dbapi/vartree.py >>> +++ b/pym/portage/dbapi/vartree.py >>> @@ -3690,19 +3690,21 @@ class dblink(object): >>> def _is_install_masked(self, relative_path): >>> ret = False >>> for pattern in self.settings.install_mask: >>> + # if pattern starts with -, possibly exclude this path >>> + pat_res = not pattern.startswith('-') >>> + if not pat_res: >>> + pattern = pattern[1:] >>> # absolute path pattern >>> if pattern.startswith('/'): >>> # match either exact path or one of parent dirs >>> # the latter is done via matching pattern/* >>> if (fnmatch.fnmatch(relative_path, pattern[1:]) >>> or >>> fnmatch.fnmatch(relative_path, pattern[1:] + '/*')): >>> - ret = True >>> - break >>> + ret = pat_res >>> # filename >>> else: >>> if >>> fnmatch.fnmatch(os.path.basename(relative_path), pattern): >>> - ret = True >>> - break >>> + ret = pat_res >>> return ret >>> >>> def treewalk(self, srcroot, destroot, inforoot, myebuild, >> cleanup=0, >>> >> >> In order to implement this with pre-compiled patterns, we can use a >> separate regular expression to represent all of the exclusions. > > That won't work since exclusive and inclusive patterns can be stacked, and > for this to work they are applied in order. > > E.g. /usr/foo -/usr/foo/bar /usr/foo/bar/baz > > Should remove all foo subdirectories except for bar, and also baz inside bar.
Hmm, I suppose there could be an optimized implementation to handle INSTALL_MASK settings where there are no such ordering constraints. -- Thanks, Zac