commit a2d7dfd206bdadb71003656983d3ef587c0deb3a
parent e6ccca323004786c6f9781b4db1c9d7a59a0c7d4
Author: Dan Stillman <dstillman@zotero.org>
Date: Sun, 22 Mar 2015 16:03:01 -0400
More bundled files fixes
Diffstat:
2 files changed, 83 insertions(+), 91 deletions(-)
diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js
@@ -1011,7 +1011,7 @@ Zotero.Schema = new function(){
var lastUpdated = yield this.getDBVersion('repository');
try {
- var url = ZOTERO_CONFIG.REPOSITORY_URL + '/updated?'
+ var url = ZOTERO_CONFIG.REPOSITORY_URL + 'updated?'
+ (lastUpdated ? 'last=' + lastUpdated + '&' : '')
+ 'version=' + Zotero.version;
@@ -1669,7 +1669,7 @@ Zotero.Schema = new function(){
*
* @return {Promise}
*/
- function _translatorXMLToFile(xmlnode) {
+ var _translatorXMLToFile = Zotero.Promise.coroutine(function* (xmlnode) {
// Don't split >4K chunks into multiple nodes
// https://bugzilla.mozilla.org/show_bug.cgi?id=194231
xmlnode.normalize();
@@ -1678,9 +1678,9 @@ Zotero.Schema = new function(){
// Delete local version of remote translators with priority 0
if (xmlnode.getElementsByTagName('priority')[0].firstChild.nodeValue === "0") {
- if (translator && translator.file.exists()) {
+ if (translator && (yield OS.File.exists(translator.path))) {
Zotero.debug("Deleting translator '" + translator.label + "'");
- translator.file.remove(false);
+ yield OS.File.remove(translator.path);
}
return false;
}
@@ -1707,7 +1707,7 @@ Zotero.Schema = new function(){
metadata.browserSupport = browserSupport;
}
- for each(var attr in ["configOptions", "displayOptions", "hiddenPrefs"]) {
+ for (let attr of ["configOptions", "displayOptions", "hiddenPrefs"]) {
try {
var tags = xmlnode.getElementsByTagName(attr);
if(tags.length && tags[0].firstChild) {
@@ -1730,14 +1730,14 @@ Zotero.Schema = new function(){
code = (detectCode ? detectCode + "\n\n" : "") + code;
return Zotero.Translators.save(metadata, code);
- }
+ });
/**
* Traverse an XML style node from the repository and
* update the local styles folder with the style data
*/
- function _styleXMLToFile(xmlnode) {
+ var _styleXMLToFile = Zotero.Promise.coroutine(function* (xmlnode) {
// Don't split >4K chunks into multiple nodes
// https://bugzilla.mozilla.org/show_bug.cgi?id=194231
xmlnode.normalize();
@@ -1749,7 +1749,7 @@ Zotero.Schema = new function(){
if (!xmlnode.firstChild) {
var style = Zotero.Styles.get(uri);
if (style) {
- style.file.remove(null);
+ yield OS.File.remove(style.path);
}
return;
}
@@ -1758,19 +1758,17 @@ Zotero.Schema = new function(){
var oldID = xmlnode.getAttribute('oldID');
if (oldID) {
var style = Zotero.Styles.get(oldID, true);
- if (style && style.file.exists()) {
+ if (style && (yield OS.File.exists(style.path))) {
Zotero.debug("Deleting renamed style '" + oldID + "'");
- style.file.remove(false);
+ yield OS.File.remove(style.path);
}
}
var str = xmlnode.firstChild.nodeValue;
var style = Zotero.Styles.get(uri);
if (style) {
- if (style.file.exists()) {
- style.file.remove(false);
- }
- var destFile = style.file;
+ yield Zotero.File.removeIfExists(style.path);
+ var destFile = style.path;
}
else {
// Get last part of URI for filename
@@ -1778,17 +1776,19 @@ Zotero.Schema = new function(){
if (!matches) {
throw ("Invalid style URI '" + uri + "' from repository");
}
- var destFile = Zotero.getStylesDirectory();
- destFile.append(matches[1] + ".csl");
- if (destFile.exists()) {
- throw ("Different style with filename '" + matches[1]
- + "' already exists in Zotero.Schema._styleXMLToFile()");
+ var destFile = OS.Path.join(
+ Zotero.getStylesDirectory().path,
+ matches[1] + ".csl"
+ );
+ if (yield OS.File.exists(destFile)) {
+ throw new Error("Different style with filename '" + matches[1]
+ + "' already exists");
}
}
Zotero.debug("Saving style '" + uri + "'");
return Zotero.File.putContentsAsync(destFile, str);
- }
+ });
// TODO
diff --git a/chrome/content/zotero/xpcom/translation/translators.js b/chrome/content/zotero/xpcom/translation/translators.js
@@ -38,11 +38,6 @@ Zotero.Translators = new function() {
* Initializes translator cache, loading all translator metadata into memory
*/
this.reinit = Zotero.Promise.coroutine(function* () {
- if (_initialized) {
- Zotero.debug("Translators already initialized", 2);
- return;
- }
-
Zotero.debug("Initializing translators");
var start = new Date;
_initialized = true;
@@ -80,7 +75,6 @@ Zotero.Translators = new function() {
else {
lastModifiedTime = (yield OS.File.stat(path)).lastModificationDate.getTime();
}
- let lastModified
var dbCacheEntry = false;
if (dbCache[fileName]) {
@@ -90,12 +84,12 @@ Zotero.Translators = new function() {
}
}
+ // Get JSON from cache if possible
if(dbCacheEntry) {
- // get JSON from cache if possible
var translator = Zotero.Translators.load(dbCacheEntry.metadataJSON, path);
- filesInCache[fileName] = true;
- } else {
- // otherwise, load from file
+ }
+ // Otherwise, load from file
+ else {
var translator = yield Zotero.Translators.loadFromFile(path);
}
@@ -105,30 +99,44 @@ Zotero.Translators = new function() {
continue;
}
+ // Check if there's already a cached translator with the same id
if (_translators[translator.translatorID]) {
- // same translator is already cached
- translator.logError('Translator with ID '+
- translator.translatorID+' already loaded from "'+
- _translators[translator.translatorID].fileName + '"');
- } else {
- // add to cache
- _translators[translator.translatorID] = translator;
- for(var type in TRANSLATOR_TYPES) {
- if(translator.translatorType & TRANSLATOR_TYPES[type]) {
- _cache[type].push(translator);
- }
+ let existingTranslator = _translators[translator.translatorID];
+ // If cached translator is older, delete it
+ if (existingTranslator.lastUpdated < translator.lastUpdated) {
+ translator.logError("Deleting older translator "
+ + existingTranslator.fileName + " with same ID as "
+ + translator.fileName);
+ yield OS.File.remove(existingTranslator.path);
+ delete _translators[translator.translatorID];
}
-
- if (!dbCacheEntry) {
- yield Zotero.Translators.cacheInDB(
- fileName,
- translator.serialize(TRANSLATOR_REQUIRED_PROPERTIES.
- concat(TRANSLATOR_OPTIONAL_PROPERTIES)),
- lastModifiedTime
- );
+ // If cached translator is newer or the same, delete the current one
+ else {
+ translator.logError("Translator " + existingTranslator.fileName
+ + " with same ID is already loaded -- deleting "
+ + translator.fileName);
+ yield OS.File.remove(translator.path);
+ continue;
+ }
+ }
+
+ // add to cache
+ _translators[translator.translatorID] = translator;
+ for (let type in TRANSLATOR_TYPES) {
+ if (translator.translatorType & TRANSLATOR_TYPES[type]) {
+ _cache[type].push(translator);
}
}
+ if (!dbCacheEntry) {
+ yield Zotero.Translators.cacheInDB(
+ fileName,
+ translator.serialize(TRANSLATOR_REQUIRED_PROPERTIES.
+ concat(TRANSLATOR_OPTIONAL_PROPERTIES)),
+ lastModifiedTime
+ );
+ }
+
numCached++;
}
}
@@ -137,7 +145,7 @@ Zotero.Translators = new function() {
iterator.close();
}
- // Remove translators from DB as necessary
+ // Remove translators from DB cache if no file
for (let fileName in dbCache) {
if (!filesInCache[fileName]) {
yield Zotero.DB.queryAsync(
@@ -358,15 +366,15 @@ Zotero.Translators = new function() {
* @param {String} code
* @return {Promise<nsIFile>}
*/
- this.save = function(metadata, code) {
+ this.save = Zotero.Promise.coroutine(function* (metadata, code) {
if (!metadata.translatorID) {
throw ("metadata.translatorID not provided in Zotero.Translators.save()");
}
if (!metadata.translatorType) {
var found = false;
- for each(var type in TRANSLATOR_TYPES) {
- if (metadata.translatorType & type) {
+ for (let type in TRANSLATOR_TYPES) {
+ if (metadata.translatorType & TRANSLATOR_TYPES[type]) {
found = true;
break;
}
@@ -377,26 +385,25 @@ Zotero.Translators = new function() {
}
if (!metadata.label) {
- throw ("metadata.label not provided in Zotero.Translators.save()");
+ throw new Error("metadata.label not provided");
}
if (!metadata.priority) {
- throw ("metadata.priority not provided in Zotero.Translators.save()");
+ throw new Error("metadata.priority not provided");
}
if (!metadata.lastUpdated) {
- throw ("metadata.lastUpdated not provided in Zotero.Translators.save()");
+ throw new Error("metadata.lastUpdated not provided");
}
if (!code) {
- throw ("code not provided in Zotero.Translators.save()");
+ throw new Error("code not provided");
}
var fileName = Zotero.Translators.getFileNameFromLabel(
metadata.label, metadata.translatorID
);
- var destFile = Zotero.getTranslatorsDirectory();
- destFile.append(fileName);
+ var destFile = OS.Path.join(Zotero.getTranslatorsDirectory().path, fileName);
// JSON.stringify has the benefit of indenting JSON
var metadataJSON = JSON.stringify(metadata, null, "\t");
@@ -404,38 +411,23 @@ Zotero.Translators = new function() {
var str = metadataJSON + "\n\n" + code,
translator;
- return Zotero.Translators.get(metadata.translatorID)
- .then(function(gTranslator) {
- translator = gTranslator;
- var sameFile = translator && destFile.equals(translator.file);
- if (sameFile) return;
-
- return Zotero.Promise.resolve(OS.File.exists(destFile.path))
- .then(function (exists) {
- if (exists) {
- var msg = "Overwriting translator with same filename '"
- + fileName + "'";
- Zotero.debug(msg, 1);
- Zotero.debug(metadata, 1);
- Components.utils.reportError(msg);
- }
- });
- })
- .then(function () {
- if (!translator) return;
-
- return Zotero.Promise.resolve(OS.File.exists(translator.file.path))
- .then(function (exists) {
- translator.file.remove(false);
- });
- })
- .then(function () {
- Zotero.debug("Saving translator '" + metadata.label + "'");
- Zotero.debug(str);
- return Zotero.File.putContentsAsync(destFile, str)
- .thenResolve(destFile);
- });
- }
+ var translator = Zotero.Translators.get(metadata.translatorID);
+ var sameFile = translator && destFile == translator.path;
+ if (sameFile) return;
+
+ var exists = yield OS.File.exists(destFile);
+ if (exists) {
+ var msg = "Overwriting translator with same filename '"
+ + fileName + "'";
+ Zotero.debug(msg, 1);
+ Zotero.debug(metadata, 1);
+ Components.utils.reportError(msg);
+ }
+
+ Zotero.debug("Saving translator '" + metadata.label + "'");
+ Zotero.debug(metadata);
+ return Zotero.File.putContentsAsync(destFile, str).return(destFile);
+ });
this.cacheInDB = function(fileName, metadataJSON, lastModifiedTime) {
return Zotero.DB.queryAsync(