From 8a3e73d5b7f15958cdc295839ba863bcd740645dc843ea1738550866a9accdf5 Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Fri, 19 Aug 2022 17:36:54 +0000 Subject: [PATCH] Accepting request 998217 from home:mcepl:branches:devel:tools:scm - Add rmtree-ignore-errors.patch to make shutil.rmtree to be more callous (gh#jelmer/dulwich#1000) and prevent thus the race condition in cleaning up after the tests. OBS-URL: https://build.opensuse.org/request/show/998217 OBS-URL: https://build.opensuse.org/package/show/devel:tools:scm/python-dulwich?expand=0&rev=10 --- python-dulwich.changes | 7 ++ python-dulwich.spec | 3 + rmtree-ignore-errors.patch | 183 +++++++++++++++++++++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 rmtree-ignore-errors.patch diff --git a/python-dulwich.changes b/python-dulwich.changes index 5dbe590..a7fcc56 100644 --- a/python-dulwich.changes +++ b/python-dulwich.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Fri Aug 19 16:17:05 UTC 2022 - Matej Cepl + +- Add rmtree-ignore-errors.patch to make shutil.rmtree to be more + callous (gh#jelmer/dulwich#1000) and prevent thus the race + condition in cleaning up after the tests. + ------------------------------------------------------------------- Mon Jul 25 20:57:16 UTC 2022 - Dirk Müller diff --git a/python-dulwich.spec b/python-dulwich.spec index e4c798b..3d7904f 100644 --- a/python-dulwich.spec +++ b/python-dulwich.spec @@ -27,6 +27,9 @@ License: Apache-2.0 OR GPL-2.0-or-later Group: Development/Languages/Python URL: https://www.dulwich.io Source0: https://files.pythonhosted.org/packages/source/d/dulwich/dulwich-%{version}.tar.gz +# PATCH-FIX-UPSTREAM rmtree-ignore-errors.patch gh#jelmer/dulwich#1000 mcepl@suse.com +# shutil.rmtree should be more callous +Patch0: rmtree-ignore-errors.patch BuildRequires: %{python_module certifi} BuildRequires: %{python_module devel} BuildRequires: %{python_module fastimport} diff --git a/rmtree-ignore-errors.patch b/rmtree-ignore-errors.patch new file mode 100644 index 0000000..d183349 --- /dev/null +++ b/rmtree-ignore-errors.patch @@ -0,0 +1,183 @@ +--- + dulwich/tests/test_porcelain.py | 40 ++++++++++++++++++++-------------------- + 1 file changed, 20 insertions(+), 20 deletions(-) + +--- a/dulwich/tests/test_porcelain.py ++++ b/dulwich/tests/test_porcelain.py +@@ -83,7 +83,7 @@ class PorcelainTestCase(TestCase): + def setUp(self): + super(PorcelainTestCase, self).setUp() + self.test_dir = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, self.test_dir) ++ self.addCleanup(shutil.rmtree, self.test_dir, ignore_errors=True) + self.repo_path = os.path.join(self.test_dir, "repo") + self.repo = Repo.init(self.repo_path, mkdir=True) + self.addCleanup(self.repo.close) +@@ -271,7 +271,7 @@ ya6JVZCRbMXfdCy8lVPgtNQ6VlHaj8Wvnn2FLbWW + super(PorcelainGpgTestCase, self).setUp() + self.gpg_dir = os.path.join(self.test_dir, "gpg") + os.mkdir(self.gpg_dir, mode=0o700) +- self.addCleanup(shutil.rmtree, self.gpg_dir) ++ self.addCleanup(shutil.rmtree, self.gpg_dir, ignore_errors=True) + self._old_gnupghome = os.environ.get("GNUPGHOME") + os.environ["GNUPGHOME"] = self.gpg_dir + if self._old_gnupghome is None: +@@ -365,7 +365,7 @@ class CommitTests(PorcelainTestCase): + + hooks_dir = os.path.join(self.repo.controldir(), "hooks") + os.makedirs(hooks_dir, exist_ok=True) +- self.addCleanup(shutil.rmtree, hooks_dir) ++ self.addCleanup(shutil.rmtree, hooks_dir, ignore_errors=True) + + c1, c2, c3 = build_commit_graph( + self.repo.object_store, [[1], [2, 1], [3, 1, 2]] +@@ -524,7 +524,7 @@ class CloneTests(PorcelainTestCase): + self.repo.refs[b"refs/tags/foo"] = c3.id + target_path = tempfile.mkdtemp() + errstream = BytesIO() +- self.addCleanup(shutil.rmtree, target_path) ++ self.addCleanup(shutil.rmtree, target_path, ignore_errors=True) + r = porcelain.clone( + self.repo.path, target_path, checkout=False, errstream=errstream + ) +@@ -558,7 +558,7 @@ class CloneTests(PorcelainTestCase): + self.repo.refs[b"refs/heads/master"] = c3.id + target_path = tempfile.mkdtemp() + errstream = BytesIO() +- self.addCleanup(shutil.rmtree, target_path) ++ self.addCleanup(shutil.rmtree, target_path, ignore_errors=True) + with porcelain.clone( + self.repo.path, target_path, checkout=True, errstream=errstream + ) as r: +@@ -581,7 +581,7 @@ class CloneTests(PorcelainTestCase): + self.repo.refs[b"refs/heads/master"] = c3.id + target_path = tempfile.mkdtemp() + errstream = BytesIO() +- self.addCleanup(shutil.rmtree, target_path) ++ self.addCleanup(shutil.rmtree, target_path, ignore_errors=True) + with porcelain.clone( + self.repo.path, target_path, bare=True, errstream=errstream + ) as r: +@@ -602,7 +602,7 @@ class CloneTests(PorcelainTestCase): + self.repo.refs[b"HEAD"] = c1.id + target_path = tempfile.mkdtemp() + errstream = BytesIO() +- self.addCleanup(shutil.rmtree, target_path) ++ self.addCleanup(shutil.rmtree, target_path, ignore_errors=True) + self.assertRaises( + porcelain.Error, + porcelain.clone, +@@ -621,7 +621,7 @@ class CloneTests(PorcelainTestCase): + (c1,) = build_commit_graph(self.repo.object_store, commit_spec, trees) + self.repo.refs[b"refs/heads/master"] = c1.id + target_path = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, target_path) ++ self.addCleanup(shutil.rmtree, target_path, ignore_errors=True) + errstream = BytesIO() + r = porcelain.clone( + self.repo.path, target_path, checkout=True, errstream=errstream +@@ -636,7 +636,7 @@ class CloneTests(PorcelainTestCase): + (c1,) = build_commit_graph(self.repo.object_store, commit_spec, trees) + self.repo.refs[b"refs/heads/master"] = c1.id + target_path = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, target_path) ++ self.addCleanup(shutil.rmtree, target_path, ignore_errors=True) + errstream = porcelain.NoneStream() + r = porcelain.clone( + self.repo.path, target_path, checkout=True, errstream=errstream +@@ -659,7 +659,7 @@ class CloneTests(PorcelainTestCase): + self.repo.refs[b"refs/heads/else"] = c1.id + target_path = tempfile.mkdtemp() + errstream = BytesIO() +- self.addCleanup(shutil.rmtree, target_path) ++ self.addCleanup(shutil.rmtree, target_path, ignore_errors=True) + r = porcelain.clone( + self.repo.path, target_path, checkout=False, errstream=errstream + ) +@@ -678,12 +678,12 @@ class CloneTests(PorcelainTestCase): + class InitTests(TestCase): + def test_non_bare(self): + repo_dir = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, repo_dir) ++ self.addCleanup(shutil.rmtree, repo_dir, ignore_errors=True) + porcelain.init(repo_dir) + + def test_bare(self): + repo_dir = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, repo_dir) ++ self.addCleanup(shutil.rmtree, repo_dir, ignore_errors=True) + porcelain.init(repo_dir, bare=True) + + +@@ -1449,7 +1449,7 @@ class PushTests(PorcelainTestCase): + + # Setup target repo cloned from temp test repo + clone_path = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, clone_path) ++ self.addCleanup(shutil.rmtree, clone_path, ignore_errors=True) + target_repo = porcelain.clone( + self.repo.path, target=clone_path, errstream=errstream + ) +@@ -1521,7 +1521,7 @@ class PushTests(PorcelainTestCase): + + # Setup target repo cloned from temp test repo + clone_path = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, clone_path) ++ self.addCleanup(shutil.rmtree, clone_path, ignore_errors=True) + target_repo = porcelain.init(clone_path) + target_repo.close() + +@@ -1542,7 +1542,7 @@ class PushTests(PorcelainTestCase): + + # Setup target repo cloned from temp test repo + clone_path = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, clone_path) ++ self.addCleanup(shutil.rmtree, clone_path, ignore_errors=True) + target_repo = porcelain.init(clone_path) + target_repo.close() + +@@ -1589,7 +1589,7 @@ class PushTests(PorcelainTestCase): + + # Setup target repo cloned from temp test repo + clone_path = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, clone_path) ++ self.addCleanup(shutil.rmtree, clone_path, ignore_errors=True) + target_repo = porcelain.clone( + self.repo.path, target=clone_path, errstream=errstream + ) +@@ -1631,7 +1631,7 @@ class PushTests(PorcelainTestCase): + + # Setup target repo cloned from temp test repo + clone_path = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, clone_path) ++ self.addCleanup(shutil.rmtree, clone_path, ignore_errors=True) + target_repo = porcelain.clone( + self.repo.path, target=clone_path, errstream=errstream + ) +@@ -1717,7 +1717,7 @@ class PullTests(PorcelainTestCase): + + # Setup target repo + self.target_path = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, self.target_path) ++ self.addCleanup(shutil.rmtree, self.target_path, ignore_errors=True) + target_repo = porcelain.clone( + self.repo.path, target=self.target_path, errstream=BytesIO() + ) +@@ -2344,7 +2344,7 @@ class FetchTests(PorcelainTestCase): + + # Setup target repo + target_path = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, target_path) ++ self.addCleanup(shutil.rmtree, target_path, ignore_errors=True) + target_repo = porcelain.clone( + self.repo.path, target=target_path, errstream=errstream + ) +@@ -2391,7 +2391,7 @@ class FetchTests(PorcelainTestCase): + + # Setup target repo + target_path = tempfile.mkdtemp() +- self.addCleanup(shutil.rmtree, target_path) ++ self.addCleanup(shutil.rmtree, target_path, ignore_errors=True) + target_repo = porcelain.clone( + self.repo.path, target=target_path, errstream=errstream + )