Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-pytest-xprocess for 
openSUSE:Factory checked in at 2023-05-09 13:06:25
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pytest-xprocess (Old)
 and      /work/SRC/openSUSE:Factory/.python-pytest-xprocess.new.1533 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pytest-xprocess"

Tue May  9 13:06:25 2023 rev:4 rq:1084894 version:0.22.2

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-pytest-xprocess/python-pytest-xprocess.changes
    2023-04-25 16:53:25.302153431 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-pytest-xprocess.new.1533/python-pytest-xprocess.changes
  2023-05-09 13:06:34.700749751 +0200
@@ -1,0 +2,15 @@
+Thu May  4 22:29:31 UTC 2023 - Dirk Müller <dmuel...@suse.com>
+
+- update to 0.22.2:
+  * Python 3.10 is now officially supported
+  * `surrogateescape` will now be used as error handling strategy
+    for encode/decode operations.
+  * Make log files persistency, added in `0.21.0`, optional,
+    defaulting to True. The previous logging behavior (prior to
+    `0.21.0`) can be enabled by setting `persist_logs` flag to
+    `False` when calling `XProcess.ensure`.
+  * Fix resource warnings due to leaked internal file handles
+  * Ignore zombie processes which are erroneously considered
+    alive with python 3.11
+
+-------------------------------------------------------------------

Old:
----
  pytest-xprocess-0.21.0.tar.gz

New:
----
  pytest-xprocess-0.22.2.tar.gz

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

Other differences:
------------------
++++++ python-pytest-xprocess.spec ++++++
--- /var/tmp/diff_new_pack.zb1jpT/_old  2023-05-09 13:06:35.360753679 +0200
+++ /var/tmp/diff_new_pack.zb1jpT/_new  2023-05-09 13:06:35.364753703 +0200
@@ -20,7 +20,7 @@
 %define skip_python2 1
 %{?sle15_python_module_pythons}
 Name:           python-pytest-xprocess
-Version:        0.21.0
+Version:        0.22.2
 Release:        0
 Summary:        A pytest plugin for managing processes across test runs
 License:        MIT

++++++ pytest-xprocess-0.21.0.tar.gz -> pytest-xprocess-0.22.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/.github/workflows/main.yml 
new/pytest-xprocess-0.22.2/.github/workflows/main.yml
--- old/pytest-xprocess-0.21.0/.github/workflows/main.yml       2022-08-15 
11:38:43.000000000 +0200
+++ new/pytest-xprocess-0.22.2/.github/workflows/main.yml       2023-01-05 
17:03:47.000000000 +0100
@@ -6,9 +6,11 @@
     strategy:
       fail-fast: false
       matrix:
-        python: ["3.7", "3.8", "3.9"]
+        python: ["3.7", "3.8", "3.9", "3.10"]
         os: [ubuntu-latest, windows-latest, macos-latest]
         include:
+          - python: "3.10"
+            tox_env: "py310"
           - python: "3.7"
             tox_env: "py37"
           - python: "3.8"
@@ -44,24 +46,24 @@
       run: |
         tox -e linting
   deploy:
-    if: github.event_name == 'push' && startsWith(github.event.ref, 
'refs/tags')
-    runs-on: ubuntu-latest
-    needs: [build, linting]
-    steps:
-    - uses: actions/checkout@v2
-    - name: Set up Python
-      uses: actions/setup-python@v2
-      with:
-        python-version: "3.7"
-    - name: Install wheel
-      run: |
-        python -m pip install --upgrade pip setuptools
-        pip install wheel
-    - name: Build package
-      run: |
-        python setup.py sdist bdist_wheel
-    - name: Publish package to PyPI
-      uses: pypa/gh-action-pypi-publish@master
-      with:
-        user: __token__
-        password: ${{ secrets.pypi_token }}
+      if: github.event_name == 'push' && startsWith(github.event.ref, 
'refs/tags')
+      runs-on: ubuntu-latest
+      needs: [build, linting]
+      steps:
+      - uses: actions/checkout@v2
+      - name: Set up Python
+        uses: actions/setup-python@v2
+        with:
+          python-version: "3.7"
+      - name: Install wheel
+        run: |
+          python -m pip install --upgrade pip setuptools
+          pip install wheel
+      - name: Build package
+        run: |
+          python setup.py sdist bdist_wheel
+      - name: Publish package to PyPI
+        uses: pypa/gh-action-pypi-publish@master
+        with:
+          user: __token__
+          password: ${{ secrets.pypi_token }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/.pre-commit-config.yaml 
new/pytest-xprocess-0.22.2/.pre-commit-config.yaml
--- old/pytest-xprocess-0.21.0/.pre-commit-config.yaml  2022-11-27 
16:45:01.000000000 +0100
+++ new/pytest-xprocess-0.22.2/.pre-commit-config.yaml  2022-12-31 
17:53:34.000000000 +0100
@@ -1,24 +1,24 @@
 repos:
   - repo: https://github.com/asottile/pyupgrade
-    rev: v3.1.0
+    rev: v3.3.1
     hooks:
       - id: pyupgrade
         args: ["--py37-plus"]
   - repo: https://github.com/asottile/reorder_python_imports
-    rev: v3.8.4
+    rev: v3.9.0
     hooks:
       - id: reorder-python-imports
   - repo: https://github.com/psf/black
-    rev: 22.10.0
+    rev: 22.12.0
     hooks:
       - id: black
   - repo: https://github.com/PyCQA/flake8
-    rev: 5.0.4
+    rev: 6.0.0
     hooks:
       - id: flake8
         additional_dependencies: [flake8-bugbear]
   - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.3.0
+    rev: v4.4.0
     hooks:
       - id: check-byte-order-marker
       - id: trailing-whitespace
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/CHANGELOG.rst 
new/pytest-xprocess-0.22.2/CHANGELOG.rst
--- old/pytest-xprocess-0.21.0/CHANGELOG.rst    2022-11-27 18:03:35.000000000 
+0100
+++ new/pytest-xprocess-0.22.2/CHANGELOG.rst    2023-01-05 17:03:54.000000000 
+0100
@@ -1,3 +1,13 @@
+0.22.2 (2023-01-05)
+-------------------
+
+- Python 3.10 is now officially supported
+- `surrogateescape` will now be used as error handling strategy for 
encode/decode operations. (`#127 
<https://github.com/pytest-dev/pytest-xprocess/pull/127>`)
+- Make log files persistency, added in `0.21.0`, optional, defaulting to True. 
The previous logging behavior (prior to `0.21.0`) can be enabled by setting 
`persist_logs` flag to `False` when calling `XProcess.ensure`. (`#122 
<https://github.com/pytest-dev/pytest-xprocess/pull/122>`_)
+- Fix resource warnings due to leaked internal file handles (`#121 
<https://github.com/pytest-dev/pytest-xprocess/pull/121>`_)
+- Ignore zombie processes which are erroneously considered alive with python 
3.11
+  (`#117 <https://github.com/pytest-dev/pytest-xprocess/pull/118>`_)
+
 0.21.0 (2022-11-27)
 -------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/PKG-INFO 
new/pytest-xprocess-0.22.2/PKG-INFO
--- old/pytest-xprocess-0.21.0/PKG-INFO 2022-11-27 18:20:27.195870900 +0100
+++ new/pytest-xprocess-0.22.2/PKG-INFO 2023-01-05 17:23:37.206977400 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: pytest-xprocess
-Version: 0.21.0
+Version: 0.22.2
 Summary: A pytest plugin for managing processes across test runs.
 Home-page: https://github.com/pytest-dev/pytest-xprocess/
 Author: Holger Krekel
@@ -14,10 +14,12 @@
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
 Classifier: Topic :: Software Development :: Testing
 Classifier: Topic :: Software Development :: Libraries
 Classifier: Topic :: Utilities
 Requires-Python: >=3.7
+Description-Content-Type: text/x-rst
 License-File: LICENSE
 
 pytest-xprocess
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/RELEASING.rst 
new/pytest-xprocess-0.22.2/RELEASING.rst
--- old/pytest-xprocess-0.21.0/RELEASING.rst    2022-08-15 11:33:20.000000000 
+0200
+++ new/pytest-xprocess-0.22.2/RELEASING.rst    2023-01-04 20:01:58.000000000 
+0100
@@ -24,9 +24,9 @@
 
     $ pip install tox
 
-#. Update the necessary files with::
+#. Run the test suite and ensure everything passes::
 
-    $ tox -e release -- X.Y.Z
+    $ tox
 
 #. Commit and push the branch for review.
 
@@ -36,6 +36,4 @@
     $ git tag $VERSION release-$VERSION
     $ git push g...@github.com:pytest-dev/pytest-xprocess.git $VERSION
 
-    That will build the package and publish it on ``PyPI`` automatically.
-
 #. Merge ``release-X.Y.Z`` branch into master.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/pyproject.toml 
new/pytest-xprocess-0.22.2/pyproject.toml
--- old/pytest-xprocess-0.21.0/pyproject.toml   1970-01-01 01:00:00.000000000 
+0100
+++ new/pytest-xprocess-0.22.2/pyproject.toml   2023-01-05 16:26:55.000000000 
+0100
@@ -0,0 +1,7 @@
+[build-system]
+requires = [
+  "setuptools>=45.0",
+  "setuptools-scm[toml]>=6.2.3",
+]
+
+[tool.setuptools_scm]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pytest-xprocess-0.21.0/pytest_xprocess.egg-info/PKG-INFO 
new/pytest-xprocess-0.22.2/pytest_xprocess.egg-info/PKG-INFO
--- old/pytest-xprocess-0.21.0/pytest_xprocess.egg-info/PKG-INFO        
2022-11-27 18:20:27.000000000 +0100
+++ new/pytest-xprocess-0.22.2/pytest_xprocess.egg-info/PKG-INFO        
2023-01-05 17:23:37.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: pytest-xprocess
-Version: 0.21.0
+Version: 0.22.2
 Summary: A pytest plugin for managing processes across test runs.
 Home-page: https://github.com/pytest-dev/pytest-xprocess/
 Author: Holger Krekel
@@ -14,10 +14,12 @@
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
 Classifier: Topic :: Software Development :: Testing
 Classifier: Topic :: Software Development :: Libraries
 Classifier: Topic :: Utilities
 Requires-Python: >=3.7
+Description-Content-Type: text/x-rst
 License-File: LICENSE
 
 pytest-xprocess
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pytest-xprocess-0.21.0/pytest_xprocess.egg-info/SOURCES.txt 
new/pytest-xprocess-0.22.2/pytest_xprocess.egg-info/SOURCES.txt
--- old/pytest-xprocess-0.21.0/pytest_xprocess.egg-info/SOURCES.txt     
2022-11-27 18:20:27.000000000 +0100
+++ new/pytest-xprocess-0.22.2/pytest_xprocess.egg-info/SOURCES.txt     
2023-01-05 17:23:37.000000000 +0100
@@ -7,6 +7,7 @@
 MANIFEST.in
 README.rst
 RELEASING.rst
+pyproject.toml
 setup.cfg
 setup.py
 tox.ini
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/setup.cfg 
new/pytest-xprocess-0.22.2/setup.cfg
--- old/pytest-xprocess-0.21.0/setup.cfg        2022-11-27 18:20:27.196267400 
+0100
+++ new/pytest-xprocess-0.22.2/setup.cfg        2023-01-05 17:23:37.207497600 
+0100
@@ -6,6 +6,7 @@
 license_files = LICENSE
 url = https://github.com/pytest-dev/pytest-xprocess/
 long_description = file: README.rst
+long_description_content_type = text/x-rst
 description = A pytest plugin for managing processes across test runs.
 classifiers = 
        Framework :: Pytest
@@ -16,14 +17,13 @@
        Programming Language :: Python :: 3.7
        Programming Language :: Python :: 3.8
        Programming Language :: Python :: 3.9
+       Programming Language :: Python :: 3.10
        Topic :: Software Development :: Testing
        Topic :: Software Development :: Libraries
        Topic :: Utilities
 
 [options]
 packages = find:
-setup_requires = 
-       setuptools_scm
 python_requires = >= 3.7
 
 [options.packages.find]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/setup.py 
new/pytest-xprocess-0.22.2/setup.py
--- old/pytest-xprocess-0.21.0/setup.py 2022-11-27 18:16:43.000000000 +0100
+++ new/pytest-xprocess-0.22.2/setup.py 2023-01-03 15:26:01.000000000 +0100
@@ -3,7 +3,6 @@
 if __name__ == "__main__":
     setup(
         name="pytest-xprocess",
-        use_scm_version=True,
         # this is for GitHub's dependency graph
         install_requires=["pytest>=2.8", "psutil", "py"],
     )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/tests/server.py 
new/pytest-xprocess-0.22.2/tests/server.py
--- old/pytest-xprocess-0.21.0/tests/server.py  2022-09-11 16:58:49.000000000 
+0200
+++ new/pytest-xprocess-0.22.2/tests/server.py  2023-01-05 15:10:05.000000000 
+0100
@@ -27,33 +27,40 @@
     allow_reuse_address = True
 
     def write_test_patterns(self):
-        self.write_blank_lines()
-        self.write_complex_strings()
-        self.write_non_ascii()
-        sys.stderr.write("started\n")
-        self.write_long_output()
+        self.write_blank_lines(100)
+        self.write_complex_strings(10)
+        self.write_non_ascii(8)
+        sys.stderr.write("started\n")  # 18 line
+        self.write_long_output(100)
+        self.write_garbage_bytes(10)
         sys.stderr.write("finally started\n")
         sys.stderr.flush()
 
-    def write_long_output(self):
+    def write_long_output(self, n):
         """write several lines to test pattern matching
         with process with a lot of output"""
-        for _ in range(50):
+        for _ in range(n):
             sys.stderr.write("spam, bacon, eggs\n")
 
-    def write_non_ascii(self):
+    def write_non_ascii(self, n):
         """non-ascii characters must be supported"""
-        for _ in range(5):
+        for _ in range(n):
             
sys.stderr.write("Ê�æ�pP��çîöē�P��adåráøū\n")
 
-    def write_complex_strings(self):
+    def write_garbage_bytes(self, n):
+        """non-mapable bytes characters must not break xprocess"""
+        for _ in range(n):
+            sys.stderr.buffer.write(b"\x90\x81\x91")
+            sys.stderr.write("\n")
+
+    def write_complex_strings(self, n):
         """Special/control characters should not cause problems"""
-        for i in range(5):
+        for i in range(n):
             sys.stderr.write(f"{i} , % /.%,@%@._%%# #/%/ %\n")
 
-    def write_blank_lines(self):
+    def write_blank_lines(self, n):
         """Blank lines should be igored by xprocess"""
-        for _ in range(100):
+        for _ in range(n):
             sys.stderr.write("\n")
 
     def fork_children(self, target, amount):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pytest-xprocess-0.21.0/tests/test_process_initialization.py 
new/pytest-xprocess-0.22.2/tests/test_process_initialization.py
--- old/pytest-xprocess-0.21.0/tests/test_process_initialization.py     
2022-08-15 11:38:43.000000000 +0200
+++ new/pytest-xprocess-0.22.2/tests/test_process_initialization.py     
2023-01-05 15:10:05.000000000 +0100
@@ -50,9 +50,9 @@
 @pytest.mark.parametrize(
     "proc_name,proc_pttrn,lines",
     [
-        ("s1", "started", 20),
+        ("s1", "started", 21),
         ("s2", "spam, bacon, eggs", 30),
-        ("s3", "finally started", 62),
+        ("s3", "finally started", 130),
     ],
 )
 def test_startup_detection_max_read_lines(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/tox.ini 
new/pytest-xprocess-0.22.2/tox.ini
--- old/pytest-xprocess-0.21.0/tox.ini  2022-08-15 11:38:43.000000000 +0200
+++ new/pytest-xprocess-0.22.2/tox.ini  2022-12-31 17:53:34.000000000 +0100
@@ -1,5 +1,5 @@
 [tox]
-envlist=begin,py{37,38,39}
+envlist=begin,py{37,38,39,310}
 
 [testenv:dev]
 commands =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/xprocess/pytest_xprocess.py 
new/pytest-xprocess-0.22.2/xprocess/pytest_xprocess.py
--- old/pytest-xprocess-0.21.0/xprocess/pytest_xprocess.py      2022-11-27 
17:22:15.000000000 +0100
+++ new/pytest-xprocess-0.22.2/xprocess/pytest_xprocess.py      2023-01-05 
15:10:05.000000000 +0100
@@ -56,7 +56,7 @@
         request.config._xprocess = xproc
         # start every run with clean log files
         for log_file in get_log_files(xproc.rootdir):
-            open(log_file, "w").close()
+            open(log_file, errors="surrogateescape").close()
         yield xproc
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytest-xprocess-0.21.0/xprocess/xprocess.py 
new/pytest-xprocess-0.22.2/xprocess/xprocess.py
--- old/pytest-xprocess-0.21.0/xprocess/xprocess.py     2022-11-27 
16:45:01.000000000 +0100
+++ new/pytest-xprocess-0.22.2/xprocess/xprocess.py     2023-01-05 
15:10:05.000000000 +0100
@@ -83,11 +83,13 @@
             for p in reversed(kill_list):
                 self._signal_process(p, signal.SIGTERM)
             _, alive = psutil.wait_procs(kill_list, timeout=timeout)
+            alive = [a for a in alive if a.status() != psutil.STATUS_ZOMBIE]
 
             # forcefully terminate procs still running
             for p in alive:
                 self._signal_process(p, signal.SIGKILL)
             _, alive = psutil.wait_procs(kill_list, timeout=timeout)
+            alive = [a for a in alive if a.status() != psutil.STATUS_ZOMBIE]
 
             # even if termination itself fails,
             # the signal has been sent to the process
@@ -134,7 +136,7 @@
     def __init__(self, timeout):
         self.timeout = timeout
         # handle to the process logfile
-        self.fhandle = None
+        self.fhandles = []
         # XProcessInfo holding information on XProcess instance
         self.info = None
         # Each XProcess will have a related Popen instance
@@ -147,13 +149,14 @@
 
     def __repr__(self):
         return "<XProcessResources {}, {}, {}>".format(
-            self.fhandle, self.info, self.popen
+            self.fhandles, self.info, self.popen
         )
 
     def release(self):
         # file handles should always be closed
         # in order to avoid ResourceWarnings
-        self.fhandle.close()
+        for fhandle in self.fhandles:
+            fhandle.close()
 
         # We should wait on procs exit status if
         # termination signal has been issued
@@ -199,7 +202,7 @@
 
         return XProcessInfo(self.rootdir, name)
 
-    def ensure(self, name, preparefunc, restart=False):
+    def ensure(self, name, preparefunc, restart=False, persist_logs=True):
         """Returns (PID, logfile) from a newly started or already
             running process.
 
@@ -214,40 +217,38 @@
         @return: (PID, logfile) logfile will be seeked to the end if the
                  server was running, otherwise seeked to the line after
                  where the waitpattern matched."""
-
         from subprocess import Popen, STDOUT
 
         xresource = XProcessResources(self.proc_wait_timeout)
+        self.resources.append(xresource)
 
         info = self.getinfo(name)
         if not restart and not info.isrunning():
             restart = True
 
         if restart:
-            # ensure the process is terminated first
             if info.pid is not None:
                 info.terminate()
 
+            # TODO: after droping py module, review this and break
+            # it down into more readable chunks, possibly extracting pieces
+            # into internal methods would make things more clear too
             controldir = info.controldir.ensure(dir=1)
             starter = preparefunc(controldir, self)
             args = [str(x) for x in starter.args]
             self.log.debug("%s$ %s", controldir, " ".join(args))
-            stdout = open(str(info.logpath), "a+b", 0)
-            stdout.write(bytes(f"{XPROCESS_BLOCK_DELIMITER}\n", "utf8"))
-
-            # is env still necessary? we could pass all in popen_kwargs
+            if persist_logs:
+                stdout = open(str(info.logpath), "a+b", 0)
+                stdout.write(bytes(f"{XPROCESS_BLOCK_DELIMITER}\n", "utf8"))
+            else:
+                stdout = open(str(info.logpath), "wb", 0)
             kwargs = {"env": starter.env}
-
             popen_kwargs = {
                 "cwd": str(controldir),
                 "stdout": stdout,
                 "stderr": STDOUT,
-                # this gives the user the ability to
-                # override the previous keywords if
-                # desired
                 **starter.popen_kwargs,
             }
-
             if sys.platform == "win32":  # pragma: no cover
                 kwargs["startupinfo"] = sinfo = std.subprocess.STARTUPINFO()
                 sinfo.dwFlags |= std.subprocess.STARTF_USESHOWWINDOW
@@ -256,8 +257,7 @@
                 kwargs["close_fds"] = True
                 kwargs["preexec_fn"] = os.setpgrp  # no CONTROL-C
 
-            # keep references of all popen
-            # and info objects for cleanup
+            # keep references of all popen and info objects for cleanup
             xresource.info = (info, starter.terminate_on_interrupt)
             xresource.popen = Popen(args, **popen_kwargs, **kwargs)
 
@@ -266,28 +266,20 @@
             self.log.debug("process %r started pid=%s", name, pid)
             stdout.close()
 
-        # keep track of all file handles so we can
-        # cleanup later during teardown phase
-        xresource.fhandle = info.logpath.open()
-
-        # skip previous process logs
-        lines = info.logpath.open().readlines()
-        if lines:
-            proc_block_counter = sum(
-                1 for line in lines if XPROCESS_BLOCK_DELIMITER in line
-            )
-            for line in xresource.fhandle:
-                if XPROCESS_BLOCK_DELIMITER in line:
-                    proc_block_counter -= 1
-                if proc_block_counter <= 0:
-                    break
+        log_file_handle = open(info.logpath, errors="surrogateescape")
+        xresource.fhandles.append(log_file_handle)
+        pytest_extlogfiles = self.config.__dict__.setdefault("_extlogfiles", 
{})
+        pytest_extlogfiles[name] = log_file_handle
 
-        self.resources.append(xresource)
+        if persist_logs:
+            process_log_block_handle = open(info.logpath, 
errors="surrogateescape")
+            xresource.fhandles.append(process_log_block_handle)
+            self._skip_previous_log_blocks(process_log_block_handle, 
log_file_handle)
 
         if not restart:
-            xresource.fhandle.seek(0, 2)
+            log_file_handle.seek(0, 2)
         else:
-            if not starter.wait(xresource.fhandle):
+            if not starter.wait(log_file_handle):
                 raise RuntimeError(
                     "Could not start process {}, the specified "
                     "log pattern was not found within {} lines.".format(
@@ -296,12 +288,21 @@
                 )
             self.log.debug("%s process startup detected", name)
 
-        pytest_extlogfiles = self.config.__dict__.setdefault("_extlogfiles", 
{})
-        pytest_extlogfiles[name] = xresource.fhandle
-        self.getinfo(name)
-
         return info.pid, info.logpath
 
+    def _skip_previous_log_blocks(self, log_block_handle, log_file_handle):
+        lines = [line for line in log_block_handle]
+        if not lines:  # cut it short if nothing to skip
+            return
+        proc_block_counter = sum(
+            1 for line in lines if XPROCESS_BLOCK_DELIMITER in line
+        )
+        for line in log_file_handle:
+            if XPROCESS_BLOCK_DELIMITER in line:
+                proc_block_counter -= 1
+            if proc_block_counter <= 0:
+                break
+
     def _infos(self):
         return (self.getinfo(p.basename) for p in self.rootdir.listdir())
 
@@ -372,14 +373,12 @@
 
     def startup_check(self):
         """Used to assert process responsiveness after pattern match"""
-
         return True
 
     def wait_callback(self):
         """Assert that process is ready to answer queries using provided
         callback funtion. Will raise TimeoutError if self.callback does not
         return True before self.timeout seconds"""
-
         while True:
             sleep(0.1)
             if self.startup_check():
@@ -395,7 +394,6 @@
 
     def wait(self, log_file):
         """Wait until the pattern is mached and callback returns successful."""
-
         self._max_time = datetime.now() + timedelta(seconds=self.timeout)
         lines = map(self.log_line, self.filter_lines(self.get_lines(log_file)))
         has_match = any(std.re.search(self.pattern, line) for line in lines)
@@ -404,13 +402,11 @@
 
     def filter_lines(self, lines):
         """fetch first <max_read_lines>, ignoring blank lines."""
-
         non_empty_lines = (x for x in lines if x.strip())
         return itertools.islice(non_empty_lines, self.max_read_lines)
 
     def log_line(self, line):
         """Write line to process log file."""
-
         self.process.log.debug(line)
         return line
 
@@ -418,13 +414,10 @@
         """Read and yield one line at a time from log_file. Will raise
         TimeoutError if pattern is not matched before self.timeout
         seconds."""
-
         while True:
             line = log_file.readline()
-
             if not line:
                 std.time.sleep(0.1)
-
             if datetime.now() > self._max_time:
                 raise TimeoutError(
                     "The provided start pattern {} could not be matched \
@@ -432,5 +425,4 @@
                         self.pattern, self.timeout
                     )
                 )
-
             yield line

Reply via email to