Added rngit server-side handling for direct ref updates
This commit is contained in:
parent
17310fc294
commit
b60eab0fcf
1 changed files with 36 additions and 2 deletions
|
|
@ -602,8 +602,42 @@ class ReticulumGitNode():
|
||||||
return self.RES_REMOTE_FAIL.to_bytes(1, "big") + str(e).encode("utf-8")
|
return self.RES_REMOTE_FAIL.to_bytes(1, "big") + str(e).encode("utf-8")
|
||||||
|
|
||||||
elif operations:
|
elif operations:
|
||||||
# TODO: Implement
|
if not type(operations) == list: return self.RES_INVALID_REQ.to_bytes(1, "big") + b"Invalid data for operations"
|
||||||
pass
|
|
||||||
|
try:
|
||||||
|
for op in operations:
|
||||||
|
action = op.get("action", "")
|
||||||
|
ref = op.get("ref", "")
|
||||||
|
sha = op.get("sha", "")
|
||||||
|
op_force = op.get("force", False)
|
||||||
|
|
||||||
|
if action != "update_ref": return self.RES_INVALID_REQ.to_bytes(1, "big") + f"Unknown operation: {action}".encode("utf-8")
|
||||||
|
if not ref.startswith("refs/"): return self.RES_INVALID_REQ.to_bytes(1, "big") + b"Invalid ref"
|
||||||
|
if not sha or len(sha) < 40: return self.RES_INVALID_REQ.to_bytes(1, "big") + b"Invalid SHA"
|
||||||
|
|
||||||
|
# Verify the target object exists in the repository
|
||||||
|
cat_result = subprocess.run(["git", "cat-file", "-t", sha], cwd=repository_path, capture_output=True, check=False)
|
||||||
|
if cat_result.returncode != 0: return self.RES_REMOTE_FAIL.to_bytes(1, "big") + f"Object {sha} does not exist in repository".encode("utf-8")
|
||||||
|
|
||||||
|
# Check force flag: If the ref already exists and
|
||||||
|
# points to a different SHA, the push must be forced.
|
||||||
|
rev_result = subprocess.run(["git", "rev-parse", ref], cwd=repository_path, capture_output=True, text=True, check=False)
|
||||||
|
if rev_result.returncode == 0:
|
||||||
|
existing_sha = rev_result.stdout.strip()
|
||||||
|
if existing_sha != sha and not op_force:
|
||||||
|
return self.RES_DISALLOWED.to_bytes(1, "big") + f"Ref {ref} already exists at different SHA (force required)".encode("utf-8")
|
||||||
|
|
||||||
|
RNS.log(f"Updating ref {ref} to {sha} in {group_name}/{repository_name}", RNS.LOG_DEBUG)
|
||||||
|
execv = ["git", "update-ref", ref, sha]
|
||||||
|
result = subprocess.run(execv, cwd=repository_path, capture_output=True, check=False)
|
||||||
|
|
||||||
|
if result.returncode != 0: return self.RES_REMOTE_FAIL.to_bytes(1, "big") + result.stderr
|
||||||
|
|
||||||
|
return b"\x00"
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
RNS.log(f"Error while handling push operations for {group_name}/{repository_name}: {e}", RNS.LOG_ERROR)
|
||||||
|
return self.RES_REMOTE_FAIL.to_bytes(1, "big") + str(e).encode("utf-8")
|
||||||
|
|
||||||
else: return self.RES_INVALID_REQ.to_bytes(1, "big") + b"Invalid request data"
|
else: return self.RES_INVALID_REQ.to_bytes(1, "big") + b"Invalid request data"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue