From 40a57afc65e71835127a437248ed655404cff0e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= Date: Tue, 27 Jun 2023 11:24:39 +0100 Subject: [PATCH] 3006.0: Prevent _pygit2.GitError: error loading known_hosts when $HOME is not set (bsc#1210994) (#588) * Prevent _pygit2.GitError: error loading known_hosts when $HOME is not set * Add unit test to cover case of unset home --- salt/utils/gitfs.py | 5 +++++ tests/unit/utils/test_gitfs.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/salt/utils/gitfs.py b/salt/utils/gitfs.py index cc9895d8ab..38e84f38aa 100644 --- a/salt/utils/gitfs.py +++ b/salt/utils/gitfs.py @@ -34,6 +34,7 @@ import salt.utils.stringutils import salt.utils.url import salt.utils.user import salt.utils.versions +import salt.syspaths from salt.config import DEFAULT_MASTER_OPTS as _DEFAULT_MASTER_OPTS from salt.exceptions import FileserverConfigError, GitLockError, get_error_message from salt.utils.event import tagify @@ -1867,6 +1868,10 @@ class Pygit2(GitProvider): # pruning only available in pygit2 >= 0.26.2 pass try: + # Make sure $HOME env variable is set to prevent + # _pygit2.GitError: error loading known_hosts in some libgit2 versions. + if "HOME" not in os.environ: + os.environ["HOME"] = salt.syspaths.HOME_DIR fetch_results = origin.fetch(**fetch_kwargs) except GitError as exc: # pylint: disable=broad-except exc_str = get_error_message(exc).lower() diff --git a/tests/unit/utils/test_gitfs.py b/tests/unit/utils/test_gitfs.py index b99da3ef91..7c400b69af 100644 --- a/tests/unit/utils/test_gitfs.py +++ b/tests/unit/utils/test_gitfs.py @@ -14,6 +14,7 @@ import salt.utils.gitfs import salt.utils.platform import tests.support.paths from salt.exceptions import FileserverConfigError +from tests.support.helpers import patched_environ from tests.support.mixins import AdaptedConfigurationTestCaseMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -335,3 +336,16 @@ class TestPygit2(TestCase): self.assertIn(provider.cachedir, provider.checkout()) provider.branch = "does_not_exist" self.assertIsNone(provider.checkout()) + + def test_checkout_with_home_env_unset(self): + remote = os.path.join(tests.support.paths.TMP, "pygit2-repo") + cache = os.path.join(tests.support.paths.TMP, "pygit2-repo-cache") + self._prepare_remote_repository(remote) + provider = self._prepare_cache_repository(remote, cache) + provider.remotecallbacks = None + provider.credentials = None + with patched_environ(__cleanup__=["HOME"]): + self.assertTrue("HOME" not in os.environ) + provider.init_remote() + provider.fetch() + self.assertTrue("HOME" in os.environ) -- 2.41.0