summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2019-11-16 16:00:47 +1100
committerJesse Duffield <jessedduffield@gmail.com>2019-11-21 21:15:05 +1100
commit03ceb0b1bab39ddf321bedf16ad754ce7ae75bfd (patch)
treedbc0ca0823c745950d113678b0379662e914827b
parent3ea79ef4e14c2cd737d2aadcc4c3ce47bb7a414c (diff)
get remote branches when getting remotes
-rw-r--r--pkg/commands/branch.go1
-rw-r--r--pkg/commands/git.go37
-rw-r--r--pkg/commands/loading_remotes.go70
3 files changed, 71 insertions, 37 deletions
diff --git a/pkg/commands/branch.go b/pkg/commands/branch.go
index d1cafdfb4..b6821c8a7 100644
--- a/pkg/commands/branch.go
+++ b/pkg/commands/branch.go
@@ -17,6 +17,7 @@ type Branch struct {
Recency string
Pushables string
Pullables string
+ Hash string
Selected bool
}
diff --git a/pkg/commands/git.go b/pkg/commands/git.go
index 55f8dddb9..ad275d10f 100644
--- a/pkg/commands/git.go
+++ b/pkg/commands/git.go
@@ -1061,40 +1061,3 @@ func (c *GitCommand) BeginInteractiveRebaseForCommit(commits []*Commit, commitIn
func (c *GitCommand) SetUpstreamBranch(upstream string) error {
return c.OSCommand.RunCommand(fmt.Sprintf("git branch -u %s", upstream))
}
-
-func (c *GitCommand) GetRemotes() ([]*Remote, error) {
- goGitRemotes, err := c.Repo.Remotes()
- if err != nil {
- return nil, err
- }
-
- return nil, nil
-
- remotes := make([]*Remote, len(goGitRemotes))
-
- // TODO: consider including the goGitRemote itself
- for i, goGitRemote := range goGitRemotes {
- goGitBranches, err := goGitRemote.List(&gogit.ListOptions{})
- if err != nil {
- c.Log.Warn(err)
- continue
- }
-
- branches := []*Branch{}
- for _, goGitBranch := range goGitBranches {
- // for now we're only getting branch references, not tags/notes/etc
- if goGitBranch.Name().IsBranch() {
- branches = append(branches, &Branch{
- Name: goGitBranch.Name().String(),
- })
- }
- }
-
- remotes[i] = &Remote{
- Name: goGitRemote.Config().Name,
- Urls: goGitRemote.Config().URLs,
- Branches: branches,
- }
- }
- return remotes, nil
-}
diff --git a/pkg/commands/loading_remotes.go b/pkg/commands/loading_remotes.go
new file mode 100644
index 000000000..a90319f47
--- /dev/null
+++ b/pkg/commands/loading_remotes.go
@@ -0,0 +1,70 @@
+package commands
+
+import (
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+func (c *GitCommand) GetBranchesFromDir(dirPath string) ([]*Branch, error) {
+ branches := []*Branch{}
+ err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ // it's possible that go-git is referencing a remote we don't have locally
+ // in which case we'll just swallow this error
+ c.Log.Error(err)
+ return nil
+ }
+
+ if info.IsDir() {
+ return nil
+ }
+
+ // it's a file: we need to get the path and work out the branch name from that
+ fileContents, err := ioutil.ReadFile(path)
+ if err != nil {
+ return err
+ }
+
+ branches = append(branches, &Branch{
+ Name: strings.TrimPrefix(path, dirPath)[1:], // stripping prefix slash
+ Hash: strings.TrimSpace(string(fileContents)),
+ })
+
+ return nil
+ })
+ if err != nil {
+ return nil, err
+ }
+ return branches, nil
+}
+
+func (c *GitCommand) GetRemotes() ([]*Remote, error) {
+ goGitRemotes, err := c.Repo.Remotes()
+ if err != nil {
+ return nil, err
+ }
+
+ // first step is to get our remotes from go-git
+ remotes := make([]*Remote, len(goGitRemotes))
+ for i, goGitRemote := range goGitRemotes {
+ name := goGitRemote.Config().Name
+ c.Log.Warn(name)
+
+ // can't seem to easily get the branches of the remotes from go-git so we'll
+ // traverse the directory recursively
+ branches, err := c.GetBranchesFromDir(filepath.Join(".git", "refs", "remotes", name))
+ if err != nil {
+ return nil, err
+ }
+
+ remotes[i] = &Remote{
+ Name: goGitRemote.Config().Name,
+ Urls: goGitRemote.Config().URLs,
+ Branches: branches,
+ }
+ }
+
+ return remotes, nil
+}