commit 5e1c25f4b569e4c6d0400c4014173e0e5020f898
parent e1355cef2ff11d607b32b54d0869d52e47adabc2
Author: Dan Stillman <dstillman@zotero.org>
Date: Sat, 23 May 2015 20:51:55 -0400
Async Zotero.File.copyDirectory()
Diffstat:
3 files changed, 53 insertions(+), 14 deletions(-)
diff --git a/chrome/content/zotero/xpcom/attachments.js b/chrome/content/zotero/xpcom/attachments.js
@@ -1128,9 +1128,9 @@ Zotero.Attachments = new function(){
// Copy over files if they exist
if (newAttachment.isImportedAttachment() && attachment.getFile()) {
- var dir = Zotero.Attachments.getStorageDirectory(attachment);
- var newDir = yield Zotero.Attachments.createDirectoryForItem(newAttachment);
- Zotero.File.copyDirectory(dir, newDir);
+ let dir = Zotero.Attachments.getStorageDirectory(attachment);
+ let newDir = yield Zotero.Attachments.createDirectoryForItem(newAttachment);
+ yield Zotero.File.copyDirectory(dir, newDir);
}
yield newAttachment.addLinkedItem(attachment);
diff --git a/chrome/content/zotero/xpcom/file.js b/chrome/content/zotero/xpcom/file.js
@@ -583,18 +583,26 @@ Zotero.File = new function(){
/**
* Copies all files from dir into newDir
+ *
+ * @param {String|nsIFile} source - Source directory
+ * @param {String|nsIFile} target - Target directory
*/
- this.copyDirectory = function (dir, newDir) {
- if (!dir.exists()) {
- throw ("Directory doesn't exist in Zotero.File.copyDirectory()");
- }
- var otherFiles = dir.directoryEntries;
- while (otherFiles.hasMoreElements()) {
- var file = otherFiles.getNext();
- file.QueryInterface(Components.interfaces.nsIFile);
- file.copyTo(newDir, null);
- }
- }
+ this.copyDirectory = Zotero.Promise.coroutine(function* (source, target) {
+ if (source instanceof Ci.nsIFile) source = source.path;
+ if (target instanceof Ci.nsIFile) target = target.path;
+
+ yield OS.File.makeDir(target, {
+ ignoreExisting: true,
+ unixMode: 0o755
+ });
+
+ return this.iterateDirectory(source, function* (iterator) {
+ while (true) {
+ let entry = yield iterator.next();
+ yield OS.File.copy(entry.path, OS.Path.join(target, entry.name));
+ }
+ })
+ });
this.createDirectoryIfMissing = function (dir) {
diff --git a/test/tests/fileTest.js b/test/tests/fileTest.js
@@ -0,0 +1,31 @@
+describe("Zotero.File", function () {
+ describe("#copyDirectory()", function () {
+ it("should copy all files within a directory", function* () {
+ var tmpDir = Zotero.getTempDirectory().path;
+ var tmpCopyDir = OS.Path.join(tmpDir, "copyDirectory")
+ var source = OS.Path.join(tmpCopyDir, "1");
+ var target = OS.Path.join(tmpCopyDir, "2");
+ yield OS.File.makeDir(source, {
+ from: tmpDir
+ });
+
+ yield Zotero.File.putContentsAsync(OS.Path.join(source, "A"), "Test 1");
+ yield Zotero.File.putContentsAsync(OS.Path.join(source, "B"), "Test 2");
+
+ yield OS.File.removeDir(target, {
+ ignoreAbsent: true
+ });
+
+ yield Zotero.File.copyDirectory(source, target);
+
+ assert.equal(
+ (yield Zotero.File.getContentsAsync(OS.Path.join(target, "A"))),
+ "Test 1"
+ );
+ assert.equal(
+ (yield Zotero.File.getContentsAsync(OS.Path.join(target, "B"))),
+ "Test 2"
+ );
+ })
+ })
+})