WebHook broker that accepts notifications from multiple platforms and performs simple actions in response
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import requests
  2. from ..common import get_hook_url
  3. from .service import Service
  4. class Gitea(Service):
  5. def __init__(self, url, token, install_hooks=False):
  6. super().__init__("gitea")
  7. self._url = url
  8. self._token = token
  9. self._install_hooks = install_hooks
  10. self._repos = {}
  11. def refresh(self):
  12. self._repos = dict(
  13. (name, [ssh, clone]) for name, ssh, clone in self._get_repos()
  14. )
  15. def accept_hook(self, identifier, request):
  16. if identifier not in self._repos:
  17. return
  18. if request.headers.get("X-Gitea-Event") == "push":
  19. urls = self._repos[identifier]
  20. data = request.get_json()
  21. yield {
  22. "type": "git.push",
  23. "repo": {
  24. "name": data["repository"]["full_name"],
  25. "public": not data["repository"]["private"],
  26. "urls": urls,
  27. },
  28. "commits": [
  29. {"id": c["id"][:10], "message": c["message"]}
  30. for c in data["commits"]
  31. ],
  32. "compare_url": data["compare_url"],
  33. "user": data["pusher"]["login"],
  34. }
  35. def _get_repos(self):
  36. repos = self._request("get", f"user/repos").json()
  37. for repo in repos:
  38. if self._install_hooks:
  39. self._maybe_install_gitea_hook(repo["full_name"])
  40. yield repo["full_name"], repo["ssh_url"], repo["clone_url"]
  41. def _maybe_install_gitea_hook(self, project):
  42. hook_url = get_hook_url(self.type, project)
  43. path = f"repos/{project}/hooks"
  44. hooks = self._request("get", path).json()
  45. if hook_url not in [hook["config"]["url"] for hook in hooks]:
  46. body = {
  47. "active": True,
  48. "config": {"content_type": "json", "url": hook_url},
  49. "events": [
  50. "create",
  51. "delete",
  52. "fork",
  53. "push",
  54. "issues",
  55. "issue_comment",
  56. "pull_request",
  57. "repository",
  58. "release",
  59. ],
  60. "type": "gitea",
  61. }
  62. self._request("post", path, json=body).json()
  63. def _request(self, method, api_path, **kwargs):
  64. if "params" not in kwargs:
  65. kwargs["params"] = {}
  66. kwargs["params"]["access_token"] = self._token
  67. return requests.request(method, f"{self._url}api/v1/{api_path}", **kwargs)