diff --git a/.gitignore b/.gitignore index 09a0e08..5370fde 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ build/ vendor/ *.code-workspace +.DS_Store + diff --git a/commander.go b/commander.go index 2e9b0d6..8adf706 100644 --- a/commander.go +++ b/commander.go @@ -5,6 +5,14 @@ import ( "strings" ) +func isInstalled(name string) bool { + cmd := exec.Command("/bin/sh", "-c", "command -v " + name) + if err := cmd.Run(); err != nil { + return false + } + return true +} + func execute(cmdstr string) (string, error) { cmdargs := strings.Split(cmdstr, " ") // string arrayified cmd := cmdargs[0] // command diff --git a/projector.go b/projector.go index 7481350..fdec590 100644 --- a/projector.go +++ b/projector.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "path/filepath" + "strings" ) func createGenericFiles(fpath string) error { @@ -15,58 +16,99 @@ func createGenericFiles(fpath string) error { func initGit(fpath string) (outp string, err error) { sep := string(filepath.Separator) - fmt.Println("Initializing git repo...") - _ = createFile(fpath + sep + ".gitignore") - return execute("git init") + err = createFile(fpath + sep + ".gitignore") + result, err := execute("git init") + return result, err } - -func createProject(projectType string, projectName string, projectPath string, git bool) (result string, err error) { +func createProject(projectType string, projectName string, projectPath string, git bool) (resultlist []string, errorlist []error) { sep := string(filepath.Separator) - fpath := projectPath + sep + projectName + fpath := projectPath + sep + projectName switch projectType { case "python": - result = fmt.Sprintf("Created a python project named '%s' at directory '%s'\n", projectName, projectPath) - case "go": - var errors []error - errors = append(errors, createGenericFiles(fpath)) // Also creates base directory - errors = append(errors, os.Chdir(fpath)) // CD into the base directory - errors = append(errors, createDir( "vendor")) // create the vendor dir - errors = append(errors, createDir("build")) // create the build directory for binaries - _, ee := execute("go mod init " + projectName) // use mod init to generate the go.mod - errors = append(errors, ee) - errors = append(errors, createFile(fpath + sep + "go.sum")) // manually create the go.sum - for _, erline := range errors { - if erline != nil { - fmt.Println(erline) + if err := createGenericFiles(fpath); err != nil { + errorlist = append(errorlist, err) + } + if err := os.Chdir(fpath); err != nil { + errorlist = append(errorlist, err) + } + if err := createDir(projectName); err != nil { //the application goes in a folder by the same name + errorlist = append(errorlist, err) + } + if err := createDir(projectName + "/tests"); err != nil { //the app tests go with the app + errorlist = append(errorlist, err) + } + if err := createFile(fpath + sep + "requirements.txt"); err != nil { + errorlist = append(errorlist, err) + } + if ! isInstalled("pipenv") { + _, err := execute("python3 -m pip install pipenv") + if err != nil { + fmt.Println("Cannot create virtual environment: ", err.Error()) } } - for _, line := range dirlist() { - fmt.Println(line) + result, err := execute("pipenv install") // use pipenv to generate dependency files + if err != nil { + fmt.Println(err.Error(), result) + errorlist = append(errorlist, err) } - result = fmt.Sprintf("Created a go project named '%s' at directory '%s'\n", projectName, projectPath) + for _, record := range strings.Split(result, "\n") { + if strings.Contains(record, "Virtualenv location"){ + resultlist = append(resultlist, record) + } + } + + case "go": + if err := createGenericFiles(fpath); err != nil { + errorlist = append(errorlist, err) + } + if err := os.Chdir(fpath); err != nil { + errorlist = append(errorlist, err) + } + if err := createDir("vendor"); err != nil { + errorlist = append(errorlist, err) + } + if err := createDir("build"); err != nil { + errorlist = append(errorlist, err) + } + + result, err := execute("go mod init " + projectName) // use mod init to generate the go.mod + if err != nil { + errorlist = append(errorlist, err) + } + resultlist = append(resultlist, strings.Split(result, "\n")[0]) //just the first line + + if err := createFile(fpath + sep + "go.sum"); err != nil { + errorlist = append(errorlist, err) + } + default: - return "", errors.New(fmt.Sprintf("Project type '%s' is not supported.\n", projectType)) + err := errors.New(fmt.Sprintf("Project type '%s' is not supported.\n", projectType)) + errorlist = append(errorlist, err) } if git { - res, errr := initGit(fpath) - if errr != nil { - fmt.Println(res) + result, err := initGit(fpath) + result = strings.Split(result, "\n")[0] //strip the carriage return + if err != nil { + errorlist = append(errorlist, err) } + resultlist = append(resultlist, result) } - return result, err + return resultlist, errorlist } func main() { argCount := len(os.Args[1:]) - var projectName string - var projectType string - var projectPath string - var git bool + var ( + projectName string + projectType string + projectPath string + git bool + ) flag.StringVar(&projectName, "n", "", "Name of project.") flag.StringVar(&projectType, "t", "go", "Type of project.") @@ -83,11 +125,18 @@ func main() { fmt.Println("Oops! No project name is provided. What do you want to call your project?") os.Exit(1) } - result, err := createProject(projectType, projectName, projectPath, git) - if err != nil { - fmt.Println(err) + results, errs := createProject(projectType, projectName, projectPath, git) + if errs != nil { + for _, err := range errs { + fmt.Println("ERR: ", err) + } + } + result := fmt.Sprintf( + "Created a '%s' project named '%s' at directory '%s'\n", projectType, projectName, projectPath) + results = append(results, result) + for _, result := range results { + fmt.Println(result) } - fmt.Println(result) } }