fix folder segments of dropbox
This commit is contained in:
parent
791c0e8df6
commit
dcd02457cb
@ -24,7 +24,7 @@
|
||||
"license": "Apache-2.0",
|
||||
"devDependencies": {
|
||||
"@microsoft/microsoft-graph-types": "^2.40.0",
|
||||
"@types/chai": "^4.3.11",
|
||||
"@types/chai": "^4.3.14",
|
||||
"@types/chai-as-promised": "^7.1.8",
|
||||
"@types/jsdom": "^21.1.6",
|
||||
"@types/lodash": "^4.14.202",
|
||||
@ -34,14 +34,14 @@
|
||||
"@types/node": "^20.10.4",
|
||||
"@types/qrcode": "^1.5.5",
|
||||
"builtin-modules": "^3.3.0",
|
||||
"chai": "^4.3.10",
|
||||
"chai": "^4.4.1",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"cross-env": "^7.0.3",
|
||||
"dotenv": "^16.3.1",
|
||||
"esbuild": "^0.19.9",
|
||||
"esbuild-plugin-inline-worker": "^0.1.1",
|
||||
"jsdom": "^23.0.1",
|
||||
"mocha": "^10.2.0",
|
||||
"mocha": "^10.4.0",
|
||||
"npm-check-updates": "^16.14.12",
|
||||
"obsidian": "^1.4.11",
|
||||
"prettier": "^3.1.1",
|
||||
|
||||
49
src/misc.ts
49
src/misc.ts
@ -534,3 +534,52 @@ export const changeMobileStatusBar = (op: "enable" | "disable") => {
|
||||
bar.style.removeProperty("margin-bottom");
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* https://github.com/remotely-save/remotely-save/issues/567
|
||||
* https://www.dropboxforum.com/t5/Dropbox-API-Support-Feedback/Case-Sensitivity-in-API-2/td-p/191279
|
||||
* @param entities
|
||||
*/
|
||||
export const fixEntityListCasesInplace = (entities: { keyRaw: string }[]) => {
|
||||
entities.sort((a, b) => a.keyRaw.length - b.keyRaw.length);
|
||||
// console.log(JSON.stringify(entities,null,2));
|
||||
|
||||
const caseMapping: Record<string, string> = { "": "" };
|
||||
for (const e of entities) {
|
||||
// console.log(`looking for: ${JSON.stringify(e, null, 2)}`);
|
||||
|
||||
let parentFolder = getParentFolder(e.keyRaw);
|
||||
if (parentFolder === "/") {
|
||||
parentFolder = "";
|
||||
}
|
||||
const parentFolderLower = parentFolder.toLocaleLowerCase();
|
||||
const segs = e.keyRaw.split("/");
|
||||
if (e.keyRaw.endsWith("/")) {
|
||||
// folder
|
||||
if (caseMapping.hasOwnProperty(parentFolderLower)) {
|
||||
const newKeyRaw = `${caseMapping[parentFolderLower]}${segs
|
||||
.slice(-2)
|
||||
.join("/")}`;
|
||||
caseMapping[newKeyRaw.toLocaleLowerCase()] = newKeyRaw;
|
||||
e.keyRaw = newKeyRaw;
|
||||
// console.log(JSON.stringify(caseMapping,null,2));
|
||||
continue;
|
||||
} else {
|
||||
throw Error(`${parentFolder} doesn't have cases record??`);
|
||||
}
|
||||
} else {
|
||||
// file
|
||||
if (caseMapping.hasOwnProperty(parentFolderLower)) {
|
||||
const newKeyRaw = `${caseMapping[parentFolderLower]}${segs
|
||||
.slice(-1)
|
||||
.join("/")}`;
|
||||
e.keyRaw = newKeyRaw;
|
||||
continue;
|
||||
} else {
|
||||
throw Error(`${parentFolder} doesn't have cases record??`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return entities;
|
||||
};
|
||||
|
||||
@ -12,6 +12,7 @@ import {
|
||||
} from "./baseTypes";
|
||||
import {
|
||||
bufferToArrayBuffer,
|
||||
fixEntityListCasesInplace,
|
||||
getFolderLevels,
|
||||
hasEmojiInText,
|
||||
headersToRecord,
|
||||
@ -635,6 +636,8 @@ export const listAllFromRemote = async (client: WrappedDropboxClient) => {
|
||||
unifiedContents.push(...unifiedContents2);
|
||||
}
|
||||
|
||||
fixEntityListCasesInplace(unifiedContents);
|
||||
|
||||
return unifiedContents;
|
||||
};
|
||||
|
||||
|
||||
@ -285,3 +285,56 @@ describe("Misc: special char for dir", () => {
|
||||
expect(misc.checkHasSpecialCharForDir("xxx?yyy")).to.be.true;
|
||||
});
|
||||
});
|
||||
|
||||
describe("Misc: Dropbox: should fix the folder name cases", () => {
|
||||
it("should do nothing on empty folders", () => {
|
||||
const input: any[] = [];
|
||||
expect(misc.fixEntityListCasesInplace(input)).to.be.empty;
|
||||
});
|
||||
|
||||
it("should sort folders by length by side effect", () => {
|
||||
const input = [
|
||||
{ keyRaw: "aaaa/" },
|
||||
{ keyRaw: "bbb/" },
|
||||
{ keyRaw: "c/" },
|
||||
{ keyRaw: "dd/" },
|
||||
];
|
||||
|
||||
const output = [
|
||||
{ keyRaw: "c/" },
|
||||
{ keyRaw: "dd/" },
|
||||
{ keyRaw: "bbb/" },
|
||||
{ keyRaw: "aaaa/" },
|
||||
];
|
||||
expect(misc.fixEntityListCasesInplace(input)).to.deep.equal(output);
|
||||
});
|
||||
|
||||
it("should fix folder names", () => {
|
||||
const input = [
|
||||
{ keyRaw: "AAA/" },
|
||||
{ keyRaw: "aaa/bbb/CCC.md" },
|
||||
{ keyRaw: "aaa/BBB/" },
|
||||
|
||||
{ keyRaw: "ddd/" },
|
||||
{ keyRaw: "DDD/EEE/fff.md" },
|
||||
{ keyRaw: "DDD/eee/" },
|
||||
|
||||
{ keyRaw: "Ggg/" },
|
||||
{ keyRaw: "ggG/hHH你好/Fff世界.md" },
|
||||
{ keyRaw: "ggG/Hhh你好/" },
|
||||
];
|
||||
|
||||
const output = [
|
||||
{ keyRaw: "AAA/" },
|
||||
{ keyRaw: "ddd/" },
|
||||
{ keyRaw: "Ggg/" },
|
||||
{ keyRaw: "AAA/BBB/" },
|
||||
{ keyRaw: "ddd/eee/" },
|
||||
{ keyRaw: "Ggg/Hhh你好/" },
|
||||
{ keyRaw: "AAA/BBB/CCC.md" },
|
||||
{ keyRaw: "ddd/eee/fff.md" },
|
||||
{ keyRaw: "Ggg/Hhh你好/Fff世界.md" },
|
||||
];
|
||||
expect(misc.fixEntityListCasesInplace(input)).to.deep.equal(output);
|
||||
});
|
||||
});
|
||||
|
||||
Loading…
Reference in New Issue
Block a user