github.com/lgug2z/story@v0.4.1/git/commit.go (about) 1 package git 2 3 import ( 4 "fmt" 5 "os/exec" 6 "strings" 7 ) 8 9 type CommitOpts struct { 10 Messages []string 11 Project string 12 } 13 14 func hasStagedChanges(project string) (bool, error) { 15 command := exec.Command("git", "diff", "--cached", "--name-only") 16 if project != "" { 17 command.Dir = project 18 } 19 20 combinedOutput, err := command.CombinedOutput() 21 if err != nil { 22 return false, err 23 } 24 25 trimmed := strings.TrimSpace(string(combinedOutput)) 26 27 return len(trimmed) > 0, nil 28 } 29 30 func Commit(opts CommitOpts) (string, error) { 31 changes, err := hasStagedChanges(opts.Project) 32 if err != nil { 33 return "", err 34 } 35 36 if !changes { 37 return "no staged changes to commit", err 38 } 39 40 var args []string 41 args = append(args, "commit") 42 43 for _, message := range opts.Messages { 44 args = append(args, "--message") 45 args = append(args, message) 46 } 47 48 command := exec.Command("git", args...) 49 if opts.Project != "" { 50 command.Dir = opts.Project 51 } 52 53 combinedOutput, err := command.CombinedOutput() 54 if err != nil { 55 return "", fmt.Errorf("%s: %s", err, combinedOutput) 56 } 57 58 return strings.TrimSpace(string(combinedOutput)), nil 59 }