From 2ba72fab5eb6c335e6cb44033552a2741daaf392 Mon Sep 17 00:00:00 2001 From: Otto Urpelainen Date: Sep 01 2021 05:16:47 +0000 Subject: 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. Signed-off-by: Otto Urpelainen --- 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.*)\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)