diff options
-rw-r--r-- | tools/build_defs/pkg/archive.py | 21 | ||||
-rw-r--r-- | tools/build_defs/pkg/archive_test.py | 91 |
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() |