add CollectionWriter.write_directory_tree()
authorTom Clegg <tom@clinicalfuture.com>
Thu, 12 Sep 2013 19:55:14 +0000 (15:55 -0400)
committerTom Clegg <tom@clinicalfuture.com>
Sun, 15 Sep 2013 21:47:45 +0000 (17:47 -0400)
sdk/python/arvados.py

index e5d1d70c6cd316c1ba13d5f3709e806e3f5587eb..317de38a2b17728109e5a09d9cd66179f3d7efe7 100644 (file)
@@ -678,6 +678,31 @@ class CollectionWriter:
         pass
     def __exit__(self):
         self.finish()
+    def write_directory_tree(self,
+                             path, stream_name='.', max_manifest_depth=-1):
+        self.start_new_stream(stream_name)
+        todo = []
+        if max_manifest_depth == 0:
+            dirents = util.listdir_recursive(path)
+        else:
+            dirents = sorted(os.listdir(path))
+        for dirent in dirents:
+            target = os.path.join(path, dirent)
+            if os.path.isdir(target):
+                todo += [[target,
+                          os.path.join(stream_name, dirent),
+                          max_manifest_depth-1]]
+            else:
+                self.start_new_file(dirent)
+                with open(target, 'rb') as f:
+                    while True:
+                        buf = f.read(2**26)
+                        if len(buf) == 0:
+                            break
+                        self.write(buf)
+        self.finish_current_stream()
+        map(lambda x: self.write_directory_tree(*x), todo)
+
     def write(self, newdata):
         self._data_buffer += [newdata]
         self._data_buffer_len += len(newdata)