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 }