From f4b73d22b832a1eeae32c1873e66318f4aeea882 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Wed, 23 Aug 2017 11:00:46 +0200 Subject: [PATCH] Fix error relocating to filename with different Unicode normalization --- chrome/content/zotero/xpcom/data/item.js | 12 +++++++++++- test/tests/itemTest.js | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js index 3403f05b90..822d964dd0 100644 --- a/chrome/content/zotero/xpcom/data/item.js +++ b/chrome/content/zotero/xpcom/data/item.js @@ -2599,7 +2599,17 @@ Zotero.Item.prototype.relinkAttachmentFile = Zotero.Promise.coroutine(function* // Rename file to filtered name if necessary if (fileName != newName) { Zotero.debug("Renaming file '" + fileName + "' to '" + newName + "'"); - yield OS.File.move(path, newPath, { noOverwrite: true }); + try { + yield OS.File.move(path, newPath, { noOverwrite: true }); + } + catch (e) { + if (e instanceof OS.File.Error && e.becauseExists && fileName.normalize() == newName) { + // Ignore normalization differences that the filesystem ignores + } + else { + throw e; + } + } } } diff --git a/test/tests/itemTest.js b/test/tests/itemTest.js index 508465e421..087b0d9907 100644 --- a/test/tests/itemTest.js +++ b/test/tests/itemTest.js @@ -916,6 +916,24 @@ describe("Zotero.Item", function () { assert.isTrue(yield OS.File.exists(tmpFile)); }); + + it("should handle normalized filenames", function* () { + var item = yield importFileAttachment('test.png'); + var path = yield item.getFilePathAsync(); + var dir = OS.Path.dirname(path); + var filename = 'tést.pdf'.normalize('NFKD'); + + // Make sure we're actually testing something -- the test string should be differently + // normalized from what's done in getValidFileName + assert.notEqual(filename, Zotero.File.getValidFileName(filename)); + + var newPath = OS.Path.join(dir, filename); + yield OS.File.move(path, newPath); + + assert.isFalse(yield item.fileExists()); + yield item.relinkAttachmentFile(newPath); + assert.isTrue(yield item.fileExists()); + }); });