diff --git a/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py b/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py index 527c73d1..0874214d 100644 --- a/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py +++ b/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py @@ -1,7 +1,10 @@ +from os.path import dirname,basename +import requests import flask from flask import stream_with_context from flask import send_file +from copr_common.enums import StatusEnum from coprs import app from coprs import db from coprs import forms @@ -27,7 +30,6 @@ from coprs.exceptions import (ActionInProgressException, ObjectNotFound, NoPacka InsufficientRightsException, MalformedArgumentException) - @coprs_ns.route("///packages/") @coprs_ns.route("/g///packages/") @req_with_copr @@ -122,6 +124,44 @@ def copr_rebuild_all_packages(copr): form=form, copr=copr) +@coprs_ns.route("///package//add_openeuler_pkg") +@coprs_ns.route("/g///package//add_openeuler_pkg") +@req_with_copr +def copr_add_openeuler_package(copr, package_name): + base_url = app.config.get("OPENEULER_PKG_ENDPOINT", "") + if not base_url: + flask.flash(f"Package contribute service is not configured.", "error") + return flask.redirect(helpers.copr_url("coprs_ns.copr_package", copr, package_name=package_name)) + + build = ComplexLogic.get_package_safe(copr, package_name).last_build(True) + if not build: + flask.flash(f"Package {package_name} doest not contain any successful build.", "error") + return flask.redirect(helpers.copr_url("coprs_ns.copr_package", copr, package_name=package_name)) + + src_rpm_url = "/".join([build.result_dir_url, basename(build.srpm_url)]) + if not requests.get(src_rpm_url).ok: + flask.flash(f"Package {package_name} srpm url{src_rpm_url} is invalid, maybe the build was pruned, please rebuild and try again.", "error") + return flask.redirect(helpers.copr_url("coprs_ns.copr_package", copr, package_name=package_name)) + + spec_url = "/".join([build.result_dir_url, f"{package_name}.spec"]) + if not requests.get(spec_url).ok: + bcs = build.get_chroots_by_status([StatusEnum("succeeded")]) + spec_url = "" + for bc in bcs: + tmp_url = "/".join([bc.result_dir_url, f"{package_name}.spec"]) + if requests.get(tmp_url).ok: + spec_url = tmp_url + break + if not spec_url: + flask.flash(f"Package {package_name} spec url is invalid, maybe the build was pruned, please rebuild and try again.", "error") + return flask.redirect(helpers.copr_url("coprs_ns.copr_package", copr, package_name=package_name)) + + pkg_url = flask.request.url_root + dirname(flask.request.path) + desc = f"This package is imported from EUR: {pkg_url}" + url = f"{base_url}?pkg_name={package_name}&desc={desc}&src_rpm_url={src_rpm_url}&spec_url={spec_url}&sig=ecopkg" + return flask.redirect(url) + + @coprs_ns.route("///package//rebuild") @coprs_ns.route("/g///package//rebuild") @req_with_copr