From e0bf13817fc4e9d2ec56f2780bf88d9cfd5a1f27 Mon Sep 17 00:00:00 2001
From: Otto Urpelainen <oturpe@iki.fi>
Date: Wed, 1 Sep 2021 07:44:22 +0300
Subject: [PATCH] Pass sourcedir to rpmspec when specfile is parsed
In many cases, specfile parsing in class SpecFile failed when
the specfile contained local sources like 'Source2: local.txt'.
This happened because rpm sourcedir configuration was not passed
to utility rpmspec used for parsing, leading it to default
to '~/rpmbuild/SOURCES', which is not correct for many layouts
supported by rpkg.
Fixed by passing sourcedir correctly.
Fixes: #559
Relates: https://pagure.io/rpkg/pull-request/564
Merges: https://pagure.io/rpkg/pull-request/574
Signed-off-by: Otto Urpelainen <oturpe@iki.fi>
---
pyrpkg/__init__.py | 3 ++-
pyrpkg/spec.py | 9 +++++----
tests/test_spec.py | 16 ++++++++++++----
3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/pyrpkg/__init__.py b/pyrpkg/__init__.py
index 5e4831a..23bca5b 100644
--- a/pyrpkg/__init__.py
+++ b/pyrpkg/__init__.py
@@ -2042,7 +2042,8 @@ class Commands(object):
outdir = self.path
sourcesf = SourcesFile(self.sources_filename, self.source_entry_type)
- specf = SpecFile(os.path.join(self.layout.specdir, self.spec))
+ specf = SpecFile(os.path.join(self.layout.specdir, self.spec),
+ self.layout.sourcedir)
args = dict()
if self.lookaside_request_params:
diff --git a/pyrpkg/spec.py b/pyrpkg/spec.py
index 1aa2500..6341fcd 100644
--- a/pyrpkg/spec.py
+++ b/pyrpkg/spec.py
@@ -17,15 +17,16 @@ class SpecFile(object):
sourcefile_expression = re.compile(r'^source[0-9]*:\s*(?P<val>.*)\s*$', re.IGNORECASE)
- def __init__(self, spec):
+ def __init__(self, spec, sourcedir):
self.spec = spec
+ self.sourcedir = sourcedir
self.sources = []
self.parse()
def parse(self):
"""Call rpmspec and find source tags from the result."""
- stdout = run(self.spec)
+ stdout = run(self.spec, self.sourcedir)
for line in stdout.splitlines():
m = self.sourcefile_expression.match(line)
if not m:
@@ -36,8 +37,8 @@ class SpecFile(object):
self.sources.append(val)
-def run(spec):
- cmdline = ['rpmspec', '-P', spec]
+def run(spec, sourcedir):
+ cmdline = ['rpmspec', '--define', "_sourcedir %s" % sourcedir, '-P', spec]
try:
process = subprocess.Popen(cmdline,
stdout=subprocess.PIPE,
diff --git a/tests/test_spec.py b/tests/test_spec.py
index 15e3730..196b470 100644
--- a/tests/test_spec.py
+++ b/tests/test_spec.py
@@ -36,12 +36,17 @@ class SpecFileTestCase(unittest.TestCase):
spec_fd.write(
"Source0: https://example.com/tarball.tar.gz\n"
"Source1: https://example.com/subdir/LICENSE.txt\n"
- "Source2: https://another.domain.com/source.tar.gz\n")
+ "Source2: https://another.domain.com/source.tar.gz\n"
+ "Source3: local.txt\n")
spec_fd.close()
- s = spec.SpecFile(self.specfile)
+ s = spec.SpecFile(self.specfile, self.workdir)
actual = s.sources
- expected = ["tarball.tar.gz", "LICENSE.txt", "source.tar.gz"]
+ expected = [
+ "tarball.tar.gz",
+ "LICENSE.txt",
+ "source.tar.gz",
+ "local.txt"]
self.assertEqual(len(actual), len(expected))
self.assertTrue(all([a == b for a, b in zip(actual, expected)]))
@@ -52,4 +57,7 @@ class SpecFileTestCase(unittest.TestCase):
spec_fd.write("Foo: Bar\n")
spec_fd.close()
- self.assertRaises(rpkgError, spec.SpecFile, [self.specfile])
+ self.assertRaises(rpkgError,
+ spec.SpecFile,
+ self.specfile,
+ self.workdir)
--
2.31.1