From 38743ec99fafb6b093c1f5d117c9bcaa708dbcde Mon Sep 17 00:00:00 2001 From: Marius Bergmann Date: Sun, 5 Dec 2021 22:52:26 +0100 Subject: Suggest existing remote for non-tracking branch Currently, when pushing or pulling a branch that has no tracking remote, lazygit suggests the (hard-coded) remote named 'origin'. However, a repository might not have a remote with this name, in which case the suggestion makes no sense. This happens to me quite regularly when I choose a more meaningful name than 'origin' for a remote. This change keeps the current behavior by suggesting 'origin' when there is either a remote with that name or no remote at all. However, when 'origin' does not exist, the name of the first remote is suggested. Suggest existing remote for non-tracking branch Currently, when pushing or pulling a branch that has no tracking remote, lazygit suggests the (hard-coded) remote named 'origin'. However, a repository might not have a remote with this name, in which case the suggestion makes no sense. This happens to me quite regularly when I choose a more meaningful name than 'origin' for a remote. This change keeps the current behavior by suggesting 'origin' when there is either a remote with that name or no remote at all. However, when 'origin' does not exist, the name of the first existing remote is suggested. --- pkg/gui/files_panel.go | 22 ++++++++++++++++++++-- pkg/gui/files_panel_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 pkg/gui/files_panel_test.go (limited to 'pkg/gui') diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 3bc600420..a0e71bc20 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -660,9 +660,11 @@ func (gui *Gui) handlePullFiles() error { } } + suggestedRemote := getSuggestedRemote(gui.State.Remotes) + return gui.prompt(promptOpts{ title: gui.Tr.EnterUpstream, - initialContent: "origin/" + currentBranch.Name, + initialContent: suggestedRemote + "/" + currentBranch.Name, findSuggestionsFunc: gui.getRemoteBranchesSuggestionsFunc("/"), handleConfirm: func(upstream string) error { if err := gui.GitCommand.SetUpstreamBranch(upstream); err != nil { @@ -797,12 +799,14 @@ func (gui *Gui) pushFiles() error { ) } + suggestedRemote := getSuggestedRemote(gui.State.Remotes) + if gui.GitCommand.PushToCurrent { return gui.push(pushOpts{setUpstream: true}) } else { return gui.prompt(promptOpts{ title: gui.Tr.EnterUpstream, - initialContent: "origin " + currentBranch.Name, + initialContent: suggestedRemote + " " + currentBranch.Name, findSuggestionsFunc: gui.getRemoteBranchesSuggestionsFunc(" "), handleConfirm: func(upstream string) error { var upstreamBranch, upstreamRemote string @@ -827,6 +831,20 @@ func (gui *Gui) pushFiles() error { } } +func getSuggestedRemote(remotes []*models.Remote) string { + if len(remotes) == 0 { + return "origin" + } + + for _, remote := range remotes { + if remote.Name == "origin" { + return remote.Name + } + } + + return remotes[0].Name +} + func (gui *Gui) requestToForcePush() error { forcePushDisabled := gui.Config.GetUserConfig().Git.DisableForcePushing if forcePushDisabled { diff --git a/pkg/gui/files_panel_test.go b/pkg/gui/files_panel_test.go new file mode 100644 index 000000000..fcf8fe66b --- /dev/null +++ b/pkg/gui/files_panel_test.go @@ -0,0 +1,34 @@ +package gui + +import ( + "testing" + + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/stretchr/testify/assert" +) + +func TestGetSuggestedRemote(t *testing.T) { + cases := []struct { + remotes []*models.Remote + expected string + }{ + {mkRemoteList(), "origin"}, + {mkRemoteList("upstream", "origin", "foo"), "origin"}, + {mkRemoteList("upstream", "foo", "bar"), "upstream"}, + } + + for _, c := range cases { + result := getSuggestedRemote(c.remotes) + assert.EqualValues(t, c.expected, result) + } +} + +func mkRemoteList(names ...string) []*models.Remote { + var result []*models.Remote + + for _, name := range names { + result = append(result, &models.Remote{Name: name}) + } + + return result +} -- cgit v1.2.3