1
0
mirror of https://github.com/openSUSE/osc.git synced 2024-11-15 08:36:13 +01:00
github.com_openSUSE_osc/osc/obs_api/package.py

147 lines
4.4 KiB
Python

from ..util.models import * # pylint: disable=wildcard-import,unused-wildcard-import
from .flag import Flag
from .group_role import GroupRole
from .package_devel import PackageDevel
from .package_revision import PackageRevision
from .person_role import PersonRole
from .simple_flag import SimpleFlag
from .status import Status
class Package(XmlModel):
XML_TAG = "package"
name: str = Field(
xml_attribute=True,
)
project: str = Field(
xml_attribute=True,
)
title: str = Field()
description: str = Field()
devel: Optional[PackageDevel] = Field()
releasename: Optional[str] = Field()
person_list: Optional[List[PersonRole]] = Field(
xml_name="person",
)
group_list: Optional[List[GroupRole]] = Field(
xml_name="group",
)
lock: Optional[SimpleFlag] = Field()
build_list: Optional[List[Flag]] = Field(
xml_name="build",
xml_wrapped=True,
)
publish_list: Optional[List[Flag]] = Field(
xml_name="publish",
xml_wrapped=True,
)
useforbuild_list: Optional[List[Flag]] = Field(
xml_name="useforbuild",
xml_wrapped=True,
)
debuginfo_list: Optional[List[Flag]] = Field(
xml_name="debuginfo",
xml_wrapped=True,
)
binarydownload: Optional[SimpleFlag] = Field()
sourceaccess: Optional[SimpleFlag] = Field()
url: Optional[str] = Field()
scmsync: Optional[str] = Field()
bcntsynctag: Optional[str] = Field()
@classmethod
def from_api(cls, apiurl, project, package, *, rev=None):
# ``rev`` is metadata revision, not revision of the source code
url_path = ["source", project, package, "_meta"]
url_query = {
"rev": rev,
}
response = cls.xml_request("GET", apiurl, url_path, url_query)
return cls.from_file(response, apiurl=apiurl)
def to_api(self, apiurl, *, project=None, package=None):
project = project or self.project
package = package or self.name
url_path = ["source", project, package, "_meta"]
url_query = {}
response = self.xml_request("PUT", apiurl, url_path, url_query, data=self.to_string())
return Status.from_file(response, apiurl=apiurl)
@classmethod
def cmd_release(
cls,
apiurl: str,
project: str,
package: str,
*,
repository: Optional[str] = None,
arch: Optional[str] = None,
target_project: Optional[str] = None,
target_repository: Optional[str] = None,
setrelease: Optional[str] = None,
nodelay: Optional[bool] = None,
):
"""
POST /source/{project}/{package}?cmd=release
Release sources and binaries of a specified package.
:param apiurl: Full apiurl or its alias.
:param project: Project name.
:param package: Package name.
:param repository: Limit the release to the given repository.
:param arch: Limit the release to the given architecture.
:param target_project: The name of the release target project.
:param target_repository: The name of the release target repository.
:param setrelease: Tag the release with the given value.
:param nodelay: Do not delay the relase. If not set, the release will be delayed to be done later.
"""
url_path = ["source", project, package]
url_query = {
"cmd": "release",
"repository": repository,
"arch": arch,
"target_project": target_project,
"target_repository": target_repository,
"setrelease": setrelease,
"nodelay": nodelay,
}
response = cls.xml_request("POST", apiurl, url_path, url_query)
return Status.from_file(response, apiurl=apiurl)
@classmethod
def get_revision_list(cls, apiurl: str, project: str, package: str, deleted: Optional[bool] = None, meta: Optional[bool] = None):
from xml.etree import ElementTree as ET
url_path = ["source", project, package, "_history"]
url_query = {
"meta": meta,
"deleted": deleted,
}
response = cls.xml_request("GET", apiurl, url_path, url_query)
root = ET.parse(response).getroot()
assert root.tag == "revisionlist"
result = []
for node in root:
result.append(PackageRevision.from_xml(node, apiurl=apiurl))
return result