svn: fixed lack of hooks data for svn over ssh

This commit is contained in:
RhodeCode Admin 2025-01-23 13:37:05 +01:00
parent 25a090921b
commit c69afa6296
4 changed files with 29 additions and 13 deletions

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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)