From 267e3165a265d5ca0670f8b13281b167d94cbc90 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Sat, 19 Aug 2017 23:17:41 +0200 Subject: [PATCH] Add prompt to revert to Zotero for Firefox data directory For people affected by migration bugs prior to 5.0.15 --- chrome/content/zotero/xpcom/dataDirectory.js | 114 +++++++++++++++++++ chrome/content/zotero/xpcom/zotero.js | 5 + 2 files changed, 119 insertions(+) diff --git a/chrome/content/zotero/xpcom/dataDirectory.js b/chrome/content/zotero/xpcom/dataDirectory.js index 8126bf4bc..b07cfbc6c 100644 --- a/chrome/content/zotero/xpcom/dataDirectory.js +++ b/chrome/content/zotero/xpcom/dataDirectory.js @@ -128,6 +128,22 @@ Zotero.DataDirectory = { throw { name: "NS_ERROR_FILE_NOT_FOUND" }; } } + + try { + if (dataDir != this.defaultDir + && this.isLegacy(dataDir) + && (yield OS.File.exists(OS.Path.join(this.defaultDir, 'move-to-old')))) { + let newPath = this.defaultDir + '-Old'; + if (yield OS.File.exists(newPath)) { + newPath += "-1"; + } + yield Zotero.File.moveDirectory(this.defaultDir, newPath); + yield OS.File.remove(OS.Path.join(newPath, 'move-to-old')); + } + } + catch (e) { + Zotero.logError(e); + } } // New installation of 5.0+ with no data directory specified, so check all the places the data // could be @@ -530,6 +546,104 @@ Zotero.DataDirectory = { }), + // TODO: Remove after 5.0 upgrades + checkForLostLegacy: async function () { + var currentDir = this.dir; + if (currentDir != this.defaultDir) return; + if (Zotero.Prefs.get('ignoreLegacyDataDir')) return; + try { + let profilesParent = OS.Path.dirname(Zotero.Profile.getOtherAppProfilesDir()); + Zotero.debug("Looking for Firefox profile in " + profilesParent); + + // get default profile + var defProfile; + try { + defProfile = await Zotero.Profile.getDefaultInProfilesDir(profilesParent); + } + catch (e) { + Zotero.logError(e); + return; + } + if (!defProfile) { + return; + } + let profileDir = defProfile[0]; + Zotero.debug("Found default profile at " + profileDir); + + let dir; + let mtime; + try { + dir = OS.Path.join(profileDir, this.legacyDirName); + let dbFile = OS.Path.join(dir, this.getDatabaseFilename()); + let info = await OS.File.stat(dbFile); + if (info.size < 1200000) { + Zotero.debug(`Legacy database is ${info.size} bytes -- ignoring`); + return; + } + mtime = info.lastModificationDate; + if (mtime < new Date(2016, 5, 1)) { + Zotero.debug(`Legacy database was last modified on ${mtime.toString()} -- ignoring`); + return; + } + Zotero.debug(`Legacy database found at ${dbFile}, last modified ${mtime}`); + } + catch (e) { + Zotero.logError(e); + if (e.becauseNoSuchFile) { + return; + } + throw e; + } + + let ps = Services.prompt; + let buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING) + + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL) + + (ps.BUTTON_POS_2) * (ps.BUTTON_TITLE_IS_STRING); + let dontAskAgain = {}; + let index = ps.confirmEx(null, + "Other Data Directory Found", + "Zotero found a previous data directory within your Firefox profile directory, " + + `last modified on ${mtime.toLocaleDateString()}. ` + + "If items or files are missing from Zotero that were present in Zotero for Firefox, " + + "your previous data directory may not have been properly migrated to the new default location " + + `in ${this.defaultDir}.\n\n` + + `Do you wish to continue using the current data directory or switch to the previous one?\n\n` + + `If you switch, your current data directory will be moved to ${this.defaultDir + '-Old'}, ` + + `and the previous directory will be migrated to ${this.defaultDir}.`, + buttonFlags, + "Use Current Directory", + null, + "Switch to Previous Directory", + "Don\u0027t ask me again", + dontAskAgain + ); + if (index == 1) { + return; + } + if (dontAskAgain.value) { + Zotero.Prefs.set('ignoreLegacyDataDir', true); + } + if (index == 0) { + return; + } + + // Switch to previous directory + this.set(dir); + // Set a marker to rename the current ~/Zotero directory + try { + await Zotero.File.putContentsAsync(OS.Path.join(this.defaultDir, 'move-to-old'), ''); + } + catch (e) { + Zotero.logError(e); + } + Zotero.Utilities.Internal.quit(true); + } + catch (e) { + Zotero.logError(e); + } + }, + + /** * Determine if current data directory is in a legacy location */ diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index 2f0e94852..e74273afb 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -378,6 +378,11 @@ Services.scriptloader.loadSubScript("resource://zotero/polyfill.js"); } if (!Zotero.isConnector) { + yield Zotero.DataDirectory.checkForLostLegacy(); + if (this.restarting) { + return; + } + yield Zotero.DataDirectory.checkForMigration( dataDir, Zotero.DataDirectory.defaultDir );