Monorepo for Tangled
tangled.org
1package git
2
3import (
4 "bytes"
5 "fmt"
6 "io"
7 "os/exec"
8 "strings"
9)
10
11const (
12 fieldSeparator = "\x1f" // ASCII Unit Separator
13 recordSeparator = "\x1e" // ASCII Record Separator
14)
15
16func (g *GitRepo) runGitCmd(command string, extraArgs ...string) ([]byte, error) {
17 var args []string
18 args = append(args, command)
19 args = append(args, extraArgs...)
20
21 cmd := exec.Command("git", args...)
22 cmd.Dir = g.path
23
24 out, err := cmd.Output()
25 if err != nil {
26 if exitErr, ok := err.(*exec.ExitError); ok {
27 return nil, fmt.Errorf("%w, stderr: %s", err, string(exitErr.Stderr))
28 }
29 return nil, err
30 }
31
32 return out, nil
33}
34
35func (g *GitRepo) revList(extraArgs ...string) ([]byte, error) {
36 return g.runGitCmd("rev-list", extraArgs...)
37}
38
39func (g *GitRepo) forEachRef(extraArgs ...string) ([]byte, error) {
40 return g.runGitCmd("for-each-ref", extraArgs...)
41}
42
43func (g *GitRepo) revParse(extraArgs ...string) ([]byte, error) {
44 return g.runGitCmd("rev-parse", extraArgs...)
45}
46
47func (g *GitRepo) mergeBase(extraArgs ...string) ([]byte, error) {
48 return g.runGitCmd("merge-base", extraArgs...)
49}
50
51func (g *GitRepo) WriteArchive(w io.Writer, format string, prefix string) error {
52 args := []string{"archive", "--format=" + format}
53 if prefix != "" {
54 args = append(args, "--prefix="+strings.TrimRight(prefix, "/")+"/")
55 }
56 args = append(args, g.h.String())
57
58 cmd := exec.Command("git", args...)
59 cmd.Dir = g.path
60 cmd.Stdout = w
61 stderr := new(bytes.Buffer)
62 cmd.Stderr = stderr
63
64 if err := cmd.Run(); err != nil {
65 return fmt.Errorf("%w, stderr: %s", err, stderr.String())
66 }
67
68 return nil
69}