Bare numeric IDs like #10 still require OP# to avoid collision with
Gitea issue numbers. Semantic identifiers (PROJ-42 style) are
unambiguous and matched with or without the prefix, as well as via
full OpenProject URL.
Update the tab empty-state message accordingly.
- ClearOldGiteaPullRequestsJob: inherit from ApplicationJob (not CronJob)
and use find_each(&:destroy!) to match the GitHub/GitLab pattern
- Rename aggregated migration from 1016015 to 1023015 to avoid
collision with the recaptcha module migration
Implements a Gitea integration for OpenProject following the same
patterns as the bundled GitHub and GitLab integrations.
- Webhook endpoint at /webhooks/gitea with HMAC-SHA256 verification
- Handles pull_request and issue_comment events
- Links Gitea PRs to work packages via OP# references or URLs
- Posts journal comments on WPs for PR lifecycle events
- Gitea tab on the work package split view
- V3 API endpoint: GET /api/v3/work_packages/:id/gitea_pull_requests
- Admin settings UI for bot user and webhook secret
- Nightly cron job to clean up unlinked PR records