Add prompt to revert to Zotero for Firefox data directory

For people affected by migration bugs prior to 5.0.15
This commit is contained in:
Dan Stillman 2017-08-19 23:17:41 +02:00
parent 2725d423ed
commit 267e3165a2
2 changed files with 119 additions and 0 deletions

View file

@ -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
*/

View file

@ -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
);