gitee.com/h79/goutils@v1.22.10/common/git/cmd.go (about) 1 package git 2 3 import ( 4 "bytes" 5 "context" 6 "errors" 7 "os/exec" 8 "strings" 9 ) 10 11 var ( 12 ArgsCommitLog = []string{"log", "--pretty=format:\"%h\"", "-1"} 13 ArgsCommit = []string{"rev-parse", "--short", "HEAD"} 14 ArgsDirty = []string{"status", "--porcelain"} 15 ArgsBranch = []string{"rev-parse", "--abbrev-ref", "HEAD"} 16 ArgsDescribe = []string{"describe", "--tags", "--always"} 17 ArgsTag = []string{"describe", "--abbrev=0", "--tags"} 18 ) 19 20 type Cmd struct { 21 } 22 23 func (c *Cmd) IsRepo(ctx context.Context, env []string) bool { 24 out, err := c.Do(ctx, env, []string{"rev-parse", "--is-inside-work-tree"}...) 25 return err == nil && strings.TrimSpace(out) == "true" 26 } 27 28 // VersionNumber sample 1.0.1 29 func (c *Cmd) VersionNumber(ctx context.Context, env []string) string { 30 ver := c.Version(ctx, env) 31 if ver != "" && ver[0] == 'v' { 32 return ver[1:] 33 } 34 return ver 35 } 36 37 // Version sample v1.0.1 38 func (c *Cmd) Version(ctx context.Context, env []string) string { 39 ver, err := c.Do(ctx, env, ArgsTag...) 40 if err != nil { 41 return "" 42 } 43 return ver 44 } 45 46 func (c *Cmd) Do(ctx context.Context, env []string, args ...string) (string, error) { 47 a := append([]string{"-c", "log.showSignature=false"}, args...) 48 return c.DoCmd(ctx, env, a...) 49 } 50 51 func (c *Cmd) DoCmd(ctx context.Context, env []string, args ...string) (string, error) { 52 53 cmd := exec.CommandContext(ctx, "git", args...) 54 55 stdout := bytes.Buffer{} 56 stderr := bytes.Buffer{} 57 58 cmd.Stdout = &stdout 59 cmd.Stderr = &stderr 60 cmd.Env = append(cmd.Env, env...) 61 62 err := cmd.Run() 63 64 if err != nil { 65 return "", errors.New(stderr.String()) 66 } 67 return stdout.String(), nil 68 }