git-lfs/git/git.go
Artem V. Navrotskiy ab20caeec1 Windows: hide git application window.
Original problem (https://code.google.com/p/tortoisegit/issues/detail?id=2518):

 1. Install Git LFS (https://git-lfs.github.com/)
   * Download and unpack archive;
   * Put git-lfs.exe on any avaialble in PATH directory;
   * Run "git lfs init"
 2. Clone repository from: https://github.com/bozaro/test
 3. Change image "tux.png"
 4. Show "Git Commit" window

On showing "Git Commit" window you will see black window blink for each changed LFS file (twice in this case).

You also will see black window blink on refreshing change list by F5 key.
2015-06-17 13:14:36 +03:00

133 lines
3.2 KiB
Go

// Package git contains various commands that shell out to git
package git
import (
"errors"
"fmt"
"os"
"os/exec"
"strings"
"github.com/github/git-lfs/vendor/_nuts/github.com/rubyist/tracerx"
)
func LsRemote(remote, remoteRef string) (string, error) {
if remote == "" {
return "", errors.New("remote required")
}
if remoteRef == "" {
return simpleExec("git", "ls-remote", remote)
}
return simpleExec("git", "ls-remote", remote, remoteRef)
}
func ResolveRef(ref string) (string, error) {
return simpleExec("git", "rev-parse", ref)
}
func CurrentRef() (string, error) {
return ResolveRef("HEAD")
}
func CurrentBranch() (string, error) {
return simpleExec("git", "rev-parse", "--abbrev-ref", "HEAD")
}
func CurrentRemoteRef() (string, error) {
remote, err := CurrentRemote()
if err != nil {
return "", err
}
return ResolveRef(remote)
}
func CurrentRemote() (string, error) {
branch, err := CurrentBranch()
if err != nil {
return "", err
}
if branch == "HEAD" {
return "", errors.New("not on a branch")
}
remote := Config.Find(fmt.Sprintf("branch.%s.remote", branch))
if remote == "" {
return "", errors.New("remote not found")
}
return remote + "/" + branch, nil
}
func UpdateIndex(file string) error {
_, err := simpleExec("git", "update-index", "-q", "--refresh", file)
return err
}
type gitConfig struct {
}
var Config = &gitConfig{}
// Find returns the git config value for the key
func (c *gitConfig) Find(val string) string {
output, _ := simpleExec("git", "config", val)
return output
}
// SetGlobal sets the git config value for the key in the global config
func (c *gitConfig) SetGlobal(key, val string) {
simpleExec("git", "config", "--global", "--add", key, val)
}
// UnsetGlobal removes the git config value for the key from the global config
func (c *gitConfig) UnsetGlobal(key string) {
simpleExec("git", "config", "--global", "--unset", key)
}
// SetLocal sets the git config value for the key in the specified config file
func (c *gitConfig) SetLocal(file, key, val string) {
simpleExec("git", "config", "--file", file, "--add", key, val)
}
// UnsetLocalKey removes the git config value for the key from the specified config file
func (c *gitConfig) UnsetLocalKey(file, key string) {
simpleExec("git", "config", "--file", file, "--unset", key)
}
// List lists all of the git config values
func (c *gitConfig) List() (string, error) {
return simpleExec("git", "config", "-l")
}
// ListFromFile lists all of the git config values in the given config file
func (c *gitConfig) ListFromFile(f string) (string, error) {
if _, err := os.Stat(f); os.IsNotExist(err) {
return "", nil
}
return simpleExec("git", "config", "-l", "-f", f)
}
// Version returns the git version
func (c *gitConfig) Version() (string, error) {
return simpleExec("git", "version")
}
// simpleExec is a small wrapper around os/exec.Command.
func simpleExec(name string, args ...string) (string, error) {
tracerx.Printf("run_command: '%s' %s", name, strings.Join(args, " "))
cmd := execCommand(name, args...)
output, err := cmd.Output()
if _, ok := err.(*exec.ExitError); ok {
return "", nil
}
if err != nil {
return fmt.Sprintf("Error running %s %s", name, args), err
}
return strings.Trim(string(output), " \n"), nil
}