]> git.ipfire.org Git - pakfire.git/commitdiff
Read dependency information in source packages from makefile.
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 13 Dec 2012 16:04:14 +0000 (17:04 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 13 Dec 2012 16:04:14 +0000 (17:04 +0100)
python/pakfire/packages/file.py
python/pakfire/packages/make.py
python/pakfire/packages/packager.py

index 086300740c8f77b50a68dbe9c29a26af0d41ed7e..37f820e2b73ed5190fda26f0d49ba99f60360a22 100644 (file)
@@ -36,8 +36,9 @@ import pakfire.compress as compress
 from pakfire.constants import *
 from pakfire.i18n import _
 
-from base import Package
-from lexer import FileLexer
+import base
+import lexer
+import make
 
 class InnerTarFile(tarfile.TarFile):
        def __init__(self, *args, **kwargs):
@@ -123,13 +124,13 @@ class InnerTarFileXz(InnerTarFile):
                return t
 
 
-class FilePackage(Package):
+class FilePackage(base.Package):
        """
                This class is a wrapper that reads package data from the (outer)
                tarball and should never be used solely.
        """
        def __init__(self, pakfire, repo, filename):
-               Package.__init__(self, pakfire, repo)
+               base.Package.__init__(self, pakfire, repo)
                self.filename = os.path.abspath(filename)
 
                # Place to cache the metadata
@@ -150,7 +151,7 @@ class FilePackage(Package):
                        a = self.open_archive()
                        f = a.extractfile("info")
 
-                       self.lexer = FileLexer(f.readlines())
+                       self.lexer = lexer.FileLexer(f.readlines())
 
                        f.close()
                        a.close()
@@ -375,6 +376,16 @@ class FilePackage(Package):
 
                        return payload_archive.extractfile(member)
 
+       def open_makefile(self):
+               """
+                       Opens the makefile inside the package.
+               """
+               f = self.open_file("%s.%s" % (self.name, MAKEFILE_EXTENSION))
+               if not f:
+                       return
+
+               return make.Makefile(self.pakfire, lines=f.readlines())
+
        @property
        def metadata(self):
                """
@@ -1062,6 +1073,17 @@ class SourcePackage(FilePackage):
                assert arches, self
                return arches
 
+       @property
+       def requires(self):
+               m = self.open_makefile()
+               if not m:
+                       return []
+
+               requires = m.lexer.build.get_var("requires")
+               requires = requires.splitlines()
+
+               return self.filter_deps(requires)
+
 
 class BinaryPackage(FilePackage):
        _type = "binary"
index 4420ab2f1b20325d9349c8eec1114c8eb9cb67fb..4a9c4708c0be389db8231337bb42dfbf93852b9d 100644 (file)
@@ -40,28 +40,31 @@ import pakfire.downloader as downloader
 import pakfire.util as util
 
 from base import Package
-from file import SourcePackage
 
 from pakfire.constants import *
 from pakfire.i18n import _
 from pakfire.system import system
 
 class MakefileBase(Package):
-       def __init__(self, pakfire, filename):
+       def __init__(self, pakfire, filename=None, lines=None):
                Package.__init__(self, pakfire)
 
-               # Save the filename of the makefile.
-               self.filename = os.path.abspath(filename)
-
                # Update environment.
                environ = self.pakfire.distro.environ
                environ.update({
-                       "BASEDIR"          : os.path.dirname(self.filename),
                        "PARALLELISMFLAGS" : "-j%d" % system.parallelism,
                })
 
-               # Open and parse the makefile.
-               self.lexer = lexer.RootLexer.open(self.filename, environ=environ)
+               if filename:
+                       self.filename = os.path.abspath(filename)
+                       environ["BASEDIR"] = os.path.dirname(self.filename)
+
+                       # Open and parse the makefile.
+                       self.lexer = lexer.RootLexer.open(self.filename, environ=environ)
+
+               else:
+                       self.filename = None
+                       self.lexer = lexer.RootLexer(lines, environ=environ)
 
        @property
        def package_filename(self):
@@ -193,15 +196,19 @@ class MakefileBase(Package):
 class Makefile(MakefileBase):
        @property
        def uuid(self):
-               hash1 = util.calc_hash1(self.filename)
+               if self.filename:
+                       hash1 = util.calc_hash1(self.filename)
 
-               # Return UUID version 5 (SHA1 hash)
-               return "%8s-%4s-5%3s-%4s-%11s" % \
-                       (hash1[0:8], hash1[9:13], hash1[14:17], hash1[18:22], hash1[23:34])
+                       # Return UUID version 5 (SHA1 hash)
+                       return "%8s-%4s-5%3s-%4s-%11s" % \
+                               (hash1[0:8], hash1[9:13], hash1[14:17], hash1[18:22], hash1[23:34])
+
+               return "" # XXX What to do here?
 
        @property
        def path(self):
-               return os.path.dirname(self.filename)
+               if self.filename:
+                       return os.path.dirname(self.filename)
 
        @property
        def arch(self):
@@ -302,6 +309,9 @@ class Makefile(MakefileBase):
 
        @property
        def files(self):
+               if not self.filename:
+                       return []
+
                files = []
                basedir = os.path.dirname(self.filename)
 
index 7814fbbed8d2c258035f8634c814276b01d0bb6f..1cf1ecf7e30bbf1b9746e73d0bc693aecb0073fc 100644 (file)
@@ -43,7 +43,7 @@ import pakfire.util as util
 from pakfire.constants import *
 from pakfire.i18n import _
 
-from file import BinaryPackage, InnerTarFile, InnerTarFileXz, SourcePackage
+import file
 
 class Packager(object):
        payload_compression = None
@@ -143,9 +143,9 @@ class Packager(object):
                f = open(filelist, "w")
 
                if self.payload_compression == "xz":
-                       datafile = InnerTarFileXz.open(datafile)
+                       datafile = file.InnerTarFileXz.open(datafile)
                else:
-                       datafile = InnerTarFile.open(datafile)
+                       datafile = file.InnerTarFile.open(datafile)
 
                while True:
                        m = datafile.next()
@@ -201,9 +201,9 @@ class Packager(object):
                size = 0
 
                if self.payload_compression == "xz":
-                       tar = InnerTarFileXz.open(datafile)
+                       tar = file.InnerTarFileXz.open(datafile)
                else:
-                       tar = InnerTarFile.open(datafile)
+                       tar = file.InnerTarFile.open(datafile)
 
                while True:
                        m = tar.next()
@@ -232,9 +232,9 @@ class BinaryPackager(Packager):
                tmpdir = self.mktemp(directory=True)
 
                if self.payload_compression == "xz":
-                       tarfile = InnerTarFileXz.open(datafile)
+                       tarfile = file.InnerTarFileXz.open(datafile)
                else:
-                       tarfile = InnerTarFile.open(datafile)
+                       tarfile = file.InnerTarFile.open(datafile)
 
                tarfile.extractall(path=tmpdir)
                tarfile.close()
@@ -401,9 +401,9 @@ class BinaryPackager(Packager):
 
                datafile = self.mktemp()
                if self.payload_compression == "xz":
-                       tar = InnerTarFileXz.open(datafile, mode="w")
+                       tar = file.InnerTarFileXz.open(datafile, mode="w")
                else:
-                       tar = InnerTarFile.open(datafile, mode="w")
+                       tar = file.InnerTarFile.open(datafile, mode="w")
 
                # All files in the tarball are relative to this directory.
                basedir = self.buildroot
@@ -528,9 +528,9 @@ class BinaryPackager(Packager):
 
        def find_files(self, datafile, patterns):
                if self.payload_compression == "xz":
-                       datafile = InnerTarFileXz.open(datafile)
+                       datafile = file.InnerTarFileXz.open(datafile)
                else:
-                       datafile = InnerTarFile.open(datafile)
+                       datafile = file.InnerTarFile.open(datafile)
 
                members = datafile.getmembers()
 
@@ -634,7 +634,7 @@ class BinaryPackager(Packager):
                except OSError:
                        shutil.copy2(tempfile, resultfile)
 
-               return BinaryPackage(self.pakfire, self.pakfire.repos.dummy, resultfile)
+               return file.BinaryPackage(self.pakfire, self.pakfire.repos.dummy, resultfile)
 
 
 class SourcePackager(Packager):
@@ -715,9 +715,9 @@ class SourcePackager(Packager):
 
                filename = self.mktemp()
                if self.payload_compression == "xz":
-                       datafile = InnerTarFileXz.open(filename, mode="w")
+                       datafile = file.InnerTarFileXz.open(filename, mode="w")
                else:
-                       datafile = InnerTarFile.open(filename, mode="w")
+                       datafile = file.InnerTarFile.open(filename, mode="w")
 
                i = 0
                for arcname, file in files: