aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--tools/build_defs/pkg/archive.py21
-rw-r--r--tools/build_defs/pkg/archive_test.py91
2 files changed, 103 insertions, 9 deletions
diff --git a/tools/build_defs/pkg/archive.py b/tools/build_defs/pkg/archive.py
index 95d9e73ca2..6fd1916a17 100644
--- a/tools/build_defs/pkg/archive.py
+++ b/tools/build_defs/pkg/archive.py
@@ -108,6 +108,7 @@ class TarFileWriter(object):
mode = 'w:'
self.tar = tarfile.open(name=name, mode=mode)
self.members = set([])
+ self.directories = set([])
def __enter__(self):
return self
@@ -228,6 +229,22 @@ class TarFileWriter(object):
return
if not (name == '.' or name.startswith('/') or name.startswith('./')):
name = './' + name
+ if kind == tarfile.DIRTYPE:
+ name = name.rstrip('/')
+ if name in self.directories:
+ return
+
+ components = name.rsplit('/', 1)
+ if len(components) > 1:
+ d = components[0]
+ self.add_file(d,
+ tarfile.DIRTYPE,
+ uid=uid,
+ gid=gid,
+ uname=uname,
+ gname=gname,
+ mtime=mtime,
+ mode=0755)
tarinfo = tarfile.TarInfo(name)
tarinfo.mtime = mtime
tarinfo.uid = uid
@@ -243,12 +260,14 @@ class TarFileWriter(object):
tarinfo.linkname = link
if content:
tarinfo.size = len(content)
- self.tar.addfile(tarinfo, StringIO(content))
+ self._addfile(tarinfo, StringIO(content))
elif file_content:
with open(file_content, 'rb') as f:
tarinfo.size = os.fstat(f.fileno()).st_size
self._addfile(tarinfo, f)
else:
+ if kind == tarfile.DIRTYPE:
+ self.directories.add(name)
self._addfile(tarinfo)
def add_tar(self,
diff --git a/tools/build_defs/pkg/archive_test.py b/tools/build_defs/pkg/archive_test.py
index 375a27dd9e..1ee82d5343 100644
--- a/tools/build_defs/pkg/archive_test.py
+++ b/tools/build_defs/pkg/archive_test.py
@@ -140,7 +140,9 @@ class TarFileWriterTest(unittest.TestCase):
with archive.TarFileWriter(self.tempfile) as f:
for n in names:
f.add_file(n, content=n)
- content = [{"name": n, "size": len(n), "data": n} for n in names]
+ content = ([{"name": "."}] + [{"name": n,
+ "size": len(n),
+ "data": n} for n in names])
self.assertTarFileContent(self.tempfile, content)
def testAddFile(self):
@@ -160,13 +162,9 @@ class TarFileWriterTest(unittest.TestCase):
f.add_file("..e")
f.add_file(".f")
content = [
- {"name": "./a"},
- {"name": "/b"},
- {"name": "./c"},
- {"name": "./.d"},
- {"name": "./..e"},
- {"name": "./.f"}
- ]
+ {"name": "."}, {"name": "./a"}, {"name": "/b"}, {"name": "./c"},
+ {"name": "./.d"}, {"name": "./..e"}, {"name": "./.f"}
+ ]
self.assertTarFileContent(self.tempfile, content)
def testAddDir(self):
@@ -202,6 +200,83 @@ class TarFileWriterTest(unittest.TestCase):
name_filter=lambda n: n != "./b")
self.assertTarFileContent(self.tempfile, content)
+ def testAddingDirectoriesForFile(self):
+ with archive.TarFileWriter(self.tempfile) as f:
+ f.add_file("d/f")
+ content = [
+ {"name": ".",
+ "mode": 0755},
+ {"name": "./d",
+ "mode": 0755},
+ {"name": "./d/f"},
+ ]
+ self.assertTarFileContent(self.tempfile, content)
+
+ def testAddingDirectoriesForFileSeparately(self):
+ d_dir = os.path.join(os.environ["TEST_TMPDIR"], "d_dir")
+ os.makedirs(d_dir)
+ with open(os.path.join(d_dir, "dir_file"), "w"):
+ pass
+ a_dir = os.path.join(os.environ["TEST_TMPDIR"], "a_dir")
+ os.makedirs(a_dir)
+ with open(os.path.join(a_dir, "dir_file"), "w"):
+ pass
+
+ with archive.TarFileWriter(self.tempfile) as f:
+ f.add_dir("d", d_dir)
+ f.add_file("d/f")
+
+ f.add_dir("a", a_dir)
+ f.add_file("a/b/f")
+ content = [
+ {"name": ".",
+ "mode": 0755},
+ {"name": "./d",
+ "mode": 0755},
+ {"name": "./d/dir_file"},
+ {"name": "./d/f"},
+ {"name": "./a",
+ "mode": 0755},
+ {"name": "./a/dir_file"},
+ {"name": "./a/b",
+ "mode": 0755},
+ {"name": "./a/b/f"},
+ ]
+ self.assertTarFileContent(self.tempfile, content)
+
+ def testAddingDirectoriesForFileManually(self):
+ with archive.TarFileWriter(self.tempfile) as f:
+ f.add_file("d", tarfile.DIRTYPE)
+ f.add_file("d/f")
+
+ f.add_file("a", tarfile.DIRTYPE)
+ f.add_file("a/b", tarfile.DIRTYPE)
+ f.add_file("a/b", tarfile.DIRTYPE)
+ f.add_file("a/b/", tarfile.DIRTYPE)
+ f.add_file("a/b/c/f")
+
+ f.add_file("x/y/f")
+ f.add_file("x", tarfile.DIRTYPE)
+ content = [
+ {"name": ".",
+ "mode": 0755},
+ {"name": "./d",
+ "mode": 0755},
+ {"name": "./d/f"},
+ {"name": "./a",
+ "mode": 0755},
+ {"name": "./a/b",
+ "mode": 0755},
+ {"name": "./a/b/c",
+ "mode": 0755},
+ {"name": "./a/b/c/f"},
+ {"name": "./x",
+ "mode": 0755},
+ {"name": "./x/y",
+ "mode": 0755},
+ {"name": "./x/y/f"},
+ ]
+ self.assertTarFileContent(self.tempfile, content)
if __name__ == "__main__":
unittest.main()