From a247389d4ef07ea1245f90db5bd9cf6e332d8077 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 15 Jan 2014 12:07:42 +1100 Subject: [PATCH] FEATURE: automatically update site to latest version of assets if a user neglects to move around the site it will prompt to do so 2 hours in --- app/assets/javascripts/discourse.js | 5 +++++ .../discourse/initializers/1_init_message_bus.js | 11 +++++++++++ app/assets/javascripts/discourse/lib/url.js | 10 +++------- app/views/common/_discourse_javascript.html.erb | 2 +- config/initializers/04-message_bus.rb | 8 -------- config/locales/client.en.yml | 1 + lib/discourse.rb | 14 ++++++++++++++ 7 files changed, 35 insertions(+), 16 deletions(-) diff --git a/app/assets/javascripts/discourse.js b/app/assets/javascripts/discourse.js index 8ffa2e47aae..2b0544c7aed 100644 --- a/app/assets/javascripts/discourse.js +++ b/app/assets/javascripts/discourse.js @@ -130,6 +130,11 @@ window.Discourse = Ember.Application.createWithMixins(Discourse.Ajax, { } }, + requiresRefresh: function(){ + var desired = Discourse.get("desiredAssetVersion"); + return desired && Discourse.get("currentAssetVersion") !== desired; + }.property("currentAssetVersion", "desiredAssetVersion"), + assetVersion: function(prop, val) { if(val) { if(this.get("currentAssetVersion")){ diff --git a/app/assets/javascripts/discourse/initializers/1_init_message_bus.js b/app/assets/javascripts/discourse/initializers/1_init_message_bus.js index fafac2aec38..e15d45a38d1 100644 --- a/app/assets/javascripts/discourse/initializers/1_init_message_bus.js +++ b/app/assets/javascripts/discourse/initializers/1_init_message_bus.js @@ -6,6 +6,17 @@ Discourse.addInitializer(function() { Discourse.MessageBus.start(); Discourse.MessageBus.subscribe("/global/asset-version", function(version){ Discourse.set("assetVersion",version); + + if(Discourse.get("requiresRefresh")) { + // since we can do this transparently for people browsing the forum + // hold back the message a couple of hours + setTimeout(function() { + bootbox.confirm(I18n.lookup("assets_changed_confirm"), function(){ + document.location.reload(); + }); + }, 1000 * 60 * 120); + } + }); Discourse.KeyValueStore.init("discourse_", Discourse.MessageBus); }, true); diff --git a/app/assets/javascripts/discourse/lib/url.js b/app/assets/javascripts/discourse/lib/url.js index 8d27896291e..e9a91f9fd2f 100644 --- a/app/assets/javascripts/discourse/lib/url.js +++ b/app/assets/javascripts/discourse/lib/url.js @@ -48,13 +48,9 @@ Discourse.URL = Em.Object.createWithMixins({ **/ routeTo: function(path) { - // If somehow our asset version changed, force a full reload of desired path - var desired = Discourse.get("desiredAssetVersion"); - if(desired) { - if(Discourse.get("currentAssetVersion") !== desired){ - document.location.href = path; - return; - } + if(Discourse.get("requiresRefresh")){ + document.location.href = path; + return; } var oldPath = window.location.pathname; diff --git a/app/views/common/_discourse_javascript.html.erb b/app/views/common/_discourse_javascript.html.erb index cf3da5bec51..7b539dc348a 100644 --- a/app/views/common/_discourse_javascript.html.erb +++ b/app/views/common/_discourse_javascript.html.erb @@ -37,7 +37,7 @@ Discourse.SiteSettings = PreloadStore.get('siteSettings'); Discourse.Router.map(function() { Discourse.routeBuilder.call(this); }); Discourse.start() - Discourse.set('assetVersion','<%= Rails.application.assets.digest %>'); + Discourse.set('assetVersion','<%= Discourse.assets_digest %>'); <%= javascript_include_tag 'browser-update.js' %> diff --git a/config/initializers/04-message_bus.rb b/config/initializers/04-message_bus.rb index 2768d625f88..efc333f2d62 100644 --- a/config/initializers/04-message_bus.rb +++ b/config/initializers/04-message_bus.rb @@ -37,11 +37,3 @@ end MessageBus.cache_assets = !Rails.env.development? MessageBus.enable_diagnostics - -digest = Rails.application.assets.digest.to_s -channel = "/global/asset-version" -message = MessageBus.last_message(channel) - -unless message && message.data == digest - MessageBus.publish channel, digest -end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index e7bab812e67..03ecccd3292 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -387,6 +387,7 @@ en: loading: "Loading..." close: "Close" + assets_changed_confirm: "Discourse has been updated, would you like to refresh to get the latest version?" learn_more: "learn more..." year: 'year' diff --git a/lib/discourse.rb b/lib/discourse.rb index c5369662ab1..7eeff3ce525 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -59,6 +59,20 @@ module Discourse @plugins end + def self.assets_digest + @assets_digest ||= begin + digest = Digest::MD5.hexdigest(ActionView::Base.assets_manifest.assets.values.sort.join) + + channel = "/global/asset-version" + message = MessageBus.last_message(channel) + + unless message && message.data == digest + MessageBus.publish channel, digest + end + digest + end + end + def self.authenticators # TODO: perhaps we don't need auth providers and authenticators maybe one object is enough