From 9db18669b4099460e4a404343d7eee3da3f6d3bc Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 13 Dec 2012 17:04:14 +0100 Subject: [PATCH] Read dependency information in source packages from makefile. --- python/pakfire/packages/file.py | 32 +++++++++++++++++++++---- python/pakfire/packages/make.py | 36 ++++++++++++++++++----------- python/pakfire/packages/packager.py | 28 +++++++++++----------- 3 files changed, 64 insertions(+), 32 deletions(-) diff --git a/python/pakfire/packages/file.py b/python/pakfire/packages/file.py index 086300740..37f820e2b 100644 --- a/python/pakfire/packages/file.py +++ b/python/pakfire/packages/file.py @@ -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" diff --git a/python/pakfire/packages/make.py b/python/pakfire/packages/make.py index 4420ab2f1..4a9c4708c 100644 --- a/python/pakfire/packages/make.py +++ b/python/pakfire/packages/make.py @@ -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) diff --git a/python/pakfire/packages/packager.py b/python/pakfire/packages/packager.py index 7814fbbed..1cf1ecf7e 100644 --- a/python/pakfire/packages/packager.py +++ b/python/pakfire/packages/packager.py @@ -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: -- 2.39.5