-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
version.go
131 lines (109 loc) · 3.53 KB
/
version.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package config
import (
"errors"
"strconv"
"strings"
"time"
)
// CurrentVersionNumber is the current application's version literal
const CurrentVersionNumber = "0.3.4"
// Version regulates checking if the most recent version is run
type Version struct {
// 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
// AutoUpdate is optional
AutoUpdate AutoUpdateSetting
}
// supported Version.Check values
const (
// 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"
)
// AutoUpdateSetting implements json.Unmarshaler to check values in config
type AutoUpdateSetting int
// AutoUpdateSetting values
const (
AutoUpdateNever AutoUpdateSetting = iota // do not auto-update
AutoUpdatePatch // only on new patch versions
AutoUpdateMinor // on new minor or patch versions (Default)
AutoUpdateMajor // on all, even Major, version changes
)
// ErrUnknownAutoUpdateSetting is returned when an unknown value is read from the config
var ErrUnknownAutoUpdateSetting = errors.New("unknown value for AutoUpdate")
// defaultCheckPeriod governs h
var defaultCheckPeriod = time.Hour * 48
// UnmarshalJSON checks the input against known strings
func (s *AutoUpdateSetting) UnmarshalJSON(in []byte) error {
switch strings.ToLower(string(in)) {
case `"never"`:
*s = AutoUpdateNever
case `"major"`:
*s = AutoUpdateMajor
case `"minor"`:
*s = AutoUpdateMinor
case `"patch"`:
*s = AutoUpdatePatch
default:
*s = AutoUpdateMinor
return ErrUnknownAutoUpdateSetting
}
return nil
}
// MarshalJSON converts the value back to JSON string
func (s AutoUpdateSetting) MarshalJSON() ([]byte, error) {
return []byte(`"` + s.String() + `"`), nil
}
// String converts valye to human readable string
func (s AutoUpdateSetting) String() string {
switch s {
case AutoUpdateNever:
return "never"
case AutoUpdateMajor:
return "major"
case AutoUpdateMinor:
return "minor"
case AutoUpdatePatch:
return "patch"
default:
return ErrUnknownAutoUpdateSetting.Error()
}
}
func (v *Version) checkPeriodDuration() time.Duration {
d, err := strconv.Atoi(v.CheckPeriod)
if err != nil {
log.Warning("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
}
// VersionDefaultValue returns the default version config value (for init).
func VersionDefaultValue() Version {
return Version{
Current: CurrentVersionNumber,
Check: "error",
CheckPeriod: strconv.Itoa(int(defaultCheckPeriod)),
AutoUpdate: AutoUpdateMinor,
}
}