Skip to content

Commit

Permalink
Add waitgroup support to coordinate goroutines
Browse files Browse the repository at this point in the history
  • Loading branch information
bmonkman committed Oct 24, 2019
1 parent 8441f79 commit 6a4960d
Show file tree
Hide file tree
Showing 9 changed files with 104 additions and 59 deletions.
35 changes: 24 additions & 11 deletions cmd/create.go
Expand Up @@ -4,6 +4,7 @@ import (
"log"
"os"
"path"
"sync"

"github.com/commitdev/commit0/internal/templator"
"github.com/gobuffalo/packr/v2"
Expand All @@ -28,19 +29,31 @@ func Create(projectName string, outDir string, t *templator.Templator) string {
commit0ConfigPath := path.Join(rootDir, "commit0.yml")
log.Printf("%s", commit0ConfigPath)

f, err := os.Create(commit0ConfigPath)
if err != nil {
log.Printf("Error creating commit0 config: %v", err)
}
go t.Commit0.Execute(f, projectName)
var wg sync.WaitGroup
wg.Add(1)
go func() {
f, err := os.Create(commit0ConfigPath)
if err != nil {
log.Printf("Error creating commit0 config: %v", err)
}

gitIgnorePath := path.Join(rootDir, ".gitignore")
f, err = os.Create(gitIgnorePath)
if err != nil {
log.Printf("Error creating commit0 config: %v", err)
}
go t.GitIgnore.Execute(f, projectName)
t.Commit0.Execute(f, projectName)
wg.Done()
}()

wg.Add(1)
go func() {
gitIgnorePath := path.Join(rootDir, ".gitignore")
f, err := os.Create(gitIgnorePath)
if err != nil {
log.Printf("Error creating commit0 config: %v", err)
}

t.GitIgnore.Execute(f, projectName)
wg.Done()
}()

wg.Wait()
return rootDir
}

Expand Down
25 changes: 17 additions & 8 deletions cmd/generate.go
Expand Up @@ -3,6 +3,7 @@ package cmd
import (
"log"
"os"
"sync"

"github.com/commitdev/commit0/internal/config"
"github.com/commitdev/commit0/internal/generate/docker"
Expand Down Expand Up @@ -48,27 +49,35 @@ var generateCmd = &cobra.Command{
cfg.Language = language
cfg.Print()

var wg sync.WaitGroup
switch language {
case Go:
proto.Generate(t, cfg)
golang.Generate(t, cfg)
proto.Generate(t, cfg, wg)
golang.Generate(t, cfg, wg)

docker.GenerateGoAppDockerFile(t, cfg)
docker.GenerateGoDockerCompose(t, cfg)
docker.GenerateGoAppDockerFile(t, cfg, wg)
docker.GenerateGoDockerCompose(t, cfg, wg)
case React:
react.Generate(t, cfg)
react.Generate(t, cfg, wg)
}

f, err := os.Create("README.md")
if err != nil {
log.Printf("Error creating commit0 config: %v", err)
}
go t.Readme.Execute(f, cfg)

wg.Add(1)
go func() {
t.Readme.Execute(f, cfg)
wg.Done()
}()

if cfg.Network.Http.Enabled {
http.GenerateHTTPGW(t, cfg)
docker.GenerateGoHTTPGWDockerFile(t, cfg)
http.GenerateHTTPGW(t, cfg, wg)
docker.GenerateGoHTTPGWDockerFile(t, cfg, wg)
}

wg.Wait()
},
}

Expand Down
14 changes: 8 additions & 6 deletions internal/generate/docker/generate.go
@@ -1,19 +1,21 @@
package docker

import (
"sync"

"github.com/commitdev/commit0/internal/config"
"github.com/commitdev/commit0/internal/templator"
"github.com/commitdev/commit0/internal/util"
)

func GenerateGoAppDockerFile(templator *templator.Templator, config *config.Commit0Config) {
util.TemplateFileIfDoesNotExist("docker/app", "Dockerfile", templator.Docker.ApplicationDocker, config)
func GenerateGoAppDockerFile(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
util.TemplateFileIfDoesNotExist("docker/app", "Dockerfile", templator.Docker.ApplicationDocker, wg, config)
}

func GenerateGoHTTPGWDockerFile(templator *templator.Templator, config *config.Commit0Config) {
util.TemplateFileIfDoesNotExist("docker/http", "Dockerfile", templator.Docker.HttpGatewayDocker, config)
func GenerateGoHTTPGWDockerFile(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
util.TemplateFileIfDoesNotExist("docker/http", "Dockerfile", templator.Docker.HttpGatewayDocker, wg, config)
}

func GenerateGoDockerCompose(templator *templator.Templator, config *config.Commit0Config) {
util.TemplateFileIfDoesNotExist("", "docker-compose.yml", templator.Docker.DockerCompose, config)
func GenerateGoDockerCompose(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
util.TemplateFileIfDoesNotExist("", "docker-compose.yml", templator.Docker.DockerCompose, wg, config)
}
23 changes: 14 additions & 9 deletions internal/generate/golang/generate.go
Expand Up @@ -4,20 +4,21 @@ import (
"fmt"
"log"
"os"
"sync"

"github.com/commitdev/commit0/internal/config"
"github.com/commitdev/commit0/internal/templator"
"github.com/commitdev/commit0/internal/util"
)

func Generate(templator *templator.Templator, config *config.Commit0Config) {
GenerateGoMain(templator, config)
GenerateGoMod(templator, config)
GenerateHealthServer(templator, config)
GenerateServers(templator, config)
func Generate(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
GenerateGoMain(templator, config, wg)
GenerateGoMod(templator, config, wg)
GenerateHealthServer(templator, config, wg)
GenerateServers(templator, config, wg)
}

func GenerateGoMain(templator *templator.Templator, config *config.Commit0Config) {
func GenerateGoMain(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
if _, err := os.Stat("main.go"); os.IsNotExist(err) {

f, err := os.Create("main.go")
Expand All @@ -26,23 +27,25 @@ func GenerateGoMain(templator *templator.Templator, config *config.Commit0Config
log.Printf("Error: %v", err)
}

wg.Add(1)
go templator.Go.GoMain.Execute(f, config)
} else {
log.Printf("main.go already exists. skipping.")
}
}

func GenerateGoMod(templator *templator.Templator, config *config.Commit0Config) {
func GenerateGoMod(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
f, err := os.Create("go.mod")

if err != nil {
log.Printf("Error: %v", err)
}

wg.Add(1)
go templator.Go.GoMod.Execute(f, config)
}

func GenerateServers(templator *templator.Templator, config *config.Commit0Config) {
func GenerateServers(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
serverDirPath := "server"
err := util.CreateDirIfDoesNotExist(serverDirPath)
if err != nil {
Expand Down Expand Up @@ -74,12 +77,13 @@ func GenerateServers(templator *templator.Templator, config *config.Commit0Confi
"GitRepo": config.GitRepo,
}

wg.Add(1)
go templator.Go.GoServer.Execute(f, data)
}

}

func GenerateHealthServer(templator *templator.Templator, config *config.Commit0Config) {
func GenerateHealthServer(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
serverDirPath := "server"
err := util.CreateDirIfDoesNotExist(serverDirPath)
if err != nil {
Expand All @@ -99,5 +103,6 @@ func GenerateHealthServer(templator *templator.Templator, config *config.Commit0
log.Printf("Error: %v", err)
}

wg.Add(1)
go templator.Go.GoHealthServer.Execute(f, config)
}
6 changes: 4 additions & 2 deletions internal/generate/http/generate.go
@@ -1,11 +1,13 @@
package http

import (
"sync"

"github.com/commitdev/commit0/internal/config"
"github.com/commitdev/commit0/internal/templator"
"github.com/commitdev/commit0/internal/util"
)

func GenerateHTTPGW(templator *templator.Templator, config *config.Commit0Config) {
util.TemplateFileAndOverwrite("http", "main.go", templator.Go.GoHTTPGW, config)
func GenerateHTTPGW(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
util.TemplateFileAndOverwrite("http", "main.go", templator.Go.GoHTTPGW, wg, config)
}
24 changes: 15 additions & 9 deletions internal/generate/proto/generate.go
Expand Up @@ -6,21 +6,22 @@ import (
"log"
"os"
"os/exec"
"sync"

"github.com/commitdev/commit0/internal/config"
"github.com/commitdev/commit0/internal/templator"
"github.com/commitdev/commit0/internal/util"
)

func Generate(templator *templator.Templator, config *config.Commit0Config) {
GenerateIDLMakefile(templator, config)
GenerateProtoHealth(templator, config)
GenerateServiceProtobufFiles(templator, config)
func Generate(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
GenerateIDLMakefile(templator, config, wg)
GenerateProtoHealth(templator, config, wg)
GenerateServiceProtobufFiles(templator, config, wg)
GenerateGoModIDL(templator, config, wg)
GenerateProtoServiceLibs(config)
GenerateGoModIDL(templator, config)
}

func GenerateGoModIDL(templator *templator.Templator, config *config.Commit0Config) {
func GenerateGoModIDL(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
idlPath := fmt.Sprintf("%s-idl", config.Name)
idlOutput := fmt.Sprintf("%s/go.mod", idlPath)
err := util.CreateDirIfDoesNotExist(idlPath)
Expand All @@ -30,10 +31,11 @@ func GenerateGoModIDL(templator *templator.Templator, config *config.Commit0Conf
log.Printf("Error: %v", err)
}

wg.Add(1)
go templator.Go.GoModIDL.Execute(f, config)
}

func GenerateIDLMakefile(templator *templator.Templator, config *config.Commit0Config) {
func GenerateIDLMakefile(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
makeFilePath := fmt.Sprintf("%s-idl", config.Name)
makeFileOutput := fmt.Sprintf("%s/Makefile", makeFilePath)

Expand All @@ -46,10 +48,12 @@ func GenerateIDLMakefile(templator *templator.Templator, config *config.Commit0C
if err != nil {
log.Printf("Error: %v", err)
}

wg.Add(1)
go templator.MakefileTemplate.Execute(f, config)
}

func GenerateProtoHealth(templator *templator.Templator, config *config.Commit0Config) {
func GenerateProtoHealth(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
protoHealthPath := fmt.Sprintf("%s-idl/proto/health", config.Name)
protoHealthOutput := fmt.Sprintf("%s/health.proto", protoHealthPath)

Expand All @@ -63,10 +67,11 @@ func GenerateProtoHealth(templator *templator.Templator, config *config.Commit0C
log.Printf("Error: %v", err)
}

wg.Add(1)
go templator.ProtoHealthTemplate.Execute(f, config)
}

func GenerateServiceProtobufFiles(templator *templator.Templator, cfg *config.Commit0Config) {
func GenerateServiceProtobufFiles(templator *templator.Templator, cfg *config.Commit0Config, wg sync.WaitGroup) {
protoPath := fmt.Sprintf("%s-idl/proto", cfg.Name)
for _, s := range cfg.Services {
serviceProtoDir := fmt.Sprintf("%s/%s", protoPath, s.Name)
Expand All @@ -88,6 +93,7 @@ func GenerateServiceProtobufFiles(templator *templator.Templator, cfg *config.Co
s.Name,
}

wg.Add(1)
go templator.ProtoServiceTemplate.Execute(f, data)
}
}
Expand Down
6 changes: 4 additions & 2 deletions internal/generate/react/generate.go
@@ -1,10 +1,12 @@
package react

import (
"sync"

"github.com/commitdev/commit0/internal/config"
"github.com/commitdev/commit0/internal/templator"
)

func Generate(templator *templator.Templator, config *config.Commit0Config) {
templator.React.TemplateFiles(config, false)
func Generate(templator *templator.Templator, config *config.Commit0Config, wg sync.WaitGroup) {
templator.React.TemplateFiles(config, false, wg)
}
7 changes: 4 additions & 3 deletions internal/templator/templator.go
Expand Up @@ -3,6 +3,7 @@ package templator
import (
"path/filepath"
"strings"
"sync"
"text/template"

"github.com/commitdev/commit0/internal/config"
Expand Down Expand Up @@ -96,16 +97,16 @@ type DirectoryTemplator struct {
Templates []*template.Template
}

func (d *DirectoryTemplator) TemplateFiles(config *config.Commit0Config, overwrite bool) {
func (d *DirectoryTemplator) TemplateFiles(config *config.Commit0Config, overwrite bool, wg sync.WaitGroup) {
for _, template := range d.Templates {
d, f := filepath.Split(template.Name())
if strings.HasSuffix(f, ".tmpl") {
f = strings.Replace(f, ".tmpl", "", -1)
}
if overwrite {
util.TemplateFileAndOverwrite(d, f, template, config)
util.TemplateFileAndOverwrite(d, f, template, wg, config)
} else {
util.TemplateFileIfDoesNotExist(d, f, template, config)
util.TemplateFileIfDoesNotExist(d, f, template, wg, config)
}
}
}
Expand Down

0 comments on commit 6a4960d

Please sign in to comment.