diff --git a/Makefile b/Makefile
index d1345c460..8fed1bc95 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
.PHONY: default clean install lint test assets build binaries publish-images test-release release
-TAG_NAME := $(shell git tag -l --contains HEAD)
+TAG_NAME := $(shell git describe --abbrev=0 --tags)
SHA := $(shell git rev-parse --short HEAD)
VERSION := $(if $(TAG_NAME),$(TAG_NAME),$(SHA))
diff --git a/assets/index.html b/assets/index.html
index 91988400b..4f4cc6c30 100644
--- a/assets/index.html
+++ b/assets/index.html
@@ -46,6 +46,8 @@
+
+
+
+
+
diff --git a/assets/js/app.js b/assets/js/app.js
index 097923a87..699cd27aa 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -81,6 +81,7 @@ let formatter = {
let store = {
state: {
+ availableVersion: null,
loadpoints: [],
},
update: function(msg) {
@@ -163,8 +164,8 @@ const toasts = new Vue({
});
Vue.component('message-toast', {
- props: ['item'],
template: '#message-template',
+ props: ['item'],
mounted: function () {
const id = "#message-id-" + this.item.id;
$(id).toast('show');
@@ -174,6 +175,24 @@ Vue.component('message-toast', {
},
});
+Vue.component('version', {
+ template: '#version-template',
+ props: ['installed'],
+ data: function () {
+ return {
+ state: store.state,
+ };
+ },
+ watch: {
+ "state.availableVersion": function () {
+ if (this.installed != "<<.Version>>" && // go template parsed?
+ this.state.availableVersion != this.installed) {
+ $(this.$refs.bar).collapse("show");
+ }
+ }
+ }
+});
+
Vue.component('modeswitch', {
template: '#mode-template',
data: function() {
diff --git a/cmd/root.go b/cmd/root.go
index 7eaabe18a..bbdc92fac 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -7,11 +7,11 @@ import (
"github.com/andig/evcc/provider"
"github.com/andig/evcc/server"
+ "github.com/andig/evcc/server/updater"
"github.com/andig/evcc/util"
"github.com/spf13/cobra"
"github.com/spf13/viper"
- latest "github.com/tcnksm/go-latest"
)
var (
@@ -114,20 +114,6 @@ func Execute() {
}
}
-// checkVersion validates if updates are available
-func checkVersion() {
- githubTag := &latest.GithubTag{
- Owner: "andig",
- Repository: "evcc",
- }
-
- if res, err := latest.Check(githubTag, server.Version); err == nil {
- if res.Outdated {
- log.INFO.Printf("updates available - please upgrade to %s", res.Current)
- }
- }
-}
-
func run(cmd *cobra.Command, args []string) {
util.LogLevel(viper.GetString("log"), viper.GetStringMapString("levels"))
log.INFO.Printf("evcc %s (%s)", server.Version, server.Commit)
@@ -136,8 +122,6 @@ func run(cmd *cobra.Command, args []string) {
conf := loadConfigFile(cfgFile)
util.LogLevel(viper.GetString("log"), viper.GetStringMapString("levels"))
- go checkVersion()
-
uri := viper.GetString("uri")
log.INFO.Println("listening at", uri)
@@ -172,6 +156,9 @@ func run(cmd *cobra.Command, args []string) {
valueChan := make(chan util.Param)
go tee.Run(valueChan)
+ // version check
+ go updater.Run(log, valueChan)
+
// capture log messages for UI
util.CaptureLogs(valueChan)
diff --git a/server/assets.go b/server/assets.go
index 35a2db259..f89b4b5d0 100644
--- a/server/assets.go
+++ b/server/assets.go
@@ -3561,110 +3561,115 @@ oJE6K0E084u3ea7ne0X73qsc2P2KOB+ngKecxITsMAgTVJfqMwAA//+21HeD5gEAAA==
"/index.html": {
name: "index.html",
local: "../assets/index.html",
- size: 13624,
+ size: 14298,
modtime: 1566640112,
compressed: `
-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
+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
`,
},
"/js/app.js": {
name: "app.js",
local: "../assets/js/app.js",
- size: 6792,
+ size: 7225,
modtime: 1566640112,
compressed: `
-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
-JiAeF0hccFuj/x0AAP//sWHskogaAAA=
+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
+fwUAAP//HalhmTkcAAA=
`,
},
diff --git a/server/updater/updater.go b/server/updater/updater.go
new file mode 100644
index 000000000..e53d8afad
--- /dev/null
+++ b/server/updater/updater.go
@@ -0,0 +1,49 @@
+package updater
+
+import (
+ "time"
+
+ "github.com/andig/evcc/server"
+ "github.com/andig/evcc/util"
+ latest "github.com/tcnksm/go-latest"
+)
+
+var instance *updater
+
+type updater struct {
+ log *util.Logger
+ cache chan<- util.Param
+}
+
+// Run regularly checks version
+func Run(log *util.Logger, cache chan<- util.Param) {
+ instance = &updater{
+ log: log,
+ cache: cache,
+ }
+
+ instance.checkVersion()
+ for range time.NewTicker(24 * time.Hour).C {
+ instance.checkVersion()
+ }
+}
+
+// checkVersion validates if updates are available
+func (u *updater) checkVersion() {
+ githubTag := &latest.GithubTag{
+ Owner: "andig",
+ Repository: "evcc",
+ }
+
+ if res, err := latest.Check(githubTag, server.Version); err == nil {
+ if res.Outdated {
+ u.log.INFO.Printf("new version available - please upgrade to %s", res.Current)
+ }
+ u.cache <- util.Param{
+ Key: "availableVersion",
+ Val: res.Current,
+ }
+ } else {
+ u.log.ERROR.Println("version check failed:", err)
+ }
+}
diff --git a/server/version.go b/server/version.go
index 5153080b1..45605ebff 100644
--- a/server/version.go
+++ b/server/version.go
@@ -2,7 +2,7 @@ package server
var (
// Version of executable
- Version = "dev"
+ Version = "0.0.1-alpha"
// Commit of executable
Commit = "HEAD"
)