mirror of
https://github.com/abraunegg/onedrive
synced 2024-05-15 12:16:49 +02:00
half working uploadDifference
This commit is contained in:
parent
f8e87a2d4f
commit
ac4584f795
90
src/sync.d
90
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue