Archived
Add OpenProject Gitea integration plugin
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
This commit is contained in:
45 files changed
+2561
No files matched your search
@@ -0,0 +1,50 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
#-- copyright
|
||||
# OpenProject is an open source project management software.
|
||||
# Copyright (C) the OpenProject GmbH
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License version 3.
|
||||
#
|
||||
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
|
||||
# Copyright (C) 2006-2013 Jean-Philippe Lang
|
||||
# Copyright (C) 2010-2013 the ChiliProject Team
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
#++
|
||||
|
||||
module OpenProject
|
||||
module GiteaIntegration
|
||||
module Services
|
||||
module ParamsHelper
|
||||
private
|
||||
|
||||
EMPTY_AVATAR_URL = "https://www.gravatar.com/avatar/?d=mp"
|
||||
EMPTY_DESCRIPTION = "No description provided"
|
||||
|
||||
def avatar_url(raw_url)
|
||||
raw_url.presence || EMPTY_AVATAR_URL
|
||||
end
|
||||
|
||||
def description(raw_description)
|
||||
raw_description.presence || EMPTY_DESCRIPTION
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,60 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
#-- copyright
|
||||
# OpenProject is an open source project management software.
|
||||
# Copyright (C) the OpenProject GmbH
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License version 3.
|
||||
#
|
||||
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
|
||||
# Copyright (C) 2006-2013 Jean-Philippe Lang
|
||||
# Copyright (C) 2010-2013 the ChiliProject Team
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
#++
|
||||
|
||||
module OpenProject
|
||||
module GiteaIntegration
|
||||
module Services
|
||||
##
|
||||
# Takes user data from a Gitea webhook payload and stores it as a GiteaUser.
|
||||
# If the GiteaUser already exists, it is updated.
|
||||
class UpsertGiteaUser
|
||||
include ParamsHelper
|
||||
|
||||
def call(payload)
|
||||
GiteaUser.find_or_initialize_by(gitea_id: payload.id)
|
||||
.tap do |gitea_user|
|
||||
gitea_user.update!(extract_params(payload))
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def extract_params(payload)
|
||||
{
|
||||
gitea_id: payload.id,
|
||||
gitea_name: payload.full_name.presence || payload.login,
|
||||
gitea_login: payload.login,
|
||||
gitea_avatar_url: avatar_url(payload.avatar_url)
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,93 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
#-- copyright
|
||||
# OpenProject is an open source project management software.
|
||||
# Copyright (C) the OpenProject GmbH
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License version 3.
|
||||
#
|
||||
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
|
||||
# Copyright (C) 2006-2013 Jean-Philippe Lang
|
||||
# Copyright (C) 2010-2013 the ChiliProject Team
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
#++
|
||||
|
||||
module OpenProject
|
||||
module GiteaIntegration
|
||||
module Services
|
||||
class UpsertPullRequest
|
||||
include ParamsHelper
|
||||
|
||||
def call(payload, work_packages: [])
|
||||
find_or_initialize(payload).tap do |pr|
|
||||
pr.update!(work_packages: pr.work_packages | work_packages, **extract_params(payload))
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_or_initialize(payload)
|
||||
GiteaPullRequest.find_by_gitea_identifiers(
|
||||
id: payload.pull_request.number,
|
||||
url: payload.pull_request.html_url,
|
||||
initialize: true
|
||||
)
|
||||
end
|
||||
|
||||
# rubocop:disable Metrics/AbcSize
|
||||
def extract_params(payload)
|
||||
merged = payload.pull_request.merged?
|
||||
{
|
||||
gitea_id: payload.pull_request.number,
|
||||
gitea_user: gitea_user_record(payload.pull_request.user),
|
||||
number: payload.pull_request.number,
|
||||
gitea_html_url: payload.pull_request.html_url,
|
||||
gitea_updated_at: payload.pull_request.updated_at,
|
||||
state: pr_state(payload),
|
||||
title: payload.pull_request.title,
|
||||
body: description(payload.pull_request.body),
|
||||
repository: payload.repository.full_name,
|
||||
draft: payload.pull_request.draft?,
|
||||
merged:,
|
||||
merged_by: merged ? gitea_user_record(payload.pull_request.merged_by?) : nil,
|
||||
merged_at: merged ? payload.pull_request.merged_at? : nil,
|
||||
labels: Array(payload.pull_request.labels?).map { |l| extract_label(l) }
|
||||
}
|
||||
end
|
||||
# rubocop:enable Metrics/AbcSize
|
||||
|
||||
def pr_state(payload)
|
||||
return "merged" if payload.pull_request.merged?
|
||||
|
||||
payload.pull_request.state
|
||||
end
|
||||
|
||||
def extract_label(label)
|
||||
{ "name" => label["name"], "color" => "##{label["color"]}" }
|
||||
end
|
||||
|
||||
def gitea_user_record(payload)
|
||||
return if payload.blank?
|
||||
|
||||
::OpenProject::GiteaIntegration::Services::UpsertGiteaUser.new.call(payload)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in new issue
Block a user