summaryrefslogtreecommitdiff
path: root/0020-Use-release-s-rpmdefines-in-unused-sources-check.patch
diff options
context:
space:
mode:
Diffstat (limited to '0020-Use-release-s-rpmdefines-in-unused-sources-check.patch')
-rw-r--r--0020-Use-release-s-rpmdefines-in-unused-sources-check.patch170
1 files changed, 170 insertions, 0 deletions
diff --git a/0020-Use-release-s-rpmdefines-in-unused-sources-check.patch b/0020-Use-release-s-rpmdefines-in-unused-sources-check.patch
new file mode 100644
index 0000000..6be7cee
--- /dev/null
+++ b/0020-Use-release-s-rpmdefines-in-unused-sources-check.patch
@@ -0,0 +1,170 @@
+From 8667d5379161183b306bdd4a6733c666cd2ef310 Mon Sep 17 00:00:00 2001
+From: Otto Liljalaakso <otto.liljalaakso@iki.fi>
+Date: Sun, 2 Apr 2023 17:21:00 +0300
+Subject: [PATCH 1/2] Use release's rpmdefines in unused sources check
+
+Conditional Source: tags are problematic and, in fact, forbidden in at
+least Fedora. However, there are packages that conditionalize packages
+based on macros such as %{rhel} or %{fedora}. 'x-pkg sources' did not
+handle such packages correctly, because when the specfile was parsed
+to check for unused sources, values for those macros were not set. This
+was different from other commands which set such macros based on the
+value of --release parameter or Git branch name.
+
+Improve support for conditional Source: tags by using the standard set
+of rpmdefines when the specfile is parsed in 'fedpkg sources'.
+
+Fixes: #671
+JIRA: RHELCMP-11465
+Merges: https://pagure.io/rpkg/pull-request/678
+
+Signed-off-by: Otto Liljalaakso <otto.liljalaakso@iki.fi>
+---
+ pyrpkg/__init__.py | 21 +++++++++++++++------
+ pyrpkg/spec.py | 12 +++++++-----
+ tests/test_cli.py | 21 ++++++++++++++++++++-
+ tests/test_spec.py | 8 ++++++--
+ 4 files changed, 48 insertions(+), 14 deletions(-)
+
+diff --git a/pyrpkg/__init__.py b/pyrpkg/__init__.py
+index 3f934d3..817ef33 100644
+--- a/pyrpkg/__init__.py
++++ b/pyrpkg/__init__.py
+@@ -2261,13 +2261,22 @@ class Commands(object):
+ sourcesf = SourcesFile(self.sources_filename, self.source_entry_type)
+
+ try:
+- specf = SpecFile(os.path.join(self.layout.specdir, self.spec),
+- self.layout.sourcedir)
+- spec_parsed = True
+- except Exception:
+- self.log.warning("Parsing specfile for used sources failed. "
+- "Falling back to downloading all sources.")
++ # Try resolving rpmdefines separately. This produces a clear error
++ # message in the common failure case of custom branch name.
++ self.rpmdefines
++ except Exception as err:
++ self.log.warning("Parsing specfile for used sources failed: %s" % err)
++ self.log.warning("Falling back to downloading all sources.")
+ spec_parsed = False
++ else:
++ try:
++ specf = SpecFile(os.path.join(self.layout.specdir, self.spec),
++ self.rpmdefines)
++ spec_parsed = True
++ except Exception:
++ self.log.warning("Parsing specfile for used sources failed. "
++ "Falling back to downloading all sources.")
++ spec_parsed = False
+
+ args = dict()
+ if self.lookaside_request_params:
+diff --git a/pyrpkg/spec.py b/pyrpkg/spec.py
+index d72f1fb..5400de3 100644
+--- a/pyrpkg/spec.py
++++ b/pyrpkg/spec.py
+@@ -18,16 +18,16 @@ class SpecFile(object):
+ r'^((source[0-9]*|patch[0-9]*)\s*:\s*(?P<val>.*))\s*$',
+ re.IGNORECASE)
+
+- def __init__(self, spec, sourcedir):
++ def __init__(self, spec, rpmdefines):
+ self.spec = spec
+- self.sourcedir = sourcedir
++ self.rpmdefines = rpmdefines
+ self.sources = []
+
+ self.parse()
+
+ def parse(self):
+ """Call rpmspec and find source tags from the result."""
+- stdout = run(self.spec, self.sourcedir)
++ stdout = run(self.spec, self.rpmdefines)
+ for line in stdout.splitlines():
+ m = self.sourcefile_expression.match(line)
+ if not m:
+@@ -38,8 +38,10 @@ class SpecFile(object):
+ self.sources.append(val)
+
+
+-def run(spec, sourcedir):
+- cmdline = ['rpmspec', '--define', "_sourcedir %s" % sourcedir, '-P', spec]
++def run(spec, rpmdefines):
++ cmdline = ['rpmspec']
++ cmdline.extend(rpmdefines)
++ cmdline.extend(['-P', spec])
+ try:
+ process = subprocess.Popen(cmdline,
+ stdout=subprocess.PIPE,
+diff --git a/tests/test_cli.py b/tests/test_cli.py
+index 02620ef..58df047 100644
+--- a/tests/test_cli.py
++++ b/tests/test_cli.py
+@@ -1607,6 +1607,25 @@ class TestSources(LookasideCacheMock, CliTestCase):
+ def test_unused_sources_are_not_downloaded(self):
+ self._upload_unused()
+
++ cli_cmd = ['rpkg', '--path', self.cloned_repo_path, 'sources']
++ with patch('sys.argv', new=cli_cmd):
++ with patch('pyrpkg.Commands.rpmdefines',
++ new=['--define', '_sourcedir %s' % self.cloned_repo_path]):
++ cli = self.new_cli()
++ with patch('pyrpkg.lookaside.CGILookasideCache.download',
++ new=self.lookasidecache_download):
++ cli.sources()
++
++ path = os.path.join(self.cloned_repo_path, 'unused.patch')
++ self.assertFalse(os.path.exists(path))
++
++ @patch('pyrpkg.Commands.load_rpmdefines')
++ def test_download_sources_including_unused(self, rpmdefines):
++ self._upload_unused()
++ # SpecFile parsing executes 'rpmspec', that needs '--define' arguments from rpmdefines
++ # when rpmdefines raises eception, SpecFile parsing fails --> all sources are downloaded.
++ rpmdefines.side_effect = rpkgError
++
+ cli_cmd = ['rpkg', '--path', self.cloned_repo_path, 'sources']
+ with patch('sys.argv', new=cli_cmd):
+ cli = self.new_cli()
+@@ -1615,7 +1634,7 @@ class TestSources(LookasideCacheMock, CliTestCase):
+ cli.sources()
+
+ path = os.path.join(self.cloned_repo_path, 'unused.patch')
+- self.assertFalse(os.path.exists(path))
++ self.assertTrue(os.path.exists(path))
+
+ def test_force_option_downloads_unused_sources(self):
+ self._upload_unused()
+diff --git a/tests/test_spec.py b/tests/test_spec.py
+index eefc475..0c7907a 100644
+--- a/tests/test_spec.py
++++ b/tests/test_spec.py
+@@ -10,6 +10,10 @@ from pyrpkg.errors import rpkgError
+ class SpecFileTestCase(unittest.TestCase):
+ def setUp(self):
+ self.workdir = tempfile.mkdtemp(prefix='rpkg-tests.')
++ self.rpmdefines = ["--define", "_sourcedir %s" % self.workdir,
++ "--define", "_specdir %s" % self.workdir,
++ "--define", "_builddir %s" % self.workdir,
++ "--eval", "%%undefine rhel"]
+ self.specfile = os.path.join(self.workdir, self._testMethodName)
+
+ # Write common header
+@@ -43,7 +47,7 @@ class SpecFileTestCase(unittest.TestCase):
+ "PAtch999: https://remote.patch-sourcce.org/another-patch.bz2\n")
+ spec_fd.close()
+
+- s = spec.SpecFile(self.specfile, self.workdir)
++ s = spec.SpecFile(self.specfile, self.rpmdefines)
+ actual = s.sources
+ expected = [
+ "tarball.tar.gz",
+@@ -65,4 +69,4 @@ class SpecFileTestCase(unittest.TestCase):
+ self.assertRaises(rpkgError,
+ spec.SpecFile,
+ self.specfile,
+- self.workdir)
++ self.rpmdefines)
+--
+2.40.0
+