diff --git a/CHANGELOG.md b/CHANGELOG.md index 7981d439..0cc229c7 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,18 @@ This project adheres to [Semantic Versioning](http://semver.org/). ❤️ **Donate:** Enjoying MagicMirror²? [Please consider a donation!](https://magicmirror.builders/donate) With your help we can continue to improve the MagicMirror² core. -## [2.9.0] - 2019-10-01 +## [2.9.0] - Unreleased (Develop Branch) + +*This release is scheduled to be released on 2019-10-01.* + +### Added + +### Updated +- Updatenotification module: Display update notification for a limited (configurable) time. ### Fixed -- Send `NEWS_FEED` Notification also for the first newsmessage which are shown +- Updatenotification module: Properly handle race conditions, prevent crash. +- Send `NEWS_FEED` notification also for the first news messages which are shown ## [2.8.0] - 2019-07-01 diff --git a/modules/default/updatenotification/node_helper.js b/modules/default/updatenotification/node_helper.js index 2445daff..1f9d2f4d 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,30 +43,29 @@ 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; - simpleGits.forEach(function(sg) { sg.git.fetch().status(function(err, data) { data.module = sg.module; diff --git a/modules/default/updatenotification/updatenotification.js b/modules/default/updatenotification/updatenotification.js index 14ed7c64..58c3995c 100644 --- a/modules/default/updatenotification/updatenotification.js +++ b/modules/default/updatenotification/updatenotification.js @@ -2,40 +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); } }); diff --git a/package-lock.json b/package-lock.json index d812656a..17b8ce12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.8.0", + "version": "2.9.0-develop", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e6efee6b..1f7e7402 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.8.0", + "version": "2.9.0-develop", "description": "The open source modular smart mirror platform.", "main": "js/electron.js", "scripts": {