2013-05-29 22:58:46 +04:00
|
|
|
package git
|
2013-04-22 07:36:21 +04:00
|
|
|
|
|
|
|
import (
|
2013-05-24 09:41:06 +04:00
|
|
|
"errors"
|
2013-04-29 00:41:45 +04:00
|
|
|
"fmt"
|
2013-05-29 22:58:46 +04:00
|
|
|
"github.com/jingweno/gh/cmd"
|
2013-04-24 14:00:45 +04:00
|
|
|
"path/filepath"
|
2013-04-22 07:36:21 +04:00
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
2013-05-29 22:58:46 +04:00
|
|
|
func Version() (string, error) {
|
2013-06-25 01:40:05 +04:00
|
|
|
output, err := execGitCmd("version")
|
2013-05-28 22:05:10 +04:00
|
|
|
if err != nil {
|
2013-05-29 00:14:40 +04:00
|
|
|
return "", errors.New("Can't load git version")
|
2013-05-28 22:05:10 +04:00
|
|
|
}
|
2013-05-28 21:52:27 +04:00
|
|
|
|
2013-05-29 00:14:40 +04:00
|
|
|
return output[0], nil
|
2013-05-28 21:52:27 +04:00
|
|
|
}
|
|
|
|
|
2013-05-29 22:58:46 +04:00
|
|
|
func Dir() (string, error) {
|
2013-06-25 01:40:05 +04:00
|
|
|
output, err := execGitCmd("rev-parse", "-q", "--git-dir")
|
2013-04-24 14:00:45 +04:00
|
|
|
if err != nil {
|
2013-05-29 00:14:40 +04:00
|
|
|
return "", errors.New("Not a git repository (or any of the parent directories): .git")
|
2013-04-24 14:00:45 +04:00
|
|
|
}
|
|
|
|
|
2013-05-24 09:41:06 +04:00
|
|
|
gitDir := output[0]
|
|
|
|
gitDir, err = filepath.Abs(gitDir)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
return gitDir, nil
|
2013-04-22 07:36:21 +04:00
|
|
|
}
|
|
|
|
|
2013-05-29 22:58:46 +04:00
|
|
|
func PullReqMsgFile() (string, error) {
|
|
|
|
gitDir, err := Dir()
|
2013-05-28 23:42:11 +04:00
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
return filepath.Join(gitDir, "PULLREQ_EDITMSG"), nil
|
|
|
|
}
|
|
|
|
|
2013-05-29 22:58:46 +04:00
|
|
|
func Editor() (string, error) {
|
2013-06-25 01:40:05 +04:00
|
|
|
output, err := execGitCmd("var", "GIT_EDITOR")
|
2013-05-24 09:41:06 +04:00
|
|
|
if err != nil {
|
2013-05-29 00:14:40 +04:00
|
|
|
return "", errors.New("Can't load git var: GIT_EDITOR")
|
2013-05-24 09:41:06 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
return output[0], nil
|
2013-04-22 07:36:21 +04:00
|
|
|
}
|
|
|
|
|
2013-12-06 22:50:19 +04:00
|
|
|
func Head() (string, error) {
|
2013-07-06 17:29:04 +04:00
|
|
|
output, err := execGitCmd("symbolic-ref", "-q", "HEAD")
|
2013-05-24 09:41:06 +04:00
|
|
|
if err != nil {
|
2013-12-06 22:50:19 +04:00
|
|
|
return "", errors.New("Can't load git HEAD")
|
2013-05-24 09:41:06 +04:00
|
|
|
}
|
|
|
|
|
2013-12-06 22:50:19 +04:00
|
|
|
return output[0], nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func SymbolicFullName(name string) (string, error) {
|
|
|
|
output, err := execGitCmd("rev-parse", "--symbolic-full-name", name)
|
|
|
|
if err != nil {
|
|
|
|
return "", errors.New("Unknown revision or path not in the working tree: " + name)
|
|
|
|
}
|
|
|
|
|
|
|
|
return output[0], nil
|
2013-04-22 07:36:21 +04:00
|
|
|
}
|
|
|
|
|
2013-05-29 22:58:46 +04:00
|
|
|
func Ref(ref string) (string, error) {
|
2013-06-25 01:40:05 +04:00
|
|
|
output, err := execGitCmd("rev-parse", "-q", ref)
|
2013-05-29 21:15:43 +04:00
|
|
|
if err != nil {
|
|
|
|
return "", errors.New("Unknown revision or path not in the working tree: " + ref)
|
|
|
|
}
|
|
|
|
|
|
|
|
return output[0], nil
|
|
|
|
}
|
|
|
|
|
2013-12-02 20:28:47 +04:00
|
|
|
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 {
|
2013-12-06 22:50:19 +04:00
|
|
|
return []string{}, fmt.Errorf("Can't load rev-list for %s", ref)
|
2013-12-02 20:28:47 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
return output, nil
|
|
|
|
}
|
|
|
|
|
2013-12-02 20:51:45 +04:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2013-05-29 22:58:46 +04:00
|
|
|
func Log(sha1, sha2 string) (string, error) {
|
|
|
|
execCmd := cmd.New("git")
|
2013-04-29 00:41:45 +04:00
|
|
|
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)
|
|
|
|
|
2013-04-29 05:47:08 +04:00
|
|
|
outputs, err := execCmd.ExecOutput()
|
2013-04-29 00:41:45 +04:00
|
|
|
if err != nil {
|
2013-05-29 00:14:40 +04:00
|
|
|
return "", errors.New("Can't load git log " + sha1 + ".." + sha2)
|
2013-04-29 00:41:45 +04:00
|
|
|
}
|
|
|
|
|
2013-05-24 09:41:06 +04:00
|
|
|
return outputs, nil
|
2013-04-29 00:41:45 +04:00
|
|
|
}
|
|
|
|
|
2013-06-29 02:15:41 +04:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2013-12-04 19:08:52 +04:00
|
|
|
func Alias(name string) (string, error) {
|
|
|
|
return Config(fmt.Sprintf("alias.%s", name))
|
|
|
|
}
|
|
|
|
|
2013-06-25 01:40:05 +04:00
|
|
|
func Spawn(command string, args ...string) error {
|
2013-06-22 05:02:29 +04:00
|
|
|
cmd := cmd.New("git")
|
2013-06-25 01:40:05 +04:00
|
|
|
cmd.WithArg(command)
|
2013-06-22 05:02:29 +04:00
|
|
|
for _, a := range args {
|
|
|
|
cmd.WithArg(a)
|
|
|
|
}
|
|
|
|
|
2013-09-23 04:51:37 +04:00
|
|
|
return cmd.Exec()
|
2013-06-22 05:02:29 +04:00
|
|
|
}
|
|
|
|
|
2013-06-25 01:40:05 +04:00
|
|
|
func execGitCmd(input ...string) (outputs []string, err error) {
|
2013-05-29 22:58:46 +04:00
|
|
|
cmd := cmd.New("git")
|
2013-04-30 06:45:57 +04:00
|
|
|
for _, i := range input {
|
|
|
|
cmd.WithArg(i)
|
|
|
|
}
|
2013-04-22 07:36:21 +04:00
|
|
|
|
2013-04-30 06:45:57 +04:00
|
|
|
out, err := cmd.ExecOutput()
|
|
|
|
for _, line := range strings.Split(out, "\n") {
|
2013-12-02 20:51:45 +04:00
|
|
|
line = strings.TrimSpace(line)
|
|
|
|
if line != "" {
|
|
|
|
outputs = append(outputs, string(line))
|
|
|
|
}
|
2013-04-22 07:36:21 +04:00
|
|
|
}
|
|
|
|
|
2013-06-25 00:43:59 +04:00
|
|
|
return outputs, err
|
2013-04-22 07:36:21 +04:00
|
|
|
}
|