git.go 3.0 KB
Newer Older
1
package git
J
Jingwen Owen Ou 已提交
2 3

import (
4
	"errors"
J
Jingwen Owen Ou 已提交
5
	"fmt"
6
	"github.com/jingweno/gh/cmd"
J
Jingwen Owen Ou 已提交
7
	"path/filepath"
J
Jingwen Owen Ou 已提交
8 9 10
	"strings"
)

11
func Version() (string, error) {
J
Jingwen Owen Ou 已提交
12
	output, err := execGitCmd("version")
J
Jingwen Owen Ou 已提交
13
	if err != nil {
J
Jingwen Owen Ou 已提交
14
		return "", errors.New("Can't load git version")
J
Jingwen Owen Ou 已提交
15
	}
J
Jingwen Owen Ou 已提交
16

J
Jingwen Owen Ou 已提交
17
	return output[0], nil
J
Jingwen Owen Ou 已提交
18 19
}

20
func Dir() (string, error) {
J
Jingwen Owen Ou 已提交
21
	output, err := execGitCmd("rev-parse", "-q", "--git-dir")
J
Jingwen Owen Ou 已提交
22
	if err != nil {
J
Jingwen Owen Ou 已提交
23
		return "", errors.New("Not a git repository (or any of the parent directories): .git")
J
Jingwen Owen Ou 已提交
24 25
	}

26 27 28 29 30 31 32
	gitDir := output[0]
	gitDir, err = filepath.Abs(gitDir)
	if err != nil {
		return "", err
	}

	return gitDir, nil
J
Jingwen Owen Ou 已提交
33 34
}

35 36
func PullReqMsgFile() (string, error) {
	gitDir, err := Dir()
J
Jingwen Owen Ou 已提交
37 38 39 40 41 42 43
	if err != nil {
		return "", err
	}

	return filepath.Join(gitDir, "PULLREQ_EDITMSG"), nil
}

44
func Editor() (string, error) {
J
Jingwen Owen Ou 已提交
45
	output, err := execGitCmd("var", "GIT_EDITOR")
46
	if err != nil {
J
Jingwen Owen Ou 已提交
47
		return "", errors.New("Can't load git var: GIT_EDITOR")
48 49 50
	}

	return output[0], nil
J
Jingwen Owen Ou 已提交
51 52
}

J
Jingwen Owen Ou 已提交
53 54
func Head() (*Branch, error) {
	output, err := execGitCmd("symbolic-ref", "-q", "HEAD")
55
	if err != nil {
J
Jingwen Owen Ou 已提交
56
		return nil, errors.New("Can't load git HEAD")
57 58
	}

J
Jingwen Owen Ou 已提交
59
	return &Branch{output[0]}, nil
J
Jingwen Owen Ou 已提交
60 61
}

62
func Ref(ref string) (string, error) {
J
Jingwen Owen Ou 已提交
63
	output, err := execGitCmd("rev-parse", "-q", ref)
J
Jingwen Owen Ou 已提交
64 65 66 67 68 69 70
	if err != nil {
		return "", errors.New("Unknown revision or path not in the working tree: " + ref)
	}

	return output[0], nil
}

J
Jingwen Owen Ou 已提交
71 72 73 74 75 76 77 78 79 80
func RefList(a, b string) ([]string, error) {
	ref := fmt.Sprintf("%s...%s", a, b)
	output, err := execGitCmd("rev-list", "--cherry-pick", "--right-only", "--no-merges", ref)
	if err != nil {
		return nil, errors.New("Can't load rev-list for %s" + ref)
	}

	return output, nil
}

81 82 83 84 85 86 87 88 89
func Show(sha string) (string, error) {
	output, err := execGitCmd("show", "-s", "--format=%w(78,0,0)%s%+b", sha)
	if err != nil {
		return "", errors.New("Can't show commit for %s" + sha)
	}

	return output[0], nil
}

90 91
func Log(sha1, sha2 string) (string, error) {
	execCmd := cmd.New("git")
J
Jingwen Owen Ou 已提交
92 93 94 95 96 97
	execCmd.WithArg("log").WithArg("--no-color")
	execCmd.WithArg("--format=%h (%aN, %ar)%n%w(78,3,3)%s%n%+b")
	execCmd.WithArg("--cherry")
	shaRange := fmt.Sprintf("%s...%s", sha1, sha2)
	execCmd.WithArg(shaRange)

J
Jingwen Owen Ou 已提交
98
	outputs, err := execCmd.ExecOutput()
J
Jingwen Owen Ou 已提交
99
	if err != nil {
J
Jingwen Owen Ou 已提交
100
		return "", errors.New("Can't load git log " + sha1 + ".." + sha2)
J
Jingwen Owen Ou 已提交
101 102
	}

103
	return outputs, nil
J
Jingwen Owen Ou 已提交
104 105
}

J
Jingwen Owen Ou 已提交
106 107 108 109 110 111 112 113 114
func Config(name string) (string, error) {
	output, err := execGitCmd("config", name)
	if err != nil {
		return "", fmt.Errorf("Unknown config %s", name)
	}

	return output[0], nil
}

115 116 117 118
func Alias(name string) (string, error) {
	return Config(fmt.Sprintf("alias.%s", name))
}

J
Jingwen Owen Ou 已提交
119
func Spawn(command string, args ...string) error {
120
	cmd := cmd.New("git")
J
Jingwen Owen Ou 已提交
121
	cmd.WithArg(command)
122 123 124 125
	for _, a := range args {
		cmd.WithArg(a)
	}

126
	return cmd.Exec()
127 128
}

J
Jingwen Owen Ou 已提交
129
func execGitCmd(input ...string) (outputs []string, err error) {
130
	cmd := cmd.New("git")
J
Jingwen Owen Ou 已提交
131 132 133
	for _, i := range input {
		cmd.WithArg(i)
	}
J
Jingwen Owen Ou 已提交
134

J
Jingwen Owen Ou 已提交
135 136
	out, err := cmd.ExecOutput()
	for _, line := range strings.Split(out, "\n") {
137 138 139 140
		line = strings.TrimSpace(line)
		if line != "" {
			outputs = append(outputs, string(line))
		}
J
Jingwen Owen Ou 已提交
141 142
	}

J
Jingwen Owen Ou 已提交
143
	return outputs, err
J
Jingwen Owen Ou 已提交
144
}