mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-05-17 22:32:58 +02:00
support adding/removing remotes
This commit is contained in:
parent
1f3e1720a3
commit
6b7aaeca45
@ -1061,3 +1061,11 @@ func (c *GitCommand) BeginInteractiveRebaseForCommit(commits []*Commit, commitIn
|
|||||||
func (c *GitCommand) SetUpstreamBranch(upstream string) error {
|
func (c *GitCommand) SetUpstreamBranch(upstream string) error {
|
||||||
return c.OSCommand.RunCommand(fmt.Sprintf("git branch -u %s", upstream))
|
return c.OSCommand.RunCommand(fmt.Sprintf("git branch -u %s", upstream))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *GitCommand) AddRemote(name string, url string) error {
|
||||||
|
return c.OSCommand.RunCommand(fmt.Sprintf("git remote add %s %s", name, url))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *GitCommand) RemoveRemote(name string) error {
|
||||||
|
return c.OSCommand.RunCommand(fmt.Sprintf("git remote remove %s", name))
|
||||||
|
}
|
||||||
|
@ -1,5 +1,12 @@
|
|||||||
package commands
|
package commands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/fatih/color"
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/utils"
|
||||||
|
)
|
||||||
|
|
||||||
// Remote : A git remote
|
// Remote : A git remote
|
||||||
type Remote struct {
|
type Remote struct {
|
||||||
Name string
|
Name string
|
||||||
@ -11,5 +18,7 @@ type Remote struct {
|
|||||||
// GetDisplayStrings returns the display string of a remote
|
// GetDisplayStrings returns the display string of a remote
|
||||||
func (r *Remote) GetDisplayStrings(isFocused bool) []string {
|
func (r *Remote) GetDisplayStrings(isFocused bool) []string {
|
||||||
|
|
||||||
return []string{r.Name}
|
branchCount := len(r.Branches)
|
||||||
|
|
||||||
|
return []string{r.Name, utils.ColoredString(fmt.Sprintf("%d branches", branchCount), color.FgBlue)}
|
||||||
}
|
}
|
||||||
|
@ -95,9 +95,12 @@ func (gui *Gui) refreshBranches(g *gocui.Gui) error {
|
|||||||
}
|
}
|
||||||
gui.State.Branches = builder.Build()
|
gui.State.Branches = builder.Build()
|
||||||
|
|
||||||
gui.refreshSelectedLine(&gui.State.Panels.Branches.SelectedLine, len(gui.State.Branches))
|
// TODO: if we're in the remotes view and we've just deleted a remote we need to refresh accordingly
|
||||||
if err := gui.RenderSelectedBranchUpstreamDifferences(); err != nil {
|
if gui.getBranchesView().Context == "local-branches" {
|
||||||
return err
|
gui.refreshSelectedLine(&gui.State.Panels.Branches.SelectedLine, len(gui.State.Branches))
|
||||||
|
if err := gui.RenderSelectedBranchUpstreamDifferences(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return gui.refreshStatus(g)
|
return gui.refreshStatus(g)
|
||||||
@ -105,6 +108,20 @@ func (gui *Gui) refreshBranches(g *gocui.Gui) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) renderLocalBranchesWithSelection() error {
|
||||||
|
branchesView := gui.getBranchesView()
|
||||||
|
|
||||||
|
gui.refreshSelectedLine(&gui.State.Panels.Branches.SelectedLine, len(gui.State.Branches))
|
||||||
|
if err := gui.renderListPanel(branchesView, gui.State.Branches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := gui.handleBranchSelect(gui.g, branchesView); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// specific functions
|
// specific functions
|
||||||
|
|
||||||
func (gui *Gui) handleBranchPress(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleBranchPress(g *gocui.Gui, v *gocui.View) error {
|
||||||
@ -350,26 +367,11 @@ func (gui *Gui) switchBranchesPanelContext(context string) error {
|
|||||||
|
|
||||||
switch context {
|
switch context {
|
||||||
case "local-branches":
|
case "local-branches":
|
||||||
if err := gui.renderListPanel(branchesView, gui.State.Branches); err != nil {
|
return gui.renderLocalBranchesWithSelection()
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := gui.handleBranchSelect(gui.g, gui.getBranchesView()); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case "remotes":
|
case "remotes":
|
||||||
if err := gui.renderListPanel(branchesView, gui.State.Remotes); err != nil {
|
return gui.renderRemotesWithSelection()
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := gui.handleRemoteSelect(gui.g, gui.getBranchesView()); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case "remote-branches":
|
case "remote-branches":
|
||||||
if err := gui.renderListPanel(branchesView, gui.State.RemoteBranches); err != nil {
|
return gui.renderRemoteBranchesWithSelection()
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := gui.handleRemoteBranchSelect(gui.g, gui.getBranchesView()); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -17,12 +17,18 @@ import (
|
|||||||
|
|
||||||
func (gui *Gui) wrappedConfirmationFunction(function func(*gocui.Gui, *gocui.View) error, returnFocusOnClose bool) func(*gocui.Gui, *gocui.View) error {
|
func (gui *Gui) wrappedConfirmationFunction(function func(*gocui.Gui, *gocui.View) error, returnFocusOnClose bool) func(*gocui.Gui, *gocui.View) error {
|
||||||
return func(g *gocui.Gui, v *gocui.View) error {
|
return func(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
|
||||||
|
if err := gui.closeConfirmationPrompt(g, returnFocusOnClose); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if function != nil {
|
if function != nil {
|
||||||
if err := function(g, v); err != nil {
|
if err := function(g, v); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return gui.closeConfirmationPrompt(g, returnFocusOnClose)
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1041,6 +1041,22 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
|
|||||||
Modifier: gocui.ModNone,
|
Modifier: gocui.ModNone,
|
||||||
Handler: gui.handleRemoteEnter,
|
Handler: gui.handleRemoteEnter,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ViewName: "branches",
|
||||||
|
Contexts: []string{"remotes"},
|
||||||
|
Key: 'n',
|
||||||
|
Modifier: gocui.ModNone,
|
||||||
|
Handler: gui.handleAddRemote,
|
||||||
|
Description: gui.Tr.SLocalize("addNewRemote"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ViewName: "branches",
|
||||||
|
Contexts: []string{"remotes"},
|
||||||
|
Key: 'd',
|
||||||
|
Modifier: gocui.ModNone,
|
||||||
|
Handler: gui.handleRemoveRemote,
|
||||||
|
Description: gui.Tr.SLocalize("removeRemote"),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ViewName: "commits",
|
ViewName: "commits",
|
||||||
Key: gocui.MouseLeft,
|
Key: gocui.MouseLeft,
|
||||||
|
@ -67,3 +67,17 @@ func (gui *Gui) handleRemoteBranchSelect(g *gocui.Gui, v *gocui.View) error {
|
|||||||
func (gui *Gui) handleRemoteBranchesEscape(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleRemoteBranchesEscape(g *gocui.Gui, v *gocui.View) error {
|
||||||
return gui.switchBranchesPanelContext("remotes")
|
return gui.switchBranchesPanelContext("remotes")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) renderRemoteBranchesWithSelection() error {
|
||||||
|
branchesView := gui.getBranchesView()
|
||||||
|
|
||||||
|
gui.refreshSelectedLine(&gui.State.Panels.RemoteBranches.SelectedLine, len(gui.State.RemoteBranches))
|
||||||
|
if err := gui.renderListPanel(branchesView, gui.State.RemoteBranches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := gui.handleRemoteBranchSelect(gui.g, branchesView); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -60,10 +60,23 @@ func (gui *Gui) refreshRemotes() error {
|
|||||||
|
|
||||||
gui.State.Remotes = remotes
|
gui.State.Remotes = remotes
|
||||||
|
|
||||||
gui.g.Update(func(g *gocui.Gui) error {
|
if gui.getBranchesView().Context == "remotes" {
|
||||||
gui.refreshSelectedLine(&gui.State.Panels.Remotes.SelectedLine, len(gui.State.Remotes))
|
return gui.renderRemotesWithSelection()
|
||||||
return nil
|
}
|
||||||
})
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) renderRemotesWithSelection() error {
|
||||||
|
branchesView := gui.getBranchesView()
|
||||||
|
|
||||||
|
gui.refreshSelectedLine(&gui.State.Panels.Remotes.SelectedLine, len(gui.State.Remotes))
|
||||||
|
if err := gui.renderListPanel(branchesView, gui.State.Remotes); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := gui.handleRemoteSelect(gui.g, branchesView); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -82,3 +95,32 @@ func (gui *Gui) handleRemoteEnter(g *gocui.Gui, v *gocui.View) error {
|
|||||||
|
|
||||||
return gui.switchBranchesPanelContext("remote-branches")
|
return gui.switchBranchesPanelContext("remote-branches")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) handleAddRemote(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
branchesView := gui.getBranchesView()
|
||||||
|
return gui.createPromptPanel(g, branchesView, gui.Tr.SLocalize("newRemoteName"), "", func(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
remoteName := gui.trimmedContent(v)
|
||||||
|
return gui.createPromptPanel(g, branchesView, gui.Tr.SLocalize("newRemoteUrl"), "", func(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
remoteUrl := gui.trimmedContent(v)
|
||||||
|
if err := gui.GitCommand.AddRemote(remoteName, remoteUrl); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return gui.refreshRemotes()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) handleRemoveRemote(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
remote := gui.getSelectedRemote()
|
||||||
|
if remote == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return gui.createConfirmationPanel(g, v, true, gui.Tr.SLocalize("removeRemote"), gui.Tr.SLocalize("removeRemotePrompt")+" '"+remote.Name+"'?", func(*gocui.Gui, *gocui.View) error {
|
||||||
|
if err := gui.GitCommand.RemoveRemote(remote.Name); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return gui.refreshRemotes()
|
||||||
|
|
||||||
|
}, nil)
|
||||||
|
}
|
||||||
|
@ -849,6 +849,21 @@ func addEnglish(i18nObject *i18n.Bundle) error {
|
|||||||
}, &i18n.Message{
|
}, &i18n.Message{
|
||||||
ID: "ReturnToRemotesList",
|
ID: "ReturnToRemotesList",
|
||||||
Other: `return to remotes list`,
|
Other: `return to remotes list`,
|
||||||
|
}, &i18n.Message{
|
||||||
|
ID: "addNewRemote",
|
||||||
|
Other: `add new remote`,
|
||||||
|
}, &i18n.Message{
|
||||||
|
ID: "newRemoteName",
|
||||||
|
Other: `New remote name:`,
|
||||||
|
}, &i18n.Message{
|
||||||
|
ID: "newRemoteUrl",
|
||||||
|
Other: `New remote url:`,
|
||||||
|
}, &i18n.Message{
|
||||||
|
ID: "removeRemote",
|
||||||
|
Other: `remove remote`,
|
||||||
|
}, &i18n.Message{
|
||||||
|
ID: "removeRemotePrompt",
|
||||||
|
Other: "Are you sure you want to remove remote",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user