Add GetRemotes functionalities

Sladyn created

Change summary

cache/repo_cache.go     |  7 ++++++-
repository/git.go       | 22 ++++++++++++++++++++++
repository/mock_repo.go |  7 +++++++
repository/repo.go      |  3 +++
4 files changed, 38 insertions(+), 1 deletion(-)

Detailed changes

cache/repo_cache.go 🔗

@@ -104,11 +104,16 @@ func (c *RepoCache) GetPath() string {
 	return c.repo.GetPath()
 }
 
-// GetPath returns the path to the repo.
+// GetCoreEditor returns the name of the editor that the user has used to configure git.
 func (c *RepoCache) GetCoreEditor() (string, error) {
 	return c.repo.GetCoreEditor()
 }
 
+// GetRemotes returns the configured remotes repositories.
+func (c *RepoCache) GetRemotes() (map[string]string, error) {
+	return c.repo.GetRemotes()
+}
+
 // GetUserName returns the name the the user has used to configure git
 func (c *RepoCache) GetUserName() (string, error) {
 	return c.repo.GetUserName()

repository/git.go 🔗

@@ -162,6 +162,28 @@ func (repo *GitRepo) GetCoreEditor() (string, error) {
 	return repo.runGitCommand("var", "GIT_EDITOR")
 }
 
+// GetRemotes returns the configured remotes repositories.
+func (repo *GitRepo) GetRemotes() (map[string]string, error) {
+	stdout, err := repo.runGitCommand("remote", "--verbose")
+	if err != nil {
+		return nil, err
+	}
+
+	lines := strings.Split(stdout, "\n")
+	remotes := make(map[string]string, len(lines))
+
+	for _, line := range lines {
+		elements := strings.Fields(line)
+		if len(elements) != 3 {
+			return nil, fmt.Errorf("unexpected output format: %s", line)
+		}
+
+		remotes[elements[0]] = elements[1]
+	}
+
+	return remotes, nil
+}
+
 // StoreConfig store a single key/value pair in the config of the repo
 func (repo *GitRepo) StoreConfig(key string, value string) error {
 	_, err := repo.runGitCommand("config", "--replace-all", key, value)

repository/mock_repo.go 🔗

@@ -59,6 +59,13 @@ func (r *mockRepoForTest) GetCoreEditor() (string, error) {
 	return "vi", nil
 }
 
+// GetRemotes returns the configured remotes repositories.
+func (r *mockRepoForTest) GetRemotes() (map[string]string, error) {
+	return map[string]string{
+		"origin": "git://github.com/MichaelMure/git-bug",
+	}, nil
+}
+
 func (r *mockRepoForTest) StoreConfig(key string, value string) error {
 	r.config[key] = value
 	return nil

repository/repo.go 🔗

@@ -27,6 +27,9 @@ type RepoCommon interface {
 	// GetCoreEditor returns the name of the editor that the user has used to configure git.
 	GetCoreEditor() (string, error)
 
+	// GetRemotes returns the configured remotes repositories.
+	GetRemotes() (map[string]string, error)
+
 	// StoreConfig store a single key/value pair in the config of the repo
 	StoreConfig(key string, value string) error