From 0b4b29a6824cee1bb6851ae221ce3da260b4d050 Mon Sep 17 00:00:00 2001 From: Agent Date: Wed, 1 Apr 2026 19:29:24 +0000 Subject: [PATCH] fix: mock-forgejo.py - add users/{username}/repos endpoint --- .../__pycache__/mock-forgejo.cpython-311.pyc | Bin 0 -> 37571 bytes tests/mock-forgejo.py | 47 ++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 tests/__pycache__/mock-forgejo.cpython-311.pyc diff --git a/tests/__pycache__/mock-forgejo.cpython-311.pyc b/tests/__pycache__/mock-forgejo.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c288066da4d1e20e06e5b217a5f72753d17c475 GIT binary patch literal 37571 zcmeHw3ve9Ab>Qp|JNv^ffW?qVkd#`tSeS7&e5`SQF8WW1~*sOnk&{ZNvSTZyUM{Q z`%1-2a`#@(?C#9$E(przC9d+I@pihWr>8%!`+fR#_cvTFI|Y}W{n6xi$0+Kr(UZAs z%FQQ-4HR{gVyF>{F)+p{!-#?W8b^%e*EC`xzvdA$`L&E#$ZyF=3Hh~-SjjIvLX%(H zh>iT(N9^!xnsQ7#N1W5H5tjkeH&2yLyGPvQ-ZJHxE*mMEE*~j3P?MU!af&HfqDLwi ztLl$lDjD%Iws0k5e~lXPF%E!!#tE>BaRCf4r2wlLALD+_Fj8ZrPEd^JHHs;VxV~

-yhNF=n7oBAz3_NI? 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

Pz%p|}(+G+99)|vh>~li8JhH}>P@~*xcqFR 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 literal 0 HcmV?d00001 diff --git a/tests/mock-forgejo.py b/tests/mock-forgejo.py index 1b33152..236f7d5 100755 --- a/tests/mock-forgejo.py +++ b/tests/mock-forgejo.py @@ -135,6 +135,7 @@ class ForgejoHandler(BaseHTTPRequestHandler): # Users patterns (r"^users/([^/]+)$", f"handle_{method}_users_username"), (r"^users/([^/]+)/tokens$", f"handle_{method}_users_username_tokens"), + (r"^users/([^/]+)/repos$", f"handle_{method}_users_username_repos"), # Repos patterns (r"^repos/([^/]+)/([^/]+)$", f"handle_{method}_repos_owner_repo"), (r"^repos/([^/]+)/([^/]+)/labels$", f"handle_{method}_repos_owner_repo_labels"), @@ -460,6 +461,52 @@ class ForgejoHandler(BaseHTTPRequestHandler): state["repos"][key] = repo json_response(self, 201, repo) + def handle_POST_users_username_repos(self, query): + """POST /api/v1/users/{username}/repos""" + require_token(self) + + parts = self.path.split("/") + if len(parts) >= 6: + username = parts[4] + else: + json_response(self, 404, {"message": "user not found"}) + return + + if username not in state["users"]: + json_response(self, 404, {"message": "user not found"}) + return + + content_length = int(self.headers.get("Content-Length", 0)) + body = self.rfile.read(content_length).decode("utf-8") + data = json.loads(body) if body else {} + + repo_name = data.get("name") + if not repo_name: + json_response(self, 400, {"message": "name is required"}) + return + + repo_id = next_ids["repos"] + next_ids["repos"] += 1 + + key = f"{username}/{repo_name}" + repo = { + "id": repo_id, + "full_name": key, + "name": repo_name, + "owner": {"id": state["users"][username].get("id", 0), "login": username}, + "empty": False, + "default_branch": data.get("default_branch", "main"), + "description": data.get("description", ""), + "private": data.get("private", False), + "html_url": f"https://example.com/{key}", + "ssh_url": f"git@example.com:{key}.git", + "clone_url": f"https://example.com/{key}.git", + "created_at": "2026-04-01T00:00:00Z", + } + + state["repos"][key] = repo + json_response(self, 201, repo) + def handle_POST_repos_owner_repo_labels(self, query): """POST /api/v1/repos/{owner}/{repo}/labels""" require_token(self)