www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit a4f8e45b732c513351bc59d210801c05f13224de
parent 8fad310894f05b14c893b6e887827c4b3146b752
Author: Dan Stillman <dstillman@zotero.org>
Date:   Sun,  1 Nov 2009 19:45:41 +0000

Shorten filenames >=254 characters on storage sync error, since ext3/ext4/HFS+ all have ~254-character filename length limits

I don't have an OS/filesystem on which I can actually test this, but it might work.


Diffstat:
Mchrome/content/zotero/xpcom/storage.js | 74+++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 53 insertions(+), 21 deletions(-)

diff --git a/chrome/content/zotero/xpcom/storage.js b/chrome/content/zotero/xpcom/storage.js @@ -788,21 +788,37 @@ Zotero.Sync.Storage = new function () { var destFile = parentDir.clone(); destFile.append(newName); + var windowsLength = false; + var nameLength = false; + // Windows API only allows paths of 260 characters if (e.name == "NS_ERROR_FILE_NOT_FOUND" && destFile.path.length > 255) { + windowsLength = true; + } + // ext3/ext4/HFS+ have a filename length limit of ~254 characters + else if (e.name == "NS_ERROR_FAILURE" && destFile.leafName.length >= 254) { + nameLength = true; + } + + if (windowsLength || nameLength) { // Preserve extension var matches = destFile.leafName.match(/\.[a-z0-9]{0,8}$/); var ext = matches ? matches[0] : ""; - var pathLength = destFile.path.length - destFile.leafName.length; - var newLength = 255 - pathLength; - // Require 40 available characters in path -- this is arbitrary, - // but otherwise filenames are going to end up being cut off - if (newLength < 40) { - var msg = "Due to a Windows path length limitation, your Zotero data directory " - + "is too deep in the filesystem for syncing to work reliably. " - + "Please relocate your Zotero data to a higher directory."; - throw (msg); + if (windowsLength) { + var pathLength = destFile.path.length - destFile.leafName.length; + var newLength = 255 - pathLength; + // Require 40 available characters in path -- this is arbitrary, + // but otherwise filenames are going to end up being cut off + if (newLength < 40) { + var msg = "Due to a Windows path length limitation, your Zotero data directory " + + "is too deep in the filesystem for syncing to work reliably. " + + "Please relocate your Zotero data to a higher directory."; + throw (msg); + } + } + else { + var newLength = 254; } // Shorten file if it's too long -- we don't relink it, but this should @@ -910,8 +926,19 @@ Zotero.Sync.Storage = new function () { destFile.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0644); } catch (e) { + var windowsLength = false; + var nameLength = false; + // Windows API only allows paths of 260 characters if (e.name == "NS_ERROR_FILE_NOT_FOUND" && destFile.path.length > 255) { + windowsLength = true; + } + // ext3/ext4/HFS+ have a filename length limit of ~254 characters + else if (e.name == "NS_ERROR_FAILURE" && destFile.leafName.length >= 254) { + nameLength = true; + } + + if (windowsLength || nameLength) { // Is this the main attachment file? var primaryFile = item.getFile(null, true).leafName == destFile.leafName; @@ -919,16 +946,21 @@ Zotero.Sync.Storage = new function () { var matches = destFile.leafName.match(/\.[a-z0-9]{0,8}$/); var ext = matches ? matches[0] : ""; - var pathLength = destFile.path.length - destFile.leafName.length; - var newLength = 255 - pathLength; - // Require 40 available characters in path -- this is arbitrary, - // but otherwise filenames are going to end up being cut off - if (newLength < 40) { - zipReader.close(); - var msg = "Due to a Windows path length limitation, your Zotero data directory " - + "is too deep in the filesystem for syncing to work reliably. " - + "Please relocate your Zotero data to a higher directory."; - throw (msg); + if (windowsLength) { + var pathLength = destFile.path.length - destFile.leafName.length; + var newLength = 255 - pathLength; + // Require 40 available characters in path -- this is arbitrary, + // but otherwise filenames are going to end up being cut off + if (newLength < 40) { + zipReader.close(); + var msg = "Due to a Windows path length limitation, your Zotero data directory " + + "is too deep in the filesystem for syncing to work reliably. " + + "Please relocate your Zotero data to a higher directory."; + throw (msg); + } + } + else { + var newLength = 254; } // Shorten file if it's too long -- we don't relink it, but this should @@ -941,10 +973,10 @@ Zotero.Sync.Storage = new function () { var step = 0; do { if (step == 0) { - var newName = destFile.leafName.substr(0, newLength - (ext.length + 1)) + ext; + var newName = destFile.leafName.substr(0, newLength - ext.length) + ext; } else { - var newName = destFile.leafName.substr(0, newLength - (ext.length + 1)) + "-" + step + ext; + var newName = destFile.leafName.substr(0, newLength - ext.length) + "-" + step + ext; } destFile.leafName = newName; step++;