diff --git a/chrome/content/zotero/xpcom/dataDirectory.js b/chrome/content/zotero/xpcom/dataDirectory.js index 5bca15411f..2724db9d3c 100644 --- a/chrome/content/zotero/xpcom/dataDirectory.js +++ b/chrome/content/zotero/xpcom/dataDirectory.js @@ -180,10 +180,15 @@ Zotero.DataDirectory = { // New installation of 5.0+ with no data directory specified, so check all the places the data // could be else { - Zotero.fxProfileAccessError = false; + let useProfile = false; + let useFirefoxProfile = false; + let useFirefoxProfileCustom = false; + let dataDirNamedAfterProfile = false; dataDir = this.defaultDir; + Zotero.fxProfileAccessError = false; + // If there's already a profile pointing to the default location, use a different // data directory named after the profile, as long as one either doesn't exist yet or // one does and it contains a database @@ -194,6 +199,7 @@ Zotero.DataDirectory = { if (!(yield OS.File.exists(newDataDir)) || (yield OS.File.exists(OS.Path.join(newDataDir, dbFilename)))) { dataDir = newDataDir; + dataDirNamedAfterProfile = true; } } } @@ -213,10 +219,6 @@ Zotero.DataDirectory = { return dataDir; } - let useProfile = false; - let useFirefoxProfile = false; - let useFirefoxProfileCustom = false; - // Check for /zotero/zotero.sqlite let profileSubdirModTime; try { @@ -236,109 +238,111 @@ Zotero.DataDirectory = { // // Check Firefox directory // - let profilesParent = OS.Path.dirname(Zotero.Profile.getOtherAppProfilesDir()); - Zotero.debug("Looking for Firefox profile in " + profilesParent); - - // get default profile - var defProfile; - try { - defProfile = yield Zotero.Profile.getDefaultInProfilesDir(profilesParent); - } - catch (e) { - Zotero.debug("An error occurred locating the Firefox profile; " - + "not attempting to migrate from Zotero for Firefox"); - Zotero.logError(e); - Zotero.fxProfileAccessError = true; - } - if (defProfile) { - let profileDir = defProfile[0]; - Zotero.debug("Found default profile at " + profileDir); + if (!dataDirNamedAfterProfile) { + let profilesParent = OS.Path.dirname(Zotero.Profile.getOtherAppProfilesDir()); + Zotero.debug("Looking for Firefox profile in " + profilesParent); - // Read in prefs - let prefsFile = OS.Path.join(profileDir, "prefs.js"); - if (yield OS.File.exists(prefsFile)) { - let prefs = yield Zotero.Profile.readPrefsFromFile(prefsFile); + // get default profile + let defProfile; + try { + defProfile = yield Zotero.Profile.getDefaultInProfilesDir(profilesParent); + } + catch (e) { + Zotero.debug("An error occurred locating the Firefox profile; " + + "not attempting to migrate from Zotero for Firefox"); + Zotero.logError(e); + Zotero.fxProfileAccessError = true; + } + if (defProfile) { + let profileDir = defProfile[0]; + Zotero.debug("Found default profile at " + profileDir); - // Check for data dir pref - if (prefs['extensions.zotero.dataDir'] && prefs['extensions.zotero.useDataDir']) { - Zotero.debug(`Found custom dataDir of ${prefs['extensions.zotero.dataDir']}`); - let nsIFile; - try { - nsIFile = Components.classes["@mozilla.org/file/local;1"] - .createInstance(Components.interfaces.nsIFile); - nsIFile.persistentDescriptor = prefs['extensions.zotero.dataDir']; - } - catch (e) { - Zotero.logError(e); - if (!useProfile) { - Zotero.debug("Persistent descriptor in extensions.zotero.dataDir " - + "did not resolve", 1); - throw { name: "NS_ERROR_FILE_NOT_FOUND" }; + // Read in prefs + let prefsFile = OS.Path.join(profileDir, "prefs.js"); + if (yield OS.File.exists(prefsFile)) { + let prefs = yield Zotero.Profile.readPrefsFromFile(prefsFile); + + // Check for data dir pref + if (prefs['extensions.zotero.dataDir'] && prefs['extensions.zotero.useDataDir']) { + Zotero.debug(`Found custom dataDir of ${prefs['extensions.zotero.dataDir']}`); + let nsIFile; + try { + nsIFile = Components.classes["@mozilla.org/file/local;1"] + .createInstance(Components.interfaces.nsIFile); + nsIFile.persistentDescriptor = prefs['extensions.zotero.dataDir']; } - } - try { - let dbFile = OS.Path.join(nsIFile.path, dbFilename); - let mtime = (yield OS.File.stat(dbFile)).lastModificationDate; - Zotero.debug(`Database found at ${dbFile}, last modified ${mtime}`); - // If custom location has a newer DB, use that - if (!useProfile || mtime > profileSubdirModTime) { - dataDir = nsIFile.path; - useFirefoxProfileCustom = true; - useProfile = false; - } - } - catch (e) { - Zotero.logError(e); - // If we have a DB in the Zotero profile and get an error trying to - // access the custom location in Firefox, use the Zotero profile, since - // there's at least some chance it's right. Otherwise, throw an error. - if (!useProfile) { - // The error message normally gets the path from the pref, but - // we got it from the prefs file, so include it here - e.dataDir = nsIFile.path; - throw e; - } - Zotero.fxProfileAccessError = true; - } - } - // If no custom dir specified, check for a subdirectory - else { - try { - let dir = OS.Path.join(profileDir, this.legacyDirName); - let dbFile = OS.Path.join(dir, dbFilename); - let mtime = (yield OS.File.stat(dbFile)).lastModificationDate; - Zotero.debug(`Database found at ${dbFile}, last modified ${mtime}`); - // If newer than Zotero profile directory, use this one - if (!useProfile || mtime > profileSubdirModTime) { - dataDir = dir; - useFirefoxProfile = true; - useProfile = false; - } - } - // Legacy subdirectory doesn't exist or there was a problem accessing it, so - // just fall through to default location - catch (e) { - if (!(e instanceof OS.File.Error && e.becauseNoSuchFile)) { + catch (e) { Zotero.logError(e); + if (!useProfile) { + Zotero.debug("Persistent descriptor in extensions.zotero.dataDir " + + "did not resolve", 1); + throw { name: "NS_ERROR_FILE_NOT_FOUND" }; + } + } + try { + let dbFile = OS.Path.join(nsIFile.path, dbFilename); + let mtime = (yield OS.File.stat(dbFile)).lastModificationDate; + Zotero.debug(`Database found at ${dbFile}, last modified ${mtime}`); + // If custom location has a newer DB, use that + if (!useProfile || mtime > profileSubdirModTime) { + dataDir = nsIFile.path; + useFirefoxProfileCustom = true; + useProfile = false; + } + } + catch (e) { + Zotero.logError(e); + // If we have a DB in the Zotero profile and get an error trying to + // access the custom location in Firefox, use the Zotero profile, since + // there's at least some chance it's right. Otherwise, throw an error. + if (!useProfile) { + // The error message normally gets the path from the pref, but + // we got it from the prefs file, so include it here + e.dataDir = nsIFile.path; + throw e; + } Zotero.fxProfileAccessError = true; } } - } - - // If using data directory from Zotero for Firefox, transfer those prefs, because - // the fact that that DB was more recent and wasn't set in the Zotero profile prefs - // means that they were using Firefox. - if (useFirefoxProfile || useFirefoxProfileCustom) { - for (let key in prefs) { - if (key.substr(0, ZOTERO_CONFIG.PREF_BRANCH.length) === ZOTERO_CONFIG.PREF_BRANCH - && key !== "extensions.zotero.firstRun2") { - Zotero.Prefs.set(key.substr(ZOTERO_CONFIG.PREF_BRANCH.length), prefs[key]); + // If no custom dir specified, check for a subdirectory + else { + try { + let dir = OS.Path.join(profileDir, this.legacyDirName); + let dbFile = OS.Path.join(dir, dbFilename); + let mtime = (yield OS.File.stat(dbFile)).lastModificationDate; + Zotero.debug(`Database found at ${dbFile}, last modified ${mtime}`); + // If newer than Zotero profile directory, use this one + if (!useProfile || mtime > profileSubdirModTime) { + dataDir = dir; + useFirefoxProfile = true; + useProfile = false; + } + } + // Legacy subdirectory doesn't exist or there was a problem accessing it, so + // just fall through to default location + catch (e) { + if (!(e instanceof OS.File.Error && e.becauseNoSuchFile)) { + Zotero.logError(e); + Zotero.fxProfileAccessError = true; + } } } - // If data directory setting was transferred, use that - if (Zotero.Prefs.get('useDataDir')) { - return this.init(); + // If using data directory from Zotero for Firefox, transfer those prefs, because + // the fact that that DB was more recent and wasn't set in the Zotero profile prefs + // means that they were using Firefox. + if (useFirefoxProfile || useFirefoxProfileCustom) { + for (let key in prefs) { + if (key.substr(0, ZOTERO_CONFIG.PREF_BRANCH.length) === ZOTERO_CONFIG.PREF_BRANCH + && key !== "extensions.zotero.firstRun2") { + Zotero.Prefs.set(key.substr(ZOTERO_CONFIG.PREF_BRANCH.length), prefs[key]); + } + } + + // If data directory setting was transferred, use that + if (Zotero.Prefs.get('useDataDir')) { + return this.init(); + } } } }