diff --git a/coco/main.go b/coco/main.go index ee23a63..0edb388 100644 --- a/coco/main.go +++ b/coco/main.go @@ -24,12 +24,13 @@ func init() { PadLevelText: false, QuoteEmptyFields: false, }) - rootCmd.AddCommand(bootstrap.Update()) + rootCmd.AddCommand(bootstrap.AddVersionCommand()) rootCmd.AddCommand(bootstrap.CreateProject()) rootCmd.AddCommand(bootstrap.AddAPICommand()) rootCmd.AddCommand(bootstrap.AddServiceCommand()) rootCmd.AddCommand(bootstrap.GenerateProtoFile()) rootCmd.AddCommand(bootstrap.InjectProtoFile()) + rootCmd.AddCommand(bootstrap.AddProtoFormat()) } func main() { diff --git a/coco_config.go b/coco_config.go index da3d5e1..ae196a2 100644 --- a/coco_config.go +++ b/coco_config.go @@ -1,5 +1,8 @@ package bootstrap +import "time" + type Config struct { - Version string `yaml:"version"` + Version string `yaml:"version"` + CommitAt time.Time `yaml:"commit_at"` } diff --git a/coco_proto_format.go b/coco_proto_format.go new file mode 100644 index 0000000..f4c4394 --- /dev/null +++ b/coco_proto_format.go @@ -0,0 +1,54 @@ +package bootstrap + +import ( + "bytes" + "github.com/emicklei/proto" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "gitter.top/common/protofmt" + "os" +) + +func AddProtoFormat() *cobra.Command { + var protoFile string + cmd := &cobra.Command{ + Use: "pbf", + Short: "protobuf format", + PreRun: func(_ *cobra.Command, args []string) { + if protoFile == "" && len(args) != 0 { + protoFile = args[0] + } + stat, err := os.Stat(protoFile) + if err != nil { + logrus.Fatalf("read proto file %s failed: %v", protoFile, err) + return + } + if stat.IsDir() { + logrus.Fatalf("proto file can not be directory") + return + } + }, + Run: func(cmd *cobra.Command, args []string) { + file, err := os.Open(protoFile) + if err != nil { + logrus.Errorf("format proto file %s failed: %v", protoFile, err) + return + } + buf := new(bytes.Buffer) + parser := proto.NewParser(file) + parser.Filename(protoFile) + def, err := parser.Parse() + if err != nil { + logrus.Errorf("parse proto file %s failed: %v", protoFile, err) + return + } + protofmt.NewFormatter(buf, " ").Format(def) + if err := os.WriteFile(protoFile, buf.Bytes(), os.ModePerm); err != nil { + logrus.Errorf("write proto file %s failed: %v", protoFile, err) + return + } + }, + } + cmd.Flags().StringVar(&protoFile, "path", "", "proto file path") + return cmd +} diff --git a/coco_update.go b/coco_update.go deleted file mode 100644 index 4ad152e..0000000 --- a/coco_update.go +++ /dev/null @@ -1,54 +0,0 @@ -package bootstrap - -import ( - "fmt" - - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" -) - -func Update() *cobra.Command { - var config Config - var configPath string - var easyaml = NewEasYaml() - var rt = NewRuntime() - return &cobra.Command{ - Use: "update", - Short: "coco update", - PreRun: func(cmd *cobra.Command, args []string) { - configPath = rt.ReplaceEachSlash(fmt.Sprintf("%s/.coco.yaml", rt.GetHomeDir())) - _ = easyaml.Read(configPath, &config) - }, - Run: func(cmd *cobra.Command, args []string) { - client, err := NewGiteaClient("https://gitter.top") - if err != nil { - logrus.Errorf("new gitea api failed: %v", err) - return - } - commitID, err := client.GetLatestCommitID("coco", "bootstrap") - if err != nil { - logrus.Errorf("get coco bootstrap info failed: %v", err) - return - } - if commitID == config.Version { - logrus.Infof("version is latest!") - return - } - - // exec update - repo := fmt.Sprintf("gitter.top/coco/bootstrap/coco/...@%s", commitID) - if _, err := rt.Exec("go", "install", repo); err != nil { - logrus.Errorf("update bootstrap failed: %v", err) - return - } - - config.Version = commitID - if err := easyaml.Write(configPath, &config); err != nil { - logrus.Errorf("write config failed: %v", err) - return - } - - logrus.Infof("update success!") - }, - } -} diff --git a/coco_version.go b/coco_version.go new file mode 100644 index 0000000..7af2e25 --- /dev/null +++ b/coco_version.go @@ -0,0 +1,69 @@ +package bootstrap + +import ( + "fmt" + "time" + + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func AddVersionCommand() *cobra.Command { + var config Config + var configPath string + var update bool + var easyaml = NewEasYaml() + var rt = NewRuntime() + cmd := &cobra.Command{ + Use: "version", + Short: "coco version", + PreRun: func(cmd *cobra.Command, args []string) { + if !update && len(args) != 0 { + u := args[0] + if u == "update" { + update = true + } + } + configPath = rt.ReplaceEachSlash(fmt.Sprintf("%s/.coco.yaml", rt.GetHomeDir())) + _ = easyaml.Read(configPath, &config) + logrus.Infof("current version: %s, release at: %s", config.Version, config.CommitAt.Format(time.DateTime)) + }, + Run: func(cmd *cobra.Command, args []string) { + client, err := NewGiteaClient("https://gitter.top") + if err != nil { + logrus.Errorf("new gitea api failed: %v", err) + return + } + commit, err := client.GetLatestCommit("coco", "bootstrap") + if err != nil { + logrus.Errorf("get coco vcs info failed: %v", err) + return + } + if commit.SHA == config.Version { + logrus.Infof("version is latest!") + return + } + + var commitID = commit.SHA[:8] + logrus.Infof("latest version: %s, release at: %s", commitID, commit.CommitMeta.Created.Format(time.DateTime)) + + if update { + repo := fmt.Sprintf("gitter.top/coco/bootstrap/coco/...@%s", commitID) + if _, err := rt.Exec("go", "install", repo); err != nil { + logrus.Errorf("update coco failed: %v", err) + return + } + + config.Version = commitID + config.CommitAt = commit.CommitMeta.Created + if err := easyaml.Write(configPath, &config); err != nil { + logrus.Errorf("write config failed: %v", err) + return + } + logrus.Infof("update success!") + } + }, + } + cmd.Flags().BoolVar(&update, "update", false, "update coco version") + return cmd +} diff --git a/go.mod b/go.mod index 53a4ba9..ee21aa6 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,21 @@ module gitter.top/coco/bootstrap -go 1.20 +go 1.21 + +toolchain go1.21.8 require ( code.gitea.io/sdk/gitea v0.17.1 + github.com/emicklei/proto v1.13.2 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 gitter.top/common/gobuf v0.0.4 + gitter.top/common/protofmt v0.0.1 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/davidmz/go-pageant v1.0.2 // indirect - github.com/emicklei/proto v1.13.2 // indirect github.com/go-fed/httpsig v1.1.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect diff --git a/util.go b/util.go index 5f44572..46f5551 100644 --- a/util.go +++ b/util.go @@ -31,7 +31,7 @@ func NewGiteaClient(addr string) (*GiteaClient, error) { return &GiteaClient{client: client}, nil } -func (c *GiteaClient) GetLatestCommitID(owner, repoName string) (string, error) { +func (c *GiteaClient) GetLatestCommit(owner, repoName string) (*gitea.Commit, error) { commits, _, err := c.client.ListRepoCommits(owner, repoName, gitea.ListCommitOptions{ ListOptions: gitea.ListOptions{ Page: 1, @@ -39,9 +39,9 @@ func (c *GiteaClient) GetLatestCommitID(owner, repoName string) (string, error) }, }) if err != nil { - return "", err + return nil, err } - return commits[0].SHA, nil + return commits[0], nil } type EasYaml struct {