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  }