Compare commits

..

No commits in common. "master" and "v0.1.13" have entirely different histories.

20 changed files with 251 additions and 435 deletions

1
.gitignore vendored
View File

@ -25,7 +25,6 @@ _testmain.go
*.exe *.exe
*.test *.test
*.prof *.prof
/assets/
.glide .glide
.idea .idea

View File

@ -1,6 +1,6 @@
gitea_urls: gitea_urls:
api: https://git.asdf.cafe/api/v1 api: https://gitea.asdf.cafe/api/v1
download: https://git.asdf.cafe download: https://gitea.asdf.cafe
skip_tls_verify: false skip_tls_verify: false
before: before:

View File

@ -5,12 +5,6 @@ ${pkgname}: $(shell find . -name '*.go')
mkdir -p bin mkdir -p bin
go build -o bin/${pkgname} . go build -o bin/${pkgname} .
decode:
go run ./hack/unpack/main.go
pack-site:
go-bindata -pkg haunt -o src/haunt/bindata.go -fs assets/...
completions: completions:
mkdir -p completions mkdir -p completions
./bin/${pkgname} completion zsh > completions/_${pkgname} ./bin/${pkgname} completion zsh > completions/_${pkgname}
@ -24,18 +18,17 @@ tidy:
go mod tidy go mod tidy
clean: clean:
rm -rf bin rm -f bin
rm -rf completions rm -rf completions
rm -rf assets
uninstall: uninstall:
rm -f /usr/local/bin/${pkgname} rm -f /usr/bin/${pkgname}
rm -f /usr/share/zsh/site-functions/_${pkgname} rm -f /usr/share/zsh/site-functions/_${pkgname}
rm -f /usr/share/bash-completion/completions/${pkgname} rm -f /usr/share/bash-completion/completions/${pkgname}
rm -f /usr/share/fish/vendor_completions.d/${pkgname}.fish rm -f /usr/share/fish/vendor_completions.d/${pkgname}.fish
install: install:
cp bin/${pkgname} /usr/local/bin cp bin/${pkgname} /usr/bin
bin/${pkgname} completion zsh > /usr/share/zsh/site-functions/_${pkgname} bin/${pkgname} completion zsh > /usr/share/zsh/site-functions/_${pkgname}
bin/${pkgname} completion bash > /usr/share/bash-completion/completions/${pkgname} bin/${pkgname} completion bash > /usr/share/bash-completion/completions/${pkgname}
bin/${pkgname} completion fish > /usr/share/fish/vendor_completions.d/${pkgname}.fish bin/${pkgname} completion fish > /usr/share/fish/vendor_completions.d/${pkgname}.fish

100
README.md
View File

@ -1,5 +1,4 @@
## Quickstart ## Quickstart
### Install
``` ```
go install github.com/abs3ntdev/haunt@latest go install github.com/abs3ntdev/haunt@latest
``` ```
@ -12,59 +11,58 @@ cd haunt
make build && sudo make install make build && sudo make install
``` ```
#### aur
```
yay -S haunt-go-git
```
### Completions
completions will be automatically installed if you used the Makefile, if you did not you can generate completions with `haunt completion [bash/fish/powershell/zsh]`
for example: `haunt completion zsh > _haunt`
you can also source the output of the completion command directly in your .zshrc with:\
`source <(haunt completion zsh) && compdef _haunt haunt`
## Commands List ## Commands List
### Run Command
From **project/projects** root execute:
```
haunt init
```
then
```
haunt start
```
haunt init will add your root directory if it contains a main.go file and will add any directory inside of cmd as projects. If you wish to add additional projects run haunt add [name] or edit the config file manually. By default projects are set to run go install and go run [project]
***start*** command supports the following custom parameters:
--name="name" -> Run by name on existing configuration
--path="haunt/server" -> Custom Path (if not specified takes the working directory name)
--generate -> Enable go generate
--fmt -> Enable go fmt
--test -> Enable go test
--vet -> Enable go vet
--install -> Enable go install
--build -> Enable go build
--run -> Enable go run
--server -> Enable the web server
--open -> Open web ui in default browser
--no-config -> Ignore an existing config / skip the creation of a new one
Some examples:
haunt start
haunt start --path="mypath"
haunt start --name="haunt" --build
haunt start --path="haunt" --run --no-config
haunt start --install --test --fmt --no-config
haunt start --path="/Users/username/go/src/github.com/oxequa/haunt-examples/coin/"
### Init Command ### Init Command
This command will generate a .haunt.yaml with sane default for your current project/projects.\ This command will generate a .haunt.yaml with sane default for your current project/projects.\
If there is a main.go in the root directory it will be added along with any directories inside the relative path `cmd` If there is a main.go in the root directory it will be added along with any directories inside the relative path `cmd`
haunt init haunt init
### Run Command
```
haunt run
```
the run command allows for specifying projects by name, all provided will be ran according to the config file:
Some examples:
haunt run
haunt run server api
### Add Command ### Add Command
Add a project, the same defaults init uses will be used for new projects unless flags are provided. Add a project to an existing config file or create a new one.
haunt add [name] [--flags]
Possible flags are:
-b, --build Enable go build
-f, --fmt Enable go fmt
-g, --generate Enable go generate
-h, --help help for add
-i, --install Enable go install (default true)
-p, --path string Project base path (default "./")
-r, --run Enable go run (default true)
-t, --test Enable go test
-v, --vet Enable go vet
haunt add [name]
### Remove Command ### Remove Command
Remove a project by its name Remove a project by its name
@ -90,7 +88,7 @@ Remove a project by its name
schema: schema:
- name: coin - name: coin
path: cmd/coin // project path path: cmd/coin // project path
env: // env variables for run env: // env variables available at startup
test: test test: test
myvar: value myvar: value
commands: // go commands supported commands: // go commands supported
@ -119,8 +117,7 @@ Remove a project by its name
- --myarg - --myarg
watcher: watcher:
paths: // watched paths are relative to directory you run haunt in paths: // watched paths are relative to directory you run haunt in
- src - /
- cmd/coin
ignore_paths: // ignored paths ignore_paths: // ignored paths
- vendor - vendor
extensions: // watched extensions extensions: // watched extensions
@ -131,21 +128,14 @@ Remove a project by its name
command: echo before global command: echo before global
global: true global: true
output: true output: true
env: // env variables per script
test: test
myvar: value
- type: before - type: before
command: echo before change command: echo before change
output: true output: true
env: // env variables per script
test: othertest
myvar: othervalue
- type: after - type: after
command: echo after change command: echo after change
output: true output: true
env: // env variables per script
key: 1
- type: after - type: after
command: echo after global command: echo after global
global: true global: true
output: true output: true
errorOutputPattern: mypattern //custom error pattern

View File

@ -13,11 +13,10 @@ import (
var addConfig config.Flags var addConfig config.Flags
var addCmd = &cobra.Command{ var addCmd = &cobra.Command{
Use: "add", Use: "add",
Aliases: []string{"a", "create", "new"}, Short: "Adds a project by name",
Short: "Adds a project by name", Long: "Adds a project by name, if path is provided it will use 'cmd/name', all flags provided will be saved in the config file. By default go install and go run will be ran",
Long: "Adds a project by name, if path is provided it will use 'cmd/name', all flags provided will be saved in the config file. By default go install and go run will be ran", Args: cobra.MatchAll(cobra.ExactArgs(1)),
Args: cobra.MatchAll(cobra.ExactArgs(1)),
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if len(args) >= 1 { if len(args) >= 1 {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
@ -28,8 +27,8 @@ var addCmd = &cobra.Command{
} }
func getPotentialProjets(in string) []string { func getPotentialProjets(in string) []string {
h := haunt.NewHaunt() r := haunt.NewHaunt()
err := h.Settings.Read(&h) err := r.Settings.Read(&r)
if err != nil { if err != nil {
return []string{} return []string{}
} }
@ -40,7 +39,7 @@ func getPotentialProjets(in string) []string {
} }
for _, dir := range cmdDir { for _, dir := range cmdDir {
exists := false exists := false
for _, proj := range h.Projects { for _, proj := range r.Projects {
if dir.Name() == proj.Name { if dir.Name() == proj.Name {
exists = true exists = true
continue continue
@ -74,24 +73,24 @@ func init() {
// Add a project to an existing config or create a new one // Add a project to an existing config or create a new one
func add(cmd *cobra.Command, args []string) (err error) { func add(cmd *cobra.Command, args []string) (err error) {
addConfig.Name = args[0] addConfig.Name = args[0]
h := haunt.NewHaunt() r := haunt.NewHaunt()
// read a config if exist // read a config if exist
err = h.Settings.Read(&h) err = r.Settings.Read(&r)
if err != nil { if err != nil {
return err return err
} }
projects := len(h.Projects) projects := len(r.Projects)
// create and add a new project // create and add a new project
h.Add(h.New(addConfig)) r.Add(r.New(addConfig))
if len(h.Projects) > projects { if len(r.Projects) > projects {
// update config // update config
err = h.Settings.Write(h) err = r.Settings.Write(r)
if err != nil { if err != nil {
return err return err
} }
log.Println(h.Prefix(haunt.Green.Bold("project successfully added"))) log.Println(r.Prefix(haunt.Green.Bold("project successfully added")))
} else { } else {
log.Println(h.Prefix(haunt.Green.Bold("project can't be added"))) log.Println(r.Prefix(haunt.Green.Bold("project can't be added")))
} }
return nil return nil
} }

View File

@ -9,10 +9,9 @@ import (
// cleanCmd represents the clean command // cleanCmd represents the clean command
var cleanCmd = &cobra.Command{ var cleanCmd = &cobra.Command{
Use: "clean", Use: "clean",
Aliases: []string{"c"}, Short: "Deletes the haunt config file",
Short: "Deletes the haunt config file", RunE: clean,
RunE: clean,
} }
func init() { func init() {
@ -21,10 +20,10 @@ func init() {
// Clean remove haunt file // Clean remove haunt file
func clean(cmd *cobra.Command, args []string) (err error) { func clean(cmd *cobra.Command, args []string) (err error) {
h := haunt.NewHaunt() r := haunt.NewHaunt()
if err := h.Settings.Remove(haunt.HFile); err != nil { if err := r.Settings.Remove(haunt.RFile); err != nil {
return err return err
} }
log.Println(h.Prefix(haunt.Green.Bold("config file removed successfully removed"))) log.Println(r.Prefix(haunt.Green.Bold("config file removed successfully removed")))
return nil return nil
} }

View File

@ -12,11 +12,10 @@ import (
// initCmd represents the init command // initCmd represents the init command
var initCmd = &cobra.Command{ var initCmd = &cobra.Command{
Use: "init", Use: "init",
Aliases: []string{"i"}, Short: "Generates a haunt config file using sane defaults",
Short: "Generates a haunt config file using sane defaults", Long: "Generates a haunt config file using sane defaults, haunt will look for a main.go file and any directories inside the relative path 'cmd' and add them all as projects",
Long: "Generates a haunt config file using sane defaults, haunt will look for a main.go file and any directories inside the relative path 'cmd' and add them all as projects", RunE: defaultConfig,
RunE: defaultConfig,
} }
func init() { func init() {
@ -24,10 +23,10 @@ func init() {
} }
func defaultConfig(cmd *cobra.Command, args []string) error { func defaultConfig(cmd *cobra.Command, args []string) error {
h := haunt.NewHaunt() r := haunt.NewHaunt()
write := true write := true
if _, err := os.Stat(haunt.HFile); err == nil { if _, err := os.Stat(haunt.RFile); err == nil {
fmt.Print(h.Prefix("Config file exists. Overwire? " + haunt.Magenta.Bold("[y/n] ") + haunt.Green.Bold("(n) "))) fmt.Print(r.Prefix("Config file exists. Overwire? " + haunt.Magenta.Bold("[y/n] ") + haunt.Green.Bold("(n) ")))
var overwrite string var overwrite string
fmt.Scanf("%s", &overwrite) fmt.Scanf("%s", &overwrite)
write = false write = false
@ -37,15 +36,15 @@ func defaultConfig(cmd *cobra.Command, args []string) error {
} }
} }
if write { if write {
h.SetDefaults() r.SetDefaults()
err := h.Settings.Write(h) err := r.Settings.Write(r)
if err != nil { if err != nil {
return err return err
} }
log.Println(h.Prefix( log.Println(r.Prefix(
"Config file has successfully been saved at .haunt.yaml", "Config file has successfully been saved at .haunt.yaml",
)) ))
log.Println(h.Prefix( log.Println(r.Prefix(
"Run haunt add --help to see how to add more projects", "Run haunt add --help to see how to add more projects",
)) ))
return nil return nil

View File

@ -9,10 +9,9 @@ import (
) )
var removeCmd = &cobra.Command{ var removeCmd = &cobra.Command{
Use: "remove [names]", Use: "remove [names]",
Aliases: []string{"delete", "r"}, Short: "Removes all projects by name from config file",
Short: "Removes all projects by name from config file", Args: cobra.MatchAll(cobra.MinimumNArgs(1), cobra.OnlyValidArgs),
Args: cobra.MatchAll(cobra.MinimumNArgs(1), cobra.OnlyValidArgs),
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getProjectNames(toComplete), cobra.ShellCompDirectiveNoFileComp return getProjectNames(toComplete), cobra.ShellCompDirectiveNoFileComp
}, },
@ -24,14 +23,14 @@ func init() {
} }
func getProjectNames(input string) []string { func getProjectNames(input string) []string {
h := haunt.NewHaunt() r := haunt.NewHaunt()
// read a config if exist // read a config if exist
err := h.Settings.Read(&h) err := r.Settings.Read(&r)
if err != nil { if err != nil {
return []string{} return []string{}
} }
names := []string{} names := []string{}
for _, project := range h.Projects { for _, project := range r.Projects {
if strings.HasPrefix(project.Name, input) { if strings.HasPrefix(project.Name, input) {
names = append(names, project.Name) names = append(names, project.Name)
} }
@ -41,22 +40,22 @@ func getProjectNames(input string) []string {
// Remove a project from an existing config // Remove a project from an existing config
func remove(cmd *cobra.Command, args []string) (err error) { func remove(cmd *cobra.Command, args []string) (err error) {
h := haunt.NewHaunt() r := haunt.NewHaunt()
// read a config if exist // read a config if exist
err = h.Settings.Read(&h) err = r.Settings.Read(&r)
if err != nil { if err != nil {
return err return err
} }
for _, arg := range args { for _, arg := range args {
err = h.Remove(arg) err = r.Remove(arg)
if err != nil { if err != nil {
log.Println(h.Prefix(haunt.Red.Bold(arg + " project not found"))) log.Println(r.Prefix(haunt.Red.Bold(arg + " project not found")))
continue continue
} }
log.Println(h.Prefix(haunt.Green.Bold(arg + " successfully removed"))) log.Println(r.Prefix(haunt.Green.Bold(arg + " successfully removed")))
} }
// update config // update config
err = h.Settings.Write(h) err = r.Settings.Write(r)
if err != nil { if err != nil {
return err return err
} }

View File

@ -1,39 +1,36 @@
package cmd package cmd
import ( import (
"fmt"
"log" "log"
"os"
"strings" "strings"
"github.com/abs3ntdev/haunt/src/haunt" "github.com/abs3ntdev/haunt/src/haunt"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
var startCmd = &cobra.Command{ var runCmd = &cobra.Command{
Use: "start", Use: "run",
Aliases: []string{"s", "run"}, Short: "run haunt, optionally provide the name of projects to only run those otherwise will run all configured projects",
Short: "run haunt, optionally provide the name of projects to only run those otherwise will run all configured projects", Args: cobra.MatchAll(cobra.OnlyValidArgs),
Args: cobra.MatchAll(cobra.OnlyValidArgs),
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getProjectNamesToRun(toComplete), cobra.ShellCompDirectiveNoFileComp return getProjectNamesToRun(toComplete), cobra.ShellCompDirectiveNoFileComp
}, },
RunE: start, RunE: run,
} }
func init() { func init() {
rootCmd.AddCommand(startCmd) rootCmd.AddCommand(runCmd)
} }
func getProjectNamesToRun(input string) []string { func getProjectNamesToRun(input string) []string {
h := haunt.NewHaunt() r := haunt.NewHaunt()
// read a config if exist // read a config if exist
err := h.Settings.Read(&h) err := r.Settings.Read(&r)
if err != nil { if err != nil {
return []string{} return []string{}
} }
names := []string{} names := []string{}
for _, project := range h.Projects { for _, project := range r.Projects {
if strings.HasPrefix(project.Name, input) { if strings.HasPrefix(project.Name, input) {
names = append(names, project.Name) names = append(names, project.Name)
} }
@ -42,54 +39,42 @@ func getProjectNamesToRun(input string) []string {
} }
// haunt workflow // haunt workflow
func start(cmd *cobra.Command, args []string) (err error) { func run(cmd *cobra.Command, args []string) (err error) {
h := haunt.NewHaunt() r := haunt.NewHaunt()
// read a config if exist // read a config if exist
err = h.Settings.Read(&h) err = r.Settings.Read(&r)
if err != nil { if err != nil {
if os.IsNotExist(err) { return err
log.Println(h.Prefix("No config file found, initializing one for you"))
err = defaultConfig(cmd, args)
if err != nil {
log.Println(h.Prefix("Failed to generate default config: " + err.Error()))
}
err = h.Settings.Read(&h)
if err != nil {
return fmt.Errorf(h.Prefix("Failed to read config file: " + err.Error()))
}
} else {
return err
}
} }
if len(args) >= 1 { if len(args) >= 1 {
// filter by name flag if exist // filter by name flag if exist
h.Projects = h.Filter(args) r.Projects = r.Filter(args)
if len(h.Projects) == 0 { if len(r.Projects) == 0 {
log.Println(h.Prefix("No valid project found, exiting. Check your config file or run haunt add")) log.Println(r.Prefix("No valid project found, exiting. Check your config file or run haunt add"))
return return
} }
} }
// increase file limit // increase file limit
if h.Settings.FileLimit != 0 { if r.Settings.FileLimit != 0 {
if err = h.Settings.Flimit(); err != nil { if err = r.Settings.Flimit(); err != nil {
return err return err
} }
} }
// web server // web server
if h.Server.Status { if r.Server.Status {
h.Server.Parent = h r.Server.Parent = r
err = h.Server.Start() err = r.Server.Start()
if err != nil { if err != nil {
return err return err
} }
err = h.Server.OpenURL() err = r.Server.OpenURL()
if err != nil { if err != nil {
return err return err
} }
} }
// start workflow // run workflow
return h.Start() return r.Run()
} }

View File

@ -7,13 +7,19 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
var Version = "v0.2.11" var Version = "v0.1.13"
// versionCmd represents the version command // versionCmd represents the version command
var versionCmd = &cobra.Command{ var versionCmd = &cobra.Command{
Use: "version", Use: "version",
Short: "Prints current verison", Short: "A brief description of your command",
Run: version, Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
Run: version,
} }
func init() { func init() {
@ -32,6 +38,6 @@ func init() {
// Version print current version // Version print current version
func version(cmd *cobra.Command, args []string) { func version(cmd *cobra.Command, args []string) {
h := haunt.NewHaunt() r := haunt.NewHaunt()
log.Println(h.Prefix(haunt.Green.Bold(Version))) log.Println(r.Prefix(haunt.Green.Bold(Version)))
} }

19
go.mod
View File

@ -3,14 +3,13 @@ module github.com/abs3ntdev/haunt
go 1.19 go 1.19
require ( require (
github.com/fatih/color v1.17.0 github.com/fatih/color v1.14.1
github.com/fsnotify/fsnotify v1.7.0 github.com/fsnotify/fsnotify v1.6.0
github.com/labstack/echo v3.3.10+incompatible github.com/labstack/echo v3.3.10+incompatible
github.com/sirupsen/logrus v1.9.3 github.com/sirupsen/logrus v1.9.0
github.com/spf13/cobra v1.8.1 github.com/spf13/cobra v1.6.1
golang.org/x/net v0.27.0 golang.org/x/net v0.7.0
gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v2 v2.4.0
gopkg.in/yaml.v3 v3.0.1
) )
require ( require (
@ -18,12 +17,12 @@ require (
github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/labstack/gommon v0.4.0 // indirect github.com/labstack/gommon v0.4.0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-isatty v0.0.17 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/testify v1.8.1 // indirect github.com/stretchr/testify v1.8.1 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect
golang.org/x/crypto v0.25.0 // indirect golang.org/x/crypto v0.6.0 // indirect
golang.org/x/sys v0.22.0 // indirect golang.org/x/sys v0.5.0 // indirect
golang.org/x/text v0.16.0 // indirect golang.org/x/text v0.7.0 // indirect
) )

22
go.sum
View File

@ -1,5 +1,4 @@
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -7,12 +6,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
@ -27,19 +22,13 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@ -57,12 +46,8 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@ -71,15 +56,8 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=

View File

@ -1,22 +0,0 @@
package main
import (
"fmt"
"github.com/abs3ntdev/haunt/src/haunt"
)
func main() {
names := haunt.AssetNames()
fmt.Println("Assets in bindata:")
fmt.Println(names)
wd := "assets"
for i, v := range names {
fmt.Printf("Restoring asset [%v] [%s]\n", i, v)
err := haunt.RestoreAsset(wd, v)
if err != nil {
fmt.Println("Failed to restore", v)
}
}
}

View File

@ -3,14 +3,5 @@ package main
import "github.com/abs3ntdev/haunt/cmd" import "github.com/abs3ntdev/haunt/cmd"
func main() { func main() {
// names := haunt.AssetNames()
// fmt.Println("Assets in bindata:")
// fmt.Println(names)
//
// wd := "www"
// for i, v := range names {
// fmt.Printf("Restoring asset [%v] [%s]\n", i, v)
// haunt.RestoreAsset(wd, v)
// }
cmd.Execute() cmd.Execute()
} }

View File

@ -1,3 +0,0 @@
{
"extends": ["config:recommended"]
}

File diff suppressed because one or more lines are too long

View File

@ -16,14 +16,14 @@ import (
) )
var ( var (
// HPrefix tool name // RPrefix tool name
HPrefix = "haunt" RPrefix = "haunt"
// HExt file extension // RExt file extension
HExt = ".yaml" RExt = ".yaml"
// HFile config file name // RFile config file name
HFile = "." + HPrefix + HExt RFile = "." + RPrefix + RExt
// HExtWin windows extension // RExtWin windows extension
HExtWin = ".exe" RExtWin = ".exe"
) )
type ( type (
@ -76,17 +76,17 @@ func init() {
} }
} }
func (h *Haunt) SetDefaults() { func (r *Haunt) SetDefaults() {
h.Server = Server{Parent: h, Status: true, Open: false, Port: Port} r.Server = Server{Parent: r, Status: true, Open: false, Port: Port}
h.Settings.FileLimit = 0 r.Settings.FileLimit = 0
h.Settings.Legacy.Interval = 100 * time.Millisecond r.Settings.Legacy.Interval = 100 * time.Millisecond
h.Settings.Legacy.Force = false r.Settings.Legacy.Force = false
h.Settings.Errors = Resource{Name: FileErr, Status: false} r.Settings.Errors = Resource{Name: FileErr, Status: false}
h.Settings.Errors = Resource{Name: FileOut, Status: false} r.Settings.Errors = Resource{Name: FileOut, Status: false}
h.Settings.Errors = Resource{Name: FileLog, Status: false} r.Settings.Errors = Resource{Name: FileLog, Status: false}
if _, err := os.Stat("main.go"); err == nil { if _, err := os.Stat("main.go"); err == nil {
log.Println(h.Prefix(Green.Bold("Adding: " + filepath.Base(Wdir())))) log.Println(r.Prefix(Green.Bold("Adding: " + filepath.Base(Wdir()))))
h.Projects = append(h.Projects, Project{ r.Projects = append(r.Projects, Project{
Name: filepath.Base(Wdir()), Name: filepath.Base(Wdir()),
Path: Wdir(), Path: Wdir(),
Tools: Tools{ Tools: Tools{
@ -103,17 +103,17 @@ func (h *Haunt) SetDefaults() {
}, },
}) })
} else { } else {
log.Println(h.Prefix(Magenta.Bold("Skipping: " + filepath.Base(Wdir()) + " no main.go file in root"))) log.Println(r.Prefix(Magenta.Bold("Skipping: " + filepath.Base(Wdir()) + " no main.go file in root")))
} }
subDirs, err := os.ReadDir("cmd") subDirs, err := os.ReadDir("cmd")
if err != nil { if err != nil {
log.Println(h.Prefix("cmd directory not found, skipping")) log.Println(r.Prefix("cmd directory not found, skipping"))
return return
} }
for _, dir := range subDirs { for _, dir := range subDirs {
if dir.IsDir() { if dir.IsDir() {
log.Println(h.Prefix(Green.Bold("Adding: " + dir.Name()))) log.Println(r.Prefix(Green.Bold("Adding: " + dir.Name())))
h.Projects = append(h.Projects, Project{ r.Projects = append(r.Projects, Project{
Name: dir.Name(), Name: dir.Name(),
Path: "cmd/" + dir.Name(), Path: "cmd/" + dir.Name(),
Tools: Tools{ Tools: Tools{
@ -130,31 +130,31 @@ func (h *Haunt) SetDefaults() {
}, },
}) })
} else { } else {
log.Println(h.Prefix(Magenta.Bold("Skipping: " + dir.Name() + " not a directory"))) log.Println(r.Prefix(Magenta.Bold("Skipping: " + dir.Name() + " not a directory")))
} }
} }
} }
// Stop haunt workflow // Stop haunt workflow
func (h *Haunt) Stop() error { func (r *Haunt) Stop() error {
for k := range h.Projects { for k := range r.Projects {
if h.Schema.Projects[k].exit != nil { if r.Schema.Projects[k].exit != nil {
close(h.Schema.Projects[k].exit) close(r.Schema.Projects[k].exit)
} }
} }
return nil return nil
} }
// Start haunt workflow // Run haunt workflow
func (h *Haunt) Start() error { func (r *Haunt) Run() error {
if len(h.Projects) > 0 { if len(r.Projects) > 0 {
var wg sync.WaitGroup var wg sync.WaitGroup
wg.Add(len(h.Projects)) wg.Add(len(r.Projects))
for k := range h.Projects { for k := range r.Projects {
h.Schema.Projects[k].exit = make(chan os.Signal, 1) r.Schema.Projects[k].exit = make(chan os.Signal, 1)
signal.Notify(h.Schema.Projects[k].exit, os.Interrupt) signal.Notify(r.Schema.Projects[k].exit, os.Interrupt)
h.Schema.Projects[k].parent = h r.Schema.Projects[k].parent = r
go h.Schema.Projects[k].Watch(&wg) go r.Schema.Projects[k].Watch(&wg)
} }
wg.Wait() wg.Wait()
} else { } else {
@ -164,9 +164,9 @@ func (h *Haunt) Start() error {
} }
// Prefix a given string with tool name // Prefix a given string with tool name
func (h *Haunt) Prefix(input string) string { func (r *Haunt) Prefix(input string) string {
if len(input) > 0 { if len(input) > 0 {
return fmt.Sprint(Yellow.Bold("["), strings.ToUpper(HPrefix), Yellow.Bold("]"), ": ", input) return fmt.Sprint(Yellow.Bold("["), strings.ToUpper(RPrefix), Yellow.Bold("]"), ": ", input)
} }
return input return input
} }

View File

@ -41,12 +41,11 @@ type Ignore struct {
// Command fields // Command fields
type Command struct { type Command struct {
Cmd string `yaml:"command" json:"command"` Cmd string `yaml:"command" json:"command"`
Type string `yaml:"type" json:"type"` Type string `yaml:"type" json:"type"`
Env map[string]string `yaml:"env,omitempty" json:"env,omitempty"` Path string `yaml:"path,omitempty" json:"path,omitempty"`
Path string `yaml:"path,omitempty" json:"path,omitempty"` Global bool `yaml:"global,omitempty" json:"global,omitempty"`
Global bool `yaml:"global,omitempty" json:"global,omitempty"` Output bool `yaml:"output,omitempty" json:"output,omitempty"`
Output bool `yaml:"output,omitempty" json:"output,omitempty"`
} }
// Project info // Project info
@ -543,7 +542,7 @@ func (p *Project) stamp(t string, o BufferOut, msg string, stream string) {
case "out": case "out":
p.Buffer.StdOut = append(p.Buffer.StdOut, o) p.Buffer.StdOut = append(p.Buffer.StdOut, o)
if p.parent.Settings.Files.Outputs.Status { if p.parent.Settings.Files.Outputs.Status {
f := p.parent.Settings.Create(p.Path, p.parent.Settings.Outputs.Name) f := p.parent.Settings.Create(p.Path, p.parent.Settings.Files.Outputs.Name)
if _, err := f.WriteString(strings.Join(content, " ")); err != nil { if _, err := f.WriteString(strings.Join(content, " ")); err != nil {
p.parent.Settings.Fatal(err, "") p.parent.Settings.Fatal(err, "")
} }
@ -551,7 +550,7 @@ func (p *Project) stamp(t string, o BufferOut, msg string, stream string) {
case "log": case "log":
p.Buffer.StdLog = append(p.Buffer.StdLog, o) p.Buffer.StdLog = append(p.Buffer.StdLog, o)
if p.parent.Settings.Files.Logs.Status { if p.parent.Settings.Files.Logs.Status {
f := p.parent.Settings.Create(p.Path, p.parent.Settings.Logs.Name) f := p.parent.Settings.Create(p.Path, p.parent.Settings.Files.Logs.Name)
if _, err := f.WriteString(strings.Join(content, " ")); err != nil { if _, err := f.WriteString(strings.Join(content, " ")); err != nil {
p.parent.Settings.Fatal(err, "") p.parent.Settings.Fatal(err, "")
} }
@ -559,7 +558,7 @@ func (p *Project) stamp(t string, o BufferOut, msg string, stream string) {
case "error": case "error":
p.Buffer.StdErr = append(p.Buffer.StdErr, o) p.Buffer.StdErr = append(p.Buffer.StdErr, o)
if p.parent.Settings.Files.Errors.Status { if p.parent.Settings.Files.Errors.Status {
f := p.parent.Settings.Create(p.Path, p.parent.Settings.Errors.Name) f := p.parent.Settings.Create(p.Path, p.parent.Settings.Files.Errors.Name)
if _, err := f.WriteString(strings.Join(content, " ")); err != nil { if _, err := f.WriteString(strings.Join(content, " ")); err != nil {
p.parent.Settings.Fatal(err, "") p.parent.Settings.Fatal(err, "")
} }
@ -578,14 +577,7 @@ func (p *Project) stamp(t string, o BufferOut, msg string, stream string) {
func (p Project) buildEnvs() (envs []string) { func (p Project) buildEnvs() (envs []string) {
for k, v := range p.Env { for k, v := range p.Env {
envs = append(envs, fmt.Sprintf("%s=%s", strings.ReplaceAll(k, "=", ""), v)) envs = append(envs, fmt.Sprintf("%s=%s", strings.Replace(k, "=", "", -1), v))
}
return
}
func (c Command) buildEnvs() (envs []string) {
for k, v := range c.Env {
envs = append(envs, fmt.Sprintf("%s=%s", strings.ReplaceAll(k, "=", ""), v))
} }
return return
} }
@ -645,13 +637,13 @@ func (p *Project) run(path string, stream chan Response, stop <-chan bool) (err
} }
if _, err = os.Stat(path); err == nil { if _, err = os.Stat(path); err == nil {
build = exec.Command(path, args...) build = exec.Command(path, args...)
} else if _, err = os.Stat(path + HExtWin); err == nil { } else if _, err = os.Stat(path + RExtWin); err == nil {
build = exec.Command(path+HExtWin, args...) build = exec.Command(path+RExtWin, args...)
} else { } else {
if _, err = os.Stat(path); err == nil { if _, err = os.Stat(path); err == nil {
build = exec.Command(path, args...) build = exec.Command(path, args...)
} else if _, err = os.Stat(path + HExtWin); err == nil { } else if _, err = os.Stat(path + RExtWin); err == nil {
build = exec.Command(path+HExtWin, args...) build = exec.Command(path+RExtWin, args...)
} else { } else {
return errors.New("project not found") return errors.New("project not found")
} }
@ -723,10 +715,6 @@ func (c *Command) exec(base string, stop <-chan bool) (response Response) {
done := make(chan error) done := make(chan error)
args := strings.Split(strings.Replace(strings.Replace(c.Cmd, "'", "", -1), "\"", "", -1), " ") args := strings.Split(strings.Replace(strings.Replace(c.Cmd, "'", "", -1), "\"", "", -1), " ")
ex := exec.Command(args[0], args[1:]...) ex := exec.Command(args[0], args[1:]...)
appendEnvs := c.buildEnvs()
if len(appendEnvs) > 0 {
ex.Env = append(ex.Env, appendEnvs...)
}
ex.Dir = base ex.Dir = base
// make cmd path // make cmd path
if c.Path != "" { if c.Path != "" {

View File

@ -13,9 +13,9 @@ import (
const ( const (
Permission = 0o775 Permission = 0o775
File = ".haunt.yaml" File = ".haunt.yaml"
FileOut = ".h.outputs.log" FileOut = ".r.outputs.log"
FileErr = ".h.errors.log" FileErr = ".r.errors.log"
FileLog = ".h.logs.log" FileLog = ".r.logs.log"
) )
// Settings defines a group of general settings and options // Settings defines a group of general settings and options
@ -71,10 +71,10 @@ func (s *Settings) Remove(d string) error {
// Read config file // Read config file
func (s *Settings) Read(out interface{}) error { func (s *Settings) Read(out interface{}) error {
// backward compatibility // backward compatibility
if _, err := os.Stat(HFile); err != nil { if _, err := os.Stat(RFile); err != nil {
return err return err
} }
content, err := s.Stream(HFile) content, err := s.Stream(RFile)
if err == nil { if err == nil {
err = yaml.Unmarshal(content, out) err = yaml.Unmarshal(content, out)
return err return err
@ -88,7 +88,7 @@ func (s *Settings) Write(out interface{}) error {
if err != nil { if err != nil {
return err return err
} }
s.Fatal(os.WriteFile(HFile, y, Permission)) s.Fatal(os.WriteFile(RFile, y, Permission))
return nil return nil
} }

View File

@ -183,8 +183,14 @@ func (t *Tool) Compile(path string, stop <-chan bool) (response Response) {
var out bytes.Buffer var out bytes.Buffer
var stderr bytes.Buffer var stderr bytes.Buffer
done := make(chan error) done := make(chan error)
args := append(t.cmd, t.Args...) buildPath, _ := filepath.Abs(Wdir())
buildPath = "-o " + buildPath
buildPath += "/bin"
fmt.Println(t.cmd, t.Args)
args := append(t.cmd, buildPath)
args = append(args, t.Args...)
cmd := exec.Command(args[0], args[1:]...) cmd := exec.Command(args[0], args[1:]...)
fmt.Println(cmd)
if t.Dir != "" { if t.Dir != "" {
cmd.Dir, _ = filepath.Abs(t.Dir) cmd.Dir, _ = filepath.Abs(t.Dir)
} else { } else {