예제 #1
0
파일: git.go 프로젝트: pib/goat
func Git(depdir string, dep *Dependency) error {
	localloc := filepath.Join(depdir, "src", dep.Path)

	if _, err := os.Stat(localloc); os.IsNotExist(err) {
		fmt.Println("git", "clone", dep.Location, localloc)
		err := exec.PipedCmd("git", "clone", dep.Location, localloc)
		if err != nil {
			return err
		}
	} else {
		fmt.Println(localloc, "exists")
	}

	origcwd, err := os.Getwd()
	if err != nil {
		return err
	}

	err = os.Chdir(localloc)
	if err != nil {
		return err
	}
	defer os.Chdir(origcwd)

	fmt.Println("git", "fetch", "-pv", "--all")
	err = exec.PipedCmd("git", "fetch", "-pv", "--all")
	if err != nil {
		return err
	}

	if dep.Reference == "" {
		dep.Reference = "master"
	}
	if exists, err := originBranchExists(dep.Reference); err != nil {
		return err
	} else if exists {
		dep.Reference = "origin/" + dep.Reference
	}
	fmt.Println("git", "checkout", dep.Reference)
	stdout, stderr, err := exec.TrimmedCmd("git", "checkout", dep.Reference)
	if err != nil {
		return err
	}
	if stdout != "" {
		fmt.Println(stdout)
	}
	// Moving to a 'detached HEAD' state causes git to output a huge explanation
	// to stderr.  We only want the last line.
	lines := strings.Split(stderr, "\n")
	fmt.Println(lines[len(lines)-1])

	fmt.Println("git", "clean", "-f", "-d")
	err = exec.PipedCmd("git", "clean", "-f", "-d")

	return err

}
예제 #2
0
파일: git.go 프로젝트: pib/goat
// If 'origin/branch' exists, return true.
func originBranchExists(branch string) (bool, error) {
	fmt.Println("git", "branch", "-r")
	branches, _, err := exec.TrimmedCmd("git", "branch", "-r")
	if err != nil {
		return false, err
	}
	for _, b := range strings.Split(branches, "\n") {
		b := strings.TrimSpace(b)
		if strings.HasSuffix(b, "origin/"+branch) {
			return true, nil
		}
	}
	return false, nil
}