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.


-- 
Best regards,
Michał Górny (by phone)

Reply via email to