diff --git a/README.md b/README.md index 97f8029..399d701 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,11 @@ Git is available to be used as the version control system for new projects. Sele ***Please Note** that if you also use it for your configuration files and sample directories, then a .gitignore file within your sample directory will interfere with git's ability to track your skeletons/templates properly. So, to allow for this, put what you normally would in a .gitignore file into a GITIGNORE file in your sample directory. And scaffold will convert it to a .gitignore file within your newProject directory. If you are NOT using git to track your project types and samples/skeletons/templates, then no problem, just place a .gitignore file within the sample directory as you would any other file. + +## The Process + +- The new project directory is created +- Your project skeleton is copied from your sample directory +- your setup/initialization commmands are run +- a git repository is initialized in the project directory + - and if you enable it, a remote repository is created and setup diff --git a/data-strings.go b/data-strings.go index ac2011c..a45ee02 100644 --- a/data-strings.go +++ b/data-strings.go @@ -40,3 +40,60 @@ scaffold py aPythonProject // bin/ // ` + +// var cfg_content = `# New Go Project configuration file + +// # Format: TOML - see https://toml.io for details + +// # Go specific +// # Go module path is of the form basePath/projectName +// # must be addressable if you are going to publish +// module_basepath = "officallygood.com" + +// # where to put new project directories +// # within the user's home directory +// projects_basedir = "devel/GoMyApps" +// #def_project_name = "new-go-project" + +// # Must be string, will be parsed to correct type +// # Remember perms are in octal +// project_dir_permissions = "0700" +// file_permissions = "0660" + +// # Git +// setup_git = true + +// # Do you have a remote location? +// # Do you have autologins setup correctly with ssh keys? +// # Using your .ssh/config file might be helpful + +// # setup remote repo? +// create_remote_repo = false + +// # remote repo user@location +// remote_user = "user@server" + +// # remote repo base dir +// # relative to remote user home dir +// # eg unix/linux server +// # for user@server:/home/user/git -- absolute path +// user@server:git -- relative to home dir +// # eg windows server +// # ??? + +// ############################ +// # remote location MUST already exist on remote server +// ############################ +// remote_location = "git" + +// # default remote short name +// remote_shortname = "origin" +//` + +var cfg_content = `# Scaffold program configuration + +# Format: TOML - see https://toml.io for details + +# Too funny - this config file doesn't seem to be needed ;-) +# let's keep it for future use -- very silly +testkey = "test value"` diff --git a/main.go b/main.go index 20821a6..5184ad9 100644 --- a/main.go +++ b/main.go @@ -31,6 +31,7 @@ type ( Remote_User string Remote_Location string Remote_Shortname string + Commands [][]string } ScaffoldSetup struct { TestKey string @@ -71,14 +72,21 @@ func main() { if _, err := os.Stat(cfg_file); err != nil { fmt.Println("No scaffold program configuration file found - creating a default file") - // ok now do it + cfgfd, err := os.Create(cfg_file) + ifFerr("Unable to create scaffold configuration file", err) + defer cfgfd.Close() + + _, err = cfgfd.WriteString(cfg_content) + ifFerr("Unable to write scaffold configuration file content", err) + fmt.Println("Wrote new scaffold configuration file") + _, err = toml.Decode(cfg_content, &setup) + ifFerr("[Failed] to parse config file", err) } else { fmt.Println("found config file") + _, err = toml.DecodeFile(cfg_file, &setup) + ifFerr("[Failed] to parse config file", err) } - _, err = toml.DecodeFile(cfg_file, &setup) - ifFerr("[Failed] to parse config file", err) - pts, err := availableProjectTypes(scaffold_cfg_dir) ifFerr("Unable to read scaffold config directory contents", err) @@ -106,6 +114,8 @@ func main() { _, err = toml.DecodeFile(projectCfgFile, &npsetup) ifFerr("Unable to read configuration for requested project type", err) + //fmt.Printf("Found commands: %+v\n", npsetup.Commands) + //Setup and Ready to begin // Permissions are octal (ugo - user, group, other) @@ -158,20 +168,20 @@ func main() { } fmt.Println("Project sample skeleton copied") - // run init commands + // run your init commands from the projectType/scaffold-.toml file - switch projType { - case "go": - // make mod file - modpath := npsetup.Module_basepath + sep + newProjectName - _, err = exec.Command("go", "mod", "init", modpath).Output() - ifFerr("go mod init failed", err) - - // do a mod tidy to update the mod file - _, err = exec.Command("go", "mod", "tidy").Output() - ifFerr("Unable to update the mod file with a tidy", err) - fmt.Println("Updated go.mod") - case "py": + for _, comm := range npsetup.Commands { + args := comm[1:] + if comm[0] == "go" && comm[1] == "mod" && comm[2] == "init" { + args[2] = args[2] + sep + newProjectName + //fmt.Printf("executing: %+v -- %+v\n", comm, args) + } + _, err = exec.Command(comm[0], args...).Output() + if err != nil { + commstring := fmt.Sprintf("Unable to execute command: %+v", comm) + log.Fatalf("%s -- %s\n", commstring, err) + } + fmt.Printf("executing: %+v %+v\n", comm[0], args) } // setup git