svn: fixed lack of hooks data for svn over ssh
This commit is contained in:
parent
25a090921b
commit
c69afa6296
4 changed files with 29 additions and 13 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue