From 7652f86c6f33fb3d57f07f1f5acfed44ab8453a0 Mon Sep 17 00:00:00 2001
From: Juan Batiz-Benet <juan@benet.ai>
Date: Thu, 9 Oct 2014 20:31:24 -0700
Subject: [PATCH] fixed a parsing bug on Version.CheckPeriod

And refactored a few names/comments
---
 cmd/ipfs/ipfs.go  |  8 +++---
 config/config.go  |  2 ++
 config/version.go | 69 ++++++++++++++++++++++++++++++++++-------------
 3 files changed, 58 insertions(+), 21 deletions(-)

diff --git a/cmd/ipfs/ipfs.go b/cmd/ipfs/ipfs.go
index 29ec17835..933ea5bd7 100644
--- a/cmd/ipfs/ipfs.go
+++ b/cmd/ipfs/ipfs.go
@@ -120,16 +120,18 @@ func localNode(confdir string, online bool) (*core.IpfsNode, error) {
 		return nil, err
 	}
 
-	if cfg.Version.EligibleForUpdateCheck() {
+	if cfg.Version.ShouldCheckForUpdate() {
 		obsolete := updates.CheckForUpdates()
 		if obsolete != nil {
 			if cfg.Version.Check == config.CheckError {
 				return nil, obsolete
 			}
-			log.Warning(fmt.Sprintf("%v", obsolete)) // when "warn" version.check mode we just show warning message
+
+			// when "warn" version.check mode we just show warning message
+			log.Warning(fmt.Sprintf("%v", obsolete))
 		} else {
 			// update most recent check timestamp in config
-			cfg.RecordCurrentUpdateCheck(filename)
+			config.RecordUpdateCheck(cfg, filename)
 		}
 	}
 
diff --git a/config/config.go b/config/config.go
index 410fa0119..b04567bdd 100644
--- a/config/config.go
+++ b/config/config.go
@@ -11,6 +11,8 @@ import (
 	u "github.com/jbenet/go-ipfs/util"
 )
 
+var log = u.Logger("config")
+
 // Identity tracks the configuration of the local node's identity.
 type Identity struct {
 	PeerID  string
diff --git a/config/version.go b/config/version.go
index 5cc469485..3c08cd372 100644
--- a/config/version.go
+++ b/config/version.go
@@ -1,38 +1,71 @@
 package config
 
-import "time"
+import (
+	"strconv"
+	"time"
+)
 
 // Version regulates checking if the most recent version is run
 type Version struct {
-	Check             string        // "ignore" for do not check, "warn" and "error" for reacting when obsolete
-	Current           string        // ipfs version for which config was generated
-	UpdateCheckedTime time.Time     // timestamp for the last time API endpoint was checked for updates
-	UpdateCheckPeriod time.Duration // time duration over which the update check will not be performed
+	// Current is the ipfs version for which config was generated
+	Current string
+
+	// Check signals how to react on updates:
+	// - "ignore" for not checking
+	// - "warn" for issuing a warning and proceeding
+	// - "error" for exiting with an error
+	Check string
+
+	// CheckDate is a timestamp for the last time API endpoint was checked for updates
+	CheckDate time.Time
+
+	// CheckPeriod is the time duration over which the update check will not be performed
+	// (Note: cannot use time.Duration because marshalling with json breaks it)
+	CheckPeriod string
 }
 
 // supported Version.Check values
 const (
-	CheckError  = "error"  // value for Version.Check to raise error and exit if version is obsolete
-	CheckWarn   = "warn"   // value for Version.Check to show warning message if version is obsolete
-	CheckIgnore = "ignore" // value for Version.Check to not perform update check
+	// CheckError value for Version.Check to raise error and exit if version is obsolete
+	CheckError = "error"
+
+	// CheckWarn value for Version.Check to show warning message if version is obsolete
+	CheckWarn = "warn"
+
+	// CheckIgnore value for Version.Check to not perform update check
+	CheckIgnore = "ignore"
 )
 
-var defaultUpdateCheckPeriod = time.Hour * 48
+// defaultCheckPeriod governs h
+var defaultCheckPeriod = time.Hour * 48
 
-// EligibleForUpdateCheck returns if update check API endpoint is needed for this specific runtime
-func (v *Version) EligibleForUpdateCheck() bool {
-	if v.Check == CheckIgnore || v.UpdateCheckedTime.Add(v.UpdateCheckPeriod).After(time.Now()) {
+func (v *Version) checkPeriodDuration() time.Duration {
+	d, err := strconv.Atoi(v.CheckPeriod)
+	if err != nil {
+		log.Error("config.Version.CheckPeriod parse error. Using default.")
+		return defaultCheckPeriod
+	}
+	return time.Duration(d)
+}
+
+// ShouldCheckForUpdate returns if update check API endpoint is needed for this specific runtime
+func (v *Version) ShouldCheckForUpdate() bool {
+
+	period := v.checkPeriodDuration()
+	if v.Check == CheckIgnore || v.CheckDate.Add(period).After(time.Now()) {
 		return false
 	}
 	return true
 }
 
-// RecordCurrentUpdateCheck is called to record that update check was performed and showed that the running version is the most recent one
-func (cfg *Config) RecordCurrentUpdateCheck(filename string) {
-	cfg.Version.UpdateCheckedTime = time.Now()
-	if cfg.Version.UpdateCheckPeriod == time.Duration(0) {
-		// UpdateCheckPeriod was not initialized for some reason (e.g. config file used is broken)
-		cfg.Version.UpdateCheckPeriod = defaultUpdateCheckPeriod
+// RecordUpdateCheck is called to record that an update check was performed,
+// showing that the running version is the most recent one.
+func RecordUpdateCheck(cfg *Config, filename string) {
+	cfg.Version.CheckDate = time.Now()
+
+	if cfg.Version.CheckPeriod == "" {
+		// CheckPeriod was not initialized for some reason (e.g. config file broken)
+		cfg.Version.CheckPeriod = strconv.Itoa(int(defaultCheckPeriod))
 	}
 
 	WriteConfigFile(filename, cfg)
-- 
GitLab