# HG changeset patch
# User nicoco
# Date 1739831285 -3600
# Node ID 131b8bfbefb421c69c2c5d3708475a27b559a02b
# Parent 6d5a19bdd7189ace7bfb8703f45d4c32165812e0
mod_pubsub_forgejo: new module for forgejo webhooks
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/.hgignore
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/.hgignore Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,3 @@
+test
+style.yaml
+.prettierignore
\ No newline at end of file
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/.prettierignore
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/.prettierignore Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,1 @@
+README.md
\ No newline at end of file
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/README.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/README.md Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,150 @@
+---
+labels:
+- "Stage-Beta"
+summary: "Turn forgejo/github/gitlab webhooks into atom-in-pubsub"
+rockspec:
+ build:
+ modules:
+ mod_pubsub_forgejo.templates: templates.lib.lua
+ mod_pubsub_forgejo.format: format.lib.lua
+---
+
+# Introduction
+
+This module accepts Forgejo webhooks and publishes them to a local
+pubsub component as Atom entries for XMPP clients to subscribe to.
+Such entries can be viewed with a pubsub-compatible XMPP client such as
+[movim](https://movim.eu/) or [libervia](https://libervia.org/), or turned
+into chat messages with a bot (cf last section of this document).
+It is a more customisable `mod_pubsub_github`.
+
+It should also work with other forges such as github and gitlab (to be tested).
+
+# Configuration
+
+## Basic setup
+
+Load the module on a pubsub component:
+
+```{.lua}
+Component "pubsub.example.com" "pubsub"
+ modules_enabled = { "pubsub_forgejo" }
+ forgejo_secret = "something-very-secret" -- copy this in the Forgejo web UI
+```
+
+The "Target URL" to configure in the Forgejo web UI should be either:
+
+- `http://pubsub.example.com:5280/pubsub_forgejo`
+- `https://pubsub.example.com:5281/pubsub_forgejo`
+
+If your HTTP host doesn't match the pubsub component's address, you will
+need to inform Prosody. For more info see Prosody's [HTTP server
+documentation](https://prosody.im/doc/http#virtual_hosts).
+
+## Advanced setup
+
+### Publishing settings
+
+#### Pubsub actor
+
+By default, `forgejo_actor` is unset; this results in nodes being created by the prosody superuser.
+Change this if you set up access control and you know what you are doing.
+
+#### Pubsub node
+
+By default, all events are published in the same pubsub node named "forgejo".
+This can be changed by setting `forgejo_node` to a different value.
+
+Another option is to used different nodes based on which repository emitted the webhook.
+This is useful if you configured the webhook at the user (or organisation) level instead of repository-level.
+To set this up, define `forgejo_node_prefix` and `forgejo_node_mapping`.
+`forgejo_node_mapping` must be a key in the the webhook "repository" payload, e.g., "full*name". Example: with `forge_node_prefix = "forgejo---"` and `forgejo_node_mapping = "full_name"`, webhooks emitted by the repository \_repo-name* in the _org-name_ organisation will be published in the node _forgejo---org-name/repo-name_.
+
+### Customizing the atom entry
+
+#### Pushes with no commits
+
+By default, pushes without commits (i.e., pushing tags) are ignored, because it leads
+to weird entries like "romeo pushed 0 commit(s) to repo".
+This behaviour can be changed by setting `forgejo_skip_commitless_push = false`.
+
+#### Atom entry templates
+
+By default, 3 webhooks events are handled (push, pull_request and release),
+and the payload is turned into a atom entry by
+using [util.interpolation](https://prosody.im/doc/developers/util/interpolation) templates.
+The default templates can be viewed in the source of this module, in the `templates.lib.lua`
+file.
+
+You can customise them using by setting `forgejo_templates`, which is merged with the default
+templates.
+In this table, keys are forgejo event names (`x-forgejo-template` request header).
+Values of this table are tables too, where keys are atom elements and values are the templates
+passed to [util.interpolation](https://prosody.im/doc/developers/util/interpolation).
+
+A few filters are provided:
+
+- `|shorten` strips the last 32 characters: useful to get a short commit hash
+- `|firstline` only keeps the first line: useful to get a commit "title"
+- `|branch` strips the first 12 characters: useful to get a branch name from `data.ref`
+- `|tag` strips the first 11 characters: useful to get a tag name from `data.ref`
+
+Example:
+
+```{.lua}
+forgejo_templates = {
+ pull_request = nil, -- suppress handling of `pull_request` events
+ release = { -- data is the JSON payload of the webhook
+ title = "{data.sender.username} {data.action} a release for {data.repository.name}",
+ content = "{data.release.name}",
+ id = "release-{data.release.tag_name}",
+ link = "{data.release.html_url}"
+ }
+}
+```
+
+Examples payloads are provided in the `webhook-examples`
+
+# Publishing in a MUC
+
+You can use a bot that listen to pubsub events and converts them to MUC messages.
+MattJ's [riddim](https://matthewwild.co.uk/projects/riddim/) is well suited for that.
+
+Example config, single pubsub node:
+
+```{.lua}
+jid = "forgejo-bot@example.com"
+password = "top-secret-stuff"
+room = "room@rooms.example.com"
+autojoin = room
+
+pubsub2room = {
+ "pubsub.example.com#forgejo" = {
+ room = room,
+ template = "${title}\n${content}\n${link@href}"
+ }
+}
+```
+
+Example with several nodes:
+
+```{.lua}
+local nodes = {"forgejo---org/repo1", "forgejo---org/repo2"}
+pubsub2room = {}
+
+for _, node in ipairs(slidge_repos) do
+ pubsub2room = ["pubsub.example.com#" .. node] = {
+ room = room,
+ template = "${title}\n${content}\n${link@href}"
+ }
+end
+```
+
+# TODO
+
+- Default templates for all event types
+- (x)html content
+
+# Compatibility
+
+Works with prosody 0.12
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/format.lib.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/format.lib.lua Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,44 @@
+local st = require "util.stanza";
+local datetime = require "util.datetime";
+
+local function shorten(x) return string.sub(x, 1, -32) end
+
+local function firstline(x) return x:match("^[^\r\n]*") end
+
+local function branch(x) return string.sub(x, 12) end
+
+local function tag(x) return string.sub(x, 11) end
+
+local function noop(x) return x end
+
+local filters = {
+ shorten = shorten,
+ firstline = firstline,
+ branch = branch,
+ tag = tag
+}
+
+local render = require"util.interpolation".new("%b{}", noop, filters);
+
+local function get_item(data, templates)
+ local function render_tpl(name) return render(templates[name], {data = data}) end
+
+ local now = datetime.datetime()
+ local id = render(templates["id"], {data = data})
+ -- LuaFormatter off
+ return st.stanza("item", {id = id, xmlns = "http://jabber.org/protocol/pubsub"})
+ :tag("entry", {xmlns = "http://www.w3.org/2005/Atom"})
+ :tag("id"):text(id):up()
+ :tag("title"):text(render_tpl("title")):up()
+ :tag("content", {type = "text"}):text(render_tpl("content")):up()
+ :tag("link", {rel = "alternate", href = render_tpl("link")}):up()
+ :tag("published"):text(now):up()
+ :tag("updated"):text(now):up()
+ :tag("author")
+ :tag("name")
+ :text(data.sender.username):up()
+ :tag("email"):text(data.sender.email)
+ -- LuaFormatter on
+end
+
+return get_item
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/mod_pubsub_forgejo.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/mod_pubsub_forgejo.lua Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,115 @@
+module:depends("http")
+local pubsub_service = module:depends("pubsub").service
+
+local st = require "util.stanza"
+local json = require "util.json"
+local hashes = require "util.hashes"
+local from_hex = require"util.hex".from
+local hmacs = {
+ sha1 = hashes.hmac_sha1,
+ sha256 = hashes.hmac_sha256,
+ sha384 = hashes.hmac_sha384,
+ sha512 = hashes.hmac_sha512
+}
+
+local format = module:require "format"
+local default_templates = module:require "templates"
+
+-- configuration
+local forgejo_secret = module:get_option("forgejo_secret")
+
+local default_node = module:get_option("forgejo_node", "forgejo")
+local node_prefix = module:get_option_string("forgejo_node_prefix", "forgejo/")
+local node_mapping = module:get_option_string("forgejo_node_mapping")
+local forgejo_actor = module:get_option_string("forgejo_actor") or true
+
+local skip_commitless_push = module:get_option_boolean(
+ "forgejo_skip_commitless_push", true)
+local custom_templates = module:get_option("forgejo_templates")
+
+local forgejo_templates = default_templates
+
+if custom_templates ~= nil then
+ for k, v in pairs(custom_templates) do forgejo_templates[k] = v end
+end
+
+-- used for develoment, should never be set in prod!
+local insecure = module:get_option_boolean("forgejo_insecure", false)
+-- validation
+if not insecure then assert(forgejo_secret, "Please set 'forgejo_secret'") end
+
+local error_mapping = {
+ ["forbidden"] = 403,
+ ["item-not-found"] = 404,
+ ["internal-server-error"] = 500,
+ ["conflict"] = 409
+}
+
+local function verify_signature(secret, body, signature)
+ if insecure then return true end
+ if not signature then return false end
+ local algo, digest = signature:match("^([^=]+)=(%x+)")
+ if not algo then return false end
+ local hmac = hmacs[algo]
+ if not algo then return false end
+ return hmac(secret, body) == from_hex(digest)
+end
+
+function handle_POST(event)
+ local request, response = event.request, event.response
+
+ if not verify_signature(forgejo_secret, request.body,
+ request.headers.x_hub_signature) then
+ module:log("debug", "Signature validation failed")
+ return 401
+ end
+
+ local data = json.decode(request.body)
+ if not data then
+ response.status_code = 400
+ return "Invalid JSON. From you of all people..."
+ end
+
+ local forgejo_event = request.headers.x_forgejo_event or data.object_kind
+
+ if skip_commitless_push and forgejo_event == "push" and data.total_commits == 0 then
+ module:log("debug", "Skipping push event with 0 commits")
+ return 501
+ end
+
+ if forgejo_templates[forgejo_event] == nil then
+ module:log("debug", "Unsupported forgejo event %q", forgejo_event)
+ return 501
+ end
+
+ local item = format(data, forgejo_templates[forgejo_event])
+
+ if item == nil then
+ module:log("debug", "Formatter returned nil for event %q", forgejo_event)
+ return 501
+ end
+
+ local node = default_node
+ if node_mapping then node = node_prefix .. data.repository[node_mapping] end
+
+ create_node(node)
+
+ local ok, err = pubsub_service:publish(node, forgejo_actor, item.attr.id, item)
+ if not ok then return error_mapping[err] or 500 end
+
+ response.status_code = 202
+ return "Thank you forgejo.\n" .. tostring(item:indent(1, " "))
+end
+
+module:provides("http", {route = {POST = handle_POST}})
+
+function create_node(node)
+ if not pubsub_service.nodes[node] then
+ local ok, err = pubsub_service:create(node, true)
+ if not ok then
+ module:log("error", "Error creating node: %s", err)
+ else
+ module:log("debug", "Node %q created", node)
+ end
+ end
+end
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/style.yaml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/style.yaml Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,2 @@
+indent_width: 1
+use_tab: true
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/templates.lib.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/templates.lib.lua Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,22 @@
+local module = {
+ push = {
+ title = "{data.sender.username} pushed {data.total_commits} commit(s) to {data.repository.name}",
+ content = "{data.commits#- {item.message|firstline} ({item.author.name})\n}",
+ id = "push-{data.head_commit.id}",
+ link = "{data.repository.html_url}/compare/{data.before|shorten}..{data.after|shorten}"
+ },
+ pull_request = {
+ title = "{data.sender.username} {data.action} a pull request for {data.repository.name}",
+ content = "{data.pull_request.title}",
+ id = "pull-{data.pull_request.number}-{data.pull_request.updated_at}",
+ link = "{data.pull_request.html_url}"
+ },
+ release = {
+ title = "{data.sender.username} {data.action} a release for {data.repository.name}",
+ content = "{data.release.name}",
+ id = "release-{data.release.tag_name}",
+ link = "{data.release.html_url}"
+ }
+}
+
+return module
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/test.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/test.lua Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,40 @@
+-- CLI script to ease templates writing
+-- must be launched with `lua test.lua` after setting the following env vars,
+-- (assuming prosody has been clone in ../../prosody-0.12)
+-- LUA_CPATH=../../prosody-0.12/\?.so
+-- LUA_PATH=../../prosody-0.12/\?.lua\;\?.lua
+-- allow loading ".lib.lua" modules
+local function loadlib(modulename)
+ local filename = modulename .. ".lib.lua"
+ local file = io.open(filename, "rb")
+ if file then
+ return load(file:read("a")), modulename
+ else
+ return filename .. " not found"
+ end
+end
+
+table.insert(package.searchers, loadlib)
+
+local json = require "util.json"
+local format = require "format"
+local templates = require "templates"
+
+local function read_json(fname)
+ local f = io.open(fname)
+ assert(f ~= nil, fname)
+ local data = json.decode(f:read("a"))
+ f:close()
+ return data
+end
+
+local function read_payload(dirname)
+ return read_json("./webhook-examples/" .. dirname .. "/content.json")
+end
+
+local function pprint(stanza) print(stanza:indent(1, " "):pretty_print()) end
+
+pprint(format(read_payload("push"), templates.push))
+pprint(format(read_payload("pull_request"), templates.pull_request))
+-- pprint(format(read_payload("push_tag"), templates.push)) -- this is a push with 0 commits. It's ugly!
+pprint(format(read_payload("release"), templates.release))
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/create/content.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/create/content.json Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,134 @@
+{
+ "sha": "4c87e2dfed00747a28d8602692ba3d73871790cb",
+ "ref": "refs/tags/v0.2.0",
+ "ref_type": "tag",
+ "repository": {
+ "id": 301855,
+ "owner": {
+ "id": 205842,
+ "login": "slidge",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "slidge@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/aa0eeeb5fe173938bdc665be92bf605efa1e8f4a905bc3327e4d5c7eddf584e5",
+ "html_url": "https://codeberg.org/slidge",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2024-08-30T14:16:14Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "",
+ "pronouns": "",
+ "website": "https://slidge.im",
+ "description": "",
+ "visibility": "public",
+ "followers_count": 5,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "slidge"
+ },
+ "name": "slidgnal",
+ "full_name": "slidge/slidgnal",
+ "description": "A feature-rich Signal to XMPP gateway",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 471,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/slidge/slidgnal/languages",
+ "html_url": "https://codeberg.org/slidge/slidgnal",
+ "url": "https://codeberg.org/api/v1/repos/slidge/slidgnal",
+ "link": "",
+ "ssh_url": "git@codeberg.org:slidge/slidgnal.git",
+ "clone_url": "https://codeberg.org/slidge/slidgnal.git",
+ "original_url": "",
+ "website": "",
+ "stars_count": 0,
+ "forks_count": 0,
+ "watchers_count": 6,
+ "open_issues_count": 5,
+ "open_pr_counter": 0,
+ "release_counter": 0,
+ "default_branch": "main",
+ "archived": false,
+ "created_at": "2025-01-10T14:37:52Z",
+ "updated_at": "2025-02-09T06:26:00Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": false,
+ "push": false,
+ "pull": false
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": false,
+ "wiki_branch": "main",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": false,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": true,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": false,
+ "default_merge_style": "merge",
+ "default_allow_maintainer_edit": false,
+ "default_update_style": "merge",
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "bridge",
+ "gateway",
+ "instant-messaging",
+ "signal",
+ "slidge",
+ "xmpp"
+ ]
+ },
+ "sender": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 2,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ }
+}
\ No newline at end of file
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/create/headers
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/create/headers Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,18 @@
+Content-Type: application/json
+X-Forgejo-Delivery: 2e3badae-779d-4627-94c7-505deeee8b55
+X-Forgejo-Event: create
+X-Forgejo-Event-Type: create
+X-Forgejo-Signature: 99f6adf0a156c379057735690dcfae3f483a026dde78ace6252b3da60b0e6bad
+X-GitHub-Delivery: 2e3badae-779d-4627-94c7-505deeee8b55
+X-GitHub-Event: create
+X-GitHub-Event-Type: create
+X-Gitea-Delivery: 2e3badae-779d-4627-94c7-505deeee8b55
+X-Gitea-Event: create
+X-Gitea-Event-Type: create
+X-Gitea-Signature: 99f6adf0a156c379057735690dcfae3f483a026dde78ace6252b3da60b0e6bad
+X-Gogs-Delivery: 2e3badae-779d-4627-94c7-505deeee8b55
+X-Gogs-Event: create
+X-Gogs-Event-Type: create
+X-Gogs-Signature: 99f6adf0a156c379057735690dcfae3f483a026dde78ace6252b3da60b0e6bad
+X-Hub-Signature: sha1=a6edaf56463683b675cbc3a081292369a143c2c4
+X-Hub-Signature-256: sha256=99f6adf0a156c379057735690dcfae3f483a026dde78ace6252b3da60b0e6bad
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/pull_request/content.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/pull_request/content.json Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,501 @@
+{
+ "action": "opened",
+ "number": 38,
+ "pull_request": {
+ "id": 270810,
+ "url": "https://codeberg.org/slidge/slidge/pulls/38",
+ "number": 38,
+ "user": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 1,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ },
+ "title": "dev",
+ "body": "test\r\n\r\nblabla",
+ "labels": [],
+ "milestone": null,
+ "assignee": null,
+ "assignees": null,
+ "requested_reviewers": null,
+ "requested_reviewers_teams": null,
+ "state": "open",
+ "draft": false,
+ "is_locked": false,
+ "comments": 0,
+ "review_comments": 0,
+ "additions": 338,
+ "deletions": 211,
+ "changed_files": 10,
+ "html_url": "https://codeberg.org/slidge/slidge/pulls/38",
+ "diff_url": "https://codeberg.org/slidge/slidge/pulls/38.diff",
+ "patch_url": "https://codeberg.org/slidge/slidge/pulls/38.patch",
+ "mergeable": true,
+ "merged": false,
+ "merged_at": null,
+ "merge_commit_sha": null,
+ "merged_by": null,
+ "allow_maintainer_edit": true,
+ "base": {
+ "label": "main",
+ "ref": "main",
+ "sha": "84bdc13530ef5fdd001eb55eb4ff9a4545fd1182",
+ "repo_id": 298187,
+ "repo": {
+ "id": 298187,
+ "owner": {
+ "id": 205842,
+ "login": "slidge",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "",
+ "avatar_url": "https://codeberg.org/avatars/aa0eeeb5fe173938bdc665be92bf605efa1e8f4a905bc3327e4d5c7eddf584e5",
+ "html_url": "https://codeberg.org/slidge",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2024-08-30T14:16:14Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "",
+ "pronouns": "",
+ "website": "https://slidge.im",
+ "description": "",
+ "visibility": "public",
+ "followers_count": 3,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "slidge"
+ },
+ "name": "slidge",
+ "full_name": "slidge/slidge",
+ "description": "An XMPP/other chat networks gateway framework in python",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 7536,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/slidge/slidge/languages",
+ "html_url": "https://codeberg.org/slidge/slidge",
+ "url": "https://codeberg.org/api/v1/repos/slidge/slidge",
+ "link": "",
+ "ssh_url": "git@codeberg.org:slidge/slidge.git",
+ "clone_url": "https://codeberg.org/slidge/slidge.git",
+ "original_url": "",
+ "website": "https://slidge.im/",
+ "stars_count": 1,
+ "forks_count": 1,
+ "watchers_count": 4,
+ "open_issues_count": 26,
+ "open_pr_counter": 0,
+ "release_counter": 0,
+ "default_branch": "main",
+ "archived": false,
+ "created_at": "2025-01-02T05:57:37Z",
+ "updated_at": "2025-01-16T10:44:09Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": false,
+ "push": false,
+ "pull": true
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": false,
+ "wiki_branch": "main",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": false,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": true,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": true,
+ "default_merge_style": "rebase",
+ "default_allow_maintainer_edit": true,
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "bridge",
+ "chat",
+ "gateway",
+ "instant-messaging",
+ "python",
+ "xmpp"
+ ]
+ }
+ },
+ "head": {
+ "label": "dev",
+ "ref": "dev",
+ "sha": "333f86a71bc5dbcf27de4dfaf9006890b86dee34",
+ "repo_id": 303404,
+ "repo": {
+ "id": 303404,
+ "owner": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 1,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ },
+ "name": "slidge",
+ "full_name": "nicoco/slidge",
+ "description": "An XMPP/other chat networks framework in python",
+ "empty": false,
+ "private": false,
+ "fork": true,
+ "template": false,
+ "parent": {
+ "id": 298187,
+ "owner": {
+ "id": 205842,
+ "login": "slidge",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "",
+ "avatar_url": "https://codeberg.org/avatars/aa0eeeb5fe173938bdc665be92bf605efa1e8f4a905bc3327e4d5c7eddf584e5",
+ "html_url": "https://codeberg.org/slidge",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2024-08-30T14:16:14Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "",
+ "pronouns": "",
+ "website": "https://slidge.im",
+ "description": "",
+ "visibility": "public",
+ "followers_count": 3,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "slidge"
+ },
+ "name": "slidge",
+ "full_name": "slidge/slidge",
+ "description": "An XMPP/other chat networks gateway framework in python",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 7536,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/slidge/slidge/languages",
+ "html_url": "https://codeberg.org/slidge/slidge",
+ "url": "https://codeberg.org/api/v1/repos/slidge/slidge",
+ "link": "",
+ "ssh_url": "git@codeberg.org:slidge/slidge.git",
+ "clone_url": "https://codeberg.org/slidge/slidge.git",
+ "original_url": "",
+ "website": "https://slidge.im/",
+ "stars_count": 1,
+ "forks_count": 1,
+ "watchers_count": 4,
+ "open_issues_count": 26,
+ "open_pr_counter": 1,
+ "release_counter": 0,
+ "default_branch": "main",
+ "archived": false,
+ "created_at": "2025-01-02T05:57:37Z",
+ "updated_at": "2025-01-16T10:44:09Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": false,
+ "push": false,
+ "pull": true
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": false,
+ "wiki_branch": "main",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": false,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": true,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": true,
+ "default_merge_style": "rebase",
+ "default_allow_maintainer_edit": true,
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "bridge",
+ "chat",
+ "gateway",
+ "instant-messaging",
+ "python",
+ "xmpp"
+ ]
+ },
+ "mirror": false,
+ "size": 6562,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/nicoco/slidge/languages",
+ "html_url": "https://codeberg.org/nicoco/slidge",
+ "url": "https://codeberg.org/api/v1/repos/nicoco/slidge",
+ "link": "",
+ "ssh_url": "git@codeberg.org:nicoco/slidge.git",
+ "clone_url": "https://codeberg.org/nicoco/slidge.git",
+ "original_url": "",
+ "website": "",
+ "stars_count": 0,
+ "forks_count": 0,
+ "watchers_count": 1,
+ "open_issues_count": 0,
+ "open_pr_counter": 0,
+ "release_counter": 0,
+ "default_branch": "main",
+ "archived": false,
+ "created_at": "2025-01-14T15:21:10Z",
+ "updated_at": "2025-01-17T14:04:37Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": false,
+ "push": false,
+ "pull": true
+ },
+ "has_issues": false,
+ "has_wiki": false,
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": false,
+ "has_releases": false,
+ "has_packages": false,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": true,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": false,
+ "default_merge_style": "merge",
+ "default_allow_maintainer_edit": false,
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": null
+ }
+ },
+ "merge_base": "84bdc13530ef5fdd001eb55eb4ff9a4545fd1182",
+ "due_date": null,
+ "created_at": "2025-01-17T14:04:59Z",
+ "updated_at": "2025-01-17T14:04:59Z",
+ "closed_at": null,
+ "pin_order": 0
+ },
+ "requested_reviewer": null,
+ "repository": {
+ "id": 298187,
+ "owner": {
+ "id": 205842,
+ "login": "slidge",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "",
+ "avatar_url": "https://codeberg.org/avatars/aa0eeeb5fe173938bdc665be92bf605efa1e8f4a905bc3327e4d5c7eddf584e5",
+ "html_url": "https://codeberg.org/slidge",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2024-08-30T14:16:14Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "",
+ "pronouns": "",
+ "website": "https://slidge.im",
+ "description": "",
+ "visibility": "public",
+ "followers_count": 3,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "slidge"
+ },
+ "name": "slidge",
+ "full_name": "slidge/slidge",
+ "description": "An XMPP/other chat networks gateway framework in python",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 7536,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/slidge/slidge/languages",
+ "html_url": "https://codeberg.org/slidge/slidge",
+ "url": "https://codeberg.org/api/v1/repos/slidge/slidge",
+ "link": "",
+ "ssh_url": "git@codeberg.org:slidge/slidge.git",
+ "clone_url": "https://codeberg.org/slidge/slidge.git",
+ "original_url": "",
+ "website": "https://slidge.im/",
+ "stars_count": 1,
+ "forks_count": 1,
+ "watchers_count": 4,
+ "open_issues_count": 26,
+ "open_pr_counter": 0,
+ "release_counter": 0,
+ "default_branch": "main",
+ "archived": false,
+ "created_at": "2025-01-02T05:57:37Z",
+ "updated_at": "2025-01-16T10:44:09Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": true,
+ "push": true,
+ "pull": true
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": false,
+ "wiki_branch": "main",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": false,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": true,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": true,
+ "default_merge_style": "rebase",
+ "default_allow_maintainer_edit": true,
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "bridge",
+ "chat",
+ "gateway",
+ "instant-messaging",
+ "python",
+ "xmpp"
+ ]
+ },
+ "sender": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 1,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ },
+ "commit_id": "",
+ "review": null
+}
\ No newline at end of file
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/pull_request/headers
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/pull_request/headers Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,18 @@
+Content-Type: application/json
+X-Forgejo-Delivery: d9ef04ca-cba6-4b43-bd81-81f7b10a3415
+X-Forgejo-Event: pull_request
+X-Forgejo-Event-Type: pull_request
+X-Forgejo-Signature: 7963b65afbfaae02376cb5f44c4534bd28b34000e2c410badd1e3ebd922dbe4b
+X-GitHub-Delivery: d9ef04ca-cba6-4b43-bd81-81f7b10a3415
+X-GitHub-Event: pull_request
+X-GitHub-Event-Type: pull_request
+X-Gitea-Delivery: d9ef04ca-cba6-4b43-bd81-81f7b10a3415
+X-Gitea-Event: pull_request
+X-Gitea-Event-Type: pull_request
+X-Gitea-Signature: 7963b65afbfaae02376cb5f44c4534bd28b34000e2c410badd1e3ebd922dbe4b
+X-Gogs-Delivery: d9ef04ca-cba6-4b43-bd81-81f7b10a3415
+X-Gogs-Event: pull_request
+X-Gogs-Event-Type: pull_request
+X-Gogs-Signature: 7963b65afbfaae02376cb5f44c4534bd28b34000e2c410badd1e3ebd922dbe4b
+X-Hub-Signature: sha1=57534fff7c23b977b2be006e66797faf31a1021b
+X-Hub-Signature-256: sha256=7963b65afbfaae02376cb5f44c4534bd28b34000e2c410badd1e3ebd922dbe4b
\ No newline at end of file
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/pull_request_comment/content.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/pull_request_comment/content.json Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,232 @@
+{
+ "action": "created",
+ "issue": {
+ "id": 949460,
+ "url": "https://codeberg.org/api/v1/repos/slidge/slidge/issues/38",
+ "html_url": "https://codeberg.org/slidge/slidge/pulls/38",
+ "number": 38,
+ "user": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@nicoco.fr",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "en-US",
+ "is_admin": false,
+ "last_login": "2025-01-16T17:43:26Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": true,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 1,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ },
+ "original_author": "",
+ "original_author_id": 0,
+ "title": "dev",
+ "body": "test\r\n\r\nblabla",
+ "ref": "",
+ "assets": [],
+ "labels": [],
+ "milestone": null,
+ "assignee": null,
+ "assignees": null,
+ "state": "open",
+ "is_locked": false,
+ "comments": 0,
+ "created_at": "2025-01-17T14:04:59Z",
+ "updated_at": "2025-01-17T14:52:25Z",
+ "closed_at": null,
+ "due_date": null,
+ "pull_request": {
+ "merged": false,
+ "merged_at": null,
+ "draft": false,
+ "html_url": "https://codeberg.org/slidge/slidge/pulls/38"
+ },
+ "repository": {
+ "id": 298187,
+ "name": "slidge",
+ "owner": "slidge",
+ "full_name": "slidge/slidge"
+ },
+ "pin_order": 0
+ },
+ "comment": {
+ "id": 2592486,
+ "html_url": "https://codeberg.org/slidge/slidge/pulls/38#issuecomment-2592486",
+ "pull_request_url": "https://codeberg.org/slidge/slidge/pulls/38",
+ "issue_url": "",
+ "user": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 1,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ },
+ "original_author": "",
+ "original_author_id": 0,
+ "body": "a comment",
+ "assets": [],
+ "created_at": "2025-01-17T14:52:25Z",
+ "updated_at": "2025-01-17T14:52:25Z"
+ },
+ "repository": {
+ "id": 298187,
+ "owner": {
+ "id": 205842,
+ "login": "slidge",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "",
+ "avatar_url": "https://codeberg.org/avatars/aa0eeeb5fe173938bdc665be92bf605efa1e8f4a905bc3327e4d5c7eddf584e5",
+ "html_url": "https://codeberg.org/slidge",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2024-08-30T14:16:14Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "",
+ "pronouns": "",
+ "website": "https://slidge.im",
+ "description": "",
+ "visibility": "public",
+ "followers_count": 3,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "slidge"
+ },
+ "name": "slidge",
+ "full_name": "slidge/slidge",
+ "description": "An XMPP/other chat networks gateway framework in python",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 7536,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/slidge/slidge/languages",
+ "html_url": "https://codeberg.org/slidge/slidge",
+ "url": "https://codeberg.org/api/v1/repos/slidge/slidge",
+ "link": "",
+ "ssh_url": "git@codeberg.org:slidge/slidge.git",
+ "clone_url": "https://codeberg.org/slidge/slidge.git",
+ "original_url": "",
+ "website": "https://slidge.im/",
+ "stars_count": 1,
+ "forks_count": 1,
+ "watchers_count": 4,
+ "open_issues_count": 26,
+ "open_pr_counter": 1,
+ "release_counter": 0,
+ "default_branch": "main",
+ "archived": false,
+ "created_at": "2025-01-02T05:57:37Z",
+ "updated_at": "2025-01-16T10:44:09Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": true,
+ "push": true,
+ "pull": true
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": false,
+ "wiki_branch": "main",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": false,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": true,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": true,
+ "default_merge_style": "rebase",
+ "default_allow_maintainer_edit": true,
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "bridge",
+ "chat",
+ "gateway",
+ "instant-messaging",
+ "python",
+ "xmpp"
+ ]
+ },
+ "sender": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 1,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ },
+ "is_pull": true
+}
\ No newline at end of file
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/pull_request_comment/headers
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/pull_request_comment/headers Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,18 @@
+Content-Type: application/json
+X-Forgejo-Delivery: 99fb308a-ed68-46d7-a8b5-4bf935ae294f
+X-Forgejo-Event: issue_comment
+X-Forgejo-Event-Type: pull_request_comment
+X-Forgejo-Signature: 5fc374c851a20a0e18b65d32d9901c5f962cce950452cebc81bb5d6b0c023123
+X-GitHub-Delivery: 99fb308a-ed68-46d7-a8b5-4bf935ae294f
+X-GitHub-Event: issue_comment
+X-GitHub-Event-Type: pull_request_comment
+X-Gitea-Delivery: 99fb308a-ed68-46d7-a8b5-4bf935ae294f
+X-Gitea-Event: issue_comment
+X-Gitea-Event-Type: pull_request_comment
+X-Gitea-Signature: 5fc374c851a20a0e18b65d32d9901c5f962cce950452cebc81bb5d6b0c023123
+X-Gogs-Delivery: 99fb308a-ed68-46d7-a8b5-4bf935ae294f
+X-Gogs-Event: issue_comment
+X-Gogs-Event-Type: pull_request_comment
+X-Gogs-Signature: 5fc374c851a20a0e18b65d32d9901c5f962cce950452cebc81bb5d6b0c023123
+X-Hub-Signature: sha1=ea62c579c31ae99001c1e9b769d4a71e4dbc4b7f
+X-Hub-Signature-256: sha256=5fc374c851a20a0e18b65d32d9901c5f962cce950452cebc81bb5d6b0c023123
\ No newline at end of file
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/pull_request_rejected/content.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/pull_request_rejected/content.json Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,468 @@
+{
+ "action": "reviewed",
+ "number": 3591,
+ "pull_request": {
+ "id": 289137,
+ "url": "https://codeberg.org/poezio/slixmpp/pulls/3591",
+ "number": 3591,
+ "user": {
+ "id": 102461,
+ "login": "mathieui",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "mathieui@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/921cd14ed81b453b5eab40840af709a256e4fcb2d0c19ff47a7a33948978c3c4",
+ "html_url": "https://codeberg.org/mathieui",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2023-06-17T14:34:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "",
+ "pronouns": "",
+ "website": "",
+ "description": "",
+ "visibility": "public",
+ "followers_count": 1,
+ "following_count": 0,
+ "starred_repos_count": 1,
+ "username": "mathieui"
+ },
+ "title": "XEP-0410: add support",
+ "body": "This commit introduces an automated monitoring of MUC presence based on\r\nXEP-0410. An invisible background job is tasked with pinging inactive\r\nMUCs.",
+ "labels": [],
+ "milestone": null,
+ "assignee": null,
+ "assignees": null,
+ "requested_reviewers": [
+ {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 2,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ }
+ ],
+ "requested_reviewers_teams": null,
+ "state": "open",
+ "draft": false,
+ "is_locked": false,
+ "comments": 0,
+ "review_comments": 1,
+ "additions": 407,
+ "deletions": 0,
+ "changed_files": 7,
+ "html_url": "https://codeberg.org/poezio/slixmpp/pulls/3591",
+ "diff_url": "https://codeberg.org/poezio/slixmpp/pulls/3591.diff",
+ "patch_url": "https://codeberg.org/poezio/slixmpp/pulls/3591.patch",
+ "mergeable": true,
+ "merged": false,
+ "merged_at": null,
+ "merge_commit_sha": null,
+ "merged_by": null,
+ "allow_maintainer_edit": false,
+ "base": {
+ "label": "master",
+ "ref": "master",
+ "sha": "e344947180bbfd667ac572176727f799349815db",
+ "repo_id": 123634,
+ "repo": {
+ "id": 123634,
+ "owner": {
+ "id": 102463,
+ "login": "poezio",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "",
+ "avatar_url": "https://codeberg.org/avatars/b9b08e0933aaa3579fb616166718292652ae8b70457e50de3a46c1e412f99631",
+ "html_url": "https://codeberg.org/poezio",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2023-06-17T14:35:46Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "cyberspace",
+ "pronouns": "",
+ "website": "",
+ "description": "Organization for poezio \u0026 slixmpp",
+ "visibility": "public",
+ "followers_count": 3,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "poezio"
+ },
+ "name": "slixmpp",
+ "full_name": "poezio/slixmpp",
+ "description": "Modern python XMPP library using asyncio.",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 12914,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/poezio/slixmpp/languages",
+ "html_url": "https://codeberg.org/poezio/slixmpp",
+ "url": "https://codeberg.org/api/v1/repos/poezio/slixmpp",
+ "link": "",
+ "ssh_url": "git@codeberg.org:poezio/slixmpp.git",
+ "clone_url": "https://codeberg.org/poezio/slixmpp.git",
+ "original_url": "https://lab.louiz.org/poezio/slixmpp",
+ "website": "",
+ "stars_count": 14,
+ "forks_count": 9,
+ "watchers_count": 6,
+ "open_issues_count": 51,
+ "open_pr_counter": 12,
+ "release_counter": 10,
+ "default_branch": "master",
+ "archived": false,
+ "created_at": "2023-07-06T09:10:25Z",
+ "updated_at": "2025-02-13T22:17:56Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": true,
+ "push": true,
+ "pull": true
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": true,
+ "wiki_branch": "master",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": true,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": false,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": false,
+ "default_merge_style": "merge",
+ "default_allow_maintainer_edit": false,
+ "default_update_style": "merge",
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "python",
+ "library",
+ "xmpp",
+ "jabber",
+ "asyncio"
+ ]
+ }
+ },
+ "head": {
+ "label": "add-xep-0410",
+ "ref": "add-xep-0410",
+ "sha": "d768dfdc4b2f52570adfd0cdfc5480eafd5b258b",
+ "repo_id": 123634,
+ "repo": {
+ "id": 123634,
+ "owner": {
+ "id": 102463,
+ "login": "poezio",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "",
+ "avatar_url": "https://codeberg.org/avatars/b9b08e0933aaa3579fb616166718292652ae8b70457e50de3a46c1e412f99631",
+ "html_url": "https://codeberg.org/poezio",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2023-06-17T14:35:46Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "cyberspace",
+ "pronouns": "",
+ "website": "",
+ "description": "Organization for poezio \u0026 slixmpp",
+ "visibility": "public",
+ "followers_count": 3,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "poezio"
+ },
+ "name": "slixmpp",
+ "full_name": "poezio/slixmpp",
+ "description": "Modern python XMPP library using asyncio.",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 12914,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/poezio/slixmpp/languages",
+ "html_url": "https://codeberg.org/poezio/slixmpp",
+ "url": "https://codeberg.org/api/v1/repos/poezio/slixmpp",
+ "link": "",
+ "ssh_url": "git@codeberg.org:poezio/slixmpp.git",
+ "clone_url": "https://codeberg.org/poezio/slixmpp.git",
+ "original_url": "https://lab.louiz.org/poezio/slixmpp",
+ "website": "",
+ "stars_count": 14,
+ "forks_count": 9,
+ "watchers_count": 6,
+ "open_issues_count": 51,
+ "open_pr_counter": 12,
+ "release_counter": 10,
+ "default_branch": "master",
+ "archived": false,
+ "created_at": "2023-07-06T09:10:25Z",
+ "updated_at": "2025-02-13T22:17:56Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": true,
+ "push": true,
+ "pull": true
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": true,
+ "wiki_branch": "master",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": true,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": false,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": false,
+ "default_merge_style": "merge",
+ "default_allow_maintainer_edit": false,
+ "default_update_style": "merge",
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "python",
+ "library",
+ "xmpp",
+ "jabber",
+ "asyncio"
+ ]
+ }
+ },
+ "merge_base": "e344947180bbfd667ac572176727f799349815db",
+ "due_date": null,
+ "created_at": "2025-02-13T22:18:10Z",
+ "updated_at": "2025-02-14T16:33:20Z",
+ "closed_at": null,
+ "pin_order": 0
+ },
+ "requested_reviewer": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 2,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ },
+ "repository": {
+ "id": 123634,
+ "owner": {
+ "id": 102463,
+ "login": "poezio",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "",
+ "avatar_url": "https://codeberg.org/avatars/b9b08e0933aaa3579fb616166718292652ae8b70457e50de3a46c1e412f99631",
+ "html_url": "https://codeberg.org/poezio",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2023-06-17T14:35:46Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "cyberspace",
+ "pronouns": "",
+ "website": "",
+ "description": "Organization for poezio \u0026 slixmpp",
+ "visibility": "public",
+ "followers_count": 3,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "poezio"
+ },
+ "name": "slixmpp",
+ "full_name": "poezio/slixmpp",
+ "description": "Modern python XMPP library using asyncio.",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 12914,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/poezio/slixmpp/languages",
+ "html_url": "https://codeberg.org/poezio/slixmpp",
+ "url": "https://codeberg.org/api/v1/repos/poezio/slixmpp",
+ "link": "",
+ "ssh_url": "git@codeberg.org:poezio/slixmpp.git",
+ "clone_url": "https://codeberg.org/poezio/slixmpp.git",
+ "original_url": "https://lab.louiz.org/poezio/slixmpp",
+ "website": "",
+ "stars_count": 14,
+ "forks_count": 9,
+ "watchers_count": 6,
+ "open_issues_count": 51,
+ "open_pr_counter": 12,
+ "release_counter": 10,
+ "default_branch": "master",
+ "archived": false,
+ "created_at": "2023-07-06T09:10:25Z",
+ "updated_at": "2025-02-13T22:17:56Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": true,
+ "push": true,
+ "pull": true
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": true,
+ "wiki_branch": "master",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": true,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": false,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": false,
+ "default_merge_style": "merge",
+ "default_allow_maintainer_edit": false,
+ "default_update_style": "merge",
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "python",
+ "library",
+ "xmpp",
+ "jabber",
+ "asyncio"
+ ]
+ },
+ "sender": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 2,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ },
+ "commit_id": "",
+ "review": {
+ "type": "pull_request_review_rejected",
+ "content": "I spotted one typo, that review was not completely useless, YEAH!\r\n\r\nYou mentioned oob that you'd like more integration tests, maybe that plugin is a good candidate for them? Testing silent kick is probably near-impossible without a custom muc component, but the \"you're still joined\" path looks like it would be doable?"
+ }
+}
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/pull_request_rejected/headers
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/pull_request_rejected/headers Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,18 @@
+Content-Type: application/json
+X-Forgejo-Delivery: 55de0e6c-593b-41d1-b208-ea00efe818c6
+X-Forgejo-Event: pull_request_rejected
+X-Forgejo-Event-Type: pull_request_review_rejected
+X-Forgejo-Signature: 52c66875ee76c8aba327c8bad7122e109f0b24ddeb0c291f57e071637dc60ccc
+X-GitHub-Delivery: 55de0e6c-593b-41d1-b208-ea00efe818c6
+X-GitHub-Event: pull_request_rejected
+X-GitHub-Event-Type: pull_request_review_rejected
+X-Gitea-Delivery: 55de0e6c-593b-41d1-b208-ea00efe818c6
+X-Gitea-Event: pull_request_rejected
+X-Gitea-Event-Type: pull_request_review_rejected
+X-Gitea-Signature: 52c66875ee76c8aba327c8bad7122e109f0b24ddeb0c291f57e071637dc60ccc
+X-Gogs-Delivery: 55de0e6c-593b-41d1-b208-ea00efe818c6
+X-Gogs-Event: pull_request_rejected
+X-Gogs-Event-Type: pull_request_review_rejected
+X-Gogs-Signature: 52c66875ee76c8aba327c8bad7122e109f0b24ddeb0c291f57e071637dc60ccc
+X-Hub-Signature: sha1=ccb5a848dc0447d8a84b10308d5cc94d6a8dbad1
+X-Hub-Signature-256: sha256=52c66875ee76c8aba327c8bad7122e109f0b24ddeb0c291f57e071637dc60ccc
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/push/content.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/push/content.json Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,268 @@
+{
+ "ref": "refs/heads/dev",
+ "before": "3f8b7a2f69c6c891d8ab07700f113103db73faa3",
+ "after": "dd7c6923c788b38312fbc27cffba3b7007d0126e",
+ "compare_url": "https://codeberg.org/slidge/slidgram/compare/3f8b7a2f69c6c891d8ab07700f113103db73faa3...dd7c6923c788b38312fbc27cffba3b7007d0126e",
+ "commits": [
+ {
+ "id": "dd7c6923c788b38312fbc27cffba3b7007d0126e",
+ "message": "build: update pre-commit hooks\n",
+ "url": "https://codeberg.org/slidge/slidgram/commit/dd7c6923c788b38312fbc27cffba3b7007d0126e",
+ "author": {
+ "name": "nicoco",
+ "email": "nicoco@nicoco.fr",
+ "username": "nicoco"
+ },
+ "committer": {
+ "name": "nicoco",
+ "email": "nicoco@nicoco.fr",
+ "username": "nicoco"
+ },
+ "verification": null,
+ "timestamp": "2025-01-16T13:33:08+01:00",
+ "added": [],
+ "removed": [],
+ "modified": [
+ ".pre-commit-config.yaml"
+ ]
+ },
+ {
+ "id": "790116333966f395cc268b032c7a6173486955f4",
+ "message": "chore: update lockfile\n\nbecause we must",
+ "url": "https://codeberg.org/slidge/slidgram/commit/790116333966f395cc268b032c7a6173486955f4",
+ "author": {
+ "name": "nicoco",
+ "email": "nicoco@nicoco.fr",
+ "username": "nicoco"
+ },
+ "committer": {
+ "name": "nicoco",
+ "email": "nicoco@nicoco.fr",
+ "username": "nicoco"
+ },
+ "verification": null,
+ "timestamp": "2025-01-13T15:47:16+01:00",
+ "added": [
+ "uv.lock"
+ ],
+ "removed": [],
+ "modified": []
+ },
+ {
+ "id": "776de82113f8a860408f78c22e8539e73306ac87",
+ "message": "ci: use woodpecker\n",
+ "url": "https://codeberg.org/slidge/slidgram/commit/776de82113f8a860408f78c22e8539e73306ac87",
+ "author": {
+ "name": "nicoco",
+ "email": "nicoco@nicoco.fr",
+ "username": "nicoco"
+ },
+ "committer": {
+ "name": "nicoco",
+ "email": "nicoco@nicoco.fr",
+ "username": "nicoco"
+ },
+ "verification": null,
+ "timestamp": "2025-01-11T15:57:59+01:00",
+ "added": [
+ ".woodpecker/container-ci.yaml",
+ ".woodpecker/container.yaml",
+ ".woodpecker/docs.yaml",
+ ".woodpecker/package.yaml",
+ ".woodpecker/test.yaml"
+ ],
+ "removed": [
+ ".builds/ci.yml",
+ ".builds/container.yml",
+ ".copier-answers.yml"
+ ],
+ "modified": [
+ ".gitignore",
+ "Dockerfile",
+ "README.md",
+ "docs/Makefile",
+ "docs/source/conf.py",
+ "pyproject.toml"
+ ]
+ }
+ ],
+ "total_commits": 3,
+ "head_commit": {
+ "id": "dd7c6923c788b38312fbc27cffba3b7007d0126e",
+ "message": "build: update pre-commit hooks\n",
+ "url": "https://codeberg.org/slidge/slidgram/commit/dd7c6923c788b38312fbc27cffba3b7007d0126e",
+ "author": {
+ "name": "nicoco",
+ "email": "nicoco@nicoco.fr",
+ "username": "nicoco"
+ },
+ "committer": {
+ "name": "nicoco",
+ "email": "nicoco@nicoco.fr",
+ "username": "nicoco"
+ },
+ "verification": null,
+ "timestamp": "2025-01-16T13:33:08+01:00",
+ "added": [],
+ "removed": [],
+ "modified": [
+ ".pre-commit-config.yaml"
+ ]
+ },
+ "repository": {
+ "id": 301703,
+ "owner": {
+ "id": 205842,
+ "login": "slidge",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "",
+ "avatar_url": "https://codeberg.org/avatars/aa0eeeb5fe173938bdc665be92bf605efa1e8f4a905bc3327e4d5c7eddf584e5",
+ "html_url": "https://codeberg.org/slidge",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2024-08-30T14:16:14Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "",
+ "pronouns": "",
+ "website": "https://slidge.im",
+ "description": "",
+ "visibility": "public",
+ "followers_count": 3,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "slidge"
+ },
+ "name": "slidgram",
+ "full_name": "slidge/slidgram",
+ "description": "A feature-rich Telegram to XMPP gateway",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 1561,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/slidge/slidgram/languages",
+ "html_url": "https://codeberg.org/slidge/slidgram",
+ "url": "https://codeberg.org/api/v1/repos/slidge/slidgram",
+ "link": "",
+ "ssh_url": "git@codeberg.org:slidge/slidgram.git",
+ "clone_url": "https://codeberg.org/slidge/slidgram.git",
+ "original_url": "",
+ "website": "",
+ "stars_count": 0,
+ "forks_count": 1,
+ "watchers_count": 3,
+ "open_issues_count": 7,
+ "open_pr_counter": 0,
+ "release_counter": 0,
+ "default_branch": "main",
+ "archived": false,
+ "created_at": "2025-01-10T09:19:40Z",
+ "updated_at": "2025-01-16T12:15:22Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": true,
+ "push": true,
+ "pull": true
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": false,
+ "wiki_branch": "main",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": false,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": true,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": false,
+ "default_merge_style": "merge",
+ "default_allow_maintainer_edit": false,
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "bridge",
+ "chat",
+ "gateway",
+ "instant-messaging",
+ "slidge",
+ "telegram",
+ "telegram-userbot",
+ "xmpp"
+ ]
+ },
+ "pusher": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 1,
+ "following_count": 0,
+ "starred_repos_count": 3,
+ "username": "nicoco"
+ },
+ "sender": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 1,
+ "following_count": 0,
+ "starred_repos_count": 3,
+ "username": "nicoco"
+ }
+}
\ No newline at end of file
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/push/headers
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/push/headers Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,18 @@
+Content-Type: application/json
+X-Forgejo-Delivery: eec91577-9e9a-4914-929e-b7870f77fd57
+X-Forgejo-Event: push
+X-Forgejo-Event-Type: push
+X-Forgejo-Signature: 0bd1c7325306a6f469df72d9966b2e89cebcf1fb790a1926ef9ff094141eed26
+X-GitHub-Delivery: eec91577-9e9a-4914-929e-b7870f77fd57
+X-GitHub-Event: push
+X-GitHub-Event-Type: push
+X-Gitea-Delivery: eec91577-9e9a-4914-929e-b7870f77fd57
+X-Gitea-Event: push
+X-Gitea-Event-Type: push
+X-Gitea-Signature: 0bd1c7325306a6f469df72d9966b2e89cebcf1fb790a1926ef9ff094141eed26
+X-Gogs-Delivery: eec91577-9e9a-4914-929e-b7870f77fd57
+X-Gogs-Event: push
+X-Gogs-Event-Type: push
+X-Gogs-Signature: 0bd1c7325306a6f469df72d9966b2e89cebcf1fb790a1926ef9ff094141eed26
+X-Hub-Signature: sha1=eacf3469341d9deecfcfbb3a63a4f1d55e60226c
+X-Hub-Signature-256: sha256=0bd1c7325306a6f469df72d9966b2e89cebcf1fb790a1926ef9ff094141eed26
\ No newline at end of file
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/push/slidge.rss
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/push/slidge.rss Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,341 @@
+
+
+ Feed of "slidge"
+ https://codeberg.org/slidge
+
+ Fri, 17 Jan 2025 12:15:21 +0000
+ -
+ aereaux commented on issue slidge/slidge#36
+ https://codeberg.org/slidge/slidge/issues/36#issuecomment-2590246
+ Error on startup
<p dir="auto">It does continue to run, but it doesn't set my avatar. I do seem to see my own avatar in group chats, at least in cheogram.</p>
+ It does continue to run, but it doesn't set my avatar. I do seem to see my own avatar in group chats, at least in cheogram.
+]]>
+ aereaux
+ 22108577: https://codeberg.org/slidge/slidge/issues/36#issuecomment-2590246
+ Thu, 16 Jan 2025 15:32:41 +0000
+
+ -
+ nicoco commented on issue slidge/slidge#36
+ https://codeberg.org/slidge/slidge/issues/36#issuecomment-2590128
+ Error on startup
<p dir="auto">I'm not sure why this happens but it is non fatal, right? I suspect you don't see your own avatar in group chats though.</p>
+ I'm not sure why this happens but it is non fatal, right? I suspect you don't see your own avatar in group chats though.
+]]>
+ nicoco
+ 22106314: https://codeberg.org/slidge/slidge/issues/36#issuecomment-2590128
+ Thu, 16 Jan 2025 14:28:29 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidgram
+ /slidge/slidgram/compare/3f8b7a2f69c6c891d8ab07700f113103db73faa3...dd7c6923c788b38312fbc27cffba3b7007d0126e
+ <a href="https://codeberg.org/slidge/slidgram/commit/dd7c6923c788b38312fbc27cffba3b7007d0126e">dd7c6923c788b38312fbc27cffba3b7007d0126e</a>
build: update pre-commit hooks
<a href="https://codeberg.org/slidge/slidgram/commit/790116333966f395cc268b032c7a6173486955f4">790116333966f395cc268b032c7a6173486955f4</a>
chore: update lockfile
<a href="https://codeberg.org/slidge/slidgram/commit/776de82113f8a860408f78c22e8539e73306ac87">776de82113f8a860408f78c22e8539e73306ac87</a>
ci: use woodpecker
+ dd7c6923c788b38312fbc27cffba3b7007d0126e
+build: update pre-commit hooks
+
+790116333966f395cc268b032c7a6173486955f4
+chore: update lockfile
+
+776de82113f8a860408f78c22e8539e73306ac87
+ci: use woodpecker]]>
+ nicoco
+ 22100038: /slidge/slidgram/compare/3f8b7a2f69c6c891d8ab07700f113103db73faa3...dd7c6923c788b38312fbc27cffba3b7007d0126e
+ Thu, 16 Jan 2025 12:40:29 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidgram
+ https://codeberg.org/slidge/slidgram/commit/3f8b7a2f69c6c891d8ab07700f113103db73faa3
+ <a href="https://codeberg.org/slidge/slidgram/commit/3f8b7a2f69c6c891d8ab07700f113103db73faa3">3f8b7a2f69c6c891d8ab07700f113103db73faa3</a>
fixup! ci: use woodpecker
+ 3f8b7a2f69c6c891d8ab07700f113103db73faa3
+fixup! ci: use woodpecker]]>
+ nicoco
+ 22099622: https://codeberg.org/slidge/slidgram/commit/3f8b7a2f69c6c891d8ab07700f113103db73faa3
+ Thu, 16 Jan 2025 12:15:22 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidgram
+ https://codeberg.org/slidge/slidgram/commit/6a1c45d27839cc1d4db0edd0fbe074171b89fcc0
+ <a href="https://codeberg.org/slidge/slidgram/commit/6a1c45d27839cc1d4db0edd0fbe074171b89fcc0">6a1c45d27839cc1d4db0edd0fbe074171b89fcc0</a>
fixup! ci: use woodpecker
+ 6a1c45d27839cc1d4db0edd0fbe074171b89fcc0
+fixup! ci: use woodpecker]]>
+ nicoco
+ 22099101: https://codeberg.org/slidge/slidgram/commit/6a1c45d27839cc1d4db0edd0fbe074171b89fcc0
+ Thu, 16 Jan 2025 11:53:46 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidgram
+ /slidge/slidgram/compare/2dfc9cc3916e91cf1db677771bc1a41ba55f50aa...d818b8518ce676361e3d694ff9b14ec86cb7e31c
+ <a href="https://codeberg.org/slidge/slidgram/commit/d818b8518ce676361e3d694ff9b14ec86cb7e31c">d818b8518ce676361e3d694ff9b14ec86cb7e31c</a>
fixup! ci: use woodpecker
<a href="https://codeberg.org/slidge/slidgram/commit/2e52e2170caeb1a2ac28635dd766e32a79dcbae9">2e52e2170caeb1a2ac28635dd766e32a79dcbae9</a>
chore: update lockfile
<a href="https://codeberg.org/slidge/slidgram/commit/31d0ee7595b08be34255add47e2b569ba1b05ac4">31d0ee7595b08be34255add47e2b569ba1b05ac4</a>
fixup! ci: use woodpecker
<a href="https://codeberg.org/slidge/slidgram/commit/e8530a185c5a783b1a98a3183326b1954f92997b">e8530a185c5a783b1a98a3183326b1954f92997b</a>
chore: update lockfile
<a href="https://codeberg.org/slidge/slidgram/commit/acf27d0ca32c4e193451fcb5025db0e9820380f8">acf27d0ca32c4e193451fcb5025db0e9820380f8</a>
ci: use woodpecker
+ d818b8518ce676361e3d694ff9b14ec86cb7e31c
+fixup! ci: use woodpecker
+
+2e52e2170caeb1a2ac28635dd766e32a79dcbae9
+chore: update lockfile
+
+31d0ee7595b08be34255add47e2b569ba1b05ac4
+fixup! ci: use woodpecker
+
+e8530a185c5a783b1a98a3183326b1954f92997b
+chore: update lockfile
+
+acf27d0ca32c4e193451fcb5025db0e9820380f8
+ci: use woodpecker]]>
+ nicoco
+ 22099034: /slidge/slidgram/compare/2dfc9cc3916e91cf1db677771bc1a41ba55f50aa...d818b8518ce676361e3d694ff9b14ec86cb7e31c
+ Thu, 16 Jan 2025 11:49:45 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ /slidge/slidge/compare/f2700e77b26f3a1391a3bcecc0db758398b9db73...9440989ef8c9b751eb4153f1e20e55627f8f548e
+ <a href="https://codeberg.org/slidge/slidge/commit/9440989ef8c9b751eb4153f1e20e55627f8f548e">9440989ef8c9b751eb4153f1e20e55627f8f548e</a>
docs: readme: freshen up
<a href="https://codeberg.org/slidge/slidge/commit/43ea9bf36f1d74e09154e0a9d46e5f67e778fb74">43ea9bf36f1d74e09154e0a9d46e5f67e778fb74</a>
ci: factorisation, cron jobs, manual pipelines
+ 9440989ef8c9b751eb4153f1e20e55627f8f548e
+docs: readme: freshen up
+
+43ea9bf36f1d74e09154e0a9d46e5f67e778fb74
+ci: factorisation, cron jobs, manual pipelines]]>
+ nicoco
+ 22097690: /slidge/slidge/compare/f2700e77b26f3a1391a3bcecc0db758398b9db73...9440989ef8c9b751eb4153f1e20e55627f8f548e
+ Thu, 16 Jan 2025 10:42:40 +0000
+
+ -
+ nicoco deleted branch buildx from slidge/slidge
+ https://codeberg.org/slidge/slidge
+
+ nicoco
+ 22096886: https://codeberg.org/slidge/slidge
+ Thu, 16 Jan 2025 10:13:13 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/f2700e77b26f3a1391a3bcecc0db758398b9db73
+ <a href="https://codeberg.org/slidge/slidge/commit/f2700e77b26f3a1391a3bcecc0db758398b9db73">f2700e77b26f3a1391a3bcecc0db758398b9db73</a>
ci: cache virtualenv; factorisation
+ f2700e77b26f3a1391a3bcecc0db758398b9db73
+ci: cache virtualenv; factorisation]]>
+ nicoco
+ 22096805: https://codeberg.org/slidge/slidge/commit/f2700e77b26f3a1391a3bcecc0db758398b9db73
+ Thu, 16 Jan 2025 10:08:14 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/b25334774b74b5d88572694a10ecf451282639b4
+ <a href="https://codeberg.org/slidge/slidge/commit/b25334774b74b5d88572694a10ecf451282639b4">b25334774b74b5d88572694a10ecf451282639b4</a>
fixup! ci
+ b25334774b74b5d88572694a10ecf451282639b4
+fixup! ci]]>
+ nicoco
+ 22096514: https://codeberg.org/slidge/slidge/commit/b25334774b74b5d88572694a10ecf451282639b4
+ Thu, 16 Jan 2025 09:51:06 +0000
+
+ -
+ c3p0-slidge pushed to main at slidge/pages
+ https://codeberg.org/slidge/pages/commit/4688fe65212fee04717f4b466185ba05ac0ccba0
+ <a href="https://codeberg.org/slidge/pages/commit/4688fe65212fee04717f4b466185ba05ac0ccba0">4688fe65212fee04717f4b466185ba05ac0ccba0</a>
deploy docs for 03adac6ec948d70934756626ce9183b9321523dc
+ 4688fe65212fee04717f4b466185ba05ac0ccba0
+deploy docs for 03adac6ec948d70934756626ce9183b9321523dc]]>
+ c3p0-slidge
+ 22096350: https://codeberg.org/slidge/pages/commit/4688fe65212fee04717f4b466185ba05ac0ccba0
+ Thu, 16 Jan 2025 09:40:36 +0000
+
+ -
+ c3p0-slidge pushed to main at slidge/pages
+ https://codeberg.org/slidge/pages/commit/c9ae413a9966ff51af5d4d4281e74001a1e8677d
+ <a href="https://codeberg.org/slidge/pages/commit/c9ae413a9966ff51af5d4d4281e74001a1e8677d">c9ae413a9966ff51af5d4d4281e74001a1e8677d</a>
deploy docs for 03adac6ec948d70934756626ce9183b9321523dc
+ c9ae413a9966ff51af5d4d4281e74001a1e8677d
+deploy docs for 03adac6ec948d70934756626ce9183b9321523dc]]>
+ c3p0-slidge
+ 22096294: https://codeberg.org/slidge/pages/commit/c9ae413a9966ff51af5d4d4281e74001a1e8677d
+ Thu, 16 Jan 2025 09:38:07 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/03adac6ec948d70934756626ce9183b9321523dc
+ <a href="https://codeberg.org/slidge/slidge/commit/03adac6ec948d70934756626ce9183b9321523dc">03adac6ec948d70934756626ce9183b9321523dc</a>
fixup! ci
+ 03adac6ec948d70934756626ce9183b9321523dc
+fixup! ci]]>
+ nicoco
+ 22096251: https://codeberg.org/slidge/slidge/commit/03adac6ec948d70934756626ce9183b9321523dc
+ Thu, 16 Jan 2025 09:36:07 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/6e945b3eae118271d19c5d94aa1bdbe8006b0267
+ <a href="https://codeberg.org/slidge/slidge/commit/6e945b3eae118271d19c5d94aa1bdbe8006b0267">6e945b3eae118271d19c5d94aa1bdbe8006b0267</a>
fixup! ci
+ 6e945b3eae118271d19c5d94aa1bdbe8006b0267
+fixup! ci]]>
+ nicoco
+ 22095628: https://codeberg.org/slidge/slidge/commit/6e945b3eae118271d19c5d94aa1bdbe8006b0267
+ Thu, 16 Jan 2025 09:17:04 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/e27df12d6d6a950c4d6ba28c568f6d45fb7456ea
+ <a href="https://codeberg.org/slidge/slidge/commit/e27df12d6d6a950c4d6ba28c568f6d45fb7456ea">e27df12d6d6a950c4d6ba28c568f6d45fb7456ea</a>
fixup! ci
+ e27df12d6d6a950c4d6ba28c568f6d45fb7456ea
+fixup! ci]]>
+ nicoco
+ 22095366: https://codeberg.org/slidge/slidge/commit/e27df12d6d6a950c4d6ba28c568f6d45fb7456ea
+ Thu, 16 Jan 2025 09:02:26 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/f2c028957dbf2447ae54a0e7d9e94b7145d856d1
+ <a href="https://codeberg.org/slidge/slidge/commit/f2c028957dbf2447ae54a0e7d9e94b7145d856d1">f2c028957dbf2447ae54a0e7d9e94b7145d856d1</a>
fixup! ci
+ f2c028957dbf2447ae54a0e7d9e94b7145d856d1
+fixup! ci]]>
+ nicoco
+ 22094639: https://codeberg.org/slidge/slidge/commit/f2c028957dbf2447ae54a0e7d9e94b7145d856d1
+ Thu, 16 Jan 2025 08:34:20 +0000
+
+ -
+ nicoco pushed to buildx at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/6c6a79b6b74c684585fca23910d29859253741e4
+ <a href="https://codeberg.org/slidge/slidge/commit/6c6a79b6b74c684585fca23910d29859253741e4">6c6a79b6b74c684585fca23910d29859253741e4</a>
ci: fix auth
+ 6c6a79b6b74c684585fca23910d29859253741e4
+ci: fix auth]]>
+ nicoco
+ 22094450: https://codeberg.org/slidge/slidge/commit/6c6a79b6b74c684585fca23910d29859253741e4
+ Thu, 16 Jan 2025 08:26:14 +0000
+
+ -
+ nicoco pushed to buildx at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/af5cb61652c159ea382a3df7cc0711df82e2c6f3
+ <a href="https://codeberg.org/slidge/slidge/commit/af5cb61652c159ea382a3df7cc0711df82e2c6f3">af5cb61652c159ea382a3df7cc0711df82e2c6f3</a>
ci: just build all the time
+ af5cb61652c159ea382a3df7cc0711df82e2c6f3
+ci: just build all the time]]>
+ nicoco
+ 22094328: https://codeberg.org/slidge/slidge/commit/af5cb61652c159ea382a3df7cc0711df82e2c6f3
+ Thu, 16 Jan 2025 08:18:02 +0000
+
+ -
+ nicoco pushed to buildx at slidge/slidge
+ /slidge/slidge/compare/6e77ed7510a1dfd23f35b81affc90ded895515e6...3efecf7655b24623a122170b872782ac9cab9344
+ <a href="https://codeberg.org/slidge/slidge/commit/3efecf7655b24623a122170b872782ac9cab9344">3efecf7655b24623a122170b872782ac9cab9344</a>
feat: allow multiple values for --cache-from
<a href="https://codeberg.org/slidge/slidge/commit/d689954ee5afee840d9c3ccb37eeb434c5554325">d689954ee5afee840d9c3ccb37eeb434c5554325</a>
chore(deps): update docker.io/mstruebing/editorconfig-checker docker tag to v3.1.2
<a href="https://codeberg.org/slidge/slidge/commit/3e6c614b92c907987cf50029eb4512dba44dadd2">3e6c614b92c907987cf50029eb4512dba44dadd2</a>
fix(deps): update module github.com/go-git/go-git/v5 to v5.13.1
<a href="https://codeberg.org/slidge/slidge/commit/9ff0fa678dccd7fc4be7cace72073b8d5fefd60a">9ff0fa678dccd7fc4be7cace72073b8d5fefd60a</a>
chore(deps): update davidanson/markdownlint-cli2 docker tag to v0.17.1
<a href="https://codeberg.org/slidge/slidge/commit/c8666a5831ecafa5c60450128f459191cd94c88a">c8666a5831ecafa5c60450128f459191cd94c88a</a>
fix(deps): update module github.com/go-git/go-git/v5 to v5.13.0
+ 3efecf7655b24623a122170b872782ac9cab9344
+feat: allow multiple values for --cache-from
+
+d689954ee5afee840d9c3ccb37eeb434c5554325
+chore(deps): update docker.io/mstruebing/editorconfig-checker docker tag to v3.1.2
+
+3e6c614b92c907987cf50029eb4512dba44dadd2
+fix(deps): update module github.com/go-git/go-git/v5 to v5.13.1
+
+9ff0fa678dccd7fc4be7cace72073b8d5fefd60a
+chore(deps): update davidanson/markdownlint-cli2 docker tag to v0.17.1
+
+c8666a5831ecafa5c60450128f459191cd94c88a
+fix(deps): update module github.com/go-git/go-git/v5 to v5.13.0]]>
+ nicoco
+ 22094312: /slidge/slidge/compare/6e77ed7510a1dfd23f35b81affc90ded895515e6...3efecf7655b24623a122170b872782ac9cab9344
+ Thu, 16 Jan 2025 08:16:32 +0000
+
+ -
+ nicoco created branch buildx in slidge/slidge
+ https://codeberg.org/slidge/slidge/src/branch/buildx
+
+ nicoco
+ 22094307: https://codeberg.org/slidge/slidge/src/branch/buildx
+ Thu, 16 Jan 2025 08:16:31 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/97a2c6d48ec1fc2fd085c3e4ff49ac60a17a76f9
+ <a href="https://codeberg.org/slidge/slidge/commit/97a2c6d48ec1fc2fd085c3e4ff49ac60a17a76f9">97a2c6d48ec1fc2fd085c3e4ff49ac60a17a76f9</a>
fixup! ci
+ 97a2c6d48ec1fc2fd085c3e4ff49ac60a17a76f9
+fixup! ci]]>
+ nicoco
+ 22077338: https://codeberg.org/slidge/slidge/commit/97a2c6d48ec1fc2fd085c3e4ff49ac60a17a76f9
+ Wed, 15 Jan 2025 21:03:37 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/3100ed625b7c10eac11161b0aa89f8947ed93df9
+ <a href="https://codeberg.org/slidge/slidge/commit/3100ed625b7c10eac11161b0aa89f8947ed93df9">3100ed625b7c10eac11161b0aa89f8947ed93df9</a>
fixup! ci
+ 3100ed625b7c10eac11161b0aa89f8947ed93df9
+fixup! ci]]>
+ nicoco
+ 22077169: https://codeberg.org/slidge/slidge/commit/3100ed625b7c10eac11161b0aa89f8947ed93df9
+ Wed, 15 Jan 2025 20:57:50 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/f1b58dc97cd7ecef06d4a37466021854ff32d801
+ <a href="https://codeberg.org/slidge/slidge/commit/f1b58dc97cd7ecef06d4a37466021854ff32d801">f1b58dc97cd7ecef06d4a37466021854ff32d801</a>
fixup! ci
+ f1b58dc97cd7ecef06d4a37466021854ff32d801
+fixup! ci]]>
+ nicoco
+ 22076086: https://codeberg.org/slidge/slidge/commit/f1b58dc97cd7ecef06d4a37466021854ff32d801
+ Wed, 15 Jan 2025 20:22:45 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/c3445fd943872f214535621e901aaa364ed7f195
+ <a href="https://codeberg.org/slidge/slidge/commit/c3445fd943872f214535621e901aaa364ed7f195">c3445fd943872f214535621e901aaa364ed7f195</a>
fixup! ci
+ c3445fd943872f214535621e901aaa364ed7f195
+fixup! ci]]>
+ nicoco
+ 22075973: https://codeberg.org/slidge/slidge/commit/c3445fd943872f214535621e901aaa364ed7f195
+ Wed, 15 Jan 2025 20:15:09 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/ff2e19117bc440b1de05acc78a4c6f0c6f072262
+ <a href="https://codeberg.org/slidge/slidge/commit/ff2e19117bc440b1de05acc78a4c6f0c6f072262">ff2e19117bc440b1de05acc78a4c6f0c6f072262</a>
fixup! ci
+ ff2e19117bc440b1de05acc78a4c6f0c6f072262
+fixup! ci]]>
+ nicoco
+ 22075651: https://codeberg.org/slidge/slidge/commit/ff2e19117bc440b1de05acc78a4c6f0c6f072262
+ Wed, 15 Jan 2025 19:59:07 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/c18cdbb3238b81ba30b259c5e31de843e0014d6f
+ <a href="https://codeberg.org/slidge/slidge/commit/c18cdbb3238b81ba30b259c5e31de843e0014d6f">c18cdbb3238b81ba30b259c5e31de843e0014d6f</a>
fixup! ci
+ c18cdbb3238b81ba30b259c5e31de843e0014d6f
+fixup! ci]]>
+ nicoco
+ 22075168: https://codeberg.org/slidge/slidge/commit/c18cdbb3238b81ba30b259c5e31de843e0014d6f
+ Wed, 15 Jan 2025 19:45:33 +0000
+
+ -
+ c3p0-slidge pushed to main at slidge/pages
+ https://codeberg.org/slidge/pages/commit/40966a722929d092bb3eebc4729dfa73d47fde6d
+ <a href="https://codeberg.org/slidge/pages/commit/40966a722929d092bb3eebc4729dfa73d47fde6d">40966a722929d092bb3eebc4729dfa73d47fde6d</a>
deploy docs for dfa0cd369d50fac8a4afb121a0a84dd43b310da7
+ 40966a722929d092bb3eebc4729dfa73d47fde6d
+deploy docs for dfa0cd369d50fac8a4afb121a0a84dd43b310da7]]>
+ c3p0-slidge
+ 22068872: https://codeberg.org/slidge/pages/commit/40966a722929d092bb3eebc4729dfa73d47fde6d
+ Wed, 15 Jan 2025 15:54:01 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/dfa0cd369d50fac8a4afb121a0a84dd43b310da7
+ <a href="https://codeberg.org/slidge/slidge/commit/dfa0cd369d50fac8a4afb121a0a84dd43b310da7">dfa0cd369d50fac8a4afb121a0a84dd43b310da7</a>
fixup! ci
+ dfa0cd369d50fac8a4afb121a0a84dd43b310da7
+fixup! ci]]>
+ nicoco
+ 22063456: https://codeberg.org/slidge/slidge/commit/dfa0cd369d50fac8a4afb121a0a84dd43b310da7
+ Wed, 15 Jan 2025 14:27:05 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/3686603bae3b714f831e11714e0774707c26562b
+ <a href="https://codeberg.org/slidge/slidge/commit/3686603bae3b714f831e11714e0774707c26562b">3686603bae3b714f831e11714e0774707c26562b</a>
fixup! ci
+ 3686603bae3b714f831e11714e0774707c26562b
+fixup! ci]]>
+ nicoco
+ 22063164: https://codeberg.org/slidge/slidge/commit/3686603bae3b714f831e11714e0774707c26562b
+ Wed, 15 Jan 2025 14:23:05 +0000
+
+ -
+ nicoco pushed to dev at slidge/slidge
+ https://codeberg.org/slidge/slidge/commit/c6387ee4f1303de3cc3d1d1d0857c9062cbae795
+ <a href="https://codeberg.org/slidge/slidge/commit/c6387ee4f1303de3cc3d1d1d0857c9062cbae795">c6387ee4f1303de3cc3d1d1d0857c9062cbae795</a>
fixup! ci
+ c6387ee4f1303de3cc3d1d1d0857c9062cbae795
+fixup! ci]]>
+ nicoco
+ 22063114: https://codeberg.org/slidge/slidge/commit/c6387ee4f1303de3cc3d1d1d0857c9062cbae795
+ Wed, 15 Jan 2025 14:20:08 +0000
+
+
+
\ No newline at end of file
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/push_tag/content.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/push_tag/content.json Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,185 @@
+{
+ "ref": "refs/tags/v0.2.0",
+ "before": "0000000000000000000000000000000000000000",
+ "after": "add5585f1b71de317aac5c54163ddb76c71856c6",
+ "compare_url": "https://codeberg.org/slidge/slidcord/compare/0000000000000000000000000000000000000000...add5585f1b71de317aac5c54163ddb76c71856c6",
+ "commits": [],
+ "total_commits": 0,
+ "head_commit": {
+ "id": "add5585f1b71de317aac5c54163ddb76c71856c6",
+ "message": "docs(readme): fix broken link to docs\n",
+ "url": "https://codeberg.org/slidge/slidcord/commit/add5585f1b71de317aac5c54163ddb76c71856c6",
+ "author": {
+ "name": "nicoco",
+ "email": "nicoco@nicoco.fr",
+ "username": "nicoco"
+ },
+ "committer": {
+ "name": "nicoco",
+ "email": "nicoco@nicoco.fr",
+ "username": "nicoco"
+ },
+ "verification": null,
+ "timestamp": "2025-02-08T14:07:44+01:00",
+ "added": [],
+ "removed": [],
+ "modified": [
+ "README.md"
+ ]
+ },
+ "repository": {
+ "id": 301856,
+ "owner": {
+ "id": 205842,
+ "login": "slidge",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "",
+ "avatar_url": "https://codeberg.org/avatars/aa0eeeb5fe173938bdc665be92bf605efa1e8f4a905bc3327e4d5c7eddf584e5",
+ "html_url": "https://codeberg.org/slidge",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2024-08-30T14:16:14Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "",
+ "pronouns": "",
+ "website": "https://slidge.im",
+ "description": "",
+ "visibility": "public",
+ "followers_count": 4,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "slidge"
+ },
+ "name": "slidcord",
+ "full_name": "slidge/slidcord",
+ "description": "A feature-rich Discord to XMPP gateway",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 847,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/slidge/slidcord/languages",
+ "html_url": "https://codeberg.org/slidge/slidcord",
+ "url": "https://codeberg.org/api/v1/repos/slidge/slidcord",
+ "link": "",
+ "ssh_url": "git@codeberg.org:slidge/slidcord.git",
+ "clone_url": "https://codeberg.org/slidge/slidcord.git",
+ "original_url": "",
+ "website": "",
+ "stars_count": 0,
+ "forks_count": 0,
+ "watchers_count": 6,
+ "open_issues_count": 5,
+ "open_pr_counter": 0,
+ "release_counter": 0,
+ "default_branch": "main",
+ "archived": false,
+ "created_at": "2025-01-10T14:38:08Z",
+ "updated_at": "2025-02-04T19:37:54Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": true,
+ "push": true,
+ "pull": true
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": false,
+ "wiki_branch": "main",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": false,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": true,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": false,
+ "default_merge_style": "merge",
+ "default_allow_maintainer_edit": false,
+ "default_update_style": "merge",
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "bridge",
+ "discord",
+ "gateway",
+ "instant-messaging",
+ "slidge",
+ "xmpp"
+ ]
+ },
+ "pusher": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 2,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ },
+ "sender": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 2,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ }
+}
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/push_tag/headers
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/push_tag/headers Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,18 @@
+Content-Type: application/json
+X-Forgejo-Delivery: 82ddd28b-377f-487d-b0f7-e494db9cd763
+X-Forgejo-Event: push
+X-Forgejo-Event-Type: push
+X-Forgejo-Signature: 1cd5728a0b2e218c8dce3d706a2bdaaddcd9c32a0bad383d3762b95e2eef33c4
+X-GitHub-Delivery: 82ddd28b-377f-487d-b0f7-e494db9cd763
+X-GitHub-Event: push
+X-GitHub-Event-Type: push
+X-Gitea-Delivery: 82ddd28b-377f-487d-b0f7-e494db9cd763
+X-Gitea-Event: push
+X-Gitea-Event-Type: push
+X-Gitea-Signature: 1cd5728a0b2e218c8dce3d706a2bdaaddcd9c32a0bad383d3762b95e2eef33c4
+X-Gogs-Delivery: 82ddd28b-377f-487d-b0f7-e494db9cd763
+X-Gogs-Event: push
+X-Gogs-Event-Type: push
+X-Gogs-Signature: 1cd5728a0b2e218c8dce3d706a2bdaaddcd9c32a0bad383d3762b95e2eef33c4
+X-Hub-Signature: sha1=c8cc4aae9018b74a97f46c8766f9d5b85530baa1
+X-Hub-Signature-256: sha256=1cd5728a0b2e218c8dce3d706a2bdaaddcd9c32a0
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/release/content.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/release/content.json Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,180 @@
+{
+ "action": "published",
+ "release": {
+ "id": 2802402,
+ "tag_name": "v0.2.0",
+ "target_commitish": "main",
+ "name": "broken",
+ "body": "It's broken! But I want to test the release webhook.",
+ "url": "https://codeberg.org/api/v1/repos/slidge/slidgnal/releases/2802402",
+ "html_url": "https://codeberg.org/slidge/slidgnal/releases/tag/v0.2.0",
+ "tarball_url": "https://codeberg.org/slidge/slidgnal/archive/v0.2.0.tar.gz",
+ "zipball_url": "https://codeberg.org/slidge/slidgnal/archive/v0.2.0.zip",
+ "hide_archive_links": false,
+ "upload_url": "https://codeberg.org/api/v1/repos/slidge/slidgnal/releases/2802402/assets",
+ "draft": false,
+ "prerelease": false,
+ "created_at": "2025-02-10T23:19:23Z",
+ "published_at": "2025-02-10T23:19:23Z",
+ "author": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 2,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ },
+ "assets": [],
+ "archive_download_count": {
+ "zip": 0,
+ "tar_gz": 0
+ }
+ },
+ "repository": {
+ "id": 301855,
+ "owner": {
+ "id": 205842,
+ "login": "slidge",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "",
+ "avatar_url": "https://codeberg.org/avatars/aa0eeeb5fe173938bdc665be92bf605efa1e8f4a905bc3327e4d5c7eddf584e5",
+ "html_url": "https://codeberg.org/slidge",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2024-08-30T14:16:14Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "",
+ "pronouns": "",
+ "website": "https://slidge.im",
+ "description": "",
+ "visibility": "public",
+ "followers_count": 5,
+ "following_count": 0,
+ "starred_repos_count": 0,
+ "username": "slidge"
+ },
+ "name": "slidgnal",
+ "full_name": "slidge/slidgnal",
+ "description": "A feature-rich Signal to XMPP gateway",
+ "empty": false,
+ "private": false,
+ "fork": false,
+ "template": false,
+ "parent": null,
+ "mirror": false,
+ "size": 471,
+ "language": "",
+ "languages_url": "https://codeberg.org/api/v1/repos/slidge/slidgnal/languages",
+ "html_url": "https://codeberg.org/slidge/slidgnal",
+ "url": "https://codeberg.org/api/v1/repos/slidge/slidgnal",
+ "link": "",
+ "ssh_url": "git@codeberg.org:slidge/slidgnal.git",
+ "clone_url": "https://codeberg.org/slidge/slidgnal.git",
+ "original_url": "",
+ "website": "",
+ "stars_count": 0,
+ "forks_count": 0,
+ "watchers_count": 6,
+ "open_issues_count": 5,
+ "open_pr_counter": 0,
+ "release_counter": 1,
+ "default_branch": "main",
+ "archived": false,
+ "created_at": "2025-01-10T14:37:52Z",
+ "updated_at": "2025-02-09T06:26:00Z",
+ "archived_at": "1970-01-01T00:00:00Z",
+ "permissions": {
+ "admin": true,
+ "push": true,
+ "pull": true
+ },
+ "has_issues": true,
+ "internal_tracker": {
+ "enable_time_tracker": true,
+ "allow_only_contributors_to_track_time": true,
+ "enable_issue_dependencies": true
+ },
+ "has_wiki": false,
+ "wiki_branch": "main",
+ "globally_editable_wiki": false,
+ "has_pull_requests": true,
+ "has_projects": false,
+ "has_releases": true,
+ "has_packages": true,
+ "has_actions": false,
+ "ignore_whitespace_conflicts": false,
+ "allow_merge_commits": true,
+ "allow_rebase": true,
+ "allow_rebase_explicit": true,
+ "allow_squash_merge": true,
+ "allow_fast_forward_only_merge": true,
+ "allow_rebase_update": true,
+ "default_delete_branch_after_merge": false,
+ "default_merge_style": "merge",
+ "default_allow_maintainer_edit": false,
+ "default_update_style": "merge",
+ "avatar_url": "",
+ "internal": false,
+ "mirror_interval": "",
+ "object_format_name": "sha1",
+ "mirror_updated": "0001-01-01T00:00:00Z",
+ "repo_transfer": null,
+ "topics": [
+ "bridge",
+ "gateway",
+ "instant-messaging",
+ "signal",
+ "slidge",
+ "xmpp"
+ ]
+ },
+ "sender": {
+ "id": 64076,
+ "login": "nicoco",
+ "login_name": "",
+ "source_id": 0,
+ "full_name": "",
+ "email": "nicoco@noreply.codeberg.org",
+ "avatar_url": "https://codeberg.org/avatars/32a918ca7a66e4e484ee2ccc625dc6451da728355c060ed0ed54fa69d89224a5",
+ "html_url": "https://codeberg.org/nicoco",
+ "language": "",
+ "is_admin": false,
+ "last_login": "0001-01-01T00:00:00Z",
+ "created": "2022-09-12T11:13:13Z",
+ "restricted": false,
+ "active": false,
+ "prohibit_login": false,
+ "location": "Nice, France",
+ "pronouns": "",
+ "website": "https://nicoco.fr",
+ "description": "wannabe-hacker",
+ "visibility": "public",
+ "followers_count": 2,
+ "following_count": 0,
+ "starred_repos_count": 4,
+ "username": "nicoco"
+ }
+}
diff -r 6d5a19bdd718 -r 131b8bfbefb4 mod_pubsub_forgejo/webhook-examples/release/headers
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_forgejo/webhook-examples/release/headers Mon Feb 17 23:28:05 2025 +0100
@@ -0,0 +1,18 @@
+Content-Type: application/json
+X-Forgejo-Delivery: a5a5e377-23e0-4333-bd03-d6dac1f3e75c
+X-Forgejo-Event: release
+X-Forgejo-Event-Type: release
+X-Forgejo-Signature: 4a2ee940e19a1c16281ce219d23be37b7cf8c5ca45107658e560ab73e958b69b
+X-GitHub-Delivery: a5a5e377-23e0-4333-bd03-d6dac1f3e75c
+X-GitHub-Event: release
+X-GitHub-Event-Type: release
+X-Gitea-Delivery: a5a5e377-23e0-4333-bd03-d6dac1f3e75c
+X-Gitea-Event: release
+X-Gitea-Event-Type: release
+X-Gitea-Signature: 4a2ee940e19a1c16281ce219d23be37b7cf8c5ca45107658e560ab73e958b69b
+X-Gogs-Delivery: a5a5e377-23e0-4333-bd03-d6dac1f3e75c
+X-Gogs-Event: release
+X-Gogs-Event-Type: release
+X-Gogs-Signature: 4a2ee940e19a1c16281ce219d23be37b7cf8c5ca45107658e560ab73e958b69b
+X-Hub-Signature: sha1=c8e893eadcd047e87270bdf930088149948c5b1b
+X-Hub-Signature-256: sha256=4a2ee940e19a1c16281ce219d23be37b7cf8c5ca45107658e560ab73e958b69b
\ No newline at end of file