config file introduced
This commit is contained in:
parent
cd24640118
commit
5caf8fe9fa
82
config.go
82
config.go
@ -1,8 +1,82 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.milar.in/milarin/configfile"
|
||||||
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
OS []string `json:"os"`
|
OutputDir string `json:"output_dir"`
|
||||||
Arch []string `json:"arch"`
|
|
||||||
NoCompress bool `json:"no_compress"`
|
OS []string `json:"os"`
|
||||||
NumThreads int `json:"num_threads"`
|
Arch []string `json:"arch"`
|
||||||
|
|
||||||
|
Silent bool `json:"silent"`
|
||||||
|
NoCompress bool `json:"no_compress"`
|
||||||
|
NumThreads int `json:"num_threads"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadConfig() error {
|
||||||
|
configFilePath, err := configfile.Path("json")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := os.Open(configFilePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
cfg := &Config{}
|
||||||
|
if err := json.NewDecoder(file).Decode(cfg); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
*OutputDir = cfg.OutputDir
|
||||||
|
*OS = strings.Join(cfg.OS, ",")
|
||||||
|
*Arch = strings.Join(cfg.Arch, ",")
|
||||||
|
*Silent = cfg.Silent
|
||||||
|
*NoCompress = cfg.NoCompress
|
||||||
|
*NumThreads = cfg.NumThreads
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func SaveConfig() (string, error) {
|
||||||
|
configFilePath, err := configfile.Path("json")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.MkdirAll(filepath.Dir(configFilePath), 0744); err != nil {
|
||||||
|
return configFilePath, err
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := os.Create(configFilePath)
|
||||||
|
if err != nil {
|
||||||
|
return configFilePath, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
enc := json.NewEncoder(file)
|
||||||
|
enc.SetIndent("", "\t")
|
||||||
|
|
||||||
|
cfg := &Config{
|
||||||
|
OutputDir: *OutputDir,
|
||||||
|
OS: strings.Split(*OS, ","),
|
||||||
|
Arch: strings.Split(*Arch, ","),
|
||||||
|
Silent: *Silent,
|
||||||
|
NoCompress: *NoCompress,
|
||||||
|
NumThreads: *NumThreads,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := enc.Encode(cfg); err != nil {
|
||||||
|
return configFilePath, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return configFilePath, nil
|
||||||
}
|
}
|
||||||
|
7
go.mod
7
go.mod
@ -4,13 +4,14 @@ go 1.19
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
git.milar.in/milarin/channel v0.0.7
|
git.milar.in/milarin/channel v0.0.7
|
||||||
|
git.milar.in/milarin/configfile v1.0.2
|
||||||
git.milar.in/milarin/gmath v0.0.1
|
git.milar.in/milarin/gmath v0.0.1
|
||||||
github.com/fatih/color v1.13.0
|
github.com/fatih/color v1.13.0
|
||||||
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e
|
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/mattn/go-colorable v0.1.9 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.14 // indirect
|
github.com/mattn/go-isatty v0.0.16 // indirect
|
||||||
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect
|
golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2 // indirect
|
||||||
)
|
)
|
||||||
|
13
go.sum
13
go.sum
@ -1,18 +1,23 @@
|
|||||||
git.milar.in/milarin/channel v0.0.7 h1:cVKtwgH/EE7U+XTHcoFCClJ4LR349KanzjX9xKwRcNg=
|
git.milar.in/milarin/channel v0.0.7 h1:cVKtwgH/EE7U+XTHcoFCClJ4LR349KanzjX9xKwRcNg=
|
||||||
git.milar.in/milarin/channel v0.0.7/go.mod h1:We83LTI8S7u7II3pD+A2ChCDWJfCkcBUCUqii9HjTtM=
|
git.milar.in/milarin/channel v0.0.7/go.mod h1:We83LTI8S7u7II3pD+A2ChCDWJfCkcBUCUqii9HjTtM=
|
||||||
|
git.milar.in/milarin/configfile v1.0.2 h1:QgZVSVDsFm3HK7PEg6a2ANeZxqo0JlIooyyJv8VaCNI=
|
||||||
|
git.milar.in/milarin/configfile v1.0.2/go.mod h1:RsdN0d/a13WWJmxhuPjdexfUfLCeXAzBenbqz+KMkTs=
|
||||||
git.milar.in/milarin/gmath v0.0.1 h1:pjUc1vYUE4bIky1fk0y0K347wU/9F9KtW312xkTF1YA=
|
git.milar.in/milarin/gmath v0.0.1 h1:pjUc1vYUE4bIky1fk0y0K347wU/9F9KtW312xkTF1YA=
|
||||||
git.milar.in/milarin/gmath v0.0.1/go.mod h1:HDLftG5RLpiNGKiIWh+O2G1PYkNzyLDADO8Cd/1abiE=
|
git.milar.in/milarin/gmath v0.0.1/go.mod h1:HDLftG5RLpiNGKiIWh+O2G1PYkNzyLDADO8Cd/1abiE=
|
||||||
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
|
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
|
||||||
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
|
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
|
||||||
github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
|
|
||||||
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||||
|
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||||
|
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
|
|
||||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||||
|
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
|
||||||
|
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA=
|
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA=
|
||||||
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA=
|
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA=
|
||||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
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-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2 h1:fqTvyMIIj+HRzMmnzr9NtpHP6uVpvB5fkHcgPDC4nu8=
|
||||||
|
golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
49
init.go
49
init.go
@ -11,70 +11,67 @@ import (
|
|||||||
|
|
||||||
func Init() {
|
func Init() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
if *SaveConfigFile {
|
||||||
|
if configFilePath, err := SaveConfig(); err == nil {
|
||||||
|
Println(ColorDone.Sprintf("config file saved at '%s'", configFilePath))
|
||||||
|
os.Exit(0)
|
||||||
|
} else {
|
||||||
|
Println(ColorError.Sprint(fmt.Errorf("saving config file failed: %w", err)))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := LoadConfig(); err != nil {
|
||||||
|
Println(ColorError.Sprint(fmt.Errorf("loading config file failed: %w", err)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ModulePath, err = filepath.Abs(flag.Arg(0))
|
ModulePath, err = filepath.Abs(flag.Arg(0))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !*Silent {
|
Println(ColorError.Sprint("determining module path failed"))
|
||||||
ColorError.Fprintln(os.Stderr, "determining module path failed")
|
|
||||||
}
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
*OutputDir, err = filepath.Abs(*OutputDir)
|
*OutputDir, err = filepath.Abs(*OutputDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !*Silent {
|
Println(ColorError.Sprint("determining output path failed"))
|
||||||
ColorError.Fprintln(os.Stderr, "determining output path failed")
|
|
||||||
}
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := exec.LookPath("go"); err != nil {
|
if _, err := exec.LookPath("go"); err != nil {
|
||||||
if !*Silent {
|
Println(ColorError.Sprint("go not found in PATH. compilation not possible"))
|
||||||
ColorError.Fprintln(os.Stderr, "go not found in PATH. compilation not possible")
|
|
||||||
}
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := FillCompileConfigs(); err != nil {
|
if err := FillCompileConfigs(); err != nil {
|
||||||
if !*Silent {
|
Println(ColorError.Sprint(fmt.Errorf("target architectures could not be determined: %w", err)))
|
||||||
ColorError.Fprintln(os.Stderr, fmt.Errorf("target architectures could not be determined: %w", err))
|
|
||||||
}
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := os.Stat(filepath.Join(ModulePath, "go.mod")); errors.Is(err, os.ErrNotExist) {
|
if _, err := os.Stat(filepath.Join(ModulePath, "go.mod")); errors.Is(err, os.ErrNotExist) {
|
||||||
if !*Silent {
|
Println(ColorError.Sprintf("no Go module found at '%s'", ModulePath))
|
||||||
ColorError.Fprintf(os.Stderr, "no Go module found at '%s'\n", ModulePath)
|
|
||||||
}
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := DetermineProjectName(); err != nil {
|
if err := DetermineProjectName(); err != nil {
|
||||||
if !*Silent {
|
Println(ColorError.Sprint(fmt.Errorf("project name could not be determined: %w", err)))
|
||||||
ColorError.Fprintln(os.Stderr, fmt.Errorf("project name could not be determined: %w", err))
|
|
||||||
}
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := os.MkdirAll(*OutputDir, 0744); err != nil {
|
if err := os.MkdirAll(*OutputDir, 0744); err != nil {
|
||||||
if !*Silent {
|
Println(ColorError.Sprint(fmt.Errorf("output folder '%s' could not be made: %w", *OutputDir, err)))
|
||||||
ColorError.Fprintln(os.Stderr, fmt.Errorf("output folder '%s' could not be made: %w", *OutputDir, err))
|
|
||||||
}
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := CheckDirWritable(*OutputDir); err != nil {
|
if err := CheckDirWritable(*OutputDir); err != nil {
|
||||||
if !*Silent {
|
Println(ColorError.Sprintf("output folder '%s' has insufficient permissions", *OutputDir))
|
||||||
ColorError.Fprintf(os.Stderr, "output folder '%s' has insufficient permissions\n", *OutputDir)
|
|
||||||
}
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !*NoCompress {
|
if !*NoCompress {
|
||||||
if _, err := exec.LookPath("upx"); err != nil {
|
if _, err := exec.LookPath("upx"); err != nil {
|
||||||
ColorWarn.Fprintln(os.Stderr, "upx not found in PATH. file compression not possible")
|
Println(ColorWarn.Sprint(os.Stderr, "upx not found in PATH. file compression not possible"))
|
||||||
*NoCompress = true
|
*NoCompress = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
25
main.go
25
main.go
@ -24,15 +24,28 @@ var (
|
|||||||
MaxConfigStringLength int
|
MaxConfigStringLength int
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// command line arguments default values
|
||||||
|
var (
|
||||||
|
DefaultOutputDir = "output"
|
||||||
|
DefaultOS = ""
|
||||||
|
DefaultArch = ""
|
||||||
|
DefaultSilent = false
|
||||||
|
DefaultNoCompress = false
|
||||||
|
DefaultNumThreads = runtime.NumCPU()
|
||||||
|
)
|
||||||
|
|
||||||
// command line arguments
|
// command line arguments
|
||||||
var (
|
var (
|
||||||
OS = flag.String("os", "", "comma-separated list of operating systems to compile for (empty for all)")
|
OutputDir = flag.String("o", DefaultOutputDir, "output directory")
|
||||||
Arch = flag.String("arch", "", "comma-separated list of architectures to compile for (empty for all)")
|
|
||||||
|
|
||||||
OutputDir = flag.String("o", "output", "output directory")
|
OS = flag.String("os", DefaultOS, "comma-separated list of operating systems to compile for (empty for all)")
|
||||||
Silent = flag.Bool("s", false, "silent mode (no output)")
|
Arch = flag.String("arch", DefaultArch, "comma-separated list of architectures to compile for (empty for all)")
|
||||||
NoCompress = flag.Bool("c", false, "dont compress any executables")
|
|
||||||
NumThreads = flag.Int("t", runtime.NumCPU(), "amount of threads (0 = infinite)")
|
Silent = flag.Bool("s", DefaultSilent, "silent mode (no output)")
|
||||||
|
NoCompress = flag.Bool("c", DefaultNoCompress, "dont compress any executables")
|
||||||
|
NumThreads = flag.Int("t", DefaultNumThreads, "amount of threads (0 = infinite)")
|
||||||
|
|
||||||
|
SaveConfigFile = flag.Bool("saveconfig", false, "save config file with current configuration and exit")
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
Loading…
Reference in New Issue
Block a user