diff --git a/bug/bug.go b/bug/bug.go index 8b5f4be943e209295e133adcabc852d40b9228b9..658d73e1517ead556c7b983a1678f0f31d826901 100644 --- a/bug/bug.go +++ b/bug/bug.go @@ -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 diff --git a/commands/pull.go b/commands/pull.go index b3541c0fa72a03518b18dcc8b3d0bbb77e9ecb28..105fce9ccd2d1241680f40c7e0412eefe3a40562 100644 --- a/commands/pull.go +++ b/commands/pull.go @@ -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 diff --git a/repository/git.go b/repository/git.go index 8c20d0b8a30956410114fffc8b0ab6c12231109e..92c7bb63b64c6fd514c00702e29ae03920ca5065 100644 --- a/repository/git.go +++ b/repository/git.go @@ -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) } diff --git a/repository/mock_repo.go b/repository/mock_repo.go index e747eb24edc9844f535a47393e92e49548c05369..f9b070b431bd860d56571099084a42b604f6271f 100644 --- a/repository/mock_repo.go +++ b/repository/mock_repo.go @@ -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 } diff --git a/repository/repo.go b/repository/repo.go index 3a30128f0e7b42db7b76475f419fb4c74a601759..a58f35d9a142128fe8034babcd89750199cd0511 100644 --- a/repository/repo.go +++ b/repository/repo.go @@ -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