From: Michael Tremer Date: Sat, 11 Feb 2012 15:24:37 +0000 (+0100) Subject: Rework the way "dist" works. X-Git-Tag: 0.9.20~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7d40ac702576a1e366208ac407e4b8428b060f45;p=pakfire.git Rework the way "dist" works. You now have to set the directory where the file will be created. --- diff --git a/python/pakfire/api.py b/python/pakfire/api.py index c8bff043f..332a7e752 100644 --- a/python/pakfire/api.py +++ b/python/pakfire/api.py @@ -96,10 +96,10 @@ def build(pkg, **kwargs): def shell(pkg, **kwargs): return Pakfire.shell(pkg, **kwargs) -def dist(pkgs, resultdirs=None, **pakfire_args): +def dist(pkg, resultdir, **pakfire_args): pakfire = Pakfire(**pakfire_args) - return pakfire.dist(pkgs, resultdirs=resultdirs) + return pakfire.dist(pkg, resultdir) def provides(patterns, **pakfire_args): # Create pakfire instance. diff --git a/python/pakfire/base.py b/python/pakfire/base.py index 47d3c1c1e..e25c989a2 100644 --- a/python/pakfire/base.py +++ b/python/pakfire/base.py @@ -638,13 +638,10 @@ class Pakfire(object): finally: b.stop() - def dist(self, pkgs, resultdirs=None): - assert resultdirs + def dist(self, pkg, resultdir): + pkg = packages.Makefile(self, pkg) - for pkg in pkgs: - pkg = packages.Makefile(self, pkg) - - pkg.dist(resultdirs) + return pkg.dist(resultdir=resultdir) def provides(self, patterns): pkgs = [] diff --git a/python/pakfire/cli.py b/python/pakfire/cli.py index 6d19e97fc..bd8a8ca74 100644 --- a/python/pakfire/cli.py +++ b/python/pakfire/cli.py @@ -560,8 +560,17 @@ class CliBuilder(Cli): else: raise FileNotFoundError, pkg - pakfire.dist(pkgs, resultdirs=[self.args.resultdir,], - **self.pakfire_args) + # Put packages to where the user said or our + # current working directory. + resultdir = self.args.resultdir or os.getcwd() + + # Change the default pakfire configuration, because + # packaging source packages can be done in server mode. + pakfire_args = self.pakfire_args + pakfire_args["mode"] = "server" + + for pkg in pkgs: + pakfire.dist(pkg, resultdir=resultdir, **pakfire_args) def handle_provides(self): pkgs = pakfire.provides(self.args.pattern, **self.pakfire_args) diff --git a/python/pakfire/packages/make.py b/python/pakfire/packages/make.py index ca64ed3d6..2622da4b2 100644 --- a/python/pakfire/packages/make.py +++ b/python/pakfire/packages/make.py @@ -242,7 +242,7 @@ class Makefile(MakefileBase): return grabber.download(self.sources) - def dist(self, resultdirs): + def dist(self, resultdir): """ Create a source package. """ @@ -250,7 +250,7 @@ class Makefile(MakefileBase): self.download() p = packager.SourcePackager(self.pakfire, self) - p.run(resultdirs) + return p.run(resultdir) def dump(self, *args, **kwargs): dump = MakefileBase.dump(self, *args, **kwargs) diff --git a/python/pakfire/packages/packager.py b/python/pakfire/packages/packager.py index 11fc0c3d2..8cc873fa6 100644 --- a/python/pakfire/packages/packager.py +++ b/python/pakfire/packages/packager.py @@ -612,27 +612,53 @@ class SourcePackager(Packager): return metafile def create_datafile(self): - filename = self.mktemp() - datafile = InnerTarFileXz.open(filename, mode="w") + # Create a list of all files that have to be put into the + # package. + files = [] - # Add all downloaded files to the package. + # Download all files that go into the package. for file in self.pkg.download(): - datafile.add(file, "files/%s" % os.path.basename(file)) + assert os.path.getsize(file), "Don't package empty files" + files.append(("files/%s" % os.path.basename(file), file)) # Add all files in the package directory. - for file in sorted(self.pkg.files): - arcname = os.path.relpath(file, self.pkg.path) - datafile.add(file, arcname) + for file in self.pkg.files: + files.append((os.path.relpath(file, self.pkg.path), file)) + + # Add files in alphabetical order. + files.sort() + + # Load progressbar. + message = "%-10s : %s" % (_("Packaging"), self.pkg.friendly_name) + pb = util.make_progress(message, len(files), eta=False) + + filename = self.mktemp() + datafile = InnerTarFileXz.open(filename, mode="w") + + i = 0 + for arcname, file in files: + if pb: + i += 1 + pb.update(i) + datafile.add(file, arcname) datafile.close() + if pb: + pb.finish() + return filename - def run(self, resultdirs=[]): - assert resultdirs + def run(self, resultdir): + # Create resultdir if it does not exist yet. + if not os.path.exists(resultdir): + os.makedirs(resultdir) log.info(_("Building source package %s:") % self.pkg.package_filename) + # The filename where this source package is saved at. + target_filename = os.path.join(resultdir, self.pkg.package_filename) + # Add datafile to package. datafile = self.create_datafile() @@ -648,28 +674,11 @@ class SourcePackager(Packager): self.add(datafile, "data.img") # Build the final tarball. - tempfile = self.mktemp() - self.save(tempfile) - - for resultdir in resultdirs: - # XXX sometimes, there has been a None in resultdirs - if not resultdir: - continue - - resultdir = "%s/%s" % (resultdir, self.pkg.arch) - - if not os.path.exists(resultdir): - os.makedirs(resultdir) - - resultfile = os.path.join(resultdir, self.pkg.package_filename) - log.info("Saving package to %s" % resultfile) - try: - os.link(tempfile, resultfile) - except OSError: - shutil.copy2(tempfile, resultfile) + try: + self.save(target_filename) + except: + # Remove the target file when anything went wrong. + os.unlink(target_filename) + raise - # Dump package information. - pkg = SourcePackage(self.pakfire, self.pakfire.repos.dummy, tempfile) - for line in pkg.dump(long=True).splitlines(): - log.info(line) - log.info("") + return target_filename