From 9b5d4c9b35c16648c303c0dc135abf371b731b1f Mon Sep 17 00:00:00 2001 From: suVene Date: Mon, 22 Dec 2008 11:53:32 +0000 Subject: version は up し忘れることが多いので、Last-Modified を保存しておいて比較するように変更。 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27231 d0d07461-0603-4401-acd4-de1884942a52 --- pluginManager.js | 93 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 36 deletions(-) (limited to 'pluginManager.js') diff --git a/pluginManager.js b/pluginManager.js index e76af53..45bd097 100644 --- a/pluginManager.js +++ b/pluginManager.js @@ -4,7 +4,7 @@ var PLUGIN_INFO = Manage Vimperator Plugins Vimpeatorプラグインの管理 teramako -0.3 +0.4 2.0pre 2.0pre http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/pluginManager.js @@ -192,54 +192,75 @@ function itemFormater(plugin, showDetails){ return template.table(plugin.name, data); } function checkVersion(plugin){ - var data = { - 'Current Version': plugin.info.version || 'unknown', - 'Latest Version': getLatestVersion(plugin.info.updateURL)['version'] || 'unknown', - 'Update URL': plugin.info.updateURL || '-' - }; - return template.table(plugin.name, data); + return updatePlugin(plugin, true); } -function getLatestVersion(url){ - if (!url) return {}; - var source = util.httpGet(url).responseText || ''; - var version = ''; - var m = /\bPLUGIN_INFO[ \t\r\n]*=[ \t\r\n]*]*)?>([\s\S]+?)<\/VimperatorPlugin[ \t\r\n]*>/(source); - if (m){ - m = m[1].replace(/(?:))*\]\]|--(?:[^-]|-(?!-))*--)>)+/g, ''); - m = /^[\w\W]*?]*)?>([^<]+)<\/version[ \t\r\n]*>/(m); - if (m){ - version = m[1]; - } - } - return {source: source, version: version}; -} -function updatePlugin(plugin){ - var currentVersion = plugin.info.version || ''; - var latestResource = getLatestVersion(plugin.info.updateURL) || ''; +function updatePlugin(plugin, checkOnly){ + var [localResource, serverResource] = getResourceInfo(plugin); + var data = { - information: '', - 'Current Version': plugin.info.version || 'unknown', + 'Local Version': plugin.info.version || 'unknown', + 'Local Last-Modified': localResource['Last-Modified'] || 'unkonwn', 'Local Path': plugin[0][1] || 'unknown', - 'Latest Version': latestResource.version || 'unknown', + 'Server Latest Version': serverResource.version || 'unknown', + 'Server Last-Modified': serverResource.headers['Last-Modified'] || 'unknown', 'Update URL': plugin.info.updateURL || '-' }; - if (!currentVersion || !latestResource.version){ - data.information = 'unknown version.'; - } else if (currentVersion == latestResource.version){ - data.information = 'up to date.'; - } else if (currentVersion > latestResource.version){ + if (checkOnly) return template.table(plugin.name, data); + + if (!plugin.info.version || !serverResource.version){ + data.Information = 'unknown version.'; + } else if (plugin.info.version == serverResource.version && + localResource['Last-Modified'] == serverResource.headers['Last-Modified']){ + data.Information = 'up to date.'; + } else if (plugin.info.version > serverResource.version || + localResource['Last-Modified'] > serverResource.headers['Last-Modified']){ data.information = 'local version is newest.'; } else { - data.information = overwritePlugin(plugin, latestResource); + data.Information = overwritePlugin(plugin, serverResource); + localResource['Last-Modified'] = serverResource.headers['Last-Modified']; + store.set(plugin.name, localResource); + store.save(); } return template.table(plugin.name, data); } -function overwritePlugin(plugin, latestResource){ +function getResourceInfo(plugin){ + var store = storage.newMap('plugins-pluginManager', true); + var url = plugin.info.updateURL; + var localResource = store.get(plugin.name) || {}; + var serverResource = { + version: '', + source: '', + headers: {} + }; + + if (url){ + let xhr = util.httpGet(url); + let version = ''; + let source = xhr.responseText || ''; + let headers = {}; + try { + xhr.getAllResponseHeaders().split('\n').forEach(function(h) { + var pair = h.split(': '); + if (pair && pair.length > 1) + headers[pair.shift()] = pair.join('').substring(1, pair.join('').length - 1); + }); + } catch(e) {} + [,version] = /PLUGIN_INFO[\s\S]*[\s\S]*(.*)<\/version>[\s\S]*<\/VimperatorPlugin>/.exec(source); + serverResource = {version: version, source: source, headers: headers}; + } + + if (!localResource['Last-Modified']){ + localResource['Last-Modified'] = serverResource.headers['Last-Modified']; + store.set(plugin.name, localResource); + } + return [localResource, serverResource]; +} +function overwritePlugin(plugin, serverResource){ if (!plugin[0] || plugin[0][0] != 'path') return 'plugin localpath was not found.'; - var source = latestResource.source; + var source = serverResource.source; var localpath = plugin[0][1]; var file = io.getFile(localpath); @@ -249,7 +270,7 @@ function overwritePlugin(plugin, latestResource){ try { io.writeFile(file, source); } catch (e){ - liberaotr.log("Could not write to " + file.path + ": " + e.message); + liberaotr.log('Could not write to ' + file.path + ': ' + e.message); return 'E190: Cannot open ' + filename.quote() + ' for writing'; } -- cgit v1.2.3