Source code for swh.web.save_origin_webhooks.sourceforge

# Copyright (C) 2022  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information

from typing import Tuple

import requests

from rest_framework.request import Request

from swh.web.save_origin_webhooks.generic_receiver import OriginSaveWebhookReceiver


[docs] class SourceforgeOriginSaveWebhookReceiver(OriginSaveWebhookReceiver): FORGE_TYPE = "SourceForge" WEBHOOK_GUIDE_URL = ( "https://sourceforge.net/blog/" "how-to-use-webhooks-for-git-mercurial-and-svn-repositories/" ) REPO_TYPES = "git, hg or svn" SOURCE_FORGE_API_PROJECT_URL_PATTERN = ( "https://sourceforge.net/rest/p/{project_name}" )
[docs] def is_forge_request(self, request: Request) -> bool: return ( request.headers.get("User-Agent", "") == "Allura Webhook (https://allura.apache.org/)" )
[docs] def is_push_event(self, request: Request) -> bool: # SourceForge only support webhooks for push events return True
[docs] def extract_repo_info(self, request: Request) -> Tuple[str, str, bool]: repo_url = "" visit_type = "" private = False project_full_name = request.data.get("repository", {}).get("full_name") if project_full_name: project_name = project_full_name.split("/")[2] project_api_url = self.SOURCE_FORGE_API_PROJECT_URL_PATTERN.format( project_name=project_name ) response = requests.get(project_api_url) if response.ok: project_data = response.json() private = project_data.get("private", False) for tool in project_data.get("tools", []): if tool.get("mount_point") == "code" and tool.get( "url", "" ).endswith(project_full_name): repo_url = tool.get( "clone_url_https_anon", tool.get("clone_url_ro", "") ) visit_type = tool.get("name", "") return repo_url, visit_type, private
api_origin_save_webhook_sourceforge = SourceforgeOriginSaveWebhookReceiver()