From c69afa6296bf4fa42886f6bad43fb7394b4c5e2f Mon Sep 17 00:00:00 2001 From: RhodeCode Admin Date: Thu, 23 Jan 2025 13:37:05 +0100 Subject: [PATCH] svn: fixed lack of hooks data for svn over ssh --- .../apps/ssh_support/lib/backends/git.py | 5 ++-- .../apps/ssh_support/lib/backends/svn.py | 24 ++++++++++++------- rhodecode/lib/celerylib/__init__.py | 8 +++++++ rhodecode/lib/svn_txn_utils.py | 5 +++- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/rhodecode/apps/ssh_support/lib/backends/git.py b/rhodecode/apps/ssh_support/lib/backends/git.py index 81c69b1f..999e7865 100644 --- a/rhodecode/apps/ssh_support/lib/backends/git.py +++ b/rhodecode/apps/ssh_support/lib/backends/git.py @@ -39,9 +39,8 @@ class GitTunnelWrapper(object): def command(self): root = self.server.get_root_store() - command = "cd {root}; {git_path} {mode} '{root}{repo_name}'".format( - root=root, git_path=self.server.git_path, mode=self.server.repo_mode, repo_name=self.server.repo_name - ) + git_server_config = "" + command = f"cd {root}; {self.server.git_path} {git_server_config} {self.server.repo_mode} '{root}{self.server.repo_name}'" log.debug("Final CMD: %s", command) return command diff --git a/rhodecode/apps/ssh_support/lib/backends/svn.py b/rhodecode/apps/ssh_support/lib/backends/svn.py index a74e5d5d..2f6d7ac5 100644 --- a/rhodecode/apps/ssh_support/lib/backends/svn.py +++ b/rhodecode/apps/ssh_support/lib/backends/svn.py @@ -26,6 +26,7 @@ from subprocess import Popen, PIPE import urllib.parse from rhodecode.lib.str_utils import safe_str, safe_bytes +from rhodecode.lib.ext_json import sjson as json from .base import SshVcsServer log = logging.getLogger(__name__) @@ -39,20 +40,23 @@ class SubversionTunnelWrapper(object): self.timeout = 30 self.stdin = sys.stdin.buffer self.stdout = sys.stdout.buffer - self.svn_conf_fd, self.svn_conf_path = tempfile.mkstemp() - self.hooks_env_fd, self.hooks_env_path = tempfile.mkstemp() + self.root_store = self.server.get_root_store() + self.svn_conf_fd, self.svn_conf_path = tempfile.mkstemp(dir=self.root_store, prefix="svn_conf_") + self.hooks_env_fd, self.hooks_env_path = tempfile.mkstemp(dir=self.root_store, prefix="svn_hooks_env_") self.read_only = True # flag that we set to make the hooks readonly def create_svn_config(self): - content = ("[general]\nhooks-env = {}\n").format(self.hooks_env_path) + content = f"[general]\nhooks-env = {self.hooks_env_path}\n" with os.fdopen(self.svn_conf_fd, "w") as config_file: config_file.write(content) - def create_hooks_env(self): + def create_hooks_env(self, extra_data=""): content = "[default]\nLANG = en_US.UTF-8\n" if self.read_only: content += "SSH_READ_ONLY = 1\n" + if extra_data: + content += extra_data with os.fdopen(self.hooks_env_fd, "w") as hooks_env_file: hooks_env_file.write(content) @@ -61,7 +65,7 @@ class SubversionTunnelWrapper(object): os.remove(self.hooks_env_path) def command(self): - root = self.server.get_root_store() + root = self.root_store username = self.server.user.username command = [ @@ -92,6 +96,7 @@ class SubversionTunnelWrapper(object): except BrokenPipeError: # Handle cases where the subprocess closes stdin unexpectedly break + self.remove_configs() @property @@ -106,8 +111,6 @@ class SubversionTunnelWrapper(object): return self._parse_first_client_response(first_response) if first_response else None def patch_first_client_response(self, response, **kwargs): - self.create_hooks_env() - version = response["version"] capabilities = response["capabilities"] client = response["client"] or b"" @@ -174,7 +177,6 @@ class SubversionTunnelWrapper(object): rb"\(\s%b\)\s\)\s*$" % (version_re, capabilities_re, url_re, ra_client_re, client_re) ) matcher = regex.match(buffer_) - return matcher.groupdict() if matcher else None def _match_repo_name(self, url): @@ -222,10 +224,14 @@ class SubversionTunnelWrapper(object): # set the readonly flag to False if we have proper permissions if self.server.has_write_perm(): self.read_only = False - self.server.update_environment(action=action, extras=extras) + scm_data = self.server.update_environment(action=action, extras=extras) + scm_data_str = f"RC_SCM_DATA={json.dumps(scm_data)}" + self.create_hooks_env(scm_data_str) self.patch_first_client_response(first_response) + self.sync() + return self.return_code diff --git a/rhodecode/lib/celerylib/__init__.py b/rhodecode/lib/celerylib/__init__.py index 0399a16b..a6036071 100644 --- a/rhodecode/lib/celerylib/__init__.py +++ b/rhodecode/lib/celerylib/__init__.py @@ -40,6 +40,14 @@ class ResultWrapper(object): def run_task(task, *args, **kwargs): + """ + from rhodecode.lib.celerylib import run_task + from rhodecode.lib.celerylib import tasks as ce_tasks + from rc_ee.lib.celerylib import tasks as ee_tasks + + run_task(ce_tasks.NAME, (), {}) + """ + import celery log.debug("Got task `%s` for execution, celery mode enabled:%s", task, rhodecode.CELERY_ENABLED) diff --git a/rhodecode/lib/svn_txn_utils.py b/rhodecode/lib/svn_txn_utils.py index 424fc29a..24d6139b 100644 --- a/rhodecode/lib/svn_txn_utils.py +++ b/rhodecode/lib/svn_txn_utils.py @@ -116,11 +116,14 @@ def get_txn_id_from_store(repo_path, svn_txn_id, rm_on_read=False): store_key = get_txn_id_data_key(repo_path, svn_txn_id) data = {} redis_conn.get(store_key) + raw_data = "not-set" try: raw_data = redis_conn.get(store_key) + if not raw_data: + raise ValueError(f"Failed to get txn_id metadata, from store: {store_key}") data = json.loads(raw_data) except Exception: - log.exception("Failed to get txn_id metadata") + log.exception("Failed to get txn_id metadata: %s", raw_data) if rm_on_read: log.debug("Cleaning up txn_id at %s", store_key)