ab20caeec1
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.
133 lines
3.2 KiB
Go
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
|
|
}
|