import-orig: new function for filtering/re-packing sources
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Mon, 26 Aug 2013 07:22:00 +0000 (10:22 +0300)
committerJun Wang <junbill.wang@samsung.com>
Wed, 27 Jan 2016 10:51:03 +0000 (18:51 +0800)
Introduces a new function prepare_sources() that prepares upstream
sources for importing into upstream branch and pristine-tar. That
includes unpacking, filtering and re-packing sources. What somewhat
complicates the logic is that it tries to avoid excess unpacking/packing
of the sources.

Also fixes the unpacking / filtering / repacking logic which was broken
with some parameter combinations.

Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
Conflicts:
tests/test_import_orig.py
tests/testutils.py

gbp/scripts/common/import_orig.py

index 177ec324c710aa35b9f3b70a7a4290b2d22683d1..8eaf39045ed851852d6cfd8cfaabe0d8e3cc0107 100644 (file)
@@ -231,3 +231,126 @@ def repack_source(source, new_name, unpack_dir, filters, new_prefix=None):
         repacked.unpack(unpack_dir)
     return repacked
 
+
+def prepare_pristine_tar(source, pkg_name, pkg_version, pristine_commit_name,
+                         filters=None, prefix=None, tmpdir=None):
+    """
+    Prepare the upstream sources for pristine-tar import
+
+    @param source: original upstream sources
+    @type source: C{UpstreamSource}
+    @param pkg_name: package name
+    @type pkg_name: C{str}
+    @param pkg_version: upstream version of the package
+    @type pkg_version: C{str}
+    @param pristine_commit_name: archive filename to commit to pristine-tar
+    @type pristine_commit_name: C{str} or C{None}
+    @param filters: filter to exclude files
+    @type filters: C{list} of C{str} or C{None}
+    @param prefix: prefix (i.e. leading directory of files) to use in
+                   pristine-tar, set to C{None} to not mangle orig archive
+    @type prefix: C{str} or C{None}
+    @param tmpdir: temporary working dir (cleanup left to caller)
+    @type tmpdir: C{str}
+    @return: prepared source archive
+    @rtype: C{UpstreamSource}
+    """
+    need_repack = False
+    if source.is_dir():
+        if prefix is None:
+            prefix = '%s-%s' % (pkg_name, pkg_version)
+            gbp.log.info("Using guessed prefix '%s/' for pristine-tar" % prefix)
+        need_repack = True
+    else:
+        if prefix is not None and prefix == source.prefix:
+            prefix = None
+        comp = parse_archive_filename(pristine_commit_name)[2]
+        if filters or prefix is not None or source.compression != comp:
+            if not source.unpacked:
+                unpack_dir = tempfile.mkdtemp(prefix='pristine_unpack_',
+                                              dir=tmpdir)
+                source.unpack(unpack_dir)
+            need_repack = True
+    pristine_path = os.path.join(tmpdir, pristine_commit_name)
+    if need_repack:
+        gbp.log.debug("Packing '%s' from '%s' for pristine-tar" %
+                        (pristine_path, source.unpacked))
+        pristine = source.pack(pristine_path, filters, prefix)
+    else:
+        # Just create symlink for mangling the pristine tarball name
+        os.symlink(source.path, pristine_path)
+        pristine = source.__class__(pristine_path)
+
+    return pristine
+
+
+def prepare_sources(source, pkg_name, pkg_version, pristine_commit_name,
+                    filters, filter_pristine, prefix, tmpdir):
+    """
+    Prepare upstream sources for importing
+
+    Unpack, filter and repack sources for importing to git and to pristine-tar.
+
+    @param source: original upstream sources
+    @type source: C{UpstreamSource}
+    @param pkg_name: package name
+    @type pkg_name: C{str}
+    @param pkg_version: upstream version of the package
+    @type pkg_version: C{str}
+    @param pristine_commit_name: archive filename to commit to pristine-tar
+    @type pristine_commit_name: C{str} or C{None}
+    @param filters: filter to exclude files
+    @type filters: C{list} of C{str}
+    @param filter_pristine: filter pristine-tar, too
+    @type filter_pristine: C{bool}
+    @param prefix: prefix (i.e. leading directory of files) to use in
+                   pristine-tar, set to C{None} to not mangle orig archive
+    @type prefix: C{str} or C{None}
+    @param tmpdir: temporary working dir (cleanup left to caller)
+    @type tmpdir: C{str}
+    @return: path to prepared source tree and tarball to commit to pristine-tar
+    @rtype: C{tuple} of C{str}
+    """
+    pristine = None
+    # Determine parameters for pristine tar
+    pristine_filters = filters if filters and filter_pristine else None
+    pristine_prefix = None
+    if prefix is not None and prefix != 'auto':
+        prefix_subst = {'name': pkg_name,
+                        'version': pkg_version,
+                        'upstreamversion': pkg_version}
+        pristine_prefix = prefix % prefix_subst
+    # Handle unpacked sources, i.e. importing a directory
+    if source.is_dir():
+        if pristine_commit_name:
+            gbp.log.warn('Preparing unpacked sources for pristine-tar')
+            pristine = prepare_pristine_tar(source, pkg_name, pkg_version,
+                                            pristine_commit_name,
+                                            pristine_filters, pristine_prefix,
+                                            tmpdir)
+        if filters:
+            # Re-use sources packed for pristine-tar, if available
+            if pristine:
+                packed = pristine
+            else:
+                packed_fn = tempfile.mkstemp(prefix="packed_", dir=tmpdir,
+                                             suffix='.tar')[1]
+                gbp.log.debug("Packing '%s' to '%s'" % (source.path, packed_fn))
+                packed = source.pack(packed_fn)
+            unpack_dir = tempfile.mkdtemp(prefix='filtered_', dir=tmpdir)
+            filtered = packed.unpack(unpack_dir, filters)
+        else:
+            filtered = source
+    # Handle source archives
+    else:
+        unpack_dir = tempfile.mkdtemp(prefix='filtered_', dir=tmpdir)
+        gbp.log.debug("Unpacking '%s' to '%s'" % (source.path, unpack_dir))
+        filtered = source.unpack(unpack_dir, filters)
+        if pristine_commit_name:
+            pristine = prepare_pristine_tar(source, pkg_name, pkg_version,
+                                            pristine_commit_name,
+                                            pristine_filters, pristine_prefix,
+                                            tmpdir)
+    pristine_path = pristine.path if pristine else ''
+    return (filtered.unpacked, pristine_path)
+