diff --git a/pkg/config/config.go b/pkg/config/config.go index 4d8cc8e..487c9a1 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -44,7 +44,12 @@ func (c *ConfFile) UpdateCleanupTime() { // UpdateCheckUpdatesTime updates check updates time func (c *ConfFile) UpdateCheckUpdatesTime() { - c.CheckUpdates = time.Now().AddDate(0, 0, CheckUpdatesDueDays) + c.UpdateCheckUpdatesTimeInDays(CheckUpdatesDueDays) +} + +// UpdateCheckUpdatesTimeInDays updates check updates time +func (c *ConfFile) UpdateCheckUpdatesTimeInDays(days int) { + c.CheckUpdates = time.Now().AddDate(0, 0, days) } // LoadConfFile return a pointer of a ConfFile which read from path diff --git a/pkg/environment/update.go b/pkg/environment/update.go index 4ce93bd..81085ee 100644 --- a/pkg/environment/update.go +++ b/pkg/environment/update.go @@ -26,10 +26,13 @@ func CheckForUpdates(log *logrus.Logger, home paths.Home, currentVersion string, return nil } } - if err := checkOnline(log, currentVersion); err != nil { + if updateAvailable, err := checkOnline(log, currentVersion); err != nil { return err + } else if updateAvailable { + conf.UpdateCheckUpdatesTimeInDays(1) // 如果已經發現可以更新, 一天後需要檢查是否更新了沒 + } else { + conf.UpdateCheckUpdatesTime() // 如果沒有任何更新檔, 就可以等久一點再檢查吧 } - conf.UpdateCheckUpdatesTime() return conf.WriteFile(home.ConfigFile(), 0644) } @@ -37,25 +40,27 @@ func needsToCheckOnline(dueDate time.Time) bool { return dueDate.Before(time.Now()) } -func checkOnline(log *logrus.Logger, currentVersion string) error { +func checkOnline(log *logrus.Logger, currentVersion string) (bool, error) { log.Println("Checking for latest slctl version...") client := github.NewClient(nil) ctx := context.Background() log.Debugf("fetching the latest published release from github.com/%s/%s", owner, repo) rr, _, err := client.Repositories.GetLatestRelease(ctx, owner, repo) if err != nil { - return err + return false, err } latest := rr.GetTagName() log.Debugf("found latest version: %s+%s", latest, rr.GetTargetCommitish()) - if updateAvailable, err := ver.Revision(latest).IsGreaterThan(currentVersion); err != nil { - return err - } else if updateAvailable { + updateAvailable, err := ver.Revision(latest).IsGreaterThan(currentVersion) + if err != nil { + return false, err + } + if updateAvailable { log.Printf(`A new version %q is available It is recommended using package managers to update Read more: https://github.com/softleader/slctl#upgrade`, latest) } else { log.Println("No update available") } - return nil + return updateAvailable, nil }