common/buildpackage: support for different archive formats
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Tue, 15 May 2012 13:37:33 +0000 (16:37 +0300)
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Fri, 14 Nov 2014 12:22:00 +0000 (14:22 +0200)
Adds support for defining the archive format of the output of
git_archive_single(), e.g. 'zip'. Defaults to 'tar', as before.

Signed-off-by: Ed Bartosh <eduard.bartosh@intel.com>
Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
debian/control
gbp/command_wrappers.py
gbp/scripts/common/buildpackage.py

index 58d9a35..45d28a9 100644 (file)
@@ -45,7 +45,7 @@ Depends: ${python:Depends},
  python-dateutil,
  python-pkg-resources,
 Recommends: pristine-tar (>= 0.5), cowbuilder
-Suggests: python-notify, unzip
+Suggests: python-notify, unzip, zipmerge
 Description: Suite to help with Debian packages in Git repositories
  This package contains the following tools:
   * gbp import-{dsc,dscs}: import existing Debian source packages into a git
index b8bd21f..f1312e4 100644 (file)
@@ -233,6 +233,16 @@ class UnpackZipArchive(Command):
         self.run_error = 'Couldn\'t unpack "%s"' % self.archive
 
 
+class CatenateZipArchive(Command):
+    """Wrap zipmerge tool to catenate a zip file with the next"""
+    def __init__(self, archive, **kwargs):
+        self.archive = archive
+        Command.__init__(self, 'zipmerge', [archive], **kwargs)
+
+    def __call__(self, target):
+        Command.__call__(self, [target])
+
+
 class GitCommand(Command):
     "Mother/Father of all git commands"
     def __init__(self, cmd, args=[], **kwargs):
index 0522cd6..e293c33 100644 (file)
@@ -22,7 +22,7 @@ import os, os.path
 import pipes
 import tempfile
 import shutil
-from gbp.command_wrappers import (CatenateTarArchive)
+from gbp.command_wrappers import (CatenateTarArchive, CatenateZipArchive)
 from gbp.errors import GbpError
 import gbp.log
 
@@ -50,51 +50,59 @@ def sanitize_prefix(prefix):
     return '/'
 
 
-def git_archive_submodules(repo, treeish, output, prefix, comp_type, comp_level, comp_opts):
+def git_archive_submodules(repo, treeish, output, prefix, comp_type, comp_level,
+                           comp_opts, format='tar'):
     """
-    Create tar.gz of an archive with submodules
+    Create a source tree archive with submodules.
 
-    since git-archive always writes an end of tarfile trailer we concatenate
+    Since git-archive always writes an end of tarfile trailer we concatenate
     the generated archives using tar and compress the result.
 
     Exception handling is left to the caller.
     """
     prefix = sanitize_prefix(prefix)
-    tarfile = output.rsplit('.', 1)[0]
     tempdir = tempfile.mkdtemp()
-    submodule_tarfile = os.path.join(tempdir, "submodule.tar")
+    main_archive = os.path.join(tempdir, "main.%s" % format)
+    submodule_archive = os.path.join(tempdir, "submodule.%s" % format)
     try:
-        # generate main tarfile
-        repo.archive(format='tar', prefix=prefix,
-                     output=tarfile, treeish=treeish)
+        # generate main (tmp) archive
+        repo.archive(format=format, prefix=prefix,
+                     output=main_archive, treeish=treeish)
 
-        # generate each submodule's tarfile and append it to the main archive
+        # generate each submodule's arhive and append it to the main archive
         for (subdir, commit) in repo.get_submodules(treeish):
             tarpath = [subdir, subdir[2:]][subdir.startswith("./")]
 
             gbp.log.debug("Processing submodule %s (%s)" % (subdir, commit[0:8]))
-            repo.archive(format='tar', prefix='%s%s/' % (prefix, tarpath),
-                         output=submodule_tarfile, treeish=commit, cwd=subdir)
-            CatenateTarArchive(tarfile)(submodule_tarfile)
+            repo.archive(format=format, prefix='%s%s/' % (prefix, tarpath),
+                         output=submodule_archive, treeish=commit, cwd=subdir)
+            if format == 'tar':
+                CatenateTarArchive(main_archive)(submodule_archive)
+            elif format == 'zip':
+                CatenateZipArchive(main_archive)(submodule_archive)
 
         # compress the output
-        ret = os.system("%s -%s %s %s" % (comp_type, comp_level, comp_opts, tarfile))
-        if ret:
-            raise GbpError("Error creating %s: %d" % (output, ret))
+        if comp_type:
+            ret = os.system("%s --stdout -%s %s %s > %s" % (comp_type, comp_level, comp_opts, main_archive, output))
+            if ret:
+                raise GbpError("Error creating %s: %d" % (output, ret))
+        else:
+            shutil.move(main_archive, output)
     finally:
         shutil.rmtree(tempdir)
 
 
-def git_archive_single(treeish, output, prefix, comp_type, comp_level, comp_opts):
+def git_archive_single(treeish, output, prefix, comp_type, comp_level, comp_opts, format='tar'):
     """
-    Create tar.gz of an archive without submodules
+    Create an archive without submodules
 
     Exception handling is left to the caller.
     """
     prefix = sanitize_prefix(prefix)
     pipe = pipes.Template()
-    pipe.prepend("git archive --format=tar --prefix=%s %s" % (prefix, treeish), '.-')
-    pipe.append('%s -c -%s %s' % (comp_type, comp_level, comp_opts),  '--')
+    pipe.prepend("git archive --format=%s --prefix=%s %s" % (format, prefix, treeish), '.-')
+    if comp_type:
+        pipe.append('%s -c -%s %s' % (comp_type, comp_level, comp_opts),  '--')
     ret = pipe.copy('', output)
     if ret:
         raise GbpError("Error creating %s: %d" % (output, ret))