github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/pkg/platform/runtime/target/target.go (about) 1 package target 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "strings" 7 8 "github.com/ActiveState/cli/internal/errs" 9 "github.com/ActiveState/cli/internal/fileutils" 10 "github.com/ActiveState/cli/internal/hash" 11 "github.com/ActiveState/cli/internal/installation/storage" 12 "github.com/ActiveState/cli/internal/logging" 13 "github.com/ActiveState/cli/internal/multilog" 14 "github.com/ActiveState/cli/pkg/localcommit" 15 "github.com/ActiveState/cli/pkg/project" 16 "github.com/go-openapi/strfmt" 17 ) 18 19 type Trigger string 20 21 func (t Trigger) String() string { 22 return string(t) 23 } 24 25 const ( 26 TriggerActivate Trigger = "activate" 27 TriggerScript Trigger = "script" 28 TriggerDeploy Trigger = "deploy" 29 TriggerExec Trigger = "exec-cmd" 30 TriggerExecutor Trigger = "exec" 31 TriggerResetExec Trigger = "reset-exec" 32 TriggerSwitch Trigger = "switch" 33 TriggerImport Trigger = "import" 34 TriggerInit Trigger = "init" 35 TriggerPackage Trigger = "package" 36 TriggerLanguage Trigger = "language" 37 TriggerPlatform Trigger = "platform" 38 TriggerManifest Trigger = "manifest" 39 TriggerPull Trigger = "pull" 40 TriggerRefresh Trigger = "refresh" 41 TriggerReset Trigger = "reset" 42 TriggerRevert Trigger = "revert" 43 TriggerOffline Trigger = "offline" 44 TriggerShell Trigger = "shell" 45 TriggerCheckout Trigger = "checkout" 46 TriggerCommit Trigger = "commit" 47 TriggerUse Trigger = "use" 48 TriggerOfflineInstaller Trigger = "offline-installer" 49 TriggerOfflineUninstaller Trigger = "offline-uninstaller" 50 TriggerBuilds Trigger = "builds" 51 triggerUnknown Trigger = "unknown" 52 ) 53 54 func NewExecTrigger(cmd string) Trigger { 55 return Trigger(fmt.Sprintf("%s: %s", TriggerExec, cmd)) 56 } 57 58 func (t Trigger) IndicatesUsage() bool { 59 // All triggers should indicate runtime use except for refreshing executors 60 return !strings.EqualFold(string(t), string(TriggerResetExec)) 61 } 62 63 type ProjectTarget struct { 64 *project.Project 65 cacheDir string 66 customCommit *strfmt.UUID 67 trigger Trigger 68 } 69 70 func NewProjectTarget(pj *project.Project, customCommit *strfmt.UUID, trigger Trigger) *ProjectTarget { 71 runtimeCacheDir := storage.CachePath() 72 if pj.Cache() != "" { 73 runtimeCacheDir = pj.Cache() 74 } 75 return &ProjectTarget{pj, runtimeCacheDir, customCommit, trigger} 76 } 77 78 func NewProjectTargetCache(pj *project.Project, cacheDir string, customCommit *strfmt.UUID, trigger Trigger) *ProjectTarget { 79 return &ProjectTarget{pj, cacheDir, customCommit, trigger} 80 } 81 82 func (p *ProjectTarget) Dir() string { 83 if p.Project.Cache() != "" { 84 return p.Project.Cache() 85 } 86 return ProjectDirToTargetDir(filepath.Dir(p.Project.Source().Path()), p.cacheDir) 87 } 88 89 func (p *ProjectTarget) CommitUUID() strfmt.UUID { 90 if p.customCommit != nil { 91 return *p.customCommit 92 } 93 commitID, err := localcommit.Get(p.Project.Dir()) 94 if err != nil { 95 multilog.Error("Unable to get local commit: %v", errs.JoinMessage(err)) 96 return "" 97 } 98 return commitID 99 } 100 101 func (p *ProjectTarget) Trigger() Trigger { 102 if p.trigger == "" { 103 return triggerUnknown 104 } 105 return p.trigger 106 } 107 108 func (p *ProjectTarget) ReadOnly() bool { 109 return false 110 } 111 112 func (p *ProjectTarget) InstallFromDir() *string { 113 return nil 114 } 115 116 func (p *ProjectTarget) ProjectDir() string { 117 return p.Project.Dir() 118 } 119 120 func ProjectDirToTargetDir(projectDir, cacheDir string) string { 121 resolvedDir, err := fileutils.ResolveUniquePath(projectDir) 122 if err != nil { 123 multilog.Error("Could not resolve unique path for projectDir: %s, error: %s", projectDir, err.Error()) 124 resolvedDir = projectDir 125 } 126 logging.Debug("In newStore: resolved project dir is: %s", resolvedDir) 127 128 return filepath.Join(cacheDir, hash.ShortHash(resolvedDir)) 129 } 130 131 type CustomTarget struct { 132 owner string 133 name string 134 commitUUID strfmt.UUID 135 dir string 136 trigger Trigger 137 } 138 139 func NewCustomTarget(owner string, name string, commitUUID strfmt.UUID, dir string, trigger Trigger) *CustomTarget { 140 cleanDir, err := fileutils.ResolveUniquePath(dir) 141 if err != nil { 142 multilog.Error("Could not resolve unique path for dir: %s, error: %s", dir, err.Error()) 143 } else { 144 dir = cleanDir 145 } 146 return &CustomTarget{owner, name, commitUUID, dir, trigger} 147 } 148 149 func (c *CustomTarget) Owner() string { 150 return c.owner 151 } 152 153 func (c *CustomTarget) Name() string { 154 return c.name 155 } 156 157 func (c *CustomTarget) CommitUUID() strfmt.UUID { 158 return c.commitUUID 159 } 160 161 func (c *CustomTarget) Dir() string { 162 return c.dir 163 } 164 165 func (c *CustomTarget) Trigger() Trigger { 166 if c.trigger == "" { 167 return triggerUnknown 168 } 169 return c.trigger 170 } 171 172 func (c *CustomTarget) ReadOnly() bool { 173 return c.commitUUID == "" 174 } 175 176 func (c *CustomTarget) InstallFromDir() *string { 177 return nil 178 } 179 180 func (c *CustomTarget) ProjectDir() string { 181 return "" 182 } 183 184 type OfflineTarget struct { 185 ns *project.Namespaced 186 dir string 187 artifactsDir string 188 trigger Trigger 189 } 190 191 func NewOfflineTarget(namespace *project.Namespaced, dir string, artifactsDir string) *OfflineTarget { 192 cleanDir, err := fileutils.ResolveUniquePath(dir) 193 if err != nil { 194 multilog.Error("Could not resolve unique path for dir: %s, error: %s", dir, err.Error()) 195 } else { 196 dir = cleanDir 197 } 198 return &OfflineTarget{namespace, dir, artifactsDir, TriggerOffline} 199 } 200 201 func (i *OfflineTarget) Owner() string { 202 if i.ns == nil { 203 return "" 204 } 205 return i.ns.Owner 206 } 207 208 func (i *OfflineTarget) Name() string { 209 if i.ns == nil { 210 return "" 211 } 212 return i.ns.Project 213 } 214 215 func (i *OfflineTarget) CommitUUID() strfmt.UUID { 216 if i.ns == nil || i.ns.CommitID == nil { 217 return "" 218 } 219 return *i.ns.CommitID 220 } 221 222 func (i *OfflineTarget) Dir() string { 223 return i.dir 224 } 225 226 func (i *OfflineTarget) SetTrigger(t Trigger) { 227 i.trigger = t 228 } 229 230 func (i *OfflineTarget) Trigger() Trigger { 231 return i.trigger 232 } 233 234 func (i *OfflineTarget) ReadOnly() bool { 235 return false 236 } 237 238 func (i *OfflineTarget) InstallFromDir() *string { 239 return &i.artifactsDir 240 } 241 242 func (i *OfflineTarget) ProjectDir() string { 243 return "" 244 }