Skip to content

Commit d518992

Browse files
chore(deps): updated pip modules
1 parent dabfc43 commit d518992

File tree

1 file changed

+120
-120
lines changed

1 file changed

+120
-120
lines changed

lib/get_latest_version/rpm.py

Lines changed: 120 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,120 @@
1-
# SPDX-FileCopyrightText: 2023-2025 Jisc Services Limited
2-
# SPDX-FileContributor: Joe Pitt
3-
#
4-
# SPDX-License-Identifier: GPL-3.0-only
5-
6-
"""Get latest version information from RPM packages."""
7-
8-
from gzip import open as gzip_open
9-
from io import BytesIO
10-
from typing import Dict, List, Optional
11-
12-
from defusedxml import ElementTree
13-
from requests import get, RequestException
14-
from semver import Version
15-
16-
from . import __version__
17-
from .functions import clean_version, find_latest
18-
19-
20-
def get_latest_from_rpm_repo(
21-
mirror_list_url: str,
22-
package_name: str,
23-
*,
24-
package_arch: str = "x86_64",
25-
greater_equal_version: Optional[Version] = None,
26-
less_than_version: Optional[Version] = None,
27-
) -> str:
28-
"""Get the latest available version of an RPM from a dnf/yum repository.
29-
30-
Args:
31-
mirror_list_url (str): The URL to download the mirror list from.
32-
package_name (str): The name of the package to check.
33-
package_arch (str, optional): The package architecture to check. Defaults to "x86_64".
34-
greater_equal_version (Version, optional): The minimum version to accept. Defaults to None.
35-
less_than_version (Version, optional): The version to accept versions less than.
36-
Defaults to None.
37-
38-
Returns:
39-
str: The latest rpm available in the repository.
40-
"""
41-
42-
versions: Dict[str, Version] = {}
43-
mirror_urls: List[str] = (
44-
get(
45-
mirror_list_url,
46-
headers={"User-Agent": f"Python get_latest_version/v{__version__}"},
47-
timeout=30,
48-
)
49-
.content.decode("utf-8")
50-
.split("\n")
51-
)
52-
for mirror in mirror_urls: # pylint: disable=too-many-nested-blocks
53-
try:
54-
for metadata in ElementTree.fromstring(
55-
get(
56-
f"{mirror}repodata/repomd.xml",
57-
headers={"User-Agent": f"Python get_latest_version/v{__version__}"},
58-
timeout=30,
59-
).content.decode("utf-8")
60-
):
61-
if (
62-
"type" not in metadata.attrib
63-
or metadata.attrib["type"] != "primary"
64-
):
65-
continue
66-
for option in metadata:
67-
if "href" not in option.attrib:
68-
continue
69-
for package_metadata in ElementTree.parse(
70-
gzip_open(
71-
BytesIO(
72-
get(
73-
f"{mirror}{option.attrib['href']}",
74-
headers={
75-
"User-Agent": f"Python get_latest_version/v{__version__}"
76-
},
77-
timeout=30,
78-
).content
79-
)
80-
)
81-
).getroot():
82-
if (
83-
"type" not in package_metadata.attrib
84-
or package_metadata.attrib["type"] != "rpm"
85-
or package_metadata.findtext(
86-
".//ns0:name",
87-
namespaces={
88-
"ns0": "http://linux.duke.edu/metadata/common"
89-
},
90-
)
91-
!= package_name
92-
or package_metadata.findtext(
93-
".//ns0:arch",
94-
namespaces={
95-
"ns0": "http://linux.duke.edu/metadata/common"
96-
},
97-
)
98-
!= package_arch
99-
):
100-
continue
101-
version_name = package_metadata.find(
102-
".//ns0:version",
103-
namespaces={"ns0": "http://linux.duke.edu/metadata/common"},
104-
).get("ver")
105-
version = clean_version(version_name).split(".")
106-
version = Version(
107-
int(version[0]), int(version[1]), int(version[2])
108-
)
109-
if (
110-
greater_equal_version is None
111-
or version >= greater_equal_version
112-
) and (
113-
less_than_version is None or version < less_than_version
114-
):
115-
versions[version_name] = version
116-
break
117-
except RequestException:
118-
pass
119-
120-
return find_latest(versions)
1+
# SPDX-FileCopyrightText: 2023-2025 Jisc Services Limited
2+
# SPDX-FileContributor: Joe Pitt
3+
#
4+
# SPDX-License-Identifier: GPL-3.0-only
5+
6+
"""Get latest version information from RPM packages."""
7+
8+
from gzip import open as gzip_open
9+
from io import BytesIO
10+
from typing import Dict, List, Optional
11+
12+
from defusedxml import ElementTree
13+
from requests import get, RequestException
14+
from semver import Version
15+
16+
from . import __version__
17+
from .functions import clean_version, find_latest
18+
19+
20+
def get_latest_from_rpm_repo(
21+
mirror_list_url: str,
22+
package_name: str,
23+
*,
24+
package_arch: str = "x86_64",
25+
greater_equal_version: Optional[Version] = None,
26+
less_than_version: Optional[Version] = None,
27+
) -> str:
28+
"""Get the latest available version of an RPM from a dnf/yum repository.
29+
30+
Args:
31+
mirror_list_url (str): The URL to download the mirror list from.
32+
package_name (str): The name of the package to check.
33+
package_arch (str, optional): The package architecture to check. Defaults to "x86_64".
34+
greater_equal_version (Version, optional): The minimum version to accept. Defaults to None.
35+
less_than_version (Version, optional): The version to accept versions less than.
36+
Defaults to None.
37+
38+
Returns:
39+
str: The latest rpm available in the repository.
40+
"""
41+
42+
versions: Dict[str, Version] = {}
43+
mirror_urls: List[str] = (
44+
get(
45+
mirror_list_url,
46+
headers={"User-Agent": f"Python get_latest_version/v{__version__}"},
47+
timeout=30,
48+
)
49+
.content.decode("utf-8")
50+
.split("\n")
51+
)
52+
for mirror in mirror_urls: # pylint: disable=too-many-nested-blocks
53+
try:
54+
for metadata in ElementTree.fromstring(
55+
get(
56+
f"{mirror}repodata/repomd.xml",
57+
headers={"User-Agent": f"Python get_latest_version/v{__version__}"},
58+
timeout=30,
59+
).content.decode("utf-8")
60+
):
61+
if (
62+
"type" not in metadata.attrib
63+
or metadata.attrib["type"] != "primary"
64+
):
65+
continue
66+
for option in metadata:
67+
if "href" not in option.attrib:
68+
continue
69+
for package_metadata in ElementTree.parse(
70+
gzip_open(
71+
BytesIO(
72+
get(
73+
f"{mirror}{option.attrib['href']}",
74+
headers={
75+
"User-Agent": f"Python get_latest_version/v{__version__}"
76+
},
77+
timeout=30,
78+
).content
79+
)
80+
)
81+
).getroot():
82+
if (
83+
"type" not in package_metadata.attrib
84+
or package_metadata.attrib["type"] != "rpm"
85+
or package_metadata.findtext(
86+
".//ns0:name",
87+
namespaces={
88+
"ns0": "http://linux.duke.edu/metadata/common"
89+
},
90+
)
91+
!= package_name
92+
or package_metadata.findtext(
93+
".//ns0:arch",
94+
namespaces={
95+
"ns0": "http://linux.duke.edu/metadata/common"
96+
},
97+
)
98+
!= package_arch
99+
):
100+
continue
101+
version_name = package_metadata.find(
102+
".//ns0:version",
103+
namespaces={"ns0": "http://linux.duke.edu/metadata/common"},
104+
).get("ver")
105+
version = clean_version(version_name).split(".")
106+
version = Version(
107+
int(version[0]), int(version[1]), int(version[2])
108+
)
109+
if (
110+
greater_equal_version is None
111+
or version >= greater_equal_version
112+
) and (
113+
less_than_version is None or version < less_than_version
114+
):
115+
versions[version_name] = version
116+
break
117+
except RequestException:
118+
pass
119+
120+
return find_latest(versions)

0 commit comments

Comments
 (0)