from forgeclient import request def _issue_summary(i): return { "number": i.get("number"), "title": i.get("title"), "state": i.get("state"), "user": i.get("user", {}).get("login"), "html_url": i.get("html_url"), } def list_issues(owner, repo, state="open"): state = state if state in ("open", "closed", "all") else "open" data = request("GET", f"/repos/{owner}/{repo}/issues", params={"state": state}) if isinstance(data, dict) and "error" in data: return data # The issues endpoint also returns pull requests; keep only true issues. return [_issue_summary(i) for i in data if not i.get("pull_request")] def create_issue(owner, repo, title, body=""): i = request("POST", f"/repos/{owner}/{repo}/issues", json={"title": title, "body": body}) if "error" in i: return i return _issue_summary(i) def open_pull_request(owner, repo, title, head, base, body=""): """Open a pull request from `head` branch into `base` branch.""" pr = request("POST", f"/repos/{owner}/{repo}/pulls", json={"title": title, "head": head, "base": base, "body": body}) if "error" in pr: return pr return { "number": pr.get("number"), "title": pr.get("title"), "state": pr.get("state"), "mergeable": pr.get("mergeable"), "html_url": pr.get("html_url"), } def create_release(owner, repo, tag_name, name=None, body="", target="main", draft=False, prerelease=False): """Tag a version of the project. Forgejo releases are Git tags with notes; MQL5 has no package format, so this is used purely as a version marker.""" payload = { "tag_name": tag_name, "name": name or tag_name, "body": body, "target_commitish": target, "draft": bool(draft), "prerelease": bool(prerelease), } rel = request("POST", f"/repos/{owner}/{repo}/releases", json=payload) if "error" in rel: return rel return { "id": rel.get("id"), "tag_name": rel.get("tag_name"), "name": rel.get("name"), "html_url": rel.get("html_url"), }