Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-pathspec for openSUSE:Factory 
checked in at 2023-09-08 21:15:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pathspec (Old)
 and      /work/SRC/openSUSE:Factory/.python-pathspec.new.1766 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pathspec"

Fri Sep  8 21:15:05 2023 rev:15 rq:1109524 version:0.11.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pathspec/python-pathspec.changes  
2023-04-22 22:00:35.101261139 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-pathspec.new.1766/python-pathspec.changes    
    2023-09-08 21:15:26.462256160 +0200
@@ -1,0 +2,11 @@
+Thu Sep  7 11:27:28 UTC 2023 - Dirk Müller <[email protected]>
+
+- update to 0.11.2:
+  * `Issue #80`_: match_files with negated path spec.
+    `pathspec.PathSpec.match_*()` now have a `negate` parameter
+    to make using *.gitignore* logic easier and more efficient.
+  * Add edge case: patterns that end with an escaped
+    space
+  * Negate with caret symbol as with the exclamation mark.
+
+-------------------------------------------------------------------

Old:
----
  pathspec-0.11.1.tar.gz

New:
----
  pathspec-0.11.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-pathspec.spec ++++++
--- /var/tmp/diff_new_pack.4dOYMY/_old  2023-09-08 21:15:27.614297334 +0200
+++ /var/tmp/diff_new_pack.4dOYMY/_new  2023-09-08 21:15:27.618297477 +0200
@@ -16,10 +16,9 @@
 #
 
 
-%{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %{?sle15_python_module_pythons}
 Name:           python-pathspec
-Version:        0.11.1
+Version:        0.11.2
 Release:        0
 Summary:        Utility library for gitignore style pattern matching of file 
paths
 License:        MPL-2.0

++++++ pathspec-0.11.1.tar.gz -> pathspec-0.11.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pathspec-0.11.1/CHANGES.rst 
new/pathspec-0.11.2/CHANGES.rst
--- old/pathspec-0.11.1/CHANGES.rst     2023-03-15 01:50:39.560463400 +0100
+++ new/pathspec-0.11.2/CHANGES.rst     2023-07-29 03:03:00.395073700 +0200
@@ -3,6 +3,25 @@
 ==============
 
 
+0.11.2 (2023-07-28)
+-------------------
+
+New features:
+
+- `Issue #80`_: match_files with negated path spec. 
`pathspec.PathSpec.match_*()` now have a `negate` parameter to make using 
*.gitignore* logic easier and more efficient.
+
+Bug fixes:
+
+- `Pull #76`_: Add edge case: patterns that end with an escaped space
+- `Issue #77`_/`Pull #78`_: Negate with caret symbol as with the exclamation 
mark.
+
+
+.. _`Pull #76`: https://github.com/cpburnz/python-pathspec/pull/76
+.. _`Issue #77`: https://github.com/cpburnz/python-pathspec/issues/77
+.. _`Pull #78`: https://github.com/cpburnz/python-pathspec/pull/78/
+.. _`Issue #80`: https://github.com/cpburnz/python-pathspec/issues/80
+
+
 0.11.1 (2023-03-14)
 -------------------
 
@@ -15,11 +34,11 @@
 - `Pull #75`_: Fix partially unknown PathLike type.
 - Convert `os.PathLike` to a string properly using `os.fspath`.
 
+
 .. _`Issue #74`: https://github.com/cpburnz/python-pathspec/issues/74
 .. _`Pull #75`: https://github.com/cpburnz/python-pathspec/pull/75
 
 
-
 0.11.0 (2023-01-24)
 -------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pathspec-0.11.1/PKG-INFO new/pathspec-0.11.2/PKG-INFO
--- old/pathspec-0.11.1/PKG-INFO        1970-01-01 01:00:00.000000000 +0100
+++ new/pathspec-0.11.2/PKG-INFO        1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: pathspec
-Version: 0.11.1
+Version: 0.11.2
 Summary: Utility library for gitignore style pattern matching of file paths.
 Author-email: "Caleb P. Burns" <[email protected]>
 Requires-Python: >=3.7
@@ -196,6 +196,25 @@
 ==============
 
 
+0.11.2 (2023-07-28)
+-------------------
+
+New features:
+
+- `Issue #80`_: match_files with negated path spec. 
`pathspec.PathSpec.match_*()` now have a `negate` parameter to make using 
*.gitignore* logic easier and more efficient.
+
+Bug fixes:
+
+- `Pull #76`_: Add edge case: patterns that end with an escaped space
+- `Issue #77`_/`Pull #78`_: Negate with caret symbol as with the exclamation 
mark.
+
+
+.. _`Pull #76`: https://github.com/cpburnz/python-pathspec/pull/76
+.. _`Issue #77`: https://github.com/cpburnz/python-pathspec/issues/77
+.. _`Pull #78`: https://github.com/cpburnz/python-pathspec/pull/78/
+.. _`Issue #80`: https://github.com/cpburnz/python-pathspec/issues/80
+
+
 0.11.1 (2023-03-14)
 -------------------
 
@@ -208,11 +227,11 @@
 - `Pull #75`_: Fix partially unknown PathLike type.
 - Convert `os.PathLike` to a string properly using `os.fspath`.
 
+
 .. _`Issue #74`: https://github.com/cpburnz/python-pathspec/issues/74
 .. _`Pull #75`: https://github.com/cpburnz/python-pathspec/pull/75
 
 
-
 0.11.0 (2023-01-24)
 -------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pathspec-0.11.1/README-dist.rst 
new/pathspec-0.11.2/README-dist.rst
--- old/pathspec-0.11.1/README-dist.rst 2023-03-15 01:56:33.877085700 +0100
+++ new/pathspec-0.11.2/README-dist.rst 2023-07-29 03:04:59.537180200 +0200
@@ -170,6 +170,25 @@
 ==============
 
 
+0.11.2 (2023-07-28)
+-------------------
+
+New features:
+
+- `Issue #80`_: match_files with negated path spec. 
`pathspec.PathSpec.match_*()` now have a `negate` parameter to make using 
*.gitignore* logic easier and more efficient.
+
+Bug fixes:
+
+- `Pull #76`_: Add edge case: patterns that end with an escaped space
+- `Issue #77`_/`Pull #78`_: Negate with caret symbol as with the exclamation 
mark.
+
+
+.. _`Pull #76`: https://github.com/cpburnz/python-pathspec/pull/76
+.. _`Issue #77`: https://github.com/cpburnz/python-pathspec/issues/77
+.. _`Pull #78`: https://github.com/cpburnz/python-pathspec/pull/78/
+.. _`Issue #80`: https://github.com/cpburnz/python-pathspec/issues/80
+
+
 0.11.1 (2023-03-14)
 -------------------
 
@@ -182,11 +201,11 @@
 - `Pull #75`_: Fix partially unknown PathLike type.
 - Convert `os.PathLike` to a string properly using `os.fspath`.
 
+
 .. _`Issue #74`: https://github.com/cpburnz/python-pathspec/issues/74
 .. _`Pull #75`: https://github.com/cpburnz/python-pathspec/pull/75
 
 
-
 0.11.0 (2023-01-24)
 -------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pathspec-0.11.1/pathspec/_meta.py 
new/pathspec-0.11.2/pathspec/_meta.py
--- old/pathspec-0.11.1/pathspec/_meta.py       2023-03-15 01:52:16.504086300 
+0100
+++ new/pathspec-0.11.2/pathspec/_meta.py       2023-07-29 03:02:51.814925000 
+0200
@@ -50,6 +50,8 @@
        "Avasam <https://github.com/Avasam>",
        "yschroeder <https://github.com/yschroeder>",
        "axesider <https://github.com/axesider>",
+       "tomruk <https://github.com/tomruk>",
+       "oprypin <https://github.com/oprypin>",
 ]
 __license__ = "MPL 2.0"
-__version__ = "0.11.1"
+__version__ = "0.11.2"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pathspec-0.11.1/pathspec/pathspec.py 
new/pathspec-0.11.2/pathspec/pathspec.py
--- old/pathspec-0.11.1/pathspec/pathspec.py    2023-02-23 01:35:42.683848400 
+0100
+++ new/pathspec-0.11.2/pathspec/pathspec.py    2023-07-29 02:42:53.331837200 
+0200
@@ -1,15 +1,11 @@
 """
-This module provides an object oriented interface for pattern matching
-of files.
+This module provides an object oriented interface for pattern matching of 
files.
 """
 
-import sys
 from collections.abc import (
        Collection as CollectionType)
 from itertools import (
        zip_longest)
-from os import (
-       PathLike)
 from typing import (
        AnyStr,
        Callable,
@@ -107,15 +103,15 @@
                """
                Compiles the pattern lines.
 
-               *pattern_factory* can be either the name of a registered pattern
-               factory (:class:`str`), or a :class:`~collections.abc.Callable` 
used
-               to compile patterns. It must accept an uncompiled pattern 
(:class:`str`)
-               and return the compiled pattern (:class:`.Pattern`).
-
-               *lines* (:class:`~collections.abc.Iterable`) yields each 
uncompiled
-               pattern (:class:`str`). This simply has to yield each line so 
it can
-               be a :class:`io.TextIOBase` (e.g., from :func:`open` or
-               :class:`io.StringIO`) or the result from :meth:`str.splitlines`.
+               *pattern_factory* can be either the name of a registered 
pattern factory
+               (:class:`str`), or a :class:`~collections.abc.Callable` used to 
compile
+               patterns. It must accept an uncompiled pattern (:class:`str`) 
and return the
+               compiled pattern (:class:`.Pattern`).
+
+               *lines* (:class:`~collections.abc.Iterable`) yields each 
uncompiled pattern
+               (:class:`str`). This simply has to yield each line so that it 
can be a
+               :class:`io.TextIOBase` (e.g., from :func:`open` or 
:class:`io.StringIO`) or
+               the result from :meth:`str.splitlines`.
 
                Returns the :class:`PathSpec` instance.
                """
@@ -135,6 +131,8 @@
                self,
                entries: Iterable[TreeEntry],
                separators: Optional[Collection[str]] = None,
+               *,
+               negate: Optional[bool] = None,
        ) -> Iterator[TreeEntry]:
                """
                Matches the entries to this path-spec.
@@ -142,10 +140,14 @@
                *entries* (:class:`~collections.abc.Iterable` of 
:class:`~util.TreeEntry`)
                contains the entries to be matched against :attr:`self.patterns 
<PathSpec.patterns>`.
 
-               *separators* (:class:`~collections.abc.Collection` of 
:class:`str`;
-               or :data:`None`) optionally contains the path separators to
-               normalize. See :func:`~pathspec.util.normalize_file` for more
-               information.
+               *separators* (:class:`~collections.abc.Collection` of 
:class:`str`; or
+               :data:`None`) optionally contains the path separators to 
normalize. See
+               :func:`~pathspec.util.normalize_file` for more information.
+
+               *negate* (:class:`bool` or :data:`None`) is whether to negate 
the match
+               results of the patterns. If :data:`True`, a pattern matching a 
file will
+               exclude the file rather than include it. Default is 
:data:`None` for
+               :data:`False`.
 
                Returns the matched entries (:class:`~collections.abc.Iterator` 
of
                :class:`~util.TreeEntry`).
@@ -156,12 +158,17 @@
                use_patterns = _filter_patterns(self.patterns)
                for entry in entries:
                        norm_file = normalize_file(entry.path, separators)
-                       if self._match_file(use_patterns, norm_file):
+                       is_match = self._match_file(use_patterns, norm_file)
+
+                       if negate:
+                               is_match = not is_match
+
+                       if is_match:
                                yield entry
 
-       # Match files using the `match_file()` utility function. Subclasses
-       # may override this method as an instance method. It does not have to
-       # be a static method.
+       # Match files using the `match_file()` utility function. Subclasses may
+       # override this method as an instance method. It does not have to be a 
static
+       # method.
        _match_file = staticmethod(match_file)
 
        def match_file(
@@ -188,6 +195,8 @@
                self,
                files: Iterable[StrPath],
                separators: Optional[Collection[str]] = None,
+               *,
+               negate: Optional[bool] = None,
        ) -> Iterator[StrPath]:
                """
                Matches the files to this path-spec.
@@ -196,10 +205,14 @@
                :class:`os.PathLike[str]`) contains the file paths to be 
matched against
                :attr:`self.patterns <PathSpec.patterns>`.
 
-               *separators* (:class:`~collections.abc.Collection` of 
:class:`str`;
-               or :data:`None`) optionally contains the path separators to
-               normalize. See :func:`~pathspec.util.normalize_file` for more
-               information.
+               *separators* (:class:`~collections.abc.Collection` of 
:class:`str`; or
+               :data:`None`) optionally contains the path separators to 
normalize. See
+               :func:`~pathspec.util.normalize_file` for more information.
+
+               *negate* (:class:`bool` or :data:`None`) is whether to negate 
the match
+               results of the patterns. If :data:`True`, a pattern matching a 
file will
+               exclude the file rather than include it. Default is 
:data:`None` for
+               :data:`False`.
 
                Returns the matched files (:class:`~collections.abc.Iterator` of
                :class:`str` or :class:`os.PathLike[str]`).
@@ -210,7 +223,12 @@
                use_patterns = _filter_patterns(self.patterns)
                for orig_file in files:
                        norm_file = normalize_file(orig_file, separators)
-                       if self._match_file(use_patterns, norm_file):
+                       is_match = self._match_file(use_patterns, norm_file)
+
+                       if negate:
+                               is_match = not is_match
+
+                       if is_match:
                                yield orig_file
 
        def match_tree_entries(
@@ -218,55 +236,69 @@
                root: StrPath,
                on_error: Optional[Callable] = None,
                follow_links: Optional[bool] = None,
+               *,
+               negate: Optional[bool] = None,
        ) -> Iterator[TreeEntry]:
                """
                Walks the specified root path for all files and matches them to 
this
                path-spec.
 
-               *root* (:class:`str` or :class:`os.PathLike[str]`) is the root 
directory
-               to search.
+               *root* (:class:`str` or :class:`os.PathLike[str]`) is the root 
directory to
+               search.
 
-               *on_error* (:class:`~collections.abc.Callable` or :data:`None`)
-               optionally is the error handler for file-system exceptions. See
+               *on_error* (:class:`~collections.abc.Callable` or :data:`None`) 
optionally
+               is the error handler for file-system exceptions. See
                :func:`~pathspec.util.iter_tree_entries` for more information.
 
-               *follow_links* (:class:`bool` or :data:`None`) optionally is 
whether
-               to walk symbolic links that resolve to directories. See
+               *follow_links* (:class:`bool` or :data:`None`) optionally is 
whether to walk
+               symbolic links that resolve to directories. See
                :func:`~pathspec.util.iter_tree_files` for more information.
 
+               *negate* (:class:`bool` or :data:`None`) is whether to negate 
the match
+               results of the patterns. If :data:`True`, a pattern matching a 
file will
+               exclude the file rather than include it. Default is 
:data:`None` for
+               :data:`False`.
+
                Returns the matched files (:class:`~collections.abc.Iterator` of
                :class:`.TreeEntry`).
                """
                entries = util.iter_tree_entries(root, on_error=on_error, 
follow_links=follow_links)
-               yield from self.match_entries(entries)
+               yield from self.match_entries(entries, negate=negate)
 
        def match_tree_files(
                self,
                root: StrPath,
                on_error: Optional[Callable] = None,
                follow_links: Optional[bool] = None,
+               *,
+               negate: Optional[bool] = None,
        ) -> Iterator[str]:
                """
                Walks the specified root path for all files and matches them to 
this
                path-spec.
 
-               *root* (:class:`str` or :class:`os.PathLike[str]`) is the root 
directory
-               to search for files.
+               *root* (:class:`str` or :class:`os.PathLike[str]`) is the root 
directory to
+               search for files.
 
-               *on_error* (:class:`~collections.abc.Callable` or :data:`None`)
-               optionally is the error handler for file-system exceptions. See
+               *on_error* (:class:`~collections.abc.Callable` or :data:`None`) 
optionally
+               is the error handler for file-system exceptions. See
                :func:`~pathspec.util.iter_tree_files` for more information.
 
-               *follow_links* (:class:`bool` or :data:`None`) optionally is 
whether
-               to walk symbolic links that resolve to directories. See
+               *follow_links* (:class:`bool` or :data:`None`) optionally is 
whether to walk
+               symbolic links that resolve to directories. See
                :func:`~pathspec.util.iter_tree_files` for more information.
 
+               *negate* (:class:`bool` or :data:`None`) is whether to negate 
the match
+               results of the patterns. If :data:`True`, a pattern matching a 
file will
+               exclude the file rather than include it. Default is 
:data:`None` for
+               :data:`False`.
+
                Returns the matched files (:class:`~collections.abc.Iterable` of
                :class:`str`).
                """
                files = util.iter_tree_files(root, on_error=on_error, 
follow_links=follow_links)
-               yield from self.match_files(files)
+               yield from self.match_files(files, negate=negate)
 
-       # Alias `match_tree_files()` as `match_tree()` for backward
-       # compatibility before v0.3.2.
+       # Alias `match_tree_files()` as `match_tree()` for backward 
compatibility
+       # before v0.3.2.
        match_tree = match_tree_files
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pathspec-0.11.1/pathspec/patterns/gitwildmatch.py 
new/pathspec-0.11.2/pathspec/patterns/gitwildmatch.py
--- old/pathspec-0.11.1/pathspec/patterns/gitwildmatch.py       2022-11-12 
17:34:39.166754000 +0100
+++ new/pathspec-0.11.2/pathspec/patterns/gitwildmatch.py       2023-04-25 
01:23:52.719785500 +0200
@@ -68,7 +68,14 @@
                        raise TypeError(f"pattern:{pattern!r} is not a unicode 
or byte string.")
 
                original_pattern = pattern
-               pattern = pattern.strip()
+
+               if pattern.endswith('\\ '):
+                       # EDGE CASE: Spaces can be escaped with backslash.
+                       # If a pattern that ends with backslash followed by a 
space,
+                       # only strip from left.
+                       pattern = pattern.lstrip()
+               else:
+                       pattern = pattern.strip()
 
                if pattern.startswith('#'):
                        # A pattern starting with a hash ('#') serves as a 
comment
@@ -283,13 +290,16 @@
                                # - "[]-]" matches ']' and '-'.
                                # - "[!]a-]" matches any character except ']', 
'a' and '-'.
                                j = i
-                               # Pass brack expression negation.
-                               if j < end and pattern[j] == '!':
+        
+                               # Pass bracket expression negation.
+                               if j < end and (pattern[j] == '!' or pattern[j] 
== '^'):
                                        j += 1
+          
                                # Pass first closing bracket if it is at the 
beginning of the
                                # expression.
                                if j < end and pattern[j] == ']':
                                        j += 1
+          
                                # Find closing bracket. Stop once we reach the 
end or find it.
                                while j < end and pattern[j] != ']':
                                        j += 1
@@ -306,16 +316,17 @@
                                        expr = '['
 
                                        if pattern[i] == '!':
-                                               # Braket expression needs to be 
negated.
+                                               # Bracket expression needs to 
be negated.
                                                expr += '^'
                                                i += 1
                                        elif pattern[i] == '^':
                                                # POSIX declares that the regex 
bracket expression negation
                                                # "[^...]" is undefined in a 
glob pattern. Python's
                                                # `fnmatch.translate()` escapes 
the caret ('^') as a
-                                               # literal. To maintain 
consistency with undefined behavior,
-                                               # I am escaping the '^' as well.
-                                               expr += '\\^'
+                                               # literal. Git supports the 
using a caret for negation.
+                                               # Maintain consistency with Git 
because that is the expected
+                                               # behavior.
+                                               expr += '^'
                                                i += 1
 
                                        # Build regex bracket expression. 
Escape slashes so they are
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pathspec-0.11.1/tests/test_gitwildmatch.py 
new/pathspec-0.11.2/tests/test_gitwildmatch.py
--- old/pathspec-0.11.1/tests/test_gitwildmatch.py      2022-11-15 
14:52:43.076757700 +0100
+++ new/pathspec-0.11.2/tests/test_gitwildmatch.py      2023-04-25 
01:23:52.723118800 +0200
@@ -773,3 +773,41 @@
                self.assertEqual(results, {
                        'anydir/file.txt',
                })
+
+       def test_13_issue_77_regex(self):
+               """
+               Test the resulting regex for regex bracket expression negation.
+               """
+               regex, include = GitWildMatchPattern.pattern_to_regex('a[^b]c')
+               self.assertTrue(include)
+
+               equiv_regex, include = 
GitWildMatchPattern.pattern_to_regex('a[!b]c')
+               self.assertTrue(include)
+
+               self.assertEqual(regex, equiv_regex)
+
+       def test_13_negate_with_caret(self):
+               """
+               Test negation using the caret symbol (^)
+               """
+               pattern = GitWildMatchPattern("a[^gy]c")
+               results = set(filter(pattern.match_file, [
+                       "agc",
+                       "ayc",
+                       "abc",
+                       "adc",
+               ]))
+               self.assertEqual(results, {"abc", "adc"})
+
+       def test_13_negate_with_exclamation_mark(self):
+               """
+               Test negation using the exclamation mark (!)
+               """
+               pattern = GitWildMatchPattern("a[!gy]c")
+               results = set(filter(pattern.match_file, [
+                       "agc",
+                       "ayc",
+                       "abc",
+                       "adc",
+               ]))
+               self.assertEqual(results, {"abc", "adc"})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pathspec-0.11.1/tests/test_pathspec.py 
new/pathspec-0.11.2/tests/test_pathspec.py
--- old/pathspec-0.11.1/tests/test_pathspec.py  2022-09-08 02:20:27.321583300 
+0200
+++ new/pathspec-0.11.2/tests/test_pathspec.py  2023-07-29 02:45:28.087427000 
+0200
@@ -15,6 +15,7 @@
        PathSpec)
 from pathspec.util import (
        iter_tree_entries)
+from pathspec.patterns.gitwildmatch import GitWildMatchPatternError
 from tests.util import (
        make_dirs,
        make_files,
@@ -119,6 +120,32 @@
                        './src/test2/c/c.txt',
                })
 
+       def test_01_empty_path(self):
+               """
+               Tests that patterns that end with an escaped space will be 
treated properly.
+               """
+               spec = PathSpec.from_lines('gitwildmatch', [
+                       '\\ ',
+                       'abc\\ '
+               ])
+               test_files = [
+                       ' ',
+                       '  ',
+                       'abc ',
+                       'somefile',
+               ]
+               results = list(filter(spec.match_file, test_files))
+               self.assertEqual(results, [
+                       ' ',
+                       'abc '
+               ])
+
+               # An escape with double spaces is invalid.
+               # Disallow it. Better to be safe than sorry.
+               self.assertRaises(GitWildMatchPatternError, lambda: 
PathSpec.from_lines('gitwildmatch', [
+                       '\\  '
+               ]))
+
        def test_01_match_files(self):
                """
                Tests that matching files one at a time yields the same results 
as
@@ -552,3 +579,53 @@
                        'important/d.log',
                        'important/e.txt',
                })
+
+       def test_09_issue_80_a(self):
+               """
+               Test negating patterns.
+               """
+               spec = PathSpec.from_lines('gitwildmatch', [
+                       'build',
+                       '*.log',
+                       '.*',
+                       '!.gitignore',
+               ])
+               files = {
+                       '.c-tmp',
+                       '.gitignore',
+                       'a.log',
+                       'b.txt',
+                       'build/d.log',
+                       'build/trace.bin',
+                       'trace.c',
+               }
+               keeps = set(spec.match_files(files, negate=True))
+               self.assertEqual(keeps, {
+                       '.gitignore',
+                       'b.txt',
+                       'trace.c',
+               })
+
+       def test_09_issue_80_b(self):
+               """
+               Test negating patterns.
+               """
+               spec = PathSpec.from_lines('gitwildmatch', [
+                       'build',
+                       '*.log',
+                       '.*',
+                       '!.gitignore',
+               ])
+               files = {
+                       '.c-tmp',
+                       '.gitignore',
+                       'a.log',
+                       'b.txt',
+                       'build/d.log',
+                       'build/trace.bin',
+                       'trace.c',
+               }
+               keeps = set(spec.match_files(files, negate=True))
+               ignores = set(spec.match_files(files))
+               self.assertEqual(files - ignores, keeps)
+               self.assertEqual(files - keeps, ignores)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pathspec-0.11.1/tox.ini new/pathspec-0.11.2/tox.ini
--- old/pathspec-0.11.1/tox.ini 2022-09-08 00:17:34.996991600 +0200
+++ new/pathspec-0.11.2/tox.ini 2023-07-29 02:20:45.308886800 +0200
@@ -1,5 +1,5 @@
 [tox]
-envlist = py37, py38, py39, py310, py311, pypy3
+envlist = py37, py38, py39, py310, py311, py312, pypy3
 isolated_build = True
 
 [testenv]

Reply via email to