Skip to content

Commit 2f024fa

Browse files
aybabtmeAntoine Grondin
authored andcommitted
only prompt to update on exit if the version wasn't prompted
1 parent 200cb48 commit 2f024fa

File tree

3 files changed

+50
-31
lines changed

3 files changed

+50
-31
lines changed

cmd/humanlog/main.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111

1212
"github.com/aybabtme/rgbterm"
1313
"github.com/blang/semver"
14-
"github.com/fatih/color"
1514
types "github.com/humanlogio/api/go/types/v1"
1615
"github.com/humanlogio/humanlog"
1716
"github.com/humanlogio/humanlog/internal/pkg/config"
@@ -165,11 +164,12 @@ func newApp() *cli.App {
165164
app.Usage = "reads structured logs from stdin, makes them pretty on stdout!"
166165

167166
var (
168-
ctx context.Context
169-
cancel context.CancelFunc
170-
cfg *config.Config
171-
statefile *state.State
172-
updateRes <-chan *checkForUpdateRes
167+
ctx context.Context
168+
cancel context.CancelFunc
169+
cfg *config.Config
170+
statefile *state.State
171+
promptedToUpdate *semver.Version
172+
updateRes <-chan *checkForUpdateRes
173173
)
174174

175175
app.Before = func(c *cli.Context) error {
@@ -205,6 +205,11 @@ func newApp() *cli.App {
205205
return fmt.Errorf("reading default config file: %v", err)
206206
}
207207

208+
if statefile.LatestKnownVersion != nil && statefile.LatestKnownVersion.GT(semverVersion) {
209+
promptToUpdate(semverVersion, *statefile.LatestKnownVersion)
210+
promptedToUpdate = statefile.LatestKnownVersion
211+
}
212+
208213
if shouldCheckForUpdate(c, cfg, statefile) {
209214
req := &checkForUpdateReq{
210215
arch: runtime.GOARCH,
@@ -222,14 +227,11 @@ func newApp() *cli.App {
222227
if !ok {
223228
return nil
224229
}
225-
226-
if res.hasUpdate {
227-
log.Print(
228-
color.YellowString("Update available %s -> %s.", semverVersion, res.sem),
229-
)
230-
log.Print(
231-
color.YellowString("Run %s to upgrade.", color.New(color.Bold).Sprint("humanlog version update")),
232-
)
230+
if res.hasUpdate && promptedToUpdate == nil && promptedToUpdate.LT(res.sem) {
231+
alreadyPromptedForSameUpdate := promptedToUpdate != nil && promptedToUpdate.GTE(res.sem)
232+
if !alreadyPromptedForSameUpdate {
233+
promptToUpdate(semverVersion, res.sem)
234+
}
233235
}
234236
default:
235237
}

cmd/humanlog/versions.go

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func reqMeta(st *state.State) *types.ReqMeta {
5858
return req
5959
}
6060

61-
func updateFromResMeta(st *state.State, res *types.ResMeta, lastUpdateCheck *time.Time) error {
61+
func updateFromResMeta(st *state.State, res *types.ResMeta, latestKnownVersion *semver.Version, latestKnownVersionUpdatedAt *time.Time) error {
6262
changed := false
6363
if st.AccountID == nil || res.AccountId != *st.AccountID {
6464
st.AccountID = &res.AccountId
@@ -68,8 +68,18 @@ func updateFromResMeta(st *state.State, res *types.ResMeta, lastUpdateCheck *tim
6868
st.MachineID = &res.MachineId
6969
changed = true
7070
}
71-
if st.LastUpdateCheckAt == nil && lastUpdateCheck != nil {
72-
st.LastUpdateCheckAt = lastUpdateCheck
71+
if st.LatestKnownVersion == nil && latestKnownVersion != nil {
72+
st.LatestKnownVersion = latestKnownVersion
73+
changed = true
74+
} else if st.LatestKnownVersion != nil && latestKnownVersion != nil && !st.LatestKnownVersion.EQ(*latestKnownVersion) {
75+
st.LatestKnownVersion = latestKnownVersion
76+
changed = true
77+
}
78+
if st.LastestKnownVersionUpdatedAt == nil && latestKnownVersionUpdatedAt != nil {
79+
st.LastestKnownVersionUpdatedAt = latestKnownVersionUpdatedAt
80+
changed = true
81+
} else if st.LastestKnownVersionUpdatedAt != nil && latestKnownVersionUpdatedAt != nil && !st.LastestKnownVersionUpdatedAt.Equal(*latestKnownVersionUpdatedAt) {
82+
st.LastestKnownVersionUpdatedAt = latestKnownVersionUpdatedAt
7383
changed = true
7484
}
7585
if !changed {
@@ -106,12 +116,7 @@ func versionCmd(
106116
if err != nil {
107117
return fmt.Errorf("invalid semver received: %w", err)
108118
}
109-
log.Print(
110-
color.YellowString("Update available %s -> %s.", semverVersion, nextSV),
111-
)
112-
log.Print(
113-
color.YellowString("Run %s to upgrade.", color.New(color.Bold).Sprint("humanlog version update")),
114-
)
119+
promptToUpdate(semverVersion, nextSV)
115120
log.Printf("- url: %s", nextArtifact.Url)
116121
log.Printf("- sha256: %s", nextArtifact.Sha256)
117122
log.Printf("- sig: %s", nextArtifact.Signature)
@@ -173,14 +178,14 @@ func checkForUpdate(ctx context.Context, cfg *config.Config, state *state.State)
173178
msg := res.Msg
174179

175180
lastCheckAt := time.Now()
176-
if err := updateFromResMeta(state, msg.Meta, &lastCheckAt); err != nil {
177-
log.Printf("failed to persist internal state: %v", err)
178-
}
179-
180181
nextSV, err := msg.NextVersion.AsSemver()
181182
if err != nil {
182183
return nil, nil, false, err
183184
}
185+
if err := updateFromResMeta(state, msg.Meta, &nextSV, &lastCheckAt); err != nil {
186+
log.Printf("failed to persist internal state: %v", err)
187+
}
188+
184189
return msg.NextVersion, msg.NextArtifact, currentSV.LT(nextSV), nil
185190
}
186191

@@ -207,3 +212,12 @@ func asyncCheckForUpdate(ctx context.Context, req *checkForUpdateReq, cfg *confi
207212
}()
208213
return out
209214
}
215+
216+
func promptToUpdate(from, to semver.Version) {
217+
log.Print(
218+
color.YellowString("Update available %s -> %s.", from, to),
219+
)
220+
log.Print(
221+
color.YellowString("Run `%s` to upgrade.", color.New(color.Bold).Sprint("humanlog version update")),
222+
)
223+
}

internal/pkg/state/state.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"os"
88
"path/filepath"
99
"time"
10+
11+
"github.com/blang/semver"
1012
)
1113

1214
var DefaultState = State{
@@ -93,10 +95,11 @@ func WriteStateFile(path string, state *State) error {
9395
}
9496

9597
type State struct {
96-
Version int `json:"version"`
97-
AccountID *int64 `json:"account_id"`
98-
MachineID *int64 `json:"machine_id"`
99-
LastUpdateCheckAt *time.Time `json:"last_update_check_at"`
98+
Version int `json:"version"`
99+
AccountID *int64 `json:"account_id"`
100+
MachineID *int64 `json:"machine_id"`
101+
LatestKnownVersion *semver.Version `json:"latest_known_version,omitempty"`
102+
LastestKnownVersionUpdatedAt *time.Time `json:"latest_known_version_updated_at"`
100103

101104
// unexported
102105
path string

0 commit comments

Comments
 (0)