diff --git a/Makefile b/Makefile index 527d4ec4..58598385 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,10 @@ -NAME=sing-box -COMMIT=$(shell git rev-parse --short HEAD) -PARAMS=-trimpath -tags '$(TAGS)' -ldflags \ +NAME = sing-box +COMMIT = $(shell git rev-parse --short HEAD) +TAGS ?= with_quic,with_clash_api +PARAMS = -trimpath -tags '$(TAGS)' -ldflags \ '-X "github.com/sagernet/sing-box/constant.Commit=$(COMMIT)" \ -w -s -buildid=' -MAIN=./cmd/sing-box +MAIN = ./cmd/sing-box .PHONY: test release @@ -24,9 +25,9 @@ fmt_install: go install -v github.com/daixiang0/gci@v0.4.0 fmt: - gofumpt -l -w . - gofmt -s -w . - gci write -s "standard,prefix(github.com/sagernet/),default" . + @gofumpt -l -w . + @gofmt -s -w . + @gci write -s "standard,prefix(github.com/sagernet/),default" . lint_install: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest @@ -38,10 +39,10 @@ lint: GOOS=freebsd golangci-lint run ./... test: - go test -v . && \ - pushd test && \ - go test -v . && \ - popd + @go test -v . && \ + @pushd test && \ + @go test -v . && \ + @popd clean: rm -rf bin dist diff --git a/cmd/sing-box/cmd_check.go b/cmd/sing-box/cmd_check.go index 88439d0b..3a5193d6 100644 --- a/cmd/sing-box/cmd_check.go +++ b/cmd/sing-box/cmd_check.go @@ -8,6 +8,7 @@ import ( "github.com/sagernet/sing-box/common/json" "github.com/sagernet/sing-box/log" "github.com/sagernet/sing-box/option" + E "github.com/sagernet/sing/common/exceptions" "github.com/spf13/cobra" ) @@ -15,24 +16,31 @@ import ( var commandCheck = &cobra.Command{ Use: "check", Short: "Check configuration", - Run: checkConfiguration, - Args: cobra.NoArgs, + Run: func(cmd *cobra.Command, args []string) { + err := check() + if err != nil { + log.Fatal(err) + } + }, + Args: cobra.NoArgs, } -func checkConfiguration(cmd *cobra.Command, args []string) { +func init() { + mainCommand.AddCommand(commandCheck) +} + +func check() error { configContent, err := os.ReadFile(configPath) if err != nil { - log.Fatal("read config: ", err) + return E.Cause(err, "read config") } var options option.Options err = json.Unmarshal(configContent, &options) if err != nil { - log.Fatal("decode config: ", err) + return E.Cause(err, "decode config") } ctx, cancel := context.WithCancel(context.Background()) _, err = box.New(ctx, options) - if err != nil { - log.Fatal("create service: ", err) - } cancel() + return err } diff --git a/cmd/sing-box/cmd_format.go b/cmd/sing-box/cmd_format.go index 7ca80ab4..5a811a90 100644 --- a/cmd/sing-box/cmd_format.go +++ b/cmd/sing-box/cmd_format.go @@ -8,6 +8,7 @@ import ( "github.com/sagernet/sing-box/common/json" "github.com/sagernet/sing-box/log" "github.com/sagernet/sing-box/option" + E "github.com/sagernet/sing/common/exceptions" "github.com/spf13/cobra" ) @@ -17,47 +18,54 @@ var commandFormatFlagWrite bool var commandFormat = &cobra.Command{ Use: "format", Short: "Format configuration", - Run: formatConfiguration, - Args: cobra.NoArgs, + Run: func(cmd *cobra.Command, args []string) { + err := format() + if err != nil { + log.Fatal(err) + } + }, + Args: cobra.NoArgs, } func init() { commandFormat.Flags().BoolVarP(&commandFormatFlagWrite, "write", "w", false, "write result to (source) file instead of stdout") + mainCommand.AddCommand(commandFormat) } -func formatConfiguration(cmd *cobra.Command, args []string) { +func format() error { configContent, err := os.ReadFile(configPath) if err != nil { - log.Fatal("read config: ", err) + return E.Cause(err, "read config") } var options option.Options err = json.Unmarshal(configContent, &options) if err != nil { - log.Fatal("decode config: ", err) + return E.Cause(err, "decode config") } buffer := new(bytes.Buffer) encoder := json.NewEncoder(buffer) encoder.SetIndent("", " ") err = encoder.Encode(options) if err != nil { - log.Fatal("encode config: ", err) + return E.Cause(err, "encode config") } if !commandFormatFlagWrite { os.Stdout.WriteString(buffer.String() + "\n") - return + return nil } if bytes.Equal(configContent, buffer.Bytes()) { - return + return nil } output, err := os.Create(configPath) if err != nil { - log.Fatal("open output: ", err) + return E.Cause(err, "open output") } _, err = output.Write(buffer.Bytes()) output.Close() if err != nil { - log.Fatal("write output: ", err) + return E.Cause(err, "write output") } outputPath, _ := filepath.Abs(configPath) os.Stderr.WriteString(outputPath + "\n") + return nil } diff --git a/cmd/sing-box/cmd_run.go b/cmd/sing-box/cmd_run.go index 649f1979..8e3cff99 100644 --- a/cmd/sing-box/cmd_run.go +++ b/cmd/sing-box/cmd_run.go @@ -20,17 +20,19 @@ import ( var commandRun = &cobra.Command{ Use: "run", Short: "Run service", - Run: run, + Run: func(cmd *cobra.Command, args []string) { + err := run() + if err != nil { + log.Fatal(err) + } + }, } -func run(cmd *cobra.Command, args []string) { - err := run0() - if err != nil { - log.Fatal(err) - } +func init() { + mainCommand.AddCommand(commandRun) } -func run0() error { +func run() error { configContent, err := os.ReadFile(configPath) if err != nil { return E.Cause(err, "read config") diff --git a/cmd/sing-box/cmd_version.go b/cmd/sing-box/cmd_version.go index e1ecc381..7b7abc76 100644 --- a/cmd/sing-box/cmd_version.go +++ b/cmd/sing-box/cmd_version.go @@ -21,6 +21,7 @@ var nameOnly bool func init() { commandVersion.Flags().BoolVarP(&nameOnly, "name", "n", false, "print version name only") + mainCommand.AddCommand(commandVersion) } func printVersion(cmd *cobra.Command, args []string) { diff --git a/cmd/sing-box/main.go b/cmd/sing-box/main.go index 3d66f4ae..7bebefed 100644 --- a/cmd/sing-box/main.go +++ b/cmd/sing-box/main.go @@ -23,11 +23,6 @@ func init() { mainCommand.PersistentFlags().StringVarP(&configPath, "config", "c", "config.json", "set configuration file path") mainCommand.PersistentFlags().StringVarP(&workingDir, "directory", "D", "", "set working directory") mainCommand.PersistentFlags().BoolVarP(&disableColor, "disable-color", "", false, "disable color output") - - mainCommand.AddCommand(commandRun) - mainCommand.AddCommand(commandCheck) - mainCommand.AddCommand(commandFormat) - mainCommand.AddCommand(commandVersion) } func main() {