Skip to content

Commit

Permalink
Add prompt to revert to Zotero for Firefox data directory
Browse files Browse the repository at this point in the history
For people affected by migration bugs prior to 5.0.15
  • Loading branch information
dstillman committed Aug 19, 2017
1 parent 2725d42 commit 267e316
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 0 deletions.
114 changes: 114 additions & 0 deletions chrome/content/zotero/xpcom/dataDirectory.js
Expand Up @@ -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
Expand Down Expand Up @@ -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
*/
Expand Down
5 changes: 5 additions & 0 deletions chrome/content/zotero/xpcom/zotero.js
Expand Up @@ -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
);
Expand Down

0 comments on commit 267e316

Please sign in to comment.