func findCurrentBranch(repo vcs.Repo) string { msg.Debug("Attempting to find current branch for %s", repo.Remote()) // Svn and Bzr don't have default branches. if repo.Vcs() == vcs.Svn || repo.Vcs() == vcs.Bzr { return "" } if repo.Vcs() == vcs.Git || repo.Vcs() == vcs.Hg { ver, err := repo.Current() if err != nil { msg.Debug("Unable to find current branch for %s, error: %s", repo.Remote(), err) return "" } return ver } return "" }
// From a local repo find out the current branch name if there is one. func findCurrentBranch(repo v.Repo) string { Debug("Attempting to find current branch for %s", repo.Remote()) // Svn and Bzr don't have default branches. if repo.Vcs() == v.Svn || repo.Vcs() == v.Bzr { return "" } if repo.Vcs() == v.Git { c := exec.Command("git", "symbolic-ref", "--short", "HEAD") c.Dir = repo.LocalPath() c.Env = envForDir(c.Dir) out, err := c.CombinedOutput() if err != nil { Debug("Unable to find current branch for %s, error: %s", repo.Remote(), err) return "" } return strings.TrimSpace(string(out)) } if repo.Vcs() == v.Hg { c := exec.Command("hg", "branch") c.Dir = repo.LocalPath() c.Env = envForDir(c.Dir) out, err := c.CombinedOutput() if err != nil { Debug("Unable to find current branch for %s, error: %s", repo.Remote(), err) return "" } return strings.TrimSpace(string(out)) } return "" }
// Some repos will have multiple branches in them (e.g. Git) while others // (e.g. Svn) will not. // TODO(mattfarina): Add API calls to github, bitbucket, etc. func defaultBranch(repo v.Repo, home string) string { // Svn and Bzr use different locations (paths or entire locations) // for branches so we won't have a default branch. if repo.Vcs() == v.Svn || repo.Vcs() == v.Bzr { return "" } // Check the cache for a value. key, kerr := cacheCreateKey(repo.Remote()) var d cacheRepoInfo if kerr == nil { d, err := cacheRepoData(key, home) if err == nil { if d.DefaultBranch != "" { return d.DefaultBranch } } } // If we don't have it in the store try some APIs r := repo.Remote() u, err := url.Parse(r) if err != nil { return "" } if u.Scheme == "" { // Where there is no scheme we try urls like [email protected]:foo/bar r = strings.Replace(r, ":", "/", -1) r = "ssh://" + r u, err = url.Parse(r) if err != nil { return "" } u.Scheme = "" } if u.Host == "github.com" { parts := strings.Split(u.Path, "/") if len(parts) != 2 { return "" } api := fmt.Sprintf("https://api.github.com/repos/%s/%s", parts[0], parts[1]) resp, err := http.Get(api) if err != nil { return "" } defer resp.Body.Close() if resp.StatusCode >= 300 || resp.StatusCode < 200 { return "" } body, err := ioutil.ReadAll(resp.Body) var data interface{} err = json.Unmarshal(body, &data) if err != nil { return "" } gh := data.(map[string]interface{}) db := gh["default_branch"].(string) if kerr == nil { d.DefaultBranch = db saveCacheRepoData(key, d, home) } return db } if u.Host == "bitbucket.org" { parts := strings.Split(u.Path, "/") if len(parts) != 2 { return "" } api := fmt.Sprintf("https://bitbucket.org/api/1.0/repositories/%s/%s/main-branch/", parts[0], parts[1]) resp, err := http.Get(api) if err != nil { return "" } defer resp.Body.Close() if resp.StatusCode >= 300 || resp.StatusCode < 200 { return "" } body, err := ioutil.ReadAll(resp.Body) var data interface{} err = json.Unmarshal(body, &data) if err != nil { return "" } bb := data.(map[string]interface{}) db := bb["name"].(string) if kerr == nil { d.DefaultBranch = db saveCacheRepoData(key, d, home) } return db } return "" }