#574 Pass sourcedir to rpmspec when specfile is parsed
Merged 3 years ago by onosek. Opened 3 years ago by oturpe.

file modified
+2 -1
@@ -2042,7 +2042,8 @@ 

              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:

file modified
+5 -4
@@ -17,15 +17,16 @@ 

  

      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 @@ 

              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,

file modified
+12 -4
@@ -36,12 +36,17 @@ 

          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 @@ 

          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)

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 utilityrpmspec 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 oturpe@iki.fi

Do you think test case TestSources at test_cli.py should be extended
so that it would catch this problem?

Thanks for the quick reaction, @oturpe
This looks good as it is.

Commit e0bf138 fixes this pull-request

Pull-Request has been merged by onosek

3 years ago