On 06/12/2016 03:03 AM, Michał Górny wrote:
> Dnia 12 czerwca 2016 11:43:35 CEST, Zac Medico <zmed...@gentoo.org> 
> napisał(a):
>> 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.
> 
> Is this really worth the effort? I'm using the patch for a while and I/O's 
> the bottleneck, not CPU. If you really insist on optimizing this, i guess we 
> could precompile all patterns separately.

Since it's not going to make any difference when INSTALL_MASK is not
used, I guess it's fine to leave it unoptimized for now.
-- 
Thanks,
Zac

Reply via email to