github.com/goreleaser/goreleaser@v1.25.1/internal/git/git.go (about)

     1  // Package git provides an integration with the git command
     2  package git
     3  
     4  import (
     5  	"bytes"
     6  	"context"
     7  	"errors"
     8  	"os/exec"
     9  	"strings"
    10  
    11  	"github.com/caarlos0/log"
    12  )
    13  
    14  // IsRepo returns true if current folder is a git repository.
    15  func IsRepo(ctx context.Context) bool {
    16  	out, err := Run(ctx, "rev-parse", "--is-inside-work-tree")
    17  	return err == nil && strings.TrimSpace(out) == "true"
    18  }
    19  
    20  func RunWithEnv(ctx context.Context, env []string, args ...string) (string, error) {
    21  	extraArgs := []string{
    22  		"-c", "log.showSignature=false",
    23  	}
    24  	args = append(extraArgs, args...)
    25  	/* #nosec */
    26  	cmd := exec.CommandContext(ctx, "git", args...)
    27  
    28  	stdout := bytes.Buffer{}
    29  	stderr := bytes.Buffer{}
    30  
    31  	cmd.Stdout = &stdout
    32  	cmd.Stderr = &stderr
    33  	cmd.Env = append(cmd.Env, env...)
    34  
    35  	err := cmd.Run()
    36  
    37  	log.WithField("args", args).
    38  		WithField("stdout", strings.TrimSpace(stdout.String())).
    39  		WithField("stderr", strings.TrimSpace(stderr.String())).
    40  		Debug("git command result")
    41  
    42  	if err != nil {
    43  		return "", errors.New(stderr.String())
    44  	}
    45  
    46  	return stdout.String(), nil
    47  }
    48  
    49  // Run runs a git command and returns its output or errors.
    50  func Run(ctx context.Context, args ...string) (string, error) {
    51  	return RunWithEnv(ctx, []string{}, args...)
    52  }
    53  
    54  // Clean the output.
    55  func Clean(output string, err error) (string, error) {
    56  	output = strings.ReplaceAll(strings.Split(output, "\n")[0], "'", "")
    57  	if err != nil {
    58  		err = errors.New(strings.TrimSuffix(err.Error(), "\n"))
    59  	}
    60  	return output, err
    61  }
    62  
    63  // CleanAllLines returns all the non empty lines of the output, cleaned up.
    64  func CleanAllLines(output string, err error) ([]string, error) {
    65  	var result []string
    66  	for _, line := range strings.Split(output, "\n") {
    67  		l := strings.TrimSpace(strings.ReplaceAll(line, "'", ""))
    68  		if l == "" {
    69  			continue
    70  		}
    71  		result = append(result, l)
    72  	}
    73  	// TODO: maybe check for exec.ExitError only?
    74  	if err != nil {
    75  		err = errors.New(strings.TrimSuffix(err.Error(), "\n"))
    76  	}
    77  	return result, err
    78  }