From ac4584f795e1bfd6911b0ae782b8795ec70685cd Mon Sep 17 00:00:00 2001 From: skilion Date: Sun, 6 Sep 2015 22:42:44 +0200 Subject: [PATCH] half working uploadDifference --- src/sync.d | 90 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 9 deletions(-) diff --git a/src/sync.d b/src/sync.d index 6c1595f5..285c3a20 100644 --- a/src/sync.d +++ b/src/sync.d @@ -43,6 +43,7 @@ final class SyncEngine OneDriveApi onedrive; ItemCache itemCache; string[] itemToDelete; // array of items to be deleted + JSONValue folderItem; this(Config cfg, OneDriveApi onedrive) { @@ -50,6 +51,11 @@ final class SyncEngine this.cfg = cfg; this.onedrive = onedrive; itemCache.init(); + folderItem = parseJSON("{ + \"name\": \"\", + \"folder\": {}, + \"fileSystemInfo\": { \"lastModifiedDateTime\": \"\" } + }"); } void applyDifferences() @@ -68,7 +74,7 @@ final class SyncEngine JSONValue changes; do { chdir(syncDir); - changes = onedrive.viewChangesByPath("Politecnico", statusToken); + changes = onedrive.viewChangesByPath("test", statusToken); foreach (item; changes["value"].array) { applyDifference(item); } @@ -266,16 +272,20 @@ final class SyncEngine private void deleteFiles() { + writeln("Deleting marked files ..."); foreach_reverse (ref path; itemToDelete) { if (isFile(path)) { remove(path); } else { - // TODO: test not empty folder - rmdir(path); + try { + rmdir(path); + } catch (FileException e) { + writeln("Keeping dir \"", path, "\" not empty"); + } } } - assumeSafeAppend(itemToDelete); itemToDelete.length = 0; + assumeSafeAppend(itemToDelete); } // scan the directory for unsynced files and upload them @@ -285,8 +295,8 @@ final class SyncEngine string currDir = getcwd(); string syncDir = cfg.get("sync_dir"); chdir(syncDir); - foreach (DirEntry entry; dirEntries(".", SpanMode.breadth, false)) { - uploadDifference(entry.name[2 .. $]); + foreach (DirEntry entry; dirEntries("test", SpanMode.breadth, false)) { + uploadDifference(entry.name); } // TODO: check deleted files chdir(currDir); @@ -294,14 +304,76 @@ final class SyncEngine private void uploadDifference(const(char)[] path) { + writeln(path); assert(exists(path)); Item item; + bool needDelete, uploadFile, createDir, changedLastModifiedTime; if (itemCache.selectByPath(path, item)) { - if (!isItemSynced(item)) { - onedrive.simpleUpload(path.dup, path, item.eTag); + final switch (item.type) { + case ItemType.file: + if (isFile(item.path)) { + SysTime localModifiedTime = timeLastModified(item.path); + import core.time: Duration; + item.mtime.fracSecs = Duration.zero; // HACK + if (localModifiedTime != item.mtime) { + writeln("Different last modified time"); + changedLastModifiedTime = true; + if (item.crc32) { + string localCrc32 = computeCrc32(item.path); + if (localCrc32 != item.crc32) { + writeln("Different content"); + uploadFile = true; + } + } else { + writeln("The local item has no hash, assuming it's different"); + uploadFile = true; + } + } + } else { + writeln("The local item is changed in a directory"); + needDelete = true; + createDir = true; + } + break; + case ItemType.dir: + if (isDir(item.path)) { + // ignore folder mtime + } else { + writeln("The local item changed in a file"); + needDelete = true; + uploadFile = true; + } + break; } } else { - onedrive.simpleUpload(path.dup, path); + if (isFile(path)) uploadFile = true; + else createDir = true; + } + + string id = item.id; + string eTag = item.eTag; + if (needDelete) { + assert(id); + writeln("Deleting ..."); + onedrive.deleteById(id, eTag); + } + if (uploadFile) { + writeln("Uploading file ..."); + auto returnedItem = onedrive.simpleUpload(path.dup, path, eTag); + id = returnedItem["id"].str; + eTag = returnedItem["eTag"].str; + } + if (uploadFile || changedLastModifiedTime) { + writeln("Updating last modified time ..."); + JSONValue mtime = ["fileSystemInfo": JSONValue(["lastModifiedDateTime": timeLastModified(path).toUTC().toISOExtString()])]; + onedrive.updateById(id, mtime, eTag); + } + if (createDir) { + writeln("Creating folder ..."); + import std.path; + folderItem["name"] = baseName(path); + folderItem["fileSystemInfo"].object["lastModifiedDateTime"] = timeLastModified(path).toUTC().toISOExtString(); + onedrive.createByPath(dirName(path), folderItem); } } }