Skip to content

Commit 022af0b

Browse files
committed
permit adding fork that already exists
1 parent ea545a7 commit 022af0b

File tree

1 file changed

+33
-5
lines changed

1 file changed

+33
-5
lines changed

pkg/gui/controllers/remotes_controller.go

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package controllers
33
import (
44
"fmt"
55
"regexp"
6+
"slices"
67
"strings"
78

89
"github.com/jesseduffield/gocui"
@@ -142,9 +143,11 @@ func (self *RemotesController) enter(remote *models.Remote) error {
142143
return nil
143144
}
144145

145-
func (self *RemotesController) addRemoteHelper(remoteName string, remoteUrl string, branchToCheckout string) error {
146+
// add remote and refresh the remotes list
147+
func (self *RemotesController) addRemote(remoteName string, remoteUrl string) error {
146148
self.c.LogAction(self.c.Tr.Actions.AddRemote)
147-
if err := self.c.Git().Remote.AddRemote(remoteName, remoteUrl); err != nil {
149+
err := self.c.Git().Remote.AddRemote(remoteName, remoteUrl)
150+
if err != nil {
148151
return err
149152
}
150153

@@ -155,19 +158,44 @@ func (self *RemotesController) addRemoteHelper(remoteName string, remoteUrl stri
155158
Scope: []types.RefreshableView{types.REMOTES},
156159
Mode: types.SYNC,
157160
})
161+
return nil
162+
}
158163

159-
// Select the new remote
164+
func (self *RemotesController) selectRemoteAndCheckout(remoteName string, remoteUrl string, branchToCheckout string) error {
165+
// Select the remote
160166
for idx, remote := range self.c.Model().Remotes {
161167
if remote.Name == remoteName {
162168
self.c.Contexts().Remotes.SetSelection(idx)
163169
break
164170
}
165171
}
166172

167-
// Fetch the new remote
173+
// Fetch the remote
168174
return self.fetchAndCheckout(self.c.Contexts().Remotes.GetSelected(), branchToCheckout)
169175
}
170176

177+
// add remote, then refresh and select it, and then fetch it and checkout the given branch if applicable
178+
func (self *RemotesController) addRemoteHelper(remoteName string, remoteUrl string, branchToCheckout string) error {
179+
self.addRemote(remoteName, remoteUrl)
180+
181+
return self.selectRemoteAndCheckout(remoteName, remoteUrl, branchToCheckout)
182+
}
183+
184+
// the same as addRemoteHelper but we don't error if the remote with the already exists (the remote has to contain the given URL though)
185+
func (self *RemotesController) addForkHelper(remoteName string, remoteUrl string, branchToCheckout string) error {
186+
for idx, remote := range self.c.Model().Remotes {
187+
if remote.Name == remoteName {
188+
hasUrl := slices.Contains(remote.Urls, remoteUrl)
189+
if !hasUrl {
190+
return fmt.Errorf("a remote named '%s' already exists with a different URL", remoteName)
191+
}
192+
self.c.Contexts().Remotes.SetSelection(idx)
193+
return self.fetchAndCheckout(remote, branchToCheckout)
194+
}
195+
}
196+
return self.addRemoteHelper(remoteName, remoteUrl, branchToCheckout)
197+
}
198+
171199
func (self *RemotesController) add() error {
172200
self.c.Prompt(types.PromptOpts{
173201
Title: self.c.Tr.NewRemoteName,
@@ -236,7 +264,7 @@ func (self *RemotesController) addFork(baseRemote *models.Remote) error {
236264
return err
237265
}
238266

239-
return self.addRemoteHelper(forkUsername, remoteUrl, branchToCheckout)
267+
return self.addForkHelper(forkUsername, remoteUrl, branchToCheckout)
240268
},
241269
})
242270

0 commit comments

Comments
 (0)