]> git.ipfire.org Git - pakfire.git/commitdiff
Rework the way "dist" works.
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 11 Feb 2012 15:24:37 +0000 (16:24 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 11 Feb 2012 15:24:37 +0000 (16:24 +0100)
You now have to set the directory where the file will
be created.

python/pakfire/api.py
python/pakfire/base.py
python/pakfire/cli.py
python/pakfire/packages/make.py
python/pakfire/packages/packager.py

index c8bff043f3e03afb8c35e809e9b0b9b52138cbaa..332a7e752e4a468db6c034658cab61c2b3cbe081 100644 (file)
@@ -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.
index 47d3c1c1e950374eb49e7e880bd6dc032c5b32a1..e25c989a28a8788febb94d73356a93478528b6fe 100644 (file)
@@ -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 = []
index 6d19e97fcbbcf4f1f431baaf744d26b3e27fd47e..bd8a8ca74b6d8e334b77cedeae49fad7baf74104 100644 (file)
@@ -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)
index ca64ed3d666878d4cb5f7c7cbb6758311295d588..2622da4b2276866dce9723b981fbbdd52a914169 100644 (file)
@@ -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)
index 11fc0c3d25c83bffbf00d05d1f227a10bff2c24b..8cc873fa654be8b88e134957e8669329df8b1bf7 100644 (file)
@@ -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