buildpackage/dump_tree: add 'recursive' option
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Tue, 17 Sep 2013 12:13:40 +0000 (15:13 +0300)
committerGuido Günther <agx@sigxcpu.org>
Sun, 28 Dec 2014 12:03:40 +0000 (13:03 +0100)
For selecting whether to dump all the files recursively or just the top
level directory of the tree.

Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
gbp/scripts/common/buildpackage.py
tests/04_test_submodules.py

index 0522cd6b3e4cb473527f60fd63eb8d4dcc29710d..2e53b78274c9895ab5a4732a5396eb5c9a43d108 100644 (file)
@@ -101,13 +101,19 @@ def git_archive_single(treeish, output, prefix, comp_type, comp_level, comp_opts
 
 
 #{ Functions to handle export-dir
-def dump_tree(repo, export_dir, treeish, with_submodules):
+def dump_tree(repo, export_dir, treeish, with_submodules, recursive=True):
     "dump a tree to output_dir"
     output_dir = os.path.dirname(export_dir)
     prefix = sanitize_prefix(os.path.basename(export_dir))
+    if recursive:
+        paths = []
+    else:
+        paths = ["'%s'" % nam for _mod, typ, _sha, nam in
+                    repo.list_tree(treeish) if typ == 'blob']
 
     pipe = pipes.Template()
-    pipe.prepend('git archive --format=tar --prefix=%s %s' % (prefix, treeish), '.-')
+    pipe.prepend('git archive --format=tar --prefix=%s %s -- %s' %
+                 (prefix, treeish, ' '.join(paths)), '.-')
     pipe.append('tar -C %s -xf -' % output_dir,  '-.')
     top = os.path.abspath(os.path.curdir)
     try:
@@ -115,7 +121,7 @@ def dump_tree(repo, export_dir, treeish, with_submodules):
         if ret:
             raise GbpError("Error in dump_tree archive pipe")
 
-        if with_submodules:
+        if recursive and with_submodules:
             if repo.has_submodules():
                 repo.update_submodules()
             for (subdir, commit) in repo.get_submodules(treeish):
index 4b072201801a574dafc9f776f4851be89fc4b042..a18f8b51f50238a807cfefd598c351384e3b9da8 100644 (file)
@@ -22,6 +22,7 @@ SUBMODULES = []
 SUBMODULE_NAMES = ["test_submodule", "sub module"]
 TMPDIR = None
 TESTFILE_NAME = "testfile"
+TESTDIR_NAME = "testdir"
 
 class Submodule(object):
     """Class representing remote repo for Git submodule"""
@@ -57,6 +58,8 @@ def test_empty_has_submodules():
 def _add_dummy_data(repo, msg):
     """Commit dummy data to a Git repository"""
     shutil.copy(".git/HEAD", TESTFILE_NAME)
+    os.mkdir(TESTDIR_NAME)
+    shutil.copy(TESTFILE_NAME, os.path.join(TESTDIR_NAME, TESTFILE_NAME))
     repo.add_files('.', force=True)
     repo.commit_all(msg)
 
@@ -99,8 +102,16 @@ def test_dump_tree():
     os.mkdir(dumpdir)
     ok_(buildpackage.dump_tree(REPO, dumpdir, "master", True))
     ok_(os.path.exists(os.path.join(dumpdir, TESTFILE_NAME)))
+    ok_(os.path.exists(os.path.join(dumpdir, TESTDIR_NAME, TESTFILE_NAME)))
     ok_(os.path.exists(os.path.join(dumpdir, SUBMODULES[0].name,
                                     TESTFILE_NAME)))
+    # No submodules or subdirs if recursive is False
+    dumpdir = TMPDIR.join("dump2")
+    os.mkdir(dumpdir)
+    ok_(buildpackage.dump_tree(REPO, dumpdir, "master", True, False))
+    ok_(os.path.exists(os.path.join(dumpdir, TESTFILE_NAME)))
+    ok_(not os.path.exists(os.path.join(dumpdir, TESTDIR_NAME)))
+    ok_(not os.path.exists(os.path.join(dumpdir, SUBMODULES[0].name)))
 
 
 def test_create_tarballs():
@@ -120,12 +131,12 @@ def test_check_tarfiles():
     tarobj = tarfile.open(TMPDIR.join("test_0.1.orig.tar.bz2"), 'r:*')
     files = tarobj.getmembers()
     ok_("test-0.1/.gitmodules" in [ f.name for f in files ])
-    eq_(len(files) , 6)
+    eq_(len(files) , 10)
     # Check tarball without submodules
     tarobj = tarfile.open(TMPDIR.join("test_0.2.orig.tar.bz2"), 'r:*')
     files = tarobj.getmembers()
     ok_(("test-0.2/%s" % TESTFILE_NAME) in [ f.name for f in files ])
-    eq_(len(files) , 4)
+    eq_(len(files) , 6)
 
 def test_add_whitespace_submodule():
     """Add a second submodule with name containing whitespace"""