Properly revert attachment renames if they fail. Closes #430

This commit is contained in:
Aurimas Vinckevicius 2013-11-23 18:28:46 -06:00 committed by aurimasv
parent 59ef7cba04
commit 04335ef418
2 changed files with 17 additions and 13 deletions

View file

@ -401,15 +401,17 @@
'',
newFilename + ' exists. Overwrite existing file?'
);
if (confirmed) {
item.renameAttachmentFile(newFilename, true);
break;
if (!confirmed) {
// If they said not to overwrite existing file,
// start again
continue;
}
// If they said not to overwrite existing file,
// start again
continue;
// Force overwrite, but make sure we check that this doesn't fail
renamed = item.renameAttachmentFile(newFilename, true);
}
else if (renamed == -2) {
if (renamed == -2) {
nsIPS.alert(
window,
Zotero.getString('general.error'),

View file

@ -3009,6 +3009,7 @@ Zotero.Item.prototype.renameAttachmentFile = function(newName, overwrite) {
return false;
}
var origModDate = file.lastModifiedTime;
try {
newName = Zotero.File.getValidFileName(newName);
@ -3027,18 +3028,17 @@ Zotero.Item.prototype.renameAttachmentFile = function(newName, overwrite) {
// files, since dest.exists() will just show true on a case-insensitive
// filesystem anyway.
if (file.leafName.toLowerCase() != dest.leafName.toLowerCase()) {
if (overwrite) {
dest.remove(false);
}
else if (dest.exists()) {
if (!overwrite && dest.exists()) {
return -1;
}
}
file.moveTo(null, newName);
// Update mod time and clear hash so the file syncs
// TODO: use an integer counter instead of mod time for change detection
dest.lastModifiedTime = new Date();
// Update mod time first, because it may fail for read-only files on Windows
file.lastModifiedTime = new Date();
file.moveTo(null, newName);
this.relinkAttachmentFile(dest);
Zotero.DB.beginTransaction();
@ -3051,6 +3051,8 @@ Zotero.Item.prototype.renameAttachmentFile = function(newName, overwrite) {
return true;
}
catch (e) {
// Restore original modification date in case we managed to change it
try { file.lastModifiedTime = origModDate } catch (e) {}
Zotero.debug(e);
Components.utils.reportError(e);
return -2;