8000 cli/configs/project.go at master · hmmhmmhm/cli · GitHub
[go: up one dir, main page]

Skip to content

Latest commit

 

History

History
205 lines (160 loc) · 4.18 KB

project.go

File metadata and controls

205 lines (160 loc) · 4.18 KB
package configs
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/railwayapp/cli/entity"
"github.com/railwayapp/cli/errors"
)
// MigrateLocalProjectConfig moves a local project config
// to the global config and removes the local .railway directory
// if it exists
func (c *Configs) MigrateLocalProjectConfig() error {
// Get local config directory
projectDir, err := filepath.Abs(filepath.Dir(filepath.Dir(c.projectConfigs.configPath)))
if err != nil {
return err
}
// Avoid deleting ~/.railway
homeDir, err := os.UserHomeDir()
if err != nil {
return err
}
if projectDir == homeDir {
return nil
}
if _, err := os.Stat(projectDir); os.IsNotExist(err) {
// Local project directory does not exist
return nil
}
// Read local project config
var cfg entity.ProjectConfig
if err := c.unmarshalConfig(c.projectConfigs, &cfg); err != nil {
return err
}
// Save project config to root config
cfg.ProjectPath = strings.ToLower(projectDir)
if err = c.SetProjectConfigs(&cfg); err != nil {
return err
}
// Delete local config directory
if err = os.RemoveAll(fmt.Sprintf("%s/.railway", projectDir)); err != nil {
return err
}
return nil
}
func (c *Configs) getCWD() (string, error) {
cwd, err := os.Getwd()
if err != nil {
return "", err
}
cwd = strings.ToLower(cwd)
return cwd, nil
}
func (c *Configs) GetProjectConfigs() (*entity.ProjectConfig, error) {
_ = c.MigrateLocalProjectConfig()
// Ignore error because the config probably doesn't exist yet
// TODO: Better error handling here
userCfg, err := c.GetRootConfigs()
if err != nil {
return nil, errors.ProjectConfigNotFound
}
// lookup project in global config based on pwd
cwd, err := c.getCWD()
if err != nil {
return nil, err
}
// find longest matching parent path
var longestPath = -1
var pathMatch = ""
for path := range userCfg.Projects {
var matches = strings.HasPrefix(fmt.Sprintf("%s/", cwd), fmt.Sprintf("%s/", path))
if matches && len(path) > longestPath {
longestPath = len(path)
pathMatch = path
}
}
if longestPath == -1 {
return nil, errors.ProjectConfigNotFound
}
projectCfg, found := userCfg.Projects[pathMatch]
if !found {
return nil, errors.ProjectConfigNotFound
}
return &projectCfg, nil
}
func (c *Configs) SetProjectConfigs(cfg *entity.ProjectConfig) error {
rootCfg, err := c.GetRootConfigs()
if err != nil {
rootCfg = &entity.RootConfig{}
}
if rootCfg.Projects == nil {
rootCfg.Projects = make(map[string]entity.ProjectConfig)
}
rootCfg.Projects[cfg.ProjectPath] = *cfg
return c.SetRootConfig(rootCfg)
}
func (c *Configs) RemoveProjectConfigs(cfg *entity.ProjectConfig) error {
rootCfg, err := c.GetRootConfigs()
if err != nil {
rootCfg = &entity.RootConfig{}
}
delete(rootCfg.Projects, cfg.ProjectPath)
return c.SetRootConfig(rootCfg)
}
func (c *Configs) createNewProjectConfig() (*entity.ProjectConfig, error) {
cwd, err := c.getCWD()
if err != nil {
return nil, err
}
projectCfg := &entity.ProjectConfig{
ProjectPath: cwd,
}
return projectCfg, nil
}
func (c *Configs) SetProject(projectID string) error {
projectCfg, err := c.GetProjectConfigs()
if err != nil {
projectCfg, err = c.createNewProjectConfig()
if err != nil {
return err
}
}
projectCfg.Project = projectID
return c.SetProjectConfigs(projectCfg)
}
// SetNewProject configures railway project for current working directory
func (c *Configs) SetNewProject(projectID string) error {
projectCfg, err := c.createNewProjectConfig()
if err != nil {
return err
}
projectCfg.Project = projectID
return c.SetProjectConfigs(projectCfg)
}
func (c *Configs) SetEnvironment(environmentId string) error {
projectCfg, err := c.GetProjectConfigs()
if err != nil {
projectCfg, err = c.createNewProjectConfig()
if err != nil {
return err
}
}
projectCfg.Environment = environmentId
return c.SetProjectConfigs(projectCfg)
}
func (c *Configs) GetProject() (string, error) {
projectCfg, err := c.GetProjectConfigs()
if err != nil {
return "", err
}
return projectCfg.Project, nil
}
func (c *Configs) GetCurrentEnvironment() (string, error) {
projectCfg, err := c.GetProjectConfigs()
if err != nil {
return "", err
}
return projectCfg.Environment, nil
}
0