@@ -8,6 +8,7 @@ import (
)
const BugsRefPattern = "refs/bugs/"
+const BugsRemoteRefPattern = "refs/remote/%s/bugs/"
// Bug hold the data of a bug thread, organized in a way close to
// how it will be persisted inside Git. This is the datastructure
@@ -17,7 +17,7 @@ func pull(repo repository.Repo, args []string) error {
remote = args[0]
}
- if err := repo.PullRefs(remote, bug.BugsRefPattern+"*"); err != nil {
+ if err := repo.PullRefs(remote, bug.BugsRefPattern+"*", bug.BugsRemoteRefPattern+"*"); err != nil {
return err
}
return nil
@@ -7,6 +7,7 @@ import (
"fmt"
"github.com/MichaelMure/git-bug/util"
"io"
+ "os"
"os/exec"
"strings"
)
@@ -58,6 +59,11 @@ func (repo *GitRepo) runGitCommand(args ...string) (string, error) {
return repo.runGitCommandWithStdin(nil, args...)
}
+// Run the given git command using the same stdin, stdout, and stderr as the review tool.
+func (repo *GitRepo) runGitCommandInline(args ...string) error {
+ return repo.runGitCommandWithIO(os.Stdin, os.Stdout, os.Stderr, args...)
+}
+
// NewGitRepo determines if the given working directory is inside of a git repository,
// and returns the corresponding GitRepo instance if it is.
func NewGitRepo(path string) (*GitRepo, error) {
@@ -99,9 +105,14 @@ func (repo *GitRepo) GetCoreEditor() (string, error) {
}
// PullRefs pull git refs from a remote
-func (repo *GitRepo) PullRefs(remote string, refPattern string) error {
- fetchRefSpec := fmt.Sprintf("+%s:%s", refPattern, refPattern)
- _, err := repo.runGitCommand("fetch", remote, fetchRefSpec)
+func (repo *GitRepo) PullRefs(remote, refPattern, remoteRefPattern string) error {
+ remoteRefSpec := fmt.Sprintf(remoteRefPattern, remote)
+ fetchRefSpec := fmt.Sprintf("%s:%s", refPattern, remoteRefSpec)
+ err := repo.runGitCommandInline("fetch", remote, fetchRefSpec)
+
+ if err != nil {
+ return fmt.Errorf("failed to pull from the remote '%s': %v", remote, err)
+ }
// TODO: merge new data
@@ -112,7 +123,8 @@ func (repo *GitRepo) PullRefs(remote string, refPattern string) error {
func (repo *GitRepo) PushRefs(remote string, refPattern string) error {
// The push is liable to fail if the user forgot to do a pull first, so
// we treat errors as user errors rather than fatal errors.
- _, err := repo.runGitCommand("push", remote, refPattern)
+ err := repo.runGitCommandInline("push", remote, refPattern)
+
if err != nil {
return fmt.Errorf("failed to push to the remote '%s': %v", remote, err)
}
@@ -35,7 +35,7 @@ func (r *mockRepoForTest) PushRefs(remote string, refPattern string) error {
return nil
}
-func (r *mockRepoForTest) PullRefs(remote string, refPattern string) error {
+func (r *mockRepoForTest) PullRefs(remote string, refPattern string, remoteRefPattern string) error {
return nil
}
@@ -18,7 +18,7 @@ type Repo interface {
GetCoreEditor() (string, error)
// PullRefs pull git refs from a remote
- PullRefs(remote string, refPattern string) error
+ PullRefs(remote string, refPattern string, remoteRefPattern string) error
// PushRefs push git refs to a remote
PushRefs(remote string, refPattern string) error