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  }