From 4084c57789eab8c536457c95009f8037f2a9d3b6 Mon Sep 17 00:00:00 2001 From: Sam Detweiler Date: Sat, 29 Jun 2019 15:59:03 -0500 Subject: [PATCH] fix updatenotification to not crash --- .../default/updatenotification/node_helper.js | 38 +++--- .../updatenotification/updatenotification.js | 111 +++++++++++------- 2 files changed, 92 insertions(+), 57 deletions(-) diff --git a/modules/default/updatenotification/node_helper.js b/modules/default/updatenotification/node_helper.js index f4014519..de23d730 100644 --- a/modules/default/updatenotification/node_helper.js +++ b/modules/default/updatenotification/node_helper.js @@ -10,11 +10,17 @@ module.exports = NodeHelper.create({ config: {}, updateTimer: null, + updateProcessStarted: false, start: function () { }, configureModules: function(modules) { + + // Push MagicMirror itself , biggest chance it'll show up last in UI and isn't overwritten + // others will be added in front, asynchronously + simpleGits.push({"module": "default", "git": SimpleGit(path.normalize(__dirname + "/../../../"))}); + for (moduleName in modules) { if (defaultModules.indexOf(moduleName) < 0) { // Default modules are included in the main MagicMirror repo @@ -22,6 +28,7 @@ module.exports = NodeHelper.create({ var stat; try { + //console.log("checking git for module="+moduleName) stat = fs.statSync(path.join(moduleFolder, ".git")); } catch(err) { // Error when directory .git doesn't exist @@ -36,40 +43,41 @@ module.exports = NodeHelper.create({ // No valid remote for folder, skip return; } - // Folder has .git and has at least one git remote, watch this folder - simpleGits.push({"module": mn, "git": git}); + simpleGits.unshift({"module": mn, "git": git}); }); }(moduleName, moduleFolder); } } - - // Push MagicMirror itself last, biggest chance it'll show up last in UI and isn't overwritten - simpleGits.push({"module": "default", "git": SimpleGit(path.normalize(__dirname + "/../../../"))}); }, socketNotificationReceived: function (notification, payload) { if (notification === "CONFIG") { this.config = payload; } else if(notification === "MODULES") { - this.configureModules(payload); - this.preformFetch(); + // if this is the 1st time thru the update check process + if(this.updateProcessStarted==false ){ + this.updateProcessStarted=true; + this.configureModules(payload); + this.preformFetch(); + } } }, preformFetch() { - var self = this; - + var self=this; simpleGits.forEach(function(sg) { sg.git.fetch().status(function(err, data) { data.module = sg.module; if (!err) { - sg.git.log({"-1": null}, function(err, data2) { - if (!err && data2.latest && "hash" in data2.latest) { - data.hash = data2.latest.hash; - self.sendSocketNotification("STATUS", data); - } - }); + sg.git.log({"-1": null}, + function(err, data2) { + if (!err && data2.latest && "hash" in data2.latest) { + this.bound_data.hash = data2.latest.hash; + self.sendSocketNotification("STATUS", this.bound_data); + } + }.bind({bound_data:data}) + ); } }); }); diff --git a/modules/default/updatenotification/updatenotification.js b/modules/default/updatenotification/updatenotification.js index e3e55fc5..07925ead 100644 --- a/modules/default/updatenotification/updatenotification.js +++ b/modules/default/updatenotification/updatenotification.js @@ -2,41 +2,56 @@ Module.register("updatenotification", { defaults: { updateInterval: 10 * 60 * 1000, // every 10 minutes + refreshInterval: 24 * 60 * 60 * 1000, // one day }, - status: false, + suspended: false, + moduleList: {}, start: function () { + var self = this Log.log("Start updatenotification"); - + setInterval( () => { self.moduleList = {};self.updateDom(2) } , self.config.refreshInterval) }, notificationReceived: function (notification, payload, sender) { if (notification === "DOM_OBJECTS_CREATED") { this.sendSocketNotification("CONFIG", this.config); this.sendSocketNotification("MODULES", Module.definitions); - this.hide(0, { lockString: self.identifier }); + //this.hide(0, { lockString: self.identifier }); } }, socketNotificationReceived: function (notification, payload) { if (notification === "STATUS") { - this.status = payload; - this.updateUI(); + this.updateUI(payload); } }, - updateUI: function () { + updateUI: function (payload) { var self = this; - if (this.status && this.status.behind > 0) { - self.updateDom(0); - self.show(1000, { lockString: self.identifier }); - } + if (payload && payload.behind > 0) { + // if we haven't seen info for this module + if(this.moduleList[payload.module] == undefined){ + // save it + this.moduleList[payload.module]=payload; + self.updateDom(2); + } + //self.show(1000, { lockString: self.identifier }); + + } else if (payload && payload.behind == 0){ + // if the module WAS in the list, but shouldn't be + if(this.moduleList[payload.module] != undefined){ + // remove it + delete this.moduleList[payload.module] + self.updateDom(2); + } + } }, - diffLink: function(text) { - var localRef = this.status.hash; - var remoteRef = this.status.tracking.replace(/.*\//, ""); + diffLink: function(module, text) { + var localRef = module.hash; + var remoteRef = module.tracking.replace(/.*\//, ""); return " 0) { - var message = document.createElement("div"); - message.className = "small bright"; + var message = document.createElement("div"); + message.className = "small bright"; - var icon = document.createElement("i"); - icon.className = "fa fa-exclamation-circle"; - icon.innerHTML = " "; - message.appendChild(icon); + var icon = document.createElement("i"); + icon.className = "fa fa-exclamation-circle"; + icon.innerHTML = " "; + message.appendChild(icon); - var updateInfoKeyName = this.status.behind == 1 ? "UPDATE_INFO_SINGLE" : "UPDATE_INFO_MULTIPLE"; - var subtextHtml = this.translate(updateInfoKeyName, { - COMMIT_COUNT: this.status.behind, - BRANCH_NAME: this.status.current - }); + var updateInfoKeyName = m.behind == 1 ? "UPDATE_INFO_SINGLE" : "UPDATE_INFO_MULTIPLE"; - var text = document.createElement("span"); - if (this.status.module == "default") { - text.innerHTML = this.translate("UPDATE_NOTIFICATION"); - subtextHtml = this.diffLink(subtextHtml); - } else { - text.innerHTML = this.translate("UPDATE_NOTIFICATION_MODULE", { - MODULE_NAME: this.status.module + var subtextHtml = this.translate(updateInfoKeyName, { + COMMIT_COUNT: m.behind, + BRANCH_NAME: m.current }); + + var text = document.createElement("span"); + if (m.module == "default") { + text.innerHTML = this.translate("UPDATE_NOTIFICATION"); + subtextHtml = this.diffLink(m,subtextHtml); + } else { + text.innerHTML = this.translate("UPDATE_NOTIFICATION_MODULE", { + MODULE_NAME: m.module + }); + } + message.appendChild(text); + + wrapper.appendChild(message); + + var subtext = document.createElement("div"); + subtext.innerHTML = subtextHtml; + subtext.className = "xsmall dimmed"; + wrapper.appendChild(subtext); } - message.appendChild(text); - - wrapper.appendChild(message); - - var subtext = document.createElement("div"); - subtext.innerHTML = subtextHtml; - subtext.className = "xsmall dimmed"; - wrapper.appendChild(subtext); } - return wrapper; + }, + + suspend: function() { + this.suspended=true; + }, + resume: function() { + this.suspended=false; + this.updateDom(2); } });