diff --git a/pisi-spec.rng b/pisi-spec.rng index 4abecb62..25319fd9 100644 --- a/pisi-spec.rng +++ b/pisi-spec.rng @@ -48,7 +48,9 @@ - + + + diff --git a/pisi/archive.py b/pisi/archive.py index 847c5bfb..9f7cc234 100644 --- a/pisi/archive.py +++ b/pisi/archive.py @@ -47,10 +47,12 @@ class ArchiveBase(object): def unpack(self, target_dir, clean_dir = False): self.target_dir = target_dir # first we check if we need to clean-up our working env. - if os.path.exists(self.target_dir) and clean_dir: - util.clean_dir(self.target_dir) + if os.path.exists(self.target_dir): + if clean_dir: + util.clean_dir(self.target_dir) - os.makedirs(self.target_dir) + if not os.path.exists(self.target_dir): + os.makedirs(self.target_dir) class ArchiveBinary(ArchiveBase): diff --git a/pisi/operations/build.py b/pisi/operations/build.py index 2d510217..7e8ed768 100644 --- a/pisi/operations/build.py +++ b/pisi/operations/build.py @@ -192,7 +192,7 @@ class Builder: self.read_translations(self.specdir) - self.sourceArchive = pisi.sourcearchive.SourceArchive(self.spec, self.pkg_work_dir()) + self.sourceArchives = pisi.sourcearchive.SourceArchives(self.spec, self.pkg_work_dir()) self.set_environment_vars() @@ -259,8 +259,8 @@ class Builder: self.check_build_dependencies() self.fetch_component() - self.fetch_source_archive() - self.unpack_source_archive() + self.fetch_source_archives() + self.unpack_source_archives() # Grab AdditionalFiles self.copy_additional_source_files() @@ -392,15 +392,12 @@ class Builder: ctx.ui.info(_('Source is part of %s component') % comp.name) self.spec.source.partOf = comp.name - def fetch_source_archive(self): - ctx.ui.info(_("Fetching source from: %s") % self.spec.source.archive.uri) - self.sourceArchive.fetch() - ctx.ui.info(_("Source archive is stored: %s/%s") - %(ctx.config.archives_dir(), self.spec.source.archive.name)) + def fetch_source_archives(self): + self.sourceArchives.fetch() - def unpack_source_archive(self): - ctx.ui.info(_("Unpacking archive...")) - self.sourceArchive.unpack() + def unpack_source_archives(self): + ctx.ui.info(_("Unpacking archive(s)...")) + self.sourceArchives.unpack() # apply the patches and prepare a source directory for build. if self.apply_patches(): ctx.ui.info(_(" unpacked (%s)") % self.pkg_work_dir()) @@ -1094,12 +1091,12 @@ order = {"none": 0, def __buildState_fetch(pb): # fetch is the first state to run. pb.patch_exists() - pb.fetch_source_archive() + pb.fetch_source_archives() def __buildState_unpack(pb, last): if order[last] < order["fetch"]: __buildState_fetch(pb) - pb.unpack_source_archive() + pb.unpack_source_archives() def __buildState_setupaction(pb, last): if order[last] < order["unpack"]: diff --git a/pisi/sourcearchive.py b/pisi/sourcearchive.py index 394a26c0..793180ec 100644 --- a/pisi/sourcearchive.py +++ b/pisi/sourcearchive.py @@ -28,14 +28,29 @@ import pisi.mirrors class Error(pisi.Error): pass +class SourceArchives: + """This is a wrapper for supporting multiple SourceArchive objects.""" + def __init__(self, spec, pkg_work_dir): + self.sourceArchives = [SourceArchive(a, pkg_work_dir) for a in spec.source.archive] + + def fetch(self, interactive=True): + for archive in self.sourceArchives: + archive.fetch(interactive) + + def unpack(self, clean_dir=True): + self.sourceArchives[0].unpack(clean_dir) + for archive in self.sourceArchives[1:]: + archive.unpack(clean_dir=False) + + class SourceArchive: """source archive. this is a class responsible for fetching and unpacking a source archive""" - def __init__(self, spec, pkg_work_dir): - self.url = pisi.uri.URI(spec.source.archive.uri) + def __init__(self, archive, pkg_work_dir): + self.url = pisi.uri.URI(archive.uri) self.pkg_work_dir = pkg_work_dir self.archiveFile = os.path.join(ctx.config.archives_dir(), self.url.filename()) - self.archive = spec.source.archive + self.archive = archive def fetch(self, interactive=True): if not self.is_cached(interactive): @@ -45,6 +60,7 @@ class SourceArchive: self.progress = None try: + ctx.ui.info(_("Fetching source from: %s") % self.url.uri) if self.url.get_uri().startswith("mirrors://"): self.fetch_from_mirror() else: @@ -55,6 +71,9 @@ class SourceArchive: else: raise + ctx.ui.info(_("Source archive is stored: %s/%s") + % (ctx.config.archives_dir(), self.uri.filename())) + def fetch_from_fallback(self): archive = os.path.basename(self.url.get_uri()) src = os.path.join(ctx.config.values.build.fallback, archive) diff --git a/pisi/specfile.py b/pisi/specfile.py index edeffbac..711dbf0d 100644 --- a/pisi/specfile.py +++ b/pisi/specfile.py @@ -171,7 +171,7 @@ class Source: t_Summary = [autoxml.LocalText, autoxml.mandatory] t_Description = [autoxml.LocalText, autoxml.optional] t_Icon = [ autoxml.String, autoxml.optional] - t_Archive = [Archive, autoxml.mandatory ] + t_Archive = [ [Archive], autoxml.mandatory, "Archive" ] t_AdditionalFiles = [ [AdditionalFile], autoxml.optional] t_BuildDependencies = [ [pisi.dependency.Dependency], autoxml.optional] t_Patches = [ [Patch], autoxml.optional]