add draft of keeping folder
This commit is contained in:
parent
df0a0e2daa
commit
d3e134ce73
77
src/sync.ts
77
src/sync.ts
@ -309,6 +309,7 @@ const getSyncPlanInplace = async (
|
|||||||
profiler?.insertSize("sizeof sortedKeys", sortedKeys);
|
profiler?.insertSize("sizeof sortedKeys", sortedKeys);
|
||||||
|
|
||||||
const keptFolder = new Set<string>();
|
const keptFolder = new Set<string>();
|
||||||
|
const mayDeleteFolder = new Set<string>();
|
||||||
|
|
||||||
for (let i = 0; i < sortedKeys.length; ++i) {
|
for (let i = 0; i < sortedKeys.length; ++i) {
|
||||||
if (i % 100 === 0) {
|
if (i % 100 === 0) {
|
||||||
@ -330,6 +331,7 @@ const getSyncPlanInplace = async (
|
|||||||
// parent should also be kept
|
// parent should also be kept
|
||||||
// console.debug(`${key} in keptFolder`)
|
// console.debug(`${key} in keptFolder`)
|
||||||
keptFolder.add(getParentFolder(key));
|
keptFolder.add(getParentFolder(key));
|
||||||
|
mayDeleteFolder.delete(getParentFolder(key));
|
||||||
// should fill the missing part
|
// should fill the missing part
|
||||||
if (local !== undefined && remote !== undefined) {
|
if (local !== undefined && remote !== undefined) {
|
||||||
mixedEntry.decisionBranch = 101;
|
mixedEntry.decisionBranch = 101;
|
||||||
@ -364,49 +366,101 @@ const getSyncPlanInplace = async (
|
|||||||
mixedEntry.change = true;
|
mixedEntry.change = true;
|
||||||
}
|
}
|
||||||
keptFolder.delete(key); // no need to save it in the Set later
|
keptFolder.delete(key); // no need to save it in the Set later
|
||||||
|
mayDeleteFolder.delete(key); // must ignore this
|
||||||
} else {
|
} else {
|
||||||
if (howToCleanEmptyFolder === "skip") {
|
if (howToCleanEmptyFolder === "skip") {
|
||||||
mixedEntry.decisionBranch = 105;
|
mixedEntry.decisionBranch = 105;
|
||||||
mixedEntry.decision = "folder_to_skip";
|
mixedEntry.decision = "folder_to_skip";
|
||||||
mixedEntry.change = false;
|
mixedEntry.change = false;
|
||||||
|
keptFolder.add(getParentFolder(key)); // we want to keep parent!
|
||||||
|
mayDeleteFolder.delete(getParentFolder(key)); // we don't want to delete parent!
|
||||||
} else if (howToCleanEmptyFolder === "clean_both") {
|
} else if (howToCleanEmptyFolder === "clean_both") {
|
||||||
if (local !== undefined && remote !== undefined) {
|
if (local !== undefined && remote !== undefined) {
|
||||||
if (syncDirection === "bidirectional") {
|
if (syncDirection === "bidirectional") {
|
||||||
mixedEntry.decisionBranch = 106;
|
if (mayDeleteFolder.has(key)) {
|
||||||
mixedEntry.decision = "folder_to_be_deleted_on_both";
|
// from 0.5.6 and on,
|
||||||
mixedEntry.change = true;
|
// we only delete the folders caused by file deletion
|
||||||
|
mixedEntry.decisionBranch = 106;
|
||||||
|
mixedEntry.decision = "folder_to_be_deleted_on_both";
|
||||||
|
mixedEntry.change = true;
|
||||||
|
mayDeleteFolder.add(getParentFolder(key));
|
||||||
|
mayDeleteFolder.delete(key); // good to remove now
|
||||||
|
} else {
|
||||||
|
mixedEntry.decisionBranch = 115;
|
||||||
|
mixedEntry.decision = "folder_existed_both_then_do_nothing";
|
||||||
|
mixedEntry.change = false;
|
||||||
|
keptFolder.add(getParentFolder(key)); // we want to keep parent!
|
||||||
|
mayDeleteFolder.delete(getParentFolder(key)); // we don't want to delete parent!
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// right now it does nothing because of "incremental"
|
// right now it does nothing because of "incremental"
|
||||||
// TODO: should we delete??
|
// TODO: should we delete??
|
||||||
mixedEntry.decisionBranch = 109;
|
mixedEntry.decisionBranch = 109;
|
||||||
mixedEntry.decision = "folder_to_skip";
|
mixedEntry.decision = "folder_to_skip";
|
||||||
mixedEntry.change = false;
|
mixedEntry.change = false;
|
||||||
|
keptFolder.add(getParentFolder(key)); // we want to keep parent!
|
||||||
|
mayDeleteFolder.delete(getParentFolder(key)); // we don't want to delete parent!
|
||||||
}
|
}
|
||||||
} else if (local !== undefined && remote === undefined) {
|
} else if (local !== undefined && remote === undefined) {
|
||||||
if (syncDirection === "bidirectional") {
|
if (syncDirection === "bidirectional") {
|
||||||
mixedEntry.decisionBranch = 110;
|
if (mayDeleteFolder.has(key)) {
|
||||||
mixedEntry.decision = "folder_to_be_deleted_on_local";
|
// from 0.5.6 and on,
|
||||||
mixedEntry.change = true;
|
// we only delete the folders caused by file deletion
|
||||||
|
mixedEntry.decisionBranch = 110;
|
||||||
|
mixedEntry.decision = "folder_to_be_deleted_on_local";
|
||||||
|
mixedEntry.change = true;
|
||||||
|
mayDeleteFolder.add(getParentFolder(key));
|
||||||
|
mayDeleteFolder.delete(key); // good to remove now
|
||||||
|
} else {
|
||||||
|
// the folder might be created locally
|
||||||
|
// so we want to create it remotely as well.
|
||||||
|
mixedEntry.decisionBranch = 116;
|
||||||
|
mixedEntry.decision =
|
||||||
|
"folder_existed_local_then_also_create_remote";
|
||||||
|
mixedEntry.change = false;
|
||||||
|
keptFolder.add(getParentFolder(key)); // we want to keep parent!
|
||||||
|
mayDeleteFolder.delete(getParentFolder(key)); // we don't want to delete parent!
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// right now it does nothing because of "incremental"
|
// right now it does nothing because of "incremental"
|
||||||
// TODO: should we delete??
|
// TODO: should we delete??
|
||||||
mixedEntry.decisionBranch = 111;
|
mixedEntry.decisionBranch = 111;
|
||||||
mixedEntry.decision = "folder_to_skip";
|
mixedEntry.decision = "folder_to_skip";
|
||||||
mixedEntry.change = false;
|
mixedEntry.change = false;
|
||||||
|
keptFolder.add(getParentFolder(key)); // we want to keep parent!
|
||||||
|
mayDeleteFolder.delete(getParentFolder(key)); // we don't want to delete parent!
|
||||||
}
|
}
|
||||||
} else if (local === undefined && remote !== undefined) {
|
} else if (local === undefined && remote !== undefined) {
|
||||||
if (syncDirection === "bidirectional") {
|
if (syncDirection === "bidirectional") {
|
||||||
mixedEntry.decisionBranch = 112;
|
if (mayDeleteFolder.has(key)) {
|
||||||
mixedEntry.decision = "folder_to_be_deleted_on_remote";
|
// from 0.5.6 and on,
|
||||||
mixedEntry.change = true;
|
// we only delete the folders caused by file deletion
|
||||||
|
mixedEntry.decisionBranch = 112;
|
||||||
|
mixedEntry.decision = "folder_to_be_deleted_on_remote";
|
||||||
|
mixedEntry.change = true;
|
||||||
|
mayDeleteFolder.add(getParentFolder(key));
|
||||||
|
mayDeleteFolder.delete(key); // good to remove now
|
||||||
|
} else {
|
||||||
|
// the folder might be created remotely
|
||||||
|
// so we want to create it locally as well.
|
||||||
|
mixedEntry.decisionBranch = 117;
|
||||||
|
mixedEntry.decision =
|
||||||
|
"folder_existed_remote_then_also_create_local";
|
||||||
|
mixedEntry.change = false;
|
||||||
|
keptFolder.add(getParentFolder(key)); // we want to keep parent!
|
||||||
|
mayDeleteFolder.delete(getParentFolder(key)); // we don't want to delete parent!
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// right now it does nothing because of "incremental"
|
// right now it does nothing because of "incremental"
|
||||||
// TODO: should we delete??
|
// TODO: should we delete??
|
||||||
mixedEntry.decisionBranch = 113;
|
mixedEntry.decisionBranch = 113;
|
||||||
mixedEntry.decision = "folder_to_skip";
|
mixedEntry.decision = "folder_to_skip";
|
||||||
mixedEntry.change = false;
|
mixedEntry.change = false;
|
||||||
|
keptFolder.add(getParentFolder(key)); // we want to keep parent!
|
||||||
|
mayDeleteFolder.delete(getParentFolder(key)); // we don't want to delete parent!
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// local === undefined && remote === undefined
|
||||||
// no folder to delete, do nothing
|
// no folder to delete, do nothing
|
||||||
mixedEntry.decisionBranch = 114;
|
mixedEntry.decisionBranch = 114;
|
||||||
mixedEntry.decision = "folder_to_skip";
|
mixedEntry.decision = "folder_to_skip";
|
||||||
@ -658,6 +712,7 @@ const getSyncPlanInplace = async (
|
|||||||
mixedEntry.decisionBranch = 4;
|
mixedEntry.decisionBranch = 4;
|
||||||
mixedEntry.decision = "local_is_deleted_thus_also_delete_remote";
|
mixedEntry.decision = "local_is_deleted_thus_also_delete_remote";
|
||||||
mixedEntry.change = true;
|
mixedEntry.change = true;
|
||||||
|
mayDeleteFolder.add(getParentFolder(key));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if B is in the previous list and MODIFIED, B has been deleted by A but modified by B
|
// if B is in the previous list and MODIFIED, B has been deleted by A but modified by B
|
||||||
@ -725,6 +780,7 @@ const getSyncPlanInplace = async (
|
|||||||
mixedEntry.decisionBranch = 7;
|
mixedEntry.decisionBranch = 7;
|
||||||
mixedEntry.decision = "remote_is_deleted_thus_also_delete_local";
|
mixedEntry.decision = "remote_is_deleted_thus_also_delete_local";
|
||||||
mixedEntry.change = true;
|
mixedEntry.change = true;
|
||||||
|
mayDeleteFolder.add(getParentFolder(key));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if A is in the previous list and MODIFIED, A has been deleted by B but modified by A
|
// if A is in the previous list and MODIFIED, A has been deleted by B but modified by A
|
||||||
@ -770,6 +826,9 @@ const getSyncPlanInplace = async (
|
|||||||
|
|
||||||
keptFolder.delete("/");
|
keptFolder.delete("/");
|
||||||
keptFolder.delete("");
|
keptFolder.delete("");
|
||||||
|
mayDeleteFolder.delete("/");
|
||||||
|
mayDeleteFolder.delete("");
|
||||||
|
|
||||||
if (keptFolder.size > 0) {
|
if (keptFolder.size > 0) {
|
||||||
throw Error(`unexpectedly keptFolder no decisions: ${[...keptFolder]}`);
|
throw Error(`unexpectedly keptFolder no decisions: ${[...keptFolder]}`);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user