Skip to content

Commit

Permalink
Allow spacewalk-repo-sync filtering using NEVRA (bsc#1234226)
Browse files Browse the repository at this point in the history
To enable nevra filtering, add the following to rhn.conf

server.satellite.reposync_nevra_filter = 1

Co-authored-by: Victor Zhestkov <[email protected]>
  • Loading branch information
meaksh and vzhestkov committed Feb 12, 2025
1 parent 5bb9d7c commit c4dcecb
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 11 deletions.
30 changes: 25 additions & 5 deletions python/spacewalk/satellite_tools/repo_plugins/deb_src.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ def __setitem__(self, key, value):
return setattr(self, key, value)

def evr(self):
# The format is: [epoch:]upstream_version[-debian_revision].
# https://www.debian.org/doc/debian-policy/ch-controlfields.html#version
evr = ""
if self.epoch:
# pylint: disable-next=consider-using-f-string
Expand All @@ -80,6 +82,9 @@ def evr(self):
evr = evr + "-{}".format(self.release)
return evr

def nevra(self):
return f"{self.name}_{self.evr()}_{self.arch}"

def is_populated(self):
return all(
[
Expand Down Expand Up @@ -412,6 +417,14 @@ def __init__(
except ValueError:
self.timeout = 300

try:
# extended reposync nevra filter enable
# this will filter packages based on full nevra
# instead of package name only.
self.nevra_filter = bool(CFG.REPOSYNC_NEVRA_FILTER)
except (AttributeError, ValueError):
self.nevra_filter = False

# SUSE vendor repositories belongs to org = NULL
# The repository cache root will be "/var/cache/rhn/reposync/REPOSITORY_LABEL/"
root = os.path.join(CACHE_DIR, str(org or "NULL"), self.reponame)
Expand Down Expand Up @@ -479,7 +492,7 @@ def list_packages(self, filters, latest):
filters.append(("-", [p]))

if filters:
pkglist = self._filter_packages(pkglist, filters)
pkglist = self._filter_packages(pkglist, filters, nevra_filter=self.nevra_filter)
self.num_excluded = self.num_packages - len(pkglist)

to_return = []
Expand Down Expand Up @@ -510,7 +523,7 @@ def _sort_packages(pkg1, pkg2):
return -1

@staticmethod
def _filter_packages(packages, filters):
def _filter_packages(packages, filters, nevra_filter=False):
"""implement include / exclude logic
filters are: [ ('+', includelist1), ('-', excludelist1),
('+', includelist2), ... ]
Expand All @@ -536,7 +549,11 @@ def _filter_packages(packages, filters):
if sense == "+":
# include
for excluded_pkg in excluded:
if reobj.match(excluded_pkg["name"]):
if nevra_filter:
pkg_name = excluded_pkg.nevra()
else:
pkg_name = excluded_pkg["name"]
if reobj.match(pkg_name):
allmatched_include.insert(0, excluded_pkg)
selected.insert(0, excluded_pkg)
for pkg in allmatched_include:
Expand All @@ -545,10 +562,13 @@ def _filter_packages(packages, filters):
elif sense == "-":
# exclude
for selected_pkg in selected:
if reobj.match(selected_pkg["name"]):
if nevra_filter:
pkg_name = selected_pkg.nevra()
else:
pkg_name = selected_pkg["name"]
if reobj.match(pkg_name):
allmatched_exclude.insert(0, selected_pkg)
excluded.insert(0, selected_pkg)

for pkg in allmatched_exclude:
if pkg in selected:
selected.remove(pkg)
Expand Down
26 changes: 20 additions & 6 deletions python/spacewalk/satellite_tools/repo_plugins/yum_src.py
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,13 @@ def __init__(
self.timeout = int(CFG.REPOSYNC_TIMEOUT)
except ValueError:
self.timeout = 300
try:
# extended reposync nevra filter enable
# this will filter packages based on full nevra
# instead of package name only.
self.nevra_filter = bool(CFG.REPOSYNC_NEVRA_FILTER)
except (AttributeError, ValueError):
self.nevra_filter = False

def _load_proxy_settings(self, url):
# read the proxy configuration in /etc/rhn/rhn.conf
Expand Down Expand Up @@ -1216,11 +1223,11 @@ def _apply_filters(self, pkglist, filters):
filters.append(("-", [p]))

if filters:
pkglist = self._filter_packages(pkglist, filters)
pkglist = self._filter_packages(pkglist, filters, nevra_filter=self.nevra_filter)
pkglist = self._get_solvable_dependencies(pkglist)

# Do not pull in dependencies if there're explicitly excluded
pkglist = self._filter_packages(pkglist, filters, True)
pkglist = self._filter_packages(pkglist, filters, True, self.nevra_filter)
self.num_excluded = self.num_packages - len(pkglist)

return pkglist
Expand All @@ -1233,7 +1240,7 @@ def _fix_encoding(text):
return str(text)

@staticmethod
def _filter_packages(packages, filters, exclude_only=False):
def _filter_packages(packages, filters, exclude_only=False, nevra_filter=False):
"""implement include / exclude logic
filters are: [ ('+', includelist1), ('-', excludelist1),
('+', includelist2), ... ]
Expand Down Expand Up @@ -1261,7 +1268,11 @@ def _filter_packages(packages, filters, exclude_only=False):
continue
# include
for excluded_pkg in excluded:
if reobj.match(excluded_pkg.name):
if nevra_filter:
pkg_name = str(excluded_pkg)
else:
pkg_name = excluded_pkg.name
if reobj.match(pkg_name):
allmatched_include.insert(0, excluded_pkg)
selected.insert(0, excluded_pkg)
for pkg in allmatched_include:
Expand All @@ -1270,10 +1281,13 @@ def _filter_packages(packages, filters, exclude_only=False):
elif sense == "-":
# exclude
for selected_pkg in selected:
if reobj.match(selected_pkg.name):
if nevra_filter:
pkg_name = str(selected_pkg)
else:
pkg_name = selected_pkg.name
if reobj.match(pkg_name):
allmatched_exclude.insert(0, selected_pkg)
excluded.insert(0, selected_pkg)

for pkg in allmatched_exclude:
if pkg in selected:
selected.remove(pkg)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Allow spacewalk-repo-sync filtering using NEVRA
instead of package name only (bsc#1234226)

0 comments on commit c4dcecb

Please sign in to comment.