github.com/grahambrereton-form3/tilt@v0.10.18/internal/engine/version_checker.go (about) 1 package engine 2 3 import ( 4 "context" 5 "strings" 6 "time" 7 8 "github.com/windmilleng/tilt/internal/github" 9 "github.com/windmilleng/tilt/internal/store" 10 "github.com/windmilleng/tilt/pkg/logger" 11 ) 12 13 const githubOrg = "windmilleng" 14 const githubProject = "tilt" 15 const versionCheckInterval = time.Hour * 4 16 17 type TiltVersionChecker struct { 18 started bool 19 clientFactory GithubClientFactory 20 client github.Client 21 timerMaker timerMaker 22 } 23 24 func NewTiltVersionChecker(ghcf GithubClientFactory, timerMaker timerMaker) *TiltVersionChecker { 25 return &TiltVersionChecker{clientFactory: ghcf, timerMaker: timerMaker} 26 } 27 28 type GithubClientFactory func() github.Client 29 30 func NewGithubClientFactory() GithubClientFactory { 31 return github.NewClient 32 } 33 34 func (tvc *TiltVersionChecker) OnChange(ctx context.Context, st store.RStore) { 35 if tvc.started { 36 return 37 } 38 39 s := st.RLockState() 40 defer st.RUnlockState() 41 if s.TiltBuildInfo.Dev { 42 return 43 } 44 45 tvc.client = tvc.clientFactory() 46 tvc.started = true 47 48 go func() { 49 for { 50 version, err := tvc.client.GetLatestRelease(ctx, githubOrg, githubProject) 51 if err != nil { 52 if strings.Contains(err.Error(), "API rate limit exceeded") { 53 logger.Get(ctx).Verbosef("error checking github for latest Tilt release: %v", err) 54 } else { 55 logger.Get(ctx).Infof("error checking github for latest Tilt release: %s", err.Error()) 56 } 57 } else { 58 st.Dispatch(LatestVersionAction{version}) 59 } 60 select { 61 case <-tvc.timerMaker(versionCheckInterval): 62 case <-ctx.Done(): 63 return 64 } 65 } 66 }() 67 }