func (self *VolumeV6) getFullContainerPath(context Utils.Context) (string, error) { if self.Container == "" { return "", errors.New("Undefined container path") } else { log.Debug("getFullContainerPath value ", self.Container) clean := containerFilepath.ToSlash(containerFilepath.Clean(self.Container)) log.Debug("getFullContainerPath clean ", clean) if containerFilepath.IsAbs(clean) { log.Debug("getFullContainerPath isAbs") return clean, nil } else { log.Debug("getFullContainerPath is not Abs") log.Debug("getFullContainerPath return ", containerFilepath.Join(context.GetRootDirectory(), clean)) return containerFilepath.Join(context.GetRootDirectory(), clean), nil } } }
/// Look for a file from which to parse configuration (nut.yml in current /// directory). Parse the file, and returns an updated context (root directory) /// TODO: look for nut.yml file in parent folders func FindProject(context Utils.Context) (Project, Utils.Context, error) { // var parentProject Project var project Project var err error var newContext Utils.Context var store Persist.Store foundDirectory := context.GetUserDirectory() // fullpath := filepath.Join(foundDirectory, NutFileName) fullpath := filepath.Join(foundDirectory, NutOverrideFileName) previousFoundDirectory := "" var exists bool searchHigher := true found := false for searchHigher == true { if exists, err = Utils.FileExists(fullpath); exists && err == nil { found = true searchHigher = false } else { fullpath = filepath.Join(foundDirectory, NutFileName) if exists, err = Utils.FileExists(fullpath); exists && err == nil { found = true searchHigher = false } else { previousFoundDirectory = foundDirectory foundDirectory = filepath.Dir(foundDirectory) // fullpath = filepath.Join(foundDirectory, NutFileName) fullpath = filepath.Join(foundDirectory, NutOverrideFileName) if foundDirectory == previousFoundDirectory { searchHigher = false } } } } if found { if project, err = LoadProjectFromFile(fullpath); err == nil { log.Debug("Parsed from file: ", fullpath) if newContext, err = Utils.NewContext(foundDirectory, context.GetUserDirectory()); err == nil { log.Debug("Context updated: ", newContext) if store, err = Persist.InitStore(newContext.GetRootDirectory()); err == nil { log.Debug("Store initialized: ", store) if err = ResolveDependencies(project, store, fullpath); err == nil { log.Debug("Resolved dependencies from file: ", fullpath) return project, newContext, err } } } } } else { err = errors.New("Could not find '" + NutFileName + "', neither in current directory nor in its parents.") } return nil, nil, err }
func (self *VolumeV6) getFullHostPath(context Utils.Context) (string, error) { if self.Host == "" { return "", errors.New("Undefined host path") } else { log.Debug("getFullHostPath value ", self.Host) res := filepath.Clean(self.Host) log.Debug("getFullHostPath clean ", res) if !filepath.IsAbs(res) { log.Debug("getFullHostPath is not Abs") res = filepath.Join(context.GetRootDirectory(), res) } log.Debug("getFullHostPath value ", res) if strings.Contains(res, `:\`) { // path on windows. Eg: C:\\Users\ log.Debug("getFullHostPath windows ", `:\`) parts := strings.Split(res, `:\`) parts[0] = strings.ToLower(parts[0]) // drive letter should be lower case res = "//" + parts[0] + "/" + filepath.ToSlash(parts[1]) } log.Debug("getFullHostPath res ", res) return res, nil } }
// create a nut.yml at the current path func initSubcommand(c *cli.Context, context Utils.Context, gitHubFlag string) { log.Debug("initSubcommand context: ", context) name := filepath.Base(context.GetUserDirectory()) var project Config.Project if gitHubFlag == "" { defaultProject := Config.NewProjectV6(nil) defaultProject.ProjectName = name defaultProject.DockerImage = "golang:1.6" defaultProject.Macros["build"] = &Config.MacroV6{ Usage: "build the project in the container", Actions: []string{"go build -o nut"}, ConfigV6: *Config.NewConfigV6(nil), } defaultProject.Macros["run"] = &Config.MacroV6{ Usage: "run the project in the container", Actions: []string{"./nut"}, ConfigV6: *Config.NewConfigV6(nil), } project = defaultProject } else { if store, err := Persist.InitStore(context.GetUserDirectory()); err == nil { log.Debug("Store initialized: ", store) if filename, err := Config.DownloadFromGithub(gitHubFlag, store); err == nil { log.Debug("Downloaded from Github to ", filename) if parentProject, err := Config.LoadProjectFromFile(filename); err == nil { log.Debug("Parsed from Github: ", parentProject) if err = Config.ResolveDependencies(parentProject, store, filename); err == nil { log.Debug("Resolved dependencies from Github: ", filename) finalProject := Config.NewProjectV6(parentProject) finalProject.ProjectName = name finalProject.Base.GitHub = gitHubFlag // modified project depending on parent configuration // 1 - mount folder "." if not already mounted by parent configuration mountingPointName := "main" hostDir := "." containerDir := containerFilepath.Join("/nut", name) mountingPoint := &Config.VolumeV6{ Host: hostDir, Container: containerDir, } if Config.CheckConflict(context, mountingPointName, mountingPoint, Config.GetVolumes(finalProject, context)) == nil { finalProject.ConfigV6.Mount[mountingPointName] = []string{hostDir, containerDir} } // 2 - set working directory to "." if not specified otherwise if Config.GetWorkingDir(finalProject) == "" { finalProject.ConfigV6.WorkingDir = containerDir } project = finalProject } } else { log.Error("Error while parsing from GitHub: ", err) } } else { log.Error("Error while loading from GitHub: ", err) } } else { log.Error("Error while loading nut files: ", err) } } if project == nil { return } if data, err := Config.ToYAML(project); err != nil { log.Error("Could not generate default project configuration:", err) } else { fmt.Println("Project configuration:") fmt.Println("") dataString := string(data) fmt.Println(dataString) // check is nut.yml exists at the current path nutfileName := filepath.Join(context.GetUserDirectory(), Config.NutFileName) // TODO: pick this name from a well documented and centralized list of legit nut file names if exists, err := Utils.FileExists(nutfileName); exists && err == nil { log.Error("Could not save new Nut project because a nut.yml file already exists") return } else { err := ioutil.WriteFile(nutfileName, data, 0644) // TODO: discuss this permission level if err != nil { log.Error(err) } else { fmt.Println("Project configuration saved in %s.", nutfileName) // TODO: make sure that bug Project configuration saved in %!(EXTRA string=./nut.yml) is fixed. } } } }