github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/pkg/snapshot/version.go (about)

     1  package snapshot
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/mattn/go-jsonpointer"
     7  )
     8  
     9  // Functions to determine Tilt version from a Snapshot
    10  
    11  // This code was copy/pasted from TFT
    12  // TODO: have TFT call this instead of having its own copy of the code
    13  
    14  func GetVersionFromSnapshot(snapshot map[string]interface{}) (string, error) {
    15  	view, hasView := snapshot["view"].(map[string]interface{})
    16  	if !hasView {
    17  		return GetVersionOrSHAFromSnapshotV1(snapshot)
    18  	}
    19  
    20  	_, hasUISession := view["uiSession"]
    21  	if !hasUISession {
    22  		return GetVersionOrSHAFromSnapshotV2(snapshot)
    23  	}
    24  
    25  	return GetVersionOrSHAFromSnapshotV3(snapshot)
    26  }
    27  
    28  func GetVersionOrSHAFromSnapshotV3(snapshot map[string]interface{}) (string, error) {
    29  	v, err := jsonpointer.Get(snapshot, "/view/uiSession/status/runningTiltBuild/version")
    30  	if err != nil {
    31  		return "", fmt.Errorf("Unable to parse Version: %s", err.Error())
    32  	}
    33  	devVal, err := jsonpointer.Get(snapshot, "/view/uiSession/status/runningTiltBuild/dev")
    34  	isDev := false
    35  	if err == nil {
    36  		devValBool, ok := devVal.(bool)
    37  		if ok {
    38  			isDev = devValBool
    39  		}
    40  	}
    41  	s, err := jsonpointer.Get(snapshot, "/view/uiSession/status/runningTiltBuild/commitSHA")
    42  	sha := ""
    43  	if err != nil {
    44  		// this is OK, old snapshots won't have this
    45  	} else {
    46  		sha = fmt.Sprintf("%s", s)
    47  	}
    48  	version := fmt.Sprintf("%s", v)
    49  
    50  	if sha != "" && isDev {
    51  		return sha, nil
    52  	}
    53  
    54  	if version == "" {
    55  		return "", fmt.Errorf("Unable to parse Version: empty version")
    56  	}
    57  
    58  	return fmt.Sprintf("v%s", version), nil
    59  }
    60  
    61  func GetVersionOrSHAFromSnapshotV2(snapshot map[string]interface{}) (string, error) {
    62  	v, err := jsonpointer.Get(snapshot, "/view/runningTiltBuild/version")
    63  	if err != nil {
    64  		return "", fmt.Errorf("Unable to parse Version: %s", err.Error())
    65  	}
    66  	isDev := false
    67  	if jsonpointer.Has(snapshot, "/view/runningTiltBuild/dev") {
    68  		dev, err := jsonpointer.Get(snapshot, "/view/runningTiltBuild/dev")
    69  		if err != nil {
    70  			return "", fmt.Errorf("Unable to find Dev flag: %s", err.Error())
    71  		}
    72  		var ok bool
    73  		isDev, ok = dev.(bool)
    74  		if !ok {
    75  			return "", fmt.Errorf("Unable to parse dev (%v) as bool", dev)
    76  		}
    77  	}
    78  	s, err := jsonpointer.Get(snapshot, "/view/runningTiltBuild/commitSHA")
    79  	sha := ""
    80  	if err != nil {
    81  		// this is OK, old snapshots won't have this
    82  	} else {
    83  		sha = fmt.Sprintf("%s", s)
    84  	}
    85  	version := fmt.Sprintf("%s", v)
    86  
    87  	if sha != "" && isDev {
    88  		return sha, nil
    89  	}
    90  
    91  	if version == "" {
    92  		return "", fmt.Errorf("Unable to parse Version: empty version")
    93  	}
    94  
    95  	return fmt.Sprintf("v%s", version), nil
    96  }
    97  
    98  func GetVersionOrSHAFromSnapshotV1(snapshot map[string]interface{}) (string, error) {
    99  	v, err := jsonpointer.Get(snapshot, "/View/RunningTiltBuild/Version")
   100  	if err != nil {
   101  		return "", fmt.Errorf("Unable to parse Version: %s", err.Error())
   102  	}
   103  	dev, err := jsonpointer.Get(snapshot, "/View/RunningTiltBuild/Dev")
   104  	if err != nil {
   105  		return "", fmt.Errorf("Unable to find Dev flag: %s", err.Error())
   106  	}
   107  	isDev, ok := dev.(bool)
   108  	if !ok {
   109  		return "", fmt.Errorf("Unable to parse dev (%v) as bool", dev)
   110  	}
   111  	s, err := jsonpointer.Get(snapshot, "/View/RunningTiltBuild/CommitSHA")
   112  	sha := ""
   113  	if err != nil {
   114  		// this is OK, old snapshots won't have this
   115  	} else {
   116  		sha = fmt.Sprintf("%s", s)
   117  	}
   118  	version := fmt.Sprintf("%s", v)
   119  
   120  	if sha != "" && isDev {
   121  		return sha, nil
   122  	}
   123  
   124  	if version == "" {
   125  		return "", fmt.Errorf("Unable to parse Version: empty version")
   126  	}
   127  
   128  	return fmt.Sprintf("v%s", version), nil
   129  }