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  }